summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJessie Frazelle <jfrazelle@users.noreply.github.com>2015-04-16 12:31:02 -0700
committerJessie Frazelle <jfrazelle@users.noreply.github.com>2015-04-16 12:31:02 -0700
commit769acfec2928c47a35da5357d854145b1036448d (patch)
tree1e6fd58101f7b7870c96aeec7193c59f3047ea58
parent4bae33ef9fd217179ab7d59217c2e7f189e29c56 (diff)
parent47496519da9664202d900d3635bb840509fa9647 (diff)
downloaddocker-769acfec2928c47a35da5357d854145b1036448d.tar.gz
Merge pull request #11635 from jfrazelle/bump_v1.6.0
Bump v1.6.0
-rwxr-xr-x.drone.yml14
-rw-r--r--.gitignore2
-rw-r--r--.mailmap2
-rw-r--r--AUTHORS2
-rw-r--r--CHANGELOG.md20
-rw-r--r--CONTRIBUTING.md343
-rw-r--r--Dockerfile35
-rw-r--r--Dockerfile.simple34
-rw-r--r--MAINTAINERS63
-rw-r--r--Makefile15
-rw-r--r--NOTICE2
-rw-r--r--README.md18
-rw-r--r--VERSION2
-rw-r--r--api/MAINTAINERS2
-rw-r--r--api/client/cli.go23
-rw-r--r--api/client/commands.go564
-rw-r--r--api/client/hijack.go2
-rw-r--r--api/client/utils.go214
-rw-r--r--api/common.go75
-rw-r--r--api/server/MAINTAINERS2
-rw-r--r--api/server/server.go213
-rw-r--r--api/server/server_linux.go105
-rw-r--r--api/server/server_windows.go31
-rw-r--r--api/types/stats.go (renamed from api/stats/stats.go)2
-rw-r--r--api/types/types.go11
-rw-r--r--builder/MAINTAINERS3
-rw-r--r--builder/command/command.go39
-rw-r--r--builder/dispatchers.go67
-rw-r--r--builder/evaluator.go109
-rw-r--r--builder/internals.go105
-rw-r--r--builder/job.go83
-rw-r--r--builder/parser/line_parsers.go52
-rw-r--r--builder/parser/parser.go38
-rw-r--r--builder/parser/parser_test.go22
-rw-r--r--builder/parser/testfiles-negative/empty-instruction/Dockerfile8
-rw-r--r--builder/parser/testfiles-negative/html-page-yes-really-thanks-lk4d4/Dockerfile2
-rw-r--r--builder/parser/testfiles/env/Dockerfile8
-rw-r--r--builder/parser/testfiles/env/result18
-rw-r--r--builder/parser/utils.go14
-rw-r--r--builder/shell_parser.go209
-rw-r--r--builder/shell_parser_test.go51
-rw-r--r--builder/support.go41
-rw-r--r--builder/words43
-rw-r--r--builtins/builtins.go2
-rw-r--r--contrib/REVIEWERS (renamed from contrib/MAINTAINERS)0
-rwxr-xr-xcontrib/check-config.sh13
-rw-r--r--contrib/completion/REVIEWERS (renamed from contrib/completion/MAINTAINERS)0
-rwxr-xr-xcontrib/completion/bash/docker443
-rw-r--r--contrib/completion/fish/docker.fish8
-rw-r--r--contrib/completion/zsh/REVIEWERS3
-rw-r--r--contrib/completion/zsh/_docker67
-rwxr-xr-xcontrib/download-frozen-image.sh104
-rw-r--r--contrib/httpserver/Dockerfile4
-rw-r--r--contrib/httpserver/server.go12
-rw-r--r--contrib/init/systemd/REVIEWERS (renamed from contrib/init/systemd/MAINTAINERS)0
-rw-r--r--contrib/init/systemd/docker.service1
-rwxr-xr-xcontrib/init/sysvinit-redhat/docker9
-rw-r--r--contrib/init/upstart/REVIEWERS (renamed from contrib/init/upstart/MAINTAINERS)0
-rw-r--r--contrib/init/upstart/docker.conf2
-rwxr-xr-xcontrib/mkimage-alpine.sh2
-rwxr-xr-xcontrib/mkimage-arch.sh2
-rwxr-xr-xcontrib/mkimage-yum.sh16
-rwxr-xr-xcontrib/mkimage/debootstrap83
-rwxr-xr-xcontrib/project-stats.sh (renamed from project/stats.sh)0
-rw-r--r--contrib/report-issue.sh (renamed from project/report-issue.sh)0
-rw-r--r--contrib/syntax/kate/Dockerfile.xml1
-rw-r--r--contrib/syntax/textmate/Docker.tmbundle/Syntaxes/Dockerfile.tmLanguage2
-rw-r--r--contrib/syntax/textmate/REVIEWERS (renamed from contrib/syntax/textmate/MAINTAINERS)0
-rw-r--r--contrib/syntax/vim/syntax/dockerfile.vim2
-rw-r--r--daemon/MAINTAINERS7
-rw-r--r--daemon/attach.go10
-rw-r--r--daemon/changes.go37
-rw-r--r--daemon/commit.go27
-rw-r--r--daemon/config.go47
-rw-r--r--daemon/container.go183
-rw-r--r--daemon/copy.go23
-rw-r--r--daemon/create.go39
-rw-r--r--daemon/daemon.go238
-rw-r--r--daemon/daemon_test.go101
-rw-r--r--daemon/delete.go67
-rw-r--r--daemon/exec.go15
-rw-r--r--daemon/execdriver/MAINTAINERS2
-rw-r--r--daemon/execdriver/driver.go167
-rw-r--r--daemon/execdriver/execdrivers/execdrivers.go4
-rw-r--r--daemon/execdriver/lxc/MAINTAINERS2
-rw-r--r--daemon/execdriver/lxc/driver.go333
-rw-r--r--daemon/execdriver/lxc/lxc_init_linux.go6
-rw-r--r--daemon/execdriver/lxc/lxc_template.go25
-rw-r--r--daemon/execdriver/lxc/lxc_template_unit_test.go26
-rw-r--r--daemon/execdriver/native/create.go198
-rw-r--r--daemon/execdriver/native/driver.go343
-rw-r--r--daemon/execdriver/native/exec.go90
-rw-r--r--daemon/execdriver/native/info.go18
-rw-r--r--daemon/execdriver/native/init.go45
-rw-r--r--daemon/execdriver/native/template/default_template.go63
-rw-r--r--daemon/execdriver/native/utils.go41
-rw-r--r--daemon/execdriver/utils.go76
-rw-r--r--daemon/export.go31
-rw-r--r--daemon/graphdriver/aufs/aufs.go58
-rw-r--r--daemon/graphdriver/aufs/mount.go2
-rw-r--r--daemon/graphdriver/btrfs/MAINTAINERS1
-rw-r--r--daemon/graphdriver/btrfs/version.go16
-rw-r--r--daemon/graphdriver/btrfs/version_none.go1
-rw-r--r--daemon/graphdriver/btrfs/version_test.go8
-rw-r--r--daemon/graphdriver/devmapper/MAINTAINERS2
-rw-r--r--daemon/graphdriver/devmapper/README.md6
-rw-r--r--daemon/graphdriver/devmapper/deviceset.go86
-rw-r--r--daemon/graphdriver/devmapper/driver.go4
-rw-r--r--daemon/graphdriver/devmapper/mount.go3
-rw-r--r--daemon/graphdriver/driver.go9
-rw-r--r--daemon/graphdriver/graphtest/graphtest.go4
-rw-r--r--daemon/graphdriver/overlay/overlay.go5
-rw-r--r--daemon/graphdriver/vfs/driver.go2
-rw-r--r--daemon/image_delete.go17
-rw-r--r--daemon/info.go14
-rw-r--r--daemon/inspect.go103
-rw-r--r--daemon/kill.go29
-rw-r--r--daemon/list.go30
-rw-r--r--daemon/logger/copier.go57
-rw-r--r--daemon/logger/copier_test.go109
-rw-r--r--daemon/logger/jsonfilelog/jsonfilelog.go58
-rw-r--r--daemon/logger/jsonfilelog/jsonfilelog_test.go78
-rw-r--r--daemon/logger/logger.go18
-rw-r--r--daemon/logger/syslog/syslog.go45
-rw-r--r--daemon/logs.go12
-rw-r--r--daemon/monitor.go28
-rw-r--r--daemon/networkdriver/bridge/driver.go104
-rw-r--r--daemon/networkdriver/bridge/driver_test.go118
-rw-r--r--daemon/networkdriver/ipallocator/allocator.go5
-rw-r--r--daemon/networkdriver/ipallocator/allocator_test.go55
-rw-r--r--daemon/networkdriver/portallocator/portallocator.go133
-rw-r--r--daemon/networkdriver/portallocator/portallocator_test.go108
-rw-r--r--daemon/networkdriver/portmapper/mapper.go79
-rw-r--r--daemon/networkdriver/portmapper/mapper_test.go43
-rw-r--r--daemon/pause.go12
-rw-r--r--daemon/rename.go24
-rw-r--r--daemon/resize.go14
-rw-r--r--daemon/restart.go14
-rw-r--r--daemon/start.go11
-rw-r--r--daemon/state.go57
-rw-r--r--daemon/stats.go47
-rw-r--r--daemon/stop.go20
-rw-r--r--daemon/top.go94
-rw-r--r--daemon/volumes.go72
-rw-r--r--daemon/wait.go11
-rw-r--r--docker/daemon.go67
-rw-r--r--docker/docker.go24
-rw-r--r--docker/flags.go36
-rw-r--r--docker/log.go10
-rw-r--r--dockerversion/dockerversion.go15
-rw-r--r--docs/Dockerfile172
-rw-r--r--docs/MAINTAINERS3
-rwxr-xr-xdocs/README.md345
-rwxr-xr-xdocs/build.sh57
-rwxr-xr-xdocs/docs-update.py272
-rwxr-xr-xdocs/docvalidate.py79
-rw-r--r--docs/man/Dockerfile.5.md430
-rw-r--r--docs/man/docker-build.1.md9
-rw-r--r--docs/man/docker-commit.1.md14
-rw-r--r--docs/man/docker-cp.1.md50
-rw-r--r--docs/man/docker-create.1.md38
-rw-r--r--docs/man/docker-export.1.md20
-rw-r--r--docs/man/docker-images.1.md6
-rw-r--r--docs/man/docker-import.1.md14
-rw-r--r--docs/man/docker-inspect.1.md6
-rw-r--r--docs/man/docker-load.1.md3
-rw-r--r--docs/man/docker-login.1.md19
-rw-r--r--docs/man/docker-logout.1.md15
-rw-r--r--docs/man/docker-logs.1.md2
-rw-r--r--docs/man/docker-pause.1.md5
-rw-r--r--docs/man/docker-ps.1.md11
-rw-r--r--docs/man/docker-pull.1.md12
-rw-r--r--docs/man/docker-push.1.md24
-rw-r--r--docs/man/docker-rmi.1.md8
-rw-r--r--docs/man/docker-run.1.md111
-rw-r--r--docs/man/docker-save.1.md3
-rw-r--r--docs/man/docker-search.1.md17
-rw-r--r--docs/man/docker-start.1.md7
-rw-r--r--docs/man/docker-stats.1.md4
-rw-r--r--docs/man/docker-stop.1.md3
-rw-r--r--docs/man/docker-tag.1.md11
-rw-r--r--docs/man/docker-unpause.1.md5
-rw-r--r--docs/man/docker.1.md73
-rw-r--r--docs/mkdocs-compose.yml5
-rw-r--r--docs/mkdocs-machine.yml2
-rw-r--r--docs/mkdocs-swarm.yml5
-rw-r--r--docs/mkdocs.yml84
-rwxr-xr-xdocs/release.sh166
-rw-r--r--docs/s3_website.json11
-rw-r--r--docs/sources/article-img/ipv6_basic_host_config.gliffy2
-rw-r--r--docs/sources/article-img/ipv6_basic_host_config.svg2
-rw-r--r--docs/sources/article-img/ipv6_ndp_proxying.gliffy1
-rw-r--r--docs/sources/article-img/ipv6_ndp_proxying.svg1
-rw-r--r--docs/sources/article-img/ipv6_routed_network_example.gliffy2
-rw-r--r--docs/sources/article-img/ipv6_routed_network_example.svg2
-rw-r--r--docs/sources/article-img/ipv6_slash64_subnet_config.gliffy2
-rw-r--r--docs/sources/article-img/ipv6_slash64_subnet_config.svg2
-rw-r--r--docs/sources/article-img/ipv6_switched_network_example.gliffy2
-rw-r--r--docs/sources/article-img/ipv6_switched_network_example.svg2
-rw-r--r--docs/sources/articles/dockerfile_best-practices.md68
-rw-r--r--docs/sources/articles/dsc.md2
-rw-r--r--docs/sources/articles/host_integration.md14
-rw-r--r--docs/sources/articles/https.md8
-rw-r--r--docs/sources/articles/https/Dockerfile2
-rw-r--r--docs/sources/articles/https/Makefile8
-rwxr-xr-xdocs/sources/articles/https/make_certs.sh32
-rw-r--r--docs/sources/articles/networking.md236
-rw-r--r--docs/sources/articles/registry_mirror.md3
-rw-r--r--docs/sources/contributing.md7
-rw-r--r--docs/sources/contributing/contributing.md24
-rw-r--r--docs/sources/contributing/devenvironment.md167
-rw-r--r--docs/sources/docker-hub/accounts.md6
-rw-r--r--docs/sources/docker-hub/builds.md44
-rw-r--r--docs/sources/docker-hub/hub-images/build-trigger.pngbin68137 -> 38221 bytes
-rw-r--r--docs/sources/docker-hub/hub-images/gh_add_ssh_user_key.pngbin0 -> 38074 bytes
-rw-r--r--docs/sources/docker-hub/hub-images/gh_org_members.pngbin0 -> 26612 bytes
-rw-r--r--docs/sources/docker-hub/hub-images/gh_repo_deploy_key.pngbin0 -> 32315 bytes
-rw-r--r--docs/sources/docker-hub/hub-images/gh_team_members.pngbin0 -> 35907 bytes
-rw-r--r--docs/sources/docker-hub/hub-images/github_deploy_key.pngbin20819 -> 0 bytes
-rw-r--r--docs/sources/docker-hub/hub-images/groups.png (renamed from docs/sources/docker-hub/groups.png)bin29958 -> 29958 bytes
-rw-r--r--docs/sources/docker-hub/hub-images/hub.png (renamed from docs/sources/docker-hub/hub.png)bin27837 -> 27837 bytes
-rw-r--r--docs/sources/docker-hub/hub-images/invite.pngbin115369 -> 60230 bytes
-rw-r--r--docs/sources/docker-hub/hub-images/orgs.pngbin0 -> 36206 bytes
-rw-r--r--docs/sources/docker-hub/hub-images/repos.png (renamed from docs/sources/docker-hub/repos.png)bin33179 -> 33179 bytes
-rw-r--r--docs/sources/docker-hub/index.md2
-rw-r--r--docs/sources/docker-hub/invite.pngbin116723 -> 0 bytes
-rw-r--r--docs/sources/docker-hub/orgs.pngbin65489 -> 0 bytes
-rw-r--r--docs/sources/docker-hub/repos.md2
-rw-r--r--docs/sources/examples/mongodb.md2
-rw-r--r--docs/sources/examples/mongodb/Dockerfile2
-rw-r--r--docs/sources/examples/nodejs_web_app.md2
-rw-r--r--docs/sources/examples/postgresql_service.Dockerfile2
-rw-r--r--docs/sources/examples/postgresql_service.md2
-rw-r--r--docs/sources/faq.md346
-rw-r--r--docs/sources/installation.md1
-rw-r--r--docs/sources/installation/MAINTAINERS2
-rw-r--r--docs/sources/installation/azure.md27
-rw-r--r--docs/sources/installation/centos.md6
-rw-r--r--docs/sources/installation/debian.md12
-rw-r--r--docs/sources/installation/images/bad_host.pngbin0 -> 27367 bytes
-rw-r--r--docs/sources/installation/images/cool_view.pngbin0 -> 24385 bytes
-rw-r--r--docs/sources/installation/images/good_host.pngbin0 -> 103234 bytes
-rw-r--r--docs/sources/installation/images/kitematic.pngbin0 -> 14191 bytes
-rw-r--r--docs/sources/installation/images/linux_docker_host.pngbin0 -> 13938 bytes
-rw-r--r--docs/sources/installation/images/mac_docker_host.pngbin0 -> 16930 bytes
-rw-r--r--docs/sources/installation/images/newsite_view.pngbin0 -> 21403 bytes
-rw-r--r--docs/sources/installation/images/win/_01.gifbin14848 -> 0 bytes
-rw-r--r--docs/sources/installation/images/win/_02.gifbin29330 -> 0 bytes
-rw-r--r--docs/sources/installation/images/win/_06.gifbin3529 -> 0 bytes
-rw-r--r--docs/sources/installation/images/win/cygwin.gifbin63170 -> 0 bytes
-rw-r--r--docs/sources/installation/images/win/hp_bios_vm.JPGbin38670 -> 0 bytes
-rw-r--r--docs/sources/installation/images/win/putty.gifbin101057 -> 0 bytes
-rw-r--r--docs/sources/installation/images/win/putty_2.gifbin40117 -> 0 bytes
-rw-r--r--docs/sources/installation/images/win/run_02_.gifbin209837 -> 0 bytes
-rw-r--r--docs/sources/installation/images/win/run_03.gifbin55009 -> 0 bytes
-rw-r--r--docs/sources/installation/images/win/run_04.gifbin9217 -> 0 bytes
-rw-r--r--docs/sources/installation/images/win/ssh-config.gifbin36173 -> 0 bytes
-rw-r--r--docs/sources/installation/images/win/ts_go_bios.JPGbin60567 -> 0 bytes
-rw-r--r--docs/sources/installation/images/win/ts_no_docker.JPGbin23470 -> 0 bytes
-rw-r--r--docs/sources/installation/images/windows-boot2docker-cmd.pngbin0 -> 37436 bytes
-rw-r--r--docs/sources/installation/images/windows-boot2docker-powershell.pngbin0 -> 37945 bytes
-rw-r--r--docs/sources/installation/images/windows-boot2docker-start.pngbin21764 -> 253995 bytes
-rw-r--r--docs/sources/installation/images/windows-installer.pngbin22913 -> 191913 bytes
-rw-r--r--docs/sources/installation/joyent.md23
-rw-r--r--docs/sources/installation/mac.md361
-rw-r--r--docs/sources/installation/ubuntulinux.md456
-rw-r--r--docs/sources/installation/windows.md133
-rw-r--r--docs/sources/introduction/understanding-docker.md2
-rw-r--r--docs/sources/project.md19
-rw-r--r--docs/sources/project/advanced-contributing.md139
-rw-r--r--docs/sources/project/coding-style.md93
-rw-r--r--docs/sources/project/create-pr.md127
-rw-r--r--docs/sources/project/doc-style.md (renamed from docs/sources/contributing/docs_style-guide.md)4
-rw-r--r--docs/sources/project/find-an-issue.md240
-rw-r--r--docs/sources/project/get-help.md147
-rw-r--r--docs/sources/project/glossary.md7
-rwxr-xr-xdocs/sources/project/images/box.pngbin0 -> 151 bytes
-rw-r--r--docs/sources/project/images/branch-sig.pngbin0 -> 129657 bytes
-rwxr-xr-xdocs/sources/project/images/checked.pngbin0 -> 223 bytes
-rw-r--r--docs/sources/project/images/commits_expected.pngbin0 -> 60173 bytes
-rw-r--r--docs/sources/project/images/contributor-edit.pngbin0 -> 17983 bytes
-rw-r--r--docs/sources/project/images/copy_url.pngbin0 -> 69751 bytes
-rw-r--r--docs/sources/project/images/easy_issue.pngbin0 -> 114452 bytes
-rw-r--r--docs/sources/project/images/existing_issue.pngbin0 -> 24560 bytes
-rw-r--r--docs/sources/project/images/existing_issue.snagprojbin0 -> 62293 bytes
-rw-r--r--docs/sources/project/images/fixes_num.pngbin0 -> 41619 bytes
-rw-r--r--docs/sources/project/images/fork_docker.pngbin0 -> 52505 bytes
-rw-r--r--docs/sources/project/images/fresh_container.pngbin0 -> 20800 bytes
-rw-r--r--docs/sources/project/images/give_try.pngbin0 -> 65245 bytes
-rw-r--r--docs/sources/project/images/gordon.jpegbin0 -> 19941 bytes
-rw-r--r--docs/sources/project/images/in_room.pngbin0 -> 46882 bytes
-rw-r--r--docs/sources/project/images/irc_after_login.pngbin0 -> 64082 bytes
-rw-r--r--docs/sources/project/images/irc_chat.pngbin0 -> 155897 bytes
-rw-r--r--docs/sources/project/images/irc_connect.pngbin0 -> 18065 bytes
-rw-r--r--docs/sources/project/images/irc_login.pngbin0 -> 19418 bytes
-rw-r--r--docs/sources/project/images/issue_list.pngbin0 -> 55070 bytes
-rw-r--r--docs/sources/project/images/latest_commits.pngbin0 -> 62194 bytes
-rw-r--r--docs/sources/project/images/list_example.pngbin0 -> 28729 bytes
-rw-r--r--docs/sources/project/images/locate_branch.pngbin0 -> 115008 bytes
-rw-r--r--docs/sources/project/images/proposal.pngbin0 -> 37907 bytes
-rw-r--r--docs/sources/project/images/proposal.snagprojbin0 -> 96408 bytes
-rw-r--r--docs/sources/project/images/pull_request_made.pngbin0 -> 125700 bytes
-rw-r--r--docs/sources/project/images/red_notice.pngbin0 -> 45387 bytes
-rw-r--r--docs/sources/project/images/register_email.pngbin0 -> 51731 bytes
-rw-r--r--docs/sources/project/images/register_nic.pngbin0 -> 61172 bytes
-rw-r--r--docs/sources/project/images/three_running.pngbin0 -> 144585 bytes
-rw-r--r--docs/sources/project/images/three_terms.pngbin0 -> 47033 bytes
-rw-r--r--docs/sources/project/images/to_from_pr.pngbin0 -> 33858 bytes
-rw-r--r--docs/sources/project/make-a-contribution.md35
-rw-r--r--docs/sources/project/review-pr.md124
-rw-r--r--docs/sources/project/set-up-dev-env.md411
-rw-r--r--docs/sources/project/set-up-git.md238
-rw-r--r--docs/sources/project/software-required.md91
-rw-r--r--docs/sources/project/test-and-docs.md296
-rw-r--r--docs/sources/project/who-written-for.md57
-rw-r--r--docs/sources/project/work-issue.md203
-rw-r--r--docs/sources/reference/api/docker_remote_api.md71
-rw-r--r--docs/sources/reference/api/docker_remote_api_v1.17.md11
-rw-r--r--docs/sources/reference/api/docker_remote_api_v1.18.md2067
-rw-r--r--docs/sources/reference/api/hub_registry_spec.md6
-rw-r--r--docs/sources/reference/api/registry_api.md4
-rw-r--r--docs/sources/reference/api/registry_api_client_libraries.md13
-rw-r--r--docs/sources/reference/builder.md105
-rw-r--r--docs/sources/reference/commandline/cli.md720
-rw-r--r--docs/sources/reference/run.md383
-rw-r--r--docs/sources/release-notes.md14
-rw-r--r--docs/sources/static_files/contributors.pngbin0 -> 23100 bytes
-rw-r--r--docs/sources/static_files/docker-logo-compressed.png (renamed from docs/theme/mkdocs/images/docker-logo-compressed.png)bin4972 -> 4972 bytes
-rw-r--r--docs/sources/userguide/dockerizing.md4
-rw-r--r--docs/sources/userguide/dockerlinks.md149
-rw-r--r--docs/sources/userguide/dockervolumes.md38
-rw-r--r--docs/sources/userguide/index.md25
-rw-r--r--docs/sources/userguide/labels-custom-metadata.md190
-rw-r--r--docs/sources/userguide/usingdocker.md10
-rw-r--r--docs/theme/MAINTAINERS2
-rw-r--r--docs/theme/mkdocs/autoindex.html15
-rw-r--r--docs/theme/mkdocs/base.html164
-rw-r--r--docs/theme/mkdocs/beta_warning.html8
-rw-r--r--docs/theme/mkdocs/breadcrumbs.html12
-rw-r--r--docs/theme/mkdocs/css/animate-custom.css283
-rw-r--r--docs/theme/mkdocs/css/bootstrap-custom.css6784
-rw-r--r--docs/theme/mkdocs/css/dockerfile_tutorial.css63
-rw-r--r--docs/theme/mkdocs/css/docs.css364
-rw-r--r--docs/theme/mkdocs/css/font/FontAwesome.otfbin63008 -> 0 bytes
-rwxr-xr-xdocs/theme/mkdocs/css/font/fontawesome-webfont.eotbin38239 -> 0 bytes
-rwxr-xr-xdocs/theme/mkdocs/css/font/fontawesome-webfont.svg414
-rwxr-xr-xdocs/theme/mkdocs/css/font/fontawesome-webfont.ttfbin80776 -> 0 bytes
-rwxr-xr-xdocs/theme/mkdocs/css/font/fontawesome-webfont.woffbin44476 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/css/img/glyphicons-halflings-white.pngbin8777 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/css/img/glyphicons-halflings.pngbin9770 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/css/main.css2176
-rw-r--r--docs/theme/mkdocs/css/prettify-1.0.css28
-rw-r--r--docs/theme/mkdocs/fonts/LigatureSymbols.textClipping0
-rw-r--r--docs/theme/mkdocs/fonts/LigatureSymbols/LigatureSymbols-2.11.eotbin83542 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/fonts/LigatureSymbols/LigatureSymbols-2.11.otfbin82468 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/fonts/LigatureSymbols/LigatureSymbols-2.11.svg1299
-rw-r--r--docs/theme/mkdocs/fonts/LigatureSymbols/LigatureSymbols-2.11.ttfbin83340 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/fonts/LigatureSymbols/LigatureSymbols-2.11.woffbin62636 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/fonts/LigatureSymbols/README.txt126
-rwxr-xr-xdocs/theme/mkdocs/fonts/LigatureSymbols/index.html1350
-rwxr-xr-xdocs/theme/mkdocs/fonts/LigatureSymbols/style.css520
-rwxr-xr-xdocs/theme/mkdocs/fonts/fontawesome-webfont.eotbin38205 -> 0 bytes
-rwxr-xr-xdocs/theme/mkdocs/fonts/fontawesome-webfont.svg414
-rwxr-xr-xdocs/theme/mkdocs/fonts/fontawesome-webfont.ttfbin80652 -> 0 bytes
-rwxr-xr-xdocs/theme/mkdocs/fonts/fontawesome-webfont.woffbin44432 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/fonts/glyphicons-halflings-regular.eotbin20335 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/fonts/glyphicons-halflings-regular.svg229
-rw-r--r--docs/theme/mkdocs/fonts/glyphicons-halflings-regular.ttfbin41280 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/fonts/glyphicons-halflings-regular.woffbin23320 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/footer.html113
-rw-r--r--docs/theme/mkdocs/header.html50
-rw-r--r--docs/theme/mkdocs/images/arrow left.svg9
-rw-r--r--docs/theme/mkdocs/images/arrow right.svg9
-rw-r--r--docs/theme/mkdocs/images/docker-inc-light.svg74
-rw-r--r--docs/theme/mkdocs/images/docker-top-logo.pngbin1911 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/images/docker-white.pngbin917 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/images/docker-white.svg49
-rw-r--r--docs/theme/mkdocs/images/external-link-icon.pngbin150 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/images/external-link-icon.psdbin25548 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/images/footer-links.pngbin754 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/images/fork-us-on-github.pngbin3393 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/images/glyphicons-halflings-white.pngbin8777 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/images/glyphicons-halflings.pngbin9770 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/images/homepage-docker-logo.pngbin6375 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/images/page-blocks_03.pngbin243 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/images/page-blocks_03.svg26
-rw-r--r--docs/theme/mkdocs/images/page-blocks_05.pngbin737 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/images/page-blocks_05.svg63
-rw-r--r--docs/theme/mkdocs/images/page-blocks_07.pngbin333 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/images/page-blocks_07.svg17
-rw-r--r--docs/theme/mkdocs/images/social/docker_social_logos.pngbin3130 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/images/source_artwork/banner-frontpage-usecases.ai1340
-rw-r--r--docs/theme/mkdocs/images/website-footer_clean.svg197
-rw-r--r--docs/theme/mkdocs/img/favicon.pngbin1475 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/img/footer/angellist-white.svg35
-rw-r--r--docs/theme/mkdocs/img/footer/arrowhead-submit-email-icon.svg1
-rw-r--r--docs/theme/mkdocs/img/footer/docker-blog-24.pngbin385 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/img/footer/docker-blog-48.pngbin636 -> 0 bytes
-rwxr-xr-xdocs/theme/mkdocs/img/footer/facebook-24.pngbin271 -> 0 bytes
-rwxr-xr-xdocs/theme/mkdocs/img/footer/facebook-48.pngbin406 -> 0 bytes
-rwxr-xr-xdocs/theme/mkdocs/img/footer/googleplus-24.pngbin332 -> 0 bytes
-rwxr-xr-xdocs/theme/mkdocs/img/footer/googleplus-48.pngbin638 -> 0 bytes
-rwxr-xr-xdocs/theme/mkdocs/img/footer/slideshare-24.pngbin350 -> 0 bytes
-rwxr-xr-xdocs/theme/mkdocs/img/footer/slideshare-48.pngbin641 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/img/footer/sprites-small_360.pngbin2763 -> 0 bytes
-rwxr-xr-xdocs/theme/mkdocs/img/footer/twitter-24.pngbin298 -> 0 bytes
-rwxr-xr-xdocs/theme/mkdocs/img/footer/twitter-48.pngbin495 -> 0 bytes
-rwxr-xr-xdocs/theme/mkdocs/img/footer/youtube-24.pngbin400 -> 0 bytes
-rwxr-xr-xdocs/theme/mkdocs/img/footer/youtube-48.pngbin838 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/img/form/check-mark-green.svg1
-rw-r--r--docs/theme/mkdocs/img/form/padlock-icon-active.svg1
-rw-r--r--docs/theme/mkdocs/img/form/padlock-icon-inactive.svg1
-rw-r--r--docs/theme/mkdocs/img/icons/README.md7
-rw-r--r--docs/theme/mkdocs/img/icons/caret-down-create-new-icon.svg7
-rw-r--r--docs/theme/mkdocs/img/icons/cloud-download-dashboard-icon.svg1
-rw-r--r--docs/theme/mkdocs/img/icons/comment-simple.pngbin755 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/img/icons/comment-simple.svg14
-rw-r--r--docs/theme/mkdocs/img/icons/framed-icon-checked-repository.pngbin2026 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/img/icons/framed-icon-checked-repository.svg33
-rw-r--r--docs/theme/mkdocs/img/icons/framed-icon-empty-repository.pngbin574 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/img/icons/framed-icon-empty-repository.svg14
-rw-r--r--docs/theme/mkdocs/img/icons/framed-icon-linked-repository.pngbin1848 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/img/icons/framed-icon-linked-repository.svg24
-rw-r--r--docs/theme/mkdocs/img/icons/framed-icon-normal-repository.pngbin1707 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/img/icons/framed-icon-normal-repository.svg19
-rw-r--r--docs/theme/mkdocs/img/icons/framed-icon-official-repository.pngbin2477 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/img/icons/framed-icon-official-repository.svg45
-rw-r--r--docs/theme/mkdocs/img/icons/framed-icon-private-repository.pngbin1458 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/img/icons/framed-icon-private-repository.svg30
-rw-r--r--docs/theme/mkdocs/img/icons/icon-device.pngbin712 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/img/icons/icon-edit.pngbin418 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/img/icons/icon-file.pngbin331 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/img/icons/icon-folder.pngbin248 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/img/icons/icon-link.pngbin687 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/img/icons/icon-minus.pngbin376 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/img/icons/icon-normal-repository-frameless.pngbin1591 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/img/icons/icon-normal-repository-frameless.svg19
-rw-r--r--docs/theme/mkdocs/img/icons/icon-normal-repository.pngbin1706 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/img/icons/icon-normal-repository.svg19
-rw-r--r--docs/theme/mkdocs/img/icons/icon-plus.pngbin562 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/img/icons/icon-private-repository-frameless.pngbin1579 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/img/icons/icon-private-repository-frameless.svg18
-rw-r--r--docs/theme/mkdocs/img/icons/icon-private-repository.pngbin1823 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/img/icons/icon-private-repository.svg18
-rw-r--r--docs/theme/mkdocs/img/icons/icon-trusted-repository-frameless.pngbin2836 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/img/icons/icon-trusted-repository-frameless.svg22
-rw-r--r--docs/theme/mkdocs/img/icons/icon-trusted-repository.pngbin2163 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/img/icons/icon-trusted-repository.svg22
-rw-r--r--docs/theme/mkdocs/img/icons/official-repository-icon.pngbin1250 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/img/icons/repository-icons.ai4237
-rw-r--r--docs/theme/mkdocs/img/icons/star-icon.svg8
-rw-r--r--docs/theme/mkdocs/img/icons/star-simple.pngbin914 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/img/icons/star-simple.svg14
-rw-r--r--docs/theme/mkdocs/img/icons/trusted-icon.svg1
-rw-r--r--docs/theme/mkdocs/img/lightbox/add-button-icon.svg1
-rw-r--r--docs/theme/mkdocs/img/lightbox/escape-lightbox-icon-over.svg1
-rw-r--r--docs/theme/mkdocs/img/lightbox/escape-lightbox-icon.svg1
-rw-r--r--docs/theme/mkdocs/img/nav/caret-down-subnav-icon.svg7
-rw-r--r--docs/theme/mkdocs/img/nav/caret-down-user-icon-over.svg7
-rw-r--r--docs/theme/mkdocs/img/nav/caret-down-user-icon.svg7
-rw-r--r--docs/theme/mkdocs/img/nav/docker-logo-loggedin.pngbin1175 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/img/nav/docker-logo-loggedin.svg1985
-rw-r--r--docs/theme/mkdocs/img/nav/docker-logo-loggedout.pngbin2987 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/img/nav/search-icon.svg1
-rw-r--r--docs/theme/mkdocs/img/tutorial/DockerHub-Tutorial-05.psd.svg1
-rw-r--r--docs/theme/mkdocs/img/tutorial/caret-left-icon-over.svg1898
-rw-r--r--docs/theme/mkdocs/img/tutorial/caret-left-icon.svg1898
-rw-r--r--docs/theme/mkdocs/img/tutorial/exit-icon-over.svg1
-rw-r--r--docs/theme/mkdocs/img/tutorial/exit-icon.svg1
-rw-r--r--docs/theme/mkdocs/img/tutorial/question-mark-icon-over.svg1924
-rw-r--r--docs/theme/mkdocs/img/tutorial/question-mark-icon.svg1923
-rw-r--r--docs/theme/mkdocs/img/universal/cloud-download-dashboard-icon.svg1
-rw-r--r--docs/theme/mkdocs/img/universal/docker-logo-pin+@2x.pngbin1709 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/img/universal/docker-logo-pin.pngbin1309 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/img/universal/official-repository-icon.pngbin1250 -> 0 bytes
-rw-r--r--docs/theme/mkdocs/img/universal/star-icon.svg8
-rw-r--r--docs/theme/mkdocs/img/universal/trusted-icon.svg1
-rw-r--r--docs/theme/mkdocs/js/base.js101
-rw-r--r--docs/theme/mkdocs/js/bootstrap-3.0.3.min.js7
-rwxr-xr-xdocs/theme/mkdocs/js/dockerfile_tutorial.js74
-rw-r--r--docs/theme/mkdocs/js/dockerfile_tutorial_level.js176
-rw-r--r--docs/theme/mkdocs/js/jquery-1.10.2.min.js6
-rw-r--r--docs/theme/mkdocs/js/jquery-scrolltofixed-min.js8
-rw-r--r--docs/theme/mkdocs/js/jquery.cookie.js90
-rw-r--r--docs/theme/mkdocs/js/prettify-1.0.min.js28
-rw-r--r--docs/theme/mkdocs/nav.html22
-rw-r--r--docs/theme/mkdocs/prev_next.html22
-rw-r--r--docs/theme/mkdocs/tipuesearch/img/loader.gifbin4178 -> 0 bytes
-rwxr-xr-xdocs/theme/mkdocs/tipuesearch/img/search.pngbin315 -> 0 bytes
-rwxr-xr-xdocs/theme/mkdocs/tipuesearch/tipuesearch.css136
-rw-r--r--docs/theme/mkdocs/tipuesearch/tipuesearch.js383
-rw-r--r--docs/theme/mkdocs/tipuesearch/tipuesearch.min.js12
-rw-r--r--docs/theme/mkdocs/tipuesearch/tipuesearch_content.js13
-rw-r--r--docs/theme/mkdocs/tipuesearch/tipuesearch_set.js23
-rw-r--r--docs/theme/mkdocs/toc.html11
-rw-r--r--engine/MAINTAINERS1
-rw-r--r--engine/engine.go39
-rw-r--r--engine/env.go19
-rw-r--r--engine/env_test.go22
-rw-r--r--engine/job.go27
-rw-r--r--engine/job_test.go2
-rw-r--r--engine/streams.go20
-rw-r--r--engine/streams_test.go5
-rw-r--r--events/events.go34
-rw-r--r--graph/MAINTAINERS5
-rw-r--r--graph/graph.go46
-rw-r--r--graph/history.go3
-rw-r--r--graph/import.go46
-rw-r--r--graph/list.go46
-rw-r--r--graph/load.go14
-rw-r--r--graph/manifest.go127
-rw-r--r--graph/manifest_test.go101
-rw-r--r--graph/pull.go187
-rw-r--r--graph/push.go274
-rw-r--r--graph/service.go3
-rw-r--r--graph/tag.go25
-rw-r--r--graph/tags.go143
-rw-r--r--graph/tags_unit_test.go40
l---------hack1
-rwxr-xr-xhack/dind (renamed from project/dind)0
-rwxr-xr-xhack/generate-authors.sh (renamed from project/generate-authors.sh)2
-rwxr-xr-xhack/install.sh249
-rwxr-xr-xhack/make.sh (renamed from project/make.sh)30
-rw-r--r--hack/make/.dockerinit (renamed from project/make/.dockerinit)4
-rw-r--r--hack/make/.dockerinit-gccgo30
-rw-r--r--hack/make/.ensure-emptyfs (renamed from project/make/.ensure-scratch)12
-rw-r--r--hack/make/.ensure-frozen-images37
-rw-r--r--hack/make/.ensure-httpserver15
-rw-r--r--hack/make/.go-autogen18
-rwxr-xr-xhack/make/.go-compile-test-dir (renamed from project/make/.go-compile-test-dir)0
-rw-r--r--hack/make/.integration-daemon-start47
-rw-r--r--hack/make/.integration-daemon-stop (renamed from project/make/.integration-daemon-stop)0
-rw-r--r--hack/make/.validate (renamed from project/make/.validate)0
-rw-r--r--hack/make/README.md (renamed from project/make/README.md)0
-rw-r--r--[-rwxr-xr-x]hack/make/binary (renamed from project/make/binary)3
-rw-r--r--hack/make/cover (renamed from project/make/cover)0
-rw-r--r--hack/make/cross (renamed from project/make/cross)0
-rw-r--r--hack/make/dynbinary (renamed from project/make/dynbinary)4
-rw-r--r--hack/make/dyngccgo23
-rw-r--r--hack/make/gccgo25
-rw-r--r--hack/make/test-docker-py (renamed from project/make/test-docker-py)4
-rw-r--r--hack/make/test-integration (renamed from project/make/test-integration)0
-rw-r--r--hack/make/test-integration-cli (renamed from project/make/test-integration-cli)7
-rw-r--r--hack/make/test-unit (renamed from project/make/test-unit)12
-rw-r--r--hack/make/tgz (renamed from project/make/tgz)0
-rw-r--r--hack/make/ubuntu (renamed from project/make/ubuntu)0
-rw-r--r--hack/make/validate-dco (renamed from project/make/validate-dco)0
-rw-r--r--hack/make/validate-gofmt (renamed from project/make/validate-gofmt)0
-rw-r--r--hack/make/validate-toml30
-rwxr-xr-xhack/release.sh (renamed from project/release.sh)9
-rwxr-xr-xhack/vendor.sh (renamed from project/vendor.sh)13
-rw-r--r--image/image.go8
-rw-r--r--integration-cli/MAINTAINERS1
-rw-r--r--integration-cli/docker_api_attach_test.go66
-rw-r--r--integration-cli/docker_api_containers_test.go227
-rw-r--r--integration-cli/docker_api_exec_test.go2
-rw-r--r--integration-cli/docker_api_inspect_test.go6
-rw-r--r--integration-cli/docker_cli_build_test.go1151
-rw-r--r--integration-cli/docker_cli_by_digest_test.go535
-rw-r--r--integration-cli/docker_cli_commit_test.go95
-rw-r--r--integration-cli/docker_cli_cp_test.go52
-rw-r--r--integration-cli/docker_cli_create_test.go81
-rw-r--r--integration-cli/docker_cli_daemon_test.go368
-rw-r--r--integration-cli/docker_cli_diff_test.go20
-rw-r--r--integration-cli/docker_cli_events_test.go281
-rw-r--r--integration-cli/docker_cli_events_unix_test.go8
-rw-r--r--integration-cli/docker_cli_exec_test.go232
-rw-r--r--integration-cli/docker_cli_export_import_test.go61
-rw-r--r--integration-cli/docker_cli_help_test.go155
-rw-r--r--integration-cli/docker_cli_history_test.go4
-rw-r--r--integration-cli/docker_cli_images_test.go99
-rw-r--r--integration-cli/docker_cli_import_test.go37
-rw-r--r--integration-cli/docker_cli_inspect_test.go35
-rw-r--r--integration-cli/docker_cli_links_test.go118
-rw-r--r--integration-cli/docker_cli_nat_test.go4
-rw-r--r--integration-cli/docker_cli_pause_test.go112
-rw-r--r--integration-cli/docker_cli_port_test.go4
-rw-r--r--integration-cli/docker_cli_proxy_test.go64
-rw-r--r--integration-cli/docker_cli_ps_test.go200
-rw-r--r--integration-cli/docker_cli_pull_test.go44
-rw-r--r--integration-cli/docker_cli_push_test.go6
-rw-r--r--integration-cli/docker_cli_rename_test.go16
-rw-r--r--integration-cli/docker_cli_restart_test.go42
-rw-r--r--integration-cli/docker_cli_rm_test.go27
-rw-r--r--integration-cli/docker_cli_rmi_test.go62
-rw-r--r--integration-cli/docker_cli_run_test.go996
-rw-r--r--integration-cli/docker_cli_run_unix_test.go86
-rw-r--r--integration-cli/docker_cli_save_load_test.go175
-rw-r--r--integration-cli/docker_cli_start_test.go101
-rw-r--r--integration-cli/docker_cli_tag_test.go6
-rw-r--r--integration-cli/docker_cli_version_test.go2
-rw-r--r--integration-cli/docker_test_vars.go4
-rw-r--r--integration-cli/docker_test_vars_cli.go8
-rw-r--r--integration-cli/docker_test_vars_daemon.go8
-rw-r--r--integration-cli/docker_utils.go364
-rw-r--r--integration-cli/registry.go2
-rw-r--r--integration-cli/requirements.go90
-rw-r--r--integration-cli/test_vars_exec.go8
-rw-r--r--integration-cli/test_vars_noexec.go8
-rw-r--r--integration-cli/test_vars_unix.go10
-rw-r--r--integration-cli/test_vars_windows.go11
-rw-r--r--integration-cli/utils.go121
-rw-r--r--integration/MAINTAINERS2
-rw-r--r--integration/api_test.go5
-rw-r--r--integration/commands_test.go4
-rw-r--r--integration/container_test.go14
-rw-r--r--integration/graph_test.go15
-rw-r--r--integration/runtime_test.go100
-rw-r--r--integration/server_test.go9
-rw-r--r--integration/utils_test.go11
-rw-r--r--nat/nat.go4
-rw-r--r--opts/opts.go23
-rw-r--r--opts/opts_test.go48
-rw-r--r--opts/ulimit.go44
-rw-r--r--pkg/archive/MAINTAINERS2
-rw-r--r--pkg/archive/archive.go28
-rw-r--r--pkg/archive/archive_unix.go15
-rw-r--r--pkg/archive/archive_unix_test.go60
-rw-r--r--pkg/archive/archive_windows.go29
-rw-r--r--pkg/archive/archive_windows_test.go65
-rw-r--r--pkg/archive/changes.go16
-rw-r--r--pkg/archive/changes_posix_test.go127
-rw-r--r--pkg/archive/changes_test.go10
-rw-r--r--pkg/archive/diff.go2
-rw-r--r--pkg/broadcastwriter/broadcastwriter.go2
-rw-r--r--pkg/chrootarchive/archive.go34
-rw-r--r--pkg/chrootarchive/archive_test.go26
-rw-r--r--pkg/common/randomid.go47
-rw-r--r--pkg/common/randomid_test.go59
-rw-r--r--pkg/devicemapper/MAINTAINERS1
-rw-r--r--pkg/devicemapper/devmapper.go7
-rw-r--r--pkg/devicemapper/devmapper_wrapper.go5
-rw-r--r--pkg/directory/directory_linux.go39
-rw-r--r--pkg/directory/directory_test.go137
-rw-r--r--pkg/directory/directory_windows.go28
-rw-r--r--pkg/graphdb/MAINTAINERS1
-rw-r--r--pkg/homedir/homedir.go39
-rw-r--r--pkg/homedir/homedir_test.go24
-rw-r--r--pkg/httputils/MAINTAINERS1
-rw-r--r--pkg/ioutils/readers.go119
-rw-r--r--pkg/ioutils/readers_test.go58
-rw-r--r--pkg/iptables/MAINTAINERS2
-rw-r--r--pkg/iptables/iptables.go29
-rw-r--r--pkg/iptables/iptables_test.go40
-rw-r--r--pkg/jsonlog/jsonlog.go2
-rw-r--r--pkg/jsonlog/jsonlog_marshalling.go2
-rw-r--r--pkg/jsonlog/jsonlog_test.go3
-rw-r--r--pkg/mflag/MAINTAINERS1
-rw-r--r--pkg/mflag/flag.go21
-rw-r--r--pkg/mount/MAINTAINERS1
-rw-r--r--pkg/mount/sharedsubtree_linux_test.go2
-rw-r--r--pkg/networkfs/MAINTAINERS1
-rw-r--r--pkg/networkfs/resolvconf/resolvconf.go19
-rw-r--r--pkg/parsers/MAINTAINERS1
-rw-r--r--pkg/parsers/filters/parse.go32
-rw-r--r--pkg/parsers/parsers.go10
-rw-r--r--pkg/parsers/parsers_test.go9
-rw-r--r--pkg/progressreader/progressreader.go70
-rw-r--r--pkg/proxy/MAINTAINERS1
-rw-r--r--pkg/reexec/MAINTAINERS1
-rw-r--r--pkg/reexec/reexec.go8
-rw-r--r--pkg/stdcopy/MAINTAINERS1
-rw-r--r--pkg/symlink/MAINTAINERS3
-rw-r--r--pkg/sysinfo/MAINTAINERS2
-rw-r--r--pkg/sysinfo/sysinfo.go6
-rw-r--r--pkg/system/MAINTAINERS2
-rw-r--r--pkg/system/lstat.go2
-rw-r--r--pkg/system/lstat_windows.go2
-rw-r--r--pkg/system/stat.go16
-rw-r--r--pkg/system/stat_linux.go13
-rw-r--r--pkg/system/stat_unsupported.go4
-rw-r--r--pkg/system/stat_windows.go7
-rw-r--r--pkg/systemd/MAINTAINERS1
-rw-r--r--pkg/tarsum/MAINTAINERS4
-rw-r--r--pkg/term/MAINTAINERS1
-rw-r--r--pkg/term/console_windows.go87
-rw-r--r--pkg/term/term.go15
-rw-r--r--pkg/term/term_windows.go101
-rw-r--r--pkg/term/winconsole/console_windows.go1053
-rw-r--r--pkg/term/winconsole/console_windows_test.go232
-rw-r--r--pkg/term/winconsole/term_emulator.go234
-rw-r--r--pkg/term/winconsole/term_emulator_test.go388
-rw-r--r--pkg/testutils/MAINTAINERS2
-rw-r--r--pkg/timeoutconn/timeoutconn.go (renamed from utils/timeoutconn.go)10
-rw-r--r--pkg/timeoutconn/timeoutconn_test.go (renamed from utils/timeoutconn_test.go)6
-rw-r--r--pkg/timeutils/MAINTAINERS1
-rw-r--r--pkg/truncindex/MAINTAINERS1
-rw-r--r--pkg/truncindex/truncindex.go22
-rw-r--r--pkg/truncindex/truncindex_test.go37
-rw-r--r--pkg/ulimit/ulimit.go106
-rw-r--r--pkg/ulimit/ulimit_test.go41
-rw-r--r--pkg/units/MAINTAINERS2
-rw-r--r--project/ISSUE-TRIAGE.md104
-rw-r--r--project/MAINTAINERS4
-rw-r--r--project/PRINCIPLES.md2
-rw-r--r--project/RELEASE-CHECKLIST.md127
-rw-r--r--project/TOOLS.md74
-rwxr-xr-xproject/allmaintainers.sh3
-rwxr-xr-xproject/getmaintainer.sh62
-rwxr-xr-xproject/install.sh225
-rw-r--r--project/make/.ensure-busybox10
-rw-r--r--project/make/.integration-daemon-start28
-rw-r--r--registry/MAINTAINERS5
-rw-r--r--registry/auth.go33
-rw-r--r--registry/config.go8
-rw-r--r--registry/endpoint.go36
-rw-r--r--registry/endpoint_test.go4
-rw-r--r--registry/httpfactory.go2
-rw-r--r--registry/registry.go4
-rw-r--r--registry/registry_test.go12
-rw-r--r--registry/session.go28
-rw-r--r--registry/session_v2.go131
-rw-r--r--registry/v2/regexp.go7
-rw-r--r--registry/v2/routes.go8
-rw-r--r--registry/v2/routes_test.go16
-rw-r--r--registry/v2/urls.go6
-rw-r--r--runconfig/compare.go6
-rw-r--r--runconfig/config.go12
-rw-r--r--runconfig/hostconfig.go43
-rw-r--r--runconfig/merge.go10
-rw-r--r--runconfig/parse.go157
-rw-r--r--utils/progressreader.go55
-rw-r--r--utils/random.go16
-rw-r--r--utils/streamformatter.go11
-rw-r--r--utils/utils.go75
-rw-r--r--utils/utils_daemon.go37
-rw-r--r--utils/utils_daemon_test.go26
-rw-r--r--utils/utils_test.go55
l---------vendor/MAINTAINERS1
-rw-r--r--vendor/src/github.com/Sirupsen/logrus/.travis.yml5
-rw-r--r--vendor/src/github.com/Sirupsen/logrus/README.md102
-rw-r--r--vendor/src/github.com/Sirupsen/logrus/entry.go6
-rw-r--r--vendor/src/github.com/Sirupsen/logrus/entry_test.go53
-rw-r--r--vendor/src/github.com/Sirupsen/logrus/examples/basic/basic.go27
-rw-r--r--vendor/src/github.com/Sirupsen/logrus/examples/hook/hook.go7
-rw-r--r--vendor/src/github.com/Sirupsen/logrus/exported.go11
-rw-r--r--vendor/src/github.com/Sirupsen/logrus/formatter.go14
-rw-r--r--vendor/src/github.com/Sirupsen/logrus/formatters/logstash/logstash.go48
-rw-r--r--vendor/src/github.com/Sirupsen/logrus/formatters/logstash/logstash_test.go52
-rw-r--r--vendor/src/github.com/Sirupsen/logrus/hooks/airbrake/airbrake.go60
-rw-r--r--vendor/src/github.com/Sirupsen/logrus/hooks/airbrake/airbrake_test.go133
-rw-r--r--vendor/src/github.com/Sirupsen/logrus/hooks/bugsnag/bugsnag.go68
-rw-r--r--vendor/src/github.com/Sirupsen/logrus/hooks/bugsnag/bugsnag_test.go64
-rw-r--r--vendor/src/github.com/Sirupsen/logrus/hooks/papertrail/papertrail.go3
-rw-r--r--vendor/src/github.com/Sirupsen/logrus/hooks/sentry/README.md61
-rw-r--r--vendor/src/github.com/Sirupsen/logrus/hooks/sentry/sentry.go100
-rw-r--r--vendor/src/github.com/Sirupsen/logrus/hooks/sentry/sentry_test.go97
-rw-r--r--vendor/src/github.com/Sirupsen/logrus/hooks/syslog/README.md4
-rw-r--r--vendor/src/github.com/Sirupsen/logrus/hooks/syslog/syslog.go14
-rw-r--r--vendor/src/github.com/Sirupsen/logrus/json_formatter.go21
-rw-r--r--vendor/src/github.com/Sirupsen/logrus/json_formatter_test.go120
-rw-r--r--vendor/src/github.com/Sirupsen/logrus/logger.go86
-rw-r--r--vendor/src/github.com/Sirupsen/logrus/logrus_test.go58
-rw-r--r--vendor/src/github.com/Sirupsen/logrus/terminal_notwindows.go2
-rw-r--r--vendor/src/github.com/Sirupsen/logrus/terminal_openbsd.go7
-rw-r--r--vendor/src/github.com/Sirupsen/logrus/text_formatter.go70
-rw-r--r--vendor/src/github.com/Sirupsen/logrus/text_formatter_test.go37
-rw-r--r--vendor/src/github.com/Sirupsen/logrus/writer.go31
-rw-r--r--vendor/src/github.com/docker/distribution/digest/digest.go168
-rw-r--r--vendor/src/github.com/docker/distribution/digest/digest_test.go111
-rw-r--r--vendor/src/github.com/docker/distribution/digest/digester.go44
-rw-r--r--vendor/src/github.com/docker/distribution/digest/doc.go52
-rw-r--r--vendor/src/github.com/docker/distribution/digest/tarsum.go70
-rw-r--r--vendor/src/github.com/docker/distribution/digest/tarsum_test.go79
-rw-r--r--vendor/src/github.com/docker/distribution/digest/verifiers.go137
-rw-r--r--vendor/src/github.com/docker/distribution/digest/verifiers_test.go162
-rwxr-xr-xvendor/src/github.com/docker/libcontainer/.drone.yml9
-rw-r--r--vendor/src/github.com/docker/libcontainer/.gitignore2
-rw-r--r--vendor/src/github.com/docker/libcontainer/Dockerfile4
-rw-r--r--vendor/src/github.com/docker/libcontainer/MAINTAINERS1
-rw-r--r--vendor/src/github.com/docker/libcontainer/Makefile9
-rw-r--r--vendor/src/github.com/docker/libcontainer/NOTICE2
-rw-r--r--vendor/src/github.com/docker/libcontainer/PRINCIPLES.md2
-rw-r--r--vendor/src/github.com/docker/libcontainer/README.md160
-rw-r--r--vendor/src/github.com/docker/libcontainer/api_temp.go21
-rw-r--r--vendor/src/github.com/docker/libcontainer/apparmor/apparmor.go1
-rw-r--r--vendor/src/github.com/docker/libcontainer/apparmor/gen.go8
-rw-r--r--vendor/src/github.com/docker/libcontainer/capabilities_linux.go91
-rw-r--r--vendor/src/github.com/docker/libcontainer/cgroups/cgroups.go55
-rw-r--r--vendor/src/github.com/docker/libcontainer/cgroups/fs/apply_raw.go159
-rw-r--r--vendor/src/github.com/docker/libcontainer/cgroups/fs/blkio.go21
-rw-r--r--vendor/src/github.com/docker/libcontainer/cgroups/fs/blkio_test.go30
-rw-r--r--vendor/src/github.com/docker/libcontainer/cgroups/fs/cpu.go25
-rw-r--r--vendor/src/github.com/docker/libcontainer/cgroups/fs/cpu_test.go70
-rw-r--r--vendor/src/github.com/docker/libcontainer/cgroups/fs/cpuacct.go7
-rw-r--r--vendor/src/github.com/docker/libcontainer/cgroups/fs/cpuset.go39
-rw-r--r--vendor/src/github.com/docker/libcontainer/cgroups/fs/cpuset_test.go63
-rw-r--r--vendor/src/github.com/docker/libcontainer/cgroups/fs/devices.go24
-rw-r--r--vendor/src/github.com/docker/libcontainer/cgroups/fs/devices_test.go46
-rw-r--r--vendor/src/github.com/docker/libcontainer/cgroups/fs/freezer.go36
-rw-r--r--vendor/src/github.com/docker/libcontainer/cgroups/fs/freezer_test.go45
-rw-r--r--vendor/src/github.com/docker/libcontainer/cgroups/fs/memory.go54
-rw-r--r--vendor/src/github.com/docker/libcontainer/cgroups/fs/memory_test.go125
-rw-r--r--vendor/src/github.com/docker/libcontainer/cgroups/fs/perf_event.go7
-rw-r--r--vendor/src/github.com/docker/libcontainer/cgroups/fs/util_test.go12
-rw-r--r--vendor/src/github.com/docker/libcontainer/cgroups/fs/utils.go10
-rw-r--r--vendor/src/github.com/docker/libcontainer/cgroups/systemd/apply_nosystemd.go34
-rw-r--r--vendor/src/github.com/docker/libcontainer/cgroups/systemd/apply_systemd.go252
-rw-r--r--vendor/src/github.com/docker/libcontainer/cgroups/utils.go15
-rw-r--r--vendor/src/github.com/docker/libcontainer/config.go154
-rw-r--r--vendor/src/github.com/docker/libcontainer/configs/cgroup.go57
-rw-r--r--vendor/src/github.com/docker/libcontainer/configs/config.go145
-rw-r--r--vendor/src/github.com/docker/libcontainer/configs/config_test.go (renamed from vendor/src/github.com/docker/libcontainer/config_test.go)133
-rw-r--r--vendor/src/github.com/docker/libcontainer/configs/device.go52
-rw-r--r--vendor/src/github.com/docker/libcontainer/configs/device_defaults.go137
-rw-r--r--vendor/src/github.com/docker/libcontainer/configs/mount.go21
-rw-r--r--vendor/src/github.com/docker/libcontainer/configs/namespaces.go120
-rw-r--r--vendor/src/github.com/docker/libcontainer/configs/network.go72
-rw-r--r--vendor/src/github.com/docker/libcontainer/configs/validate/config.go93
-rw-r--r--vendor/src/github.com/docker/libcontainer/console.go15
-rw-r--r--vendor/src/github.com/docker/libcontainer/console/console.go128
-rw-r--r--vendor/src/github.com/docker/libcontainer/console_linux.go147
-rw-r--r--vendor/src/github.com/docker/libcontainer/container.go140
-rw-r--r--vendor/src/github.com/docker/libcontainer/container_linux.go316
-rw-r--r--vendor/src/github.com/docker/libcontainer/container_linux_test.go201
-rw-r--r--vendor/src/github.com/docker/libcontainer/container_nouserns_linux.go13
-rw-r--r--vendor/src/github.com/docker/libcontainer/container_userns_linux.go26
-rw-r--r--vendor/src/github.com/docker/libcontainer/devices/defaults.go159
-rw-r--r--vendor/src/github.com/docker/libcontainer/devices/devices.go72
-rw-r--r--vendor/src/github.com/docker/libcontainer/devices/devices_test.go12
-rw-r--r--vendor/src/github.com/docker/libcontainer/devices/number.go4
-rw-r--r--vendor/src/github.com/docker/libcontainer/docs/man/nsinit.1.md38
-rw-r--r--vendor/src/github.com/docker/libcontainer/error.go39
-rw-r--r--vendor/src/github.com/docker/libcontainer/error_test.go20
-rw-r--r--vendor/src/github.com/docker/libcontainer/factory.go33
-rw-r--r--vendor/src/github.com/docker/libcontainer/factory_linux.go282
-rw-r--r--vendor/src/github.com/docker/libcontainer/factory_linux_test.go179
-rw-r--r--vendor/src/github.com/docker/libcontainer/generic_error.go74
-rw-r--r--vendor/src/github.com/docker/libcontainer/generic_error_test.go14
-rwxr-xr-xvendor/src/github.com/docker/libcontainer/hack/validate.sh15
-rw-r--r--vendor/src/github.com/docker/libcontainer/init_linux.go260
-rw-r--r--vendor/src/github.com/docker/libcontainer/integration/exec_test.go489
-rw-r--r--vendor/src/github.com/docker/libcontainer/integration/execin_test.go340
-rw-r--r--vendor/src/github.com/docker/libcontainer/integration/init_test.go67
-rw-r--r--vendor/src/github.com/docker/libcontainer/integration/template_test.go99
-rw-r--r--vendor/src/github.com/docker/libcontainer/integration/utils_test.go85
-rw-r--r--vendor/src/github.com/docker/libcontainer/mount/init.go209
-rw-r--r--vendor/src/github.com/docker/libcontainer/mount/mount.go109
-rw-r--r--vendor/src/github.com/docker/libcontainer/mount/mount_config.go28
-rw-r--r--vendor/src/github.com/docker/libcontainer/mount/msmoveroot.go20
-rw-r--r--vendor/src/github.com/docker/libcontainer/mount/nodes/nodes.go57
-rw-r--r--vendor/src/github.com/docker/libcontainer/mount/nodes/nodes_unsupported.go13
-rw-r--r--vendor/src/github.com/docker/libcontainer/mount/pivotroot.go34
-rw-r--r--vendor/src/github.com/docker/libcontainer/mount/ptmx.go30
-rw-r--r--vendor/src/github.com/docker/libcontainer/mount/readonly.go11
-rw-r--r--vendor/src/github.com/docker/libcontainer/mount/remount.go31
-rw-r--r--vendor/src/github.com/docker/libcontainer/namespaces/create.go10
-rw-r--r--vendor/src/github.com/docker/libcontainer/namespaces/exec.go219
-rw-r--r--vendor/src/github.com/docker/libcontainer/namespaces/execin.go132
-rw-r--r--vendor/src/github.com/docker/libcontainer/namespaces/init.go331
-rw-r--r--vendor/src/github.com/docker/libcontainer/namespaces/nsenter/nsenter.c245
-rw-r--r--vendor/src/github.com/docker/libcontainer/namespaces/nsenter/nsenter.go10
-rw-r--r--vendor/src/github.com/docker/libcontainer/namespaces/utils.go45
-rw-r--r--vendor/src/github.com/docker/libcontainer/netlink/netlink_linux.go34
-rw-r--r--vendor/src/github.com/docker/libcontainer/network/loopback.go23
-rw-r--r--vendor/src/github.com/docker/libcontainer/network/network.go117
-rw-r--r--vendor/src/github.com/docker/libcontainer/network/stats.go74
-rw-r--r--vendor/src/github.com/docker/libcontainer/network/strategy.go34
-rw-r--r--vendor/src/github.com/docker/libcontainer/network/types.go50
-rw-r--r--vendor/src/github.com/docker/libcontainer/network/veth.go122
-rw-r--r--vendor/src/github.com/docker/libcontainer/network/veth_test.go53
-rw-r--r--vendor/src/github.com/docker/libcontainer/network_linux.go213
-rw-r--r--vendor/src/github.com/docker/libcontainer/notify_linux.go7
-rw-r--r--vendor/src/github.com/docker/libcontainer/notify_linux_test.go8
-rw-r--r--vendor/src/github.com/docker/libcontainer/nsenter/README.md (renamed from vendor/src/github.com/docker/libcontainer/namespaces/nsenter/README.md)0
-rw-r--r--vendor/src/github.com/docker/libcontainer/nsenter/nsenter.go12
-rw-r--r--vendor/src/github.com/docker/libcontainer/nsenter/nsenter_gccgo.go25
-rw-r--r--vendor/src/github.com/docker/libcontainer/nsenter/nsenter_test.go (renamed from vendor/src/github.com/docker/libcontainer/namespaces/nsenter/nsenter_test.go)41
-rw-r--r--vendor/src/github.com/docker/libcontainer/nsenter/nsenter_unsupported.go (renamed from vendor/src/github.com/docker/libcontainer/namespaces/nsenter/nsenter_unsupported.go)0
-rw-r--r--vendor/src/github.com/docker/libcontainer/nsenter/nsexec.c168
-rw-r--r--vendor/src/github.com/docker/libcontainer/nsinit/Makefile2
-rw-r--r--vendor/src/github.com/docker/libcontainer/nsinit/README.md67
-rw-r--r--vendor/src/github.com/docker/libcontainer/nsinit/config.go281
-rw-r--r--vendor/src/github.com/docker/libcontainer/nsinit/exec.go248
-rw-r--r--vendor/src/github.com/docker/libcontainer/nsinit/init.go57
-rw-r--r--vendor/src/github.com/docker/libcontainer/nsinit/main.go60
-rw-r--r--vendor/src/github.com/docker/libcontainer/nsinit/nsenter.go84
-rw-r--r--vendor/src/github.com/docker/libcontainer/nsinit/oom.go38
-rw-r--r--vendor/src/github.com/docker/libcontainer/nsinit/pause.go64
-rw-r--r--vendor/src/github.com/docker/libcontainer/nsinit/state.go31
-rw-r--r--vendor/src/github.com/docker/libcontainer/nsinit/stats.go48
-rw-r--r--vendor/src/github.com/docker/libcontainer/nsinit/tty.go65
-rw-r--r--vendor/src/github.com/docker/libcontainer/nsinit/utils.go101
-rw-r--r--vendor/src/github.com/docker/libcontainer/process.go89
-rw-r--r--vendor/src/github.com/docker/libcontainer/process_linux.go249
-rw-r--r--vendor/src/github.com/docker/libcontainer/rootfs_linux.go357
-rw-r--r--vendor/src/github.com/docker/libcontainer/sample_configs/apparmor.json532
-rw-r--r--vendor/src/github.com/docker/libcontainer/sample_configs/attach_to_bridge.json549
-rw-r--r--vendor/src/github.com/docker/libcontainer/sample_configs/host-pid.json530
-rw-r--r--vendor/src/github.com/docker/libcontainer/sample_configs/minimal.json537
-rw-r--r--vendor/src/github.com/docker/libcontainer/sample_configs/route_source_address_selection.json209
-rw-r--r--vendor/src/github.com/docker/libcontainer/sample_configs/selinux.json533
-rw-r--r--vendor/src/github.com/docker/libcontainer/sample_configs/userns.json376
-rw-r--r--vendor/src/github.com/docker/libcontainer/security/capabilities/capabilities.go56
-rw-r--r--vendor/src/github.com/docker/libcontainer/security/capabilities/types.go88
-rw-r--r--vendor/src/github.com/docker/libcontainer/security/capabilities/types_test.go19
-rw-r--r--vendor/src/github.com/docker/libcontainer/security/restrict/restrict.go53
-rw-r--r--vendor/src/github.com/docker/libcontainer/security/restrict/unsupported.go9
-rw-r--r--vendor/src/github.com/docker/libcontainer/selinux/selinux.go21
-rw-r--r--vendor/src/github.com/docker/libcontainer/setns_init_linux.go35
-rw-r--r--vendor/src/github.com/docker/libcontainer/stacktrace/capture.go23
-rw-r--r--vendor/src/github.com/docker/libcontainer/stacktrace/capture_test.go27
-rw-r--r--vendor/src/github.com/docker/libcontainer/stacktrace/frame.go35
-rw-r--r--vendor/src/github.com/docker/libcontainer/stacktrace/frame_test.go20
-rw-r--r--vendor/src/github.com/docker/libcontainer/stacktrace/stacktrace.go5
-rw-r--r--vendor/src/github.com/docker/libcontainer/standard_init_linux.go96
-rw-r--r--vendor/src/github.com/docker/libcontainer/state.go77
-rw-r--r--vendor/src/github.com/docker/libcontainer/stats.go22
-rw-r--r--vendor/src/github.com/docker/libcontainer/system/linux.go29
-rw-r--r--vendor/src/github.com/docker/libcontainer/types.go11
-rwxr-xr-xvendor/src/github.com/docker/libcontainer/update-vendor.sh5
-rw-r--r--vendor/src/github.com/docker/libcontainer/utils/utils.go13
-rw-r--r--vendor/src/github.com/godbus/dbus/CONTRIBUTING.md50
-rw-r--r--vendor/src/github.com/godbus/dbus/MAINTAINERS2
-rw-r--r--vendor/src/github.com/godbus/dbus/conn.go26
-rw-r--r--vendor/src/github.com/godbus/dbus/introspect/introspect.go6
-rw-r--r--vendor/src/github.com/godbus/dbus/introspect/introspectable.go5
-rw-r--r--vendor/src/github.com/godbus/dbus/prop/prop.go8
-rw-r--r--vendor/src/github.com/godbus/dbus/transport_unix.go6
-rw-r--r--vendor/src/github.com/godbus/dbus/transport_unixcred_dragonfly.go95
-rw-r--r--vendor/src/github.com/godbus/dbus/transport_unixcred_linux.go (renamed from vendor/src/github.com/godbus/dbus/transport_unixcred.go)5
-rw-r--r--vendor/src/github.com/godbus/dbus/variant.go14
-rw-r--r--vendor/src/github.com/syndtr/gocapability/capability/capability.go3
-rw-r--r--vendor/src/github.com/syndtr/gocapability/capability/capability_linux.go46
-rw-r--r--vendor/src/github.com/syndtr/gocapability/capability/enum.go89
-rw-r--r--volumes/MAINTAINERS1
-rw-r--r--volumes/repository.go22
-rw-r--r--volumes/repository_test.go164
-rw-r--r--volumes/volume_test.go19
929 files changed, 35412 insertions, 44173 deletions
diff --git a/.drone.yml b/.drone.yml
deleted file mode 100755
index 0b8625d2aa..0000000000
--- a/.drone.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-image: dockercore/docker
-env:
- - AUTO_GOPATH=1
- - DOCKER_GRAPHDRIVER=vfs
- - DOCKER_EXECDRIVER=native
-script:
-# Setup the DockerInDocker environment.
- - hack/dind
-# Tests relying on StartWithBusybox make Drone time out.
- - rm integration-cli/docker_cli_daemon_test.go
- - rm integration-cli/docker_cli_exec_test.go
-# Validate and test.
- - hack/make.sh validate-dco validate-gofmt validate-toml
- - hack/make.sh binary cross test-unit test-integration-cli test-integration test-docker-py
diff --git a/.gitignore b/.gitignore
index 49fa58a946..9696b9a30e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -29,3 +29,5 @@ docs/GIT_BRANCH
docs/VERSION
docs/GITCOMMIT
docs/changed-files
+autogen/
+.bashrc
diff --git a/.mailmap b/.mailmap
index 00b698bba0..8a4500c76d 100644
--- a/.mailmap
+++ b/.mailmap
@@ -1,4 +1,4 @@
-# Generate AUTHORS: project/generate-authors.sh
+# Generate AUTHORS: hack/generate-authors.sh
# Tip for finding duplicates (besides scanning the output of AUTHORS for name
# duplicates that aren't also email duplicates): scan the output of:
diff --git a/AUTHORS b/AUTHORS
index e6ec5d00f7..88fff3aa0a 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -1,5 +1,5 @@
# This file lists all individuals having contributed content to the repository.
-# For how it is generated, see `project/generate-authors.sh`.
+# For how it is generated, see `hack/generate-authors.sh`.
Aanand Prasad <aanand.prasad@gmail.com>
Aaron Feng <aaron.feng@gmail.com>
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8e845e459a..9c541388e5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,25 @@
# Changelog
+## 1.6.0 (2015-04-07)
+
+#### Builder
++ Building images from an image ID
++ build containers with resource constraints, ie `docker build --cpu-shares=100 --memory=1024m...`
++ `commit --change` to apply specified Dockerfile instructions while committing the image
++ `import --change` to apply specified Dockerfile instructions while importing the image
++ basic build cancellation
+
+#### Client
++ Windows Support
+
+#### Runtime
++ Container and image Labels
++ `--cgroup-parent` for specifying a parent cgroup to place container cgroup within
++ Logging drivers, `json-file`, `syslog`, or `none`
++ Pulling images by ID
++ `--ulimit` to set the ulimit on a container
++ `--default-ulimit` option on the daemon which applies to all created containers (and overwritten by `--ulimit` on run)
+
## 1.5.0 (2015-02-10)
#### Builder
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 038dcefcda..e6bf6ad5f3 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,70 +1,60 @@
# Contributing to Docker
-Want to hack on Docker? Awesome! Here are instructions to get you
-started. They are probably not perfect, please let us know if anything
-feels wrong or incomplete.
+Want to hack on Docker? Awesome! We have a contributor's guide that explains
+[setting up a Docker development environment and the contribution
+process](https://docs.docker.com/project/who-written-for/).
+
+![Contributors guide](docs/sources/static_files/contributors.png)
+
+This page contains information about reporting issues as well as some tips and
+guidelines useful to experienced open source contributors. Finally, make sure
+you read our [community guidelines](#docker-community-guidelines) before you
+start participating.
## Topics
* [Reporting Security Issues](#reporting-security-issues)
* [Design and Cleanup Proposals](#design-and-cleanup-proposals)
-* [Reporting Issues](#reporting-issues)
-* [Build Environment](#build-environment)
-* [Contribution Guidelines](#contribution-guidelines)
+* [Reporting Issues](#reporting-other-issues)
+* [Quick Contribution Tips and Guidelines](#quick-contribution-tips-and-guidelines)
* [Community Guidelines](#docker-community-guidelines)
-## Reporting Security Issues
-
-The Docker maintainers take security very seriously. If you discover a security issue,
-please bring it to their attention right away!
-
-Please send your report privately to [security@docker.com](mailto:security@docker.com),
-please **DO NOT** file a public issue.
-
-Security reports are greatly appreciated and we will publicly thank you for it. We also
-like to send gifts - if you're into Docker shwag make sure to let us know :)
-We currently do not offer a paid security bounty program, but are not ruling it out in
-the future.
+## Reporting security issues
-## Design and Cleanup Proposals
+The Docker maintainers take security seriously. If you discover a security
+issue, please bring it to their attention right away!
-When considering a design proposal, we are looking for:
+Please **DO NOT** file a public issue, instead send your report privately to
+[security@docker.com](mailto:security@docker.com),
-* A description of the problem this design proposal solves
-* A pull request, not an issue, that modifies the documentation describing
- the feature you are proposing, adding new documentation if necessary.
- * Please prefix your issue with `Proposal:` in the title
-* Please review [the existing Proposals](https://github.com/docker/docker/pulls?q=is%3Aopen+is%3Apr+label%3AProposal)
- before reporting a new one. You can always pair with someone if you both
- have the same idea.
+Security reports are greatly appreciated and we will publicly thank you for it.
+We also like to send gifts&mdash;if you're into Docker schwag make sure to let
+us know We currently do not offer a paid security bounty program, but are not
+ruling it out in the future.
-When considering a cleanup task, we are looking for:
-* A description of the refactors made
- * Please note any logic changes if necessary
-* A pull request with the code
- * Please prefix your PR's title with `Cleanup:` so we can quickly address it.
- * Your pull request must remain up to date with master, so rebase as necessary.
-
-## Reporting Issues
+## Reporting other issues
A great way to contribute to the project is to send a detailed report when you
encounter an issue. We always appreciate a well-written, thorough bug report,
and will thank you for it!
-When reporting [issues](https://github.com/docker/docker/issues) on
-GitHub please include your host OS (Ubuntu 12.04, Fedora 19, etc).
-Please include:
+Check that [our issue database](https://github.com/docker/docker/issues)
+doesn't already include that problem or suggestion before submitting an issue.
+If you find a match, add a quick "+1" or "I have this problem too." Doing this
+helps prioritize the most common problems and requests.
+
+When reporting issues, please include your host OS (Ubuntu 12.04, Fedora 19,
+etc). Please include:
* The output of `uname -a`.
* The output of `docker version`.
* The output of `docker -D info`.
-Please also include the steps required to reproduce the problem if
-possible and applicable. This information will help us review and fix
-your issue faster.
+Please also include the steps required to reproduce the problem if possible and
+applicable. This information will help us review and fix your issue faster.
-### Template
+**Issue Report Template**:
```
Description of problem:
@@ -103,123 +93,165 @@ Additional info:
```
-## Build Environment
-
-For instructions on setting up your development environment, please
-see our dedicated [dev environment setup
-docs](http://docs.docker.com/contributing/devenvironment/).
-
-## Contribution guidelines
-### Pull requests are always welcome
+##Quick contribution tips and guidelines
+
+This section gives the experienced contributor some tips and guidelines.
+
+###Pull requests are always welcome
+
+Not sure if that typo is worth a pull request? Found a bug and know how to fix
+it? Do it! We will appreciate it. Any significant improvement should be
+documented as [a GitHub issue](https://github.com/docker/docker/issues) before
+anybody starts working on it.
+
+We are always thrilled to receive pull requests. We do our best to process them
+quickly. If your pull request is not accepted on the first try,
+don't get discouraged! Our contributor's guide explains [the review process we
+use for simple changes](https://docs.docker.com/project/make-a-contribution/).
+
+### Design and cleanup proposals
+
+You can propose new designs for existing Docker features. You can also design
+entirely new features. We really appreciate contributors who want to refactor or
+otherwise cleanup our project. For information on making these types of
+contributions, see [the advanced contribution
+section](https://docs.docker.com/project/advanced-contributing/) in the
+contributors guide.
+
+We try hard to keep Docker lean and focused. Docker can't do everything for
+everybody. This means that we might decide against incorporating a new feature.
+However, there might be a way to implement that feature *on top of* Docker.
+
+### Talking to other Docker users and contributors
+
+<table class="tg">
+ <col width="45%">
+ <col width="65%">
+ <tr>
+ <td>Internet&nbsp;Relay&nbsp;Chat&nbsp;(IRC)</th>
+ <td>
+ <p>
+ IRC a direct line to our most knowledgeable Docker users; we have
+ both the <code>#docker</code> and <code>#docker-dev</code> group on
+ <strong>irc.freenode.net</strong>.
+ IRC is a rich chat protocol but it can overwhelm new users. You can search
+ <a href="https://botbot.me/freenode/docker/#" target="_blank">our chat archives</a>.
+ </p>
+ Read our <a href="https://docs.docker.com/project/get-help/#irc-quickstart" target="_blank">IRC quickstart guide</a> for an easy way to get started.
+ </td>
+ </tr>
+ <tr>
+ <td>Google Groups</td>
+ <td>
+ There are two groups.
+ <a href="https://groups.google.com/forum/#!forum/docker-user" target="_blank">Docker-user</a>
+ is for people using Docker containers.
+ The <a href="https://groups.google.com/forum/#!forum/docker-dev" target="_blank">docker-dev</a>
+ group is for contributors and other people contributing to the Docker
+ project.
+ </td>
+ </tr>
+ <tr>
+ <td>Twitter</td>
+ <td>
+ You can follow <a href="https://twitter.com/docker/" target="_blank">Docker's Twitter feed</a>
+ to get updates on our products. You can also tweet us questions or just
+ share blogs or stories.
+ </td>
+ </tr>
+ <tr>
+ <td>Stack Overflow</td>
+ <td>
+ Stack Overflow has over 7000K Docker questions listed. We regularly
+ monitor <a href="http://stackoverflow.com/search?tab=newest&q=docker" target="_blank">Docker questions</a>
+ and so do many other knowledgeable Docker users.
+ </td>
+ </tr>
+</table>
-We are always thrilled to receive pull requests, and do our best to
-process them as quickly as possible. Not sure if that typo is worth a pull
-request? Do it! We will appreciate it.
-
-If your pull request is not accepted on the first try, don't be
-discouraged! If there's a problem with the implementation, hopefully you
-received feedback on what to improve.
-
-We're trying very hard to keep Docker lean and focused. We don't want it
-to do everything for everybody. This means that we might decide against
-incorporating a new feature. However, there might be a way to implement
-that feature *on top of* Docker.
-
-### Discuss your design on the mailing list
-
-We recommend discussing your plans [on the mailing
-list](https://groups.google.com/forum/?fromgroups#!forum/docker-dev)
-before starting to code - especially for more ambitious contributions.
-This gives other contributors a chance to point you in the right
-direction, give feedback on your design, and maybe point out if someone
-else is working on the same thing.
-
-### Create issues...
-
-Any significant improvement should be documented as [a GitHub
-issue](https://github.com/docker/docker/issues) before anybody
-starts working on it.
-
-### ...but check for existing issues first!
-
-Please take a moment to check that an issue doesn't already exist
-documenting your bug report or improvement proposal. If it does, it
-never hurts to add a quick "+1" or "I have this problem too". This will
-help prioritize the most common problems and requests.
### Conventions
Fork the repository and make changes on your fork in a feature branch:
-- If it's a bug fix branch, name it XXXX-something where XXXX is the number of the
- issue.
-- If it's a feature branch, create an enhancement issue to announce your
- intentions, and name it XXXX-something where XXXX is the number of the issue.
+- If it's a bug fix branch, name it XXXX-something where XXXX is the number of
+ the issue.
+- If it's a feature branch, create an enhancement issue to announce
+ your intentions, and name it XXXX-something where XXXX is the number of the
+ issue.
-Submit unit tests for your changes. Go has a great test framework built in; use
-it! Take a look at existing tests for inspiration. Run the full test suite on
-your branch before submitting a pull request.
+Submit unit tests for your changes. Go has a great test framework built in; use
+it! Take a look at existing tests for inspiration. [Run the full test
+suite](https://docs.docker.com/project/test-and-docs/) on your branch before
+submitting a pull request.
-Update the documentation when creating or modifying features. Test
-your documentation changes for clarity, concision, and correctness, as
-well as a clean documentation build. See `docs/README.md` for more
-information on building the docs and how they get released.
+Update the documentation when creating or modifying features. Test your
+documentation changes for clarity, concision, and correctness, as well as a
+clean documentation build. See our contributors guide for [our style
+guide](https://docs.docker.com/project/doc-style) and instructions on [building
+the documentation](https://docs.docker.com/project/test-and-docs/#build-and-test-the-documentation).
Write clean code. Universally formatted code promotes ease of writing, reading,
and maintenance. Always run `gofmt -s -w file.go` on each changed file before
committing your changes. Most editors have plug-ins that do this automatically.
-Pull requests descriptions should be as clear as possible and include a
-reference to all the issues that they address.
+Pull request descriptions should be as clear as possible and include a reference
+to all the issues that they address.
-Commit messages must start with a capitalized and short summary (max. 50
-chars) written in the imperative, followed by an optional, more detailed
-explanatory text which is separated from the summary by an empty line.
+Commit messages must start with a capitalized and short summary (max. 50 chars)
+written in the imperative, followed by an optional, more detailed explanatory
+text which is separated from the summary by an empty line.
Code review comments may be added to your pull request. Discuss, then make the
-suggested modifications and push additional commits to your feature branch. Be
-sure to post a comment after pushing. The new commits will show up in the pull
-request automatically, but the reviewers will not be notified unless you
-comment.
+suggested modifications and push additional commits to your feature branch. Post
+a comment after pushing. New commits show up in the pull request automatically,
+but the reviewers are notified only when you comment.
-Pull requests must be cleanly rebased ontop of master without multiple branches
+Pull requests must be cleanly rebased on top of master without multiple branches
mixed into the PR.
**Git tip**: If your PR no longer merges cleanly, use `rebase master` in your
feature branch to update your pull request rather than `merge master`.
-Before the pull request is merged, make sure that you squash your commits into
-logical units of work using `git rebase -i` and `git push -f`. After every
-commit the test suite should be passing. Include documentation changes in the
-same commit so that a revert would remove all traces of the feature or fix.
+Before you make a pull request, squash your commits into logical units of work
+using `git rebase -i` and `git push -f`. A logical unit of work is a consistent
+set of patches that should be reviewed together: for example, upgrading the
+version of a vendored dependency and taking advantage of its now available new
+feature constitute two separate units of work. Implementing a new function and
+calling it in another file constitute a single logical unit of work. The very
+high majory of submissions should have a single commit, so if in doubt: squash
+down to one.
+
+After every commit, [make sure the test suite passes]
+((https://docs.docker.com/project/test-and-docs/)). Include documentation
+changes in the same pull request so that a revert would remove all traces of
+the feature or fix.
-Commits that fix or close an issue should include a reference like
-`Closes #XXXX` or `Fixes #XXXX`, which will automatically close the
-issue when merged.
+Include an issue reference like `Closes #XXXX` or `Fixes #XXXX` in commits that
+close an issue. Including references automatically closes the issue on a merge.
-Please do not add yourself to the `AUTHORS` file, as it is regenerated
-regularly from the Git history.
+Please do not add yourself to the `AUTHORS` file, as it is regenerated regularly
+from the Git history.
### Merge approval
-Docker maintainers use LGTM (Looks Good To Me) in comments on the code review
-to indicate acceptance.
+Docker maintainers use LGTM (Looks Good To Me) in comments on the code review to
+indicate acceptance.
A change requires LGTMs from an absolute majority of the maintainers of each
component affected. For example, if a change affects `docs/` and `registry/`, it
needs an absolute majority from the maintainers of `docs/` AND, separately, an
absolute majority of the maintainers of `registry/`.
-For more details see [MAINTAINERS](MAINTAINERS)
+For more details, see the [MAINTAINERS](MAINTAINERS) page.
### Sign your work
-The sign-off is a simple line at the end of the explanation for the
-patch, which certifies that you wrote it or otherwise have the right to
-pass it on as an open-source patch. The rules are pretty simple: if you
-can certify the below (from
-[developercertificate.org](http://developercertificate.org/)):
+The sign-off is a simple line at the end of the explanation for the patch. Your
+signature certifies that you wrote the patch or otherwise have the right to pass
+it on as an open-source patch. The rules are pretty simple: if you can certify
+the below (from [developercertificate.org](http://developercertificate.org/)):
```
Developer Certificate of Origin
@@ -263,7 +295,7 @@ Then you just add a line to every git commit message:
Signed-off-by: Joe Smith <joe.smith@email.com>
-Using your real name (sorry, no pseudonyms or anonymous contributions.)
+Use your real name (sorry, no pseudonyms or anonymous contributions.)
If you set your `user.name` and `user.email` git configs, you can sign your
commit automatically with `git commit -s`.
@@ -280,45 +312,45 @@ format right away, but please do adjust your processes for future contributions.
* Step 4: Propose yourself at a scheduled docker meeting in #docker-dev
Don't forget: being a maintainer is a time investment. Make sure you
-will have time to make yourself available. You don't have to be a
+will have time to make yourself available. You don't have to be a
maintainer to make a difference on the project!
-### IRC Meetings
+### IRC meetings
-There are two monthly meetings taking place on #docker-dev IRC to accomodate all timezones.
-Anybody can ask for a topic to be discussed prior to the meeting.
+There are two monthly meetings taking place on #docker-dev IRC to accomodate all
+timezones. Anybody can propose a topic for discussion prior to the meeting.
If you feel the conversation is going off-topic, feel free to point it out.
-For the exact dates and times, have a look at [the irc-minutes repo](https://github.com/docker/irc-minutes).
-They also contain all the notes from previous meetings.
+For the exact dates and times, have a look at [the irc-minutes
+repo](https://github.com/docker/irc-minutes). The minutes also contain all the
+notes from previous meetings.
-## Docker Community Guidelines
+## Docker community guidelines
-We want to keep the Docker community awesome, growing and collaborative. We
-need your help to keep it that way. To help with this we've come up with some
-general guidelines for the community as a whole:
+We want to keep the Docker community awesome, growing and collaborative. We need
+your help to keep it that way. To help with this we've come up with some general
+guidelines for the community as a whole:
-* Be nice: Be courteous, respectful and polite to fellow community members: no
- regional, racial, gender, or other abuse will be tolerated. We like nice people
- way better than mean ones!
+* Be nice: Be courteous, respectful and polite to fellow community members:
+ no regional, racial, gender, or other abuse will be tolerated. We like
+ nice people way better than mean ones!
-* Encourage diversity and participation: Make everyone in our community
- feel welcome, regardless of their background and the extent of their
+* Encourage diversity and participation: Make everyone in our community feel
+ welcome, regardless of their background and the extent of their
contributions, and do everything possible to encourage participation in
our community.
* Keep it legal: Basically, don't get us in trouble. Share only content that
- you own, do not share private or sensitive information, and don't break the
- law.
+ you own, do not share private or sensitive information, and don't break
+ the law.
-* Stay on topic: Make sure that you are posting to the correct channel
- and avoid off-topic discussions. Remember when you update an issue or
- respond to an email you are potentially sending to a large number of
- people. Please consider this before you update. Also remember that
- nobody likes spam.
+* Stay on topic: Make sure that you are posting to the correct channel and
+ avoid off-topic discussions. Remember when you update an issue or respond
+ to an email you are potentially sending to a large number of people. Please
+ consider this before you update. Also remember that nobody likes spam.
-### Guideline Violations — 3 Strikes Method
+### Guideline violations — 3 strikes method
The point of this section is not to find opportunities to punish people, but we
do need a fair way to deal with people who are making our community suck.
@@ -337,20 +369,19 @@ do need a fair way to deal with people who are making our community suck.
* Obvious spammers are banned on first occurrence. If we don't do this, we'll
have spam all over the place.
-* Violations are forgiven after 6 months of good behavior, and we won't
- hold a grudge.
+* Violations are forgiven after 6 months of good behavior, and we won't hold a
+ grudge.
-* People who commit minor infractions will get some education,
- rather than hammering them in the 3 strikes process.
+* People who commit minor infractions will get some education, rather than
+ hammering them in the 3 strikes process.
-* The rules apply equally to everyone in the community, no matter how
- much you've contributed.
+* The rules apply equally to everyone in the community, no matter how much
+ you've contributed.
* Extreme violations of a threatening, abusive, destructive or illegal nature
- will be addressed immediately and are not subject to 3 strikes or
- forgiveness.
+ will be addressed immediately and are not subject to 3 strikes or forgiveness.
* Contact abuse@docker.com to report abuse or appeal violations. In the case of
- appeals, we know that mistakes happen, and we'll work with you to come up with
- a fair solution if there has been a misunderstanding.
+ appeals, we know that mistakes happen, and we'll work with you to come up with a
+ fair solution if there has been a misunderstanding.
diff --git a/Dockerfile b/Dockerfile
index fdf35227fc..b064076137 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -73,7 +73,7 @@ RUN cd /usr/src/lxc \
&& ldconfig
# Install Go
-ENV GO_VERSION 1.4.1
+ENV GO_VERSION 1.4.2
RUN curl -sSL https://golang.org/dl/go${GO_VERSION}.src.tar.gz | tar -v -C /usr/local -xz \
&& mkdir -p /go/bin
ENV PATH /go/bin:/usr/local/go/bin:$PATH
@@ -84,10 +84,8 @@ RUN cd /usr/local/go/src && ./make.bash --no-clean 2>&1
ENV DOCKER_CROSSPLATFORMS \
linux/386 linux/arm \
darwin/amd64 darwin/386 \
- freebsd/amd64 freebsd/386 freebsd/arm
-
-# TODO when https://jenkins.dockerproject.com/job/Windows/ is green, add windows back to the list above
-# windows/amd64 windows/386
+ freebsd/amd64 freebsd/386 freebsd/arm \
+ windows/amd64 windows/386
# (set an explicit GOARM of 5 for maximum compatibility)
ENV GOARM 5
@@ -109,14 +107,8 @@ RUN go get golang.org/x/tools/cmd/cover
# TODO replace FPM with some very minimal debhelper stuff
RUN gem install --no-rdoc --no-ri fpm --version 1.3.2
-# Get the "busybox" image source so we can build locally instead of pulling
-RUN git clone -b buildroot-2014.02 https://github.com/jpetazzo/docker-busybox.git /docker-busybox
-
-# Get the "cirros" image source so we can import it instead of fetching it during tests
-RUN curl -sSL -o /cirros.tar.gz https://github.com/ewindisch/docker-cirros/raw/1cded459668e8b9dbf4ef976c94c05add9bbd8e9/cirros-0.3.0-x86_64-lxc.tar.gz
-
# Install registry
-ENV REGISTRY_COMMIT c448e0416925a9876d5576e412703c9b8b865e19
+ENV REGISTRY_COMMIT d957768537c5af40e4f4cd96871f7b2bde9e2923
RUN set -x \
&& git clone https://github.com/docker/distribution.git /go/src/github.com/docker/distribution \
&& (cd /go/src/github.com/docker/distribution && git checkout -q $REGISTRY_COMMIT) \
@@ -124,7 +116,7 @@ RUN set -x \
go build -o /go/bin/registry-v2 github.com/docker/distribution/cmd/registry
# Get the "docker-py" source so we can run their integration tests
-ENV DOCKER_PY_COMMIT aa19d7b6609c6676e8258f6b900dea2eda1dbe95
+ENV DOCKER_PY_COMMIT 91985b239764fe54714fa0a93d52aa362357d251
RUN git clone https://github.com/docker/docker-py.git /docker-py \
&& cd /docker-py \
&& git checkout -q $DOCKER_PY_COMMIT
@@ -147,6 +139,16 @@ VOLUME /var/lib/docker
WORKDIR /go/src/github.com/docker/docker
ENV DOCKER_BUILDTAGS apparmor selinux btrfs_noversion
+# Let us use a .bashrc file
+RUN ln -sfv $PWD/.bashrc ~/.bashrc
+
+# Get useful and necessary Hub images so we can "docker load" locally instead of pulling
+COPY contrib/download-frozen-image.sh /go/src/github.com/docker/docker/contrib/
+RUN ./contrib/download-frozen-image.sh /docker-frozen-images \
+ busybox:latest@4986bf8c15363d1c5d15512d5266f8777bfba4974ac56e3270e7760f6f0a8125 \
+ hello-world:frozen@e45a5af57b00862e5ef5782a9925979a02ba2b12dff832fd0991335f4a11e5c5
+# see also "hack/make/.ensure-frozen-images" (which needs to be updated any time this list is)
+
# Install man page generator
COPY vendor /go/src/github.com/docker/docker/vendor
# (copy vendor/ because go-md2man needs golang.org/x/net)
@@ -156,8 +158,11 @@ RUN set -x \
&& go install -v github.com/cpuguy83/go-md2man
# install toml validator
-RUN git clone -b v0.1.0 https://github.com/BurntSushi/toml.git /go/src/github.com/BurntSushi/toml \
- && go install -v github.com/BurntSushi/toml/cmd/tomlv
+ENV TOMLV_COMMIT 9baf8a8a9f2ed20a8e54160840c492f937eeaf9a
+RUN set -x \
+ && git clone https://github.com/BurntSushi/toml.git /go/src/github.com/BurntSushi/toml \
+ && (cd /go/src/github.com/BurntSushi/toml && git checkout -q $TOMLV_COMMIT) \
+ && go install -v github.com/BurntSushi/toml/cmd/tomlv
# Wrap all commands in the "docker-in-docker" script to allow nested containers
ENTRYPOINT ["hack/dind"]
diff --git a/Dockerfile.simple b/Dockerfile.simple
new file mode 100644
index 0000000000..12ee7dde30
--- /dev/null
+++ b/Dockerfile.simple
@@ -0,0 +1,34 @@
+# docker build -t docker:simple -f Dockerfile.simple .
+# docker run --rm docker:simple hack/make.sh dynbinary
+# docker run --rm --privileged docker:simple hack/dind hack/make.sh test-unit
+# docker run --rm --privileged -v /var/lib/docker docker:simple hack/dind hack/make.sh dynbinary test-integration-cli
+
+# This represents the bare minimum required to build and test Docker.
+
+FROM debian:jessie
+
+# compile and runtime deps
+# https://github.com/docker/docker/blob/master/project/PACKAGERS.md#build-dependencies
+# https://github.com/docker/docker/blob/master/project/PACKAGERS.md#runtime-dependencies
+RUN apt-get update && apt-get install -y --no-install-recommends \
+ btrfs-tools \
+ curl \
+ gcc \
+ git \
+ golang \
+ libdevmapper-dev \
+ libsqlite3-dev \
+ \
+ ca-certificates \
+ e2fsprogs \
+ iptables \
+ procps \
+ xz-utils \
+ \
+ aufs-tools \
+ lxc \
+ && rm -rf /var/lib/apt/lists/*
+
+ENV AUTO_GOPATH 1
+WORKDIR /usr/src/docker
+COPY . /usr/src/docker
diff --git a/MAINTAINERS b/MAINTAINERS
index ecad160303..04951bf459 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -12,9 +12,9 @@
[Rules.maintainers]
- title = "What is a maintainer?"
+ title = "What is a maintainer?"
- text = """
+ text = """
There are different types of maintainers, with different responsibilities, but
all maintainers have 3 things in common:
@@ -193,13 +193,18 @@ for each.
# They should ask for any editorial change that makes the documentation more
# consistent and easier to understand.
#
- # Once documentation is approved, a maintainer should make sure to remove this
+ # Once documentation is approved (see below), a maintainer should make sure to remove this
# label and add the next one.
close = ""
2-code-review = "requires more code changes"
1-design-review = "raises design concerns"
4-merge = "general case"
+
+ # Docs approval
+ [Rules.review.docs-approval]
+ # Changes and additions to docs must be reviewed and approved (LGTM'd) by a minimum of two docs sub-project maintainers.
+ # If the docs change originates with a docs maintainer, only one additional LGTM is required (since we assume a docs maintainer approves of their own PR).
# Merge
[Rules.review.states.4-merge]
@@ -337,13 +342,14 @@ made through a pull request.
"unclejack",
"crosbymichael",
"erikh",
+ "estesp",
"icecrime",
"jfrazelle",
"lk4d4",
"tibor",
"vbatts",
"vieux",
- "vish"
+ "vishh"
]
@@ -403,6 +409,8 @@ made through a pull request.
"fredlf",
"james",
"sven",
+ "spf13",
+ "mary"
]
[Org.Subsystems.libcontainer]
@@ -421,7 +429,10 @@ made through a pull request.
"dmp42",
"vbatts",
"joffrey",
- "samalba"
+ "samalba",
+ "sday",
+ "jlhawn",
+ "dmcg"
]
[Org.Subsystems."build tools"]
@@ -499,6 +510,16 @@ made through a pull request.
Email = "dug@us.ibm.com"
GitHub = "duglin"
+ [people.dmcg]
+ Name = "Derek McGowan"
+ Email = "derek@docker.com"
+ Github = "dmcgowan"
+
+ [people.dmp42]
+ Name = "Olivier Gambier"
+ Email = "olivier@docker.com"
+ Github = "dmp42"
+
[people.ehazlett]
Name = "Evan Hazlett"
Email = "ejhazlett@gmail.com"
@@ -514,6 +535,16 @@ made through a pull request.
Email = "eric@windisch.us"
GitHub = "ewindisch"
+ [people.estesp]
+ Name = "Phil Estes"
+ Email = "estesp@linux.vnet.ibm.com"
+ GitHub = "estesp"
+
+ [people.fredlf]
+ Name = "Fred Lifton"
+ Email = "fred.lifton@docker.com"
+ GitHub = "fredlf"
+
[people.icecrime]
Name = "Arnaud Porterie"
Email = "arnaud@docker.com"
@@ -524,11 +555,31 @@ made through a pull request.
Email = "jess@docker.com"
GitHub = "jfrazelle"
+ [people.jlhawn]
+ Name = "Josh Hawn"
+ Email = "josh.hawn@docker.com"
+ Github = "jlhawn"
+
+ [people.joffrey]
+ Name = "Joffrey Fuhrer"
+ Email = "joffrey@docker.com"
+ Github = "shin-"
+
[people.lk4d4]
Name = "Alexander Morozov"
Email = "lk4d4@docker.com"
GitHub = "lk4d4"
+ [people.mary]
+ Name = "Mary Anthony"
+ Email = "mary.anthony@docker.com"
+ GitHub = "moxiegirl"
+
+ [people.sday]
+ Name = "Stephen Day"
+ Email = "stephen.day@docker.com"
+ Github = "stevvooe"
+
[people.shykes]
Name = "Solomon Hykes"
Email = "solomon@docker.com"
@@ -584,7 +635,7 @@ made through a pull request.
Email = "cristian.staretu@gmail.com"
GitHub = "unclejack"
- [people.vish]
+ [people.vishh]
Name = "Vishnu Kannan"
Email = "vishnuk@google.com"
GitHub = "vishh"
diff --git a/Makefile b/Makefile
index 266fa2a9a4..9bf1b16c94 100644
--- a/Makefile
+++ b/Makefile
@@ -13,10 +13,11 @@ DOCKER_ENVS := \
-e TIMEOUT
# note: we _cannot_ add "-e DOCKER_BUILDTAGS" here because even if it's unset in the shell, that would shadow the "ENV DOCKER_BUILDTAGS" set in our Dockerfile, which is very important for our official builds
-# to allow `make BINDDIR=. shell` or `make BINDDIR= test`
+# to allow `make BIND_DIR=. shell` or `make BIND_DIR= test`
# (default to no bind mount if DOCKER_HOST is set)
-BINDDIR := $(if $(DOCKER_HOST),,bundles)
-DOCKER_MOUNT := $(if $(BINDDIR),-v "$(CURDIR)/$(BINDDIR):/go/src/github.com/docker/docker/$(BINDDIR)")
+# note: BINDDIR is supported for backwards-compatibility here
+BIND_DIR := $(if $(BINDDIR),$(BINDDIR),$(if $(DOCKER_HOST),,bundles))
+DOCKER_MOUNT := $(if $(BIND_DIR),-v "$(CURDIR)/$(BIND_DIR):/go/src/github.com/docker/docker/$(BIND_DIR)")
# to allow `make DOCSDIR=docs docs-shell` (to create a bind mount in docs)
DOCS_MOUNT := $(if $(DOCSDIR),-v $(CURDIR)/$(DOCSDIR):/$(DOCSDIR))
@@ -53,7 +54,9 @@ docs-shell: docs-build
$(DOCKER_RUN_DOCS) -p $(if $(DOCSPORT),$(DOCSPORT):)8000 "$(DOCKER_DOCS_IMAGE)" bash
docs-release: docs-build
- $(DOCKER_RUN_DOCS) -e OPTIONS -e BUILD_ROOT -e DISTRIBUTION_ID "$(DOCKER_DOCS_IMAGE)" ./release.sh
+ $(DOCKER_RUN_DOCS) -e OPTIONS -e BUILD_ROOT -e DISTRIBUTION_ID \
+ -v $(CURDIR)/docs/awsconfig:/docs/awsconfig \
+ "$(DOCKER_DOCS_IMAGE)" ./release.sh
docs-test: docs-build
$(DOCKER_RUN_DOCS) "$(DOCKER_DOCS_IMAGE)" ./test.sh
@@ -83,11 +86,11 @@ build: bundles
docker build -t "$(DOCKER_IMAGE)" .
docs-build:
- ( git remote | grep -v upstream ) || git diff --name-status upstream/release..upstream/docs docs/ > docs/changed-files
cp ./VERSION docs/VERSION
echo "$(GIT_BRANCH)" > docs/GIT_BRANCH
- echo "$(AWS_S3_BUCKET)" > docs/AWS_S3_BUCKET
+# echo "$(AWS_S3_BUCKET)" > docs/AWS_S3_BUCKET
echo "$(GITCOMMIT)" > docs/GITCOMMIT
+ docker pull docs/base
docker build -t "$(DOCKER_DOCS_IMAGE)" docs
bundles:
diff --git a/NOTICE b/NOTICE
index d0e0639a5a..435ace7f01 100644
--- a/NOTICE
+++ b/NOTICE
@@ -1,5 +1,5 @@
Docker
-Copyright 2012-2014 Docker, Inc.
+Copyright 2012-2015 Docker, Inc.
This product includes software developed at Docker, Inc. (http://www.docker.com).
diff --git a/README.md b/README.md
index 2ef78b78ce..079713ced9 100644
--- a/README.md
+++ b/README.md
@@ -18,7 +18,7 @@ It benefits directly from the experience accumulated over several years
of large-scale operation and support of hundreds of thousands of
applications and databases.
-![Docker L](docs/theme/mkdocs/images/docker-logo-compressed.png "Docker")
+![Docker L](docs/sources/static_files/docker-logo-compressed.png "Docker")
## Security Disclosure
@@ -173,6 +173,8 @@ Under the hood, Docker is built on the following components:
[namespacing](http://blog.dotcloud.com/under-the-hood-linux-kernels-on-dotcloud-part)
capabilities of the Linux kernel;
* The [Go](http://golang.org) programming language.
+* The [Docker Image Specification] (https://github.com/docker/docker/blob/master/image/spec/v1.md)
+* The [Libcontainer Specification] (https://github.com/docker/libcontainer/blob/master/SPEC.md)
Contributing to Docker
======================
@@ -181,12 +183,14 @@ Contributing to Docker
[![Jenkins Build Status](https://jenkins.dockerproject.com/job/Docker%20Master/badge/icon)](https://jenkins.dockerproject.com/job/Docker%20Master/)
Want to hack on Docker? Awesome! We have [instructions to help you get
-started](CONTRIBUTING.md). If you'd like to contribute to the
-documentation, please take a look at this [README.md](https://github.com/docker/docker/blob/master/docs/README.md).
+started contributing code or documentation.](https://docs.docker.com/project/who-written-for/).
These instructions are probably not perfect, please let us know if anything
feels wrong or incomplete. Better yet, submit a PR and improve them yourself.
+Getting the development builds
+==============================
+
Want to run Docker from a master build? You can download
master builds at [master.dockerproject.com](https://master.dockerproject.com).
They are updated with each commit merged into the master branch.
@@ -231,12 +235,12 @@ Docker platform to broaden its application and utility.
If you know of another project underway that should be listed here, please help
us keep this list up-to-date by submitting a PR.
-* [Docker Registry](https://github.com/docker/docker-registry): Registry
-server for Docker (hosting/delivering of repositories and images)
+* [Docker Registry](https://github.com/docker/distribution): Registry
+server for Docker (hosting/delivery of repositories and images)
* [Docker Machine](https://github.com/docker/machine): Machine management
for a container-centric world
* [Docker Swarm](https://github.com/docker/swarm): A Docker-native clustering
system
-* [Docker Compose, aka Fig](https://github.com/docker/fig):
-Multi-container application management
+* [Docker Compose](https://github.com/docker/compose) (formerly Fig):
+Define and run multi-container apps
diff --git a/VERSION b/VERSION
index bc80560fad..dc1e644a10 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.5.0
+1.6.0
diff --git a/api/MAINTAINERS b/api/MAINTAINERS
deleted file mode 100644
index 96abeae570..0000000000
--- a/api/MAINTAINERS
+++ /dev/null
@@ -1,2 +0,0 @@
-Victor Vieux <vieux@docker.com> (@vieux)
-Jessie Frazelle <jess@docker.com> (@jfrazelle)
diff --git a/api/client/cli.go b/api/client/cli.go
index 5e1ccb3291..e0ab4191bf 100644
--- a/api/client/cli.go
+++ b/api/client/cli.go
@@ -14,6 +14,7 @@ import (
"text/template"
"time"
+ "github.com/docker/docker/pkg/homedir"
flag "github.com/docker/docker/pkg/mflag"
"github.com/docker/docker/pkg/term"
"github.com/docker/docker/registry"
@@ -92,10 +93,13 @@ func (cli *DockerCli) Subcmd(name, signature, description string, exitOnError bo
flags := flag.NewFlagSet(name, errorHandling)
flags.Usage = func() {
options := ""
+ if signature != "" {
+ signature = " " + signature
+ }
if flags.FlagCountUndeprecated() > 0 {
- options = "[OPTIONS] "
+ options = " [OPTIONS]"
}
- fmt.Fprintf(cli.out, "\nUsage: docker %s %s%s\n\n%s\n\n", name, options, signature, description)
+ fmt.Fprintf(cli.out, "\nUsage: docker %s%s%s\n\n%s\n\n", name, options, signature, description)
flags.SetOutput(cli.out)
flags.PrintDefaults()
os.Exit(0)
@@ -104,7 +108,7 @@ func (cli *DockerCli) Subcmd(name, signature, description string, exitOnError bo
}
func (cli *DockerCli) LoadConfigFile() (err error) {
- cli.configFile, err = registry.LoadConfig(os.Getenv("HOME"))
+ cli.configFile, err = registry.LoadConfig(homedir.Get())
if err != nil {
fmt.Fprintf(cli.err, "WARNING: %s\n", err)
}
@@ -133,19 +137,12 @@ func NewDockerCli(in io.ReadCloser, out, err io.Writer, keyFile string, proto, a
if tlsConfig != nil {
scheme = "https"
}
-
if in != nil {
- if file, ok := in.(*os.File); ok {
- inFd = file.Fd()
- isTerminalIn = term.IsTerminal(inFd)
- }
+ inFd, isTerminalIn = term.GetFdInfo(in)
}
if out != nil {
- if file, ok := out.(*os.File); ok {
- outFd = file.Fd()
- isTerminalOut = term.IsTerminal(outFd)
- }
+ outFd, isTerminalOut = term.GetFdInfo(out)
}
if err == nil {
@@ -154,7 +151,6 @@ func NewDockerCli(in io.ReadCloser, out, err io.Writer, keyFile string, proto, a
// The transport is created here for reuse during the client session
tr := &http.Transport{
- Proxy: http.ProxyFromEnvironment,
TLSClientConfig: tlsConfig,
}
@@ -167,6 +163,7 @@ func NewDockerCli(in io.ReadCloser, out, err io.Writer, keyFile string, proto, a
return net.DialTimeout(proto, addr, timeout)
}
} else {
+ tr.Proxy = http.ProxyFromEnvironment
tr.Dial = (&net.Dialer{Timeout: timeout}).Dial
}
diff --git a/api/client/commands.go b/api/client/commands.go
index c4ce5e01f3..84e426ef77 100644
--- a/api/client/commands.go
+++ b/api/client/commands.go
@@ -26,17 +26,21 @@ import (
log "github.com/Sirupsen/logrus"
"github.com/docker/docker/api"
- "github.com/docker/docker/api/stats"
- "github.com/docker/docker/dockerversion"
+ "github.com/docker/docker/api/types"
+ "github.com/docker/docker/autogen/dockerversion"
"github.com/docker/docker/engine"
"github.com/docker/docker/graph"
"github.com/docker/docker/nat"
"github.com/docker/docker/opts"
"github.com/docker/docker/pkg/archive"
+ "github.com/docker/docker/pkg/common"
"github.com/docker/docker/pkg/fileutils"
+ "github.com/docker/docker/pkg/homedir"
flag "github.com/docker/docker/pkg/mflag"
+ "github.com/docker/docker/pkg/networkfs/resolvconf"
"github.com/docker/docker/pkg/parsers"
"github.com/docker/docker/pkg/parsers/filters"
+ "github.com/docker/docker/pkg/progressreader"
"github.com/docker/docker/pkg/promise"
"github.com/docker/docker/pkg/signal"
"github.com/docker/docker/pkg/symlink"
@@ -79,13 +83,17 @@ func (cli *DockerCli) CmdHelp(args ...string) error {
func (cli *DockerCli) CmdBuild(args ...string) error {
cmd := cli.Subcmd("build", "PATH | URL | -", "Build a new image from the source code at PATH", true)
- tag := cmd.String([]string{"t", "-tag"}, "", "Repository name (and optionally a tag) to be applied to the resulting image in case of success")
+ tag := cmd.String([]string{"t", "-tag"}, "", "Repository name (and optionally a tag) for the image")
suppressOutput := cmd.Bool([]string{"q", "-quiet"}, false, "Suppress the verbose output generated by the containers")
noCache := cmd.Bool([]string{"#no-cache", "-no-cache"}, false, "Do not use cache when building the image")
rm := cmd.Bool([]string{"#rm", "-rm"}, true, "Remove intermediate containers after a successful build")
- forceRm := cmd.Bool([]string{"-force-rm"}, false, "Always remove intermediate containers, even after unsuccessful builds")
+ forceRm := cmd.Bool([]string{"-force-rm"}, false, "Always remove intermediate containers")
pull := cmd.Bool([]string{"-pull"}, false, "Always attempt to pull a newer version of the image")
- dockerfileName := cmd.String([]string{"f", "-file"}, "", "Name of the Dockerfile(Default is 'Dockerfile' at context root)")
+ dockerfileName := cmd.String([]string{"f", "-file"}, "", "Name of the Dockerfile (Default is 'PATH/Dockerfile')")
+ flMemoryString := cmd.String([]string{"m", "-memory"}, "", "Memory limit")
+ flMemorySwap := cmd.String([]string{"-memory-swap"}, "", "Total memory (memory + swap), '-1' to disable swap")
+ flCpuShares := cmd.Int64([]string{"c", "-cpu-shares"}, 0, "CPU shares (relative weight)")
+ flCpuSetCpus := cmd.String([]string{"-cpuset-cpus"}, "", "CPUs in which to allow execution (0-3, 0,1)")
cmd.Require(flag.Exact, 1)
@@ -112,9 +120,10 @@ func (cli *DockerCli) CmdBuild(args ...string) error {
if err != nil {
return fmt.Errorf("failed to read Dockerfile from STDIN: %v", err)
}
- if *dockerfileName == "" {
- *dockerfileName = api.DefaultDockerfileName
- }
+
+ // -f option has no meaning when we're reading it from stdin,
+ // so just use our default Dockerfile name
+ *dockerfileName = api.DefaultDockerfileName
context, err = archive.Generate(*dockerfileName, string(dockerfile))
} else {
context = ioutil.NopCloser(buf)
@@ -153,11 +162,20 @@ func (cli *DockerCli) CmdBuild(args ...string) error {
if *dockerfileName == "" {
// No -f/--file was specified so use the default
*dockerfileName = api.DefaultDockerfileName
- filename = path.Join(absRoot, *dockerfileName)
+ filename = filepath.Join(absRoot, *dockerfileName)
+
+ // Just to be nice ;-) look for 'dockerfile' too but only
+ // use it if we found it, otherwise ignore this check
+ if _, err = os.Lstat(filename); os.IsNotExist(err) {
+ tmpFN := path.Join(absRoot, strings.ToLower(*dockerfileName))
+ if _, err = os.Lstat(tmpFN); err == nil {
+ *dockerfileName = strings.ToLower(*dockerfileName)
+ filename = tmpFN
+ }
+ }
}
origDockerfile := *dockerfileName // used for error msg
-
if filename, err = filepath.Abs(filename); err != nil {
return err
}
@@ -173,6 +191,11 @@ func (cli *DockerCli) CmdBuild(args ...string) error {
if err != nil {
return err
}
+ // And canonicalize dockerfile name to a platform-independent one
+ *dockerfileName, err = archive.CanonicalTarNameForPath(*dockerfileName)
+ if err != nil {
+ return fmt.Errorf("Cannot canonicalize dockerfile path %s: %v", dockerfileName, err)
+ }
if _, err = os.Lstat(filename); os.IsNotExist(err) {
return fmt.Errorf("Cannot locate Dockerfile: %s", origDockerfile)
@@ -209,12 +232,48 @@ func (cli *DockerCli) CmdBuild(args ...string) error {
return err
}
}
+
+ // windows: show error message about modified file permissions
+ // FIXME: this is not a valid warning when the daemon is running windows. should be removed once docker engine for windows can build.
+ if runtime.GOOS == "windows" {
+ log.Warn(`SECURITY WARNING: You are building a Docker image from Windows against a Linux Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories.`)
+ }
+
var body io.Reader
// Setup an upload progress bar
// FIXME: ProgressReader shouldn't be this annoying to use
if context != nil {
sf := utils.NewStreamFormatter(false)
- body = utils.ProgressReader(context, 0, cli.out, sf, true, "", "Sending build context to Docker daemon")
+ body = progressreader.New(progressreader.Config{
+ In: context,
+ Out: cli.out,
+ Formatter: sf,
+ NewLines: true,
+ ID: "",
+ Action: "Sending build context to Docker daemon",
+ })
+ }
+
+ var memory int64
+ if *flMemoryString != "" {
+ parsedMemory, err := units.RAMInBytes(*flMemoryString)
+ if err != nil {
+ return err
+ }
+ memory = parsedMemory
+ }
+
+ var memorySwap int64
+ if *flMemorySwap != "" {
+ if *flMemorySwap == "-1" {
+ memorySwap = -1
+ } else {
+ parsedMemorySwap, err := units.RAMInBytes(*flMemorySwap)
+ if err != nil {
+ return err
+ }
+ memorySwap = parsedMemorySwap
+ }
}
// Send the build context
v := &url.Values{}
@@ -257,6 +316,11 @@ func (cli *DockerCli) CmdBuild(args ...string) error {
v.Set("pull", "1")
}
+ v.Set("cpusetcpus", *flCpuSetCpus)
+ v.Set("cpushares", strconv.FormatInt(*flCpuShares, 10))
+ v.Set("memory", strconv.FormatInt(memory, 10))
+ v.Set("memswap", strconv.FormatInt(memorySwap, 10))
+
v.Set("dockerfile", *dockerfileName)
cli.LoadConfigFile()
@@ -284,7 +348,7 @@ func (cli *DockerCli) CmdBuild(args ...string) error {
// 'docker login': login / register a user to registry service.
func (cli *DockerCli) CmdLogin(args ...string) error {
- cmd := cli.Subcmd("login", "[SERVER]", "Register or log in to a Docker registry server, if no server is specified \""+registry.IndexServerAddress()+"\" is the default.", true)
+ cmd := cli.Subcmd("login", "[SERVER]", "Register or log in to a Docker registry server, if no server is\nspecified \""+registry.IndexServerAddress()+"\" is the default.", true)
cmd.Require(flag.Max, 1)
var username, password, email string
@@ -327,6 +391,7 @@ func (cli *DockerCli) CmdLogin(args ...string) error {
if username == "" {
promptDefault("Username", authconfig.Username)
username = readInput(cli.in, cli.out)
+ username = strings.Trim(username, " ")
if username == "" {
username = authconfig.Username
}
@@ -361,7 +426,7 @@ func (cli *DockerCli) CmdLogin(args ...string) error {
} else {
// However, if they don't override the username use the
// password or email from the cmd line if specified. IOW, allow
- // then to change/overide them. And if not specified, just
+ // then to change/override them. And if not specified, just
// use what's in the config file
if password == "" {
password = authconfig.Password
@@ -376,7 +441,7 @@ func (cli *DockerCli) CmdLogin(args ...string) error {
authconfig.ServerAddress = serverAddress
cli.configFile.Configs[serverAddress] = authconfig
- stream, statusCode, err := cli.call("POST", "/auth", cli.configFile.Configs[serverAddress], false)
+ stream, statusCode, err := cli.call("POST", "/auth", cli.configFile.Configs[serverAddress], nil)
if statusCode == 401 {
delete(cli.configFile.Configs, serverAddress)
registry.SaveConfig(cli.configFile)
@@ -388,10 +453,12 @@ func (cli *DockerCli) CmdLogin(args ...string) error {
var out2 engine.Env
err = out2.Decode(stream)
if err != nil {
- cli.configFile, _ = registry.LoadConfig(os.Getenv("HOME"))
+ cli.configFile, _ = registry.LoadConfig(homedir.Get())
return err
}
registry.SaveConfig(cli.configFile)
+ fmt.Fprintf(cli.out, "WARNING: login credentials saved in %s.\n", path.Join(homedir.Get(), registry.CONFIGFILE))
+
if out2.Get("Status") != "" {
fmt.Fprintf(cli.out, "%s\n", out2.Get("Status"))
}
@@ -400,7 +467,7 @@ func (cli *DockerCli) CmdLogin(args ...string) error {
// log out from a Docker registry
func (cli *DockerCli) CmdLogout(args ...string) error {
- cmd := cli.Subcmd("logout", "[SERVER]", "Log out from a Docker registry, if no server is specified \""+registry.IndexServerAddress()+"\" is the default.", true)
+ cmd := cli.Subcmd("logout", "[SERVER]", "Log out from a Docker registry, if no server is\nspecified \""+registry.IndexServerAddress()+"\" is the default.", true)
cmd.Require(flag.Max, 1)
utils.ParseFlags(cmd, args, false)
@@ -460,7 +527,7 @@ func (cli *DockerCli) CmdVersion(args ...string) error {
}
fmt.Fprintf(cli.out, "OS/Arch (client): %s/%s\n", runtime.GOOS, runtime.GOARCH)
- body, _, err := readBody(cli.call("GET", "/version", nil, false))
+ body, _, err := readBody(cli.call("GET", "/version", nil, nil))
if err != nil {
return err
}
@@ -482,6 +549,7 @@ func (cli *DockerCli) CmdVersion(args ...string) error {
}
fmt.Fprintf(cli.out, "Go version (server): %s\n", remoteVersion.Get("GoVersion"))
fmt.Fprintf(cli.out, "Git commit (server): %s\n", remoteVersion.Get("GitCommit"))
+ fmt.Fprintf(cli.out, "OS/Arch (server): %s/%s\n", remoteVersion.Get("Os"), remoteVersion.Get("Arch"))
return nil
}
@@ -491,7 +559,7 @@ func (cli *DockerCli) CmdInfo(args ...string) error {
cmd.Require(flag.Exact, 0)
utils.ParseFlags(cmd, args, false)
- body, _, err := readBody(cli.call("GET", "/info", nil, false))
+ body, _, err := readBody(cli.call("GET", "/info", nil, nil))
if err != nil {
return err
}
@@ -559,6 +627,14 @@ func (cli *DockerCli) CmdInfo(args ...string) error {
if remoteInfo.Exists("NGoroutines") {
fmt.Fprintf(cli.out, "Goroutines: %d\n", remoteInfo.GetInt("NGoroutines"))
}
+ if remoteInfo.Exists("SystemTime") {
+ t, err := remoteInfo.GetTime("SystemTime")
+ if err != nil {
+ log.Errorf("Error reading system time: %v", err)
+ } else {
+ fmt.Fprintf(cli.out, "System Time: %s\n", t.Format(time.UnixDate))
+ }
+ }
if remoteInfo.Exists("NEventsListener") {
fmt.Fprintf(cli.out, "EventsListeners: %d\n", remoteInfo.GetInt("NEventsListener"))
}
@@ -572,7 +648,15 @@ func (cli *DockerCli) CmdInfo(args ...string) error {
fmt.Fprintf(cli.out, "Docker Root Dir: %s\n", root)
}
}
-
+ if remoteInfo.Exists("HttpProxy") {
+ fmt.Fprintf(cli.out, "Http Proxy: %s\n", remoteInfo.Get("HttpProxy"))
+ }
+ if remoteInfo.Exists("HttpsProxy") {
+ fmt.Fprintf(cli.out, "Https Proxy: %s\n", remoteInfo.Get("HttpsProxy"))
+ }
+ if remoteInfo.Exists("NoProxy") {
+ fmt.Fprintf(cli.out, "No Proxy: %s\n", remoteInfo.Get("NoProxy"))
+ }
if len(remoteInfo.GetList("IndexServerAddress")) != 0 {
cli.LoadConfigFile()
u := cli.configFile.Configs[remoteInfo.Get("IndexServerAddress")].Username
@@ -601,8 +685,8 @@ func (cli *DockerCli) CmdInfo(args ...string) error {
}
func (cli *DockerCli) CmdStop(args ...string) error {
- cmd := cli.Subcmd("stop", "CONTAINER [CONTAINER...]", "Stop a running container by sending SIGTERM and then SIGKILL after a grace period", true)
- nSeconds := cmd.Int([]string{"t", "-time"}, 10, "Number of seconds to wait for the container to stop before killing it. Default is 10 seconds.")
+ cmd := cli.Subcmd("stop", "CONTAINER [CONTAINER...]", "Stop a running container by sending SIGTERM and then SIGKILL after a\ngrace period", true)
+ nSeconds := cmd.Int([]string{"t", "-time"}, 10, "Seconds to wait for stop before killing it")
cmd.Require(flag.Min, 1)
utils.ParseFlags(cmd, args, true)
@@ -612,7 +696,7 @@ func (cli *DockerCli) CmdStop(args ...string) error {
var encounteredError error
for _, name := range cmd.Args() {
- _, _, err := readBody(cli.call("POST", "/containers/"+name+"/stop?"+v.Encode(), nil, false))
+ _, _, err := readBody(cli.call("POST", "/containers/"+name+"/stop?"+v.Encode(), nil, nil))
if err != nil {
fmt.Fprintf(cli.err, "%s\n", err)
encounteredError = fmt.Errorf("Error: failed to stop one or more containers")
@@ -625,7 +709,7 @@ func (cli *DockerCli) CmdStop(args ...string) error {
func (cli *DockerCli) CmdRestart(args ...string) error {
cmd := cli.Subcmd("restart", "CONTAINER [CONTAINER...]", "Restart a running container", true)
- nSeconds := cmd.Int([]string{"t", "-time"}, 10, "Number of seconds to try to stop for before killing the container. Once killed it will then be restarted. Default is 10 seconds.")
+ nSeconds := cmd.Int([]string{"t", "-time"}, 10, "Seconds to wait for stop before killing the container")
cmd.Require(flag.Min, 1)
utils.ParseFlags(cmd, args, true)
@@ -635,7 +719,7 @@ func (cli *DockerCli) CmdRestart(args ...string) error {
var encounteredError error
for _, name := range cmd.Args() {
- _, _, err := readBody(cli.call("POST", "/containers/"+name+"/restart?"+v.Encode(), nil, false))
+ _, _, err := readBody(cli.call("POST", "/containers/"+name+"/restart?"+v.Encode(), nil, nil))
if err != nil {
fmt.Fprintf(cli.err, "%s\n", err)
encounteredError = fmt.Errorf("Error: failed to restart one or more containers")
@@ -664,7 +748,7 @@ func (cli *DockerCli) forwardAllSignals(cid string) chan os.Signal {
if sig == "" {
log.Errorf("Unsupported signal: %v. Discarding.", s)
}
- if _, _, err := readBody(cli.call("POST", fmt.Sprintf("/containers/%s/kill?signal=%s", cid, sig), nil, false)); err != nil {
+ if _, _, err := readBody(cli.call("POST", fmt.Sprintf("/containers/%s/kill?signal=%s", cid, sig), nil, nil)); err != nil {
log.Debugf("Error sending signal: %s", err)
}
}
@@ -677,22 +761,20 @@ func (cli *DockerCli) CmdStart(args ...string) error {
cErr chan error
tty bool
- cmd = cli.Subcmd("start", "CONTAINER [CONTAINER...]", "Restart a stopped container", true)
- attach = cmd.Bool([]string{"a", "-attach"}, false, "Attach container's STDOUT and STDERR and forward all signals to the process")
+ cmd = cli.Subcmd("start", "CONTAINER [CONTAINER...]", "Start one or more stopped containers", true)
+ attach = cmd.Bool([]string{"a", "-attach"}, false, "Attach STDOUT/STDERR and forward signals")
openStdin = cmd.Bool([]string{"i", "-interactive"}, false, "Attach container's STDIN")
)
cmd.Require(flag.Min, 1)
utils.ParseFlags(cmd, args, true)
- hijacked := make(chan io.Closer)
-
if *attach || *openStdin {
if cmd.NArg() > 1 {
return fmt.Errorf("You cannot start and attach multiple containers at once.")
}
- stream, _, err := cli.call("GET", "/containers/"+cmd.Arg(0)+"/json", nil, false)
+ stream, _, err := cli.call("GET", "/containers/"+cmd.Arg(0)+"/json", nil, nil)
if err != nil {
return err
}
@@ -722,45 +804,54 @@ func (cli *DockerCli) CmdStart(args ...string) error {
v.Set("stdout", "1")
v.Set("stderr", "1")
+ hijacked := make(chan io.Closer)
+ // Block the return until the chan gets closed
+ defer func() {
+ log.Debugf("CmdStart() returned, defer waiting for hijack to finish.")
+ if _, ok := <-hijacked; ok {
+ log.Errorf("Hijack did not finish (chan still open)")
+ }
+ cli.in.Close()
+ }()
cErr = promise.Go(func() error {
return cli.hijack("POST", "/containers/"+cmd.Arg(0)+"/attach?"+v.Encode(), tty, in, cli.out, cli.err, hijacked, nil)
})
- } else {
- close(hijacked)
- }
- // Acknowledge the hijack before starting
- select {
- case closer := <-hijacked:
- // Make sure that the hijack gets closed when returning (results
- // in closing the hijack chan and freeing server's goroutines)
- if closer != nil {
- defer closer.Close()
- }
- case err := <-cErr:
- if err != nil {
- return err
+ // Acknowledge the hijack before starting
+ select {
+ case closer := <-hijacked:
+ // Make sure that the hijack gets closed when returning (results
+ // in closing the hijack chan and freeing server's goroutines)
+ if closer != nil {
+ defer closer.Close()
+ }
+ case err := <-cErr:
+ if err != nil {
+ return err
+ }
}
}
var encounteredError error
for _, name := range cmd.Args() {
- _, _, err := readBody(cli.call("POST", "/containers/"+name+"/start", nil, false))
+ _, _, err := readBody(cli.call("POST", "/containers/"+name+"/start", nil, nil))
if err != nil {
if !*attach && !*openStdin {
+ // attach and openStdin is false means it could be starting multiple containers
+ // when a container start failed, show the error message and start next
fmt.Fprintf(cli.err, "%s\n", err)
+ encounteredError = fmt.Errorf("Error: failed to start one or more containers")
+ } else {
+ encounteredError = err
}
- encounteredError = fmt.Errorf("Error: failed to start one or more containers")
} else {
if !*attach && !*openStdin {
fmt.Fprintf(cli.out, "%s\n", name)
}
}
}
+
if encounteredError != nil {
- if *openStdin || *attach {
- cli.in.Close()
- }
return encounteredError
}
@@ -785,13 +876,13 @@ func (cli *DockerCli) CmdStart(args ...string) error {
}
func (cli *DockerCli) CmdUnpause(args ...string) error {
- cmd := cli.Subcmd("unpause", "CONTAINER", "Unpause all processes within a container", true)
- cmd.Require(flag.Exact, 1)
+ cmd := cli.Subcmd("unpause", "CONTAINER [CONTAINER...]", "Unpause all processes within a container", true)
+ cmd.Require(flag.Min, 1)
utils.ParseFlags(cmd, args, false)
var encounteredError error
for _, name := range cmd.Args() {
- if _, _, err := readBody(cli.call("POST", fmt.Sprintf("/containers/%s/unpause", name), nil, false)); err != nil {
+ if _, _, err := readBody(cli.call("POST", fmt.Sprintf("/containers/%s/unpause", name), nil, nil)); err != nil {
fmt.Fprintf(cli.err, "%s\n", err)
encounteredError = fmt.Errorf("Error: failed to unpause container named %s", name)
} else {
@@ -802,13 +893,13 @@ func (cli *DockerCli) CmdUnpause(args ...string) error {
}
func (cli *DockerCli) CmdPause(args ...string) error {
- cmd := cli.Subcmd("pause", "CONTAINER", "Pause all processes within a container", true)
- cmd.Require(flag.Exact, 1)
+ cmd := cli.Subcmd("pause", "CONTAINER [CONTAINER...]", "Pause all processes within a container", true)
+ cmd.Require(flag.Min, 1)
utils.ParseFlags(cmd, args, false)
var encounteredError error
for _, name := range cmd.Args() {
- if _, _, err := readBody(cli.call("POST", fmt.Sprintf("/containers/%s/pause", name), nil, false)); err != nil {
+ if _, _, err := readBody(cli.call("POST", fmt.Sprintf("/containers/%s/pause", name), nil, nil)); err != nil {
fmt.Fprintf(cli.err, "%s\n", err)
encounteredError = fmt.Errorf("Error: failed to pause container named %s", name)
} else {
@@ -831,7 +922,7 @@ func (cli *DockerCli) CmdRename(args ...string) error {
old_name := cmd.Arg(0)
new_name := cmd.Arg(1)
- if _, _, err := readBody(cli.call("POST", fmt.Sprintf("/containers/%s/rename?name=%s", old_name, new_name), nil, false)); err != nil {
+ if _, _, err := readBody(cli.call("POST", fmt.Sprintf("/containers/%s/rename?name=%s", old_name, new_name), nil, nil)); err != nil {
fmt.Fprintf(cli.err, "%s\n", err)
return fmt.Errorf("Error: failed to rename container named %s", old_name)
}
@@ -840,7 +931,7 @@ func (cli *DockerCli) CmdRename(args ...string) error {
func (cli *DockerCli) CmdInspect(args ...string) error {
cmd := cli.Subcmd("inspect", "CONTAINER|IMAGE [CONTAINER|IMAGE...]", "Return low-level information on a container or image", true)
- tmplStr := cmd.String([]string{"f", "#format", "-format"}, "", "Format the output using the given go template.")
+ tmplStr := cmd.String([]string{"f", "#format", "-format"}, "", "Format the output using the given go template")
cmd.Require(flag.Min, 1)
utils.ParseFlags(cmd, args, true)
@@ -860,9 +951,15 @@ func (cli *DockerCli) CmdInspect(args ...string) error {
status := 0
for _, name := range cmd.Args() {
- obj, _, err := readBody(cli.call("GET", "/containers/"+name+"/json", nil, false))
+ obj, _, err := readBody(cli.call("GET", "/containers/"+name+"/json", nil, nil))
if err != nil {
- obj, _, err = readBody(cli.call("GET", "/images/"+name+"/json", nil, false))
+ if strings.Contains(err.Error(), "Too many") {
+ fmt.Fprintf(cli.err, "Error: %v", err)
+ status = 1
+ continue
+ }
+
+ obj, _, err = readBody(cli.call("GET", "/images/"+name+"/json", nil, nil))
if err != nil {
if strings.Contains(err.Error(), "No such") {
fmt.Fprintf(cli.err, "Error: No such image or container: %s\n", name)
@@ -925,7 +1022,7 @@ func (cli *DockerCli) CmdTop(args ...string) error {
val.Set("ps_args", strings.Join(cmd.Args()[1:], " "))
}
- stream, _, err := cli.call("GET", "/containers/"+cmd.Arg(0)+"/top?"+val.Encode(), nil, false)
+ stream, _, err := cli.call("GET", "/containers/"+cmd.Arg(0)+"/top?"+val.Encode(), nil, nil)
if err != nil {
return err
}
@@ -947,11 +1044,11 @@ func (cli *DockerCli) CmdTop(args ...string) error {
}
func (cli *DockerCli) CmdPort(args ...string) error {
- cmd := cli.Subcmd("port", "CONTAINER [PRIVATE_PORT[/PROTO]]", "List port mappings for the CONTAINER, or lookup the public-facing port that is NAT-ed to the PRIVATE_PORT", true)
+ cmd := cli.Subcmd("port", "CONTAINER [PRIVATE_PORT[/PROTO]]", "List port mappings for the CONTAINER, or lookup the public-facing port that\nis NAT-ed to the PRIVATE_PORT", true)
cmd.Require(flag.Min, 1)
utils.ParseFlags(cmd, args, true)
- stream, _, err := cli.call("GET", "/containers/"+cmd.Arg(0)+"/json", nil, false)
+ stream, _, err := cli.call("GET", "/containers/"+cmd.Arg(0)+"/json", nil, nil)
if err != nil {
return err
}
@@ -1016,7 +1113,7 @@ func (cli *DockerCli) CmdRmi(args ...string) error {
var encounteredError error
for _, name := range cmd.Args() {
- body, _, err := readBody(cli.call("DELETE", "/images/"+name+"?"+v.Encode(), nil, false))
+ body, _, err := readBody(cli.call("DELETE", "/images/"+name+"?"+v.Encode(), nil, nil))
if err != nil {
fmt.Fprintf(cli.err, "%s\n", err)
encounteredError = fmt.Errorf("Error: failed to remove one or more images")
@@ -1047,7 +1144,7 @@ func (cli *DockerCli) CmdHistory(args ...string) error {
utils.ParseFlags(cmd, args, true)
- body, _, err := readBody(cli.call("GET", "/images/"+cmd.Arg(0)+"/history", nil, false))
+ body, _, err := readBody(cli.call("GET", "/images/"+cmd.Arg(0)+"/history", nil, nil))
if err != nil {
return err
}
@@ -1068,7 +1165,7 @@ func (cli *DockerCli) CmdHistory(args ...string) error {
if *noTrunc {
fmt.Fprintf(w, "%s\t", outID)
} else {
- fmt.Fprintf(w, "%s\t", utils.TruncateID(outID))
+ fmt.Fprintf(w, "%s\t", common.TruncateID(outID))
}
fmt.Fprintf(w, "%s ago\t", units.HumanDuration(time.Now().UTC().Sub(time.Unix(out.GetInt64("Created"), 0))))
@@ -1083,7 +1180,7 @@ func (cli *DockerCli) CmdHistory(args ...string) error {
if *noTrunc {
fmt.Fprintln(w, outID)
} else {
- fmt.Fprintln(w, utils.TruncateID(outID))
+ fmt.Fprintln(w, common.TruncateID(outID))
}
}
}
@@ -1094,7 +1191,7 @@ func (cli *DockerCli) CmdHistory(args ...string) error {
func (cli *DockerCli) CmdRm(args ...string) error {
cmd := cli.Subcmd("rm", "CONTAINER [CONTAINER...]", "Remove one or more containers", true)
v := cmd.Bool([]string{"v", "-volumes"}, false, "Remove the volumes associated with the container")
- link := cmd.Bool([]string{"l", "#link", "-link"}, false, "Remove the specified link and not the underlying container")
+ link := cmd.Bool([]string{"l", "#link", "-link"}, false, "Remove the specified link")
force := cmd.Bool([]string{"f", "-force"}, false, "Force the removal of a running container (uses SIGKILL)")
cmd.Require(flag.Min, 1)
@@ -1114,7 +1211,7 @@ func (cli *DockerCli) CmdRm(args ...string) error {
var encounteredError error
for _, name := range cmd.Args() {
- _, _, err := readBody(cli.call("DELETE", "/containers/"+name+"?"+val.Encode(), nil, false))
+ _, _, err := readBody(cli.call("DELETE", "/containers/"+name+"?"+val.Encode(), nil, nil))
if err != nil {
fmt.Fprintf(cli.err, "%s\n", err)
encounteredError = fmt.Errorf("Error: failed to remove one or more containers")
@@ -1135,7 +1232,7 @@ func (cli *DockerCli) CmdKill(args ...string) error {
var encounteredError error
for _, name := range cmd.Args() {
- if _, _, err := readBody(cli.call("POST", fmt.Sprintf("/containers/%s/kill?signal=%s", name, *signal), nil, false)); err != nil {
+ if _, _, err := readBody(cli.call("POST", fmt.Sprintf("/containers/%s/kill?signal=%s", name, *signal), nil, nil)); err != nil {
fmt.Fprintf(cli.err, "%s\n", err)
encounteredError = fmt.Errorf("Error: failed to kill one or more containers")
} else {
@@ -1146,7 +1243,9 @@ func (cli *DockerCli) CmdKill(args ...string) error {
}
func (cli *DockerCli) CmdImport(args ...string) error {
- cmd := cli.Subcmd("import", "URL|- [REPOSITORY[:TAG]]", "Create an empty filesystem image and import the contents of the tarball (.tar, .tar.gz, .tgz, .bzip, .tar.xz, .txz) into it, then optionally tag it.", true)
+ cmd := cli.Subcmd("import", "URL|- [REPOSITORY[:TAG]]", "Create an empty filesystem image and import the contents of the\ntarball (.tar, .tar.gz, .tgz, .bzip, .tar.xz, .txz) into it, then\noptionally tag it.", true)
+ flChanges := opts.NewListOpts(nil)
+ cmd.Var(&flChanges, []string{"c", "-change"}, "Apply Dockerfile instruction to the created image")
cmd.Require(flag.Min, 1)
utils.ParseFlags(cmd, args, true)
@@ -1159,7 +1258,9 @@ func (cli *DockerCli) CmdImport(args ...string) error {
v.Set("fromSrc", src)
v.Set("repo", repository)
-
+ for _, change := range flChanges.GetAll() {
+ v.Add("changes", change)
+ }
if cmd.NArg() == 3 {
fmt.Fprintf(cli.err, "[DEPRECATED] The format 'URL|- [REPOSITORY [TAG]]' has been deprecated. Please use URL|- [REPOSITORY[:TAG]]\n")
v.Set("tag", cmd.Arg(2))
@@ -1216,36 +1317,12 @@ func (cli *DockerCli) CmdPush(args ...string) error {
v := url.Values{}
v.Set("tag", tag)
- push := func(authConfig registry.AuthConfig) error {
- buf, err := json.Marshal(authConfig)
- if err != nil {
- return err
- }
- registryAuthHeader := []string{
- base64.URLEncoding.EncodeToString(buf),
- }
-
- return cli.stream("POST", "/images/"+remote+"/push?"+v.Encode(), nil, cli.out, map[string][]string{
- "X-Registry-Auth": registryAuthHeader,
- })
- }
-
- if err := push(authConfig); err != nil {
- if strings.Contains(err.Error(), "Status 401") {
- fmt.Fprintln(cli.out, "\nPlease login prior to push:")
- if err := cli.CmdLogin(repoInfo.Index.GetAuthConfigKey()); err != nil {
- return err
- }
- authConfig := cli.configFile.ResolveAuthConfig(repoInfo.Index)
- return push(authConfig)
- }
- return err
- }
- return nil
+ _, _, err = cli.clientRequestAttemptLogin("POST", "/images/"+remote+"/push?"+v.Encode(), nil, cli.out, repoInfo.Index, "push")
+ return err
}
func (cli *DockerCli) CmdPull(args ...string) error {
- cmd := cli.Subcmd("pull", "NAME[:TAG]", "Pull an image or a repository from the registry", true)
+ cmd := cli.Subcmd("pull", "NAME[:TAG|@DIGEST]", "Pull an image or a repository from the registry", true)
allTags := cmd.Bool([]string{"a", "-all-tags"}, false, "Download all tagged images in the repository")
cmd.Require(flag.Exact, 1)
@@ -1258,7 +1335,7 @@ func (cli *DockerCli) CmdPull(args ...string) error {
)
taglessRemote, tag := parsers.ParseRepositoryTag(remote)
if tag == "" && !*allTags {
- newRemote = taglessRemote + ":" + graph.DEFAULTTAG
+ newRemote = utils.ImageReference(taglessRemote, graph.DEFAULTTAG)
}
if tag != "" && *allTags {
return fmt.Errorf("tag can't be used with --all-tags/-a")
@@ -1274,49 +1351,22 @@ func (cli *DockerCli) CmdPull(args ...string) error {
cli.LoadConfigFile()
- // Resolve the Auth config relevant for this server
- authConfig := cli.configFile.ResolveAuthConfig(repoInfo.Index)
-
- pull := func(authConfig registry.AuthConfig) error {
- buf, err := json.Marshal(authConfig)
- if err != nil {
- return err
- }
- registryAuthHeader := []string{
- base64.URLEncoding.EncodeToString(buf),
- }
-
- return cli.stream("POST", "/images/create?"+v.Encode(), nil, cli.out, map[string][]string{
- "X-Registry-Auth": registryAuthHeader,
- })
- }
-
- if err := pull(authConfig); err != nil {
- if strings.Contains(err.Error(), "Status 401") {
- fmt.Fprintln(cli.out, "\nPlease login prior to pull:")
- if err := cli.CmdLogin(repoInfo.Index.GetAuthConfigKey()); err != nil {
- return err
- }
- authConfig := cli.configFile.ResolveAuthConfig(repoInfo.Index)
- return pull(authConfig)
- }
- return err
- }
-
- return nil
+ _, _, err = cli.clientRequestAttemptLogin("POST", "/images/create?"+v.Encode(), nil, cli.out, repoInfo.Index, "pull")
+ return err
}
func (cli *DockerCli) CmdImages(args ...string) error {
cmd := cli.Subcmd("images", "[REPOSITORY]", "List images", true)
quiet := cmd.Bool([]string{"q", "-quiet"}, false, "Only show numeric IDs")
- all := cmd.Bool([]string{"a", "-all"}, false, "Show all images (by default filter out the intermediate image layers)")
+ all := cmd.Bool([]string{"a", "-all"}, false, "Show all images (default hides intermediate images)")
noTrunc := cmd.Bool([]string{"#notrunc", "-no-trunc"}, false, "Don't truncate output")
+ showDigests := cmd.Bool([]string{"-digests"}, false, "Show digests")
// FIXME: --viz and --tree are deprecated. Remove them in a future version.
flViz := cmd.Bool([]string{"#v", "#viz", "#-viz"}, false, "Output graph in graphviz format")
flTree := cmd.Bool([]string{"#t", "#tree", "#-tree"}, false, "Output graph in tree format")
flFilter := opts.NewListOpts(nil)
- cmd.Var(&flFilter, []string{"f", "-filter"}, "Provide filter values (i.e., 'dangling=true')")
+ cmd.Var(&flFilter, []string{"f", "-filter"}, "Filter output based on conditions provided")
cmd.Require(flag.Max, 1)
utils.ParseFlags(cmd, args, true)
@@ -1346,7 +1396,7 @@ func (cli *DockerCli) CmdImages(args ...string) error {
v.Set("filters", filterJson)
}
- body, _, err := readBody(cli.call("GET", "/images/json?"+v.Encode(), nil, false))
+ body, _, err := readBody(cli.call("GET", "/images/json?"+v.Encode(), nil, nil))
if err != nil {
return err
}
@@ -1377,7 +1427,7 @@ func (cli *DockerCli) CmdImages(args ...string) error {
}
if matchName != "" {
- if matchName == image.Get("Id") || matchName == utils.TruncateID(image.Get("Id")) {
+ if matchName == image.Get("Id") || matchName == common.TruncateID(image.Get("Id")) {
startImage = image
}
@@ -1424,7 +1474,7 @@ func (cli *DockerCli) CmdImages(args ...string) error {
v.Set("all", "1")
}
- body, _, err := readBody(cli.call("GET", "/images/json?"+v.Encode(), nil, false))
+ body, _, err := readBody(cli.call("GET", "/images/json?"+v.Encode(), nil, nil))
if err != nil {
return err
@@ -1437,20 +1487,46 @@ func (cli *DockerCli) CmdImages(args ...string) error {
w := tabwriter.NewWriter(cli.out, 20, 1, 3, ' ', 0)
if !*quiet {
- fmt.Fprintln(w, "REPOSITORY\tTAG\tIMAGE ID\tCREATED\tVIRTUAL SIZE")
+ if *showDigests {
+ fmt.Fprintln(w, "REPOSITORY\tTAG\tDIGEST\tIMAGE ID\tCREATED\tVIRTUAL SIZE")
+ } else {
+ fmt.Fprintln(w, "REPOSITORY\tTAG\tIMAGE ID\tCREATED\tVIRTUAL SIZE")
+ }
}
for _, out := range outs.Data {
- for _, repotag := range out.GetList("RepoTags") {
+ outID := out.Get("Id")
+ if !*noTrunc {
+ outID = common.TruncateID(outID)
+ }
+
+ repoTags := out.GetList("RepoTags")
+ repoDigests := out.GetList("RepoDigests")
+
+ if len(repoTags) == 1 && repoTags[0] == "<none>:<none>" && len(repoDigests) == 1 && repoDigests[0] == "<none>@<none>" {
+ // dangling image - clear out either repoTags or repoDigsts so we only show it once below
+ repoDigests = []string{}
+ }
- repo, tag := parsers.ParseRepositoryTag(repotag)
- outID := out.Get("Id")
- if !*noTrunc {
- outID = utils.TruncateID(outID)
+ // combine the tags and digests lists
+ tagsAndDigests := append(repoTags, repoDigests...)
+ for _, repoAndRef := range tagsAndDigests {
+ repo, ref := parsers.ParseRepositoryTag(repoAndRef)
+ // default tag and digest to none - if there's a value, it'll be set below
+ tag := "<none>"
+ digest := "<none>"
+ if utils.DigestReference(ref) {
+ digest = ref
+ } else {
+ tag = ref
}
if !*quiet {
- fmt.Fprintf(w, "%s\t%s\t%s\t%s ago\t%s\n", repo, tag, outID, units.HumanDuration(time.Now().UTC().Sub(time.Unix(out.GetInt64("Created"), 0))), units.HumanSize(float64(out.GetInt64("VirtualSize"))))
+ if *showDigests {
+ fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%s ago\t%s\n", repo, tag, digest, outID, units.HumanDuration(time.Now().UTC().Sub(time.Unix(out.GetInt64("Created"), 0))), units.HumanSize(float64(out.GetInt64("VirtualSize"))))
+ } else {
+ fmt.Fprintf(w, "%s\t%s\t%s\t%s ago\t%s\n", repo, tag, outID, units.HumanDuration(time.Now().UTC().Sub(time.Unix(out.GetInt64("Created"), 0))), units.HumanSize(float64(out.GetInt64("VirtualSize"))))
+ }
} else {
fmt.Fprintln(w, outID)
}
@@ -1501,8 +1577,8 @@ func (cli *DockerCli) printVizNode(noTrunc bool, image *engine.Env, prefix strin
imageID = image.Get("Id")
parentID = image.Get("ParentId")
} else {
- imageID = utils.TruncateID(image.Get("Id"))
- parentID = utils.TruncateID(image.Get("ParentId"))
+ imageID = common.TruncateID(image.Get("Id"))
+ parentID = common.TruncateID(image.Get("ParentId"))
}
if parentID == "" {
fmt.Fprintf(cli.out, " base -> \"%s\" [style=invis]\n", imageID)
@@ -1521,7 +1597,7 @@ func (cli *DockerCli) printTreeNode(noTrunc bool, image *engine.Env, prefix stri
if noTrunc {
imageID = image.Get("Id")
} else {
- imageID = utils.TruncateID(image.Get("Id"))
+ imageID = common.TruncateID(image.Get("Id"))
}
fmt.Fprintf(cli.out, "%s%s Virtual Size: %s", prefix, imageID, units.HumanSize(float64(image.GetInt64("VirtualSize"))))
@@ -1542,17 +1618,17 @@ func (cli *DockerCli) CmdPs(args ...string) error {
cmd = cli.Subcmd("ps", "", "List containers", true)
quiet = cmd.Bool([]string{"q", "-quiet"}, false, "Only display numeric IDs")
size = cmd.Bool([]string{"s", "-size"}, false, "Display total file sizes")
- all = cmd.Bool([]string{"a", "-all"}, false, "Show all containers. Only running containers are shown by default.")
+ all = cmd.Bool([]string{"a", "-all"}, false, "Show all containers (default shows just running)")
noTrunc = cmd.Bool([]string{"#notrunc", "-no-trunc"}, false, "Don't truncate output")
- nLatest = cmd.Bool([]string{"l", "-latest"}, false, "Show only the latest created container, include non-running ones.")
- since = cmd.String([]string{"#sinceId", "#-since-id", "-since"}, "", "Show only containers created since Id or Name, include non-running ones.")
- before = cmd.String([]string{"#beforeId", "#-before-id", "-before"}, "", "Show only container created before Id or Name, include non-running ones.")
- last = cmd.Int([]string{"n"}, -1, "Show n last created containers, include non-running ones.")
+ nLatest = cmd.Bool([]string{"l", "-latest"}, false, "Show the latest created container, include non-running")
+ since = cmd.String([]string{"#sinceId", "#-since-id", "-since"}, "", "Show created since Id or Name, include non-running")
+ before = cmd.String([]string{"#beforeId", "#-before-id", "-before"}, "", "Show only container created before Id or Name")
+ last = cmd.Int([]string{"n"}, -1, "Show n last created containers, include non-running")
flFilter = opts.NewListOpts(nil)
)
cmd.Require(flag.Exact, 0)
- cmd.Var(&flFilter, []string{"f", "-filter"}, "Provide filter values. Valid filters:\nexited=<int> - containers with exit code of <int>\nstatus=(restarting|running|paused|exited)")
+ cmd.Var(&flFilter, []string{"f", "-filter"}, "Filter output based on conditions provided")
utils.ParseFlags(cmd, args, true)
if *last == -1 && *nLatest {
@@ -1596,7 +1672,7 @@ func (cli *DockerCli) CmdPs(args ...string) error {
v.Set("filters", filterJson)
}
- body, _, err := readBody(cli.call("GET", "/containers/json?"+v.Encode(), nil, false))
+ body, _, err := readBody(cli.call("GET", "/containers/json?"+v.Encode(), nil, nil))
if err != nil {
return err
}
@@ -1629,7 +1705,7 @@ func (cli *DockerCli) CmdPs(args ...string) error {
outID := out.Get("Id")
if !*noTrunc {
- outID = utils.TruncateID(outID)
+ outID = common.TruncateID(outID)
}
if *quiet {
@@ -1693,6 +1769,8 @@ func (cli *DockerCli) CmdCommit(args ...string) error {
flPause := cmd.Bool([]string{"p", "-pause"}, true, "Pause container during commit")
flComment := cmd.String([]string{"m", "-message"}, "", "Commit message")
flAuthor := cmd.String([]string{"a", "#author", "-author"}, "", "Author (e.g., \"John Hannibal Smith <hannibal@a-team.com>\")")
+ flChanges := opts.NewListOpts(nil)
+ cmd.Var(&flChanges, []string{"c", "-change"}, "Apply Dockerfile instruction to the created image")
// FIXME: --run is deprecated, it will be replaced with inline Dockerfile commands.
flConfig := cmd.String([]string{"#run", "#-run"}, "", "This option is deprecated and will be removed in a future version in favor of inline Dockerfile-compatible commands")
cmd.Require(flag.Max, 2)
@@ -1717,6 +1795,9 @@ func (cli *DockerCli) CmdCommit(args ...string) error {
v.Set("tag", tag)
v.Set("comment", *flComment)
v.Set("author", *flAuthor)
+ for _, change := range flChanges.GetAll() {
+ v.Add("changes", change)
+ }
if *flPause != true {
v.Set("pause", "0")
@@ -1732,7 +1813,7 @@ func (cli *DockerCli) CmdCommit(args ...string) error {
return err
}
}
- stream, _, err := cli.call("POST", "/commit?"+v.Encode(), config, false)
+ stream, _, err := cli.call("POST", "/commit?"+v.Encode(), config, nil)
if err != nil {
return err
}
@@ -1749,7 +1830,7 @@ func (cli *DockerCli) CmdEvents(args ...string) error {
since := cmd.String([]string{"#since", "-since"}, "", "Show all events created since timestamp")
until := cmd.String([]string{"-until"}, "", "Stream events until this timestamp")
flFilter := opts.NewListOpts(nil)
- cmd.Var(&flFilter, []string{"f", "-filter"}, "Provide filter values (i.e., 'event=stop')")
+ cmd.Var(&flFilter, []string{"f", "-filter"}, "Filter output based on conditions provided")
cmd.Require(flag.Exact, 0)
utils.ParseFlags(cmd, args, true)
@@ -1800,14 +1881,40 @@ func (cli *DockerCli) CmdEvents(args ...string) error {
}
func (cli *DockerCli) CmdExport(args ...string) error {
- cmd := cli.Subcmd("export", "CONTAINER", "Export the contents of a filesystem as a tar archive to STDOUT", true)
+ cmd := cli.Subcmd("export", "CONTAINER", "Export a filesystem as a tar archive (streamed to STDOUT by default)", true)
+ outfile := cmd.String([]string{"o", "-output"}, "", "Write to a file, instead of STDOUT")
cmd.Require(flag.Exact, 1)
utils.ParseFlags(cmd, args, true)
- if err := cli.stream("GET", "/containers/"+cmd.Arg(0)+"/export", nil, cli.out, nil); err != nil {
- return err
+ var (
+ output io.Writer = cli.out
+ err error
+ )
+ if *outfile != "" {
+ output, err = os.Create(*outfile)
+ if err != nil {
+ return err
+ }
+ } else if cli.isTerminalOut {
+ return errors.New("Cowardly refusing to save to a terminal. Use the -o flag or redirect.")
+ }
+
+ if len(cmd.Args()) == 1 {
+ image := cmd.Arg(0)
+ if err := cli.stream("GET", "/containers/"+image+"/export", nil, output, nil); err != nil {
+ return err
+ }
+ } else {
+ v := url.Values{}
+ for _, arg := range cmd.Args() {
+ v.Add("names", arg)
+ }
+ if err := cli.stream("GET", "/containers/get?"+v.Encode(), nil, output, nil); err != nil {
+ return err
+ }
}
+
return nil
}
@@ -1817,7 +1924,7 @@ func (cli *DockerCli) CmdDiff(args ...string) error {
utils.ParseFlags(cmd, args, true)
- body, _, err := readBody(cli.call("GET", "/containers/"+cmd.Arg(0)+"/changes", nil, false))
+ body, _, err := readBody(cli.call("GET", "/containers/"+cmd.Arg(0)+"/changes", nil, nil))
if err != nil {
return err
@@ -1847,7 +1954,7 @@ func (cli *DockerCli) CmdLogs(args ...string) error {
cmd = cli.Subcmd("logs", "CONTAINER", "Fetch the logs of a container", true)
follow = cmd.Bool([]string{"f", "-follow"}, false, "Follow log output")
times = cmd.Bool([]string{"t", "-timestamps"}, false, "Show timestamps")
- tail = cmd.String([]string{"-tail"}, "all", "Output the specified number of lines at the end of logs (defaults to all logs)")
+ tail = cmd.String([]string{"-tail"}, "all", "Number of lines to show from the end of the logs")
)
cmd.Require(flag.Exact, 1)
@@ -1855,7 +1962,7 @@ func (cli *DockerCli) CmdLogs(args ...string) error {
name := cmd.Arg(0)
- stream, _, err := cli.call("GET", "/containers/"+name+"/json", nil, false)
+ stream, _, err := cli.call("GET", "/containers/"+name+"/json", nil, nil)
if err != nil {
return err
}
@@ -1865,6 +1972,10 @@ func (cli *DockerCli) CmdLogs(args ...string) error {
return err
}
+ if env.GetSubEnv("HostConfig").GetSubEnv("LogConfig").Get("Type") != "json-file" {
+ return fmt.Errorf("\"logs\" command is supported only for \"json-file\" logging driver")
+ }
+
v := url.Values{}
v.Set("stdout", "1")
v.Set("stderr", "1")
@@ -1885,14 +1996,14 @@ func (cli *DockerCli) CmdAttach(args ...string) error {
var (
cmd = cli.Subcmd("attach", "CONTAINER", "Attach to a running container", true)
noStdin = cmd.Bool([]string{"#nostdin", "-no-stdin"}, false, "Do not attach STDIN")
- proxy = cmd.Bool([]string{"#sig-proxy", "-sig-proxy"}, true, "Proxy all received signals to the process (non-TTY mode only). SIGCHLD, SIGKILL, and SIGSTOP are not proxied.")
+ proxy = cmd.Bool([]string{"#sig-proxy", "-sig-proxy"}, true, "Proxy all received signals to the process")
)
cmd.Require(flag.Exact, 1)
utils.ParseFlags(cmd, args, true)
name := cmd.Arg(0)
- stream, _, err := cli.call("GET", "/containers/"+name+"/json", nil, false)
+ stream, _, err := cli.call("GET", "/containers/"+name+"/json", nil, nil)
if err != nil {
return err
}
@@ -1963,16 +2074,27 @@ func (cli *DockerCli) CmdSearch(args ...string) error {
utils.ParseFlags(cmd, args, true)
+ name := cmd.Arg(0)
v := url.Values{}
- v.Set("term", cmd.Arg(0))
+ v.Set("term", name)
- body, _, err := readBody(cli.call("GET", "/images/search?"+v.Encode(), nil, true))
+ // Resolve the Repository name from fqn to hostname + name
+ taglessRemote, _ := parsers.ParseRepositoryTag(name)
+ repoInfo, err := registry.ParseRepositoryInfo(taglessRemote)
+ if err != nil {
+ return err
+ }
+
+ cli.LoadConfigFile()
+ body, statusCode, errReq := cli.clientRequestAttemptLogin("GET", "/images/search?"+v.Encode(), nil, nil, repoInfo.Index, "search")
+ rawBody, _, err := readBody(body, statusCode, errReq)
if err != nil {
return err
}
+
outs := engine.NewTable("star_count", 0)
- if _, err := outs.ReadListFrom(body); err != nil {
+ if _, err := outs.ReadListFrom(rawBody); err != nil {
return err
}
w := tabwriter.NewWriter(cli.out, 10, 1, 3, ' ', 0)
@@ -2027,7 +2149,7 @@ func (cli *DockerCli) CmdTag(args ...string) error {
v.Set("force", "1")
}
- if _, _, err := readBody(cli.call("POST", "/images/"+cmd.Arg(0)+"/tag?"+v.Encode(), nil, false)); err != nil {
+ if _, _, err := readBody(cli.call("POST", "/images/"+cmd.Arg(0)+"/tag?"+v.Encode(), nil, nil)); err != nil {
return err
}
return nil
@@ -2111,7 +2233,7 @@ func (cid *cidFile) Write(id string) error {
return nil
}
-func (cli *DockerCli) createContainer(config *runconfig.Config, hostConfig *runconfig.HostConfig, cidfile, name string) (engine.Env, error) {
+func (cli *DockerCli) createContainer(config *runconfig.Config, hostConfig *runconfig.HostConfig, cidfile, name string) (*types.ContainerCreateResponse, error) {
containerValues := url.Values{}
if name != "" {
containerValues.Set("name", name)
@@ -2129,44 +2251,40 @@ func (cli *DockerCli) createContainer(config *runconfig.Config, hostConfig *runc
}
//create the container
- stream, statusCode, err := cli.call("POST", "/containers/create?"+containerValues.Encode(), mergedConfig, false)
+ stream, statusCode, err := cli.call("POST", "/containers/create?"+containerValues.Encode(), mergedConfig, nil)
//if image not found try to pull it
if statusCode == 404 {
repo, tag := parsers.ParseRepositoryTag(config.Image)
if tag == "" {
tag = graph.DEFAULTTAG
}
- fmt.Fprintf(cli.err, "Unable to find image '%s:%s' locally\n", repo, tag)
+ fmt.Fprintf(cli.err, "Unable to find image '%s' locally\n", utils.ImageReference(repo, tag))
// we don't want to write to stdout anything apart from container.ID
if err = cli.pullImageCustomOut(config.Image, cli.err); err != nil {
return nil, err
}
// Retry
- if stream, _, err = cli.call("POST", "/containers/create?"+containerValues.Encode(), mergedConfig, false); err != nil {
+ if stream, _, err = cli.call("POST", "/containers/create?"+containerValues.Encode(), mergedConfig, nil); err != nil {
return nil, err
}
} else if err != nil {
return nil, err
}
- var result engine.Env
- if err := result.Decode(stream); err != nil {
+ var response types.ContainerCreateResponse
+ if err := json.NewDecoder(stream).Decode(&response); err != nil {
return nil, err
}
-
- for _, warning := range result.GetList("Warnings") {
+ for _, warning := range response.Warnings {
fmt.Fprintf(cli.err, "WARNING: %s\n", warning)
}
-
if containerIDFile != nil {
- if err = containerIDFile.Write(result.Get("Id")); err != nil {
+ if err = containerIDFile.Write(response.ID); err != nil {
return nil, err
}
}
-
- return result, nil
-
+ return &response, nil
}
func (cli *DockerCli) CmdCreate(args ...string) error {
@@ -2185,14 +2303,11 @@ func (cli *DockerCli) CmdCreate(args ...string) error {
cmd.Usage()
return nil
}
-
- createResult, err := cli.createContainer(config, hostConfig, hostConfig.ContainerIDFile, *flName)
+ response, err := cli.createContainer(config, hostConfig, hostConfig.ContainerIDFile, *flName)
if err != nil {
return err
}
-
- fmt.Fprintf(cli.out, "%s\n", createResult.Get("Id"))
-
+ fmt.Fprintf(cli.out, "%s\n", response.ID)
return nil
}
@@ -2202,9 +2317,9 @@ func (cli *DockerCli) CmdRun(args ...string) error {
// These are flags not stored in Config/HostConfig
var (
- flAutoRemove = cmd.Bool([]string{"#rm", "-rm"}, false, "Automatically remove the container when it exits (incompatible with -d)")
- flDetach = cmd.Bool([]string{"d", "-detach"}, false, "Detached mode: run the container in the background and print the new container ID")
- flSigProxy = cmd.Bool([]string{"#sig-proxy", "-sig-proxy"}, true, "Proxy received signals to the process (non-TTY mode only). SIGCHLD, SIGSTOP, and SIGKILL are not proxied.")
+ flAutoRemove = cmd.Bool([]string{"#rm", "-rm"}, false, "Automatically remove the container when it exits")
+ flDetach = cmd.Bool([]string{"d", "-detach"}, false, "Run container in background and print container ID")
+ flSigProxy = cmd.Bool([]string{"#sig-proxy", "-sig-proxy"}, true, "Proxy received signals to the process")
flName = cmd.String([]string{"#name", "-name"}, "", "Assign a name to the container")
flAttach *opts.ListOpts
@@ -2218,6 +2333,18 @@ func (cli *DockerCli) CmdRun(args ...string) error {
if err != nil {
utils.ReportError(cmd, err.Error(), true)
}
+
+ if len(hostConfig.Dns) > 0 {
+ // check the DNS settings passed via --dns against
+ // localhost regexp to warn if they are trying to
+ // set a DNS to a localhost address
+ for _, dnsIP := range hostConfig.Dns {
+ if resolvconf.IsLocalhost(dnsIP) {
+ fmt.Fprintf(cli.err, "WARNING: Localhost DNS setting (--dns=%s) may fail in containers.\n", dnsIP)
+ break
+ }
+ }
+ }
if config.Image == "" {
cmd.Usage()
return nil
@@ -2228,7 +2355,7 @@ func (cli *DockerCli) CmdRun(args ...string) error {
return err
}
} else {
- if fl := cmd.Lookup("attach"); fl != nil {
+ if fl := cmd.Lookup("-attach"); fl != nil {
flAttach = fl.Value.(*opts.ListOpts)
if flAttach.Len() != 0 {
return ErrConflictAttachDetach
@@ -2250,38 +2377,32 @@ func (cli *DockerCli) CmdRun(args ...string) error {
sigProxy = false
}
- runResult, err := cli.createContainer(config, hostConfig, hostConfig.ContainerIDFile, *flName)
+ createResponse, err := cli.createContainer(config, hostConfig, hostConfig.ContainerIDFile, *flName)
if err != nil {
return err
}
-
if sigProxy {
- sigc := cli.forwardAllSignals(runResult.Get("Id"))
+ sigc := cli.forwardAllSignals(createResponse.ID)
defer signal.StopCatch(sigc)
}
-
var (
waitDisplayId chan struct{}
errCh chan error
)
-
if !config.AttachStdout && !config.AttachStderr {
// Make this asynchronous to allow the client to write to stdin before having to read the ID
waitDisplayId = make(chan struct{})
go func() {
defer close(waitDisplayId)
- fmt.Fprintf(cli.out, "%s\n", runResult.Get("Id"))
+ fmt.Fprintf(cli.out, "%s\n", createResponse.ID)
}()
}
-
if *flAutoRemove && (hostConfig.RestartPolicy.Name == "always" || hostConfig.RestartPolicy.Name == "on-failure") {
return ErrConflictRestartPolicyAndAutoRemove
}
-
// We need to instantiate the chan because the select needs it. It can
// be closed but can't be uninitialized.
hijacked := make(chan io.Closer)
-
// Block the return until the chan gets closed
defer func() {
log.Debugf("End of CmdRun(), Waiting for hijack to finish.")
@@ -2289,7 +2410,6 @@ func (cli *DockerCli) CmdRun(args ...string) error {
log.Errorf("Hijack did not finish (chan still open)")
}
}()
-
if config.AttachStdin || config.AttachStdout || config.AttachStderr {
var (
out, stderr io.Writer
@@ -2297,7 +2417,6 @@ func (cli *DockerCli) CmdRun(args ...string) error {
v = url.Values{}
)
v.Set("stream", "1")
-
if config.AttachStdin {
v.Set("stdin", "1")
in = cli.in
@@ -2314,14 +2433,12 @@ func (cli *DockerCli) CmdRun(args ...string) error {
stderr = cli.err
}
}
-
errCh = promise.Go(func() error {
- return cli.hijack("POST", "/containers/"+runResult.Get("Id")+"/attach?"+v.Encode(), config.Tty, in, out, stderr, hijacked, nil)
+ return cli.hijack("POST", "/containers/"+createResponse.ID+"/attach?"+v.Encode(), config.Tty, in, out, stderr, hijacked, nil)
})
} else {
close(hijacked)
}
-
// Acknowledge the hijack before starting
select {
case closer := <-hijacked:
@@ -2338,12 +2455,12 @@ func (cli *DockerCli) CmdRun(args ...string) error {
}
//start the container
- if _, _, err = readBody(cli.call("POST", "/containers/"+runResult.Get("Id")+"/start", nil, false)); err != nil {
+ if _, _, err = readBody(cli.call("POST", "/containers/"+createResponse.ID+"/start", nil, nil)); err != nil {
return err
}
if (config.AttachStdin || config.AttachStdout || config.AttachStderr) && config.Tty && cli.isTerminalOut {
- if err := cli.monitorTtySize(runResult.Get("Id"), false); err != nil {
+ if err := cli.monitorTtySize(createResponse.ID, false); err != nil {
log.Errorf("Error monitoring TTY size: %s", err)
}
}
@@ -2368,26 +2485,26 @@ func (cli *DockerCli) CmdRun(args ...string) error {
if *flAutoRemove {
// Autoremove: wait for the container to finish, retrieve
// the exit code and remove the container
- if _, _, err := readBody(cli.call("POST", "/containers/"+runResult.Get("Id")+"/wait", nil, false)); err != nil {
+ if _, _, err := readBody(cli.call("POST", "/containers/"+createResponse.ID+"/wait", nil, nil)); err != nil {
return err
}
- if _, status, err = getExitCode(cli, runResult.Get("Id")); err != nil {
+ if _, status, err = getExitCode(cli, createResponse.ID); err != nil {
return err
}
- if _, _, err := readBody(cli.call("DELETE", "/containers/"+runResult.Get("Id")+"?v=1", nil, false)); err != nil {
+ if _, _, err := readBody(cli.call("DELETE", "/containers/"+createResponse.ID+"?v=1", nil, nil)); err != nil {
return err
}
} else {
// No Autoremove: Simply retrieve the exit code
if !config.Tty {
// In non-TTY mode, we can't detach, so we must wait for container exit
- if status, err = waitForExit(cli, runResult.Get("Id")); err != nil {
+ if status, err = waitForExit(cli, createResponse.ID); err != nil {
return err
}
} else {
// In TTY mode, there is a race: if the process dies too slowly, the state could
// be updated after the getExitCode call and result in the wrong exit code being reported
- if _, status, err = getExitCode(cli, runResult.Get("Id")); err != nil {
+ if _, status, err = getExitCode(cli, createResponse.ID); err != nil {
return err
}
}
@@ -2399,7 +2516,7 @@ func (cli *DockerCli) CmdRun(args ...string) error {
}
func (cli *DockerCli) CmdCp(args ...string) error {
- cmd := cli.Subcmd("cp", "CONTAINER:PATH HOSTPATH", "Copy files/folders from the PATH to the HOSTPATH", true)
+ cmd := cli.Subcmd("cp", "CONTAINER:PATH HOSTDIR|-", "Copy files/folders from a PATH on the container to a HOSTDIR on the host\nrunning the command. Use '-' to write the data\nas a tar file to STDOUT.", true)
cmd.Require(flag.Exact, 2)
utils.ParseFlags(cmd, args, true)
@@ -2414,7 +2531,7 @@ func (cli *DockerCli) CmdCp(args ...string) error {
copyData.Set("Resource", info[1])
copyData.Set("HostPath", cmd.Arg(1))
- stream, statusCode, err := cli.call("POST", "/containers/"+info[0]+"/copy", copyData, false)
+ stream, statusCode, err := cli.call("POST", "/containers/"+info[0]+"/copy", copyData, nil)
if stream != nil {
defer stream.Close()
}
@@ -2426,7 +2543,14 @@ func (cli *DockerCli) CmdCp(args ...string) error {
}
if statusCode == 200 {
- if err := archive.Untar(stream, copyData.Get("HostPath"), &archive.TarOptions{NoLchown: true}); err != nil {
+ dest := copyData.Get("HostPath")
+
+ if dest == "-" {
+ _, err = io.Copy(cli.out, stream)
+ } else {
+ err = archive.Untar(stream, dest, &archive.TarOptions{NoLchown: true})
+ }
+ if err != nil {
return err
}
}
@@ -2502,7 +2626,7 @@ func (cli *DockerCli) CmdExec(args ...string) error {
return &utils.StatusError{StatusCode: 1}
}
- stream, _, err := cli.call("POST", "/containers/"+execConfig.Container+"/exec", execConfig, false)
+ stream, _, err := cli.call("POST", "/containers/"+execConfig.Container+"/exec", execConfig, nil)
if err != nil {
return err
}
@@ -2524,7 +2648,7 @@ func (cli *DockerCli) CmdExec(args ...string) error {
return err
}
} else {
- if _, _, err := readBody(cli.call("POST", "/exec/"+execID+"/start", execConfig, false)); err != nil {
+ if _, _, err := readBody(cli.call("POST", "/exec/"+execID+"/start", execConfig, nil)); err != nil {
return err
}
// For now don't print this - wait for when we support exec wait()
@@ -2616,7 +2740,7 @@ type containerStats struct {
}
func (s *containerStats) Collect(cli *DockerCli) {
- stream, _, err := cli.call("GET", "/containers/"+s.Name+"/stats", nil, false)
+ stream, _, err := cli.call("GET", "/containers/"+s.Name+"/stats", nil, nil)
if err != nil {
s.err = err
return
@@ -2631,7 +2755,7 @@ func (s *containerStats) Collect(cli *DockerCli) {
)
go func() {
for {
- var v *stats.Stats
+ var v *types.Stats
if err := dec.Decode(&v); err != nil {
u <- err
return
@@ -2641,7 +2765,7 @@ func (s *containerStats) Collect(cli *DockerCli) {
cpuPercent = 0.0
)
if !start {
- cpuPercent = calcuateCpuPercent(previousCpu, previousSystem, v)
+ cpuPercent = calculateCpuPercent(previousCpu, previousSystem, v)
}
start = false
s.mu.Lock()
@@ -2694,7 +2818,7 @@ func (s *containerStats) Display(w io.Writer) error {
}
func (cli *DockerCli) CmdStats(args ...string) error {
- cmd := cli.Subcmd("stats", "CONTAINER", "Display a live stream of one or more containers' resource usage statistics", true)
+ cmd := cli.Subcmd("stats", "CONTAINER [CONTAINER...]", "Display a live stream of one or more containers' resource usage statistics", true)
cmd.Require(flag.Min, 1)
utils.ParseFlags(cmd, args, true)
@@ -2721,7 +2845,7 @@ func (cli *DockerCli) CmdStats(args ...string) error {
for _, c := range cStats {
c.mu.Lock()
if c.err != nil {
- errs = append(errs, fmt.Sprintf("%s: %s", c.Name, c.err.Error()))
+ errs = append(errs, fmt.Sprintf("%s: %v", c.Name, c.err))
}
c.mu.Unlock()
}
@@ -2748,7 +2872,7 @@ func (cli *DockerCli) CmdStats(args ...string) error {
return nil
}
-func calcuateCpuPercent(previousCpu, previousSystem uint64, v *stats.Stats) float64 {
+func calculateCpuPercent(previousCpu, previousSystem uint64, v *types.Stats) float64 {
var (
cpuPercent = 0.0
// calculate the change for the cpu usage of the container in between readings
diff --git a/api/client/hijack.go b/api/client/hijack.go
index bb902405c0..4f89c3a76c 100644
--- a/api/client/hijack.go
+++ b/api/client/hijack.go
@@ -15,7 +15,7 @@ import (
log "github.com/Sirupsen/logrus"
"github.com/docker/docker/api"
- "github.com/docker/docker/dockerversion"
+ "github.com/docker/docker/autogen/dockerversion"
"github.com/docker/docker/pkg/promise"
"github.com/docker/docker/pkg/stdcopy"
"github.com/docker/docker/pkg/term"
diff --git a/api/client/utils.go b/api/client/utils.go
index 86e221ebf4..e638a8723e 100644
--- a/api/client/utils.go
+++ b/api/client/utils.go
@@ -12,12 +12,14 @@ import (
"net/url"
"os"
gosignal "os/signal"
+ "runtime"
"strconv"
"strings"
+ "time"
log "github.com/Sirupsen/logrus"
"github.com/docker/docker/api"
- "github.com/docker/docker/dockerversion"
+ "github.com/docker/docker/autogen/dockerversion"
"github.com/docker/docker/engine"
"github.com/docker/docker/pkg/signal"
"github.com/docker/docker/pkg/stdcopy"
@@ -54,124 +56,144 @@ func (cli *DockerCli) encodeData(data interface{}) (*bytes.Buffer, error) {
return params, nil
}
-func (cli *DockerCli) call(method, path string, data interface{}, passAuthInfo bool) (io.ReadCloser, int, error) {
- params, err := cli.encodeData(data)
- if err != nil {
- return nil, -1, err
+func (cli *DockerCli) clientRequest(method, path string, in io.Reader, headers map[string][]string) (io.ReadCloser, string, int, error) {
+ expectedPayload := (method == "POST" || method == "PUT")
+ if expectedPayload && in == nil {
+ in = bytes.NewReader([]byte{})
}
- req, err := http.NewRequest(method, fmt.Sprintf("/v%s%s", api.APIVERSION, path), params)
+ req, err := http.NewRequest(method, fmt.Sprintf("/v%s%s", api.APIVERSION, path), in)
if err != nil {
- return nil, -1, err
- }
- if passAuthInfo {
- cli.LoadConfigFile()
- // Resolve the Auth config relevant for this server
- authConfig := cli.configFile.Configs[registry.IndexServerAddress()]
- getHeaders := func(authConfig registry.AuthConfig) (map[string][]string, error) {
- buf, err := json.Marshal(authConfig)
- if err != nil {
- return nil, err
- }
- registryAuthHeader := []string{
- base64.URLEncoding.EncodeToString(buf),
- }
- return map[string][]string{"X-Registry-Auth": registryAuthHeader}, nil
- }
- if headers, err := getHeaders(authConfig); err == nil && headers != nil {
- for k, v := range headers {
- req.Header[k] = v
- }
- }
+ return nil, "", -1, err
}
req.Header.Set("User-Agent", "Docker-Client/"+dockerversion.VERSION)
req.URL.Host = cli.addr
req.URL.Scheme = cli.scheme
- if data != nil {
- req.Header.Set("Content-Type", "application/json")
- } else if method == "POST" {
+ if headers != nil {
+ for k, v := range headers {
+ req.Header[k] = v
+ }
+ }
+ if expectedPayload && req.Header.Get("Content-Type") == "" {
req.Header.Set("Content-Type", "text/plain")
}
+
resp, err := cli.HTTPClient().Do(req)
+ statusCode := -1
+ if resp != nil {
+ statusCode = resp.StatusCode
+ }
if err != nil {
if strings.Contains(err.Error(), "connection refused") {
- return nil, -1, ErrConnectionRefused
+ return nil, "", statusCode, ErrConnectionRefused
}
if cli.tlsConfig == nil {
- return nil, -1, fmt.Errorf("%v. Are you trying to connect to a TLS-enabled daemon without TLS?", err)
+ return nil, "", statusCode, fmt.Errorf("%v. Are you trying to connect to a TLS-enabled daemon without TLS?", err)
}
- return nil, -1, fmt.Errorf("An error occurred trying to connect: %v", err)
+ return nil, "", statusCode, fmt.Errorf("An error occurred trying to connect: %v", err)
}
- if resp.StatusCode < 200 || resp.StatusCode >= 400 {
+ if statusCode < 200 || statusCode >= 400 {
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
- return nil, -1, err
+ return nil, "", statusCode, err
}
if len(body) == 0 {
- return nil, resp.StatusCode, fmt.Errorf("Error: request returned %s for API route and version %s, check if the server supports the requested API version", http.StatusText(resp.StatusCode), req.URL)
+ return nil, "", statusCode, fmt.Errorf("Error: request returned %s for API route and version %s, check if the server supports the requested API version", http.StatusText(statusCode), req.URL)
}
- return nil, resp.StatusCode, fmt.Errorf("Error response from daemon: %s", bytes.TrimSpace(body))
+ return nil, "", statusCode, fmt.Errorf("Error response from daemon: %s", bytes.TrimSpace(body))
}
- return resp.Body, resp.StatusCode, nil
+ return resp.Body, resp.Header.Get("Content-Type"), statusCode, nil
}
-func (cli *DockerCli) stream(method, path string, in io.Reader, out io.Writer, headers map[string][]string) error {
- return cli.streamHelper(method, path, true, in, out, nil, headers)
-}
+func (cli *DockerCli) clientRequestAttemptLogin(method, path string, in io.Reader, out io.Writer, index *registry.IndexInfo, cmdName string) (io.ReadCloser, int, error) {
+ cmdAttempt := func(authConfig registry.AuthConfig) (io.ReadCloser, int, error) {
+ buf, err := json.Marshal(authConfig)
+ if err != nil {
+ return nil, -1, err
+ }
+ registryAuthHeader := []string{
+ base64.URLEncoding.EncodeToString(buf),
+ }
-func (cli *DockerCli) streamHelper(method, path string, setRawTerminal bool, in io.Reader, stdout, stderr io.Writer, headers map[string][]string) error {
- if (method == "POST" || method == "PUT") && in == nil {
- in = bytes.NewReader([]byte{})
+ // begin the request
+ body, contentType, statusCode, err := cli.clientRequest(method, path, in, map[string][]string{
+ "X-Registry-Auth": registryAuthHeader,
+ })
+ if err == nil && out != nil {
+ // If we are streaming output, complete the stream since
+ // errors may not appear until later.
+ err = cli.streamBody(body, contentType, true, out, nil)
+ }
+ if err != nil {
+ // Since errors in a stream appear after status 200 has been written,
+ // we may need to change the status code.
+ if strings.Contains(err.Error(), "Authentication is required") ||
+ strings.Contains(err.Error(), "Status 401") ||
+ strings.Contains(err.Error(), "status code 401") {
+ statusCode = http.StatusUnauthorized
+ }
+ }
+ return body, statusCode, err
}
- req, err := http.NewRequest(method, fmt.Sprintf("/v%s%s", api.APIVERSION, path), in)
- if err != nil {
- return err
+ // Resolve the Auth config relevant for this server
+ authConfig := cli.configFile.ResolveAuthConfig(index)
+ body, statusCode, err := cmdAttempt(authConfig)
+ if statusCode == http.StatusUnauthorized {
+ fmt.Fprintf(cli.out, "\nPlease login prior to %s:\n", cmdName)
+ if err = cli.CmdLogin(index.GetAuthConfigKey()); err != nil {
+ return nil, -1, err
+ }
+ authConfig = cli.configFile.ResolveAuthConfig(index)
+ return cmdAttempt(authConfig)
}
- req.Header.Set("User-Agent", "Docker-Client/"+dockerversion.VERSION)
- req.URL.Host = cli.addr
- req.URL.Scheme = cli.scheme
- if method == "POST" {
- req.Header.Set("Content-Type", "text/plain")
+ return body, statusCode, err
+}
+
+func (cli *DockerCli) call(method, path string, data interface{}, headers map[string][]string) (io.ReadCloser, int, error) {
+ params, err := cli.encodeData(data)
+ if err != nil {
+ return nil, -1, err
}
- if headers != nil {
- for k, v := range headers {
- req.Header[k] = v
+ if data != nil {
+ if headers == nil {
+ headers = make(map[string][]string)
}
+ headers["Content-Type"] = []string{"application/json"}
}
- resp, err := cli.HTTPClient().Do(req)
+
+ body, _, statusCode, err := cli.clientRequest(method, path, params, headers)
+ return body, statusCode, err
+}
+func (cli *DockerCli) stream(method, path string, in io.Reader, out io.Writer, headers map[string][]string) error {
+ return cli.streamHelper(method, path, true, in, out, nil, headers)
+}
+
+func (cli *DockerCli) streamHelper(method, path string, setRawTerminal bool, in io.Reader, stdout, stderr io.Writer, headers map[string][]string) error {
+ body, contentType, _, err := cli.clientRequest(method, path, in, headers)
if err != nil {
- if strings.Contains(err.Error(), "connection refused") {
- return fmt.Errorf("Cannot connect to the Docker daemon. Is 'docker -d' running on this host?")
- }
return err
}
- defer resp.Body.Close()
+ return cli.streamBody(body, contentType, setRawTerminal, stdout, stderr)
+}
- if resp.StatusCode < 200 || resp.StatusCode >= 400 {
- body, err := ioutil.ReadAll(resp.Body)
- if err != nil {
- return err
- }
- if len(body) == 0 {
- return fmt.Errorf("Error :%s", http.StatusText(resp.StatusCode))
- }
- return fmt.Errorf("Error: %s", bytes.TrimSpace(body))
- }
+func (cli *DockerCli) streamBody(body io.ReadCloser, contentType string, setRawTerminal bool, stdout, stderr io.Writer) error {
+ defer body.Close()
- if api.MatchesContentType(resp.Header.Get("Content-Type"), "application/json") {
- return utils.DisplayJSONMessagesStream(resp.Body, stdout, cli.outFd, cli.isTerminalOut)
+ if api.MatchesContentType(contentType, "application/json") {
+ return utils.DisplayJSONMessagesStream(body, stdout, cli.outFd, cli.isTerminalOut)
}
if stdout != nil || stderr != nil {
// When TTY is ON, use regular copy
+ var err error
if setRawTerminal {
- _, err = io.Copy(stdout, resp.Body)
+ _, err = io.Copy(stdout, body)
} else {
- _, err = stdcopy.StdCopy(stdout, stderr, resp.Body)
+ _, err = stdcopy.StdCopy(stdout, stderr, body)
}
log.Debugf("[stream] End of stdout")
return err
@@ -195,13 +217,13 @@ func (cli *DockerCli) resizeTty(id string, isExec bool) {
path = "/exec/" + id + "/resize?"
}
- if _, _, err := readBody(cli.call("POST", path+v.Encode(), nil, false)); err != nil {
+ if _, _, err := readBody(cli.call("POST", path+v.Encode(), nil, nil)); err != nil {
log.Debugf("Error resize: %s", err)
}
}
-func waitForExit(cli *DockerCli, containerId string) (int, error) {
- stream, _, err := cli.call("POST", "/containers/"+containerId+"/wait", nil, false)
+func waitForExit(cli *DockerCli, containerID string) (int, error) {
+ stream, _, err := cli.call("POST", "/containers/"+containerID+"/wait", nil, nil)
if err != nil {
return -1, err
}
@@ -215,8 +237,8 @@ func waitForExit(cli *DockerCli, containerId string) (int, error) {
// getExitCode perform an inspect on the container. It returns
// the running state and the exit code.
-func getExitCode(cli *DockerCli, containerId string) (bool, int, error) {
- stream, _, err := cli.call("GET", "/containers/"+containerId+"/json", nil, false)
+func getExitCode(cli *DockerCli, containerID string) (bool, int, error) {
+ stream, _, err := cli.call("GET", "/containers/"+containerID+"/json", nil, nil)
if err != nil {
// If we can't connect, then the daemon probably died.
if err != ErrConnectionRefused {
@@ -236,8 +258,8 @@ func getExitCode(cli *DockerCli, containerId string) (bool, int, error) {
// getExecExitCode perform an inspect on the exec command. It returns
// the running state and the exit code.
-func getExecExitCode(cli *DockerCli, execId string) (bool, int, error) {
- stream, _, err := cli.call("GET", "/exec/"+execId+"/json", nil, false)
+func getExecExitCode(cli *DockerCli, execID string) (bool, int, error) {
+ stream, _, err := cli.call("GET", "/exec/"+execID+"/json", nil, nil)
if err != nil {
// If we can't connect, then the daemon probably died.
if err != ErrConnectionRefused {
@@ -257,13 +279,29 @@ func getExecExitCode(cli *DockerCli, execId string) (bool, int, error) {
func (cli *DockerCli) monitorTtySize(id string, isExec bool) error {
cli.resizeTty(id, isExec)
- sigchan := make(chan os.Signal, 1)
- gosignal.Notify(sigchan, signal.SIGWINCH)
- go func() {
- for _ = range sigchan {
- cli.resizeTty(id, isExec)
- }
- }()
+ if runtime.GOOS == "windows" {
+ go func() {
+ prevH, prevW := cli.getTtySize()
+ for {
+ time.Sleep(time.Millisecond * 250)
+ h, w := cli.getTtySize()
+
+ if prevW != w || prevH != h {
+ cli.resizeTty(id, isExec)
+ }
+ prevH = h
+ prevW = w
+ }
+ }()
+ } else {
+ sigchan := make(chan os.Signal, 1)
+ gosignal.Notify(sigchan, signal.SIGWINCH)
+ go func() {
+ for _ = range sigchan {
+ cli.resizeTty(id, isExec)
+ }
+ }()
+ }
return nil
}
diff --git a/api/common.go b/api/common.go
index 1bbb6d3937..f6a0bc4883 100644
--- a/api/common.go
+++ b/api/common.go
@@ -15,7 +15,7 @@ import (
)
const (
- APIVERSION version.Version = "1.17"
+ APIVERSION version.Version = "1.18"
DEFAULTHTTPHOST = "127.0.0.1"
DEFAULTUNIXSOCKET = "/var/run/docker.sock"
DefaultDockerfileName string = "Dockerfile"
@@ -29,25 +29,82 @@ func ValidateHost(val string) (string, error) {
return host, nil
}
-//TODO remove, used on < 1.5 in getContainersJSON
+// TODO remove, used on < 1.5 in getContainersJSON
func DisplayablePorts(ports *engine.Table) string {
- result := []string{}
- ports.SetKey("PublicPort")
+ var (
+ result = []string{}
+ hostMappings = []string{}
+ firstInGroupMap map[string]int
+ lastInGroupMap map[string]int
+ )
+ firstInGroupMap = make(map[string]int)
+ lastInGroupMap = make(map[string]int)
+ ports.SetKey("PrivatePort")
ports.Sort()
for _, port := range ports.Data {
- if port.Get("IP") == "" {
- result = append(result, fmt.Sprintf("%d/%s", port.GetInt("PrivatePort"), port.Get("Type")))
- } else {
- result = append(result, fmt.Sprintf("%s:%d->%d/%s", port.Get("IP"), port.GetInt("PublicPort"), port.GetInt("PrivatePort"), port.Get("Type")))
+ var (
+ current = port.GetInt("PrivatePort")
+ portKey = port.Get("Type")
+ firstInGroup int
+ lastInGroup int
+ )
+ if port.Get("IP") != "" {
+ if port.GetInt("PublicPort") != current {
+ hostMappings = append(hostMappings, fmt.Sprintf("%s:%d->%d/%s", port.Get("IP"), port.GetInt("PublicPort"), port.GetInt("PrivatePort"), port.Get("Type")))
+ continue
+ }
+ portKey = fmt.Sprintf("%s/%s", port.Get("IP"), port.Get("Type"))
}
+ firstInGroup = firstInGroupMap[portKey]
+ lastInGroup = lastInGroupMap[portKey]
+
+ if firstInGroup == 0 {
+ firstInGroupMap[portKey] = current
+ lastInGroupMap[portKey] = current
+ continue
+ }
+
+ if current == (lastInGroup + 1) {
+ lastInGroupMap[portKey] = current
+ continue
+ }
+ result = append(result, FormGroup(portKey, firstInGroup, lastInGroup))
+ firstInGroupMap[portKey] = current
+ lastInGroupMap[portKey] = current
+ }
+ for portKey, firstInGroup := range firstInGroupMap {
+ result = append(result, FormGroup(portKey, firstInGroup, lastInGroupMap[portKey]))
}
+ result = append(result, hostMappings...)
return strings.Join(result, ", ")
}
+func FormGroup(key string, start, last int) string {
+ var (
+ group string
+ parts = strings.Split(key, "/")
+ groupType = parts[0]
+ ip = ""
+ )
+ if len(parts) > 1 {
+ ip = parts[0]
+ groupType = parts[1]
+ }
+ if start == last {
+ group = fmt.Sprintf("%d", start)
+ } else {
+ group = fmt.Sprintf("%d-%d", start, last)
+ }
+ if ip != "" {
+ group = fmt.Sprintf("%s:%s->%s", ip, group, group)
+ }
+ return fmt.Sprintf("%s/%s", group, groupType)
+}
+
func MatchesContentType(contentType, expectedType string) bool {
mimetype, _, err := mime.ParseMediaType(contentType)
if err != nil {
- log.Errorf("Error parsing media type: %s error: %s", contentType, err.Error())
+ log.Errorf("Error parsing media type: %s error: %v", contentType, err)
}
return err == nil && mimetype == expectedType
}
diff --git a/api/server/MAINTAINERS b/api/server/MAINTAINERS
deleted file mode 100644
index dee1eec042..0000000000
--- a/api/server/MAINTAINERS
+++ /dev/null
@@ -1,2 +0,0 @@
-Victor Vieux <vieux@docker.com> (@vieux)
-# Johan Euphrosine <proppy@google.com> (@proppy)
diff --git a/api/server/server.go b/api/server/server.go
index 9bb42f6c87..cfbb7f253e 100644
--- a/api/server/server.go
+++ b/api/server/server.go
@@ -16,7 +16,6 @@ import (
"os"
"strconv"
"strings"
- "syscall"
"crypto/tls"
"crypto/x509"
@@ -27,19 +26,19 @@ import (
log "github.com/Sirupsen/logrus"
"github.com/docker/docker/api"
- "github.com/docker/docker/daemon/networkdriver/portallocator"
+ "github.com/docker/docker/api/types"
+ "github.com/docker/docker/daemon/networkdriver/bridge"
"github.com/docker/docker/engine"
"github.com/docker/docker/pkg/listenbuffer"
"github.com/docker/docker/pkg/parsers"
"github.com/docker/docker/pkg/stdcopy"
- "github.com/docker/docker/pkg/systemd"
"github.com/docker/docker/pkg/version"
"github.com/docker/docker/registry"
"github.com/docker/docker/utils"
)
var (
- activationLock chan struct{}
+ activationLock chan struct{} = make(chan struct{})
)
type HttpServer struct {
@@ -135,17 +134,27 @@ func httpError(w http.ResponseWriter, err error) {
}
if err != nil {
- log.Errorf("HTTP Error: statusCode=%d %s", statusCode, err.Error())
+ log.Errorf("HTTP Error: statusCode=%d %v", statusCode, err)
http.Error(w, err.Error(), statusCode)
}
}
-func writeJSON(w http.ResponseWriter, code int, v engine.Env) error {
+// writeJSONEnv writes the engine.Env values to the http response stream as a
+// json encoded body.
+func writeJSONEnv(w http.ResponseWriter, code int, v engine.Env) error {
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(code)
return v.Encode(w)
}
+// writeJSON writes the value v to the http response stream as json with standard
+// json encoding.
+func writeJSON(w http.ResponseWriter, code int, v interface{}) error {
+ w.Header().Set("Content-Type", "application/json")
+ w.WriteHeader(code)
+ return json.NewEncoder(w).Encode(v)
+}
+
func streamJSON(job *engine.Job, w http.ResponseWriter, flush bool) {
w.Header().Set("Content-Type", "application/json")
if flush {
@@ -183,7 +192,7 @@ func postAuth(eng *engine.Engine, version version.Version, w http.ResponseWriter
if status := engine.Tail(stdoutBuffer, 1); status != "" {
var env engine.Env
env.Set("Status", status)
- return writeJSON(w, http.StatusOK, env)
+ return writeJSONEnv(w, http.StatusOK, env)
}
w.WriteHeader(http.StatusNoContent)
return nil
@@ -518,6 +527,7 @@ func postCommit(eng *engine.Engine, version version.Version, w http.ResponseWrit
job.Setenv("tag", r.Form.Get("tag"))
job.Setenv("author", r.Form.Get("author"))
job.Setenv("comment", r.Form.Get("comment"))
+ job.SetenvList("changes", r.Form["changes"])
job.SetenvSubEnv("config", &config)
job.Stdout.Add(stdoutBuffer)
@@ -525,7 +535,7 @@ func postCommit(eng *engine.Engine, version version.Version, w http.ResponseWrit
return err
}
env.Set("Id", engine.Tail(stdoutBuffer, 1))
- return writeJSON(w, http.StatusCreated, env)
+ return writeJSONEnv(w, http.StatusCreated, env)
}
// Creates an image from Pull or from Import
@@ -570,6 +580,7 @@ func postImagesCreate(eng *engine.Engine, version version.Version, w http.Respon
}
job = eng.Job("import", r.Form.Get("fromSrc"), repo, tag)
job.Stdin.Add(r.Body)
+ job.SetenvList("changes", r.Form["changes"])
}
if version.GreaterThan("1.0") {
@@ -703,18 +714,16 @@ func postContainersCreate(eng *engine.Engine, version version.Version, w http.Re
if err := parseForm(r); err != nil {
return nil
}
+ if err := checkForJson(r); err != nil {
+ return err
+ }
var (
- out engine.Env
job = eng.Job("create", r.Form.Get("name"))
outWarnings []string
stdoutBuffer = bytes.NewBuffer(nil)
warnings = bytes.NewBuffer(nil)
)
- if err := checkForJson(r); err != nil {
- return err
- }
-
if err := job.DecodeEnv(r.Body); err != nil {
return err
}
@@ -730,10 +739,10 @@ func postContainersCreate(eng *engine.Engine, version version.Version, w http.Re
for scanner.Scan() {
outWarnings = append(outWarnings, scanner.Text())
}
- out.Set("Id", engine.Tail(stdoutBuffer, 1))
- out.SetList("Warnings", outWarnings)
-
- return writeJSON(w, http.StatusCreated, out)
+ return writeJSON(w, http.StatusCreated, &types.ContainerCreateResponse{
+ ID: engine.Tail(stdoutBuffer, 1),
+ Warnings: outWarnings,
+ })
}
func postContainersRestart(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
@@ -876,7 +885,7 @@ func postContainersWait(eng *engine.Engine, version version.Version, w http.Resp
}
env.Set("StatusCode", engine.Tail(stdoutBuffer, 1))
- return writeJSON(w, http.StatusOK, env)
+ return writeJSONEnv(w, http.StatusOK, env)
}
func postContainersResize(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
@@ -1073,6 +1082,24 @@ func postBuild(eng *engine.Engine, version version.Version, w http.ResponseWrite
job.Setenv("forcerm", r.FormValue("forcerm"))
job.SetenvJson("authConfig", authConfig)
job.SetenvJson("configFile", configFile)
+ job.Setenv("memswap", r.FormValue("memswap"))
+ job.Setenv("memory", r.FormValue("memory"))
+ job.Setenv("cpusetcpus", r.FormValue("cpusetcpus"))
+ job.Setenv("cpushares", r.FormValue("cpushares"))
+
+ // Job cancellation. Note: not all job types support this.
+ if closeNotifier, ok := w.(http.CloseNotifier); ok {
+ finished := make(chan struct{})
+ defer close(finished)
+ go func() {
+ select {
+ case <-finished:
+ case <-closeNotifier.CloseNotify():
+ log.Infof("Client disconnected, cancelling job: %v", job)
+ job.Cancel()
+ }
+ }()
+ }
if err := job.Run(); err != nil {
if !job.Stdout.Used() {
@@ -1113,8 +1140,8 @@ func postContainersCopy(eng *engine.Engine, version version.Version, w http.Resp
job.Stdout.Add(w)
w.Header().Set("Content-Type", "application/x-tar")
if err := job.Run(); err != nil {
- log.Errorf("%s", err.Error())
- if strings.Contains(strings.ToLower(err.Error()), "no such container") {
+ log.Errorf("%v", err)
+ if strings.Contains(strings.ToLower(err.Error()), "no such id") {
w.WriteHeader(http.StatusNotFound)
} else if strings.Contains(err.Error(), "no such file or directory") {
return fmt.Errorf("Could not find the file %s in container %s", origResource, vars["name"])
@@ -1147,7 +1174,7 @@ func postContainerExecCreate(eng *engine.Engine, version version.Version, w http
// Return the ID
out.Set("Id", engine.Tail(stdoutBuffer, 1))
- return writeJSON(w, http.StatusCreated, out)
+ return writeJSONEnv(w, http.StatusCreated, out)
}
// TODO(vishh): Refactor the code to avoid having to specify stream config as part of both create and start.
@@ -1219,8 +1246,9 @@ func optionsHandler(eng *engine.Engine, version version.Version, w http.Response
w.WriteHeader(http.StatusOK)
return nil
}
-func writeCorsHeaders(w http.ResponseWriter, r *http.Request) {
- w.Header().Add("Access-Control-Allow-Origin", "*")
+func writeCorsHeaders(w http.ResponseWriter, r *http.Request, corsHeaders string) {
+ log.Debugf("CORS header is enabled and set to: %s", corsHeaders)
+ w.Header().Add("Access-Control-Allow-Origin", corsHeaders)
w.Header().Add("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, X-Registry-Auth")
w.Header().Add("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, OPTIONS")
}
@@ -1230,7 +1258,7 @@ func ping(eng *engine.Engine, version version.Version, w http.ResponseWriter, r
return err
}
-func makeHttpHandler(eng *engine.Engine, logging bool, localMethod string, localRoute string, handlerFunc HttpApiFunc, enableCors bool, dockerVersion version.Version) http.HandlerFunc {
+func makeHttpHandler(eng *engine.Engine, logging bool, localMethod string, localRoute string, handlerFunc HttpApiFunc, corsHeaders string, dockerVersion version.Version) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
// log the request
log.Debugf("Calling %s %s", localMethod, localRoute)
@@ -1249,8 +1277,8 @@ func makeHttpHandler(eng *engine.Engine, logging bool, localMethod string, local
if version == "" {
version = api.APIVERSION
}
- if enableCors {
- writeCorsHeaders(w, r)
+ if corsHeaders != "" {
+ writeCorsHeaders(w, r, corsHeaders)
}
if version.GreaterThan(api.APIVERSION) {
@@ -1292,7 +1320,8 @@ func AttachProfiler(router *mux.Router) {
router.HandleFunc("/debug/pprof/threadcreate", pprof.Handler("threadcreate").ServeHTTP)
}
-func createRouter(eng *engine.Engine, logging, enableCors bool, dockerVersion string) *mux.Router {
+// we keep enableCors just for legacy usage, need to be removed in the future
+func createRouter(eng *engine.Engine, logging, enableCors bool, corsHeaders string, dockerVersion string) *mux.Router {
r := mux.NewRouter()
if os.Getenv("DEBUG") != "" {
AttachProfiler(r)
@@ -1354,6 +1383,12 @@ func createRouter(eng *engine.Engine, logging, enableCors bool, dockerVersion st
},
}
+ // If "api-cors-header" is not given, but "api-enable-cors" is true, we set cors to "*"
+ // otherwise, all head values will be passed to HTTP handler
+ if corsHeaders == "" && enableCors {
+ corsHeaders = "*"
+ }
+
for method, routes := range m {
for route, fct := range routes {
log.Debugf("Registering %s, %s", method, route)
@@ -1363,7 +1398,7 @@ func createRouter(eng *engine.Engine, logging, enableCors bool, dockerVersion st
localMethod := method
// build the handler function
- f := makeHttpHandler(eng, logging, localMethod, localRoute, localFct, enableCors, version.Version(dockerVersion))
+ f := makeHttpHandler(eng, logging, localMethod, localRoute, localFct, corsHeaders, version.Version(dockerVersion))
// add the new route
if localRoute == "" {
@@ -1382,49 +1417,12 @@ func createRouter(eng *engine.Engine, logging, enableCors bool, dockerVersion st
// FIXME: refactor this to be part of Server and not require re-creating a new
// router each time. This requires first moving ListenAndServe into Server.
func ServeRequest(eng *engine.Engine, apiversion version.Version, w http.ResponseWriter, req *http.Request) {
- router := createRouter(eng, false, true, "")
+ router := createRouter(eng, false, true, "", "")
// Insert APIVERSION into the request as a convenience
req.URL.Path = fmt.Sprintf("/v%s%s", apiversion, req.URL.Path)
router.ServeHTTP(w, req)
}
-// serveFd creates an http.Server and sets it up to serve given a socket activated
-// argument.
-func serveFd(addr string, job *engine.Job) error {
- r := createRouter(job.Eng, job.GetenvBool("Logging"), job.GetenvBool("EnableCors"), job.Getenv("Version"))
-
- ls, e := systemd.ListenFD(addr)
- if e != nil {
- return e
- }
-
- chErrors := make(chan error, len(ls))
-
- // We don't want to start serving on these sockets until the
- // daemon is initialized and installed. Otherwise required handlers
- // won't be ready.
- <-activationLock
-
- // Since ListenFD will return one or more sockets we have
- // to create a go func to spawn off multiple serves
- for i := range ls {
- listener := ls[i]
- go func() {
- httpSrv := http.Server{Handler: r}
- chErrors <- httpSrv.Serve(listener)
- }()
- }
-
- for i := 0; i < len(ls); i++ {
- err := <-chErrors
- if err != nil {
- return err
- }
- }
-
- return nil
-}
-
func lookupGidByName(nameOrGid string) (int, error) {
groupFile, err := user.GetGroupPath()
if err != nil {
@@ -1439,13 +1437,21 @@ func lookupGidByName(nameOrGid string) (int, error) {
if groups != nil && len(groups) > 0 {
return groups[0].Gid, nil
}
+ gid, err := strconv.Atoi(nameOrGid)
+ if err == nil {
+ log.Warnf("Could not find GID %d", gid)
+ return gid, nil
+ }
return -1, fmt.Errorf("Group %s not found", nameOrGid)
}
func setupTls(cert, key, ca string, l net.Listener) (net.Listener, error) {
tlsCert, err := tls.LoadX509KeyPair(cert, key)
if err != nil {
- return nil, fmt.Errorf("Couldn't load X509 key pair (%s, %s): %s. Key encrypted?",
+ if os.IsNotExist(err) {
+ return nil, fmt.Errorf("Could not load X509 key pair (%s, %s): %v", cert, key, err)
+ }
+ return nil, fmt.Errorf("Error reading X509 key pair (%s, %s): %q. Make sure the key is encrypted.",
cert, key, err)
}
tlsConfig := &tls.Config{
@@ -1459,7 +1465,7 @@ func setupTls(cert, key, ca string, l net.Listener) (net.Listener, error) {
certPool := x509.NewCertPool()
file, err := ioutil.ReadFile(ca)
if err != nil {
- return nil, fmt.Errorf("Couldn't read CA certificate: %s", err)
+ return nil, fmt.Errorf("Could not read CA certificate: %v", err)
}
certPool.AppendCertsFromPEM(file)
tlsConfig.ClientAuth = tls.RequireAndVerifyClientCert
@@ -1502,31 +1508,6 @@ func setSocketGroup(addr, group string) error {
return nil
}
-func setupUnixHttp(addr string, job *engine.Job) (*HttpServer, error) {
- r := createRouter(job.Eng, job.GetenvBool("Logging"), job.GetenvBool("EnableCors"), job.Getenv("Version"))
-
- if err := syscall.Unlink(addr); err != nil && !os.IsNotExist(err) {
- return nil, err
- }
- mask := syscall.Umask(0777)
- defer syscall.Umask(mask)
-
- l, err := newListener("unix", addr, job.GetenvBool("BufferRequests"))
- if err != nil {
- return nil, err
- }
-
- if err := setSocketGroup(addr, job.Getenv("SocketGroup")); err != nil {
- return nil, err
- }
-
- if err := os.Chmod(addr, 0660); err != nil {
- return nil, err
- }
-
- return &HttpServer{&http.Server{Addr: addr, Handler: r}, l}, nil
-}
-
func allocateDaemonPort(addr string) error {
host, port, err := net.SplitHostPort(addr)
if err != nil {
@@ -1546,7 +1527,7 @@ func allocateDaemonPort(addr string) error {
}
for _, hostIP := range hostIPs {
- if _, err := portallocator.RequestPort(hostIP, "tcp", intPort); err != nil {
+ if _, err := bridge.RequestPort(hostIP, "tcp", intPort); err != nil {
return fmt.Errorf("failed to allocate daemon listening port %d (err: %v)", intPort, err)
}
}
@@ -1554,11 +1535,11 @@ func allocateDaemonPort(addr string) error {
}
func setupTcpHttp(addr string, job *engine.Job) (*HttpServer, error) {
- if !strings.HasPrefix(addr, "127.0.0.1") && !job.GetenvBool("TlsVerify") {
- log.Infof("/!\\ DON'T BIND ON ANOTHER IP ADDRESS THAN 127.0.0.1 IF YOU DON'T KNOW WHAT YOU'RE DOING /!\\")
+ if !job.GetenvBool("TlsVerify") {
+ log.Infof("/!\\ DON'T BIND ON ANY IP ADDRESS WITHOUT setting -tlsverify IF YOU DON'T KNOW WHAT YOU'RE DOING /!\\")
}
- r := createRouter(job.Eng, job.GetenvBool("Logging"), job.GetenvBool("EnableCors"), job.Getenv("Version"))
+ r := createRouter(job.Eng, job.GetenvBool("Logging"), job.GetenvBool("EnableCors"), job.Getenv("CorsHeaders"), job.Getenv("Version"))
l, err := newListener("tcp", addr, job.GetenvBool("BufferRequests"))
if err != nil {
@@ -1582,21 +1563,6 @@ func setupTcpHttp(addr string, job *engine.Job) (*HttpServer, error) {
return &HttpServer{&http.Server{Addr: addr, Handler: r}, l}, nil
}
-// NewServer sets up the required Server and does protocol specific checking.
-func NewServer(proto, addr string, job *engine.Job) (Server, error) {
- // Basic error and sanity checking
- switch proto {
- case "fd":
- return nil, serveFd(addr, job)
- case "tcp":
- return setupTcpHttp(addr, job)
- case "unix":
- return setupUnixHttp(addr, job)
- default:
- return nil, fmt.Errorf("Invalid protocol format.")
- }
-}
-
type Server interface {
Serve() error
Close() error
@@ -1612,7 +1578,6 @@ func ServeApi(job *engine.Job) engine.Status {
protoAddrs = job.Args
chErrors = make(chan error, len(protoAddrs))
)
- activationLock = make(chan struct{})
for _, protoAddr := range protoAddrs {
protoAddrParts := strings.SplitN(protoAddr, "://", 2)
@@ -1626,7 +1591,15 @@ func ServeApi(job *engine.Job) engine.Status {
chErrors <- err
return
}
- chErrors <- srv.Serve()
+ job.Eng.OnShutdown(func() {
+ if err := srv.Close(); err != nil {
+ log.Error(err)
+ }
+ })
+ if err = srv.Serve(); err != nil && strings.Contains(err.Error(), "use of closed network connection") {
+ err = nil
+ }
+ chErrors <- err
}()
}
@@ -1639,15 +1612,3 @@ func ServeApi(job *engine.Job) engine.Status {
return engine.StatusOK
}
-
-func AcceptConnections(job *engine.Job) engine.Status {
- // Tell the init daemon we are accepting requests
- go systemd.SdNotify("READY=1")
-
- // close the lock so the listeners start accepting connections
- if activationLock != nil {
- close(activationLock)
- }
-
- return engine.StatusOK
-}
diff --git a/api/server/server_linux.go b/api/server/server_linux.go
new file mode 100644
index 0000000000..a9311573de
--- /dev/null
+++ b/api/server/server_linux.go
@@ -0,0 +1,105 @@
+// +build linux
+
+package server
+
+import (
+ "fmt"
+ "net/http"
+ "os"
+ "syscall"
+
+ "github.com/docker/docker/engine"
+ "github.com/docker/docker/pkg/systemd"
+)
+
+// NewServer sets up the required Server and does protocol specific checking.
+func NewServer(proto, addr string, job *engine.Job) (Server, error) {
+ // Basic error and sanity checking
+ switch proto {
+ case "fd":
+ return nil, serveFd(addr, job)
+ case "tcp":
+ return setupTcpHttp(addr, job)
+ case "unix":
+ return setupUnixHttp(addr, job)
+ default:
+ return nil, fmt.Errorf("Invalid protocol format.")
+ }
+}
+
+func setupUnixHttp(addr string, job *engine.Job) (*HttpServer, error) {
+ r := createRouter(job.Eng, job.GetenvBool("Logging"), job.GetenvBool("EnableCors"), job.Getenv("CorsHeaders"), job.Getenv("Version"))
+
+ if err := syscall.Unlink(addr); err != nil && !os.IsNotExist(err) {
+ return nil, err
+ }
+ mask := syscall.Umask(0777)
+ defer syscall.Umask(mask)
+
+ l, err := newListener("unix", addr, job.GetenvBool("BufferRequests"))
+ if err != nil {
+ return nil, err
+ }
+
+ if err := setSocketGroup(addr, job.Getenv("SocketGroup")); err != nil {
+ return nil, err
+ }
+
+ if err := os.Chmod(addr, 0660); err != nil {
+ return nil, err
+ }
+
+ return &HttpServer{&http.Server{Addr: addr, Handler: r}, l}, nil
+}
+
+// serveFd creates an http.Server and sets it up to serve given a socket activated
+// argument.
+func serveFd(addr string, job *engine.Job) error {
+ r := createRouter(job.Eng, job.GetenvBool("Logging"), job.GetenvBool("EnableCors"), job.Getenv("CorsHeaders"), job.Getenv("Version"))
+
+ ls, e := systemd.ListenFD(addr)
+ if e != nil {
+ return e
+ }
+
+ chErrors := make(chan error, len(ls))
+
+ // We don't want to start serving on these sockets until the
+ // daemon is initialized and installed. Otherwise required handlers
+ // won't be ready.
+ <-activationLock
+
+ // Since ListenFD will return one or more sockets we have
+ // to create a go func to spawn off multiple serves
+ for i := range ls {
+ listener := ls[i]
+ go func() {
+ httpSrv := http.Server{Handler: r}
+ chErrors <- httpSrv.Serve(listener)
+ }()
+ }
+
+ for i := 0; i < len(ls); i++ {
+ err := <-chErrors
+ if err != nil {
+ return err
+ }
+ }
+
+ return nil
+}
+
+// Called through eng.Job("acceptconnections")
+func AcceptConnections(job *engine.Job) engine.Status {
+ // Tell the init daemon we are accepting requests
+ go systemd.SdNotify("READY=1")
+
+ // close the lock so the listeners start accepting connections
+ select {
+ case <-activationLock:
+ default:
+ close(activationLock)
+ }
+
+ return engine.StatusOK
+}
diff --git a/api/server/server_windows.go b/api/server/server_windows.go
new file mode 100644
index 0000000000..c5d2c2ca56
--- /dev/null
+++ b/api/server/server_windows.go
@@ -0,0 +1,31 @@
+// +build windows
+
+package server
+
+import (
+ "fmt"
+
+ "github.com/docker/docker/engine"
+)
+
+// NewServer sets up the required Server and does protocol specific checking.
+func NewServer(proto, addr string, job *engine.Job) (Server, error) {
+ // Basic error and sanity checking
+ switch proto {
+ case "tcp":
+ return setupTcpHttp(addr, job)
+ default:
+ return nil, errors.New("Invalid protocol format. Windows only supports tcp.")
+ }
+}
+
+// Called through eng.Job("acceptconnections")
+func AcceptConnections(job *engine.Job) engine.Status {
+
+ // close the lock so the listeners start accepting connections
+ if activationLock != nil {
+ close(activationLock)
+ }
+
+ return engine.StatusOK
+}
diff --git a/api/stats/stats.go b/api/types/stats.go
index 8edf18fe0e..97804e95e6 100644
--- a/api/stats/stats.go
+++ b/api/types/stats.go
@@ -1,6 +1,6 @@
// This package is used for API stability in the types and response to the
// consumers of the API stats endpoint.
-package stats
+package types
import "time"
diff --git a/api/types/types.go b/api/types/types.go
new file mode 100644
index 0000000000..f1b1d041ea
--- /dev/null
+++ b/api/types/types.go
@@ -0,0 +1,11 @@
+package types
+
+// ContainerCreateResponse contains the information returned to a client on the
+// creation of a new container.
+type ContainerCreateResponse struct {
+ // ID is the ID of the created container.
+ ID string `json:"Id"`
+
+ // Warnings are any warnings encountered during the creation of the container.
+ Warnings []string `json:"Warnings"`
+}
diff --git a/builder/MAINTAINERS b/builder/MAINTAINERS
deleted file mode 100644
index e170c235a3..0000000000
--- a/builder/MAINTAINERS
+++ /dev/null
@@ -1,3 +0,0 @@
-Tibor Vass <teabee89@gmail.com> (@tiborvass)
-Erik Hollensbe <github@hollensbe.org> (@erikh)
-Doug Davis <dug@us.ibm.com> (@duglin)
diff --git a/builder/command/command.go b/builder/command/command.go
new file mode 100644
index 0000000000..16544f0267
--- /dev/null
+++ b/builder/command/command.go
@@ -0,0 +1,39 @@
+// This package contains the set of Dockerfile commands.
+package command
+
+const (
+ Env = "env"
+ Label = "label"
+ Maintainer = "maintainer"
+ Add = "add"
+ Copy = "copy"
+ From = "from"
+ Onbuild = "onbuild"
+ Workdir = "workdir"
+ Run = "run"
+ Cmd = "cmd"
+ Entrypoint = "entrypoint"
+ Expose = "expose"
+ Volume = "volume"
+ User = "user"
+ Insert = "insert"
+)
+
+// Commands is list of all Dockerfile commands
+var Commands = map[string]struct{}{
+ Env: {},
+ Label: {},
+ Maintainer: {},
+ Add: {},
+ Copy: {},
+ From: {},
+ Onbuild: {},
+ Workdir: {},
+ Run: {},
+ Cmd: {},
+ Entrypoint: {},
+ Expose: {},
+ Volume: {},
+ User: {},
+ Insert: {},
+}
diff --git a/builder/dispatchers.go b/builder/dispatchers.go
index 6108967c3b..4d21a75eb5 100644
--- a/builder/dispatchers.go
+++ b/builder/dispatchers.go
@@ -39,7 +39,7 @@ func nullDispatch(b *Builder, args []string, attributes map[string]bool, origina
//
func env(b *Builder, args []string, attributes map[string]bool, original string) error {
if len(args) == 0 {
- return fmt.Errorf("ENV is missing arguments")
+ return fmt.Errorf("ENV requires at least one argument")
}
if len(args)%2 != 0 {
@@ -78,13 +78,44 @@ func env(b *Builder, args []string, attributes map[string]bool, original string)
// Sets the maintainer metadata.
func maintainer(b *Builder, args []string, attributes map[string]bool, original string) error {
if len(args) != 1 {
- return fmt.Errorf("MAINTAINER requires only one argument")
+ return fmt.Errorf("MAINTAINER requires exactly one argument")
}
b.maintainer = args[0]
return b.commit("", b.Config.Cmd, fmt.Sprintf("MAINTAINER %s", b.maintainer))
}
+// LABEL some json data describing the image
+//
+// Sets the Label variable foo to bar,
+//
+func label(b *Builder, args []string, attributes map[string]bool, original string) error {
+ if len(args) == 0 {
+ return fmt.Errorf("LABEL requires at least one argument")
+ }
+ if len(args)%2 != 0 {
+ // should never get here, but just in case
+ return fmt.Errorf("Bad input to LABEL, too many args")
+ }
+
+ commitStr := "LABEL"
+
+ if b.Config.Labels == nil {
+ b.Config.Labels = map[string]string{}
+ }
+
+ for j := 0; j < len(args); j++ {
+ // name ==> args[j]
+ // value ==> args[j+1]
+ newVar := args[j] + "=" + args[j+1] + ""
+ commitStr += " " + newVar
+
+ b.Config.Labels[args[j]] = args[j+1]
+ j++
+ }
+ return b.commit("", b.Config.Cmd, commitStr)
+}
+
// ADD foo /path
//
// Add the file 'foo' to '/path'. Tarball and Remote URL (git, http) handling
@@ -159,6 +190,10 @@ func from(b *Builder, args []string, attributes map[string]bool, original string
// cases.
//
func onbuild(b *Builder, args []string, attributes map[string]bool, original string) error {
+ if len(args) == 0 {
+ return fmt.Errorf("ONBUILD requires at least one argument")
+ }
+
triggerInstruction := strings.ToUpper(strings.TrimSpace(args[0]))
switch triggerInstruction {
case "ONBUILD":
@@ -209,8 +244,8 @@ func run(b *Builder, args []string, attributes map[string]bool, original string)
args = handleJsonArgs(args, attributes)
- if len(args) == 1 {
- args = append([]string{"/bin/sh", "-c"}, args[0])
+ if !attributes["json"] {
+ args = append([]string{"/bin/sh", "-c"}, args...)
}
runCmd := flag.NewFlagSet("run", flag.ContinueOnError)
@@ -272,7 +307,7 @@ func cmd(b *Builder, args []string, attributes map[string]bool, original string)
b.Config.Cmd = append([]string{"/bin/sh", "-c"}, b.Config.Cmd...)
}
- if err := b.commit("", b.Config.Cmd, fmt.Sprintf("CMD %v", b.Config.Cmd)); err != nil {
+ if err := b.commit("", b.Config.Cmd, fmt.Sprintf("CMD %q", b.Config.Cmd)); err != nil {
return err
}
@@ -312,7 +347,7 @@ func entrypoint(b *Builder, args []string, attributes map[string]bool, original
b.Config.Cmd = nil
}
- if err := b.commit("", b.Config.Cmd, fmt.Sprintf("ENTRYPOINT %v", b.Config.Entrypoint)); err != nil {
+ if err := b.commit("", b.Config.Cmd, fmt.Sprintf("ENTRYPOINT %q", b.Config.Entrypoint)); err != nil {
return err
}
@@ -327,15 +362,27 @@ func entrypoint(b *Builder, args []string, attributes map[string]bool, original
func expose(b *Builder, args []string, attributes map[string]bool, original string) error {
portsTab := args
+ if len(args) == 0 {
+ return fmt.Errorf("EXPOSE requires at least one argument")
+ }
+
if b.Config.ExposedPorts == nil {
b.Config.ExposedPorts = make(nat.PortSet)
}
- ports, _, err := nat.ParsePortSpecs(append(portsTab, b.Config.PortSpecs...))
+ ports, bindingMap, err := nat.ParsePortSpecs(append(portsTab, b.Config.PortSpecs...))
if err != nil {
return err
}
+ for _, bindings := range bindingMap {
+ if bindings[0].HostIp != "" || bindings[0].HostPort != "" {
+ fmt.Fprintf(b.ErrStream, " ---> Using Dockerfile's EXPOSE instruction"+
+ " to map host ports to container ports (ip:hostPort:containerPort) is deprecated.\n"+
+ " Please use -p to publish the ports.\n")
+ }
+ }
+
// instead of using ports directly, we build a list of ports and sort it so
// the order is consistent. This prevents cache burst where map ordering
// changes between builds
@@ -373,13 +420,17 @@ func user(b *Builder, args []string, attributes map[string]bool, original string
//
func volume(b *Builder, args []string, attributes map[string]bool, original string) error {
if len(args) == 0 {
- return fmt.Errorf("Volume cannot be empty")
+ return fmt.Errorf("VOLUME requires at least one argument")
}
if b.Config.Volumes == nil {
b.Config.Volumes = map[string]struct{}{}
}
for _, v := range args {
+ v = strings.TrimSpace(v)
+ if v == "" {
+ return fmt.Errorf("Volume specified can not be an empty string")
+ }
b.Config.Volumes[v] = struct{}{}
}
if err := b.commit("", b.Config.Cmd, fmt.Sprintf("VOLUME %v", args)); err != nil {
diff --git a/builder/evaluator.go b/builder/evaluator.go
index b76c7f29bb..b74c1ba6ae 100644
--- a/builder/evaluator.go
+++ b/builder/evaluator.go
@@ -28,9 +28,12 @@ import (
"strings"
log "github.com/Sirupsen/logrus"
+ "github.com/docker/docker/api"
+ "github.com/docker/docker/builder/command"
"github.com/docker/docker/builder/parser"
"github.com/docker/docker/daemon"
"github.com/docker/docker/engine"
+ "github.com/docker/docker/pkg/common"
"github.com/docker/docker/pkg/fileutils"
"github.com/docker/docker/pkg/symlink"
"github.com/docker/docker/pkg/tarsum"
@@ -45,33 +48,35 @@ var (
// Environment variable interpolation will happen on these statements only.
var replaceEnvAllowed = map[string]struct{}{
- "env": {},
- "add": {},
- "copy": {},
- "workdir": {},
- "expose": {},
- "volume": {},
- "user": {},
+ command.Env: {},
+ command.Label: {},
+ command.Add: {},
+ command.Copy: {},
+ command.Workdir: {},
+ command.Expose: {},
+ command.Volume: {},
+ command.User: {},
}
var evaluateTable map[string]func(*Builder, []string, map[string]bool, string) error
func init() {
evaluateTable = map[string]func(*Builder, []string, map[string]bool, string) error{
- "env": env,
- "maintainer": maintainer,
- "add": add,
- "copy": dispatchCopy, // copy() is a go builtin
- "from": from,
- "onbuild": onbuild,
- "workdir": workdir,
- "run": run,
- "cmd": cmd,
- "entrypoint": entrypoint,
- "expose": expose,
- "volume": volume,
- "user": user,
- "insert": insert,
+ command.Env: env,
+ command.Label: label,
+ command.Maintainer: maintainer,
+ command.Add: add,
+ command.Copy: dispatchCopy, // copy() is a go builtin
+ command.From: from,
+ command.Onbuild: onbuild,
+ command.Workdir: workdir,
+ command.Run: run,
+ command.Cmd: cmd,
+ command.Entrypoint: entrypoint,
+ command.Expose: expose,
+ command.Volume: volume,
+ command.User: user,
+ command.Insert: insert,
}
}
@@ -88,12 +93,18 @@ type Builder struct {
Verbose bool
UtilizeCache bool
+ cacheBusted bool
// controls how images and containers are handled between steps.
Remove bool
ForceRemove bool
Pull bool
+ // set this to true if we want the builder to not commit between steps.
+ // This is useful when we only want to use the evaluator table to generate
+ // the final configs of the Dockerfile but dont want the layers
+ disableCommit bool
+
AuthConfig *registry.AuthConfig
AuthConfigFile *registry.ConfigFile
@@ -114,6 +125,14 @@ type Builder struct {
context tarsum.TarSum // the context is a tarball that is uploaded by the client
contextPath string // the path of the temporary directory the local context is unpacked to (server side)
noBaseImage bool // indicates that this build does not start from any base image, but is being built from an empty file system.
+
+ // Set resource restrictions for build containers
+ cpuSetCpus string
+ cpuShares int64
+ memory int64
+ memorySwap int64
+
+ cancelled <-chan struct{} // When closed, job was cancelled.
}
// Run the builder with the context. This is the lynchpin of this package. This
@@ -139,38 +158,63 @@ func (b *Builder) Run(context io.Reader) (string, error) {
}
}()
- if err := b.readDockerfile(b.dockerfileName); err != nil {
+ if err := b.readDockerfile(); err != nil {
return "", err
}
// some initializations that would not have been supplied by the caller.
b.Config = &runconfig.Config{}
+
b.TmpContainers = map[string]struct{}{}
for i, n := range b.dockerfile.Children {
+ select {
+ case <-b.cancelled:
+ log.Debug("Builder: build cancelled!")
+ fmt.Fprintf(b.OutStream, "Build cancelled")
+ return "", fmt.Errorf("Build cancelled")
+ default:
+ // Not cancelled yet, keep going...
+ }
if err := b.dispatch(i, n); err != nil {
if b.ForceRemove {
b.clearTmp()
}
return "", err
}
- fmt.Fprintf(b.OutStream, " ---> %s\n", utils.TruncateID(b.image))
+ fmt.Fprintf(b.OutStream, " ---> %s\n", common.TruncateID(b.image))
if b.Remove {
b.clearTmp()
}
}
if b.image == "" {
- return "", fmt.Errorf("No image was generated. Is your Dockerfile empty?\n")
+ return "", fmt.Errorf("No image was generated. Is your Dockerfile empty?")
}
- fmt.Fprintf(b.OutStream, "Successfully built %s\n", utils.TruncateID(b.image))
+ fmt.Fprintf(b.OutStream, "Successfully built %s\n", common.TruncateID(b.image))
return b.image, nil
}
// Reads a Dockerfile from the current context. It assumes that the
// 'filename' is a relative path from the root of the context
-func (b *Builder) readDockerfile(origFile string) error {
+func (b *Builder) readDockerfile() error {
+ // If no -f was specified then look for 'Dockerfile'. If we can't find
+ // that then look for 'dockerfile'. If neither are found then default
+ // back to 'Dockerfile' and use that in the error message.
+ if b.dockerfileName == "" {
+ b.dockerfileName = api.DefaultDockerfileName
+ tmpFN := filepath.Join(b.contextPath, api.DefaultDockerfileName)
+ if _, err := os.Lstat(tmpFN); err != nil {
+ tmpFN = filepath.Join(b.contextPath, strings.ToLower(api.DefaultDockerfileName))
+ if _, err := os.Lstat(tmpFN); err == nil {
+ b.dockerfileName = strings.ToLower(api.DefaultDockerfileName)
+ }
+ }
+ }
+
+ origFile := b.dockerfileName
+
filename, err := symlink.FollowSymlinkInScope(filepath.Join(b.contextPath, origFile), b.contextPath)
if err != nil {
return fmt.Errorf("The Dockerfile (%s) must be within the build context", origFile)
@@ -240,6 +284,9 @@ func (b *Builder) dispatch(stepN int, ast *parser.Node) error {
msg := fmt.Sprintf("Step %d : %s", stepN, strings.ToUpper(cmd))
if cmd == "onbuild" {
+ if ast.Next == nil {
+ return fmt.Errorf("ONBUILD requires at least one argument")
+ }
ast = ast.Next.Children[0]
strs = append(strs, ast.Value)
msg += " " + ast.Value
@@ -265,7 +312,11 @@ func (b *Builder) dispatch(stepN int, ast *parser.Node) error {
var str string
str = ast.Value
if _, ok := replaceEnvAllowed[cmd]; ok {
- str = b.replaceEnv(ast.Value)
+ var err error
+ str, err = ProcessWord(ast.Value, b.Config.Env)
+ if err != nil {
+ return err
+ }
}
strList[i+l] = str
msgList[i] = ast.Value
@@ -281,7 +332,5 @@ func (b *Builder) dispatch(stepN int, ast *parser.Node) error {
return f(b, strList, attrs, original)
}
- fmt.Fprintf(b.ErrStream, "# Skipping unknown instruction %s\n", strings.ToUpper(cmd))
-
- return nil
+ return fmt.Errorf("Unknown instruction: %s", strings.ToUpper(cmd))
}
diff --git a/builder/internals.go b/builder/internals.go
index ddbef108a0..7c22b47b2b 100644
--- a/builder/internals.go
+++ b/builder/internals.go
@@ -25,13 +25,16 @@ import (
imagepkg "github.com/docker/docker/image"
"github.com/docker/docker/pkg/archive"
"github.com/docker/docker/pkg/chrootarchive"
+ "github.com/docker/docker/pkg/common"
"github.com/docker/docker/pkg/ioutils"
"github.com/docker/docker/pkg/parsers"
+ "github.com/docker/docker/pkg/progressreader"
"github.com/docker/docker/pkg/symlink"
"github.com/docker/docker/pkg/system"
"github.com/docker/docker/pkg/tarsum"
"github.com/docker/docker/pkg/urlutil"
"github.com/docker/docker/registry"
+ "github.com/docker/docker/runconfig"
"github.com/docker/docker/utils"
)
@@ -59,6 +62,9 @@ func (b *Builder) readContext(context io.Reader) error {
}
func (b *Builder) commit(id string, autoCmd []string, comment string) error {
+ if b.disableCommit {
+ return nil
+ }
if b.image == "" && !b.noBaseImage {
return fmt.Errorf("Please provide a source image with `from` prior to commit")
}
@@ -87,9 +93,9 @@ func (b *Builder) commit(id string, autoCmd []string, comment string) error {
}
defer container.Unmount()
}
- container := b.Daemon.Get(id)
- if container == nil {
- return fmt.Errorf("An error occured while creating the container")
+ container, err := b.Daemon.Get(id)
+ if err != nil {
+ return err
}
// Note: Actually copy the struct
@@ -183,8 +189,8 @@ func (b *Builder) runContextCommand(args []string, allowRemote bool, allowDecomp
if err != nil {
return err
}
- // If we do not have at least one hash, never use the cache
- if hit && b.UtilizeCache {
+
+ if hit {
return nil
}
@@ -264,7 +270,15 @@ func calcCopyInfo(b *Builder, cmdName string, cInfos *[]*copyInfo, origPath stri
}
// Download and dump result to tmp file
- if _, err := io.Copy(tmpFile, utils.ProgressReader(resp.Body, int(resp.ContentLength), b.OutOld, b.StreamFormatter, true, "", "Downloading")); err != nil {
+ if _, err := io.Copy(tmpFile, progressreader.New(progressreader.Config{
+ In: resp.Body,
+ Out: b.OutOld,
+ Formatter: b.StreamFormatter,
+ Size: int(resp.ContentLength),
+ NewLines: true,
+ ID: "",
+ Action: "Downloading",
+ })); err != nil {
tmpFile.Close()
return err
}
@@ -498,19 +512,24 @@ func (b *Builder) processImageFrom(img *imagepkg.Image) error {
// `(true, nil)`. If no image is found, it returns `(false, nil)`. If there
// is any error, it returns `(false, err)`.
func (b *Builder) probeCache() (bool, error) {
- if b.UtilizeCache {
- if cache, err := b.Daemon.ImageGetCached(b.image, b.Config); err != nil {
- return false, err
- } else if cache != nil {
- fmt.Fprintf(b.OutStream, " ---> Using cache\n")
- log.Debugf("[BUILDER] Use cached version")
- b.image = cache.ID
- return true, nil
- } else {
- log.Debugf("[BUILDER] Cache miss")
- }
- }
- return false, nil
+ if !b.UtilizeCache || b.cacheBusted {
+ return false, nil
+ }
+
+ cache, err := b.Daemon.ImageGetCached(b.image, b.Config)
+ if err != nil {
+ return false, err
+ }
+ if cache == nil {
+ log.Debugf("[BUILDER] Cache miss")
+ b.cacheBusted = true
+ return false, nil
+ }
+
+ fmt.Fprintf(b.OutStream, " ---> Using cache\n")
+ log.Debugf("[BUILDER] Use cached version")
+ b.image = cache.ID
+ return true, nil
}
func (b *Builder) create() (*daemon.Container, error) {
@@ -519,10 +538,17 @@ func (b *Builder) create() (*daemon.Container, error) {
}
b.Config.Image = b.image
+ hostConfig := &runconfig.HostConfig{
+ CpuShares: b.cpuShares,
+ CpusetCpus: b.cpuSetCpus,
+ Memory: b.memory,
+ MemorySwap: b.memorySwap,
+ }
+
config := *b.Config
// Create the container
- c, warnings, err := b.Daemon.Create(b.Config, nil, "")
+ c, warnings, err := b.Daemon.Create(b.Config, hostConfig, "")
if err != nil {
return nil, err
}
@@ -531,7 +557,7 @@ func (b *Builder) create() (*daemon.Container, error) {
}
b.TmpContainers[c.ID] = struct{}{}
- fmt.Fprintf(b.OutStream, " ---> Running in %s\n", utils.TruncateID(c.ID))
+ fmt.Fprintf(b.OutStream, " ---> Running in %s\n", common.TruncateID(c.ID))
if len(config.Cmd) > 0 {
// override the entry point that may have been picked up from the base image
@@ -545,19 +571,30 @@ func (b *Builder) create() (*daemon.Container, error) {
}
func (b *Builder) run(c *daemon.Container) error {
+ var errCh chan error
+ if b.Verbose {
+ errCh = b.Daemon.Attach(&c.StreamConfig, c.Config.OpenStdin, c.Config.StdinOnce, c.Config.Tty, nil, b.OutStream, b.ErrStream)
+ }
+
//start the container
if err := c.Start(); err != nil {
return err
}
+ finished := make(chan struct{})
+ defer close(finished)
+ go func() {
+ select {
+ case <-b.cancelled:
+ log.Debugln("Build cancelled, killing container:", c.ID)
+ c.Kill()
+ case <-finished:
+ }
+ }()
+
if b.Verbose {
- logsJob := b.Engine.Job("logs", c.ID)
- logsJob.Setenv("follow", "1")
- logsJob.Setenv("stdout", "1")
- logsJob.Setenv("stderr", "1")
- logsJob.Stdout.Add(b.OutStream)
- logsJob.Stderr.Set(b.ErrStream)
- if err := logsJob.Run(); err != nil {
+ // Block on reading output from container, stop on err or chan closed
+ if err := <-errCh; err != nil {
return err
}
}
@@ -710,13 +747,17 @@ func fixPermissions(source, destination string, uid, gid int, destExisted bool)
func (b *Builder) clearTmp() {
for c := range b.TmpContainers {
- tmp := b.Daemon.Get(c)
- if err := b.Daemon.Destroy(tmp); err != nil {
- fmt.Fprintf(b.OutStream, "Error removing intermediate container %s: %s\n", utils.TruncateID(c), err.Error())
+ tmp, err := b.Daemon.Get(c)
+ if err != nil {
+ fmt.Fprint(b.OutStream, err.Error())
+ }
+
+ if err := b.Daemon.Rm(tmp); err != nil {
+ fmt.Fprintf(b.OutStream, "Error removing intermediate container %s: %v\n", common.TruncateID(c), err)
return
}
b.Daemon.DeleteVolumes(tmp.VolumePaths())
delete(b.TmpContainers, c)
- fmt.Fprintf(b.OutStream, "Removing intermediate container %s\n", utils.TruncateID(c))
+ fmt.Fprintf(b.OutStream, "Removing intermediate container %s\n", common.TruncateID(c))
}
}
diff --git a/builder/job.go b/builder/job.go
index 53490b7e57..59df87e8c6 100644
--- a/builder/job.go
+++ b/builder/job.go
@@ -1,12 +1,16 @@
package builder
import (
+ "bytes"
+ "encoding/json"
"io"
"io/ioutil"
"os"
"os/exec"
+ "strings"
"github.com/docker/docker/api"
+ "github.com/docker/docker/builder/parser"
"github.com/docker/docker/daemon"
"github.com/docker/docker/engine"
"github.com/docker/docker/graph"
@@ -14,9 +18,22 @@ import (
"github.com/docker/docker/pkg/parsers"
"github.com/docker/docker/pkg/urlutil"
"github.com/docker/docker/registry"
+ "github.com/docker/docker/runconfig"
"github.com/docker/docker/utils"
)
+// whitelist of commands allowed for a commit/import
+var validCommitCommands = map[string]bool{
+ "entrypoint": true,
+ "cmd": true,
+ "user": true,
+ "workdir": true,
+ "env": true,
+ "volume": true,
+ "expose": true,
+ "onbuild": true,
+}
+
type BuilderJob struct {
Engine *engine.Engine
Daemon *daemon.Daemon
@@ -24,6 +41,7 @@ type BuilderJob struct {
func (b *BuilderJob) Install() {
b.Engine.Register("build", b.CmdBuild)
+ b.Engine.Register("build_config", b.CmdBuildConfig)
}
func (b *BuilderJob) CmdBuild(job *engine.Job) engine.Status {
@@ -39,6 +57,10 @@ func (b *BuilderJob) CmdBuild(job *engine.Job) engine.Status {
rm = job.GetenvBool("rm")
forceRm = job.GetenvBool("forcerm")
pull = job.GetenvBool("pull")
+ memory = job.GetenvInt64("memory")
+ memorySwap = job.GetenvInt64("memswap")
+ cpuShares = job.GetenvInt64("cpushares")
+ cpuSetCpus = job.Getenv("cpusetcpus")
authConfig = &registry.AuthConfig{}
configFile = &registry.ConfigFile{}
tag string
@@ -60,10 +82,6 @@ func (b *BuilderJob) CmdBuild(job *engine.Job) engine.Status {
}
}
- if dockerfileName == "" {
- dockerfileName = api.DefaultDockerfileName
- }
-
if remoteURL == "" {
context = ioutil.NopCloser(job.Stdin)
} else if urlutil.IsGitURL(remoteURL) {
@@ -95,6 +113,11 @@ func (b *BuilderJob) CmdBuild(job *engine.Job) engine.Status {
if err != nil {
return job.Error(err)
}
+
+ // When we're downloading just a Dockerfile put it in
+ // the default name - don't allow the client to move/specify it
+ dockerfileName = api.DefaultDockerfileName
+
c, err := archive.Generate(dockerfileName, string(dockerFile))
if err != nil {
return job.Error(err)
@@ -126,6 +149,11 @@ func (b *BuilderJob) CmdBuild(job *engine.Job) engine.Status {
AuthConfig: authConfig,
AuthConfigFile: configFile,
dockerfileName: dockerfileName,
+ cpuShares: cpuShares,
+ cpuSetCpus: cpuSetCpus,
+ memory: memory,
+ memorySwap: memorySwap,
+ cancelled: job.WaitCancelled(),
}
id, err := builder.Run(context)
@@ -138,3 +166,50 @@ func (b *BuilderJob) CmdBuild(job *engine.Job) engine.Status {
}
return engine.StatusOK
}
+
+func (b *BuilderJob) CmdBuildConfig(job *engine.Job) engine.Status {
+ if len(job.Args) != 0 {
+ return job.Errorf("Usage: %s\n", job.Name)
+ }
+
+ var (
+ changes = job.GetenvList("changes")
+ newConfig runconfig.Config
+ )
+
+ if err := job.GetenvJson("config", &newConfig); err != nil {
+ return job.Error(err)
+ }
+
+ ast, err := parser.Parse(bytes.NewBufferString(strings.Join(changes, "\n")))
+ if err != nil {
+ return job.Error(err)
+ }
+
+ // ensure that the commands are valid
+ for _, n := range ast.Children {
+ if !validCommitCommands[n.Value] {
+ return job.Errorf("%s is not a valid change command", n.Value)
+ }
+ }
+
+ builder := &Builder{
+ Daemon: b.Daemon,
+ Engine: b.Engine,
+ Config: &newConfig,
+ OutStream: ioutil.Discard,
+ ErrStream: ioutil.Discard,
+ disableCommit: true,
+ }
+
+ for i, n := range ast.Children {
+ if err := builder.dispatch(i, n); err != nil {
+ return job.Error(err)
+ }
+ }
+
+ if err := json.NewEncoder(job.Stdout).Encode(builder.Config); err != nil {
+ return job.Error(err)
+ }
+ return engine.StatusOK
+}
diff --git a/builder/parser/line_parsers.go b/builder/parser/line_parsers.go
index 8a94e1e5db..3026a0b06d 100644
--- a/builder/parser/line_parsers.go
+++ b/builder/parser/line_parsers.go
@@ -30,6 +30,10 @@ func parseIgnore(rest string) (*Node, map[string]bool, error) {
// ONBUILD RUN foo bar -> (onbuild (run foo bar))
//
func parseSubCommand(rest string) (*Node, map[string]bool, error) {
+ if rest == "" {
+ return nil, nil, nil
+ }
+
_, child, err := parseLine(rest)
if err != nil {
return nil, nil, err
@@ -40,10 +44,10 @@ func parseSubCommand(rest string) (*Node, map[string]bool, error) {
// parse environment like statements. Note that this does *not* handle
// variable interpolation, which will be handled in the evaluator.
-func parseEnv(rest string) (*Node, map[string]bool, error) {
+func parseNameVal(rest string, key string) (*Node, map[string]bool, error) {
// This is kind of tricky because we need to support the old
- // variant: ENV name value
- // as well as the new one: ENV name=value ...
+ // variant: KEY name value
+ // as well as the new one: KEY name=value ...
// The trigger to know which one is being used will be whether we hit
// a space or = first. space ==> old, "=" ==> new
@@ -86,7 +90,7 @@ func parseEnv(rest string) (*Node, map[string]bool, error) {
if blankOK || len(word) > 0 {
words = append(words, word)
- // Look for = and if no there assume
+ // Look for = and if not there assume
// we're doing the old stuff and
// just read the rest of the line
if !strings.Contains(word, "=") {
@@ -103,12 +107,15 @@ func parseEnv(rest string) (*Node, map[string]bool, error) {
quote = ch
blankOK = true
phase = inQuote
- continue
}
if ch == '\\' {
if pos+1 == len(rest) {
continue // just skip \ at end
}
+ // If we're not quoted and we see a \, then always just
+ // add \ plus the char to the word, even if the char
+ // is a quote.
+ word += string(ch)
pos++
ch = rune(rest[pos])
}
@@ -118,25 +125,27 @@ func parseEnv(rest string) (*Node, map[string]bool, error) {
if phase == inQuote {
if ch == quote {
phase = inWord
- continue
}
- if ch == '\\' {
+ // \ is special except for ' quotes - can't escape anything for '
+ if ch == '\\' && quote != '\'' {
if pos+1 == len(rest) {
phase = inWord
continue // just skip \ at end
}
pos++
- ch = rune(rest[pos])
+ nextCh := rune(rest[pos])
+ word += string(ch)
+ ch = nextCh
}
word += string(ch)
}
}
if len(words) == 0 {
- return nil, nil, fmt.Errorf("ENV must have some arguments")
+ return nil, nil, nil
}
- // Old format (ENV name value)
+ // Old format (KEY name value)
var rootnode *Node
if !strings.Contains(words[0], "=") {
@@ -145,7 +154,7 @@ func parseEnv(rest string) (*Node, map[string]bool, error) {
strs := TOKEN_WHITESPACE.Split(rest, 2)
if len(strs) < 2 {
- return nil, nil, fmt.Errorf("ENV must have two arguments")
+ return nil, nil, fmt.Errorf(key + " must have two arguments")
}
node.Value = strs[0]
@@ -178,9 +187,21 @@ func parseEnv(rest string) (*Node, map[string]bool, error) {
return rootnode, nil, nil
}
+func parseEnv(rest string) (*Node, map[string]bool, error) {
+ return parseNameVal(rest, "ENV")
+}
+
+func parseLabel(rest string) (*Node, map[string]bool, error) {
+ return parseNameVal(rest, "LABEL")
+}
+
// parses a whitespace-delimited set of arguments. The result is effectively a
// linked list of string arguments.
func parseStringsWhitespaceDelimited(rest string) (*Node, map[string]bool, error) {
+ if rest == "" {
+ return nil, nil, nil
+ }
+
node := &Node{}
rootnode := node
prevnode := node
@@ -201,6 +222,9 @@ func parseStringsWhitespaceDelimited(rest string) (*Node, map[string]bool, error
// parsestring just wraps the string in quotes and returns a working node.
func parseString(rest string) (*Node, map[string]bool, error) {
+ if rest == "" {
+ return nil, nil, nil
+ }
n := &Node{}
n.Value = rest
return n, nil, nil
@@ -235,7 +259,9 @@ func parseJSON(rest string) (*Node, map[string]bool, error) {
// so, passes to parseJSON; if not, quotes the result and returns a single
// node.
func parseMaybeJSON(rest string) (*Node, map[string]bool, error) {
- rest = strings.TrimSpace(rest)
+ if rest == "" {
+ return nil, nil, nil
+ }
node, attrs, err := parseJSON(rest)
@@ -255,8 +281,6 @@ func parseMaybeJSON(rest string) (*Node, map[string]bool, error) {
// so, passes to parseJSON; if not, attmpts to parse it as a whitespace
// delimited string.
func parseMaybeJSONToList(rest string) (*Node, map[string]bool, error) {
- rest = strings.TrimSpace(rest)
-
node, attrs, err := parseJSON(rest)
if err == nil {
diff --git a/builder/parser/parser.go b/builder/parser/parser.go
index a0806c6f9a..1ab151b30d 100644
--- a/builder/parser/parser.go
+++ b/builder/parser/parser.go
@@ -3,11 +3,12 @@ package parser
import (
"bufio"
- "fmt"
"io"
"regexp"
"strings"
"unicode"
+
+ "github.com/docker/docker/builder/command"
)
// Node is a structure used to represent a parse tree.
@@ -42,23 +43,24 @@ func init() {
// The command is parsed and mapped to the line parser. The line parser
// recieves the arguments but not the command, and returns an AST after
// reformulating the arguments according to the rules in the parser
- // functions. Errors are propogated up by Parse() and the resulting AST can
+ // functions. Errors are propagated up by Parse() and the resulting AST can
// be incorporated directly into the existing AST as a next.
dispatch = map[string]func(string) (*Node, map[string]bool, error){
- "user": parseString,
- "onbuild": parseSubCommand,
- "workdir": parseString,
- "env": parseEnv,
- "maintainer": parseString,
- "from": parseString,
- "add": parseMaybeJSONToList,
- "copy": parseMaybeJSONToList,
- "run": parseMaybeJSON,
- "cmd": parseMaybeJSON,
- "entrypoint": parseMaybeJSON,
- "expose": parseStringsWhitespaceDelimited,
- "volume": parseMaybeJSONToList,
- "insert": parseIgnore,
+ command.User: parseString,
+ command.Onbuild: parseSubCommand,
+ command.Workdir: parseString,
+ command.Env: parseEnv,
+ command.Label: parseLabel,
+ command.Maintainer: parseString,
+ command.From: parseString,
+ command.Add: parseMaybeJSONToList,
+ command.Copy: parseMaybeJSONToList,
+ command.Run: parseMaybeJSON,
+ command.Cmd: parseMaybeJSON,
+ command.Entrypoint: parseMaybeJSON,
+ command.Expose: parseStringsWhitespaceDelimited,
+ command.Volume: parseMaybeJSONToList,
+ command.Insert: parseIgnore,
}
}
@@ -78,10 +80,6 @@ func parseLine(line string) (string, *Node, error) {
return "", nil, err
}
- if len(args) == 0 {
- return "", nil, fmt.Errorf("Instruction %q is empty; cannot continue", cmd)
- }
-
node := &Node{}
node.Value = cmd
diff --git a/builder/parser/parser_test.go b/builder/parser/parser_test.go
index daceb9839c..6b55a611ec 100644
--- a/builder/parser/parser_test.go
+++ b/builder/parser/parser_test.go
@@ -11,7 +11,7 @@ import (
const testDir = "testfiles"
const negativeTestDir = "testfiles-negative"
-func getDirs(t *testing.T, dir string) []os.FileInfo {
+func getDirs(t *testing.T, dir string) []string {
f, err := os.Open(dir)
if err != nil {
t.Fatal(err)
@@ -19,7 +19,7 @@ func getDirs(t *testing.T, dir string) []os.FileInfo {
defer f.Close()
- dirs, err := f.Readdir(0)
+ dirs, err := f.Readdirnames(0)
if err != nil {
t.Fatal(err)
}
@@ -29,16 +29,16 @@ func getDirs(t *testing.T, dir string) []os.FileInfo {
func TestTestNegative(t *testing.T) {
for _, dir := range getDirs(t, negativeTestDir) {
- dockerfile := filepath.Join(negativeTestDir, dir.Name(), "Dockerfile")
+ dockerfile := filepath.Join(negativeTestDir, dir, "Dockerfile")
df, err := os.Open(dockerfile)
if err != nil {
- t.Fatalf("Dockerfile missing for %s: %s", dir.Name(), err.Error())
+ t.Fatalf("Dockerfile missing for %s: %v", dir, err)
}
_, err = Parse(df)
if err == nil {
- t.Fatalf("No error parsing broken dockerfile for %s", dir.Name())
+ t.Fatalf("No error parsing broken dockerfile for %s", dir)
}
df.Close()
@@ -47,29 +47,29 @@ func TestTestNegative(t *testing.T) {
func TestTestData(t *testing.T) {
for _, dir := range getDirs(t, testDir) {
- dockerfile := filepath.Join(testDir, dir.Name(), "Dockerfile")
- resultfile := filepath.Join(testDir, dir.Name(), "result")
+ dockerfile := filepath.Join(testDir, dir, "Dockerfile")
+ resultfile := filepath.Join(testDir, dir, "result")
df, err := os.Open(dockerfile)
if err != nil {
- t.Fatalf("Dockerfile missing for %s: %s", dir.Name(), err.Error())
+ t.Fatalf("Dockerfile missing for %s: %v", dir, err)
}
defer df.Close()
ast, err := Parse(df)
if err != nil {
- t.Fatalf("Error parsing %s's dockerfile: %s", dir.Name(), err.Error())
+ t.Fatalf("Error parsing %s's dockerfile: %v", dir, err)
}
content, err := ioutil.ReadFile(resultfile)
if err != nil {
- t.Fatalf("Error reading %s's result file: %s", dir.Name(), err.Error())
+ t.Fatalf("Error reading %s's result file: %v", dir, err)
}
if ast.Dump()+"\n" != string(content) {
fmt.Fprintln(os.Stderr, "Result:\n"+ast.Dump())
fmt.Fprintln(os.Stderr, "Expected:\n"+string(content))
- t.Fatalf("%s: AST dump of dockerfile does not match result", dir.Name())
+ t.Fatalf("%s: AST dump of dockerfile does not match result", dir)
}
}
}
diff --git a/builder/parser/testfiles-negative/empty-instruction/Dockerfile b/builder/parser/testfiles-negative/empty-instruction/Dockerfile
deleted file mode 100644
index 74e625a402..0000000000
--- a/builder/parser/testfiles-negative/empty-instruction/Dockerfile
+++ /dev/null
@@ -1,8 +0,0 @@
-FROM dockerfile/rabbitmq
-
-RUN
- rabbitmq-plugins enable \
- rabbitmq_shovel \
- rabbitmq_shovel_management \
- rabbitmq_federation \
- rabbitmq_federation_management
diff --git a/builder/parser/testfiles-negative/html-page-yes-really-thanks-lk4d4/Dockerfile b/builder/parser/testfiles-negative/html-page-yes-really-thanks-lk4d4/Dockerfile
deleted file mode 100644
index 90531a4b3e..0000000000
--- a/builder/parser/testfiles-negative/html-page-yes-really-thanks-lk4d4/Dockerfile
+++ /dev/null
@@ -1,2 +0,0 @@
-<html>
-</html>
diff --git a/builder/parser/testfiles/env/Dockerfile b/builder/parser/testfiles/env/Dockerfile
index bb78503cce..08fa18acec 100644
--- a/builder/parser/testfiles/env/Dockerfile
+++ b/builder/parser/testfiles/env/Dockerfile
@@ -7,6 +7,14 @@ ENV name=value\ value2
ENV name="value'quote space'value2"
ENV name='value"double quote"value2'
ENV name=value\ value2 name2=value2\ value3
+ENV name="a\"b"
+ENV name="a\'b"
+ENV name='a\'b'
+ENV name='a\'b''
+ENV name='a\"b'
+ENV name="''"
+# don't put anything after the next line - it must be the last line of the
+# Dockerfile and it must end with \
ENV name=value \
name1=value1 \
name2="value2a \
diff --git a/builder/parser/testfiles/env/result b/builder/parser/testfiles/env/result
index a473d0fa39..ba0a6dd7cb 100644
--- a/builder/parser/testfiles/env/result
+++ b/builder/parser/testfiles/env/result
@@ -2,9 +2,15 @@
(env "name" "value")
(env "name" "value")
(env "name" "value" "name2" "value2")
-(env "name" "value value1")
-(env "name" "value value2")
-(env "name" "value'quote space'value2")
-(env "name" "value\"double quote\"value2")
-(env "name" "value value2" "name2" "value2 value3")
-(env "name" "value" "name1" "value1" "name2" "value2a value2b" "name3" "value3an\"value3b\"" "name4" "value4a\\nvalue4b")
+(env "name" "\"value value1\"")
+(env "name" "value\\ value2")
+(env "name" "\"value'quote space'value2\"")
+(env "name" "'value\"double quote\"value2'")
+(env "name" "value\\ value2" "name2" "value2\\ value3")
+(env "name" "\"a\\\"b\"")
+(env "name" "\"a\\'b\"")
+(env "name" "'a\\'b'")
+(env "name" "'a\\'b''")
+(env "name" "'a\\\"b'")
+(env "name" "\"''\"")
+(env "name" "value" "name1" "value1" "name2" "\"value2a value2b\"" "name3" "\"value3a\\n\\\"value3b\\\"\"" "name4" "\"value4a\\\\nvalue4b\"")
diff --git a/builder/parser/utils.go b/builder/parser/utils.go
index 3a8cd24e8c..a60ad129fe 100644
--- a/builder/parser/utils.go
+++ b/builder/parser/utils.go
@@ -1,7 +1,6 @@
package parser
import (
- "fmt"
"strconv"
"strings"
)
@@ -50,16 +49,19 @@ func fullDispatch(cmd, args string) (*Node, map[string]bool, error) {
// splitCommand takes a single line of text and parses out the cmd and args,
// which are used for dispatching to more exact parsing functions.
func splitCommand(line string) (string, string, error) {
- cmdline := TOKEN_WHITESPACE.Split(line, 2)
+ var args string
- if len(cmdline) != 2 {
- return "", "", fmt.Errorf("We do not understand this file. Please ensure it is a valid Dockerfile. Parser error at %q", line)
+ // Make sure we get the same results irrespective of leading/trailing spaces
+ cmdline := TOKEN_WHITESPACE.Split(strings.TrimSpace(line), 2)
+ cmd := strings.ToLower(cmdline[0])
+
+ if len(cmdline) == 2 {
+ args = strings.TrimSpace(cmdline[1])
}
- cmd := strings.ToLower(cmdline[0])
// the cmd should never have whitespace, but it's possible for the args to
// have trailing whitespace.
- return cmd, strings.TrimSpace(cmdline[1]), nil
+ return cmd, args, nil
}
// covers comments and empty lines. Lines should be trimmed before passing to
diff --git a/builder/shell_parser.go b/builder/shell_parser.go
new file mode 100644
index 0000000000..b8c746773c
--- /dev/null
+++ b/builder/shell_parser.go
@@ -0,0 +1,209 @@
+package builder
+
+// This will take a single word and an array of env variables and
+// process all quotes (" and ') as well as $xxx and ${xxx} env variable
+// tokens. Tries to mimic bash shell process.
+// It doesn't support all flavors of ${xx:...} formats but new ones can
+// be added by adding code to the "special ${} format processing" section
+
+import (
+ "fmt"
+ "strings"
+ "unicode"
+)
+
+type shellWord struct {
+ word string
+ envs []string
+ pos int
+}
+
+func ProcessWord(word string, env []string) (string, error) {
+ sw := &shellWord{
+ word: word,
+ envs: env,
+ pos: 0,
+ }
+ return sw.process()
+}
+
+func (sw *shellWord) process() (string, error) {
+ return sw.processStopOn('\000')
+}
+
+// Process the word, starting at 'pos', and stop when we get to the
+// end of the word or the 'stopChar' character
+func (sw *shellWord) processStopOn(stopChar rune) (string, error) {
+ var result string
+ var charFuncMapping = map[rune]func() (string, error){
+ '\'': sw.processSingleQuote,
+ '"': sw.processDoubleQuote,
+ '$': sw.processDollar,
+ }
+
+ for sw.pos < len(sw.word) {
+ ch := sw.peek()
+ if stopChar != '\000' && ch == stopChar {
+ sw.next()
+ break
+ }
+ if fn, ok := charFuncMapping[ch]; ok {
+ // Call special processing func for certain chars
+ tmp, err := fn()
+ if err != nil {
+ return "", err
+ }
+ result += tmp
+ } else {
+ // Not special, just add it to the result
+ ch = sw.next()
+ if ch == '\\' {
+ // '\' escapes, except end of line
+ ch = sw.next()
+ if ch == '\000' {
+ continue
+ }
+ }
+ result += string(ch)
+ }
+ }
+
+ return result, nil
+}
+
+func (sw *shellWord) peek() rune {
+ if sw.pos == len(sw.word) {
+ return '\000'
+ }
+ return rune(sw.word[sw.pos])
+}
+
+func (sw *shellWord) next() rune {
+ if sw.pos == len(sw.word) {
+ return '\000'
+ }
+ ch := rune(sw.word[sw.pos])
+ sw.pos++
+ return ch
+}
+
+func (sw *shellWord) processSingleQuote() (string, error) {
+ // All chars between single quotes are taken as-is
+ // Note, you can't escape '
+ var result string
+
+ sw.next()
+
+ for {
+ ch := sw.next()
+ if ch == '\000' || ch == '\'' {
+ break
+ }
+ result += string(ch)
+ }
+ return result, nil
+}
+
+func (sw *shellWord) processDoubleQuote() (string, error) {
+ // All chars up to the next " are taken as-is, even ', except any $ chars
+ // But you can escape " with a \
+ var result string
+
+ sw.next()
+
+ for sw.pos < len(sw.word) {
+ ch := sw.peek()
+ if ch == '"' {
+ sw.next()
+ break
+ }
+ if ch == '$' {
+ tmp, err := sw.processDollar()
+ if err != nil {
+ return "", err
+ }
+ result += tmp
+ } else {
+ ch = sw.next()
+ if ch == '\\' {
+ chNext := sw.peek()
+
+ if chNext == '\000' {
+ // Ignore \ at end of word
+ continue
+ }
+
+ if chNext == '"' || chNext == '$' {
+ // \" and \$ can be escaped, all other \'s are left as-is
+ ch = sw.next()
+ }
+ }
+ result += string(ch)
+ }
+ }
+
+ return result, nil
+}
+
+func (sw *shellWord) processDollar() (string, error) {
+ sw.next()
+ ch := sw.peek()
+ if ch == '{' {
+ sw.next()
+ name := sw.processName()
+ ch = sw.peek()
+ if ch == '}' {
+ // Normal ${xx} case
+ sw.next()
+ return sw.getEnv(name), nil
+ }
+ return "", fmt.Errorf("Unsupported ${} substitution: %s", sw.word)
+ } else {
+ // $xxx case
+ name := sw.processName()
+ if name == "" {
+ return "$", nil
+ }
+ return sw.getEnv(name), nil
+ }
+}
+
+func (sw *shellWord) processName() string {
+ // Read in a name (alphanumeric or _)
+ // If it starts with a numeric then just return $#
+ var name string
+
+ for sw.pos < len(sw.word) {
+ ch := sw.peek()
+ if len(name) == 0 && unicode.IsDigit(ch) {
+ ch = sw.next()
+ return string(ch)
+ }
+ if !unicode.IsLetter(ch) && !unicode.IsDigit(ch) && ch != '_' {
+ break
+ }
+ ch = sw.next()
+ name += string(ch)
+ }
+
+ return name
+}
+
+func (sw *shellWord) getEnv(name string) string {
+ for _, env := range sw.envs {
+ i := strings.Index(env, "=")
+ if i < 0 {
+ if name == env {
+ // Should probably never get here, but just in case treat
+ // it like "var" and "var=" are the same
+ return ""
+ }
+ continue
+ }
+ if name != env[:i] {
+ continue
+ }
+ return env[i+1:]
+ }
+ return ""
+}
diff --git a/builder/shell_parser_test.go b/builder/shell_parser_test.go
new file mode 100644
index 0000000000..79260492f3
--- /dev/null
+++ b/builder/shell_parser_test.go
@@ -0,0 +1,51 @@
+package builder
+
+import (
+ "bufio"
+ "os"
+ "strings"
+ "testing"
+)
+
+func TestShellParser(t *testing.T) {
+ file, err := os.Open("words")
+ if err != nil {
+ t.Fatalf("Can't open 'words': %s", err)
+ }
+ defer file.Close()
+
+ scanner := bufio.NewScanner(file)
+ envs := []string{"PWD=/home", "SHELL=bash"}
+ for scanner.Scan() {
+ line := scanner.Text()
+
+ // Trim comments and blank lines
+ i := strings.Index(line, "#")
+ if i >= 0 {
+ line = line[:i]
+ }
+ line = strings.TrimSpace(line)
+
+ if line == "" {
+ continue
+ }
+
+ words := strings.Split(line, "|")
+ if len(words) != 2 {
+ t.Fatalf("Error in 'words' - should be 2 words:%q", words)
+ }
+
+ words[0] = strings.TrimSpace(words[0])
+ words[1] = strings.TrimSpace(words[1])
+
+ newWord, err := ProcessWord(words[0], envs)
+
+ if err != nil {
+ newWord = "error"
+ }
+
+ if newWord != words[1] {
+ t.Fatalf("Error. Src: %s Calc: %s Expected: %s", words[0], newWord, words[1])
+ }
+ }
+}
diff --git a/builder/support.go b/builder/support.go
index 6833457f3a..787ff10ccb 100644
--- a/builder/support.go
+++ b/builder/support.go
@@ -1,50 +1,9 @@
package builder
import (
- "regexp"
"strings"
)
-var (
- // `\\\\+|[^\\]|\b|\A` - match any number of "\\" (ie, properly-escaped backslashes), or a single non-backslash character, or a word boundary, or beginning-of-line
- // `\$` - match literal $
- // `[[:alnum:]_]+` - match things like `$SOME_VAR`
- // `{[[:alnum:]_]+}` - match things like `${SOME_VAR}`
- tokenEnvInterpolation = regexp.MustCompile(`(\\|\\\\+|[^\\]|\b|\A)\$([[:alnum:]_]+|{[[:alnum:]_]+})`)
- // this intentionally punts on more exotic interpolations like ${SOME_VAR%suffix} and lets the shell handle those directly
-)
-
-// handle environment replacement. Used in dispatcher.
-func (b *Builder) replaceEnv(str string) string {
- for _, match := range tokenEnvInterpolation.FindAllString(str, -1) {
- idx := strings.Index(match, "\\$")
- if idx != -1 {
- if idx+2 >= len(match) {
- str = strings.Replace(str, match, "\\$", -1)
- continue
- }
-
- prefix := match[:idx]
- stripped := match[idx+2:]
- str = strings.Replace(str, match, prefix+"$"+stripped, -1)
- continue
- }
-
- match = match[strings.Index(match, "$"):]
- matchKey := strings.Trim(match, "${}")
-
- for _, keyval := range b.Config.Env {
- tmp := strings.SplitN(keyval, "=", 2)
- if tmp[0] == matchKey {
- str = strings.Replace(str, match, tmp[1], -1)
- break
- }
- }
- }
-
- return str
-}
-
func handleJsonArgs(args []string, attributes map[string]bool) []string {
if len(args) == 0 {
return []string{}
diff --git a/builder/words b/builder/words
new file mode 100644
index 0000000000..2148f72537
--- /dev/null
+++ b/builder/words
@@ -0,0 +1,43 @@
+hello | hello
+he'll'o | hello
+he'llo | hello
+he\'llo | he'llo
+he\\'llo | he\llo
+abc\tdef | abctdef
+"abc\tdef" | abc\tdef
+'abc\tdef' | abc\tdef
+hello\ | hello
+hello\\ | hello\
+"hello | hello
+"hello\" | hello"
+"hel'lo" | hel'lo
+'hello | hello
+'hello\' | hello\
+"''" | ''
+$. | $.
+$1 |
+he$1x | hex
+he$.x | he$.x
+he$pwd. | he.
+he$PWD | he/home
+he\$PWD | he$PWD
+he\\$PWD | he\/home
+he\${} | he${}
+he\${}xx | he${}xx
+he${} | he
+he${}xx | hexx
+he${hi} | he
+he${hi}xx | hexx
+he${PWD} | he/home
+he${.} | error
+'he${XX}' | he${XX}
+"he${PWD}" | he/home
+"he'$PWD'" | he'/home'
+"$PWD" | /home
+'$PWD' | $PWD
+'\$PWD' | \$PWD
+'"hello"' | "hello"
+he\$PWD | he$PWD
+"he\$PWD" | he$PWD
+'he\$PWD' | he\$PWD
+he${PWD | error
diff --git a/builtins/builtins.go b/builtins/builtins.go
index 41bb249286..1bd9362c09 100644
--- a/builtins/builtins.go
+++ b/builtins/builtins.go
@@ -5,8 +5,8 @@ import (
"github.com/docker/docker/api"
apiserver "github.com/docker/docker/api/server"
+ "github.com/docker/docker/autogen/dockerversion"
"github.com/docker/docker/daemon/networkdriver/bridge"
- "github.com/docker/docker/dockerversion"
"github.com/docker/docker/engine"
"github.com/docker/docker/events"
"github.com/docker/docker/pkg/parsers/kernel"
diff --git a/contrib/MAINTAINERS b/contrib/REVIEWERS
index 18e05a3070..18e05a3070 100644
--- a/contrib/MAINTAINERS
+++ b/contrib/REVIEWERS
diff --git a/contrib/check-config.sh b/contrib/check-config.sh
index 4f17540731..ac5df62c26 100755
--- a/contrib/check-config.sh
+++ b/contrib/check-config.sh
@@ -10,7 +10,12 @@ possibleConfigs=(
"/usr/src/linux-$(uname -r)/.config"
'/usr/src/linux/.config'
)
-: ${CONFIG:="${possibleConfigs[0]}"}
+
+if [ $# -gt 0 ]; then
+ CONFIG="$1"
+else
+ : ${CONFIG:="${possibleConfigs[0]}"}
+fi
if ! command -v zgrep &> /dev/null; then
zgrep() {
@@ -89,7 +94,7 @@ if [ ! -e "$CONFIG" ]; then
if [ ! -e "$CONFIG" ]; then
wrap_warning "error: cannot find kernel config"
wrap_warning " try running this script again, specifying the kernel config:"
- wrap_warning " CONFIG=/path/to/kernel/.config $0"
+ wrap_warning " CONFIG=/path/to/kernel/.config $0 or $0 /path/to/kernel/.config"
exit 1
fi
fi
@@ -133,7 +138,7 @@ fi
flags=(
NAMESPACES {NET,PID,IPC,UTS}_NS
DEVPTS_MULTIPLE_INSTANCES
- CGROUPS CGROUP_CPUACCT CGROUP_DEVICE CGROUP_FREEZER CGROUP_SCHED
+ CGROUPS CGROUP_CPUACCT CGROUP_DEVICE CGROUP_FREEZER CGROUP_SCHED CPUSETS
MACVLAN VETH BRIDGE
NF_NAT_IPV4 IP_NF_FILTER IP_NF_TARGET_MASQUERADE
NETFILTER_XT_MATCH_{ADDRTYPE,CONNTRACK}
@@ -169,7 +174,7 @@ echo '- Storage Drivers:'
check_flags BLK_DEV_DM DM_THIN_PROVISIONING EXT4_FS EXT4_FS_POSIX_ACL EXT4_FS_SECURITY | sed 's/^/ /'
echo '- "'$(wrap_color 'overlay' blue)'":'
- check_flags OVERLAY_FS | sed 's/^/ /'
+ check_flags OVERLAY_FS EXT4_FS_SECURITY EXT4_FS_POSIX_ACL | sed 's/^/ /'
} | sed 's/^/ /'
echo
diff --git a/contrib/completion/MAINTAINERS b/contrib/completion/REVIEWERS
index 03ee2dde3d..03ee2dde3d 100644
--- a/contrib/completion/MAINTAINERS
+++ b/contrib/completion/REVIEWERS
diff --git a/contrib/completion/bash/docker b/contrib/completion/bash/docker
index 1d553941bc..6bee94fee8 100755
--- a/contrib/completion/bash/docker
+++ b/contrib/completion/bash/docker
@@ -58,6 +58,18 @@ __docker_containers_unpauseable() {
__docker_containers_all '.State.Paused'
}
+__docker_container_names() {
+ local containers=( $(__docker_q ps -aq --no-trunc) )
+ local names=( $(__docker_q inspect --format '{{.Name}}' "${containers[@]}") )
+ names=( "${names[@]#/}" ) # trim off the leading "/" from the container names
+ COMPREPLY=( $(compgen -W "${names[*]}" -- "$cur") )
+}
+
+__docker_container_ids() {
+ local containers=( $(__docker_q ps -aq) )
+ COMPREPLY=( $(compgen -W "${containers[*]}" -- "$cur") )
+}
+
__docker_image_repos() {
local repos="$(__docker_q images | awk 'NR>1 && $1 != "<none>" { print $1 }')"
COMPREPLY=( $(compgen -W "$repos" -- "$cur") )
@@ -131,6 +143,7 @@ __docker_capabilities() {
ALL
AUDIT_CONTROL
AUDIT_WRITE
+ AUDIT_READ
BLOCK_SUSPEND
CHOWN
DAC_OVERRIDE
@@ -169,9 +182,25 @@ __docker_capabilities() {
" -- "$cur" ) )
}
+# a selection of the available signals that is most likely of interest in the
+# context of docker containers.
+__docker_signals() {
+ local signals=(
+ SIGCONT
+ SIGHUP
+ SIGINT
+ SIGKILL
+ SIGQUIT
+ SIGSTOP
+ SIGTERM
+ SIGUSR1
+ SIGUSR2
+ )
+ COMPREPLY=( $( compgen -W "${signals[*]} ${signals[*]#SIG}" -- "$( echo $cur | tr '[:lower:]' '[:upper:]')" ) )
+}
+
_docker_docker() {
local boolean_options="
- --api-enable-cors
--daemon -d
--debug -D
--help -h
@@ -221,7 +250,7 @@ _docker_docker() {
_docker_attach() {
case "$cur" in
-*)
- COMPREPLY=( $( compgen -W "--no-stdin --sig-proxy" -- "$cur" ) )
+ COMPREPLY=( $( compgen -W "--help --no-stdin --sig-proxy" -- "$cur" ) )
;;
*)
local counter="$(__docker_pos_first_nonflag)"
@@ -238,11 +267,15 @@ _docker_build() {
__docker_image_repos_and_tags
return
;;
+ --file|-f)
+ _filedir
+ return
+ ;;
esac
case "$cur" in
-*)
- COMPREPLY=( $( compgen -W "--force-rm --no-cache --quiet -q --rm --tag -t" -- "$cur" ) )
+ COMPREPLY=( $( compgen -W "--file -f --force-rm --help --no-cache --pull --quiet -q --rm --tag -t" -- "$cur" ) )
;;
*)
local counter="$(__docker_pos_first_nonflag '--tag|-t')"
@@ -255,17 +288,17 @@ _docker_build() {
_docker_commit() {
case "$prev" in
- --author|-a|--message|-m|--run)
+ --author|-a|--change|-c|--message|-m)
return
;;
esac
case "$cur" in
-*)
- COMPREPLY=( $( compgen -W "--author -a --message -m --run" -- "$cur" ) )
+ COMPREPLY=( $( compgen -W "--author -a --change -c --help --message -m --pause -p" -- "$cur" ) )
;;
*)
- local counter=$(__docker_pos_first_nonflag '--author|-a|--message|-m|--run')
+ local counter=$(__docker_pos_first_nonflag '--author|-a|--change|-c|--message|-m')
if [ $cword -eq $counter ]; then
__docker_containers_all
@@ -282,26 +315,33 @@ _docker_commit() {
}
_docker_cp() {
- local counter=$(__docker_pos_first_nonflag)
- if [ $cword -eq $counter ]; then
- case "$cur" in
- *:)
- return
- ;;
- *)
- __docker_containers_all
- COMPREPLY=( $( compgen -W "${COMPREPLY[*]}" -S ':' ) )
- compopt -o nospace
- return
- ;;
- esac
- fi
- (( counter++ ))
+ case "$cur" in
+ -*)
+ COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
+ ;;
+ *)
+ local counter=$(__docker_pos_first_nonflag)
+ if [ $cword -eq $counter ]; then
+ case "$cur" in
+ *:)
+ return
+ ;;
+ *)
+ __docker_containers_all
+ COMPREPLY=( $( compgen -W "${COMPREPLY[*]}" -S ':' ) )
+ compopt -o nospace
+ return
+ ;;
+ esac
+ fi
+ (( counter++ ))
- if [ $cword -eq $counter ]; then
- _filedir
- return
- fi
+ if [ $cword -eq $counter ]; then
+ _filedir -d
+ return
+ fi
+ ;;
+ esac
}
_docker_create() {
@@ -309,22 +349,53 @@ _docker_create() {
}
_docker_diff() {
- local counter=$(__docker_pos_first_nonflag)
- if [ $cword -eq $counter ]; then
- __docker_containers_all
- fi
+ case "$cur" in
+ -*)
+ COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
+ ;;
+ *)
+ local counter=$(__docker_pos_first_nonflag)
+ if [ $cword -eq $counter ]; then
+ __docker_containers_all
+ fi
+ ;;
+ esac
}
_docker_events() {
case "$prev" in
- --since)
+ --filter|-f)
+ COMPREPLY=( $( compgen -S = -W "container event image" -- "$cur" ) )
+ compopt -o nospace
+ return
+ ;;
+ --since|--until)
+ return
+ ;;
+ esac
+
+ # "=" gets parsed to a word and assigned to either $cur or $prev depending on whether
+ # it is the last character or not. So we search for "xxx=" in the the last two words.
+ case "${words[$cword-2]}$prev=" in
+ *container=*)
+ cur="${cur#=}"
+ __docker_containers_all
+ return
+ ;;
+ *event=*)
+ COMPREPLY=( $( compgen -W "create destroy die export kill pause restart start stop unpause" -- "${cur#=}" ) )
+ return
+ ;;
+ *image=*)
+ cur="${cur#=}"
+ __docker_image_repos_and_tags_and_ids
return
;;
esac
case "$cur" in
-*)
- COMPREPLY=( $( compgen -W "--since" -- "$cur" ) )
+ COMPREPLY=( $( compgen -W "--filter -f --help --since --until" -- "$cur" ) )
;;
esac
}
@@ -332,7 +403,7 @@ _docker_events() {
_docker_exec() {
case "$cur" in
-*)
- COMPREPLY=( $( compgen -W "--detach -d --interactive -i -t --tty" -- "$cur" ) )
+ COMPREPLY=( $( compgen -W "--detach -d --help --interactive -i -t --tty" -- "$cur" ) )
;;
*)
__docker_containers_running
@@ -341,10 +412,17 @@ _docker_exec() {
}
_docker_export() {
- local counter=$(__docker_pos_first_nonflag)
- if [ $cword -eq $counter ]; then
- __docker_containers_all
- fi
+ case "$cur" in
+ -*)
+ COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
+ ;;
+ *)
+ local counter=$(__docker_pos_first_nonflag)
+ if [ $cword -eq $counter ]; then
+ __docker_containers_all
+ fi
+ ;;
+ esac
}
_docker_help() {
@@ -357,7 +435,7 @@ _docker_help() {
_docker_history() {
case "$cur" in
-*)
- COMPREPLY=( $( compgen -W "--no-trunc --quiet -q" -- "$cur" ) )
+ COMPREPLY=( $( compgen -W "--help --no-trunc --quiet -q" -- "$cur" ) )
;;
*)
local counter=$(__docker_pos_first_nonflag)
@@ -369,34 +447,65 @@ _docker_history() {
}
_docker_images() {
+ case "$prev" in
+ --filter|-f)
+ COMPREPLY=( $( compgen -W "dangling=true label=" -- "$cur" ) )
+ if [ "$COMPREPLY" = "label=" ]; then
+ compopt -o nospace
+ fi
+ return
+ ;;
+ esac
+
+ case "${words[$cword-2]}$prev=" in
+ *dangling=*)
+ COMPREPLY=( $( compgen -W "true false" -- "${cur#=}" ) )
+ return
+ ;;
+ *label=*)
+ return
+ ;;
+ esac
+
case "$cur" in
-*)
- COMPREPLY=( $( compgen -W "--all -a --no-trunc --quiet -q" -- "$cur" ) )
+ COMPREPLY=( $( compgen -W "--all -a --filter -f --help --no-trunc --quiet -q" -- "$cur" ) )
+ ;;
+ =)
+ return
;;
*)
- local counter=$(__docker_pos_first_nonflag)
- if [ $cword -eq $counter ]; then
- __docker_image_repos
- fi
+ __docker_image_repos
;;
esac
}
_docker_import() {
- local counter=$(__docker_pos_first_nonflag)
- if [ $cword -eq $counter ]; then
- return
- fi
- (( counter++ ))
+ case "$cur" in
+ -*)
+ COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
+ ;;
+ *)
+ local counter=$(__docker_pos_first_nonflag)
+ if [ $cword -eq $counter ]; then
+ return
+ fi
+ (( counter++ ))
- if [ $cword -eq $counter ]; then
- __docker_image_repos_and_tags
- return
- fi
+ if [ $cword -eq $counter ]; then
+ __docker_image_repos_and_tags
+ return
+ fi
+ ;;
+ esac
}
_docker_info() {
- return
+ case "$cur" in
+ -*)
+ COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
+ ;;
+ esac
}
_docker_inspect() {
@@ -408,7 +517,7 @@ _docker_inspect() {
case "$cur" in
-*)
- COMPREPLY=( $( compgen -W "--format -f" -- "$cur" ) )
+ COMPREPLY=( $( compgen -W "--format -f --help" -- "$cur" ) )
;;
*)
__docker_containers_and_images
@@ -417,7 +526,21 @@ _docker_inspect() {
}
_docker_kill() {
- __docker_containers_running
+ case "$prev" in
+ --signal|-s)
+ __docker_signals
+ return
+ ;;
+ esac
+
+ case "$cur" in
+ -*)
+ COMPREPLY=( $( compgen -W "--help --signal -s" -- "$cur" ) )
+ ;;
+ *)
+ __docker_containers_running
+ ;;
+ esac
}
_docker_load() {
@@ -430,7 +553,7 @@ _docker_load() {
case "$cur" in
-*)
- COMPREPLY=( $( compgen -W "--input -i" -- "$cur" ) )
+ COMPREPLY=( $( compgen -W "--help --input -i" -- "$cur" ) )
;;
esac
}
@@ -444,18 +567,32 @@ _docker_login() {
case "$cur" in
-*)
- COMPREPLY=( $( compgen -W "--email -e --password -p --username -u" -- "$cur" ) )
+ COMPREPLY=( $( compgen -W "--email -e --help --password -p --username -u" -- "$cur" ) )
+ ;;
+ esac
+}
+
+_docker_logout() {
+ case "$cur" in
+ -*)
+ COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
;;
esac
}
_docker_logs() {
+ case "$prev" in
+ --tail)
+ return
+ ;;
+ esac
+
case "$cur" in
-*)
- COMPREPLY=( $( compgen -W "--follow -f" -- "$cur" ) )
+ COMPREPLY=( $( compgen -W "--follow -f --help --tail --timestamps -t" -- "$cur" ) )
;;
*)
- local counter=$(__docker_pos_first_nonflag)
+ local counter=$(__docker_pos_first_nonflag '--tail')
if [ $cword -eq $counter ]; then
__docker_containers_all
fi
@@ -464,17 +601,31 @@ _docker_logs() {
}
_docker_pause() {
- local counter=$(__docker_pos_first_nonflag)
- if [ $cword -eq $counter ]; then
- __docker_containers_pauseable
- fi
+ case "$cur" in
+ -*)
+ COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
+ ;;
+ *)
+ local counter=$(__docker_pos_first_nonflag)
+ if [ $cword -eq $counter ]; then
+ __docker_containers_pauseable
+ fi
+ ;;
+ esac
}
_docker_port() {
- local counter=$(__docker_pos_first_nonflag)
- if [ $cword -eq $counter ]; then
- __docker_containers_all
- fi
+ case "$cur" in
+ -*)
+ COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
+ ;;
+ *)
+ local counter=$(__docker_pos_first_nonflag)
+ if [ $cword -eq $counter ]; then
+ __docker_containers_all
+ fi
+ ;;
+ esac
}
_docker_ps() {
@@ -482,31 +633,61 @@ _docker_ps() {
--before|--since)
__docker_containers_all
;;
+ --filter|-f)
+ COMPREPLY=( $( compgen -S = -W "exited id label name status" -- "$cur" ) )
+ compopt -o nospace
+ return
+ ;;
-n)
return
;;
esac
+ case "${words[$cword-2]}$prev=" in
+ *id=*)
+ cur="${cur#=}"
+ __docker_container_ids
+ return
+ ;;
+ *name=*)
+ cur="${cur#=}"
+ __docker_container_names
+ return
+ ;;
+ *status=*)
+ COMPREPLY=( $( compgen -W "exited paused restarting running" -- "${cur#=}" ) )
+ return
+ ;;
+ esac
+
case "$cur" in
-*)
- COMPREPLY=( $( compgen -W "--all -a --before --latest -l --no-trunc -n --quiet -q --size -s --since" -- "$cur" ) )
+ COMPREPLY=( $( compgen -W "--all -a --before --filter -f --help --latest -l -n --no-trunc --quiet -q --size -s --since" -- "$cur" ) )
;;
esac
}
_docker_pull() {
- case "$prev" in
- --tag|-t)
- return
+ case "$cur" in
+ -*)
+ COMPREPLY=( $( compgen -W "--all-tags -a --help" -- "$cur" ) )
+ ;;
+ *)
+ local counter=$(__docker_pos_first_nonflag)
+ if [ $cword -eq $counter ]; then
+ __docker_image_repos_and_tags
+ fi
;;
esac
+}
+_docker_push() {
case "$cur" in
-*)
- COMPREPLY=( $( compgen -W "--tag -t" -- "$cur" ) )
+ COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
;;
*)
- local counter=$(__docker_pos_first_nonflag '--tag|-t')
+ local counter=$(__docker_pos_first_nonflag)
if [ $cword -eq $counter ]; then
__docker_image_repos_and_tags
fi
@@ -514,11 +695,18 @@ _docker_pull() {
esac
}
-_docker_push() {
- local counter=$(__docker_pos_first_nonflag)
- if [ $cword -eq $counter ]; then
- __docker_image_repos_and_tags
- fi
+_docker_rename() {
+ case "$cur" in
+ -*)
+ COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
+ ;;
+ *)
+ local counter=$(__docker_pos_first_nonflag)
+ if [ $cword -eq $counter ]; then
+ __docker_containers_all
+ fi
+ ;;
+ esac
}
_docker_restart() {
@@ -530,7 +718,7 @@ _docker_restart() {
case "$cur" in
-*)
- COMPREPLY=( $( compgen -W "--time -t" -- "$cur" ) )
+ COMPREPLY=( $( compgen -W "--help --time -t" -- "$cur" ) )
;;
*)
__docker_containers_all
@@ -541,8 +729,7 @@ _docker_restart() {
_docker_rm() {
case "$cur" in
-*)
- COMPREPLY=( $( compgen -W "--force -f --link -l --volumes -v" -- "$cur" ) )
- return
+ COMPREPLY=( $( compgen -W "--force -f --help --link -l --volumes -v" -- "$cur" ) )
;;
*)
for arg in "${COMP_WORDS[@]}"; do
@@ -554,13 +741,19 @@ _docker_rm() {
esac
done
__docker_containers_stopped
- return
;;
esac
}
_docker_rmi() {
- __docker_image_repos_and_tags_and_ids
+ case "$cur" in
+ -*)
+ COMPREPLY=( $( compgen -W "--force -f --help --no-prune" -- "$cur" ) )
+ ;;
+ *)
+ __docker_image_repos_and_tags_and_ids
+ ;;
+ esac
}
_docker_run() {
@@ -569,6 +762,7 @@ _docker_run() {
--attach -a
--cap-add
--cap-drop
+ --cgroup-parent
--cidfile
--cpuset
--cpu-shares -c
@@ -581,25 +775,33 @@ _docker_run() {
--expose
--hostname -h
--ipc
+ --label -l
+ --label-file
--link
+ --log-driver
--lxc-conf
--mac-address
--memory -m
+ --memory-swap
--name
--net
+ --pid
--publish -p
--restart
--security-opt
--user -u
+ --ulimit
--volumes-from
--volume -v
--workdir -w
"
local all_options="$options_with_args
+ --help
--interactive -i
--privileged
--publish-all -P
+ --read-only
--tty -t
"
@@ -628,11 +830,11 @@ _docker_run() {
__docker_capabilities
return
;;
- --cidfile|--env-file)
+ --cidfile|--env-file|--label-file)
_filedir
return
;;
- --device|-d|--volume)
+ --device|--volume|-v)
case "$cur" in
*:*)
# TODO somehow do _filedir for stuff inside the image, if it's already specified (which is also somewhat difficult to determine)
@@ -680,6 +882,10 @@ _docker_run() {
esac
return
;;
+ --log-driver)
+ COMPREPLY=( $( compgen -W "json-file syslog none" -- "$cur") )
+ return
+ ;;
--net)
case "$cur" in
container:*)
@@ -756,7 +962,7 @@ _docker_save() {
case "$cur" in
-*)
- COMPREPLY=( $( compgen -W "-o --output" -- "$cur" ) )
+ COMPREPLY=( $( compgen -W "--help --output -o" -- "$cur" ) )
;;
*)
__docker_image_repos_and_tags_and_ids
@@ -773,7 +979,7 @@ _docker_search() {
case "$cur" in
-*)
- COMPREPLY=( $( compgen -W "--automated --no-trunc --stars -s" -- "$cur" ) )
+ COMPREPLY=( $( compgen -W "--automated --help --no-trunc --stars -s" -- "$cur" ) )
;;
esac
}
@@ -781,7 +987,7 @@ _docker_search() {
_docker_start() {
case "$cur" in
-*)
- COMPREPLY=( $( compgen -W "--attach -a --interactive -i" -- "$cur" ) )
+ COMPREPLY=( $( compgen -W "--attach -a --help --interactive -i" -- "$cur" ) )
;;
*)
__docker_containers_stopped
@@ -790,7 +996,14 @@ _docker_start() {
}
_docker_stats() {
- __docker_containers_running
+ case "$cur" in
+ -*)
+ COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
+ ;;
+ *)
+ __docker_containers_running
+ ;;
+ esac
}
_docker_stop() {
@@ -802,7 +1015,7 @@ _docker_stop() {
case "$cur" in
-*)
- COMPREPLY=( $( compgen -W "--time -t" -- "$cur" ) )
+ COMPREPLY=( $( compgen -W "--help --time -t" -- "$cur" ) )
;;
*)
__docker_containers_running
@@ -813,7 +1026,7 @@ _docker_stop() {
_docker_tag() {
case "$cur" in
-*)
- COMPREPLY=( $( compgen -W "--force -f" -- "$cur" ) )
+ COMPREPLY=( $( compgen -W "--force -f --help" -- "$cur" ) )
;;
*)
local counter=$(__docker_pos_first_nonflag)
@@ -833,25 +1046,50 @@ _docker_tag() {
}
_docker_unpause() {
- local counter=$(__docker_pos_first_nonflag)
- if [ $cword -eq $counter ]; then
- __docker_containers_unpauseable
- fi
+ case "$cur" in
+ -*)
+ COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
+ ;;
+ *)
+ local counter=$(__docker_pos_first_nonflag)
+ if [ $cword -eq $counter ]; then
+ __docker_containers_unpauseable
+ fi
+ ;;
+ esac
}
_docker_top() {
- local counter=$(__docker_pos_first_nonflag)
- if [ $cword -eq $counter ]; then
- __docker_containers_running
- fi
+ case "$cur" in
+ -*)
+ COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
+ ;;
+ *)
+ local counter=$(__docker_pos_first_nonflag)
+ if [ $cword -eq $counter ]; then
+ __docker_containers_running
+ fi
+ ;;
+ esac
}
_docker_version() {
- return
+ case "$cur" in
+ -*)
+ COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
+ ;;
+ esac
}
_docker_wait() {
- __docker_containers_all
+ case "$cur" in
+ -*)
+ COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
+ ;;
+ *)
+ __docker_containers_all
+ ;;
+ esac
}
_docker() {
@@ -872,17 +1110,18 @@ _docker() {
images
import
info
- insert
inspect
kill
load
login
+ logout
logs
pause
port
ps
pull
push
+ rename
restart
rm
rmi
@@ -900,8 +1139,10 @@ _docker() {
)
local main_options_with_args="
+ --api-cors-header
--bip
--bridge -b
+ --default-ulimit
--dns
--dns-search
--exec-driver -e
diff --git a/contrib/completion/fish/docker.fish b/contrib/completion/fish/docker.fish
index fe92ecc56f..d3237588ef 100644
--- a/contrib/completion/fish/docker.fish
+++ b/contrib/completion/fish/docker.fish
@@ -16,7 +16,7 @@
function __fish_docker_no_subcommand --description 'Test if docker has yet to be given the subcommand'
for i in (commandline -opc)
- if contains -- $i attach build commit cp create diff events exec export history images import info insert inspect kill load login logout logs pause port ps pull push restart rm rmi run save search start stop tag top unpause version wait
+ if contains -- $i attach build commit cp create diff events exec export history images import info inspect kill load login logout logs pause port ps pull push rename restart rm rmi run save search start stop tag top unpause version wait
return 1
end
end
@@ -43,7 +43,7 @@ function __fish_print_docker_repositories --description 'Print a list of docker
end
# common options
-complete -c docker -f -n '__fish_docker_no_subcommand' -l api-enable-cors -d 'Enable CORS headers in the remote API'
+complete -c docker -f -n '__fish_docker_no_subcommand' -l api-cors-header -d "Set CORS headers in the remote API. Default is cors disabled"
complete -c docker -f -n '__fish_docker_no_subcommand' -s b -l bridge -d 'Attach containers to a pre-existing network bridge'
complete -c docker -f -n '__fish_docker_no_subcommand' -l bip -d "Use this CIDR notation address for the network bridge's IP, not compatible with -b"
complete -c docker -f -n '__fish_docker_no_subcommand' -s D -l debug -d 'Enable debug mode'
@@ -72,7 +72,7 @@ complete -c docker -f -n '__fish_docker_no_subcommand' -l registry-mirror -d 'Sp
complete -c docker -f -n '__fish_docker_no_subcommand' -s s -l storage-driver -d 'Force the Docker runtime to use a specific storage driver'
complete -c docker -f -n '__fish_docker_no_subcommand' -l selinux-enabled -d 'Enable selinux support. SELinux does not presently support the BTRFS storage driver'
complete -c docker -f -n '__fish_docker_no_subcommand' -l storage-opt -d 'Set storage driver options'
-complete -c docker -f -n '__fish_docker_no_subcommand' -l tls -d 'Use TLS; implied by --tlsverify flag'
+complete -c docker -f -n '__fish_docker_no_subcommand' -l tls -d 'Use TLS; implied by --tlsverify'
complete -c docker -f -n '__fish_docker_no_subcommand' -l tlscacert -d 'Trust only remotes providing a certificate signed by the CA given here'
complete -c docker -f -n '__fish_docker_no_subcommand' -l tlscert -d 'Path to TLS certificate file'
complete -c docker -f -n '__fish_docker_no_subcommand' -l tlskey -d 'Path to TLS key file'
@@ -345,7 +345,7 @@ complete -c docker -A -f -n '__fish_seen_subcommand_from save' -s o -l output -d
complete -c docker -A -f -n '__fish_seen_subcommand_from save' -a '(__fish_print_docker_images)' -d "Image"
# search
-complete -c docker -f -n '__fish_docker_no_subcommand' -a search -d 'Search for an image on the Docker Hub'
+complete -c docker -f -n '__fish_docker_no_subcommand' -a search -d 'Search for an image on the registry (defaults to the Docker Hub)'
complete -c docker -A -f -n '__fish_seen_subcommand_from search' -l automated -d 'Only show automated builds'
complete -c docker -A -f -n '__fish_seen_subcommand_from search' -l help -d 'Print usage'
complete -c docker -A -f -n '__fish_seen_subcommand_from search' -l no-trunc -d "Don't truncate output"
diff --git a/contrib/completion/zsh/REVIEWERS b/contrib/completion/zsh/REVIEWERS
new file mode 100644
index 0000000000..a9d0da5132
--- /dev/null
+++ b/contrib/completion/zsh/REVIEWERS
@@ -0,0 +1,3 @@
+Tianon Gravi <admwiggin@gmail.com> (@tianon)
+Jessie Frazelle <jess@docker.com> (@jfrazelle)
+Vincent Bernat <vincent@bernat.im> (@vincentbernat)
diff --git a/contrib/completion/zsh/_docker b/contrib/completion/zsh/_docker
index 9104f385d7..28398f7524 100644
--- a/contrib/completion/zsh/_docker
+++ b/contrib/completion/zsh/_docker
@@ -197,8 +197,10 @@ __docker_subcommand () {
;;
(build)
_arguments \
+ {-f,--file=-}'[Dockerfile to use]:Dockerfile:_files' \
'--force-rm[Always remove intermediate containers]' \
'--no-cache[Do not use cache when building the image]' \
+ '--pull[Attempt to pull a newer version of the image]' \
{-q,--quiet}'[Suppress verbose build output]' \
'--rm[Remove intermediate containers after a successful build]' \
{-t,--tag=-}'[Repository, name and tag to be applied]:repository:__docker_repositories_with_tags' \
@@ -209,7 +211,6 @@ __docker_subcommand () {
{-a,--author=-}'[Author]:author: ' \
{-m,--message=-}'[Commit message]:message: ' \
{-p,--pause}'[Pause container during commit]' \
- '--run=-[Configuration automatically applied when the image is run]:configuration: ' \
':container:__docker_containers' \
':repository:__docker_repositories_with_tags'
;;
@@ -232,15 +233,28 @@ __docker_subcommand () {
;;
(events)
_arguments \
+ '*'{-f,--filter=-}'[Filter values]:filter: ' \
'--since=-[Events created since this timestamp]:timestamp: ' \
'--until=-[Events created until this timestamp]:timestamp: '
;;
(exec)
+ local state ret
_arguments \
{-d,--detach}'[Detached mode: leave the container running in the background]' \
{-i,--interactive}'[Keep stdin open even if not attached]' \
{-t,--tty}'[Allocate a pseudo-tty]' \
- ':containers:__docker_runningcontainers'
+ ':containers:__docker_runningcontainers' \
+ '*::command:->anycommand' && ret=0
+
+ case $state in
+ (anycommand)
+ shift 1 words
+ (( CURRENT-- ))
+ _normal
+ ;;
+ esac
+
+ return ret
;;
(history)
_arguments \
@@ -254,15 +268,8 @@ __docker_subcommand () {
'*'{-f,--filter=-}'[Filter values]:filter: ' \
'--no-trunc[Do not truncate output]' \
{-q,--quiet}'[Only show numeric IDs]' \
- '--tree[Output graph in tree format]' \
- '--viz[Output graph in graphviz format]' \
':repository:__docker_repositories'
;;
- (inspect)
- _arguments \
- {-f,--format=-}'[Format the output using the given go template]:template: ' \
- '*:containers:__docker_containers'
- ;;
(import)
_arguments \
':URL:(- http:// file://)' \
@@ -270,15 +277,10 @@ __docker_subcommand () {
;;
(info)
;;
- (import)
+ (inspect)
_arguments \
- ':URL:(- http:// file://)' \
- ':repository:__docker_repositories_with_tags'
- ;;
- (insert)
- _arguments '1:containers:__docker_containers' \
- '2:URL:(http:// file://)' \
- '3:file:_files'
+ {-f,--format=-}'[Format the output using the given go template]:template: ' \
+ '*:containers:__docker_containers'
;;
(kill)
_arguments \
@@ -287,7 +289,7 @@ __docker_subcommand () {
;;
(load)
_arguments \
- {-i,--input=-}'[Read from tar archive file]:tar:_files'
+ {-i,--input=-}'[Read from tar archive file]:archive file:_files -g "*.((tar|TAR)(.gz|.GZ|.Z|.bz2|.lzma|.xz|)|(tbz|tgz|txz))(-.)"'
;;
(login)
_arguments \
@@ -304,6 +306,7 @@ __docker_subcommand () {
_arguments \
{-f,--follow}'[Follow log output]' \
{-t,--timestamps}'[Show timestamps]' \
+ '--tail=-[Output the last K lines]:lines:(1 10 20 50 all)' \
'*:containers:__docker_containers'
;;
(port)
@@ -321,6 +324,10 @@ __docker_subcommand () {
{-i,--interactive}'[Attach container'"'"'s stding]' \
'*:containers:__docker_stoppedcontainers'
;;
+ (stats)
+ _arguments \
+ '*:containers:__docker_runningcontainers'
+ ;;
(rm)
_arguments \
{-f,--force}'[Force removal]' \
@@ -391,7 +398,7 @@ __docker_subcommand () {
'*--lxc-conf=-[Add custom lxc options]:lxc options: ' \
'-m[Memory limit (in bytes)]:limit: ' \
'--name=-[Container name]:name: ' \
- '--net=-[Network mode]:network mode:(bridge none container: host)' \
+ '--net=-[Network mode]:network mode:(bridge none container host)' \
{-P,--publish-all}'[Publish all exposed ports]' \
'*'{-p,--publish=-}'[Expose a container'"'"'s port to the host]:port:_ports' \
'--privileged[Give extended privileges to this container]' \
@@ -419,19 +426,33 @@ __docker_subcommand () {
esac
;;
- (pull|search)
- _arguments ':name:__docker_search'
+ (pull)
+ _arguments \
+ {-a,--all-tags}'[Download all tagged images]' \
+ ':name:__docker_search'
;;
(push)
_arguments ':images:__docker_images'
;;
+ (rename)
+ _arguments \
+ ':old name:__docker_containers' \
+ ':new name: '
+ ;;
(save)
_arguments \
{-o,--output=-}'[Write to file]:file:_files' \
- ':images:__docker_images'
+ '*:images:__docker_images'
+ ;;
+ (search)
+ _arguments \
+ '--automated[Only show automated builds]' \
+ '--no-trunc[Do not truncate output]' \
+ {-s,--stars=-}'[Only display with at least X stars]:stars:(0 10 100 1000)' \
+ ':term: '
;;
(wait)
- _arguments ':containers:__docker_runningcontainers'
+ _arguments '*:containers:__docker_runningcontainers'
;;
(help)
_arguments ':subcommand:__docker_commands'
diff --git a/contrib/download-frozen-image.sh b/contrib/download-frozen-image.sh
new file mode 100755
index 0000000000..b45cba9813
--- /dev/null
+++ b/contrib/download-frozen-image.sh
@@ -0,0 +1,104 @@
+#!/bin/bash
+set -e
+
+# hello-world latest ef872312fe1b 3 months ago 910 B
+# hello-world latest ef872312fe1bbc5e05aae626791a47ee9b032efa8f3bda39cc0be7b56bfe59b9 3 months ago 910 B
+
+# debian latest f6fab3b798be 10 weeks ago 85.1 MB
+# debian latest f6fab3b798be3174f45aa1eb731f8182705555f89c9026d8c1ef230cbf8301dd 10 weeks ago 85.1 MB
+
+if ! command -v curl &> /dev/null; then
+ echo >&2 'error: "curl" not found!'
+ exit 1
+fi
+
+usage() {
+ echo "usage: $0 dir image[:tag][@image-id] ..."
+ echo " ie: $0 /tmp/hello-world hello-world"
+ echo " $0 /tmp/debian-jessie debian:jessie"
+ echo " $0 /tmp/old-hello-world hello-world@ef872312fe1bbc5e05aae626791a47ee9b032efa8f3bda39cc0be7b56bfe59b9"
+ echo " $0 /tmp/old-debian debian:latest@f6fab3b798be3174f45aa1eb731f8182705555f89c9026d8c1ef230cbf8301dd"
+ [ -z "$1" ] || exit "$1"
+}
+
+dir="$1" # dir for building tar in
+shift || usage 1 >&2
+
+[ $# -gt 0 -a "$dir" ] || usage 2 >&2
+mkdir -p "$dir"
+
+# hacky workarounds for Bash 3 support (no associative arrays)
+images=()
+rm -f "$dir"/tags-*.tmp
+# repositories[busybox]='"latest": "...", "ubuntu-14.04": "..."'
+
+while [ $# -gt 0 ]; do
+ imageTag="$1"
+ shift
+ image="${imageTag%%[:@]*}"
+ tag="${imageTag#*:}"
+ imageId="${tag##*@}"
+ [ "$imageId" != "$tag" ] || imageId=
+ [ "$tag" != "$imageTag" ] || tag='latest'
+ tag="${tag%@*}"
+
+ token="$(curl -sSL -o /dev/null -D- -H 'X-Docker-Token: true' "https://index.docker.io/v1/repositories/$image/images" | tr -d '\r' | awk -F ': *' '$1 == "X-Docker-Token" { print $2 }')"
+
+ if [ -z "$imageId" ]; then
+ imageId="$(curl -sSL -H "Authorization: Token $token" "https://registry-1.docker.io/v1/repositories/$image/tags/$tag")"
+ imageId="${imageId//\"/}"
+ fi
+
+ ancestryJson="$(curl -sSL -H "Authorization: Token $token" "https://registry-1.docker.io/v1/images/$imageId/ancestry")"
+ if [ "${ancestryJson:0:1}" != '[' ]; then
+ echo >&2 "error: /v1/images/$imageId/ancestry returned something unexpected:"
+ echo >&2 " $ancestryJson"
+ exit 1
+ fi
+
+ IFS=','
+ ancestry=( ${ancestryJson//[\[\] \"]/} )
+ unset IFS
+
+ if [ -s "$dir/tags-$image.tmp" ]; then
+ echo -n ', ' >> "$dir/tags-$image.tmp"
+ else
+ images=( "${images[@]}" "$image" )
+ fi
+ echo -n '"'"$tag"'": "'"$imageId"'"' >> "$dir/tags-$image.tmp"
+
+ echo "Downloading '$imageTag' (${#ancestry[@]} layers)..."
+ for imageId in "${ancestry[@]}"; do
+ mkdir -p "$dir/$imageId"
+ echo '1.0' > "$dir/$imageId/VERSION"
+
+ curl -sSL -H "Authorization: Token $token" "https://registry-1.docker.io/v1/images/$imageId/json" -o "$dir/$imageId/json"
+
+ # TODO figure out why "-C -" doesn't work here
+ # "curl: (33) HTTP server doesn't seem to support byte ranges. Cannot resume."
+ # "HTTP/1.1 416 Requested Range Not Satisfiable"
+ if [ -f "$dir/$imageId/layer.tar" ]; then
+ # TODO hackpatch for no -C support :'(
+ echo "skipping existing ${imageId:0:12}"
+ continue
+ fi
+ curl -SL --progress -H "Authorization: Token $token" "https://registry-1.docker.io/v1/images/$imageId/layer" -o "$dir/$imageId/layer.tar" # -C -
+ done
+ echo
+done
+
+echo -n '{' > "$dir/repositories"
+firstImage=1
+for image in "${images[@]}"; do
+ [ "$firstImage" ] || echo -n ',' >> "$dir/repositories"
+ firstImage=
+ echo -n $'\n\t' >> "$dir/repositories"
+ echo -n '"'"$image"'": { '"$(cat "$dir/tags-$image.tmp")"' }' >> "$dir/repositories"
+done
+echo -n $'\n}\n' >> "$dir/repositories"
+
+rm -f "$dir"/tags-*.tmp
+
+echo "Download of images into '$dir' complete."
+echo "Use something like the following to load the result into a Docker daemon:"
+echo " tar -cC '$dir' . | docker load"
diff --git a/contrib/httpserver/Dockerfile b/contrib/httpserver/Dockerfile
new file mode 100644
index 0000000000..747dc91bcf
--- /dev/null
+++ b/contrib/httpserver/Dockerfile
@@ -0,0 +1,4 @@
+FROM busybox
+EXPOSE 80/tcp
+COPY httpserver .
+CMD ["./httpserver"]
diff --git a/contrib/httpserver/server.go b/contrib/httpserver/server.go
new file mode 100644
index 0000000000..a75d5abb3d
--- /dev/null
+++ b/contrib/httpserver/server.go
@@ -0,0 +1,12 @@
+package main
+
+import (
+ "log"
+ "net/http"
+)
+
+func main() {
+ fs := http.FileServer(http.Dir("/static"))
+ http.Handle("/", fs)
+ log.Panic(http.ListenAndServe(":80", nil))
+}
diff --git a/contrib/init/systemd/MAINTAINERS b/contrib/init/systemd/REVIEWERS
index b9ba55b3fb..b9ba55b3fb 100644
--- a/contrib/init/systemd/MAINTAINERS
+++ b/contrib/init/systemd/REVIEWERS
diff --git a/contrib/init/systemd/docker.service b/contrib/init/systemd/docker.service
index 9738ca1ad5..bc73448842 100644
--- a/contrib/init/systemd/docker.service
+++ b/contrib/init/systemd/docker.service
@@ -9,6 +9,7 @@ ExecStart=/usr/bin/docker -d -H fd://
MountFlags=slave
LimitNOFILE=1048576
LimitNPROC=1048576
+LimitCORE=infinity
[Install]
WantedBy=multi-user.target
diff --git a/contrib/init/sysvinit-redhat/docker b/contrib/init/sysvinit-redhat/docker
index 1994d6b31e..d51e2f8ba1 100755
--- a/contrib/init/sysvinit-redhat/docker
+++ b/contrib/init/sysvinit-redhat/docker
@@ -43,6 +43,8 @@ prestart() {
start() {
[ -x $exec ] || exit 5
+ check_for_cleanup
+
if ! [ -f $pidfile ]; then
prestart
printf "Starting $prog:\t"
@@ -97,6 +99,13 @@ rh_status_q() {
rh_status >/dev/null 2>&1
}
+
+check_for_cleanup() {
+ if [ -f ${pidfile} ]; then
+ /bin/ps -fp $(cat ${pidfile}) > /dev/null || rm ${pidfile}
+ fi
+}
+
case "$1" in
start)
rh_status_q && exit 0
diff --git a/contrib/init/upstart/MAINTAINERS b/contrib/init/upstart/REVIEWERS
index 03ee2dde3d..03ee2dde3d 100644
--- a/contrib/init/upstart/MAINTAINERS
+++ b/contrib/init/upstart/REVIEWERS
diff --git a/contrib/init/upstart/docker.conf b/contrib/init/upstart/docker.conf
index f9930bd396..4ad6058ed0 100644
--- a/contrib/init/upstart/docker.conf
+++ b/contrib/init/upstart/docker.conf
@@ -49,7 +49,7 @@ post-start script
fi
if ! printf "%s" "$DOCKER_OPTS" | grep -qE -e '-H|--host'; then
while ! [ -e /var/run/docker.sock ]; do
- initctl status $UPSTART_JOB | grep -q "stop/" && exit 1
+ initctl status $UPSTART_JOB | grep -qE "(stop|respawn)/" && exit 1
echo "Waiting for /var/run/docker.sock"
sleep 0.1
done
diff --git a/contrib/mkimage-alpine.sh b/contrib/mkimage-alpine.sh
index b9869ae61e..71fb914388 100755
--- a/contrib/mkimage-alpine.sh
+++ b/contrib/mkimage-alpine.sh
@@ -72,7 +72,7 @@ REL=${REL:-edge}
MIRROR=${MIRROR:-http://nl.alpinelinux.org/alpine}
SAVE=${SAVE:-0}
REPO=$MIRROR/$REL/main
-ARCH=$(uname -m)
+ARCH=${ARCH:-$(uname -m)}
tmp
getapk
diff --git a/contrib/mkimage-arch.sh b/contrib/mkimage-arch.sh
index 382e2f7802..bbecf72903 100755
--- a/contrib/mkimage-arch.sh
+++ b/contrib/mkimage-arch.sh
@@ -87,5 +87,5 @@ mknod -m 666 $DEV/ptmx c 5 2
ln -sf /proc/self/fd $DEV/fd
tar --numeric-owner --xattrs --acls -C $ROOTFS -c . | docker import - archlinux
-docker run -i -t archlinux echo Success.
+docker run -t archlinux echo Success.
rm -rf $ROOTFS
diff --git a/contrib/mkimage-yum.sh b/contrib/mkimage-yum.sh
index 80f7b4956f..f48cb4340f 100755
--- a/contrib/mkimage-yum.sh
+++ b/contrib/mkimage-yum.sh
@@ -57,6 +57,12 @@ mknod -m 666 "$target"/dev/tty0 c 4 0
mknod -m 666 "$target"/dev/urandom c 1 9
mknod -m 666 "$target"/dev/zero c 1 5
+# amazon linux yum will fail without vars set
+if [ -d /etc/yum/vars ]; then
+ mkdir -p -m 755 "$target"/etc/yum
+ cp -a /etc/yum/vars "$target"/etc/yum/
+fi
+
yum -c "$yum_config" --installroot="$target" --releasever=/ --setopt=tsflags=nodocs \
--setopt=group_package_types=mandatory -y groupinstall Core
yum -c "$yum_config" --installroot="$target" -y clean all
@@ -83,9 +89,13 @@ rm -rf "$target"/etc/ld.so.cache
rm -rf "$target"/var/cache/ldconfig/*
version=
-if [ -r "$target"/etc/redhat-release ]; then
- version="$(sed 's/^[^0-9\]*\([0-9.]\+\).*$/\1/' "$target"/etc/redhat-release)"
-fi
+for file in "$target"/etc/{redhat,system}-release
+do
+ if [ -r "$file" ]; then
+ version="$(sed 's/^[^0-9\]*\([0-9.]\+\).*$/\1/' "$file")"
+ break
+ fi
+done
if [ -z "$version" ]; then
echo >&2 "warning: cannot autodetect OS version, using '$name' as tag"
diff --git a/contrib/mkimage/debootstrap b/contrib/mkimage/debootstrap
index c7a2b66830..72983d249b 100755
--- a/contrib/mkimage/debootstrap
+++ b/contrib/mkimage/debootstrap
@@ -15,6 +15,16 @@ done
suite="$1"
shift
+# get path to "chroot" in our current PATH
+chrootPath="$(type -P chroot)"
+rootfs_chroot() {
+ # "chroot" doesn't set PATH, so we need to set it explicitly to something our new debootstrap chroot can use appropriately!
+
+ # set PATH and chroot away!
+ PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin' \
+ "$chrootPath" "$rootfsDir" "$@"
+}
+
# allow for DEBOOTSTRAP=qemu-debootstrap ./mkimage.sh ...
: ${DEBOOTSTRAP:=debootstrap}
@@ -28,26 +38,26 @@ shift
# prevent init scripts from running during install/update
echo >&2 "+ echo exit 101 > '$rootfsDir/usr/sbin/policy-rc.d'"
cat > "$rootfsDir/usr/sbin/policy-rc.d" <<'EOF'
-#!/bin/sh
+ #!/bin/sh
-# For most Docker users, "apt-get install" only happens during "docker build",
-# where starting services doesn't work and often fails in humorous ways. This
-# prevents those failures by stopping the services from attempting to start.
+ # For most Docker users, "apt-get install" only happens during "docker build",
+ # where starting services doesn't work and often fails in humorous ways. This
+ # prevents those failures by stopping the services from attempting to start.
-exit 101
+ exit 101
EOF
chmod +x "$rootfsDir/usr/sbin/policy-rc.d"
# prevent upstart scripts from running during install/update
(
set -x
- chroot "$rootfsDir" dpkg-divert --local --rename --add /sbin/initctl
+ rootfs_chroot dpkg-divert --local --rename --add /sbin/initctl
cp -a "$rootfsDir/usr/sbin/policy-rc.d" "$rootfsDir/sbin/initctl"
sed -i 's/^exit.*/exit 0/' "$rootfsDir/sbin/initctl"
)
# shrink a little, since apt makes us cache-fat (wheezy: ~157.5MB vs ~120MB)
-( set -x; chroot "$rootfsDir" apt-get clean )
+( set -x; rootfs_chroot apt-get clean )
# this file is one APT creates to make sure we don't "autoremove" our currently
# in-use kernel, which doesn't really apply to debootstraps/Docker images that
@@ -59,12 +69,12 @@ if strings "$rootfsDir/usr/bin/dpkg" | grep -q unsafe-io; then
# force dpkg not to call sync() after package extraction (speeding up installs)
echo >&2 "+ echo force-unsafe-io > '$rootfsDir/etc/dpkg/dpkg.cfg.d/docker-apt-speedup'"
cat > "$rootfsDir/etc/dpkg/dpkg.cfg.d/docker-apt-speedup" <<-'EOF'
- # For most Docker users, package installs happen during "docker build", which
- # doesn't survive power loss and gets restarted clean afterwards anyhow, so
- # this minor tweak gives us a nice speedup (much nicer on spinning disks,
- # obviously).
+ # For most Docker users, package installs happen during "docker build", which
+ # doesn't survive power loss and gets restarted clean afterwards anyhow, so
+ # this minor tweak gives us a nice speedup (much nicer on spinning disks,
+ # obviously).
- force-unsafe-io
+ force-unsafe-io
EOF
fi
@@ -97,26 +107,47 @@ if [ -d "$rootfsDir/etc/apt/apt.conf.d" ]; then
# remove apt-cache translations for fast "apt-get update"
echo >&2 "+ echo Acquire::Languages 'none' > '$rootfsDir/etc/apt/apt.conf.d/docker-no-languages'"
cat > "$rootfsDir/etc/apt/apt.conf.d/docker-no-languages" <<-'EOF'
- # In Docker, we don't often need the "Translations" files, so we're just wasting
- # time and space by downloading them, and this inhibits that. For users that do
- # need them, it's a simple matter to delete this file and "apt-get update". :)
+ # In Docker, we don't often need the "Translations" files, so we're just wasting
+ # time and space by downloading them, and this inhibits that. For users that do
+ # need them, it's a simple matter to delete this file and "apt-get update". :)
- Acquire::Languages "none";
+ Acquire::Languages "none";
EOF
echo >&2 "+ echo Acquire::GzipIndexes 'true' > '$rootfsDir/etc/apt/apt.conf.d/docker-gzip-indexes'"
cat > "$rootfsDir/etc/apt/apt.conf.d/docker-gzip-indexes" <<-'EOF'
- # Since Docker users using "RUN apt-get update && apt-get install -y ..." in
- # their Dockerfiles don't go delete the lists files afterwards, we want them to
- # be as small as possible on-disk, so we explicitly request "gz" versions and
- # tell Apt to keep them gzipped on-disk.
+ # Since Docker users using "RUN apt-get update && apt-get install -y ..." in
+ # their Dockerfiles don't go delete the lists files afterwards, we want them to
+ # be as small as possible on-disk, so we explicitly request "gz" versions and
+ # tell Apt to keep them gzipped on-disk.
- # For comparison, an "apt-get update" layer without this on a pristine
- # "debian:wheezy" base image was "29.88 MB", where with this it was only
- # "8.273 MB".
+ # For comparison, an "apt-get update" layer without this on a pristine
+ # "debian:wheezy" base image was "29.88 MB", where with this it was only
+ # "8.273 MB".
+
+ Acquire::GzipIndexes "true";
+ Acquire::CompressionTypes::Order:: "gz";
+ EOF
- Acquire::GzipIndexes "true";
- Acquire::CompressionTypes::Order:: "gz";
+ # update "autoremove" configuration to be aggressive about removing suggests deps that weren't manually installed
+ echo >&2 "+ echo Apt::AutoRemove::SuggestsImportant 'false' > '$rootfsDir/etc/apt/apt.conf.d/docker-autoremove-suggests'"
+ cat > "$rootfsDir/etc/apt/apt.conf.d/docker-autoremove-suggests" <<-'EOF'
+ # Since Docker users are looking for the smallest possible final images, the
+ # following emerges as a very common pattern:
+
+ # RUN apt-get update \
+ # && apt-get install -y <packages> \
+ # && <do some compilation work> \
+ # && apt-get purge -y --auto-remove <packages>
+
+ # By default, APT will actually _keep_ packages installed via Recommends or
+ # Depends if another package Suggests them, even and including if the package
+ # that originally caused them to be installed is removed. Setting this to
+ # "false" ensures that APT is appropriately aggressive about removing the
+ # packages it added.
+
+ # https://aptitude.alioth.debian.org/doc/en/ch02s05s05.html#configApt-AutoRemove-SuggestsImportant
+ Apt::AutoRemove::SuggestsImportant "false";
EOF
fi
@@ -191,7 +222,7 @@ fi
set -x
# make sure we're fully up-to-date
- chroot "$rootfsDir" bash -c 'apt-get update && apt-get dist-upgrade -y'
+ rootfs_chroot sh -xc 'apt-get update && apt-get dist-upgrade -y'
# delete all the apt list files since they're big and get stale quickly
rm -rf "$rootfsDir/var/lib/apt/lists"/*
diff --git a/project/stats.sh b/contrib/project-stats.sh
index 985a77f22d..985a77f22d 100755
--- a/project/stats.sh
+++ b/contrib/project-stats.sh
diff --git a/project/report-issue.sh b/contrib/report-issue.sh
index 5ef2ecee20..5ef2ecee20 100644
--- a/project/report-issue.sh
+++ b/contrib/report-issue.sh
diff --git a/contrib/syntax/kate/Dockerfile.xml b/contrib/syntax/kate/Dockerfile.xml
index e5602397ba..4fdef2393b 100644
--- a/contrib/syntax/kate/Dockerfile.xml
+++ b/contrib/syntax/kate/Dockerfile.xml
@@ -22,6 +22,7 @@
<item> CMD </item>
<item> WORKDIR </item>
<item> USER </item>
+ <item> LABEL </item>
</list>
<contexts>
diff --git a/contrib/syntax/textmate/Docker.tmbundle/Syntaxes/Dockerfile.tmLanguage b/contrib/syntax/textmate/Docker.tmbundle/Syntaxes/Dockerfile.tmLanguage
index 1d19a3ba2e..75efc2e811 100644
--- a/contrib/syntax/textmate/Docker.tmbundle/Syntaxes/Dockerfile.tmLanguage
+++ b/contrib/syntax/textmate/Docker.tmbundle/Syntaxes/Dockerfile.tmLanguage
@@ -12,7 +12,7 @@
<array>
<dict>
<key>match</key>
- <string>^\s*(ONBUILD\s+)?(FROM|MAINTAINER|RUN|EXPOSE|ENV|ADD|VOLUME|USER|WORKDIR|COPY)\s</string>
+ <string>^\s*(ONBUILD\s+)?(FROM|MAINTAINER|RUN|EXPOSE|ENV|ADD|VOLUME|USER|LABEL|WORKDIR|COPY)\s</string>
<key>captures</key>
<dict>
<key>0</key>
diff --git a/contrib/syntax/textmate/MAINTAINERS b/contrib/syntax/textmate/REVIEWERS
index 965743df64..965743df64 100644
--- a/contrib/syntax/textmate/MAINTAINERS
+++ b/contrib/syntax/textmate/REVIEWERS
diff --git a/contrib/syntax/vim/syntax/dockerfile.vim b/contrib/syntax/vim/syntax/dockerfile.vim
index 2984bec5f8..36691e2504 100644
--- a/contrib/syntax/vim/syntax/dockerfile.vim
+++ b/contrib/syntax/vim/syntax/dockerfile.vim
@@ -11,7 +11,7 @@ let b:current_syntax = "dockerfile"
syntax case ignore
-syntax match dockerfileKeyword /\v^\s*(ONBUILD\s+)?(ADD|CMD|ENTRYPOINT|ENV|EXPOSE|FROM|MAINTAINER|RUN|USER|VOLUME|WORKDIR|COPY)\s/
+syntax match dockerfileKeyword /\v^\s*(ONBUILD\s+)?(ADD|CMD|ENTRYPOINT|ENV|EXPOSE|FROM|MAINTAINER|RUN|USER|LABEL|VOLUME|WORKDIR|COPY)\s/
highlight link dockerfileKeyword Keyword
syntax region dockerfileString start=/\v"/ skip=/\v\\./ end=/\v"/
diff --git a/daemon/MAINTAINERS b/daemon/MAINTAINERS
deleted file mode 100644
index 9360465f2d..0000000000
--- a/daemon/MAINTAINERS
+++ /dev/null
@@ -1,7 +0,0 @@
-Solomon Hykes <solomon@docker.com> (@shykes)
-Victor Vieux <vieux@docker.com> (@vieux)
-Michael Crosby <michael@crosbymichael.com> (@crosbymichael)
-Cristian Staretu <cristian.staretu@gmail.com> (@unclejack)
-Tibor Vass <teabee89@gmail.com> (@tiborvass)
-Vishnu Kannan <vishnuk@google.com> (@vishh)
-volumes.go: Brian Goff <cpuguy83@gmail.com> (@cpuguy83)
diff --git a/daemon/attach.go b/daemon/attach.go
index 881b021e17..967c86387f 100644
--- a/daemon/attach.go
+++ b/daemon/attach.go
@@ -28,9 +28,9 @@ func (daemon *Daemon) ContainerAttach(job *engine.Job) engine.Status {
stderr = job.GetenvBool("stderr")
)
- container := daemon.Get(name)
- if container == nil {
- return job.Errorf("No such container: %s", name)
+ container, err := daemon.Get(name)
+ if err != nil {
+ return job.Error(err)
}
//logs
@@ -101,7 +101,7 @@ func (daemon *Daemon) ContainerAttach(job *engine.Job) engine.Status {
cStderr = job.Stderr
}
- <-daemon.attach(&container.StreamConfig, container.Config.OpenStdin, container.Config.StdinOnce, container.Config.Tty, cStdin, cStdout, cStderr)
+ <-daemon.Attach(&container.StreamConfig, container.Config.OpenStdin, container.Config.StdinOnce, container.Config.Tty, cStdin, cStdout, cStderr)
// If we are in stdinonce mode, wait for the process to end
// otherwise, simply return
if container.Config.StdinOnce && !container.Config.Tty {
@@ -111,7 +111,7 @@ func (daemon *Daemon) ContainerAttach(job *engine.Job) engine.Status {
return engine.StatusOK
}
-func (daemon *Daemon) attach(streamConfig *StreamConfig, openStdin, stdinOnce, tty bool, stdin io.ReadCloser, stdout io.Writer, stderr io.Writer) chan error {
+func (daemon *Daemon) Attach(streamConfig *StreamConfig, openStdin, stdinOnce, tty bool, stdin io.ReadCloser, stdout io.Writer, stderr io.Writer) chan error {
var (
cStdout, cStderr io.ReadCloser
cStdin io.WriteCloser
diff --git a/daemon/changes.go b/daemon/changes.go
index 1e5726eda8..faa4323145 100644
--- a/daemon/changes.go
+++ b/daemon/changes.go
@@ -9,24 +9,29 @@ func (daemon *Daemon) ContainerChanges(job *engine.Job) engine.Status {
return job.Errorf("Usage: %s CONTAINER", job.Name)
}
name := job.Args[0]
- if container := daemon.Get(name); container != nil {
- outs := engine.NewTable("", 0)
- changes, err := container.Changes()
- if err != nil {
- return job.Error(err)
- }
- for _, change := range changes {
- out := &engine.Env{}
- if err := out.Import(change); err != nil {
- return job.Error(err)
- }
- outs.Add(out)
- }
- if _, err := outs.WriteListTo(job.Stdout); err != nil {
+
+ container, error := daemon.Get(name)
+ if error != nil {
+ return job.Error(error)
+ }
+
+ outs := engine.NewTable("", 0)
+ changes, err := container.Changes()
+ if err != nil {
+ return job.Error(err)
+ }
+
+ for _, change := range changes {
+ out := &engine.Env{}
+ if err := out.Import(change); err != nil {
return job.Error(err)
}
- } else {
- return job.Errorf("No such container: %s", name)
+ outs.Add(out)
}
+
+ if _, err := outs.WriteListTo(job.Stdout); err != nil {
+ return job.Error(err)
+ }
+
return engine.StatusOK
}
diff --git a/daemon/commit.go b/daemon/commit.go
index 06d0465adc..f1496a414a 100644
--- a/daemon/commit.go
+++ b/daemon/commit.go
@@ -1,6 +1,9 @@
package daemon
import (
+ "bytes"
+ "encoding/json"
+
"github.com/docker/docker/engine"
"github.com/docker/docker/image"
"github.com/docker/docker/runconfig"
@@ -12,17 +15,27 @@ func (daemon *Daemon) ContainerCommit(job *engine.Job) engine.Status {
}
name := job.Args[0]
- container := daemon.Get(name)
- if container == nil {
- return job.Errorf("No such container: %s", name)
+ container, err := daemon.Get(name)
+ if err != nil {
+ return job.Error(err)
}
var (
- config = container.Config
- newConfig runconfig.Config
+ config = container.Config
+ stdoutBuffer = bytes.NewBuffer(nil)
+ newConfig runconfig.Config
)
- if err := job.GetenvJson("config", &newConfig); err != nil {
+ buildConfigJob := daemon.eng.Job("build_config")
+ buildConfigJob.Stdout.Add(stdoutBuffer)
+ buildConfigJob.Setenv("changes", job.Getenv("changes"))
+ // FIXME this should be remove when we remove deprecated config param
+ buildConfigJob.Setenv("config", job.Getenv("config"))
+
+ if err := buildConfigJob.Run(); err != nil {
+ return job.Error(err)
+ }
+ if err := json.NewDecoder(stdoutBuffer).Decode(&newConfig); err != nil {
return job.Error(err)
}
@@ -41,7 +54,7 @@ func (daemon *Daemon) ContainerCommit(job *engine.Job) engine.Status {
// Commit creates a new filesystem image from the current state of a container.
// The image can optionally be tagged into a repository
func (daemon *Daemon) Commit(container *Container, repository, tag, comment, author string, pause bool, config *runconfig.Config) (*image.Image, error) {
- if pause {
+ if pause && !container.IsPaused() {
container.Pause()
defer container.Unpause()
}
diff --git a/daemon/config.go b/daemon/config.go
index 99e5ce4c8b..9b38fde4ed 100644
--- a/daemon/config.go
+++ b/daemon/config.go
@@ -6,6 +6,8 @@ import (
"github.com/docker/docker/daemon/networkdriver"
"github.com/docker/docker/opts"
flag "github.com/docker/docker/pkg/mflag"
+ "github.com/docker/docker/pkg/ulimit"
+ "github.com/docker/docker/runconfig"
)
const (
@@ -37,11 +39,16 @@ type Config struct {
GraphOptions []string
ExecDriver string
Mtu int
+ SocketGroup string
+ EnableCors bool
+ CorsHeaders string
DisableNetwork bool
EnableSelinuxSupport bool
Context map[string][]string
TrustKeyPath string
Labels []string
+ Ulimits map[string]*ulimit.Ulimit
+ LogConfig runconfig.LogConfig
}
// InstallFlags adds command-line options to the top-level flag parser for
@@ -50,27 +57,33 @@ type Config struct {
// from the command-line.
func (config *Config) InstallFlags() {
flag.StringVar(&config.Pidfile, []string{"p", "-pidfile"}, "/var/run/docker.pid", "Path to use for daemon PID file")
- flag.StringVar(&config.Root, []string{"g", "-graph"}, "/var/lib/docker", "Path to use as the root of the Docker runtime")
+ flag.StringVar(&config.Root, []string{"g", "-graph"}, "/var/lib/docker", "Root of the Docker runtime")
flag.BoolVar(&config.AutoRestart, []string{"#r", "#-restart"}, true, "--restart on the daemon has been deprecated in favor of --restart policies on docker run")
- flag.BoolVar(&config.EnableIptables, []string{"#iptables", "-iptables"}, true, "Enable Docker's addition of iptables rules")
- flag.BoolVar(&config.EnableIpForward, []string{"#ip-forward", "-ip-forward"}, true, "Enable net.ipv4.ip_forward and IPv6 forwarding if --fixed-cidr-v6 is defined. IPv6 forwarding may interfere with your existing IPv6 configuration when using Router Advertisement.")
- flag.BoolVar(&config.EnableIpMasq, []string{"-ip-masq"}, true, "Enable IP masquerading for bridge's IP range")
+ flag.BoolVar(&config.EnableIptables, []string{"#iptables", "-iptables"}, true, "Enable addition of iptables rules")
+ flag.BoolVar(&config.EnableIpForward, []string{"#ip-forward", "-ip-forward"}, true, "Enable net.ipv4.ip_forward")
+ flag.BoolVar(&config.EnableIpMasq, []string{"-ip-masq"}, true, "Enable IP masquerading")
flag.BoolVar(&config.EnableIPv6, []string{"-ipv6"}, false, "Enable IPv6 networking")
- flag.StringVar(&config.BridgeIP, []string{"#bip", "-bip"}, "", "Use this CIDR notation address for the network bridge's IP, not compatible with -b")
- flag.StringVar(&config.BridgeIface, []string{"b", "-bridge"}, "", "Attach containers to a pre-existing network bridge\nuse 'none' to disable container networking")
- flag.StringVar(&config.FixedCIDR, []string{"-fixed-cidr"}, "", "IPv4 subnet for fixed IPs (e.g. 10.20.0.0/16)\nthis subnet must be nested in the bridge subnet (which is defined by -b or --bip)")
- flag.StringVar(&config.FixedCIDRv6, []string{"-fixed-cidr-v6"}, "", "IPv6 subnet for fixed IPs (e.g.: 2001:a02b/48)")
- flag.BoolVar(&config.InterContainerCommunication, []string{"#icc", "-icc"}, true, "Allow unrestricted inter-container and Docker daemon host communication")
- flag.StringVar(&config.GraphDriver, []string{"s", "-storage-driver"}, "", "Force the Docker runtime to use a specific storage driver")
- flag.StringVar(&config.ExecDriver, []string{"e", "-exec-driver"}, "native", "Force the Docker runtime to use a specific exec driver")
- flag.BoolVar(&config.EnableSelinuxSupport, []string{"-selinux-enabled"}, false, "Enable selinux support. SELinux does not presently support the BTRFS storage driver")
- flag.IntVar(&config.Mtu, []string{"#mtu", "-mtu"}, 0, "Set the containers network MTU\nif no value is provided: default to the default route MTU or 1500 if no default route is available")
- opts.IPVar(&config.DefaultIp, []string{"#ip", "-ip"}, "0.0.0.0", "Default IP address to use when binding container ports")
+ flag.StringVar(&config.BridgeIP, []string{"#bip", "-bip"}, "", "Specify network bridge IP")
+ flag.StringVar(&config.BridgeIface, []string{"b", "-bridge"}, "", "Attach containers to a network bridge")
+ flag.StringVar(&config.FixedCIDR, []string{"-fixed-cidr"}, "", "IPv4 subnet for fixed IPs")
+ flag.StringVar(&config.FixedCIDRv6, []string{"-fixed-cidr-v6"}, "", "IPv6 subnet for fixed IPs")
+ flag.BoolVar(&config.InterContainerCommunication, []string{"#icc", "-icc"}, true, "Enable inter-container communication")
+ flag.StringVar(&config.GraphDriver, []string{"s", "-storage-driver"}, "", "Storage driver to use")
+ flag.StringVar(&config.ExecDriver, []string{"e", "-exec-driver"}, "native", "Exec driver to use")
+ flag.BoolVar(&config.EnableSelinuxSupport, []string{"-selinux-enabled"}, false, "Enable selinux support")
+ flag.IntVar(&config.Mtu, []string{"#mtu", "-mtu"}, 0, "Set the containers network MTU")
+ flag.StringVar(&config.SocketGroup, []string{"G", "-group"}, "docker", "Group for the unix socket")
+ flag.BoolVar(&config.EnableCors, []string{"#api-enable-cors", "#-api-enable-cors"}, false, "Enable CORS headers in the remote API, this is deprecated by --api-cors-header")
+ flag.StringVar(&config.CorsHeaders, []string{"-api-cors-header"}, "", "Set CORS headers in the remote API")
+ opts.IPVar(&config.DefaultIp, []string{"#ip", "-ip"}, "0.0.0.0", "Default IP when binding container ports")
opts.ListVar(&config.GraphOptions, []string{"-storage-opt"}, "Set storage driver options")
// FIXME: why the inconsistency between "hosts" and "sockets"?
- opts.IPListVar(&config.Dns, []string{"#dns", "-dns"}, "Force Docker to use specific DNS servers")
- opts.DnsSearchListVar(&config.DnsSearch, []string{"-dns-search"}, "Force Docker to use specific DNS search domains")
- opts.LabelListVar(&config.Labels, []string{"-label"}, "Set key=value labels to the daemon (displayed in `docker info`)")
+ opts.IPListVar(&config.Dns, []string{"#dns", "-dns"}, "DNS server to use")
+ opts.DnsSearchListVar(&config.DnsSearch, []string{"-dns-search"}, "DNS search domains to use")
+ opts.LabelListVar(&config.Labels, []string{"-label"}, "Set key=value labels to the daemon")
+ config.Ulimits = make(map[string]*ulimit.Ulimit)
+ opts.UlimitMapVar(config.Ulimits, []string{"-default-ulimit"}, "Set default ulimits for containers")
+ flag.StringVar(&config.LogConfig.Type, []string{"-log-driver"}, "json-file", "Containers logging driver")
}
func getDefaultNetworkMtu() int {
diff --git a/daemon/container.go b/daemon/container.go
index c1c215ffee..4f6ff2ec00 100644
--- a/daemon/container.go
+++ b/daemon/container.go
@@ -14,22 +14,30 @@ import (
"syscall"
"time"
+ "github.com/docker/libcontainer"
+ "github.com/docker/libcontainer/configs"
"github.com/docker/libcontainer/devices"
"github.com/docker/libcontainer/label"
log "github.com/Sirupsen/logrus"
"github.com/docker/docker/daemon/execdriver"
+ "github.com/docker/docker/daemon/logger"
+ "github.com/docker/docker/daemon/logger/jsonfilelog"
+ "github.com/docker/docker/daemon/logger/syslog"
"github.com/docker/docker/engine"
"github.com/docker/docker/image"
"github.com/docker/docker/links"
"github.com/docker/docker/nat"
"github.com/docker/docker/pkg/archive"
"github.com/docker/docker/pkg/broadcastwriter"
+ "github.com/docker/docker/pkg/common"
+ "github.com/docker/docker/pkg/directory"
"github.com/docker/docker/pkg/ioutils"
"github.com/docker/docker/pkg/networkfs/etchosts"
"github.com/docker/docker/pkg/networkfs/resolvconf"
"github.com/docker/docker/pkg/promise"
"github.com/docker/docker/pkg/symlink"
+ "github.com/docker/docker/pkg/ulimit"
"github.com/docker/docker/runconfig"
"github.com/docker/docker/utils"
)
@@ -70,6 +78,7 @@ type Container struct {
ResolvConfPath string
HostnamePath string
HostsPath string
+ LogPath string
Name string
Driver string
ExecDriver string
@@ -92,9 +101,12 @@ type Container struct {
VolumesRW map[string]bool
hostConfig *runconfig.HostConfig
- activeLinks map[string]*links.Link
- monitor *containerMonitor
- execCommands *execStore
+ activeLinks map[string]*links.Link
+ monitor *containerMonitor
+ execCommands *execStore
+ // logDriver for closing
+ logDriver logger.Logger
+ logCopier *logger.Copier
AppliedVolumesFrom map[string]struct{}
}
@@ -255,18 +267,18 @@ func populateCommand(c *Container, env []string) error {
pid.HostPid = c.hostConfig.PidMode.IsHost()
// Build lists of devices allowed and created within the container.
- userSpecifiedDevices := make([]*devices.Device, len(c.hostConfig.Devices))
+ userSpecifiedDevices := make([]*configs.Device, len(c.hostConfig.Devices))
for i, deviceMapping := range c.hostConfig.Devices {
- device, err := devices.GetDevice(deviceMapping.PathOnHost, deviceMapping.CgroupPermissions)
+ device, err := devices.DeviceFromPath(deviceMapping.PathOnHost, deviceMapping.CgroupPermissions)
if err != nil {
return fmt.Errorf("error gathering device information while adding custom device %q: %s", deviceMapping.PathOnHost, err)
}
device.Path = deviceMapping.PathInContainer
userSpecifiedDevices[i] = device
}
- allowedDevices := append(devices.DefaultAllowedDevices, userSpecifiedDevices...)
+ allowedDevices := append(configs.DefaultAllowedDevices, userSpecifiedDevices...)
- autoCreatedDevices := append(devices.DefaultAutoCreatedDevices, userSpecifiedDevices...)
+ autoCreatedDevices := append(configs.DefaultAutoCreatedDevices, userSpecifiedDevices...)
// TODO: this can be removed after lxc-conf is fully deprecated
lxcConfig, err := mergeLxcConfIntoOptions(c.hostConfig)
@@ -274,11 +286,34 @@ func populateCommand(c *Container, env []string) error {
return err
}
+ var rlimits []*ulimit.Rlimit
+ ulimits := c.hostConfig.Ulimits
+
+ // Merge ulimits with daemon defaults
+ ulIdx := make(map[string]*ulimit.Ulimit)
+ for _, ul := range ulimits {
+ ulIdx[ul.Name] = ul
+ }
+ for name, ul := range c.daemon.config.Ulimits {
+ if _, exists := ulIdx[name]; !exists {
+ ulimits = append(ulimits, ul)
+ }
+ }
+
+ for _, limit := range ulimits {
+ rl, err := limit.GetRlimit()
+ if err != nil {
+ return err
+ }
+ rlimits = append(rlimits, rl)
+ }
+
resources := &execdriver.Resources{
- Memory: c.Config.Memory,
- MemorySwap: c.Config.MemorySwap,
- CpuShares: c.Config.CpuShares,
- Cpuset: c.Config.Cpuset,
+ Memory: c.hostConfig.Memory,
+ MemorySwap: c.hostConfig.MemorySwap,
+ CpuShares: c.hostConfig.CpuShares,
+ CpusetCpus: c.hostConfig.CpusetCpus,
+ Rlimits: rlimits,
}
processConfig := execdriver.ProcessConfig{
@@ -311,6 +346,7 @@ func populateCommand(c *Container, env []string) error {
MountLabel: c.GetMountLabel(),
LxcConfig: lxcConfig,
AppArmorProfile: c.AppArmorProfile,
+ CgroupParent: c.hostConfig.CgroupParent,
}
return nil
@@ -324,7 +360,11 @@ func (container *Container) Start() (err error) {
return nil
}
- // if we encounter and error during start we need to ensure that any other
+ if container.removalInProgress || container.Dead {
+ return fmt.Errorf("Container is marked for removal and cannot be started.")
+ }
+
+ // if we encounter an error during start we need to ensure that any other
// setup has been cleaned up properly
defer func() {
if err != nil {
@@ -457,11 +497,18 @@ func (container *Container) buildHostsFiles(IP string) error {
for linkAlias, child := range children {
_, alias := path.Split(linkAlias)
- extraContent = append(extraContent, etchosts.Record{Hosts: alias, IP: child.NetworkSettings.IPAddress})
+ // allow access to the linked container via the alias, real name, and container hostname
+ aliasList := alias + " " + child.Config.Hostname
+ // only add the name if alias isn't equal to the name
+ if alias != child.Name[1:] {
+ aliasList = aliasList + " " + child.Name[1:]
+ }
+ extraContent = append(extraContent, etchosts.Record{Hosts: aliasList, IP: child.NetworkSettings.IPAddress})
}
for _, extraHost := range container.hostConfig.ExtraHosts {
- parts := strings.Split(extraHost, ":")
+ // allow IPv6 addresses in extra hosts; only split on first ":"
+ parts := strings.SplitN(extraHost, ":", 2)
extraContent = append(extraContent, etchosts.Record{Hosts: parts[0], IP: parts[1]})
}
@@ -652,6 +699,16 @@ func (container *Container) KillSig(sig int) error {
return container.daemon.Kill(container, sig)
}
+// Wrapper aroung KillSig() suppressing "no such process" error.
+func (container *Container) killPossiblyDeadProcess(sig int) error {
+ err := container.KillSig(sig)
+ if err == syscall.ESRCH {
+ log.Debugf("Cannot kill process (pid=%d) with signal %d: no such process.", container.GetPid(), sig)
+ return nil
+ }
+ return err
+}
+
func (container *Container) Pause() error {
if container.IsPaused() {
return fmt.Errorf("Container %s is already paused", container.ID)
@@ -678,7 +735,7 @@ func (container *Container) Kill() error {
}
// 1. Send SIGKILL
- if err := container.KillSig(9); err != nil {
+ if err := container.killPossiblyDeadProcess(9); err != nil {
return err
}
@@ -686,9 +743,12 @@ func (container *Container) Kill() error {
if _, err := container.WaitStop(10 * time.Second); err != nil {
// Ensure that we don't kill ourselves
if pid := container.GetPid(); pid != 0 {
- log.Infof("Container %s failed to exit within 10 seconds of kill - trying direct SIGKILL", utils.TruncateID(container.ID))
+ log.Infof("Container %s failed to exit within 10 seconds of kill - trying direct SIGKILL", common.TruncateID(container.ID))
if err := syscall.Kill(pid, 9); err != nil {
- return err
+ if err != syscall.ESRCH {
+ return err
+ }
+ log.Debugf("Cannot kill process (pid=%d) with signal 9: no such process.", pid)
}
}
}
@@ -703,9 +763,9 @@ func (container *Container) Stop(seconds int) error {
}
// 1. Send a SIGTERM
- if err := container.KillSig(15); err != nil {
+ if err := container.killPossiblyDeadProcess(15); err != nil {
log.Infof("Failed to send SIGTERM to the process, force killing")
- if err := container.KillSig(9); err != nil {
+ if err := container.killPossiblyDeadProcess(9); err != nil {
return err
}
}
@@ -848,7 +908,7 @@ func (container *Container) GetSize() (int64, int64) {
)
if err := container.Mount(); err != nil {
- log.Errorf("Warning: failed to compute size of container rootfs %s: %s", container.ID, err)
+ log.Errorf("Failed to compute size of container rootfs %s: %s", container.ID, err)
return sizeRw, sizeRootfs
}
defer container.Unmount()
@@ -856,14 +916,14 @@ func (container *Container) GetSize() (int64, int64) {
initID := fmt.Sprintf("%s-init", container.ID)
sizeRw, err = driver.DiffSize(container.ID, initID)
if err != nil {
- log.Errorf("Warning: driver %s couldn't return diff size of container %s: %s", driver, container.ID, err)
+ log.Errorf("Driver %s couldn't return diff size of container %s: %s", driver, container.ID, err)
// FIXME: GetSize should return an error. Not changing it now in case
// there is a side-effect.
sizeRw = -1
}
if _, err = os.Stat(container.basefs); err != nil {
- if sizeRootfs, err = utils.TreeSize(container.basefs); err != nil {
+ if sizeRootfs, err = directory.Size(container.basefs); err != nil {
sizeRootfs = -1
}
}
@@ -925,7 +985,7 @@ func (container *Container) Exposes(p nat.Port) bool {
return exists
}
-func (container *Container) GetPtyMaster() (*os.File, error) {
+func (container *Container) GetPtyMaster() (libcontainer.Console, error) {
ttyConsole, ok := container.command.ProcessConfig.Terminal.(execdriver.TtyTerminal)
if !ok {
return nil, ErrNoTTY
@@ -1113,7 +1173,12 @@ func (container *Container) updateParentsHosts() error {
if ref.ParentID == "0" {
continue
}
- c := container.daemon.Get(ref.ParentID)
+
+ c, err := container.daemon.Get(ref.ParentID)
+ if err != nil {
+ log.Error(err)
+ }
+
if c != nil && !container.daemon.config.DisableNetwork && container.hostConfig.NetworkMode.IsPrivate() {
log.Debugf("Update /etc/hosts of %s for alias %s with ip %s", c.ID, ref.Name, container.NetworkSettings.IPAddress)
if err := etchosts.Update(c.HostsPath, container.NetworkSettings.IPAddress, ref.Name); err != nil {
@@ -1163,6 +1228,7 @@ func (container *Container) initializeNetworking() error {
if err != nil {
return err
}
+ container.HostnamePath = nc.HostnamePath
container.HostsPath = nc.HostsPath
container.ResolvConfPath = nc.ResolvConfPath
container.Config.Hostname = nc.Config.Hostname
@@ -1182,15 +1248,15 @@ func (container *Container) initializeNetworking() error {
// Make sure the config is compatible with the current kernel
func (container *Container) verifyDaemonSettings() {
if container.Config.Memory > 0 && !container.daemon.sysInfo.MemoryLimit {
- log.Infof("WARNING: Your kernel does not support memory limit capabilities. Limitation discarded.")
+ log.Warnf("Your kernel does not support memory limit capabilities. Limitation discarded.")
container.Config.Memory = 0
}
if container.Config.Memory > 0 && !container.daemon.sysInfo.SwapLimit {
- log.Infof("WARNING: Your kernel does not support swap limit capabilities. Limitation discarded.")
+ log.Warnf("Your kernel does not support swap limit capabilities. Limitation discarded.")
container.Config.MemorySwap = -1
}
if container.daemon.sysInfo.IPv4ForwardingDisabled {
- log.Infof("WARNING: IPv4 forwarding is disabled. Networking will not work")
+ log.Warnf("IPv4 forwarding is disabled. Networking will not work")
}
}
@@ -1208,7 +1274,7 @@ func (container *Container) setupLinkedContainers() ([]string, error) {
container.activeLinks = make(map[string]*links.Link, len(children))
// If we encounter an error make sure that we rollback any network
- // config and ip table changes
+ // config and iptables changes
rollback := func() {
for _, link := range container.activeLinks {
link.Disable()
@@ -1301,20 +1367,44 @@ func (container *Container) setupWorkingDirectory() error {
return nil
}
-func (container *Container) startLoggingToDisk() error {
- // Setup logging of stdout and stderr to disk
- pth, err := container.logPath("json")
- if err != nil {
- return err
+func (container *Container) startLogging() error {
+ cfg := container.hostConfig.LogConfig
+ if cfg.Type == "" {
+ cfg = container.daemon.defaultLogConfig
}
+ var l logger.Logger
+ switch cfg.Type {
+ case "json-file":
+ pth, err := container.logPath("json")
+ if err != nil {
+ return err
+ }
+ container.LogPath = pth
- if err := container.daemon.LogToDisk(container.stdout, pth, "stdout"); err != nil {
- return err
+ dl, err := jsonfilelog.New(pth)
+ if err != nil {
+ return err
+ }
+ l = dl
+ case "syslog":
+ dl, err := syslog.New(container.ID[:12])
+ if err != nil {
+ return err
+ }
+ l = dl
+ case "none":
+ return nil
+ default:
+ return fmt.Errorf("Unknown logging driver: %s", cfg.Type)
}
- if err := container.daemon.LogToDisk(container.stderr, pth, "stderr"); err != nil {
+ copier, err := logger.NewCopier(container.ID, map[string]io.Reader{"stdout": container.StdoutPipe(), "stderr": container.StderrPipe()}, l)
+ if err != nil {
return err
}
+ container.logCopier = copier
+ copier.Run()
+ container.logDriver = l
return nil
}
@@ -1382,9 +1472,9 @@ func (container *Container) GetMountLabel() string {
func (container *Container) getIpcContainer() (*Container, error) {
containerID := container.hostConfig.IpcMode.Container()
- c := container.daemon.Get(containerID)
- if c == nil {
- return nil, fmt.Errorf("no such container to join IPC: %s", containerID)
+ c, err := container.daemon.Get(containerID)
+ if err != nil {
+ return nil, err
}
if !c.IsRunning() {
return nil, fmt.Errorf("cannot join IPC of a non running container: %s", containerID)
@@ -1399,9 +1489,9 @@ func (container *Container) getNetworkedContainer() (*Container, error) {
if len(parts) != 2 {
return nil, fmt.Errorf("no container specified to join network")
}
- nc := container.daemon.Get(parts[1])
- if nc == nil {
- return nil, fmt.Errorf("no such container to join network: %s", parts[1])
+ nc, err := container.daemon.Get(parts[1])
+ if err != nil {
+ return nil, err
}
if !nc.IsRunning() {
return nil, fmt.Errorf("cannot join network of a non running container: %s", parts[1])
@@ -1415,3 +1505,12 @@ func (container *Container) getNetworkedContainer() (*Container, error) {
func (container *Container) Stats() (*execdriver.ResourceStats, error) {
return container.daemon.Stats(container)
}
+
+func (c *Container) LogDriverType() string {
+ c.Lock()
+ defer c.Unlock()
+ if c.hostConfig.LogConfig.Type == "" {
+ return c.daemon.defaultLogConfig.Type
+ }
+ return c.hostConfig.LogConfig.Type
+}
diff --git a/daemon/copy.go b/daemon/copy.go
index 9d18b010c0..d42f450fdb 100644
--- a/daemon/copy.go
+++ b/daemon/copy.go
@@ -16,18 +16,19 @@ func (daemon *Daemon) ContainerCopy(job *engine.Job) engine.Status {
resource = job.Args[1]
)
- if container := daemon.Get(name); container != nil {
+ container, err := daemon.Get(name)
+ if err != nil {
+ return job.Error(err)
+ }
- data, err := container.Copy(resource)
- if err != nil {
- return job.Error(err)
- }
- defer data.Close()
+ data, err := container.Copy(resource)
+ if err != nil {
+ return job.Error(err)
+ }
+ defer data.Close()
- if _, err := io.Copy(job.Stdout, data); err != nil {
- return job.Error(err)
- }
- return engine.StatusOK
+ if _, err := io.Copy(job.Stdout, data); err != nil {
+ return job.Error(err)
}
- return job.Errorf("No such container: %s", name)
+ return engine.StatusOK
}
diff --git a/daemon/create.go b/daemon/create.go
index 785b0cc345..49bc6a7de9 100644
--- a/daemon/create.go
+++ b/daemon/create.go
@@ -2,6 +2,7 @@ package daemon
import (
"fmt"
+ "strings"
"github.com/docker/docker/engine"
"github.com/docker/docker/graph"
@@ -18,28 +19,29 @@ func (daemon *Daemon) ContainerCreate(job *engine.Job) engine.Status {
} else if len(job.Args) > 1 {
return job.Errorf("Usage: %s", job.Name)
}
+
config := runconfig.ContainerConfigFromJob(job)
- if config.Memory != 0 && config.Memory < 4194304 {
+ hostConfig := runconfig.ContainerHostConfigFromJob(job)
+
+ if len(hostConfig.LxcConf) > 0 && !strings.Contains(daemon.ExecutionDriver().Name(), "lxc") {
+ return job.Errorf("Cannot use --lxc-conf with execdriver: %s", daemon.ExecutionDriver().Name())
+ }
+ if hostConfig.Memory != 0 && hostConfig.Memory < 4194304 {
return job.Errorf("Minimum memory limit allowed is 4MB")
}
- if config.Memory > 0 && !daemon.SystemConfig().MemoryLimit {
+ if hostConfig.Memory > 0 && !daemon.SystemConfig().MemoryLimit {
job.Errorf("Your kernel does not support memory limit capabilities. Limitation discarded.\n")
- config.Memory = 0
+ hostConfig.Memory = 0
}
- if config.Memory > 0 && !daemon.SystemConfig().SwapLimit {
+ if hostConfig.Memory > 0 && hostConfig.MemorySwap != -1 && !daemon.SystemConfig().SwapLimit {
job.Errorf("Your kernel does not support swap limit capabilities. Limitation discarded.\n")
- config.MemorySwap = -1
+ hostConfig.MemorySwap = -1
}
- if config.Memory > 0 && config.MemorySwap > 0 && config.MemorySwap < config.Memory {
+ if hostConfig.Memory > 0 && hostConfig.MemorySwap > 0 && hostConfig.MemorySwap < hostConfig.Memory {
return job.Errorf("Minimum memoryswap limit should be larger than memory limit, see usage.\n")
}
-
- var hostConfig *runconfig.HostConfig
- if job.EnvExists("HostConfig") {
- hostConfig = runconfig.ContainerHostConfigFromJob(job)
- } else {
- // Older versions of the API don't provide a HostConfig.
- hostConfig = nil
+ if hostConfig.Memory == 0 && hostConfig.MemorySwap > 0 {
+ return job.Errorf("You should always set the Memory limit when using Memoryswap limit, see usage.\n")
}
container, buildWarnings, err := daemon.Create(config, hostConfig, name)
@@ -91,7 +93,10 @@ func (daemon *Daemon) Create(config *runconfig.Config, hostConfig *runconfig.Hos
if warnings, err = daemon.mergeAndVerifyConfig(config, img); err != nil {
return nil, nil, err
}
- if hostConfig != nil && hostConfig.SecurityOpt == nil {
+ if hostConfig == nil {
+ hostConfig = &runconfig.HostConfig{}
+ }
+ if hostConfig.SecurityOpt == nil {
hostConfig.SecurityOpt, err = daemon.GenerateSecurityOpt(hostConfig.IpcMode, hostConfig.PidMode)
if err != nil {
return nil, nil, err
@@ -129,9 +134,9 @@ func (daemon *Daemon) GenerateSecurityOpt(ipcMode runconfig.IpcMode, pidMode run
return label.DisableSecOpt(), nil
}
if ipcContainer := ipcMode.Container(); ipcContainer != "" {
- c := daemon.Get(ipcContainer)
- if c == nil {
- return nil, fmt.Errorf("no such container to join IPC: %s", ipcContainer)
+ c, err := daemon.Get(ipcContainer)
+ if err != nil {
+ return nil, err
}
if !c.IsRunning() {
return nil, fmt.Errorf("cannot join IPC of a non running container: %s", ipcContainer)
diff --git a/daemon/daemon.go b/daemon/daemon.go
index c9a730b1f9..b12d217ab7 100644
--- a/daemon/daemon.go
+++ b/daemon/daemon.go
@@ -18,19 +18,19 @@ import (
log "github.com/Sirupsen/logrus"
"github.com/docker/docker/api"
+ "github.com/docker/docker/autogen/dockerversion"
"github.com/docker/docker/daemon/execdriver"
"github.com/docker/docker/daemon/execdriver/execdrivers"
"github.com/docker/docker/daemon/execdriver/lxc"
"github.com/docker/docker/daemon/graphdriver"
_ "github.com/docker/docker/daemon/graphdriver/vfs"
_ "github.com/docker/docker/daemon/networkdriver/bridge"
- "github.com/docker/docker/daemon/networkdriver/portallocator"
- "github.com/docker/docker/dockerversion"
"github.com/docker/docker/engine"
"github.com/docker/docker/graph"
"github.com/docker/docker/image"
"github.com/docker/docker/pkg/archive"
"github.com/docker/docker/pkg/broadcastwriter"
+ "github.com/docker/docker/pkg/common"
"github.com/docker/docker/pkg/graphdb"
"github.com/docker/docker/pkg/ioutils"
"github.com/docker/docker/pkg/namesgenerator"
@@ -88,23 +88,24 @@ func (c *contStore) List() []*Container {
}
type Daemon struct {
- ID string
- repository string
- sysInitPath string
- containers *contStore
- execCommands *execStore
- graph *graph.Graph
- repositories *graph.TagStore
- idIndex *truncindex.TruncIndex
- sysInfo *sysinfo.SysInfo
- volumes *volumes.Repository
- eng *engine.Engine
- config *Config
- containerGraph *graphdb.Database
- driver graphdriver.Driver
- execDriver execdriver.Driver
- trustStore *trust.TrustStore
- statsCollector *statsCollector
+ ID string
+ repository string
+ sysInitPath string
+ containers *contStore
+ execCommands *execStore
+ graph *graph.Graph
+ repositories *graph.TagStore
+ idIndex *truncindex.TruncIndex
+ sysInfo *sysinfo.SysInfo
+ volumes *volumes.Repository
+ eng *engine.Engine
+ config *Config
+ containerGraph *graphdb.Database
+ driver graphdriver.Driver
+ execDriver execdriver.Driver
+ trustStore *trust.TrustStore
+ statsCollector *statsCollector
+ defaultLogConfig runconfig.LogConfig
}
// Install installs daemon capabilities to eng.
@@ -155,28 +156,40 @@ func (daemon *Daemon) Install(eng *engine.Engine) error {
return nil
}
-// Get looks for a container by the specified ID or name, and returns it.
-// If the container is not found, or if an error occurs, nil is returned.
-func (daemon *Daemon) Get(name string) *Container {
- id, err := daemon.idIndex.Get(name)
- if err == nil {
- return daemon.containers.Get(id)
+// Get looks for a container using the provided information, which could be
+// one of the following inputs from the caller:
+// - A full container ID, which will exact match a container in daemon's list
+// - A container name, which will only exact match via the GetByName() function
+// - A partial container ID prefix (e.g. short ID) of any length that is
+// unique enough to only return a single container object
+// If none of these searches succeed, an error is returned
+func (daemon *Daemon) Get(prefixOrName string) (*Container, error) {
+ if containerByID := daemon.containers.Get(prefixOrName); containerByID != nil {
+ // prefix is an exact match to a full container ID
+ return containerByID, nil
}
- if c, _ := daemon.GetByName(name); c != nil {
- return c
+ // GetByName will match only an exact name provided; we ignore errors
+ containerByName, _ := daemon.GetByName(prefixOrName)
+ containerId, indexError := daemon.idIndex.Get(prefixOrName)
+
+ if containerByName != nil {
+ // prefix is an exact match to a full container Name
+ return containerByName, nil
}
- if err == truncindex.ErrDuplicateID {
- log.Errorf("Short ID %s is ambiguous: please retry with more characters or use the full ID.\n", name)
+ if containerId != "" {
+ // prefix is a fuzzy match to a container ID
+ return daemon.containers.Get(containerId), nil
}
- return nil
+ return nil, indexError
}
// Exists returns a true if a container of the specified ID or name exists,
// false otherwise.
func (daemon *Daemon) Exists(id string) bool {
- return daemon.Get(id) != nil
+ c, _ := daemon.Get(id)
+ return c != nil
}
func (daemon *Daemon) containerRoot(id string) string {
@@ -274,19 +287,8 @@ func (daemon *Daemon) register(container *Container, updateSuffixarray bool) err
if err := container.ToDisk(); err != nil {
log.Debugf("saving stopped state to disk %s", err)
}
-
- info := daemon.execDriver.Info(container.ID)
- if !info.IsRunning() {
- log.Debugf("Container %s was supposed to be running but is not.", container.ID)
-
- log.Debugf("Marking as stopped")
-
- container.SetStopped(&execdriver.ExitStatus{ExitCode: -127})
- if err := container.ToDisk(); err != nil {
- return err
- }
- }
}
+
return nil
}
@@ -332,7 +334,7 @@ func (daemon *Daemon) restore() error {
for _, v := range dir {
id := v.Name()
container, err := daemon.load(id)
- if !debug {
+ if !debug && log.GetLevel() == log.InfoLevel {
fmt.Print(".")
}
if err != nil {
@@ -354,7 +356,7 @@ func (daemon *Daemon) restore() error {
if entities := daemon.containerGraph.List("/", -1); entities != nil {
for _, p := range entities.Paths() {
- if !debug {
+ if !debug && log.GetLevel() == log.InfoLevel {
fmt.Print(".")
}
@@ -406,7 +408,9 @@ func (daemon *Daemon) restore() error {
}
if !debug {
- fmt.Println()
+ if log.GetLevel() == log.InfoLevel {
+ fmt.Println()
+ }
log.Infof("Loading containers: done.")
}
@@ -428,7 +432,9 @@ func (daemon *Daemon) setupResolvconfWatcher() error {
for {
select {
case event := <-watcher.Events:
- if event.Op&fsnotify.Write == fsnotify.Write {
+ if event.Name == "/etc/resolv.conf" &&
+ (event.Op&fsnotify.Write == fsnotify.Write ||
+ event.Op&fsnotify.Create == fsnotify.Create) {
// verify a real change happened before we go further--a file write may have happened
// without an actual change to the file
updatedResolvConf, newResolvConfHash, err := resolvconf.GetIfChanged()
@@ -461,7 +467,7 @@ func (daemon *Daemon) setupResolvconfWatcher() error {
}
}()
- if err := watcher.Add("/etc/resolv.conf"); err != nil {
+ if err := watcher.Add("/etc"); err != nil {
return err
}
return nil
@@ -499,7 +505,7 @@ func (daemon *Daemon) mergeAndVerifyConfig(config *runconfig.Config, img *image.
func (daemon *Daemon) generateIdAndName(name string) (string, string, error) {
var (
err error
- id = utils.GenerateRandomID()
+ id = common.GenerateRandomID()
)
if name == "" {
@@ -544,7 +550,7 @@ func (daemon *Daemon) reserveName(id, name string) (string, error) {
nameAsKnownByUser := strings.TrimPrefix(name, "/")
return "", fmt.Errorf(
"Conflict. The name %q is already in use by container %s. You have to delete (or rename) that container to be able to reuse that name.", nameAsKnownByUser,
- utils.TruncateID(conflictingContainer.ID))
+ common.TruncateID(conflictingContainer.ID))
}
}
return name, nil
@@ -567,7 +573,7 @@ func (daemon *Daemon) generateNewName(id string) (string, error) {
return name, nil
}
- name = "/" + utils.TruncateID(id)
+ name = "/" + common.TruncateID(id)
if _, err := daemon.containerGraph.Set(name, id); err != nil {
return "", err
}
@@ -715,9 +721,9 @@ func (daemon *Daemon) Children(name string) (map[string]*Container, error) {
children := make(map[string]*Container)
err = daemon.containerGraph.Walk(name, func(p string, e *graphdb.Entity) error {
- c := daemon.Get(e.ID())
- if c == nil {
- return fmt.Errorf("Could not get container for name %s and id %s", e.ID(), p)
+ c, err := daemon.Get(e.ID())
+ if err != nil {
+ return err
}
children[p] = c
return nil
@@ -754,10 +760,18 @@ func (daemon *Daemon) RegisterLinks(container *Container, hostConfig *runconfig.
if err != nil {
return err
}
- child := daemon.Get(parts["name"])
- if child == nil {
+ child, err := daemon.Get(parts["name"])
+ if err != nil {
+ //An error from daemon.Get() means this name could not be found
return fmt.Errorf("Could not get container for %s", parts["name"])
}
+ for child.hostConfig.NetworkMode.IsContainer() {
+ parts := strings.SplitN(string(child.hostConfig.NetworkMode), ":", 2)
+ child, err = daemon.Get(parts[1])
+ if err != nil {
+ return fmt.Errorf("Could not get container for %s", parts[1])
+ }
+ }
if child.hostConfig.NetworkMode.IsHost() {
return runconfig.ErrConflictHostNetworkAndLinks
}
@@ -834,9 +848,6 @@ func NewDaemonFromDirectory(config *Config, eng *engine.Engine) (*Daemon, error)
return nil, fmt.Errorf("Unable to get the full path to the TempDir (%s): %s", tmp, err)
}
os.Setenv("TMPDIR", realTmp)
- if !config.EnableSelinuxSupport {
- selinuxSetDisabled()
- }
// get the canonical path to the Docker root directory
var realRoot string
@@ -860,13 +871,28 @@ func NewDaemonFromDirectory(config *Config, eng *engine.Engine) (*Daemon, error)
// Load storage driver
driver, err := graphdriver.New(config.Root, config.GraphOptions)
if err != nil {
- return nil, err
+ return nil, fmt.Errorf("error intializing graphdriver: %v", err)
}
log.Debugf("Using graph driver %s", driver)
+ // register cleanup for graph driver
+ eng.OnShutdown(func() {
+ if err := driver.Cleanup(); err != nil {
+ log.Errorf("Error during graph storage driver.Cleanup(): %v", err)
+ }
+ })
- // As Docker on btrfs and SELinux are incompatible at present, error on both being enabled
- if selinuxEnabled() && config.EnableSelinuxSupport && driver.String() == "btrfs" {
- return nil, fmt.Errorf("SELinux is not supported with the BTRFS graph driver!")
+ if config.EnableSelinuxSupport {
+ if selinuxEnabled() {
+ // As Docker on btrfs and SELinux are incompatible at present, error on both being enabled
+ if driver.String() == "btrfs" {
+ return nil, fmt.Errorf("SELinux is not supported with the BTRFS graph driver")
+ }
+ log.Debug("SELinux enabled successfully")
+ } else {
+ log.Warn("Docker could not enable SELinux on the host system")
+ }
+ } else {
+ selinuxSetDisabled()
}
daemonRepo := path.Join(config.Root, "containers")
@@ -940,6 +966,12 @@ func NewDaemonFromDirectory(config *Config, eng *engine.Engine) (*Daemon, error)
if err != nil {
return nil, err
}
+ // register graph close on shutdown
+ eng.OnShutdown(func() {
+ if err := graph.Close(); err != nil {
+ log.Errorf("Error during container graph.Close(): %v", err)
+ }
+ })
localCopy := path.Join(config.Root, "init", fmt.Sprintf("dockerinit-%s", dockerversion.VERSION))
sysInitPath := utils.DockerInitPath(localCopy)
@@ -962,30 +994,39 @@ func NewDaemonFromDirectory(config *Config, eng *engine.Engine) (*Daemon, error)
}
sysInfo := sysinfo.New(false)
- ed, err := execdrivers.NewDriver(config.ExecDriver, config.Root, sysInitPath, sysInfo)
+ const runDir = "/var/run/docker"
+ ed, err := execdrivers.NewDriver(config.ExecDriver, runDir, config.Root, sysInitPath, sysInfo)
if err != nil {
return nil, err
}
daemon := &Daemon{
- ID: trustKey.PublicKey().KeyID(),
- repository: daemonRepo,
- containers: &contStore{s: make(map[string]*Container)},
- execCommands: newExecStore(),
- graph: g,
- repositories: repositories,
- idIndex: truncindex.NewTruncIndex([]string{}),
- sysInfo: sysInfo,
- volumes: volumes,
- config: config,
- containerGraph: graph,
- driver: driver,
- sysInitPath: sysInitPath,
- execDriver: ed,
- eng: eng,
- trustStore: t,
- statsCollector: newStatsCollector(1 * time.Second),
+ ID: trustKey.PublicKey().KeyID(),
+ repository: daemonRepo,
+ containers: &contStore{s: make(map[string]*Container)},
+ execCommands: newExecStore(),
+ graph: g,
+ repositories: repositories,
+ idIndex: truncindex.NewTruncIndex([]string{}),
+ sysInfo: sysInfo,
+ volumes: volumes,
+ config: config,
+ containerGraph: graph,
+ driver: driver,
+ sysInitPath: sysInitPath,
+ execDriver: ed,
+ eng: eng,
+ trustStore: t,
+ statsCollector: newStatsCollector(1 * time.Second),
+ defaultLogConfig: config.LogConfig,
}
+
+ eng.OnShutdown(func() {
+ if err := daemon.shutdown(); err != nil {
+ log.Errorf("Error during daemon.shutdown(): %v", err)
+ }
+ })
+
if err := daemon.restore(); err != nil {
return nil, err
}
@@ -995,25 +1036,6 @@ func NewDaemonFromDirectory(config *Config, eng *engine.Engine) (*Daemon, error)
return nil, err
}
- // Setup shutdown handlers
- // FIXME: can these shutdown handlers be registered closer to their source?
- eng.OnShutdown(func() {
- // FIXME: if these cleanup steps can be called concurrently, register
- // them as separate handlers to speed up total shutdown time
- if err := daemon.shutdown(); err != nil {
- log.Errorf("daemon.shutdown(): %s", err)
- }
- if err := portallocator.ReleaseAll(); err != nil {
- log.Errorf("portallocator.ReleaseAll(): %s", err)
- }
- if err := daemon.driver.Cleanup(); err != nil {
- log.Errorf("daemon.driver.Cleanup(): %s", err.Error())
- }
- if err := daemon.containerGraph.Close(); err != nil {
- log.Errorf("daemon.containerGraph.Close(): %s", err.Error())
- }
- })
-
return daemon, nil
}
@@ -1100,18 +1122,18 @@ func (daemon *Daemon) Stats(c *Container) (*execdriver.ResourceStats, error) {
}
func (daemon *Daemon) SubscribeToContainerStats(name string) (chan interface{}, error) {
- c := daemon.Get(name)
- if c == nil {
- return nil, fmt.Errorf("no such container")
+ c, err := daemon.Get(name)
+ if err != nil {
+ return nil, err
}
ch := daemon.statsCollector.collect(c)
return ch, nil
}
func (daemon *Daemon) UnsubscribeToContainerStats(name string, ch chan interface{}) error {
- c := daemon.Get(name)
- if c == nil {
- return fmt.Errorf("no such container")
+ c, err := daemon.Get(name)
+ if err != nil {
+ return err
}
daemon.statsCollector.unsubscribe(c, ch)
return nil
@@ -1214,11 +1236,11 @@ func checkKernel() error {
// the circumstances of pre-3.8 crashes are clearer.
// For details see http://github.com/docker/docker/issues/407
if k, err := kernel.GetKernelVersion(); err != nil {
- log.Infof("WARNING: %s", err)
+ log.Warnf("%s", err)
} else {
if kernel.CompareKernelVersion(k, &kernel.KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0}) < 0 {
if os.Getenv("DOCKER_NOWARN_KERNEL_VERSION") == "" {
- log.Infof("WARNING: You are running linux kernel version %s, which might be unstable running docker. Please upgrade your kernel to 3.8.0.", k.String())
+ log.Warnf("You are running linux kernel version %s, which might be unstable running docker. Please upgrade your kernel to 3.8.0.", k.String())
}
}
}
diff --git a/daemon/daemon_test.go b/daemon/daemon_test.go
new file mode 100644
index 0000000000..43030b6f9b
--- /dev/null
+++ b/daemon/daemon_test.go
@@ -0,0 +1,101 @@
+package daemon
+
+import (
+ "github.com/docker/docker/pkg/graphdb"
+ "github.com/docker/docker/pkg/truncindex"
+ "os"
+ "path"
+ "testing"
+)
+
+//
+// https://github.com/docker/docker/issues/8069
+//
+
+func TestGet(t *testing.T) {
+ c1 := &Container{
+ ID: "5a4ff6a163ad4533d22d69a2b8960bf7fafdcba06e72d2febdba229008b0bf57",
+ Name: "tender_bardeen",
+ }
+ c2 := &Container{
+ ID: "3cdbd1aa394fd68559fd1441d6eff2ab7c1e6363582c82febfaa8045df3bd8de",
+ Name: "drunk_hawking",
+ }
+ c3 := &Container{
+ ID: "3cdbd1aa394fd68559fd1441d6eff2abfafdcba06e72d2febdba229008b0bf57",
+ Name: "3cdbd1aa",
+ }
+ c4 := &Container{
+ ID: "75fb0b800922abdbef2d27e60abcdfaf7fb0698b2a96d22d3354da361a6ff4a5",
+ Name: "5a4ff6a163ad4533d22d69a2b8960bf7fafdcba06e72d2febdba229008b0bf57",
+ }
+ c5 := &Container{
+ ID: "d22d69a2b8960bf7fafdcba06e72d2febdba960bf7fafdcba06e72d2f9008b060b",
+ Name: "d22d69a2b896",
+ }
+
+ store := &contStore{
+ s: map[string]*Container{
+ c1.ID: c1,
+ c2.ID: c2,
+ c3.ID: c3,
+ c4.ID: c4,
+ c5.ID: c5,
+ },
+ }
+
+ index := truncindex.NewTruncIndex([]string{})
+ index.Add(c1.ID)
+ index.Add(c2.ID)
+ index.Add(c3.ID)
+ index.Add(c4.ID)
+ index.Add(c5.ID)
+
+ daemonTestDbPath := path.Join(os.TempDir(), "daemon_test.db")
+ graph, err := graphdb.NewSqliteConn(daemonTestDbPath)
+ if err != nil {
+ t.Fatalf("Failed to create daemon test sqlite database at %s", daemonTestDbPath)
+ }
+ graph.Set(c1.Name, c1.ID)
+ graph.Set(c2.Name, c2.ID)
+ graph.Set(c3.Name, c3.ID)
+ graph.Set(c4.Name, c4.ID)
+ graph.Set(c5.Name, c5.ID)
+
+ daemon := &Daemon{
+ containers: store,
+ idIndex: index,
+ containerGraph: graph,
+ }
+
+ if container, _ := daemon.Get("3cdbd1aa394fd68559fd1441d6eff2ab7c1e6363582c82febfaa8045df3bd8de"); container != c2 {
+ t.Fatal("Should explicitly match full container IDs")
+ }
+
+ if container, _ := daemon.Get("75fb0b8009"); container != c4 {
+ t.Fatal("Should match a partial ID")
+ }
+
+ if container, _ := daemon.Get("drunk_hawking"); container != c2 {
+ t.Fatal("Should match a full name")
+ }
+
+ // c3.Name is a partial match for both c3.ID and c2.ID
+ if c, _ := daemon.Get("3cdbd1aa"); c != c3 {
+ t.Fatal("Should match a full name even though it collides with another container's ID")
+ }
+
+ if container, _ := daemon.Get("d22d69a2b896"); container != c5 {
+ t.Fatal("Should match a container where the provided prefix is an exact match to the it's name, and is also a prefix for it's ID")
+ }
+
+ if _, err := daemon.Get("3cdbd1"); err == nil {
+ t.Fatal("Should return an error when provided a prefix that partially matches multiple container ID's")
+ }
+
+ if _, err := daemon.Get("nothing"); err == nil {
+ t.Fatal("Should return an error when provided a prefix that is neither a name or a partial match to an ID")
+ }
+
+ os.Remove(daemonTestDbPath)
+}
diff --git a/daemon/delete.go b/daemon/delete.go
index 59c7651785..40f86df399 100644
--- a/daemon/delete.go
+++ b/daemon/delete.go
@@ -17,10 +17,10 @@ func (daemon *Daemon) ContainerRm(job *engine.Job) engine.Status {
removeVolume := job.GetenvBool("removeVolume")
removeLink := job.GetenvBool("removeLink")
forceRemove := job.GetenvBool("forceRemove")
- container := daemon.Get(name)
- if container == nil {
- return job.Errorf("No such container: %s", name)
+ container, err := daemon.Get(name)
+ if err != nil {
+ return job.Error(err)
}
if removeLink {
@@ -36,7 +36,7 @@ func (daemon *Daemon) ContainerRm(job *engine.Job) engine.Status {
if pe == nil {
return job.Errorf("Cannot get parent %s for name %s", parent, name)
}
- parentContainer := daemon.Get(pe.ID())
+ parentContainer, _ := daemon.Get(pe.ID())
if parentContainer != nil {
parentContainer.DisableLink(n)
@@ -61,8 +61,15 @@ func (daemon *Daemon) ContainerRm(job *engine.Job) engine.Status {
return job.Errorf("Conflict, You cannot remove a running container. Stop the container before attempting removal or use -f")
}
}
- if err := daemon.Destroy(container); err != nil {
- return job.Errorf("Cannot destroy container %s: %s", name, err)
+
+ if forceRemove {
+ if err := daemon.ForceRm(container); err != nil {
+ log.Errorf("Cannot destroy container %s: %v", name, err)
+ }
+ } else {
+ if err := daemon.Rm(container); err != nil {
+ return job.Errorf("Cannot destroy container %s: %v", name, err)
+ }
}
container.LogEvent("destroy")
if removeVolume {
@@ -81,9 +88,16 @@ func (daemon *Daemon) DeleteVolumes(volumeIDs map[string]struct{}) {
}
}
+func (daemon *Daemon) Rm(container *Container) (err error) {
+ return daemon.commonRm(container, false)
+}
+
+func (daemon *Daemon) ForceRm(container *Container) (err error) {
+ return daemon.commonRm(container, true)
+}
+
// Destroy unregisters a container from the daemon and cleanly removes its contents from the filesystem.
-// FIXME: rename to Rm for consistency with the CLI command
-func (daemon *Daemon) Destroy(container *Container) error {
+func (daemon *Daemon) commonRm(container *Container, forceRemove bool) (err error) {
if container == nil {
return fmt.Errorf("The given container is <nil>")
}
@@ -93,19 +107,40 @@ func (daemon *Daemon) Destroy(container *Container) error {
return fmt.Errorf("Container %v not found - maybe it was already destroyed?", container.ID)
}
- if err := container.Stop(3); err != nil {
+ // Container state RemovalInProgress should be used to avoid races.
+ if err = container.SetRemovalInProgress(); err != nil {
+ return fmt.Errorf("Failed to set container state to RemovalInProgress: %s", err)
+ }
+
+ defer container.ResetRemovalInProgress()
+
+ if err = container.Stop(3); err != nil {
return err
}
- // Deregister the container before removing its directory, to avoid race conditions
- daemon.idIndex.Delete(container.ID)
- daemon.containers.Delete(container.ID)
+ // Mark container dead. We don't want anybody to be restarting it.
+ container.SetDead()
+
+ // Save container state to disk. So that if error happens before
+ // container meta file got removed from disk, then a restart of
+ // docker should not make a dead container alive.
+ container.ToDisk()
+
+ // If force removal is required, delete container from various
+ // indexes even if removal failed.
+ defer func() {
+ if err != nil && forceRemove {
+ daemon.idIndex.Delete(container.ID)
+ daemon.containers.Delete(container.ID)
+ }
+ }()
+
container.derefVolumes()
if _, err := daemon.containerGraph.Purge(container.ID); err != nil {
log.Debugf("Unable to remove container from link graph: %s", err)
}
- if err := daemon.driver.Remove(container.ID); err != nil {
+ if err = daemon.driver.Remove(container.ID); err != nil {
return fmt.Errorf("Driver %s failed to remove root filesystem %s: %s", daemon.driver, container.ID, err)
}
@@ -114,15 +149,17 @@ func (daemon *Daemon) Destroy(container *Container) error {
return fmt.Errorf("Driver %s failed to remove init filesystem %s: %s", daemon.driver, initID, err)
}
- if err := os.RemoveAll(container.root); err != nil {
+ if err = os.RemoveAll(container.root); err != nil {
return fmt.Errorf("Unable to remove filesystem for %v: %v", container.ID, err)
}
- if err := daemon.execDriver.Clean(container.ID); err != nil {
+ if err = daemon.execDriver.Clean(container.ID); err != nil {
return fmt.Errorf("Unable to remove execdriver data for %s: %s", container.ID, err)
}
selinuxFreeLxcContexts(container.ProcessLabel)
+ daemon.idIndex.Delete(container.ID)
+ daemon.containers.Delete(container.ID)
return nil
}
diff --git a/daemon/exec.go b/daemon/exec.go
index 8bb4e72d13..3af40ac014 100644
--- a/daemon/exec.go
+++ b/daemon/exec.go
@@ -12,10 +12,10 @@ import (
"github.com/docker/docker/daemon/execdriver/lxc"
"github.com/docker/docker/engine"
"github.com/docker/docker/pkg/broadcastwriter"
+ "github.com/docker/docker/pkg/common"
"github.com/docker/docker/pkg/ioutils"
"github.com/docker/docker/pkg/promise"
"github.com/docker/docker/runconfig"
- "github.com/docker/docker/utils"
)
type execConfig struct {
@@ -74,7 +74,7 @@ func (execConfig *execConfig) Resize(h, w int) error {
}
func (d *Daemon) registerExecCommand(execConfig *execConfig) {
- // Storing execs in container inorder to kill them gracefully whenever the container is stopped or removed.
+ // Storing execs in container in order to kill them gracefully whenever the container is stopped or removed.
execConfig.Container.execCommands.Add(execConfig.ID, execConfig)
// Storing execs in daemon for easy access via remote API.
d.execCommands.Add(execConfig.ID, execConfig)
@@ -97,10 +97,9 @@ func (d *Daemon) unregisterExecCommand(execConfig *execConfig) {
}
func (d *Daemon) getActiveContainer(name string) (*Container, error) {
- container := d.Get(name)
-
- if container == nil {
- return nil, fmt.Errorf("No such container: %s", name)
+ container, err := d.Get(name)
+ if err != nil {
+ return nil, err
}
if !container.IsRunning() {
@@ -142,7 +141,7 @@ func (d *Daemon) ContainerExecCreate(job *engine.Job) engine.Status {
}
execConfig := &execConfig{
- ID: utils.GenerateRandomID(),
+ ID: common.GenerateRandomID(),
OpenStdin: config.AttachStdin,
OpenStdout: config.AttachStdout,
OpenStderr: config.AttachStderr,
@@ -219,7 +218,7 @@ func (d *Daemon) ContainerExecStart(job *engine.Job) engine.Status {
execConfig.StreamConfig.stdinPipe = ioutils.NopWriteCloser(ioutil.Discard) // Silently drop stdin
}
- attachErr := d.attach(&execConfig.StreamConfig, execConfig.OpenStdin, true, execConfig.ProcessConfig.Tty, cStdin, cStdout, cStderr)
+ attachErr := d.Attach(&execConfig.StreamConfig, execConfig.OpenStdin, true, execConfig.ProcessConfig.Tty, cStdin, cStdout, cStderr)
execErr := make(chan error)
diff --git a/daemon/execdriver/MAINTAINERS b/daemon/execdriver/MAINTAINERS
deleted file mode 100644
index 68a97d2fc2..0000000000
--- a/daemon/execdriver/MAINTAINERS
+++ /dev/null
@@ -1,2 +0,0 @@
-Michael Crosby <michael@crosbymichael.com> (@crosbymichael)
-Victor Vieux <vieux@docker.com> (@vieux)
diff --git a/daemon/execdriver/driver.go b/daemon/execdriver/driver.go
index 2215d03cff..e937de3beb 100644
--- a/daemon/execdriver/driver.go
+++ b/daemon/execdriver/driver.go
@@ -1,14 +1,22 @@
package execdriver
import (
+ "encoding/json"
"errors"
"io"
+ "io/ioutil"
"os"
"os/exec"
+ "path/filepath"
+ "strconv"
+ "strings"
"time"
+ "github.com/docker/docker/daemon/execdriver/native/template"
+ "github.com/docker/docker/pkg/ulimit"
"github.com/docker/libcontainer"
- "github.com/docker/libcontainer/devices"
+ "github.com/docker/libcontainer/cgroups/fs"
+ "github.com/docker/libcontainer/configs"
)
// Context is a generic key value pair that allows
@@ -39,7 +47,7 @@ type Terminal interface {
}
type TtyTerminal interface {
- Master() *os.File
+ Master() libcontainer.Console
}
// ExitStatus provides exit reasons for a container.
@@ -98,14 +106,15 @@ type NetworkInterface struct {
}
type Resources struct {
- Memory int64 `json:"memory"`
- MemorySwap int64 `json:"memory_swap"`
- CpuShares int64 `json:"cpu_shares"`
- Cpuset string `json:"cpuset"`
+ Memory int64 `json:"memory"`
+ MemorySwap int64 `json:"memory_swap"`
+ CpuShares int64 `json:"cpu_shares"`
+ CpusetCpus string `json:"cpuset_cpus"`
+ Rlimits []*ulimit.Rlimit `json:"rlimits"`
}
type ResourceStats struct {
- *libcontainer.ContainerStats
+ *libcontainer.Stats
Read time.Time `json:"read"`
MemoryLimit int64 `json:"memory_limit"`
SystemUsage uint64 `json:"system_usage"`
@@ -145,8 +154,8 @@ type Command struct {
Pid *Pid `json:"pid"`
Resources *Resources `json:"resources"`
Mounts []Mount `json:"mounts"`
- AllowedDevices []*devices.Device `json:"allowed_devices"`
- AutoCreatedDevices []*devices.Device `json:"autocreated_devices"`
+ AllowedDevices []*configs.Device `json:"allowed_devices"`
+ AutoCreatedDevices []*configs.Device `json:"autocreated_devices"`
CapAdd []string `json:"cap_add"`
CapDrop []string `json:"cap_drop"`
ContainerPid int `json:"container_pid"` // the pid for the process inside a container
@@ -155,4 +164,144 @@ type Command struct {
MountLabel string `json:"mount_label"`
LxcConfig []string `json:"lxc_config"`
AppArmorProfile string `json:"apparmor_profile"`
+ CgroupParent string `json:"cgroup_parent"` // The parent cgroup for this command.
+}
+
+func InitContainer(c *Command) *configs.Config {
+ container := template.New()
+
+ container.Hostname = getEnv("HOSTNAME", c.ProcessConfig.Env)
+ container.Cgroups.Name = c.ID
+ container.Cgroups.AllowedDevices = c.AllowedDevices
+ container.Readonlyfs = c.ReadonlyRootfs
+ container.Devices = c.AutoCreatedDevices
+ container.Rootfs = c.Rootfs
+ container.Readonlyfs = c.ReadonlyRootfs
+
+ // check to see if we are running in ramdisk to disable pivot root
+ container.NoPivotRoot = os.Getenv("DOCKER_RAMDISK") != ""
+
+ // Default parent cgroup is "docker". Override if required.
+ if c.CgroupParent != "" {
+ container.Cgroups.Parent = c.CgroupParent
+ }
+ return container
+}
+
+func getEnv(key string, env []string) string {
+ for _, pair := range env {
+ parts := strings.Split(pair, "=")
+ if parts[0] == key {
+ return parts[1]
+ }
+ }
+ return ""
+}
+
+func SetupCgroups(container *configs.Config, c *Command) error {
+ if c.Resources != nil {
+ container.Cgroups.CpuShares = c.Resources.CpuShares
+ container.Cgroups.Memory = c.Resources.Memory
+ container.Cgroups.MemoryReservation = c.Resources.Memory
+ container.Cgroups.MemorySwap = c.Resources.MemorySwap
+ container.Cgroups.CpusetCpus = c.Resources.CpusetCpus
+ }
+
+ return nil
+}
+
+// Returns the network statistics for the network interfaces represented by the NetworkRuntimeInfo.
+func getNetworkInterfaceStats(interfaceName string) (*libcontainer.NetworkInterface, error) {
+ out := &libcontainer.NetworkInterface{Name: interfaceName}
+ // This can happen if the network runtime information is missing - possible if the
+ // container was created by an old version of libcontainer.
+ if interfaceName == "" {
+ return out, nil
+ }
+ type netStatsPair struct {
+ // Where to write the output.
+ Out *uint64
+ // The network stats file to read.
+ File string
+ }
+ // Ingress for host veth is from the container. Hence tx_bytes stat on the host veth is actually number of bytes received by the container.
+ netStats := []netStatsPair{
+ {Out: &out.RxBytes, File: "tx_bytes"},
+ {Out: &out.RxPackets, File: "tx_packets"},
+ {Out: &out.RxErrors, File: "tx_errors"},
+ {Out: &out.RxDropped, File: "tx_dropped"},
+
+ {Out: &out.TxBytes, File: "rx_bytes"},
+ {Out: &out.TxPackets, File: "rx_packets"},
+ {Out: &out.TxErrors, File: "rx_errors"},
+ {Out: &out.TxDropped, File: "rx_dropped"},
+ }
+ for _, netStat := range netStats {
+ data, err := readSysfsNetworkStats(interfaceName, netStat.File)
+ if err != nil {
+ return nil, err
+ }
+ *(netStat.Out) = data
+ }
+ return out, nil
+}
+
+// Reads the specified statistics available under /sys/class/net/<EthInterface>/statistics
+func readSysfsNetworkStats(ethInterface, statsFile string) (uint64, error) {
+ data, err := ioutil.ReadFile(filepath.Join("/sys/class/net", ethInterface, "statistics", statsFile))
+ if err != nil {
+ return 0, err
+ }
+ return strconv.ParseUint(strings.TrimSpace(string(data)), 10, 64)
+}
+
+func Stats(containerDir string, containerMemoryLimit int64, machineMemory int64) (*ResourceStats, error) {
+ f, err := os.Open(filepath.Join(containerDir, "state.json"))
+ if err != nil {
+ return nil, err
+ }
+ defer f.Close()
+
+ type network struct {
+ Type string
+ HostInterfaceName string
+ }
+
+ state := struct {
+ CgroupPaths map[string]string `json:"cgroup_paths"`
+ Networks []network
+ }{}
+
+ if err := json.NewDecoder(f).Decode(&state); err != nil {
+ return nil, err
+ }
+ now := time.Now()
+
+ mgr := fs.Manager{Paths: state.CgroupPaths}
+ cstats, err := mgr.GetStats()
+ if err != nil {
+ return nil, err
+ }
+ stats := &libcontainer.Stats{CgroupStats: cstats}
+ // if the container does not have any memory limit specified set the
+ // limit to the machines memory
+ memoryLimit := containerMemoryLimit
+ if memoryLimit == 0 {
+ memoryLimit = machineMemory
+ }
+ for _, iface := range state.Networks {
+ switch iface.Type {
+ case "veth":
+ istats, err := getNetworkInterfaceStats(iface.HostInterfaceName)
+ if err != nil {
+ return nil, err
+ }
+ stats.Interfaces = append(stats.Interfaces, istats)
+ }
+ }
+ return &ResourceStats{
+ Stats: stats,
+ Read: now,
+ MemoryLimit: memoryLimit,
+ }, nil
}
diff --git a/daemon/execdriver/execdrivers/execdrivers.go b/daemon/execdriver/execdrivers/execdrivers.go
index be3222a8b4..f6f97c9302 100644
--- a/daemon/execdriver/execdrivers/execdrivers.go
+++ b/daemon/execdriver/execdrivers/execdrivers.go
@@ -10,13 +10,13 @@ import (
"github.com/docker/docker/pkg/sysinfo"
)
-func NewDriver(name, root, initPath string, sysInfo *sysinfo.SysInfo) (execdriver.Driver, error) {
+func NewDriver(name, root, libPath, initPath string, sysInfo *sysinfo.SysInfo) (execdriver.Driver, error) {
switch name {
case "lxc":
// we want to give the lxc driver the full docker root because it needs
// to access and write config and template files in /var/lib/docker/containers/*
// to be backwards compatible
- return lxc.NewDriver(root, initPath, sysInfo.AppArmor)
+ return lxc.NewDriver(root, libPath, initPath, sysInfo.AppArmor)
case "native":
return native.NewDriver(path.Join(root, "execdriver", "native"), initPath)
}
diff --git a/daemon/execdriver/lxc/MAINTAINERS b/daemon/execdriver/lxc/MAINTAINERS
deleted file mode 100644
index ac8ff535ff..0000000000
--- a/daemon/execdriver/lxc/MAINTAINERS
+++ /dev/null
@@ -1,2 +0,0 @@
-# the LXC exec driver needs more maintainers and contributions
-Dinesh Subhraveti <dineshs@altiscale.com> (@dineshs-altiscale)
diff --git a/daemon/execdriver/lxc/driver.go b/daemon/execdriver/lxc/driver.go
index 44942b1fe0..55c4ac4e14 100644
--- a/daemon/execdriver/lxc/driver.go
+++ b/daemon/execdriver/lxc/driver.go
@@ -12,17 +12,22 @@ import (
"path/filepath"
"strconv"
"strings"
+ "sync"
"syscall"
"time"
- "github.com/kr/pty"
-
log "github.com/Sirupsen/logrus"
"github.com/docker/docker/daemon/execdriver"
+ sysinfo "github.com/docker/docker/pkg/system"
"github.com/docker/docker/pkg/term"
+ "github.com/docker/docker/pkg/version"
"github.com/docker/docker/utils"
+ "github.com/docker/libcontainer"
"github.com/docker/libcontainer/cgroups"
- "github.com/docker/libcontainer/mount/nodes"
+ "github.com/docker/libcontainer/configs"
+ "github.com/docker/libcontainer/system"
+ "github.com/docker/libcontainer/user"
+ "github.com/kr/pty"
)
const DriverName = "lxc"
@@ -30,23 +35,41 @@ const DriverName = "lxc"
var ErrExec = errors.New("Unsupported: Exec is not supported by the lxc driver")
type driver struct {
- root string // root path for the driver to use
- initPath string
- apparmor bool
- sharedRoot bool
+ root string // root path for the driver to use
+ libPath string
+ initPath string
+ apparmor bool
+ sharedRoot bool
+ activeContainers map[string]*activeContainer
+ machineMemory int64
+ sync.Mutex
+}
+
+type activeContainer struct {
+ container *configs.Config
+ cmd *exec.Cmd
}
-func NewDriver(root, initPath string, apparmor bool) (*driver, error) {
+func NewDriver(root, libPath, initPath string, apparmor bool) (*driver, error) {
+ if err := os.MkdirAll(root, 0700); err != nil {
+ return nil, err
+ }
// setup unconfined symlink
if err := linkLxcStart(root); err != nil {
return nil, err
}
-
+ meminfo, err := sysinfo.ReadMemInfo()
+ if err != nil {
+ return nil, err
+ }
return &driver{
- apparmor: apparmor,
- root: root,
- initPath: initPath,
- sharedRoot: rootIsShared(),
+ apparmor: apparmor,
+ root: root,
+ libPath: libPath,
+ initPath: initPath,
+ sharedRoot: rootIsShared(),
+ activeContainers: make(map[string]*activeContainer),
+ machineMemory: meminfo.MemTotal,
}, nil
}
@@ -57,8 +80,9 @@ func (d *driver) Name() string {
func (d *driver) Run(c *execdriver.Command, pipes *execdriver.Pipes, startCallback execdriver.StartCallback) (execdriver.ExitStatus, error) {
var (
- term execdriver.Terminal
- err error
+ term execdriver.Terminal
+ err error
+ dataPath = d.containerDir(c.ID)
)
if c.ProcessConfig.Tty {
@@ -67,6 +91,16 @@ func (d *driver) Run(c *execdriver.Command, pipes *execdriver.Pipes, startCallba
term, err = execdriver.NewStdConsole(&c.ProcessConfig, pipes)
}
c.ProcessConfig.Terminal = term
+ container, err := d.createContainer(c)
+ if err != nil {
+ return execdriver.ExitStatus{ExitCode: -1}, err
+ }
+ d.Lock()
+ d.activeContainers[c.ID] = &activeContainer{
+ container: container,
+ cmd: &c.ProcessConfig.Cmd,
+ }
+ d.Unlock()
c.Mounts = append(c.Mounts, execdriver.Mount{
Source: d.initPath,
@@ -87,11 +121,29 @@ func (d *driver) Run(c *execdriver.Command, pipes *execdriver.Pipes, startCallba
"-n", c.ID,
"-f", configPath,
}
+
+ // From lxc>=1.1 the default behavior is to daemonize containers after start
+ lxcVersion := version.Version(d.version())
+ if lxcVersion.GreaterThanOrEqualTo(version.Version("1.1")) {
+ params = append(params, "-F")
+ }
+
if c.Network.ContainerID != "" {
params = append(params,
"--share-net", c.Network.ContainerID,
)
}
+ if c.Ipc != nil {
+ if c.Ipc.ContainerID != "" {
+ params = append(params,
+ "--share-ipc", c.Ipc.ContainerID,
+ )
+ } else if c.Ipc.HostIpc {
+ params = append(params,
+ "--share-ipc", "1",
+ )
+ }
+ }
params = append(params,
"--",
@@ -141,7 +193,7 @@ func (d *driver) Run(c *execdriver.Command, pipes *execdriver.Pipes, startCallba
"unshare", "-m", "--", "/bin/sh", "-c", shellString,
}
}
-
+ log.Debugf("lxc params %s", params)
var (
name = params[0]
arg = params[1:]
@@ -153,7 +205,7 @@ func (d *driver) Run(c *execdriver.Command, pipes *execdriver.Pipes, startCallba
c.ProcessConfig.Path = aname
c.ProcessConfig.Args = append([]string{name}, arg...)
- if err := nodes.CreateDeviceNodes(c.Rootfs, c.AutoCreatedDevices); err != nil {
+ if err := createDeviceNodes(c.Rootfs, c.AutoCreatedDevices); err != nil {
return execdriver.ExitStatus{ExitCode: -1}, err
}
@@ -175,25 +227,228 @@ func (d *driver) Run(c *execdriver.Command, pipes *execdriver.Pipes, startCallba
close(waitLock)
}()
- // Poll lxc for RUNNING status
- pid, err := d.waitForStart(c, waitLock)
- if err != nil {
+ terminate := func(terr error) (execdriver.ExitStatus, error) {
if c.ProcessConfig.Process != nil {
c.ProcessConfig.Process.Kill()
c.ProcessConfig.Wait()
}
- return execdriver.ExitStatus{ExitCode: -1}, err
+ return execdriver.ExitStatus{ExitCode: -1}, terr
+ }
+ // Poll lxc for RUNNING status
+ pid, err := d.waitForStart(c, waitLock)
+ if err != nil {
+ return terminate(err)
+ }
+
+ cgroupPaths, err := cgroupPaths(c.ID)
+ if err != nil {
+ return terminate(err)
+ }
+
+ state := &libcontainer.State{
+ InitProcessPid: pid,
+ CgroupPaths: cgroupPaths,
+ }
+
+ f, err := os.Create(filepath.Join(dataPath, "state.json"))
+ if err != nil {
+ return terminate(err)
+ }
+ defer f.Close()
+
+ if err := json.NewEncoder(f).Encode(state); err != nil {
+ return terminate(err)
}
c.ContainerPid = pid
if startCallback != nil {
+ log.Debugf("Invoking startCallback")
startCallback(&c.ProcessConfig, pid)
}
+ oomKill := false
+ oomKillNotification, err := notifyOnOOM(cgroupPaths)
+
<-waitLock
- return execdriver.ExitStatus{ExitCode: getExitCode(c)}, waitErr
+ if err == nil {
+ _, oomKill = <-oomKillNotification
+ log.Debugf("oomKill error %s waitErr %s", oomKill, waitErr)
+ } else {
+ log.Warnf("Your kernel does not support OOM notifications: %s", err)
+ }
+
+ // check oom error
+ exitCode := getExitCode(c)
+ if oomKill {
+ exitCode = 137
+ }
+ return execdriver.ExitStatus{ExitCode: exitCode, OOMKilled: oomKill}, waitErr
+}
+
+// copy from libcontainer
+func notifyOnOOM(paths map[string]string) (<-chan struct{}, error) {
+ dir := paths["memory"]
+ if dir == "" {
+ return nil, fmt.Errorf("There is no path for %q in state", "memory")
+ }
+ oomControl, err := os.Open(filepath.Join(dir, "memory.oom_control"))
+ if err != nil {
+ return nil, err
+ }
+ fd, _, syserr := syscall.RawSyscall(syscall.SYS_EVENTFD2, 0, syscall.FD_CLOEXEC, 0)
+ if syserr != 0 {
+ oomControl.Close()
+ return nil, syserr
+ }
+
+ eventfd := os.NewFile(fd, "eventfd")
+
+ eventControlPath := filepath.Join(dir, "cgroup.event_control")
+ data := fmt.Sprintf("%d %d", eventfd.Fd(), oomControl.Fd())
+ if err := ioutil.WriteFile(eventControlPath, []byte(data), 0700); err != nil {
+ eventfd.Close()
+ oomControl.Close()
+ return nil, err
+ }
+ ch := make(chan struct{})
+ go func() {
+ defer func() {
+ close(ch)
+ eventfd.Close()
+ oomControl.Close()
+ }()
+ buf := make([]byte, 8)
+ for {
+ if _, err := eventfd.Read(buf); err != nil {
+ return
+ }
+ // When a cgroup is destroyed, an event is sent to eventfd.
+ // So if the control path is gone, return instead of notifying.
+ if _, err := os.Lstat(eventControlPath); os.IsNotExist(err) {
+ return
+ }
+ ch <- struct{}{}
+ }
+ }()
+ return ch, nil
+}
+
+// createContainer populates and configures the container type with the
+// data provided by the execdriver.Command
+func (d *driver) createContainer(c *execdriver.Command) (*configs.Config, error) {
+ container := execdriver.InitContainer(c)
+ if err := execdriver.SetupCgroups(container, c); err != nil {
+ return nil, err
+ }
+ return container, nil
+}
+
+// Return an map of susbystem -> container cgroup
+func cgroupPaths(containerId string) (map[string]string, error) {
+ subsystems, err := cgroups.GetAllSubsystems()
+ if err != nil {
+ return nil, err
+ }
+ log.Debugf("subsystems: %s", subsystems)
+ paths := make(map[string]string)
+ for _, subsystem := range subsystems {
+ cgroupRoot, cgroupDir, err := findCgroupRootAndDir(subsystem)
+ log.Debugf("cgroup path %s %s", cgroupRoot, cgroupDir)
+ if err != nil {
+ //unsupported subystem
+ continue
+ }
+ path := filepath.Join(cgroupRoot, cgroupDir, "lxc", containerId)
+ paths[subsystem] = path
+ }
+
+ return paths, nil
+}
+
+// this is copy from old libcontainer nodes.go
+func createDeviceNodes(rootfs string, nodesToCreate []*configs.Device) error {
+ oldMask := syscall.Umask(0000)
+ defer syscall.Umask(oldMask)
+
+ for _, node := range nodesToCreate {
+ if err := createDeviceNode(rootfs, node); err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+// Creates the device node in the rootfs of the container.
+func createDeviceNode(rootfs string, node *configs.Device) error {
+ var (
+ dest = filepath.Join(rootfs, node.Path)
+ parent = filepath.Dir(dest)
+ )
+
+ if err := os.MkdirAll(parent, 0755); err != nil {
+ return err
+ }
+
+ fileMode := node.FileMode
+ switch node.Type {
+ case 'c':
+ fileMode |= syscall.S_IFCHR
+ case 'b':
+ fileMode |= syscall.S_IFBLK
+ default:
+ return fmt.Errorf("%c is not a valid device type for device %s", node.Type, node.Path)
+ }
+
+ if err := syscall.Mknod(dest, uint32(fileMode), node.Mkdev()); err != nil && !os.IsExist(err) {
+ return fmt.Errorf("mknod %s %s", node.Path, err)
+ }
+
+ if err := syscall.Chown(dest, int(node.Uid), int(node.Gid)); err != nil {
+ return fmt.Errorf("chown %s to %d:%d", node.Path, node.Uid, node.Gid)
+ }
+
+ return nil
+}
+
+// setupUser changes the groups, gid, and uid for the user inside the container
+// copy from libcontainer, cause not it's private
+func setupUser(userSpec string) error {
+ // Set up defaults.
+ defaultExecUser := user.ExecUser{
+ Uid: syscall.Getuid(),
+ Gid: syscall.Getgid(),
+ Home: "/",
+ }
+ passwdPath, err := user.GetPasswdPath()
+ if err != nil {
+ return err
+ }
+ groupPath, err := user.GetGroupPath()
+ if err != nil {
+ return err
+ }
+ execUser, err := user.GetExecUserPath(userSpec, &defaultExecUser, passwdPath, groupPath)
+ if err != nil {
+ return err
+ }
+ if err := syscall.Setgroups(execUser.Sgids); err != nil {
+ return err
+ }
+ if err := system.Setgid(execUser.Gid); err != nil {
+ return err
+ }
+ if err := system.Setuid(execUser.Uid); err != nil {
+ return err
+ }
+ // if we didn't get HOME already, set it based on the user's HOME
+ if envHome := os.Getenv("HOME"); envHome == "" {
+ if err := os.Setenv("HOME", execUser.Home); err != nil {
+ return err
+ }
+ }
+ return nil
}
/// Return the exit code of the process
@@ -337,18 +592,26 @@ func (d *driver) Info(id string) execdriver.Info {
}
}
-func (d *driver) GetPidsForContainer(id string) ([]int, error) {
- pids := []int{}
-
- // cpu is chosen because it is the only non optional subsystem in cgroups
- subsystem := "cpu"
+func findCgroupRootAndDir(subsystem string) (string, string, error) {
cgroupRoot, err := cgroups.FindCgroupMountpoint(subsystem)
if err != nil {
- return pids, err
+ return "", "", err
}
cgroupDir, err := cgroups.GetThisCgroupDir(subsystem)
if err != nil {
+ return "", "", err
+ }
+ return cgroupRoot, cgroupDir, nil
+}
+
+func (d *driver) GetPidsForContainer(id string) ([]int, error) {
+ pids := []int{}
+
+ // cpu is chosen because it is the only non optional subsystem in cgroups
+ subsystem := "cpu"
+ cgroupRoot, cgroupDir, err := findCgroupRootAndDir(subsystem)
+ if err != nil {
return pids, err
}
@@ -407,8 +670,12 @@ func rootIsShared() bool {
return true
}
+func (d *driver) containerDir(containerId string) string {
+ return path.Join(d.libPath, "containers", containerId)
+}
+
func (d *driver) generateLXCConfig(c *execdriver.Command) (string, error) {
- root := path.Join(d.root, "containers", c.ID, "config.lxc")
+ root := path.Join(d.containerDir(c.ID), "config.lxc")
fo, err := os.Create(root)
if err != nil {
@@ -434,7 +701,7 @@ func (d *driver) generateEnvConfig(c *execdriver.Command) error {
if err != nil {
return err
}
- p := path.Join(d.root, "containers", c.ID, "config.env")
+ p := path.Join(d.libPath, "containers", c.ID, "config.env")
c.Mounts = append(c.Mounts, execdriver.Mount{
Source: p,
Destination: "/.dockerenv",
@@ -526,6 +793,8 @@ func (d *driver) Exec(c *execdriver.Command, processConfig *execdriver.ProcessCo
}
func (d *driver) Stats(id string) (*execdriver.ResourceStats, error) {
- return nil, fmt.Errorf("container stats are not supported with LXC")
-
+ if _, ok := d.activeContainers[id]; !ok {
+ return nil, fmt.Errorf("%s is not a key in active containers", id)
+ }
+ return execdriver.Stats(d.containerDir(id), d.activeContainers[id].container.Cgroups.Memory, d.machineMemory)
}
diff --git a/daemon/execdriver/lxc/lxc_init_linux.go b/daemon/execdriver/lxc/lxc_init_linux.go
index 956a283fc2..e7bc2b5f3a 100644
--- a/daemon/execdriver/lxc/lxc_init_linux.go
+++ b/daemon/execdriver/lxc/lxc_init_linux.go
@@ -3,8 +3,6 @@ package lxc
import (
"fmt"
- "github.com/docker/libcontainer"
- "github.com/docker/libcontainer/namespaces"
"github.com/docker/libcontainer/utils"
)
@@ -12,9 +10,7 @@ func finalizeNamespace(args *InitArgs) error {
if err := utils.CloseExecFrom(3); err != nil {
return err
}
- if err := namespaces.SetupUser(&libcontainer.Config{
- User: args.User,
- }); err != nil {
+ if err := setupUser(args.User); err != nil {
return fmt.Errorf("setup user %s", err)
}
if err := setupWorkingDirectory(args); err != nil {
diff --git a/daemon/execdriver/lxc/lxc_template.go b/daemon/execdriver/lxc/lxc_template.go
index 4ed2a45c8c..e4a8ed6b5f 100644
--- a/daemon/execdriver/lxc/lxc_template.go
+++ b/daemon/execdriver/lxc/lxc_template.go
@@ -11,7 +11,6 @@ import (
nativeTemplate "github.com/docker/docker/daemon/execdriver/native/template"
"github.com/docker/docker/utils"
"github.com/docker/libcontainer/label"
- "github.com/docker/libcontainer/security/capabilities"
)
const LxcTemplate = `
@@ -52,7 +51,7 @@ lxc.cgroup.devices.allow = a
lxc.cgroup.devices.deny = a
#Allow the devices passed to us in the AllowedDevices list.
{{range $allowedDevice := .AllowedDevices}}
-lxc.cgroup.devices.allow = {{$allowedDevice.GetCgroupAllowString}}
+lxc.cgroup.devices.allow = {{$allowedDevice.CgroupString}}
{{end}}
{{end}}
@@ -108,8 +107,8 @@ lxc.cgroup.memory.memsw.limit_in_bytes = {{$memSwap}}
{{if .Resources.CpuShares}}
lxc.cgroup.cpu.shares = {{.Resources.CpuShares}}
{{end}}
-{{if .Resources.Cpuset}}
-lxc.cgroup.cpuset.cpus = {{.Resources.Cpuset}}
+{{if .Resources.CpusetCpus}}
+lxc.cgroup.cpuset.cpus = {{.Resources.CpusetCpus}}
{{end}}
{{end}}
@@ -126,7 +125,9 @@ lxc.network.ipv4 = {{.Network.Interface.IPAddress}}/{{.Network.Interface.IPPrefi
{{if .Network.Interface.Gateway}}
lxc.network.ipv4.gateway = {{.Network.Interface.Gateway}}
{{end}}
-
+{{if .Network.Interface.MacAddress}}
+lxc.network.hwaddr = {{.Network.Interface.MacAddress}}
+{{end}}
{{if .ProcessConfig.Env}}
lxc.utsname = {{getHostname .ProcessConfig.Env}}
{{end}}
@@ -167,7 +168,7 @@ func keepCapabilities(adds []string, drops []string) ([]string, error) {
var newCaps []string
for _, cap := range caps {
log.Debugf("cap %s\n", cap)
- realCap := capabilities.GetCapability(cap)
+ realCap := execdriver.GetCapability(cap)
numCap := fmt.Sprintf("%d", realCap.Value)
newCaps = append(newCaps, numCap)
}
@@ -178,13 +179,10 @@ func keepCapabilities(adds []string, drops []string) ([]string, error) {
func dropList(drops []string) ([]string, error) {
if utils.StringsContainsNoCase(drops, "all") {
var newCaps []string
- for _, cap := range capabilities.GetAllCapabilities() {
- log.Debugf("drop cap %s\n", cap)
- realCap := capabilities.GetCapability(cap)
- if realCap == nil {
- return nil, fmt.Errorf("Invalid capability '%s'", cap)
- }
- numCap := fmt.Sprintf("%d", realCap.Value)
+ for _, capName := range execdriver.GetAllCapabilities() {
+ cap := execdriver.GetCapability(capName)
+ log.Debugf("drop cap %s\n", cap.Key)
+ numCap := fmt.Sprintf("%d", cap.Value)
newCaps = append(newCaps, numCap)
}
return newCaps, nil
@@ -194,6 +192,7 @@ func dropList(drops []string) ([]string, error) {
func isDirectory(source string) string {
f, err := os.Stat(source)
+ log.Debugf("dir: %s\n", source)
if err != nil {
if os.IsNotExist(err) {
return "dir"
diff --git a/daemon/execdriver/lxc/lxc_template_unit_test.go b/daemon/execdriver/lxc/lxc_template_unit_test.go
index bb622d4bc5..78760f6007 100644
--- a/daemon/execdriver/lxc/lxc_template_unit_test.go
+++ b/daemon/execdriver/lxc/lxc_template_unit_test.go
@@ -5,11 +5,6 @@ package lxc
import (
"bufio"
"fmt"
- "github.com/docker/docker/daemon/execdriver"
- nativeTemplate "github.com/docker/docker/daemon/execdriver/native/template"
- "github.com/docker/libcontainer/devices"
- "github.com/docker/libcontainer/security/capabilities"
- "github.com/syndtr/gocapability/capability"
"io/ioutil"
"math/rand"
"os"
@@ -17,6 +12,11 @@ import (
"strings"
"testing"
"time"
+
+ "github.com/docker/docker/daemon/execdriver"
+ nativeTemplate "github.com/docker/docker/daemon/execdriver/native/template"
+ "github.com/docker/libcontainer/configs"
+ "github.com/syndtr/gocapability/capability"
)
func TestLXCConfig(t *testing.T) {
@@ -39,7 +39,7 @@ func TestLXCConfig(t *testing.T) {
cpu = cpuMin + rand.Intn(cpuMax-cpuMin)
)
- driver, err := NewDriver(root, "", false)
+ driver, err := NewDriver(root, root, "", false)
if err != nil {
t.Fatal(err)
}
@@ -53,7 +53,7 @@ func TestLXCConfig(t *testing.T) {
Mtu: 1500,
Interface: nil,
},
- AllowedDevices: make([]*devices.Device, 0),
+ AllowedDevices: make([]*configs.Device, 0),
ProcessConfig: execdriver.ProcessConfig{},
}
p, err := driver.generateLXCConfig(command)
@@ -76,7 +76,7 @@ func TestCustomLxcConfig(t *testing.T) {
os.MkdirAll(path.Join(root, "containers", "1"), 0777)
- driver, err := NewDriver(root, "", false)
+ driver, err := NewDriver(root, root, "", false)
if err != nil {
t.Fatal(err)
}
@@ -194,7 +194,7 @@ func TestCustomLxcConfigMounts(t *testing.T) {
}
os.MkdirAll(path.Join(root, "containers", "1"), 0777)
- driver, err := NewDriver(root, "", false)
+ driver, err := NewDriver(root, root, "", false)
if err != nil {
t.Fatal(err)
}
@@ -248,7 +248,7 @@ func TestCustomLxcConfigMisc(t *testing.T) {
}
defer os.RemoveAll(root)
os.MkdirAll(path.Join(root, "containers", "1"), 0777)
- driver, err := NewDriver(root, "", true)
+ driver, err := NewDriver(root, root, "", true)
if err != nil {
t.Fatal(err)
@@ -295,7 +295,7 @@ func TestCustomLxcConfigMisc(t *testing.T) {
grepFile(t, p, "lxc.cgroup.cpuset.cpus = 0,1")
container := nativeTemplate.New()
for _, cap := range container.Capabilities {
- realCap := capabilities.GetCapability(cap)
+ realCap := execdriver.GetCapability(cap)
numCap := fmt.Sprintf("%d", realCap.Value)
if cap != "MKNOD" && cap != "KILL" {
grepFile(t, p, fmt.Sprintf("lxc.cap.keep = %s", numCap))
@@ -313,7 +313,7 @@ func TestCustomLxcConfigMiscOverride(t *testing.T) {
}
defer os.RemoveAll(root)
os.MkdirAll(path.Join(root, "containers", "1"), 0777)
- driver, err := NewDriver(root, "", false)
+ driver, err := NewDriver(root, root, "", false)
if err != nil {
t.Fatal(err)
}
@@ -359,7 +359,7 @@ func TestCustomLxcConfigMiscOverride(t *testing.T) {
grepFile(t, p, "lxc.cgroup.cpuset.cpus = 0,1")
container := nativeTemplate.New()
for _, cap := range container.Capabilities {
- realCap := capabilities.GetCapability(cap)
+ realCap := execdriver.GetCapability(cap)
numCap := fmt.Sprintf("%d", realCap.Value)
if cap != "MKNOD" && cap != "KILL" {
grepFile(t, p, fmt.Sprintf("lxc.cap.keep = %s", numCap))
diff --git a/daemon/execdriver/native/create.go b/daemon/execdriver/native/create.go
index c5a8da75b7..a988fba529 100644
--- a/daemon/execdriver/native/create.go
+++ b/daemon/execdriver/native/create.go
@@ -3,39 +3,25 @@
package native
import (
+ "errors"
"fmt"
- "os"
- "os/exec"
+ "net"
"path/filepath"
+ "strings"
+ "syscall"
"github.com/docker/docker/daemon/execdriver"
- "github.com/docker/docker/daemon/execdriver/native/template"
- "github.com/docker/libcontainer"
+ "github.com/docker/docker/pkg/symlink"
"github.com/docker/libcontainer/apparmor"
+ "github.com/docker/libcontainer/configs"
"github.com/docker/libcontainer/devices"
- "github.com/docker/libcontainer/mount"
- "github.com/docker/libcontainer/security/capabilities"
+ "github.com/docker/libcontainer/utils"
)
// createContainer populates and configures the container type with the
// data provided by the execdriver.Command
-func (d *driver) createContainer(c *execdriver.Command) (*libcontainer.Config, error) {
- container := template.New()
-
- container.Hostname = getEnv("HOSTNAME", c.ProcessConfig.Env)
- container.Tty = c.ProcessConfig.Tty
- container.User = c.ProcessConfig.User
- container.WorkingDir = c.WorkingDir
- container.Env = c.ProcessConfig.Env
- container.Cgroups.Name = c.ID
- container.Cgroups.AllowedDevices = c.AllowedDevices
- container.MountConfig.DeviceNodes = c.AutoCreatedDevices
- container.RootFs = c.Rootfs
- container.MountConfig.ReadonlyFs = c.ReadonlyRootfs
-
- // check to see if we are running in ramdisk to disable pivot root
- container.MountConfig.NoPivotRoot = os.Getenv("DOCKER_RAMDISK") != ""
- container.RestrictSys = true
+func (d *driver) createContainer(c *execdriver.Command) (*configs.Config, error) {
+ container := execdriver.InitContainer(c)
if err := d.createIpc(container, c); err != nil {
return nil, err
@@ -50,6 +36,14 @@ func (d *driver) createContainer(c *execdriver.Command) (*libcontainer.Config, e
}
if c.ProcessConfig.Privileged {
+ // clear readonly for /sys
+ for i := range container.Mounts {
+ if container.Mounts[i].Destination == "/sys" {
+ container.Mounts[i].Flags &= ^syscall.MS_RDONLY
+ }
+ }
+ container.ReadonlyPaths = nil
+ container.MaskPaths = nil
if err := d.setPrivileged(container); err != nil {
return nil, err
}
@@ -63,7 +57,7 @@ func (d *driver) createContainer(c *execdriver.Command) (*libcontainer.Config, e
container.AppArmorProfile = c.AppArmorProfile
}
- if err := d.setupCgroups(container, c); err != nil {
+ if err := execdriver.SetupCgroups(container, c); err != nil {
return nil, err
}
@@ -74,41 +68,52 @@ func (d *driver) createContainer(c *execdriver.Command) (*libcontainer.Config, e
if err := d.setupLabels(container, c); err != nil {
return nil, err
}
+ d.setupRlimits(container, c)
+ return container, nil
+}
- cmds := make(map[string]*exec.Cmd)
- d.Lock()
- for k, v := range d.activeContainers {
- cmds[k] = v.cmd
+func generateIfaceName() (string, error) {
+ for i := 0; i < 10; i++ {
+ name, err := utils.GenerateRandomName("veth", 7)
+ if err != nil {
+ continue
+ }
+ if _, err := net.InterfaceByName(name); err != nil {
+ if strings.Contains(err.Error(), "no such") {
+ return name, nil
+ }
+ return "", err
+ }
}
- d.Unlock()
-
- return container, nil
+ return "", errors.New("Failed to find name for new interface")
}
-func (d *driver) createNetwork(container *libcontainer.Config, c *execdriver.Command) error {
+func (d *driver) createNetwork(container *configs.Config, c *execdriver.Command) error {
if c.Network.HostNetworking {
- container.Namespaces.Remove(libcontainer.NEWNET)
+ container.Namespaces.Remove(configs.NEWNET)
return nil
}
- container.Networks = []*libcontainer.Network{
+ container.Networks = []*configs.Network{
{
- Mtu: c.Network.Mtu,
- Address: fmt.Sprintf("%s/%d", "127.0.0.1", 0),
- Gateway: "localhost",
- Type: "loopback",
+ Type: "loopback",
},
}
+ iName, err := generateIfaceName()
+ if err != nil {
+ return err
+ }
if c.Network.Interface != nil {
- vethNetwork := libcontainer.Network{
- Mtu: c.Network.Mtu,
- Address: fmt.Sprintf("%s/%d", c.Network.Interface.IPAddress, c.Network.Interface.IPPrefixLen),
- MacAddress: c.Network.Interface.MacAddress,
- Gateway: c.Network.Interface.Gateway,
- Type: "veth",
- Bridge: c.Network.Interface.Bridge,
- VethPrefix: "veth",
+ vethNetwork := configs.Network{
+ Name: "eth0",
+ HostInterfaceName: iName,
+ Mtu: c.Network.Mtu,
+ Address: fmt.Sprintf("%s/%d", c.Network.Interface.IPAddress, c.Network.Interface.IPPrefixLen),
+ MacAddress: c.Network.Interface.MacAddress,
+ Gateway: c.Network.Interface.Gateway,
+ Type: "veth",
+ Bridge: c.Network.Interface.Bridge,
}
if c.Network.Interface.GlobalIPv6Address != "" {
vethNetwork.IPv6Address = fmt.Sprintf("%s/%d", c.Network.Interface.GlobalIPv6Address, c.Network.Interface.GlobalIPv6PrefixLen)
@@ -122,21 +127,24 @@ func (d *driver) createNetwork(container *libcontainer.Config, c *execdriver.Com
active := d.activeContainers[c.Network.ContainerID]
d.Unlock()
- if active == nil || active.cmd.Process == nil {
+ if active == nil {
return fmt.Errorf("%s is not a valid running container to join", c.Network.ContainerID)
}
- cmd := active.cmd
- nspath := filepath.Join("/proc", fmt.Sprint(cmd.Process.Pid), "ns", "net")
- container.Namespaces.Add(libcontainer.NEWNET, nspath)
+ state, err := active.State()
+ if err != nil {
+ return err
+ }
+
+ container.Namespaces.Add(configs.NEWNET, state.NamespacePaths[configs.NEWNET])
}
return nil
}
-func (d *driver) createIpc(container *libcontainer.Config, c *execdriver.Command) error {
+func (d *driver) createIpc(container *configs.Config, c *execdriver.Command) error {
if c.Ipc.HostIpc {
- container.Namespaces.Remove(libcontainer.NEWIPC)
+ container.Namespaces.Remove(configs.NEWIPC)
return nil
}
@@ -145,37 +153,38 @@ func (d *driver) createIpc(container *libcontainer.Config, c *execdriver.Command
active := d.activeContainers[c.Ipc.ContainerID]
d.Unlock()
- if active == nil || active.cmd.Process == nil {
+ if active == nil {
return fmt.Errorf("%s is not a valid running container to join", c.Ipc.ContainerID)
}
- cmd := active.cmd
- container.Namespaces.Add(libcontainer.NEWIPC, filepath.Join("/proc", fmt.Sprint(cmd.Process.Pid), "ns", "ipc"))
+ state, err := active.State()
+ if err != nil {
+ return err
+ }
+ container.Namespaces.Add(configs.NEWIPC, state.NamespacePaths[configs.NEWIPC])
}
return nil
}
-func (d *driver) createPid(container *libcontainer.Config, c *execdriver.Command) error {
+func (d *driver) createPid(container *configs.Config, c *execdriver.Command) error {
if c.Pid.HostPid {
- container.Namespaces.Remove(libcontainer.NEWPID)
+ container.Namespaces.Remove(configs.NEWPID)
return nil
}
return nil
}
-func (d *driver) setPrivileged(container *libcontainer.Config) (err error) {
- container.Capabilities = capabilities.GetAllCapabilities()
+func (d *driver) setPrivileged(container *configs.Config) (err error) {
+ container.Capabilities = execdriver.GetAllCapabilities()
container.Cgroups.AllowAllDevices = true
- hostDeviceNodes, err := devices.GetHostDeviceNodes()
+ hostDevices, err := devices.HostDevices()
if err != nil {
return err
}
- container.MountConfig.DeviceNodes = hostDeviceNodes
-
- container.RestrictSys = false
+ container.Devices = hostDevices
if apparmor.IsEnabled() {
container.AppArmorProfile = "unconfined"
@@ -184,41 +193,66 @@ func (d *driver) setPrivileged(container *libcontainer.Config) (err error) {
return nil
}
-func (d *driver) setCapabilities(container *libcontainer.Config, c *execdriver.Command) (err error) {
+func (d *driver) setCapabilities(container *configs.Config, c *execdriver.Command) (err error) {
container.Capabilities, err = execdriver.TweakCapabilities(container.Capabilities, c.CapAdd, c.CapDrop)
return err
}
-func (d *driver) setupCgroups(container *libcontainer.Config, c *execdriver.Command) error {
- if c.Resources != nil {
- container.Cgroups.CpuShares = c.Resources.CpuShares
- container.Cgroups.Memory = c.Resources.Memory
- container.Cgroups.MemoryReservation = c.Resources.Memory
- container.Cgroups.MemorySwap = c.Resources.MemorySwap
- container.Cgroups.CpusetCpus = c.Resources.Cpuset
+func (d *driver) setupRlimits(container *configs.Config, c *execdriver.Command) {
+ if c.Resources == nil {
+ return
}
- return nil
+ for _, rlimit := range c.Resources.Rlimits {
+ container.Rlimits = append(container.Rlimits, configs.Rlimit{
+ Type: rlimit.Type,
+ Hard: rlimit.Hard,
+ Soft: rlimit.Soft,
+ })
+ }
}
-func (d *driver) setupMounts(container *libcontainer.Config, c *execdriver.Command) error {
+func (d *driver) setupMounts(container *configs.Config, c *execdriver.Command) error {
+ userMounts := make(map[string]struct{})
+ for _, m := range c.Mounts {
+ userMounts[m.Destination] = struct{}{}
+ }
+
+ // Filter out mounts that are overriden by user supplied mounts
+ var defaultMounts []*configs.Mount
+ for _, m := range container.Mounts {
+ if _, ok := userMounts[m.Destination]; !ok {
+ defaultMounts = append(defaultMounts, m)
+ }
+ }
+ container.Mounts = defaultMounts
+
for _, m := range c.Mounts {
- container.MountConfig.Mounts = append(container.MountConfig.Mounts, &mount.Mount{
- Type: "bind",
+ dest, err := symlink.FollowSymlinkInScope(filepath.Join(c.Rootfs, m.Destination), c.Rootfs)
+ if err != nil {
+ return err
+ }
+ flags := syscall.MS_BIND | syscall.MS_REC
+ if !m.Writable {
+ flags |= syscall.MS_RDONLY
+ }
+ if m.Slave {
+ flags |= syscall.MS_SLAVE
+ }
+
+ container.Mounts = append(container.Mounts, &configs.Mount{
Source: m.Source,
- Destination: m.Destination,
- Writable: m.Writable,
- Private: m.Private,
- Slave: m.Slave,
+ Destination: dest,
+ Device: "bind",
+ Flags: flags,
})
}
-
return nil
}
-func (d *driver) setupLabels(container *libcontainer.Config, c *execdriver.Command) error {
+func (d *driver) setupLabels(container *configs.Config, c *execdriver.Command) error {
container.ProcessLabel = c.ProcessLabel
- container.MountConfig.MountLabel = c.MountLabel
+ container.MountLabel = c.MountLabel
return nil
}
diff --git a/daemon/execdriver/native/driver.go b/daemon/execdriver/native/driver.go
index 533e6d61ef..3177f2be08 100644
--- a/daemon/execdriver/native/driver.go
+++ b/daemon/execdriver/native/driver.go
@@ -17,16 +17,15 @@ import (
log "github.com/Sirupsen/logrus"
"github.com/docker/docker/daemon/execdriver"
+ "github.com/docker/docker/pkg/reexec"
sysinfo "github.com/docker/docker/pkg/system"
"github.com/docker/docker/pkg/term"
"github.com/docker/libcontainer"
"github.com/docker/libcontainer/apparmor"
- "github.com/docker/libcontainer/cgroups/fs"
"github.com/docker/libcontainer/cgroups/systemd"
- consolepkg "github.com/docker/libcontainer/console"
- "github.com/docker/libcontainer/namespaces"
- _ "github.com/docker/libcontainer/namespaces/nsenter"
+ "github.com/docker/libcontainer/configs"
"github.com/docker/libcontainer/system"
+ "github.com/docker/libcontainer/utils"
)
const (
@@ -34,16 +33,12 @@ const (
Version = "0.2"
)
-type activeContainer struct {
- container *libcontainer.Config
- cmd *exec.Cmd
-}
-
type driver struct {
root string
initPath string
- activeContainers map[string]*activeContainer
+ activeContainers map[string]libcontainer.Container
machineMemory int64
+ factory libcontainer.Factory
sync.Mutex
}
@@ -60,11 +55,26 @@ func NewDriver(root, initPath string) (*driver, error) {
if err := apparmor.InstallDefaultProfile(); err != nil {
return nil, err
}
+ cgm := libcontainer.Cgroupfs
+ if systemd.UseSystemd() {
+ cgm = libcontainer.SystemdCgroups
+ }
+
+ f, err := libcontainer.New(
+ root,
+ cgm,
+ libcontainer.InitPath(reexec.Self(), DriverName),
+ )
+ if err != nil {
+ return nil, err
+ }
+
return &driver{
root: root,
initPath: initPath,
- activeContainers: make(map[string]*activeContainer),
+ activeContainers: make(map[string]libcontainer.Container),
machineMemory: meminfo.MemTotal,
+ factory: f,
}, nil
}
@@ -82,98 +92,164 @@ func (d *driver) Run(c *execdriver.Command, pipes *execdriver.Pipes, startCallba
var term execdriver.Terminal
+ p := &libcontainer.Process{
+ Args: append([]string{c.ProcessConfig.Entrypoint}, c.ProcessConfig.Arguments...),
+ Env: c.ProcessConfig.Env,
+ Cwd: c.WorkingDir,
+ User: c.ProcessConfig.User,
+ }
+
if c.ProcessConfig.Tty {
- term, err = NewTtyConsole(&c.ProcessConfig, pipes)
+ rootuid, err := container.HostUID()
+ if err != nil {
+ return execdriver.ExitStatus{ExitCode: -1}, err
+ }
+ cons, err := p.NewConsole(rootuid)
+ if err != nil {
+ return execdriver.ExitStatus{ExitCode: -1}, err
+ }
+ term, err = NewTtyConsole(cons, pipes, rootuid)
} else {
- term, err = execdriver.NewStdConsole(&c.ProcessConfig, pipes)
+ p.Stdout = pipes.Stdout
+ p.Stderr = pipes.Stderr
+ r, w, err := os.Pipe()
+ if err != nil {
+ return execdriver.ExitStatus{ExitCode: -1}, err
+ }
+ if pipes.Stdin != nil {
+ go func() {
+ io.Copy(w, pipes.Stdin)
+ w.Close()
+ }()
+ p.Stdin = r
+ }
+ term = &execdriver.StdConsole{}
}
if err != nil {
return execdriver.ExitStatus{ExitCode: -1}, err
}
c.ProcessConfig.Terminal = term
- d.Lock()
- d.activeContainers[c.ID] = &activeContainer{
- container: container,
- cmd: &c.ProcessConfig.Cmd,
+ cont, err := d.factory.Create(c.ID, container)
+ if err != nil {
+ return execdriver.ExitStatus{ExitCode: -1}, err
}
+ d.Lock()
+ d.activeContainers[c.ID] = cont
d.Unlock()
+ defer func() {
+ cont.Destroy()
+ d.cleanContainer(c.ID)
+ }()
- var (
- dataPath = filepath.Join(d.root, c.ID)
- args = append([]string{c.ProcessConfig.Entrypoint}, c.ProcessConfig.Arguments...)
- )
-
- if err := d.createContainerRoot(c.ID); err != nil {
+ if err := cont.Start(p); err != nil {
return execdriver.ExitStatus{ExitCode: -1}, err
}
- defer d.cleanContainer(c.ID)
- if err := d.writeContainerFile(container, c.ID); err != nil {
- return execdriver.ExitStatus{ExitCode: -1}, err
+ if startCallback != nil {
+ pid, err := p.Pid()
+ if err != nil {
+ p.Signal(os.Kill)
+ p.Wait()
+ return execdriver.ExitStatus{ExitCode: -1}, err
+ }
+ startCallback(&c.ProcessConfig, pid)
}
- execOutputChan := make(chan execOutput, 1)
- waitForStart := make(chan struct{})
+ oom := notifyOnOOM(cont)
+ waitF := p.Wait
+ if nss := cont.Config().Namespaces; !nss.Contains(configs.NEWPID) {
+ // we need such hack for tracking processes with inerited fds,
+ // because cmd.Wait() waiting for all streams to be copied
+ waitF = waitInPIDHost(p, cont)
+ }
+ ps, err := waitF()
+ if err != nil {
+ execErr, ok := err.(*exec.ExitError)
+ if !ok {
+ return execdriver.ExitStatus{ExitCode: -1}, err
+ }
+ ps = execErr.ProcessState
+ }
+ cont.Destroy()
+ _, oomKill := <-oom
+ return execdriver.ExitStatus{ExitCode: utils.ExitStatus(ps.Sys().(syscall.WaitStatus)), OOMKilled: oomKill}, nil
+}
- go func() {
- exitCode, err := namespaces.Exec(container, c.ProcessConfig.Stdin, c.ProcessConfig.Stdout, c.ProcessConfig.Stderr, c.ProcessConfig.Console, dataPath, args, func(container *libcontainer.Config, console, dataPath, init string, child *os.File, args []string) *exec.Cmd {
- c.ProcessConfig.Path = d.initPath
- c.ProcessConfig.Args = append([]string{
- DriverName,
- "-console", console,
- "-pipe", "3",
- "-root", filepath.Join(d.root, c.ID),
- "--",
- }, args...)
-
- // set this to nil so that when we set the clone flags anything else is reset
- c.ProcessConfig.SysProcAttr = &syscall.SysProcAttr{
- Cloneflags: uintptr(namespaces.GetNamespaceFlags(container.Namespaces)),
+// notifyOnOOM returns a channel that signals if the container received an OOM notification
+// for any process. If it is unable to subscribe to OOM notifications then a closed
+// channel is returned as it will be non-blocking and return the correct result when read.
+func notifyOnOOM(container libcontainer.Container) <-chan struct{} {
+ oom, err := container.NotifyOOM()
+ if err != nil {
+ log.Warnf("Your kernel does not support OOM notifications: %s", err)
+ c := make(chan struct{})
+ close(c)
+ return c
+ }
+ return oom
+}
+
+func killCgroupProcs(c libcontainer.Container) {
+ var procs []*os.Process
+ if err := c.Pause(); err != nil {
+ log.Warn(err)
+ }
+ pids, err := c.Processes()
+ if err != nil {
+ // don't care about childs if we can't get them, this is mostly because cgroup already deleted
+ log.Warnf("Failed to get processes from container %s: %v", c.ID(), err)
+ }
+ for _, pid := range pids {
+ if p, err := os.FindProcess(pid); err == nil {
+ procs = append(procs, p)
+ if err := p.Kill(); err != nil {
+ log.Warn(err)
}
- c.ProcessConfig.ExtraFiles = []*os.File{child}
+ }
+ }
+ if err := c.Resume(); err != nil {
+ log.Warn(err)
+ }
+ for _, p := range procs {
+ if _, err := p.Wait(); err != nil {
+ log.Warn(err)
+ }
+ }
+}
- c.ProcessConfig.Env = container.Env
- c.ProcessConfig.Dir = container.RootFs
+func waitInPIDHost(p *libcontainer.Process, c libcontainer.Container) func() (*os.ProcessState, error) {
+ return func() (*os.ProcessState, error) {
+ pid, err := p.Pid()
+ if err != nil {
+ return nil, err
+ }
- return &c.ProcessConfig.Cmd
- }, func() {
- close(waitForStart)
- if startCallback != nil {
- c.ContainerPid = c.ProcessConfig.Process.Pid
- startCallback(&c.ProcessConfig, c.ContainerPid)
+ process, err := os.FindProcess(pid)
+ s, err := process.Wait()
+ if err != nil {
+ execErr, ok := err.(*exec.ExitError)
+ if !ok {
+ return s, err
}
- })
- execOutputChan <- execOutput{exitCode, err}
- }()
-
- select {
- case execOutput := <-execOutputChan:
- return execdriver.ExitStatus{ExitCode: execOutput.exitCode}, execOutput.err
- case <-waitForStart:
- break
- }
-
- oomKill := false
- state, err := libcontainer.GetState(filepath.Join(d.root, c.ID))
- if err == nil {
- oomKillNotification, err := libcontainer.NotifyOnOOM(state)
- if err == nil {
- _, oomKill = <-oomKillNotification
- } else {
- log.Warnf("WARNING: Your kernel does not support OOM notifications: %s", err)
+ s = execErr.ProcessState
}
- } else {
- log.Warnf("Failed to get container state, oom notify will not work: %s", err)
+ killCgroupProcs(c)
+ p.Wait()
+ return s, err
}
- // wait for the container to exit.
- execOutput := <-execOutputChan
-
- return execdriver.ExitStatus{ExitCode: execOutput.exitCode, OOMKilled: oomKill}, execOutput.err
}
-func (d *driver) Kill(p *execdriver.Command, sig int) error {
- return syscall.Kill(p.ProcessConfig.Process.Pid, syscall.Signal(sig))
+func (d *driver) Kill(c *execdriver.Command, sig int) error {
+ active := d.activeContainers[c.ID]
+ if active == nil {
+ return fmt.Errorf("active container for %s does not exist", c.ID)
+ }
+ state, err := active.State()
+ if err != nil {
+ return err
+ }
+ return syscall.Kill(state.InitProcessPid, syscall.Signal(sig))
}
func (d *driver) Pause(c *execdriver.Command) error {
@@ -181,11 +257,7 @@ func (d *driver) Pause(c *execdriver.Command) error {
if active == nil {
return fmt.Errorf("active container for %s does not exist", c.ID)
}
- active.container.Cgroups.Freezer = "FROZEN"
- if systemd.UseSystemd() {
- return systemd.Freeze(active.container.Cgroups, active.container.Cgroups.Freezer)
- }
- return fs.Freeze(active.container.Cgroups, active.container.Cgroups.Freezer)
+ return active.Pause()
}
func (d *driver) Unpause(c *execdriver.Command) error {
@@ -193,47 +265,30 @@ func (d *driver) Unpause(c *execdriver.Command) error {
if active == nil {
return fmt.Errorf("active container for %s does not exist", c.ID)
}
- active.container.Cgroups.Freezer = "THAWED"
- if systemd.UseSystemd() {
- return systemd.Freeze(active.container.Cgroups, active.container.Cgroups.Freezer)
- }
- return fs.Freeze(active.container.Cgroups, active.container.Cgroups.Freezer)
+ return active.Resume()
}
-func (d *driver) Terminate(p *execdriver.Command) error {
- // lets check the start time for the process
- state, err := libcontainer.GetState(filepath.Join(d.root, p.ID))
+func (d *driver) Terminate(c *execdriver.Command) error {
+ defer d.cleanContainer(c.ID)
+ container, err := d.factory.Load(c.ID)
if err != nil {
- if !os.IsNotExist(err) {
- return err
- }
- // TODO: Remove this part for version 1.2.0
- // This is added only to ensure smooth upgrades from pre 1.1.0 to 1.1.0
- data, err := ioutil.ReadFile(filepath.Join(d.root, p.ID, "start"))
- if err != nil {
- // if we don't have the data on disk then we can assume the process is gone
- // because this is only removed after we know the process has stopped
- if os.IsNotExist(err) {
- return nil
- }
- return err
- }
- state = &libcontainer.State{InitStartTime: string(data)}
+ return err
}
-
- currentStartTime, err := system.GetProcessStartTime(p.ProcessConfig.Process.Pid)
+ defer container.Destroy()
+ state, err := container.State()
if err != nil {
return err
}
-
- if state.InitStartTime == currentStartTime {
- err = syscall.Kill(p.ProcessConfig.Process.Pid, 9)
- syscall.Wait4(p.ProcessConfig.Process.Pid, nil, 0, nil)
+ pid := state.InitProcessPid
+ currentStartTime, err := system.GetProcessStartTime(pid)
+ if err != nil {
+ return err
+ }
+ if state.InitProcessStartTime == currentStartTime {
+ err = syscall.Kill(pid, 9)
+ syscall.Wait4(pid, nil, 0, nil)
}
- d.cleanContainer(p.ID)
-
return err
-
}
func (d *driver) Info(id string) execdriver.Info {
@@ -255,15 +310,10 @@ func (d *driver) GetPidsForContainer(id string) ([]int, error) {
if active == nil {
return nil, fmt.Errorf("active container for %s does not exist", id)
}
- c := active.container.Cgroups
-
- if systemd.UseSystemd() {
- return systemd.GetPids(c)
- }
- return fs.GetPids(c)
+ return active.Processes()
}
-func (d *driver) writeContainerFile(container *libcontainer.Config, id string) error {
+func (d *driver) writeContainerFile(container *configs.Config, id string) error {
data, err := json.Marshal(container)
if err != nil {
return err
@@ -275,7 +325,7 @@ func (d *driver) cleanContainer(id string) error {
d.Lock()
delete(d.activeContainers, id)
d.Unlock()
- return os.RemoveAll(filepath.Join(d.root, id, "container.json"))
+ return os.RemoveAll(filepath.Join(d.root, id))
}
func (d *driver) createContainerRoot(id string) error {
@@ -288,28 +338,24 @@ func (d *driver) Clean(id string) error {
func (d *driver) Stats(id string) (*execdriver.ResourceStats, error) {
c := d.activeContainers[id]
- state, err := libcontainer.GetState(filepath.Join(d.root, id))
- if err != nil {
- if os.IsNotExist(err) {
- return nil, execdriver.ErrNotRunning
- }
- return nil, err
+ if c == nil {
+ return nil, execdriver.ErrNotRunning
}
now := time.Now()
- stats, err := libcontainer.GetStats(nil, state)
+ stats, err := c.Stats()
if err != nil {
return nil, err
}
- memoryLimit := c.container.Cgroups.Memory
+ memoryLimit := c.Config().Cgroups.Memory
// if the container does not have any memory limit specified set the
// limit to the machines memory
if memoryLimit == 0 {
memoryLimit = d.machineMemory
}
return &execdriver.ResourceStats{
- Read: now,
- ContainerStats: stats,
- MemoryLimit: memoryLimit,
+ Stats: stats,
+ Read: now,
+ MemoryLimit: memoryLimit,
}, nil
}
@@ -324,38 +370,31 @@ func getEnv(key string, env []string) string {
}
type TtyConsole struct {
- MasterPty *os.File
+ console libcontainer.Console
}
-func NewTtyConsole(processConfig *execdriver.ProcessConfig, pipes *execdriver.Pipes) (*TtyConsole, error) {
- ptyMaster, console, err := consolepkg.CreateMasterAndConsole()
- if err != nil {
- return nil, err
- }
-
+func NewTtyConsole(console libcontainer.Console, pipes *execdriver.Pipes, rootuid int) (*TtyConsole, error) {
tty := &TtyConsole{
- MasterPty: ptyMaster,
+ console: console,
}
- if err := tty.AttachPipes(&processConfig.Cmd, pipes); err != nil {
+ if err := tty.AttachPipes(pipes); err != nil {
tty.Close()
return nil, err
}
- processConfig.Console = console
-
return tty, nil
}
-func (t *TtyConsole) Master() *os.File {
- return t.MasterPty
+func (t *TtyConsole) Master() libcontainer.Console {
+ return t.console
}
func (t *TtyConsole) Resize(h, w int) error {
- return term.SetWinsize(t.MasterPty.Fd(), &term.Winsize{Height: uint16(h), Width: uint16(w)})
+ return term.SetWinsize(t.console.Fd(), &term.Winsize{Height: uint16(h), Width: uint16(w)})
}
-func (t *TtyConsole) AttachPipes(command *exec.Cmd, pipes *execdriver.Pipes) error {
+func (t *TtyConsole) AttachPipes(pipes *execdriver.Pipes) error {
go func() {
if wb, ok := pipes.Stdout.(interface {
CloseWriters() error
@@ -363,12 +402,12 @@ func (t *TtyConsole) AttachPipes(command *exec.Cmd, pipes *execdriver.Pipes) err
defer wb.CloseWriters()
}
- io.Copy(pipes.Stdout, t.MasterPty)
+ io.Copy(pipes.Stdout, t.console)
}()
if pipes.Stdin != nil {
go func() {
- io.Copy(t.MasterPty, pipes.Stdin)
+ io.Copy(t.console, pipes.Stdin)
pipes.Stdin.Close()
}()
@@ -378,5 +417,5 @@ func (t *TtyConsole) AttachPipes(command *exec.Cmd, pipes *execdriver.Pipes) err
}
func (t *TtyConsole) Close() error {
- return t.MasterPty.Close()
+ return t.console.Close()
}
diff --git a/daemon/execdriver/native/exec.go b/daemon/execdriver/native/exec.go
index 84ad096725..af6dcd2adb 100644
--- a/daemon/execdriver/native/exec.go
+++ b/daemon/execdriver/native/exec.go
@@ -4,67 +4,77 @@ package native
import (
"fmt"
- "log"
"os"
"os/exec"
- "path/filepath"
- "runtime"
+ "syscall"
"github.com/docker/docker/daemon/execdriver"
- "github.com/docker/docker/pkg/reexec"
"github.com/docker/libcontainer"
- "github.com/docker/libcontainer/namespaces"
+ _ "github.com/docker/libcontainer/nsenter"
+ "github.com/docker/libcontainer/utils"
)
-const execCommandName = "nsenter-exec"
-
-func init() {
- reexec.Register(execCommandName, nsenterExec)
-}
-
-func nsenterExec() {
- runtime.LockOSThread()
-
- // User args are passed after '--' in the command line.
- userArgs := findUserArgs()
-
- config, err := loadConfigFromFd()
- if err != nil {
- log.Fatalf("docker-exec: unable to receive config from sync pipe: %s", err)
- }
-
- if err := namespaces.FinalizeSetns(config, userArgs); err != nil {
- log.Fatalf("docker-exec: failed to exec: %s", err)
- }
-}
-
// TODO(vishh): Add support for running in priviledged mode and running as a different user.
func (d *driver) Exec(c *execdriver.Command, processConfig *execdriver.ProcessConfig, pipes *execdriver.Pipes, startCallback execdriver.StartCallback) (int, error) {
active := d.activeContainers[c.ID]
if active == nil {
return -1, fmt.Errorf("No active container exists with ID %s", c.ID)
}
- state, err := libcontainer.GetState(filepath.Join(d.root, c.ID))
- if err != nil {
- return -1, fmt.Errorf("State unavailable for container with ID %s. The container may have been cleaned up already. Error: %s", c.ID, err)
- }
var term execdriver.Terminal
+ var err error
+
+ p := &libcontainer.Process{
+ Args: append([]string{processConfig.Entrypoint}, processConfig.Arguments...),
+ Env: c.ProcessConfig.Env,
+ Cwd: c.WorkingDir,
+ User: c.ProcessConfig.User,
+ }
if processConfig.Tty {
- term, err = NewTtyConsole(processConfig, pipes)
+ config := active.Config()
+ rootuid, err := config.HostUID()
+ if err != nil {
+ return -1, err
+ }
+ cons, err := p.NewConsole(rootuid)
+ if err != nil {
+ return -1, err
+ }
+ term, err = NewTtyConsole(cons, pipes, rootuid)
} else {
- term, err = execdriver.NewStdConsole(processConfig, pipes)
+ p.Stdout = pipes.Stdout
+ p.Stderr = pipes.Stderr
+ p.Stdin = pipes.Stdin
+ term = &execdriver.StdConsole{}
+ }
+ if err != nil {
+ return -1, err
}
processConfig.Terminal = term
- args := append([]string{processConfig.Entrypoint}, processConfig.Arguments...)
+ if err := active.Start(p); err != nil {
+ return -1, err
+ }
+
+ if startCallback != nil {
+ pid, err := p.Pid()
+ if err != nil {
+ p.Signal(os.Kill)
+ p.Wait()
+ return -1, err
+ }
+ startCallback(&c.ProcessConfig, pid)
+ }
- return namespaces.ExecIn(active.container, state, args, os.Args[0], "exec", processConfig.Stdin, processConfig.Stdout, processConfig.Stderr, processConfig.Console,
- func(cmd *exec.Cmd) {
- if startCallback != nil {
- startCallback(&c.ProcessConfig, cmd.Process.Pid)
- }
- })
+ ps, err := p.Wait()
+ if err != nil {
+ exitErr, ok := err.(*exec.ExitError)
+ if !ok {
+ return -1, err
+ }
+ ps = exitErr.ProcessState
+ }
+ return utils.ExitStatus(ps.Sys().(syscall.WaitStatus)), nil
}
diff --git a/daemon/execdriver/native/info.go b/daemon/execdriver/native/info.go
index 601b97e810..9d7342da86 100644
--- a/daemon/execdriver/native/info.go
+++ b/daemon/execdriver/native/info.go
@@ -2,13 +2,6 @@
package native
-import (
- "os"
- "path/filepath"
-
- "github.com/docker/libcontainer"
-)
-
type info struct {
ID string
driver *driver
@@ -18,13 +11,6 @@ type info struct {
// pid file for a container. If the file exists then the
// container is currently running
func (i *info) IsRunning() bool {
- if _, err := libcontainer.GetState(filepath.Join(i.driver.root, i.ID)); err == nil {
- return true
- }
- // TODO: Remove this part for version 1.2.0
- // This is added only to ensure smooth upgrades from pre 1.1.0 to 1.1.0
- if _, err := os.Stat(filepath.Join(i.driver.root, i.ID, "pid")); err == nil {
- return true
- }
- return false
+ _, ok := i.driver.activeContainers[i.ID]
+ return ok
}
diff --git a/daemon/execdriver/native/init.go b/daemon/execdriver/native/init.go
index 754d842c3b..f57d6cddec 100644
--- a/daemon/execdriver/native/init.go
+++ b/daemon/execdriver/native/init.go
@@ -3,55 +3,40 @@
package native
import (
- "encoding/json"
- "flag"
"fmt"
"os"
- "path/filepath"
"runtime"
"github.com/docker/docker/pkg/reexec"
"github.com/docker/libcontainer"
- "github.com/docker/libcontainer/namespaces"
)
func init() {
reexec.Register(DriverName, initializer)
}
-func initializer() {
- runtime.LockOSThread()
-
- var (
- pipe = flag.Int("pipe", 0, "sync pipe fd")
- console = flag.String("console", "", "console (pty slave) path")
- root = flag.String("root", ".", "root path for configuration files")
- )
-
- flag.Parse()
-
- var container *libcontainer.Config
- f, err := os.Open(filepath.Join(*root, "container.json"))
- if err != nil {
- writeError(err)
+func fatal(err error) {
+ if lerr, ok := err.(libcontainer.Error); ok {
+ lerr.Detail(os.Stderr)
+ os.Exit(1)
}
- if err := json.NewDecoder(f).Decode(&container); err != nil {
- f.Close()
- writeError(err)
- }
- f.Close()
+ fmt.Fprintln(os.Stderr, err)
+ os.Exit(1)
+}
- rootfs, err := os.Getwd()
+func initializer() {
+ runtime.GOMAXPROCS(1)
+ runtime.LockOSThread()
+ factory, err := libcontainer.New("")
if err != nil {
- writeError(err)
+ fatal(err)
}
-
- if err := namespaces.Init(container, rootfs, *console, os.NewFile(uintptr(*pipe), "child"), flag.Args()); err != nil {
- writeError(err)
+ if err := factory.StartInitialization(3); err != nil {
+ fatal(err)
}
- panic("Unreachable")
+ panic("unreachable")
}
func writeError(err error) {
diff --git a/daemon/execdriver/native/template/default_template.go b/daemon/execdriver/native/template/default_template.go
index f7d6be746d..76e3cea787 100644
--- a/daemon/execdriver/native/template/default_template.go
+++ b/daemon/execdriver/native/template/default_template.go
@@ -1,14 +1,17 @@
package template
import (
- "github.com/docker/libcontainer"
+ "syscall"
+
"github.com/docker/libcontainer/apparmor"
- "github.com/docker/libcontainer/cgroups"
+ "github.com/docker/libcontainer/configs"
)
+const defaultMountFlags = syscall.MS_NOEXEC | syscall.MS_NOSUID | syscall.MS_NODEV
+
// New returns the docker default configuration for libcontainer
-func New() *libcontainer.Config {
- container := &libcontainer.Config{
+func New() *configs.Config {
+ container := &configs.Config{
Capabilities: []string{
"CHOWN",
"DAC_OVERRIDE",
@@ -25,18 +28,64 @@ func New() *libcontainer.Config {
"KILL",
"AUDIT_WRITE",
},
- Namespaces: libcontainer.Namespaces([]libcontainer.Namespace{
+ Namespaces: configs.Namespaces([]configs.Namespace{
{Type: "NEWNS"},
{Type: "NEWUTS"},
{Type: "NEWIPC"},
{Type: "NEWPID"},
{Type: "NEWNET"},
}),
- Cgroups: &cgroups.Cgroup{
+ Cgroups: &configs.Cgroup{
Parent: "docker",
AllowAllDevices: false,
},
- MountConfig: &libcontainer.MountConfig{},
+ Mounts: []*configs.Mount{
+ {
+ Source: "proc",
+ Destination: "/proc",
+ Device: "proc",
+ Flags: defaultMountFlags,
+ },
+ {
+ Source: "tmpfs",
+ Destination: "/dev",
+ Device: "tmpfs",
+ Flags: syscall.MS_NOSUID | syscall.MS_STRICTATIME,
+ Data: "mode=755",
+ },
+ {
+ Source: "devpts",
+ Destination: "/dev/pts",
+ Device: "devpts",
+ Flags: syscall.MS_NOSUID | syscall.MS_NOEXEC,
+ Data: "newinstance,ptmxmode=0666,mode=0620,gid=5",
+ },
+ {
+ Device: "tmpfs",
+ Source: "shm",
+ Destination: "/dev/shm",
+ Data: "mode=1777,size=65536k",
+ Flags: defaultMountFlags,
+ },
+ {
+ Source: "mqueue",
+ Destination: "/dev/mqueue",
+ Device: "mqueue",
+ Flags: defaultMountFlags,
+ },
+ {
+ Source: "sysfs",
+ Destination: "/sys",
+ Device: "sysfs",
+ Flags: defaultMountFlags | syscall.MS_RDONLY,
+ },
+ },
+ MaskPaths: []string{
+ "/proc/kcore",
+ },
+ ReadonlyPaths: []string{
+ "/proc/sys", "/proc/sysrq-trigger", "/proc/irq", "/proc/bus",
+ },
}
if apparmor.IsEnabled() {
diff --git a/daemon/execdriver/native/utils.go b/daemon/execdriver/native/utils.go
index 88aefaf382..a703926453 100644
--- a/daemon/execdriver/native/utils.go
+++ b/daemon/execdriver/native/utils.go
@@ -2,28 +2,21 @@
package native
-import (
- "encoding/json"
- "os"
+//func findUserArgs() []string {
+//for i, a := range os.Args {
+//if a == "--" {
+//return os.Args[i+1:]
+//}
+//}
+//return []string{}
+//}
- "github.com/docker/libcontainer"
-)
-
-func findUserArgs() []string {
- for i, a := range os.Args {
- if a == "--" {
- return os.Args[i+1:]
- }
- }
- return []string{}
-}
-
-// loadConfigFromFd loads a container's config from the sync pipe that is provided by
-// fd 3 when running a process
-func loadConfigFromFd() (*libcontainer.Config, error) {
- var config *libcontainer.Config
- if err := json.NewDecoder(os.NewFile(3, "child")).Decode(&config); err != nil {
- return nil, err
- }
- return config, nil
-}
+//// loadConfigFromFd loads a container's config from the sync pipe that is provided by
+//// fd 3 when running a process
+//func loadConfigFromFd() (*configs.Config, error) {
+//var config *libcontainer.Config
+//if err := json.NewDecoder(os.NewFile(3, "child")).Decode(&config); err != nil {
+//return nil, err
+//}
+//return config, nil
+//}
diff --git a/daemon/execdriver/utils.go b/daemon/execdriver/utils.go
index 37042ef83a..e1fc9b9014 100644
--- a/daemon/execdriver/utils.go
+++ b/daemon/execdriver/utils.go
@@ -5,13 +5,83 @@ import (
"strings"
"github.com/docker/docker/utils"
- "github.com/docker/libcontainer/security/capabilities"
+ "github.com/syndtr/gocapability/capability"
)
+var capabilityList = Capabilities{
+ {Key: "SETPCAP", Value: capability.CAP_SETPCAP},
+ {Key: "SYS_MODULE", Value: capability.CAP_SYS_MODULE},
+ {Key: "SYS_RAWIO", Value: capability.CAP_SYS_RAWIO},
+ {Key: "SYS_PACCT", Value: capability.CAP_SYS_PACCT},
+ {Key: "SYS_ADMIN", Value: capability.CAP_SYS_ADMIN},
+ {Key: "SYS_NICE", Value: capability.CAP_SYS_NICE},
+ {Key: "SYS_RESOURCE", Value: capability.CAP_SYS_RESOURCE},
+ {Key: "SYS_TIME", Value: capability.CAP_SYS_TIME},
+ {Key: "SYS_TTY_CONFIG", Value: capability.CAP_SYS_TTY_CONFIG},
+ {Key: "MKNOD", Value: capability.CAP_MKNOD},
+ {Key: "AUDIT_WRITE", Value: capability.CAP_AUDIT_WRITE},
+ {Key: "AUDIT_CONTROL", Value: capability.CAP_AUDIT_CONTROL},
+ {Key: "MAC_OVERRIDE", Value: capability.CAP_MAC_OVERRIDE},
+ {Key: "MAC_ADMIN", Value: capability.CAP_MAC_ADMIN},
+ {Key: "NET_ADMIN", Value: capability.CAP_NET_ADMIN},
+ {Key: "SYSLOG", Value: capability.CAP_SYSLOG},
+ {Key: "CHOWN", Value: capability.CAP_CHOWN},
+ {Key: "NET_RAW", Value: capability.CAP_NET_RAW},
+ {Key: "DAC_OVERRIDE", Value: capability.CAP_DAC_OVERRIDE},
+ {Key: "FOWNER", Value: capability.CAP_FOWNER},
+ {Key: "DAC_READ_SEARCH", Value: capability.CAP_DAC_READ_SEARCH},
+ {Key: "FSETID", Value: capability.CAP_FSETID},
+ {Key: "KILL", Value: capability.CAP_KILL},
+ {Key: "SETGID", Value: capability.CAP_SETGID},
+ {Key: "SETUID", Value: capability.CAP_SETUID},
+ {Key: "LINUX_IMMUTABLE", Value: capability.CAP_LINUX_IMMUTABLE},
+ {Key: "NET_BIND_SERVICE", Value: capability.CAP_NET_BIND_SERVICE},
+ {Key: "NET_BROADCAST", Value: capability.CAP_NET_BROADCAST},
+ {Key: "IPC_LOCK", Value: capability.CAP_IPC_LOCK},
+ {Key: "IPC_OWNER", Value: capability.CAP_IPC_OWNER},
+ {Key: "SYS_CHROOT", Value: capability.CAP_SYS_CHROOT},
+ {Key: "SYS_PTRACE", Value: capability.CAP_SYS_PTRACE},
+ {Key: "SYS_BOOT", Value: capability.CAP_SYS_BOOT},
+ {Key: "LEASE", Value: capability.CAP_LEASE},
+ {Key: "SETFCAP", Value: capability.CAP_SETFCAP},
+ {Key: "WAKE_ALARM", Value: capability.CAP_WAKE_ALARM},
+ {Key: "BLOCK_SUSPEND", Value: capability.CAP_BLOCK_SUSPEND},
+}
+
+type (
+ CapabilityMapping struct {
+ Key string `json:"key,omitempty"`
+ Value capability.Cap `json:"value,omitempty"`
+ }
+ Capabilities []*CapabilityMapping
+)
+
+func (c *CapabilityMapping) String() string {
+ return c.Key
+}
+
+func GetCapability(key string) *CapabilityMapping {
+ for _, capp := range capabilityList {
+ if capp.Key == key {
+ cpy := *capp
+ return &cpy
+ }
+ }
+ return nil
+}
+
+func GetAllCapabilities() []string {
+ output := make([]string, len(capabilityList))
+ for i, capability := range capabilityList {
+ output[i] = capability.String()
+ }
+ return output
+}
+
func TweakCapabilities(basics, adds, drops []string) ([]string, error) {
var (
newCaps []string
- allCaps = capabilities.GetAllCapabilities()
+ allCaps = GetAllCapabilities()
)
// look for invalid cap in the drop list
@@ -26,7 +96,7 @@ func TweakCapabilities(basics, adds, drops []string) ([]string, error) {
// handle --cap-add=all
if utils.StringsContainsNoCase(adds, "all") {
- basics = capabilities.GetAllCapabilities()
+ basics = allCaps
}
if !utils.StringsContainsNoCase(drops, "all") {
diff --git a/daemon/export.go b/daemon/export.go
index bc0f14a3bb..859c80f9bb 100644
--- a/daemon/export.go
+++ b/daemon/export.go
@@ -11,20 +11,23 @@ func (daemon *Daemon) ContainerExport(job *engine.Job) engine.Status {
return job.Errorf("Usage: %s container_id", job.Name)
}
name := job.Args[0]
- if container := daemon.Get(name); container != nil {
- data, err := container.Export()
- if err != nil {
- return job.Errorf("%s: %s", name, err)
- }
- defer data.Close()
- // Stream the entire contents of the container (basically a volatile snapshot)
- if _, err := io.Copy(job.Stdout, data); err != nil {
- return job.Errorf("%s: %s", name, err)
- }
- // FIXME: factor job-specific LogEvent to engine.Job.Run()
- container.LogEvent("export")
- return engine.StatusOK
+ container, err := daemon.Get(name)
+ if err != nil {
+ return job.Error(err)
}
- return job.Errorf("No such container: %s", name)
+
+ data, err := container.Export()
+ if err != nil {
+ return job.Errorf("%s: %s", name, err)
+ }
+ defer data.Close()
+
+ // Stream the entire contents of the container (basically a volatile snapshot)
+ if _, err := io.Copy(job.Stdout, data); err != nil {
+ return job.Errorf("%s: %s", name, err)
+ }
+ // FIXME: factor job-specific LogEvent to engine.Job.Run()
+ container.LogEvent("export")
+ return engine.StatusOK
}
diff --git a/daemon/graphdriver/aufs/aufs.go b/daemon/graphdriver/aufs/aufs.go
index 5e9d747f2a..a986fe2356 100644
--- a/daemon/graphdriver/aufs/aufs.go
+++ b/daemon/graphdriver/aufs/aufs.go
@@ -23,6 +23,7 @@ package aufs
import (
"bufio"
"fmt"
+ "io/ioutil"
"os"
"os/exec"
"path"
@@ -34,8 +35,9 @@ import (
"github.com/docker/docker/daemon/graphdriver"
"github.com/docker/docker/pkg/archive"
"github.com/docker/docker/pkg/chrootarchive"
+ "github.com/docker/docker/pkg/common"
+ "github.com/docker/docker/pkg/directory"
mountpk "github.com/docker/docker/pkg/mount"
- "github.com/docker/docker/utils"
"github.com/docker/libcontainer/label"
)
@@ -46,6 +48,9 @@ var (
graphdriver.FsMagicAufs,
}
backingFs = "<unknown>"
+
+ enableDirpermLock sync.Once
+ enableDirperm bool
)
func init() {
@@ -151,6 +156,7 @@ func (a *Driver) Status() [][2]string {
{"Root Dir", a.rootPath()},
{"Backing Filesystem", backingFs},
{"Dirs", fmt.Sprintf("%d", len(ids))},
+ {"Dirperm1 Supported", fmt.Sprintf("%v", useDirperm())},
}
}
@@ -215,7 +221,7 @@ func (a *Driver) Remove(id string) error {
defer a.Unlock()
if a.active[id] != 0 {
- log.Errorf("Warning: removing active id %s", id)
+ log.Errorf("Removing active id %s", id)
}
// Make sure the dir is umounted first
@@ -319,7 +325,7 @@ func (a *Driver) applyDiff(id string, diff archive.ArchiveReader) error {
// relative to its base filesystem directory.
func (a *Driver) DiffSize(id, parent string) (size int64, err error) {
// AUFS doesn't need the parent layer to calculate the diff size.
- return utils.TreeSize(path.Join(a.rootPath(), "diff", id))
+ return directory.Size(path.Join(a.rootPath(), "diff", id))
}
// ApplyDiff extracts the changeset from the given diff into the
@@ -377,7 +383,7 @@ func (a *Driver) mount(id, mountLabel string) error {
}
if err := a.aufsMount(layers, rw, target, mountLabel); err != nil {
- return err
+ return fmt.Errorf("error creating aufs mount to %s: %v", target, err)
}
return nil
}
@@ -404,7 +410,7 @@ func (a *Driver) Cleanup() error {
for _, id := range ids {
if err := a.unmount(id); err != nil {
- log.Errorf("Unmounting %s: %s", utils.TruncateID(id), err)
+ log.Errorf("Unmounting %s: %s", common.TruncateID(id), err)
}
}
@@ -421,7 +427,11 @@ func (a *Driver) aufsMount(ro []string, rw, target, mountLabel string) (err erro
// Mount options are clipped to page size(4096 bytes). If there are more
// layers then these are remounted individually using append.
- b := make([]byte, syscall.Getpagesize()-len(mountLabel)-50) // room for xino & mountLabel
+ offset := 54
+ if useDirperm() {
+ offset += len("dirperm1")
+ }
+ b := make([]byte, syscall.Getpagesize()-len(mountLabel)-offset) // room for xino & mountLabel
bp := copy(b, fmt.Sprintf("br:%s=rw", rw))
firstMount := true
@@ -445,7 +455,11 @@ func (a *Driver) aufsMount(ro []string, rw, target, mountLabel string) (err erro
}
if firstMount {
- data := label.FormatMountLabel(fmt.Sprintf("%s,xino=/dev/shm/aufs.xino", string(b[:bp])), mountLabel)
+ opts := "dio,xino=/dev/shm/aufs.xino"
+ if useDirperm() {
+ opts += ",dirperm1"
+ }
+ data := label.FormatMountLabel(fmt.Sprintf("%s,%s", string(b[:bp]), opts), mountLabel)
if err = mount("none", target, "aufs", 0, data); err != nil {
return
}
@@ -459,3 +473,33 @@ func (a *Driver) aufsMount(ro []string, rw, target, mountLabel string) (err erro
return
}
+
+// useDirperm checks dirperm1 mount option can be used with the current
+// version of aufs.
+func useDirperm() bool {
+ enableDirpermLock.Do(func() {
+ base, err := ioutil.TempDir("", "docker-aufs-base")
+ if err != nil {
+ log.Errorf("error checking dirperm1: %v", err)
+ return
+ }
+ defer os.RemoveAll(base)
+
+ union, err := ioutil.TempDir("", "docker-aufs-union")
+ if err != nil {
+ log.Errorf("error checking dirperm1: %v", err)
+ return
+ }
+ defer os.RemoveAll(union)
+
+ opts := fmt.Sprintf("br:%s,dirperm1,xino=/dev/shm/aufs.xino", base)
+ if err := mount("none", union, "aufs", 0, opts); err != nil {
+ return
+ }
+ enableDirperm = true
+ if err := Unmount(union); err != nil {
+ log.Errorf("error checking dirperm1: failed to unmount %v", err)
+ }
+ })
+ return enableDirperm
+}
diff --git a/daemon/graphdriver/aufs/mount.go b/daemon/graphdriver/aufs/mount.go
index bb935f6919..a3a5a86595 100644
--- a/daemon/graphdriver/aufs/mount.go
+++ b/daemon/graphdriver/aufs/mount.go
@@ -9,7 +9,7 @@ import (
func Unmount(target string) error {
if err := exec.Command("auplink", target, "flush").Run(); err != nil {
- log.Errorf("[warning]: couldn't run auplink before unmount: %s", err)
+ log.Errorf("Couldn't run auplink before unmount: %s", err)
}
if err := syscall.Unmount(target, 0); err != nil {
return err
diff --git a/daemon/graphdriver/btrfs/MAINTAINERS b/daemon/graphdriver/btrfs/MAINTAINERS
deleted file mode 100644
index 9e629d5fcc..0000000000
--- a/daemon/graphdriver/btrfs/MAINTAINERS
+++ /dev/null
@@ -1 +0,0 @@
-Alexander Larsson <alexl@redhat.com> (@alexlarsson)
diff --git a/daemon/graphdriver/btrfs/version.go b/daemon/graphdriver/btrfs/version.go
index 89ed85749d..25248b151a 100644
--- a/daemon/graphdriver/btrfs/version.go
+++ b/daemon/graphdriver/btrfs/version.go
@@ -5,20 +5,22 @@ package btrfs
/*
#include <btrfs/version.h>
-// because around version 3.16, they did not define lib version yet
-int my_btrfs_lib_version() {
-#ifdef BTRFS_LIB_VERSION
- return BTRFS_LIB_VERSION;
-#else
- return -1;
+// around version 3.16, they did not define lib version yet
+#ifndef BTRFS_LIB_VERSION
+#define BTRFS_LIB_VERSION -1
+#endif
+
+// upstream had removed it, but now it will be coming back
+#ifndef BTRFS_BUILD_VERSION
+#define BTRFS_BUILD_VERSION "-"
#endif
-}
*/
import "C"
func BtrfsBuildVersion() string {
return string(C.BTRFS_BUILD_VERSION)
}
+
func BtrfsLibVersion() int {
return int(C.BTRFS_LIB_VERSION)
}
diff --git a/daemon/graphdriver/btrfs/version_none.go b/daemon/graphdriver/btrfs/version_none.go
index 69a4e51cf8..b32fc61c09 100644
--- a/daemon/graphdriver/btrfs/version_none.go
+++ b/daemon/graphdriver/btrfs/version_none.go
@@ -8,6 +8,7 @@ package btrfs
func BtrfsBuildVersion() string {
return "-"
}
+
func BtrfsLibVersion() int {
return -1
}
diff --git a/daemon/graphdriver/btrfs/version_test.go b/daemon/graphdriver/btrfs/version_test.go
index d96e33f3df..02fb131553 100644
--- a/daemon/graphdriver/btrfs/version_test.go
+++ b/daemon/graphdriver/btrfs/version_test.go
@@ -1,4 +1,4 @@
-// +build linux
+// +build linux,!btrfs_noversion
package btrfs
@@ -6,8 +6,8 @@ import (
"testing"
)
-func TestBuildVersion(t *testing.T) {
- if len(BtrfsBuildVersion()) == 0 {
- t.Errorf("expected output from btrfs build version, but got empty string")
+func TestLibVersion(t *testing.T) {
+ if BtrfsLibVersion() <= 0 {
+ t.Errorf("expected output from btrfs lib version > 0")
}
}
diff --git a/daemon/graphdriver/devmapper/MAINTAINERS b/daemon/graphdriver/devmapper/MAINTAINERS
deleted file mode 100644
index 9382fc3a42..0000000000
--- a/daemon/graphdriver/devmapper/MAINTAINERS
+++ /dev/null
@@ -1,2 +0,0 @@
-Alexander Larsson <alexl@redhat.com> (@alexlarsson)
-Vincent Batts <vbatts@redhat.com> (@vbatts)
diff --git a/daemon/graphdriver/devmapper/README.md b/daemon/graphdriver/devmapper/README.md
index 8c6f1d6ac1..1dc918016d 100644
--- a/daemon/graphdriver/devmapper/README.md
+++ b/daemon/graphdriver/devmapper/README.md
@@ -42,8 +42,10 @@ will display something like:
Metadata file: /dev/loop4
Data Space Used: 2.536 GB
Data Space Total: 107.4 GB
+ Data Space Available: 104.8 GB
Metadata Space Used: 7.93 MB
Metadata Space Total: 2.147 GB
+ Metadata Space Available: 2.14 GB
Udev Sync Supported: true
Data loop file: /home/docker/devicemapper/devicemapper/data
Metadata loop file: /home/docker/devicemapper/devicemapper/metadata
@@ -60,8 +62,10 @@ status information about the driver.
* `Metadata file` blockdevice file used for the devicemapper metadata
* `Data Space Used` tells how much of `Data file` is currently used
* `Data Space Total` tells max size the `Data file`
+ * `Data Space Available` tells how much free space there is in the `Data file`. If you are using a loop device this will report the actual space available to the loop device on the underlying filesystem.
* `Metadata Space Used` tells how much of `Metadata file` is currently used
* `Metadata Space Total` tells max size the `Metadata file`
+ * `Metadata Space Available` tells how much free space there is in the `Metadata file`. If you are using a loop device this will report the actual space available to the loop device on the underlying filesystem.
* `Udev Sync Supported` tells whether devicemapper is able to sync with Udev. Should be `true`.
* `Data loop file` file attached to `Data file`, if loopback device is used
* `Metadata loop file` file attached to `Metadata file`, if loopback device is used
@@ -146,7 +150,7 @@ Here is the list of supported options:
If using a block device for device mapper storage, ideally lvm2
would be used to create/manage the thin-pool volume that is then
handed to docker to exclusively create/manage the thin and thin
- snapshot volumes needed for it's containers. Managing the thin-pool
+ snapshot volumes needed for its containers. Managing the thin-pool
outside of docker makes for the most feature-rich method of having
docker utilize device mapper thin provisioning as the backing
storage for docker's containers. lvm2-based thin-pool management
diff --git a/daemon/graphdriver/devmapper/deviceset.go b/daemon/graphdriver/devmapper/deviceset.go
index 51ce54941d..686d72b951 100644
--- a/daemon/graphdriver/devmapper/deviceset.go
+++ b/daemon/graphdriver/devmapper/deviceset.go
@@ -100,8 +100,9 @@ type DeviceSet struct {
}
type DiskUsage struct {
- Used uint64
- Total uint64
+ Used uint64
+ Total uint64
+ Available uint64
}
type Status struct {
@@ -323,6 +324,11 @@ func (devices *DeviceSet) deviceFileWalkFunction(path string, finfo os.FileInfo)
return nil
}
+ if strings.HasPrefix(finfo.Name(), ".") {
+ log.Debugf("Skipping file %s", path)
+ return nil
+ }
+
if finfo.Name() == deviceSetMetaFile {
log.Debugf("Skipping file %s", path)
return nil
@@ -341,7 +347,7 @@ func (devices *DeviceSet) deviceFileWalkFunction(path string, finfo os.FileInfo)
}
if dinfo.DeviceId > MaxDeviceId {
- log.Errorf("Warning: Ignoring Invalid DeviceId=%d", dinfo.DeviceId)
+ log.Errorf("Ignoring Invalid DeviceId=%d", dinfo.DeviceId)
return nil
}
@@ -386,7 +392,7 @@ func (devices *DeviceSet) unregisterDevice(id int, hash string) error {
devices.devicesLock.Unlock()
if err := devices.removeMetadata(info); err != nil {
- log.Debugf("Error removing meta data: %s", err)
+ log.Debugf("Error removing metadata: %s", err)
return err
}
@@ -463,7 +469,7 @@ func (devices *DeviceSet) createFilesystem(info *DevInfo) error {
}
func (devices *DeviceSet) migrateOldMetaData() error {
- // Migrate old metadatafile
+ // Migrate old metadata file
jsonData, err := ioutil.ReadFile(devices.oldMetadataFile())
if err != nil && !os.IsNotExist(err) {
return err
@@ -548,7 +554,7 @@ func (devices *DeviceSet) createRegisterDevice(hash string) (*DevInfo, error) {
// happen. Now we have a mechianism to find
// a free device Id. So something is not right.
// Give a warning and continue.
- log.Errorf("Warning: Device Id %d exists in pool but it is supposed to be unused", deviceId)
+ log.Errorf("Device Id %d exists in pool but it is supposed to be unused", deviceId)
deviceId, err = devices.getNextFreeDeviceId()
if err != nil {
return nil, err
@@ -600,7 +606,7 @@ func (devices *DeviceSet) createRegisterSnapDevice(hash string, baseInfo *DevInf
// happen. Now we have a mechianism to find
// a free device Id. So something is not right.
// Give a warning and continue.
- log.Errorf("Warning: Device Id %d exists in pool but it is supposed to be unused", deviceId)
+ log.Errorf("Device Id %d exists in pool but it is supposed to be unused", deviceId)
deviceId, err = devices.getNextFreeDeviceId()
if err != nil {
return err
@@ -846,18 +852,18 @@ func (devices *DeviceSet) rollbackTransaction() error {
// closed. In that case this call will fail. Just leave a message
// in case of failure.
if err := devicemapper.DeleteDevice(devices.getPoolDevName(), devices.DeviceId); err != nil {
- log.Errorf("Warning: Unable to delete device: %s", err)
+ log.Errorf("Unable to delete device: %s", err)
}
dinfo := &DevInfo{Hash: devices.DeviceIdHash}
if err := devices.removeMetadata(dinfo); err != nil {
- log.Errorf("Warning: Unable to remove meta data: %s", err)
+ log.Errorf("Unable to remove metadata: %s", err)
} else {
devices.markDeviceIdFree(devices.DeviceId)
}
if err := devices.removeTransactionMetaData(); err != nil {
- log.Errorf("Warning: Unable to remove transaction meta file %s: %s", devices.transactionMetaFile(), err)
+ log.Errorf("Unable to remove transaction meta file %s: %s", devices.transactionMetaFile(), err)
}
return nil
@@ -877,7 +883,7 @@ func (devices *DeviceSet) processPendingTransaction() error {
// If open transaction Id is less than pool transaction Id, something
// is wrong. Bail out.
if devices.OpenTransactionId < devices.TransactionId {
- log.Errorf("Warning: Open Transaction id %d is less than pool transaction id %d", devices.OpenTransactionId, devices.TransactionId)
+ log.Errorf("Open Transaction id %d is less than pool transaction id %d", devices.OpenTransactionId, devices.TransactionId)
return nil
}
@@ -919,7 +925,7 @@ func (devices *DeviceSet) openTransaction(hash string, DeviceId int) error {
devices.DeviceIdHash = hash
devices.DeviceId = DeviceId
if err := devices.saveTransactionMetaData(); err != nil {
- return fmt.Errorf("Error saving transaction meta data: %s", err)
+ return fmt.Errorf("Error saving transaction metadata: %s", err)
}
return nil
}
@@ -927,7 +933,7 @@ func (devices *DeviceSet) openTransaction(hash string, DeviceId int) error {
func (devices *DeviceSet) refreshTransaction(DeviceId int) error {
devices.DeviceId = DeviceId
if err := devices.saveTransactionMetaData(); err != nil {
- return fmt.Errorf("Error saving transaction meta data: %s", err)
+ return fmt.Errorf("Error saving transaction metadata: %s", err)
}
return nil
}
@@ -957,7 +963,7 @@ func (devices *DeviceSet) initDevmapper(doInit bool) error {
// https://github.com/docker/docker/issues/4036
if supported := devicemapper.UdevSetSyncSupport(true); !supported {
- log.Warnf("WARNING: Udev sync is not supported. This will lead to unexpected behavior, data loss and errors")
+ log.Warnf("Udev sync is not supported. This will lead to unexpected behavior, data loss and errors")
}
log.Debugf("devicemapper: udev sync support: %v", devicemapper.UdevSyncSupported())
@@ -1087,7 +1093,7 @@ func (devices *DeviceSet) initDevmapper(doInit bool) error {
}
}
- // Right now this loads only NextDeviceId. If there is more metatadata
+ // Right now this loads only NextDeviceId. If there is more metadata
// down the line, we might have to move it earlier.
if err = devices.loadDeviceSetMetaData(); err != nil {
return err
@@ -1105,7 +1111,7 @@ func (devices *DeviceSet) initDevmapper(doInit bool) error {
}
func (devices *DeviceSet) AddDevice(hash, baseHash string) error {
- log.Debugf("[deviceset] AddDevice() hash=%s basehash=%s", hash, baseHash)
+ log.Debugf("[deviceset] AddDevice(hash=%s basehash=%s)", hash, baseHash)
defer log.Debugf("[deviceset] AddDevice(hash=%s basehash=%s) END", hash, baseHash)
baseInfo, err := devices.lookupDevice(baseHash)
@@ -1215,7 +1221,7 @@ func (devices *DeviceSet) deactivateDevice(info *DevInfo) error {
// Wait for the unmount to be effective,
// by watching the value of Info.OpenCount for the device
if err := devices.waitClose(info); err != nil {
- log.Errorf("Warning: error waiting for device %s to close: %s", info.Hash, err)
+ log.Errorf("Error waiting for device %s to close: %s", info.Hash, err)
}
devinfo, err := devicemapper.GetInfo(info.Name())
@@ -1319,9 +1325,9 @@ func (devices *DeviceSet) waitClose(info *DevInfo) error {
}
func (devices *DeviceSet) Shutdown() error {
- log.Debugf("[deviceset %s] shutdown()", devices.devicePrefix)
+ log.Debugf("[deviceset %s] Shutdown()", devices.devicePrefix)
log.Debugf("[devmapper] Shutting down DeviceSet: %s", devices.root)
- defer log.Debugf("[deviceset %s] shutdown END", devices.devicePrefix)
+ defer log.Debugf("[deviceset %s] Shutdown() END", devices.devicePrefix)
var devs []*DevInfo
@@ -1388,7 +1394,7 @@ func (devices *DeviceSet) MountDevice(hash, path, mountLabel string) error {
if info.mountCount > 0 {
if path != info.mountPath {
- return fmt.Errorf("Trying to mount devmapper device in multple places (%s, %s)", info.mountPath, path)
+ return fmt.Errorf("Trying to mount devmapper device in multiple places (%s, %s)", info.mountPath, path)
}
info.mountCount++
@@ -1562,7 +1568,7 @@ func (devices *DeviceSet) poolStatus() (totalSizeInSectors, transactionId, dataU
return
}
-// MetadataDevicePath returns the path to the metadata storage for this deviceset,
+// DataDevicePath returns the path to the data storage for this deviceset,
// regardless of loopback or block device
func (devices *DeviceSet) DataDevicePath() string {
return devices.dataDevice
@@ -1574,6 +1580,28 @@ func (devices *DeviceSet) MetadataDevicePath() string {
return devices.metadataDevice
}
+func (devices *DeviceSet) getUnderlyingAvailableSpace(loopFile string) (uint64, error) {
+ buf := new(syscall.Statfs_t)
+ err := syscall.Statfs(loopFile, buf)
+ if err != nil {
+ log.Warnf("Couldn't stat loopfile filesystem %v: %v", loopFile, err)
+ return 0, err
+ }
+ return buf.Bfree * uint64(buf.Bsize), nil
+}
+
+func (devices *DeviceSet) isRealFile(loopFile string) (bool, error) {
+ if loopFile != "" {
+ fi, err := os.Stat(loopFile)
+ if err != nil {
+ log.Warnf("Couldn't stat loopfile %v: %v", loopFile, err)
+ return false, err
+ }
+ return fi.Mode().IsRegular(), nil
+ }
+ return false, nil
+}
+
// Status returns the current status of this deviceset
func (devices *DeviceSet) Status() *Status {
devices.Lock()
@@ -1595,12 +1623,28 @@ func (devices *DeviceSet) Status() *Status {
status.Data.Used = dataUsed * blockSizeInSectors * 512
status.Data.Total = dataTotal * blockSizeInSectors * 512
+ status.Data.Available = status.Data.Total - status.Data.Used
// metadata blocks are always 4k
status.Metadata.Used = metadataUsed * 4096
status.Metadata.Total = metadataTotal * 4096
+ status.Metadata.Available = status.Metadata.Total - status.Metadata.Used
status.SectorSize = blockSizeInSectors * 512
+
+ if check, _ := devices.isRealFile(devices.dataLoopFile); check {
+ actualSpace, err := devices.getUnderlyingAvailableSpace(devices.dataLoopFile)
+ if err == nil && actualSpace < status.Data.Available {
+ status.Data.Available = actualSpace
+ }
+ }
+
+ if check, _ := devices.isRealFile(devices.metadataLoopFile); check {
+ actualSpace, err := devices.getUnderlyingAvailableSpace(devices.metadataLoopFile)
+ if err == nil && actualSpace < status.Metadata.Available {
+ status.Metadata.Available = actualSpace
+ }
+ }
}
return status
diff --git a/daemon/graphdriver/devmapper/driver.go b/daemon/graphdriver/devmapper/driver.go
index 2feed5720f..6dd05ca375 100644
--- a/daemon/graphdriver/devmapper/driver.go
+++ b/daemon/graphdriver/devmapper/driver.go
@@ -72,8 +72,10 @@ func (d *Driver) Status() [][2]string {
{"Metadata file", s.MetadataFile},
{"Data Space Used", fmt.Sprintf("%s", units.HumanSize(float64(s.Data.Used)))},
{"Data Space Total", fmt.Sprintf("%s", units.HumanSize(float64(s.Data.Total)))},
+ {"Data Space Available", fmt.Sprintf("%s", units.HumanSize(float64(s.Data.Available)))},
{"Metadata Space Used", fmt.Sprintf("%s", units.HumanSize(float64(s.Metadata.Used)))},
{"Metadata Space Total", fmt.Sprintf("%s", units.HumanSize(float64(s.Metadata.Total)))},
+ {"Metadata Space Available", fmt.Sprintf("%s", units.HumanSize(float64(s.Metadata.Available)))},
{"Udev Sync Supported", fmt.Sprintf("%v", s.UdevSyncSupported)},
}
if len(s.DataLoopback) > 0 {
@@ -162,7 +164,7 @@ func (d *Driver) Get(id, mountLabel string) (string, error) {
func (d *Driver) Put(id string) error {
err := d.DeviceSet.UnmountDevice(id)
if err != nil {
- log.Errorf("Warning: error unmounting device %s: %s", id, err)
+ log.Errorf("Error unmounting device %s: %s", id, err)
}
return err
}
diff --git a/daemon/graphdriver/devmapper/mount.go b/daemon/graphdriver/devmapper/mount.go
index f64e995744..dc9026e404 100644
--- a/daemon/graphdriver/devmapper/mount.go
+++ b/daemon/graphdriver/devmapper/mount.go
@@ -55,13 +55,14 @@ func ProbeFsType(device string) (string, error) {
if err != nil {
return "", err
}
+ defer file.Close()
buffer := make([]byte, maxLen)
l, err := file.Read(buffer)
if err != nil {
return "", err
}
- file.Close()
+
if uint64(l) != maxLen {
return "", fmt.Errorf("unable to detect filesystem type of %s, short read", device)
}
diff --git a/daemon/graphdriver/driver.go b/daemon/graphdriver/driver.go
index c63e1b45db..0488345914 100644
--- a/daemon/graphdriver/driver.go
+++ b/daemon/graphdriver/driver.go
@@ -25,6 +25,8 @@ const (
FsMagicReiserFs = FsMagic(0x52654973)
FsMagicSmbFs = FsMagic(0x0000517B)
FsMagicJffs2Fs = FsMagic(0x000072b6)
+ FsMagicZfs = FsMagic(0x2fc12fc1)
+ FsMagicXfs = FsMagic(0x58465342)
FsMagicUnsupported = FsMagic(0x00000000)
)
@@ -37,9 +39,8 @@ var (
"aufs",
"btrfs",
"devicemapper",
- "vfs",
- // experimental, has to be enabled manually for now
"overlay",
+ "vfs",
}
ErrNotSupported = errors.New("driver not supported")
@@ -58,6 +59,8 @@ var (
FsMagicReiserFs: "reiserfs",
FsMagicSmbFs: "smb",
FsMagicJffs2Fs: "jffs2",
+ FsMagicZfs: "zfs",
+ FsMagicXfs: "xfs",
FsMagicUnsupported: "unsupported",
}
)
@@ -180,6 +183,6 @@ func checkPriorDriver(name, root string) {
}
}
if len(priorDrivers) > 0 {
- log.Warnf("graphdriver %s selected. Warning: your graphdriver directory %s already contains data managed by other graphdrivers: %s", name, root, strings.Join(priorDrivers, ","))
+ log.Warnf("Graphdriver %s selected. Your graphdriver directory %s already contains data managed by other graphdrivers: %s", name, root, strings.Join(priorDrivers, ","))
}
}
diff --git a/daemon/graphdriver/graphtest/graphtest.go b/daemon/graphdriver/graphtest/graphtest.go
index af93ea829c..2bd30f6aeb 100644
--- a/daemon/graphdriver/graphtest/graphtest.go
+++ b/daemon/graphdriver/graphtest/graphtest.go
@@ -5,7 +5,6 @@ import (
"io/ioutil"
"os"
"path"
- "strings"
"syscall"
"testing"
@@ -74,7 +73,8 @@ func newDriver(t *testing.T, name string) *Driver {
d, err := graphdriver.GetDriver(name, root, nil)
if err != nil {
- if err == graphdriver.ErrNotSupported || err == graphdriver.ErrPrerequisites || strings.Contains(err.Error(), "'overlay' is not supported over") {
+ t.Logf("graphdriver: %v\n", err)
+ if err == graphdriver.ErrNotSupported || err == graphdriver.ErrPrerequisites || err == graphdriver.ErrIncompatibleFS {
t.Skipf("Driver %s not supported", name)
}
t.Fatal(err)
diff --git a/daemon/graphdriver/overlay/overlay.go b/daemon/graphdriver/overlay/overlay.go
index 27784c14a3..afe12c5091 100644
--- a/daemon/graphdriver/overlay/overlay.go
+++ b/daemon/graphdriver/overlay/overlay.go
@@ -118,6 +118,9 @@ func Init(home string, options []string) (graphdriver.Driver, error) {
case graphdriver.FsMagicAufs:
log.Error("'overlay' is not supported over aufs.")
return nil, graphdriver.ErrIncompatibleFS
+ case graphdriver.FsMagicZfs:
+ log.Error("'overlay' is not supported over zfs.")
+ return nil, graphdriver.ErrIncompatibleFS
}
// Create the driver home dir
@@ -298,7 +301,7 @@ func (d *Driver) Get(id string, mountLabel string) (string, error) {
opts := fmt.Sprintf("lowerdir=%s,upperdir=%s,workdir=%s", lowerDir, upperDir, workDir)
if err := syscall.Mount("overlay", mergedDir, "overlay", 0, label.FormatMountLabel(opts, mountLabel)); err != nil {
- return "", err
+ return "", fmt.Errorf("error creating overlay mount to %s: %v", mergedDir, err)
}
mount.path = mergedDir
mount.mounted = true
diff --git a/daemon/graphdriver/vfs/driver.go b/daemon/graphdriver/vfs/driver.go
index fe4d38230e..47d70fde5c 100644
--- a/daemon/graphdriver/vfs/driver.go
+++ b/daemon/graphdriver/vfs/driver.go
@@ -47,7 +47,7 @@ func (d *Driver) Create(id, parent string) error {
}
opts := []string{"level:s0"}
if _, mountLabel, err := label.InitLabels(opts); err == nil {
- label.Relabel(dir, mountLabel, "")
+ label.SetFileLabel(dir, mountLabel)
}
if parent == "" {
return nil
diff --git a/daemon/image_delete.go b/daemon/image_delete.go
index 19f81f11a5..0c0a534cfd 100644
--- a/daemon/image_delete.go
+++ b/daemon/image_delete.go
@@ -7,6 +7,7 @@ import (
"github.com/docker/docker/engine"
"github.com/docker/docker/graph"
"github.com/docker/docker/image"
+ "github.com/docker/docker/pkg/common"
"github.com/docker/docker/pkg/parsers"
"github.com/docker/docker/utils"
)
@@ -41,10 +42,14 @@ func (daemon *Daemon) DeleteImage(eng *engine.Engine, name string, imgs *engine.
tag = graph.DEFAULTTAG
}
+ if name == "" {
+ return fmt.Errorf("Image name can not be blank")
+ }
+
img, err := daemon.Repositories().LookupImage(name)
if err != nil {
if r, _ := daemon.Repositories().Get(repoName); r != nil {
- return fmt.Errorf("No such image: %s:%s", repoName, tag)
+ return fmt.Errorf("No such image: %s", utils.ImageReference(repoName, tag))
}
return fmt.Errorf("No such image: %s", name)
}
@@ -70,7 +75,7 @@ func (daemon *Daemon) DeleteImage(eng *engine.Engine, name string, imgs *engine.
if parsedTag != "" {
tags = append(tags, parsedTag)
}
- } else if repoName != parsedRepo && !force {
+ } else if repoName != parsedRepo && !force && first {
// the id belongs to multiple repos, like base:latest and user:test,
// in that case return conflict
return fmt.Errorf("Conflict, cannot delete image %s because it is tagged in multiple repositories, use -f to force", name)
@@ -98,7 +103,7 @@ func (daemon *Daemon) DeleteImage(eng *engine.Engine, name string, imgs *engine.
}
if tagDeleted {
out := &engine.Env{}
- out.Set("Untagged", repoName+":"+tag)
+ out.Set("Untagged", utils.ImageReference(repoName, tag))
imgs.Add(out)
eng.Job("log", "untag", img.ID, "").Run()
}
@@ -143,11 +148,11 @@ func (daemon *Daemon) canDeleteImage(imgID string, force bool) error {
if imgID == p.ID {
if container.IsRunning() {
if force {
- return fmt.Errorf("Conflict, cannot force delete %s because the running container %s is using it, stop it and retry", utils.TruncateID(imgID), utils.TruncateID(container.ID))
+ return fmt.Errorf("Conflict, cannot force delete %s because the running container %s is using it, stop it and retry", common.TruncateID(imgID), common.TruncateID(container.ID))
}
- return fmt.Errorf("Conflict, cannot delete %s because the running container %s is using it, stop it and use -f to force", utils.TruncateID(imgID), utils.TruncateID(container.ID))
+ return fmt.Errorf("Conflict, cannot delete %s because the running container %s is using it, stop it and use -f to force", common.TruncateID(imgID), common.TruncateID(container.ID))
} else if !force {
- return fmt.Errorf("Conflict, cannot delete %s because the container %s is using it, use -f to force", utils.TruncateID(imgID), utils.TruncateID(container.ID))
+ return fmt.Errorf("Conflict, cannot delete %s because the container %s is using it, use -f to force", common.TruncateID(imgID), common.TruncateID(container.ID))
}
}
return nil
diff --git a/daemon/info.go b/daemon/info.go
index 8eb4358f4a..965c370328 100644
--- a/daemon/info.go
+++ b/daemon/info.go
@@ -3,9 +3,10 @@ package daemon
import (
"os"
"runtime"
+ "time"
log "github.com/Sirupsen/logrus"
- "github.com/docker/docker/dockerversion"
+ "github.com/docker/docker/autogen/dockerversion"
"github.com/docker/docker/engine"
"github.com/docker/docker/pkg/parsers/kernel"
"github.com/docker/docker/pkg/parsers/operatingsystem"
@@ -76,6 +77,7 @@ func (daemon *Daemon) CmdInfo(job *engine.Job) engine.Status {
v.SetBool("Debug", os.Getenv("DEBUG") != "")
v.SetInt("NFd", utils.GetTotalUsedFds())
v.SetInt("NGoroutines", runtime.NumGoroutine())
+ v.Set("SystemTime", time.Now().Format(time.RFC3339Nano))
v.Set("ExecutionDriver", daemon.ExecutionDriver().Name())
v.SetInt("NEventsListener", env.GetInt("count"))
v.Set("KernelVersion", kernelVersion)
@@ -87,6 +89,16 @@ func (daemon *Daemon) CmdInfo(job *engine.Job) engine.Status {
v.SetInt("NCPU", runtime.NumCPU())
v.SetInt64("MemTotal", meminfo.MemTotal)
v.Set("DockerRootDir", daemon.Config().Root)
+ if http_proxy := os.Getenv("http_proxy"); http_proxy != "" {
+ v.Set("HttpProxy", http_proxy)
+ }
+ if https_proxy := os.Getenv("https_proxy"); https_proxy != "" {
+ v.Set("HttpsProxy", https_proxy)
+ }
+ if no_proxy := os.Getenv("no_proxy"); no_proxy != "" {
+ v.Set("NoProxy", no_proxy)
+ }
+
if hostname, err := os.Hostname(); err == nil {
v.SetJson("Name", hostname)
}
diff --git a/daemon/inspect.go b/daemon/inspect.go
index 37d00573bc..08265795ec 100644
--- a/daemon/inspect.go
+++ b/daemon/inspect.go
@@ -13,60 +13,71 @@ func (daemon *Daemon) ContainerInspect(job *engine.Job) engine.Status {
return job.Errorf("usage: %s NAME", job.Name)
}
name := job.Args[0]
- if container := daemon.Get(name); container != nil {
- container.Lock()
- defer container.Unlock()
- if job.GetenvBool("raw") {
- b, err := json.Marshal(&struct {
- *Container
- HostConfig *runconfig.HostConfig
- }{container, container.hostConfig})
- if err != nil {
- return job.Error(err)
- }
- job.Stdout.Write(b)
- return engine.StatusOK
+ container, err := daemon.Get(name)
+ if err != nil {
+ return job.Error(err)
+ }
+
+ container.Lock()
+ defer container.Unlock()
+ if job.GetenvBool("raw") {
+ b, err := json.Marshal(&struct {
+ *Container
+ HostConfig *runconfig.HostConfig
+ }{container, container.hostConfig})
+ if err != nil {
+ return job.Error(err)
}
+ job.Stdout.Write(b)
+ return engine.StatusOK
+ }
- out := &engine.Env{}
- out.SetJson("Id", container.ID)
- out.SetAuto("Created", container.Created)
- out.SetJson("Path", container.Path)
- out.SetList("Args", container.Args)
- out.SetJson("Config", container.Config)
- out.SetJson("State", container.State)
- out.Set("Image", container.ImageID)
- out.SetJson("NetworkSettings", container.NetworkSettings)
- out.Set("ResolvConfPath", container.ResolvConfPath)
- out.Set("HostnamePath", container.HostnamePath)
- out.Set("HostsPath", container.HostsPath)
- out.SetJson("Name", container.Name)
- out.SetInt("RestartCount", container.RestartCount)
- out.Set("Driver", container.Driver)
- out.Set("ExecDriver", container.ExecDriver)
- out.Set("MountLabel", container.MountLabel)
- out.Set("ProcessLabel", container.ProcessLabel)
- out.SetJson("Volumes", container.Volumes)
- out.SetJson("VolumesRW", container.VolumesRW)
- out.SetJson("AppArmorProfile", container.AppArmorProfile)
+ out := &engine.Env{}
+ out.SetJson("Id", container.ID)
+ out.SetAuto("Created", container.Created)
+ out.SetJson("Path", container.Path)
+ out.SetList("Args", container.Args)
+ out.SetJson("Config", container.Config)
+ out.SetJson("State", container.State)
+ out.Set("Image", container.ImageID)
+ out.SetJson("NetworkSettings", container.NetworkSettings)
+ out.Set("ResolvConfPath", container.ResolvConfPath)
+ out.Set("HostnamePath", container.HostnamePath)
+ out.Set("HostsPath", container.HostsPath)
+ out.Set("LogPath", container.LogPath)
+ out.SetJson("Name", container.Name)
+ out.SetInt("RestartCount", container.RestartCount)
+ out.Set("Driver", container.Driver)
+ out.Set("ExecDriver", container.ExecDriver)
+ out.Set("MountLabel", container.MountLabel)
+ out.Set("ProcessLabel", container.ProcessLabel)
+ out.SetJson("Volumes", container.Volumes)
+ out.SetJson("VolumesRW", container.VolumesRW)
+ out.SetJson("AppArmorProfile", container.AppArmorProfile)
- out.SetList("ExecIDs", container.GetExecIDs())
+ out.SetList("ExecIDs", container.GetExecIDs())
- if children, err := daemon.Children(container.Name); err == nil {
- for linkAlias, child := range children {
- container.hostConfig.Links = append(container.hostConfig.Links, fmt.Sprintf("%s:%s", child.Name, linkAlias))
- }
+ if children, err := daemon.Children(container.Name); err == nil {
+ for linkAlias, child := range children {
+ container.hostConfig.Links = append(container.hostConfig.Links, fmt.Sprintf("%s:%s", child.Name, linkAlias))
}
+ }
+ // we need this trick to preserve empty log driver, so
+ // container will use daemon defaults even if daemon change them
+ if container.hostConfig.LogConfig.Type == "" {
+ container.hostConfig.LogConfig = daemon.defaultLogConfig
+ defer func() {
+ container.hostConfig.LogConfig = runconfig.LogConfig{}
+ }()
+ }
- out.SetJson("HostConfig", container.hostConfig)
+ out.SetJson("HostConfig", container.hostConfig)
- container.hostConfig.Links = nil
- if _, err := out.WriteTo(job.Stdout); err != nil {
- return job.Error(err)
- }
- return engine.StatusOK
+ container.hostConfig.Links = nil
+ if _, err := out.WriteTo(job.Stdout); err != nil {
+ return job.Error(err)
}
- return job.Errorf("No such container: %s", name)
+ return engine.StatusOK
}
func (daemon *Daemon) ContainerExecInspect(job *engine.Job) engine.Status {
diff --git a/daemon/kill.go b/daemon/kill.go
index f5f5897c88..84094f8fbf 100644
--- a/daemon/kill.go
+++ b/daemon/kill.go
@@ -38,22 +38,23 @@ func (daemon *Daemon) ContainerKill(job *engine.Job) engine.Status {
}
}
- if container := daemon.Get(name); container != nil {
- // If no signal is passed, or SIGKILL, perform regular Kill (SIGKILL + wait())
- if sig == 0 || syscall.Signal(sig) == syscall.SIGKILL {
- if err := container.Kill(); err != nil {
- return job.Errorf("Cannot kill container %s: %s", name, err)
- }
- container.LogEvent("kill")
- } else {
- // Otherwise, just send the requested signal
- if err := container.KillSig(int(sig)); err != nil {
- return job.Errorf("Cannot kill container %s: %s", name, err)
- }
- // FIXME: Add event for signals
+ container, err := daemon.Get(name)
+ if err != nil {
+ return job.Error(err)
+ }
+
+ // If no signal is passed, or SIGKILL, perform regular Kill (SIGKILL + wait())
+ if sig == 0 || syscall.Signal(sig) == syscall.SIGKILL {
+ if err := container.Kill(); err != nil {
+ return job.Errorf("Cannot kill container %s: %s", name, err)
}
+ container.LogEvent("kill")
} else {
- return job.Errorf("No such container: %s", name)
+ // Otherwise, just send the requested signal
+ if err := container.KillSig(int(sig)); err != nil {
+ return job.Errorf("Cannot kill container %s: %s", name, err)
+ }
+ // FIXME: Add event for signals
}
return engine.StatusOK
}
diff --git a/daemon/list.go b/daemon/list.go
index 5197d9986c..130ac05376 100644
--- a/daemon/list.go
+++ b/daemon/list.go
@@ -6,9 +6,12 @@ import (
"strconv"
"strings"
+ "github.com/docker/docker/graph"
"github.com/docker/docker/pkg/graphdb"
+ "github.com/docker/docker/utils"
"github.com/docker/docker/engine"
+ "github.com/docker/docker/pkg/parsers"
"github.com/docker/docker/pkg/parsers/filters"
)
@@ -52,25 +55,24 @@ func (daemon *Daemon) Containers(job *engine.Job) engine.Status {
}
}
}
-
names := map[string][]string{}
daemon.ContainerGraph().Walk("/", func(p string, e *graphdb.Entity) error {
names[e.ID()] = append(names[e.ID()], p)
return nil
- }, -1)
+ }, 1)
var beforeCont, sinceCont *Container
if before != "" {
- beforeCont = daemon.Get(before)
- if beforeCont == nil {
- return job.Error(fmt.Errorf("Could not find container with name or id %s", before))
+ beforeCont, err = daemon.Get(before)
+ if err != nil {
+ return job.Error(err)
}
}
if since != "" {
- sinceCont = daemon.Get(since)
- if sinceCont == nil {
- return job.Error(fmt.Errorf("Could not find container with name or id %s", since))
+ sinceCont, err = daemon.Get(since)
+ if err != nil {
+ return job.Error(err)
}
}
@@ -89,6 +91,10 @@ func (daemon *Daemon) Containers(job *engine.Job) engine.Status {
return nil
}
+ if !psFilters.MatchKVList("label", container.Config.Labels) {
+ return nil
+ }
+
if before != "" && !foundBefore {
if container.ID == beforeCont.ID {
foundBefore = true
@@ -123,7 +129,12 @@ func (daemon *Daemon) Containers(job *engine.Job) engine.Status {
out := &engine.Env{}
out.SetJson("Id", container.ID)
out.SetList("Names", names[container.ID])
- out.SetJson("Image", daemon.Repositories().ImageName(container.ImageID))
+ img := container.Config.Image
+ _, tag := parsers.ParseRepositoryTag(container.Config.Image)
+ if tag == "" {
+ img = utils.ImageReference(img, graph.DEFAULTTAG)
+ }
+ out.SetJson("Image", img)
if len(container.Args) > 0 {
args := []string{}
for _, arg := range container.Args {
@@ -151,6 +162,7 @@ func (daemon *Daemon) Containers(job *engine.Job) engine.Status {
out.SetInt64("SizeRw", sizeRw)
out.SetInt64("SizeRootFs", sizeRootFs)
}
+ out.SetJson("Labels", container.Config.Labels)
outs.Add(out)
return nil
}
diff --git a/daemon/logger/copier.go b/daemon/logger/copier.go
new file mode 100644
index 0000000000..462e42346d
--- /dev/null
+++ b/daemon/logger/copier.go
@@ -0,0 +1,57 @@
+package logger
+
+import (
+ "bufio"
+ "io"
+ "sync"
+ "time"
+
+ "github.com/Sirupsen/logrus"
+)
+
+// Copier can copy logs from specified sources to Logger and attach
+// ContainerID and Timestamp.
+// Writes are concurrent, so you need implement some sync in your logger
+type Copier struct {
+ // cid is container id for which we copying logs
+ cid string
+ // srcs is map of name -> reader pairs, for example "stdout", "stderr"
+ srcs map[string]io.Reader
+ dst Logger
+ copyJobs sync.WaitGroup
+}
+
+// NewCopier creates new Copier
+func NewCopier(cid string, srcs map[string]io.Reader, dst Logger) (*Copier, error) {
+ return &Copier{
+ cid: cid,
+ srcs: srcs,
+ dst: dst,
+ }, nil
+}
+
+// Run starts logs copying
+func (c *Copier) Run() {
+ for src, w := range c.srcs {
+ c.copyJobs.Add(1)
+ go c.copySrc(src, w)
+ }
+}
+
+func (c *Copier) copySrc(name string, src io.Reader) {
+ defer c.copyJobs.Done()
+ scanner := bufio.NewScanner(src)
+ for scanner.Scan() {
+ if err := c.dst.Log(&Message{ContainerID: c.cid, Line: scanner.Bytes(), Source: name, Timestamp: time.Now().UTC()}); err != nil {
+ logrus.Errorf("Failed to log msg %q for logger %s: %s", scanner.Bytes(), c.dst.Name(), err)
+ }
+ }
+ if err := scanner.Err(); err != nil {
+ logrus.Errorf("Error scanning log stream: %s", err)
+ }
+}
+
+// Wait waits until all copying is done
+func (c *Copier) Wait() {
+ c.copyJobs.Wait()
+}
diff --git a/daemon/logger/copier_test.go b/daemon/logger/copier_test.go
new file mode 100644
index 0000000000..45f76ac8e8
--- /dev/null
+++ b/daemon/logger/copier_test.go
@@ -0,0 +1,109 @@
+package logger
+
+import (
+ "bytes"
+ "encoding/json"
+ "io"
+ "testing"
+ "time"
+)
+
+type TestLoggerJSON struct {
+ *json.Encoder
+}
+
+func (l *TestLoggerJSON) Log(m *Message) error {
+ return l.Encode(m)
+}
+
+func (l *TestLoggerJSON) Close() error {
+ return nil
+}
+
+func (l *TestLoggerJSON) Name() string {
+ return "json"
+}
+
+type TestLoggerText struct {
+ *bytes.Buffer
+}
+
+func (l *TestLoggerText) Log(m *Message) error {
+ _, err := l.WriteString(m.ContainerID + " " + m.Source + " " + string(m.Line) + "\n")
+ return err
+}
+
+func (l *TestLoggerText) Close() error {
+ return nil
+}
+
+func (l *TestLoggerText) Name() string {
+ return "text"
+}
+
+func TestCopier(t *testing.T) {
+ stdoutLine := "Line that thinks that it is log line from docker stdout"
+ stderrLine := "Line that thinks that it is log line from docker stderr"
+ var stdout bytes.Buffer
+ var stderr bytes.Buffer
+ for i := 0; i < 30; i++ {
+ if _, err := stdout.WriteString(stdoutLine + "\n"); err != nil {
+ t.Fatal(err)
+ }
+ if _, err := stderr.WriteString(stderrLine + "\n"); err != nil {
+ t.Fatal(err)
+ }
+ }
+
+ var jsonBuf bytes.Buffer
+
+ jsonLog := &TestLoggerJSON{Encoder: json.NewEncoder(&jsonBuf)}
+
+ cid := "a7317399f3f857173c6179d44823594f8294678dea9999662e5c625b5a1c7657"
+ c, err := NewCopier(cid,
+ map[string]io.Reader{
+ "stdout": &stdout,
+ "stderr": &stderr,
+ },
+ jsonLog)
+ if err != nil {
+ t.Fatal(err)
+ }
+ c.Run()
+ wait := make(chan struct{})
+ go func() {
+ c.Wait()
+ close(wait)
+ }()
+ select {
+ case <-time.After(1 * time.Second):
+ t.Fatal("Copier failed to do its work in 1 second")
+ case <-wait:
+ }
+ dec := json.NewDecoder(&jsonBuf)
+ for {
+ var msg Message
+ if err := dec.Decode(&msg); err != nil {
+ if err == io.EOF {
+ break
+ }
+ t.Fatal(err)
+ }
+ if msg.Source != "stdout" && msg.Source != "stderr" {
+ t.Fatalf("Wrong Source: %q, should be %q or %q", msg.Source, "stdout", "stderr")
+ }
+ if msg.ContainerID != cid {
+ t.Fatalf("Wrong ContainerID: %q, expected %q", msg.ContainerID, cid)
+ }
+ if msg.Source == "stdout" {
+ if string(msg.Line) != stdoutLine {
+ t.Fatalf("Wrong Line: %q, expected %q", msg.Line, stdoutLine)
+ }
+ }
+ if msg.Source == "stderr" {
+ if string(msg.Line) != stderrLine {
+ t.Fatalf("Wrong Line: %q, expected %q", msg.Line, stderrLine)
+ }
+ }
+ }
+}
diff --git a/daemon/logger/jsonfilelog/jsonfilelog.go b/daemon/logger/jsonfilelog/jsonfilelog.go
new file mode 100644
index 0000000000..faa6bf92e2
--- /dev/null
+++ b/daemon/logger/jsonfilelog/jsonfilelog.go
@@ -0,0 +1,58 @@
+package jsonfilelog
+
+import (
+ "bytes"
+ "os"
+ "sync"
+
+ "github.com/docker/docker/daemon/logger"
+ "github.com/docker/docker/pkg/jsonlog"
+)
+
+// JSONFileLogger is Logger implementation for default docker logging:
+// JSON objects to file
+type JSONFileLogger struct {
+ buf *bytes.Buffer
+ f *os.File // store for closing
+ mu sync.Mutex // protects buffer
+}
+
+// New creates new JSONFileLogger which writes to filename
+func New(filename string) (logger.Logger, error) {
+ log, err := os.OpenFile(filename, os.O_RDWR|os.O_APPEND|os.O_CREATE, 0600)
+ if err != nil {
+ return nil, err
+ }
+ return &JSONFileLogger{
+ f: log,
+ buf: bytes.NewBuffer(nil),
+ }, nil
+}
+
+// Log converts logger.Message to jsonlog.JSONLog and serializes it to file
+func (l *JSONFileLogger) Log(msg *logger.Message) error {
+ l.mu.Lock()
+ defer l.mu.Unlock()
+ err := (&jsonlog.JSONLog{Log: string(msg.Line) + "\n", Stream: msg.Source, Created: msg.Timestamp}).MarshalJSONBuf(l.buf)
+ if err != nil {
+ return err
+ }
+ l.buf.WriteByte('\n')
+ _, err = l.buf.WriteTo(l.f)
+ if err != nil {
+ // this buffer is screwed, replace it with another to avoid races
+ l.buf = bytes.NewBuffer(nil)
+ return err
+ }
+ return nil
+}
+
+// Close closes underlying file
+func (l *JSONFileLogger) Close() error {
+ return l.f.Close()
+}
+
+// Name returns name of this logger
+func (l *JSONFileLogger) Name() string {
+ return "JSONFile"
+}
diff --git a/daemon/logger/jsonfilelog/jsonfilelog_test.go b/daemon/logger/jsonfilelog/jsonfilelog_test.go
new file mode 100644
index 0000000000..e951c1b869
--- /dev/null
+++ b/daemon/logger/jsonfilelog/jsonfilelog_test.go
@@ -0,0 +1,78 @@
+package jsonfilelog
+
+import (
+ "io/ioutil"
+ "os"
+ "path/filepath"
+ "testing"
+ "time"
+
+ "github.com/docker/docker/daemon/logger"
+ "github.com/docker/docker/pkg/jsonlog"
+)
+
+func TestJSONFileLogger(t *testing.T) {
+ tmp, err := ioutil.TempDir("", "docker-logger-")
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer os.RemoveAll(tmp)
+ filename := filepath.Join(tmp, "container.log")
+ l, err := New(filename)
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer l.Close()
+ cid := "a7317399f3f857173c6179d44823594f8294678dea9999662e5c625b5a1c7657"
+ if err := l.Log(&logger.Message{ContainerID: cid, Line: []byte("line1"), Source: "src1"}); err != nil {
+ t.Fatal(err)
+ }
+ if err := l.Log(&logger.Message{ContainerID: cid, Line: []byte("line2"), Source: "src2"}); err != nil {
+ t.Fatal(err)
+ }
+ if err := l.Log(&logger.Message{ContainerID: cid, Line: []byte("line3"), Source: "src3"}); err != nil {
+ t.Fatal(err)
+ }
+ res, err := ioutil.ReadFile(filename)
+ if err != nil {
+ t.Fatal(err)
+ }
+ expected := `{"log":"line1\n","stream":"src1","time":"0001-01-01T00:00:00Z"}
+{"log":"line2\n","stream":"src2","time":"0001-01-01T00:00:00Z"}
+{"log":"line3\n","stream":"src3","time":"0001-01-01T00:00:00Z"}
+`
+
+ if string(res) != expected {
+ t.Fatalf("Wrong log content: %q, expected %q", res, expected)
+ }
+}
+
+func BenchmarkJSONFileLogger(b *testing.B) {
+ tmp, err := ioutil.TempDir("", "docker-logger-")
+ if err != nil {
+ b.Fatal(err)
+ }
+ defer os.RemoveAll(tmp)
+ filename := filepath.Join(tmp, "container.log")
+ l, err := New(filename)
+ if err != nil {
+ b.Fatal(err)
+ }
+ defer l.Close()
+ cid := "a7317399f3f857173c6179d44823594f8294678dea9999662e5c625b5a1c7657"
+ testLine := "Line that thinks that it is log line from docker\n"
+ msg := &logger.Message{ContainerID: cid, Line: []byte(testLine), Source: "stderr", Timestamp: time.Now().UTC()}
+ jsonlog, err := (&jsonlog.JSONLog{Log: string(msg.Line) + "\n", Stream: msg.Source, Created: msg.Timestamp}).MarshalJSON()
+ if err != nil {
+ b.Fatal(err)
+ }
+ b.SetBytes(int64(len(jsonlog)+1) * 30)
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ for j := 0; j < 30; j++ {
+ if err := l.Log(msg); err != nil {
+ b.Fatal(err)
+ }
+ }
+ }
+}
diff --git a/daemon/logger/logger.go b/daemon/logger/logger.go
new file mode 100644
index 0000000000..078e67d8e9
--- /dev/null
+++ b/daemon/logger/logger.go
@@ -0,0 +1,18 @@
+package logger
+
+import "time"
+
+// Message is datastructure that represents record from some container
+type Message struct {
+ ContainerID string
+ Line []byte
+ Source string
+ Timestamp time.Time
+}
+
+// Logger is interface for docker logging drivers
+type Logger interface {
+ Log(*Message) error
+ Name() string
+ Close() error
+}
diff --git a/daemon/logger/syslog/syslog.go b/daemon/logger/syslog/syslog.go
new file mode 100644
index 0000000000..eecb333cc8
--- /dev/null
+++ b/daemon/logger/syslog/syslog.go
@@ -0,0 +1,45 @@
+package syslog
+
+import (
+ "fmt"
+ "log/syslog"
+ "os"
+ "path"
+ "sync"
+
+ "github.com/docker/docker/daemon/logger"
+)
+
+type Syslog struct {
+ writer *syslog.Writer
+ tag string
+ mu sync.Mutex
+}
+
+func New(tag string) (logger.Logger, error) {
+ log, err := syslog.New(syslog.LOG_DAEMON, fmt.Sprintf("%s/%s", path.Base(os.Args[0]), tag))
+ if err != nil {
+ return nil, err
+ }
+ return &Syslog{
+ writer: log,
+ }, nil
+}
+
+func (s *Syslog) Log(msg *logger.Message) error {
+ if msg.Source == "stderr" {
+ return s.writer.Err(string(msg.Line))
+ }
+ return s.writer.Info(string(msg.Line))
+}
+
+func (s *Syslog) Close() error {
+ if s.writer != nil {
+ return s.writer.Close()
+ }
+ return nil
+}
+
+func (s *Syslog) Name() string {
+ return "Syslog"
+}
diff --git a/daemon/logs.go b/daemon/logs.go
index 6c9373f737..356d08c5c8 100644
--- a/daemon/logs.go
+++ b/daemon/logs.go
@@ -40,9 +40,12 @@ func (daemon *Daemon) ContainerLogs(job *engine.Job) engine.Status {
if tail == "" {
tail = "all"
}
- container := daemon.Get(name)
- if container == nil {
- return job.Errorf("No such container: %s", name)
+ container, err := daemon.Get(name)
+ if err != nil {
+ return job.Error(err)
+ }
+ if container.LogDriverType() != "json-file" {
+ return job.Errorf("\"logs\" endpoint is supported only for \"json-file\" logging driver")
}
cLog, err := container.ReadLog("json")
if err != nil && os.IsNotExist(err) {
@@ -99,7 +102,8 @@ func (daemon *Daemon) ContainerLogs(job *engine.Job) engine.Status {
}
logLine := l.Log
if times {
- logLine = fmt.Sprintf("%s %s", l.Created.Format(format), logLine)
+ // format can be "" or time format, so here can't be error
+ logLine, _ = l.Format(format)
}
if l.Stream == "stdout" && stdout {
io.WriteString(job.Stdout, logLine)
diff --git a/daemon/monitor.go b/daemon/monitor.go
index 9e7d3062f0..7c18b7a38c 100644
--- a/daemon/monitor.go
+++ b/daemon/monitor.go
@@ -8,8 +8,8 @@ import (
log "github.com/Sirupsen/logrus"
"github.com/docker/docker/daemon/execdriver"
+ "github.com/docker/docker/pkg/common"
"github.com/docker/docker/runconfig"
- "github.com/docker/docker/utils"
)
const defaultTimeIncrement = 100
@@ -123,7 +123,7 @@ func (m *containerMonitor) Start() error {
for {
m.container.RestartCount++
- if err := m.container.startLoggingToDisk(); err != nil {
+ if err := m.container.startLogging(); err != nil {
m.resetContainer(false)
return err
@@ -168,12 +168,10 @@ func (m *containerMonitor) Start() error {
// we need to check this before reentering the loop because the waitForNextRestart could have
// been terminated by a request from a user
if m.shouldStop {
- m.container.ExitCode = exitStatus.ExitCode
return err
}
continue
}
- m.container.ExitCode = exitStatus.ExitCode
if exitStatus.OOMKilled {
m.container.LogEvent("oom")
}
@@ -184,7 +182,7 @@ func (m *containerMonitor) Start() error {
}
// resetMonitor resets the stateful fields on the containerMonitor based on the
-// previous runs success or failure. Reguardless of success, if the container had
+// previous runs success or failure. Regardless of success, if the container had
// an execution time of more than 10s then reset the timer back to the default
func (m *containerMonitor) resetMonitor(successful bool) {
executionTime := time.Now().Sub(m.lastStartTime).Seconds()
@@ -232,7 +230,7 @@ func (m *containerMonitor) shouldRestart(exitCode int) bool {
// the default value of 0 for MaximumRetryCount means that we will not enforce a maximum count
if max := m.restartPolicy.MaximumRetryCount; max != 0 && m.failureCount > max {
log.Debugf("stopping restart of container %s because maximum failure could of %d has been reached",
- utils.TruncateID(m.container.ID), max)
+ common.TruncateID(m.container.ID), max)
return false
}
@@ -304,6 +302,24 @@ func (m *containerMonitor) resetContainer(lock bool) {
container.stdin, container.stdinPipe = io.Pipe()
}
+ if container.logDriver != nil {
+ if container.logCopier != nil {
+ exit := make(chan struct{})
+ go func() {
+ container.logCopier.Wait()
+ close(exit)
+ }()
+ select {
+ case <-time.After(1 * time.Second):
+ log.Warnf("Logger didn't exit in time: logs may be truncated")
+ case <-exit:
+ }
+ }
+ container.logDriver.Close()
+ container.logCopier = nil
+ container.logDriver = nil
+ }
+
c := container.command.ProcessConfig.Cmd
container.command.ProcessConfig.Cmd = exec.Cmd{
diff --git a/daemon/networkdriver/bridge/driver.go b/daemon/networkdriver/bridge/driver.go
index e7ddfd2106..30a3a121e7 100644
--- a/daemon/networkdriver/bridge/driver.go
+++ b/daemon/networkdriver/bridge/driver.go
@@ -7,6 +7,7 @@ import (
"io/ioutil"
"net"
"os"
+ "os/exec"
"strings"
"sync"
@@ -31,7 +32,7 @@ const (
type networkInterface struct {
IP net.IP
IPv6 net.IP
- PortMappings []net.Addr // there are mappings to the host interfaces
+ PortMappings []net.Addr // There are mappings to the host interfaces
}
type ifaces struct {
@@ -77,11 +78,19 @@ var (
bridgeIPv4Network *net.IPNet
bridgeIPv6Addr net.IP
globalIPv6Network *net.IPNet
+ portMapper *portmapper.PortMapper
+ once sync.Once
defaultBindingIP = net.ParseIP("0.0.0.0")
currentInterfaces = ifaces{c: make(map[string]*networkInterface)}
)
+func initPortMapper() {
+ once.Do(func() {
+ portMapper = portmapper.New()
+ })
+}
+
func InitDriver(job *engine.Job) engine.Status {
var (
networkv4 *net.IPNet
@@ -99,6 +108,14 @@ func InitDriver(job *engine.Job) engine.Status {
fixedCIDRv6 = job.Getenv("FixedCIDRv6")
)
+ // try to modprobe bridge first
+ // see gh#12177
+ if out, err := exec.Command("modprobe", "-va", "bridge", "nf_nat").Output(); err != nil {
+ log.Warnf("Running modprobe bridge nf_nat failed with message: %s, error: %v", out, err)
+ }
+
+ initPortMapper()
+
if defaultIP := job.Getenv("DefaultBindingIP"); defaultIP != "" {
defaultBindingIP = net.ParseIP(defaultIP)
}
@@ -113,7 +130,7 @@ func InitDriver(job *engine.Job) engine.Status {
addrv4, addrsv6, err := networkdriver.GetIfaceAddr(bridgeIface)
if err != nil {
- // No Bridge existent. Create one
+ // No Bridge existent, create one
// If we're not using the default bridge, fail without trying to create it
if !usingDefaultBridge {
return job.Error(err)
@@ -137,8 +154,8 @@ func InitDriver(job *engine.Job) engine.Status {
}
}
} else {
- // Bridge exists already. Getting info...
- // validate that the bridge ip matches the ip specified by BridgeIP
+ // Bridge exists already, getting info...
+ // Validate that the bridge ip matches the ip specified by BridgeIP
if bridgeIP != "" {
networkv4 = addrv4.(*net.IPNet)
bip, _, err := net.ParseCIDR(bridgeIP)
@@ -146,11 +163,11 @@ func InitDriver(job *engine.Job) engine.Status {
return job.Error(err)
}
if !networkv4.IP.Equal(bip) {
- return job.Errorf("bridge ip (%s) does not match existing bridge configuration %s", networkv4.IP, bip)
+ return job.Errorf("Bridge ip (%s) does not match existing bridge configuration %s", networkv4.IP, bip)
}
}
- // a bridge might exist but not have any IPv6 addr associated with it yet
+ // A bridge might exist but not have any IPv6 addr associated with it yet
// (for example, an existing Docker installation that has only been used
// with IPv4 and docker0 already is set up) In that case, we can perform
// the bridge init for IPv6 here, else we will error out below if --ipv6=true
@@ -158,7 +175,7 @@ func InitDriver(job *engine.Job) engine.Status {
if err := setupIPv6Bridge(bridgeIPv6); err != nil {
return job.Error(err)
}
- // recheck addresses now that IPv6 is setup on the bridge
+ // Recheck addresses now that IPv6 is setup on the bridge
addrv4, addrsv6, err = networkdriver.GetIfaceAddr(bridgeIface)
if err != nil {
return job.Error(err)
@@ -182,7 +199,7 @@ func InitDriver(job *engine.Job) engine.Status {
}
}
if !found {
- return job.Errorf("bridge IPv6 does not match existing bridge configuration %s", bip6)
+ return job.Errorf("Bridge IPv6 does not match existing bridge configuration %s", bip6)
}
}
@@ -234,7 +251,7 @@ func InitDriver(job *engine.Job) engine.Status {
if err != nil {
return job.Error(err)
}
- portmapper.SetIptablesChain(chain)
+ portMapper.SetIptablesChain(chain)
}
bridgeIPv4Network = networkv4
@@ -284,10 +301,11 @@ func setupIPTables(addr net.Addr, icc, ipmasq bool) error {
// Enable NAT
if ipmasq {
- natArgs := []string{"POSTROUTING", "-t", "nat", "-s", addr.String(), "!", "-o", bridgeIface, "-j", "MASQUERADE"}
+ natArgs := []string{"-s", addr.String(), "!", "-o", bridgeIface, "-j", "MASQUERADE"}
- if !iptables.Exists(natArgs...) {
- if output, err := iptables.Raw(append([]string{"-I"}, natArgs...)...); err != nil {
+ if !iptables.Exists(iptables.Nat, "POSTROUTING", natArgs...) {
+ if output, err := iptables.Raw(append([]string{
+ "-t", string(iptables.Nat), "-I", "POSTROUTING"}, natArgs...)...); err != nil {
return fmt.Errorf("Unable to enable network bridge NAT: %s", err)
} else if len(output) != 0 {
return &iptables.ChainError{Chain: "POSTROUTING", Output: output}
@@ -296,28 +314,28 @@ func setupIPTables(addr net.Addr, icc, ipmasq bool) error {
}
var (
- args = []string{"FORWARD", "-i", bridgeIface, "-o", bridgeIface, "-j"}
+ args = []string{"-i", bridgeIface, "-o", bridgeIface, "-j"}
acceptArgs = append(args, "ACCEPT")
dropArgs = append(args, "DROP")
)
if !icc {
- iptables.Raw(append([]string{"-D"}, acceptArgs...)...)
+ iptables.Raw(append([]string{"-D", "FORWARD"}, acceptArgs...)...)
- if !iptables.Exists(dropArgs...) {
+ if !iptables.Exists(iptables.Filter, "FORWARD", dropArgs...) {
log.Debugf("Disable inter-container communication")
- if output, err := iptables.Raw(append([]string{"-I"}, dropArgs...)...); err != nil {
+ if output, err := iptables.Raw(append([]string{"-I", "FORWARD"}, dropArgs...)...); err != nil {
return fmt.Errorf("Unable to prevent intercontainer communication: %s", err)
} else if len(output) != 0 {
return fmt.Errorf("Error disabling intercontainer communication: %s", output)
}
}
} else {
- iptables.Raw(append([]string{"-D"}, dropArgs...)...)
+ iptables.Raw(append([]string{"-D", "FORWARD"}, dropArgs...)...)
- if !iptables.Exists(acceptArgs...) {
+ if !iptables.Exists(iptables.Filter, "FORWARD", acceptArgs...) {
log.Debugf("Enable inter-container communication")
- if output, err := iptables.Raw(append([]string{"-I"}, acceptArgs...)...); err != nil {
+ if output, err := iptables.Raw(append([]string{"-I", "FORWARD"}, acceptArgs...)...); err != nil {
return fmt.Errorf("Unable to allow intercontainer communication: %s", err)
} else if len(output) != 0 {
return fmt.Errorf("Error enabling intercontainer communication: %s", output)
@@ -326,9 +344,9 @@ func setupIPTables(addr net.Addr, icc, ipmasq bool) error {
}
// Accept all non-intercontainer outgoing packets
- outgoingArgs := []string{"FORWARD", "-i", bridgeIface, "!", "-o", bridgeIface, "-j", "ACCEPT"}
- if !iptables.Exists(outgoingArgs...) {
- if output, err := iptables.Raw(append([]string{"-I"}, outgoingArgs...)...); err != nil {
+ outgoingArgs := []string{"-i", bridgeIface, "!", "-o", bridgeIface, "-j", "ACCEPT"}
+ if !iptables.Exists(iptables.Filter, "FORWARD", outgoingArgs...) {
+ if output, err := iptables.Raw(append([]string{"-I", "FORWARD"}, outgoingArgs...)...); err != nil {
return fmt.Errorf("Unable to allow outgoing packets: %s", err)
} else if len(output) != 0 {
return &iptables.ChainError{Chain: "FORWARD outgoing", Output: output}
@@ -336,10 +354,10 @@ func setupIPTables(addr net.Addr, icc, ipmasq bool) error {
}
// Accept incoming packets for existing connections
- existingArgs := []string{"FORWARD", "-o", bridgeIface, "-m", "conntrack", "--ctstate", "RELATED,ESTABLISHED", "-j", "ACCEPT"}
+ existingArgs := []string{"-o", bridgeIface, "-m", "conntrack", "--ctstate", "RELATED,ESTABLISHED", "-j", "ACCEPT"}
- if !iptables.Exists(existingArgs...) {
- if output, err := iptables.Raw(append([]string{"-I"}, existingArgs...)...); err != nil {
+ if !iptables.Exists(iptables.Filter, "FORWARD", existingArgs...) {
+ if output, err := iptables.Raw(append([]string{"-I", "FORWARD"}, existingArgs...)...); err != nil {
return fmt.Errorf("Unable to allow incoming packets: %s", err)
} else if len(output) != 0 {
return &iptables.ChainError{Chain: "FORWARD incoming", Output: output}
@@ -348,6 +366,11 @@ func setupIPTables(addr net.Addr, icc, ipmasq bool) error {
return nil
}
+func RequestPort(ip net.IP, proto string, port int) (int, error) {
+ initPortMapper()
+ return portMapper.Allocator.RequestPort(ip, proto, port)
+}
+
// configureBridge attempts to create and configure a network bridge interface named `bridgeIface` on the host
// If bridgeIP is empty, it will try to find a non-conflicting IP from the Docker-specified private ranges
// If the bridge `bridgeIface` already exists, it will only perform the IP address association with the existing
@@ -356,7 +379,7 @@ func setupIPTables(addr net.Addr, icc, ipmasq bool) error {
func configureBridge(bridgeIP string, bridgeIPv6 string, enableIPv6 bool) error {
nameservers := []string{}
resolvConf, _ := resolvconf.Get()
- // we don't check for an error here, because we don't really care
+ // We don't check for an error here, because we don't really care
// if we can't read /etc/resolv.conf. So instead we skip the append
// if resolvConf is nil. It either doesn't exist, or we can't read it
// for some reason.
@@ -394,7 +417,7 @@ func configureBridge(bridgeIP string, bridgeIPv6 string, enableIPv6 bool) error
log.Debugf("Creating bridge %s with network %s", bridgeIface, ifaceAddr)
if err := createBridgeIface(bridgeIface); err != nil {
- // the bridge may already exist, therefore we can ignore an "exists" error
+ // The bridge may already exist, therefore we can ignore an "exists" error
if !os.IsExist(err) {
return err
}
@@ -452,7 +475,7 @@ func setupIPv6Bridge(bridgeIPv6 string) error {
func createBridgeIface(name string) error {
kv, err := kernel.GetKernelVersion()
- // only set the bridge's mac address if the kernel version is > 3.3
+ // Only set the bridge's mac address if the kernel version is > 3.3
// before that it was not supported
setBridgeMacAddr := err == nil && (kv.Kernel >= 3 && kv.Major >= 3)
log.Debugf("setting bridge mac address = %v", setBridgeMacAddr)
@@ -508,11 +531,7 @@ func Allocate(job *engine.Job) engine.Status {
globalIPv6 net.IP
)
- if requestedIP != nil {
- ip, err = ipallocator.RequestIP(bridgeIPv4Network, requestedIP)
- } else {
- ip, err = ipallocator.RequestIP(bridgeIPv4Network, nil)
- }
+ ip, err = ipallocator.RequestIP(bridgeIPv4Network, requestedIP)
if err != nil {
return job.Error(err)
}
@@ -523,10 +542,11 @@ func Allocate(job *engine.Job) engine.Status {
}
if globalIPv6Network != nil {
- // if globalIPv6Network Size is at least a /80 subnet generate IPv6 address from MAC address
+ // If globalIPv6Network Size is at least a /80 subnet generate IPv6 address from MAC address
netmask_ones, _ := globalIPv6Network.Mask.Size()
if requestedIPv6 == nil && netmask_ones <= 80 {
- requestedIPv6 = globalIPv6Network.IP
+ requestedIPv6 = make(net.IP, len(globalIPv6Network.IP))
+ copy(requestedIPv6, globalIPv6Network.IP)
for i, h := range mac {
requestedIPv6[i+10] = h
}
@@ -534,7 +554,7 @@ func Allocate(job *engine.Job) engine.Status {
globalIPv6, err = ipallocator.RequestIP(globalIPv6Network, requestedIPv6)
if err != nil {
- log.Errorf("Allocator: RequestIP v6: %s", err.Error())
+ log.Errorf("Allocator: RequestIP v6: %v", err)
return job.Error(err)
}
log.Infof("Allocated IPv6 %s", globalIPv6)
@@ -550,7 +570,7 @@ func Allocate(job *engine.Job) engine.Status {
size, _ := bridgeIPv4Network.Mask.Size()
out.SetInt("IPPrefixLen", size)
- // if linklocal IPv6
+ // If linklocal IPv6
localIPv6Net, err := linkLocalIPv6FromMac(mac.String())
if err != nil {
return job.Error(err)
@@ -576,7 +596,7 @@ func Allocate(job *engine.Job) engine.Status {
return engine.StatusOK
}
-// release an interface for a select ip
+// Release an interface for a select ip
func Release(job *engine.Job) engine.Status {
var (
id = job.Args[0]
@@ -588,7 +608,7 @@ func Release(job *engine.Job) engine.Status {
}
for _, nat := range containerInterface.PortMappings {
- if err := portmapper.Unmap(nat); err != nil {
+ if err := portMapper.Unmap(nat); err != nil {
log.Infof("Unable to unmap port %s: %s", nat, err)
}
}
@@ -645,7 +665,7 @@ func AllocatePort(job *engine.Job) engine.Status {
var host net.Addr
for i := 0; i < MaxAllocatedPortAttempts; i++ {
- if host, err = portmapper.Map(container, ip, hostPort); err == nil {
+ if host, err = portMapper.Map(container, ip, hostPort); err == nil {
break
}
// There is no point in immediately retrying to map an explicitly
@@ -702,11 +722,11 @@ func LinkContainers(job *engine.Job) engine.Status {
ip1 := net.ParseIP(parentIP)
if ip1 == nil {
- return job.Errorf("parent IP '%s' is invalid", parentIP)
+ return job.Errorf("Parent IP '%s' is invalid", parentIP)
}
ip2 := net.ParseIP(childIP)
if ip2 == nil {
- return job.Errorf("child IP '%s' is invalid", childIP)
+ return job.Errorf("Child IP '%s' is invalid", childIP)
}
chain := iptables.Chain{Name: "DOCKER", Bridge: bridgeIface}
diff --git a/daemon/networkdriver/bridge/driver_test.go b/daemon/networkdriver/bridge/driver_test.go
index 02bea9ce13..8c20dffb85 100644
--- a/daemon/networkdriver/bridge/driver_test.go
+++ b/daemon/networkdriver/bridge/driver_test.go
@@ -1,6 +1,7 @@
package bridge
import (
+ "fmt"
"net"
"strconv"
"testing"
@@ -104,6 +105,123 @@ func TestHostnameFormatChecking(t *testing.T) {
}
}
+func newInterfaceAllocation(t *testing.T, input engine.Env) (output engine.Env) {
+ eng := engine.New()
+ eng.Logging = false
+
+ done := make(chan bool)
+
+ // set IPv6 global if given
+ if input.Exists("globalIPv6Network") {
+ _, globalIPv6Network, _ = net.ParseCIDR(input.Get("globalIPv6Network"))
+ }
+
+ job := eng.Job("allocate_interface", "container_id")
+ job.Env().Init(&input)
+ reader, _ := job.Stdout.AddPipe()
+ go func() {
+ output.Decode(reader)
+ done <- true
+ }()
+
+ res := Allocate(job)
+ job.Stdout.Close()
+ <-done
+
+ if input.Exists("expectFail") && input.GetBool("expectFail") {
+ if res == engine.StatusOK {
+ t.Fatal("Doesn't fail to allocate network interface")
+ }
+ } else {
+ if res != engine.StatusOK {
+ t.Fatal("Failed to allocate network interface")
+ }
+ }
+
+ if input.Exists("globalIPv6Network") {
+ // check for bug #11427
+ _, subnet, _ := net.ParseCIDR(input.Get("globalIPv6Network"))
+ if globalIPv6Network.IP.String() != subnet.IP.String() {
+ t.Fatal("globalIPv6Network was modified during allocation")
+ }
+ // clean up IPv6 global
+ globalIPv6Network = nil
+ }
+
+ return
+}
+
+func TestIPv6InterfaceAllocationAutoNetmaskGt80(t *testing.T) {
+
+ input := engine.Env{}
+
+ _, subnet, _ := net.ParseCIDR("2001:db8:1234:1234:1234::/81")
+
+ // set global ipv6
+ input.Set("globalIPv6Network", subnet.String())
+
+ output := newInterfaceAllocation(t, input)
+
+ // ensure low manually assigend global ip
+ ip := net.ParseIP(output.Get("GlobalIPv6"))
+ _, subnet, _ = net.ParseCIDR(fmt.Sprintf("%s/%d", subnet.IP.String(), 120))
+ if !subnet.Contains(ip) {
+ t.Fatalf("Error ip %s not in subnet %s", ip.String(), subnet.String())
+ }
+}
+
+func TestIPv6InterfaceAllocationAutoNetmaskLe80(t *testing.T) {
+
+ input := engine.Env{}
+
+ _, subnet, _ := net.ParseCIDR("2001:db8:1234:1234:1234::/80")
+
+ // set global ipv6
+ input.Set("globalIPv6Network", subnet.String())
+ input.Set("RequestedMac", "ab:cd:ab:cd:ab:cd")
+
+ output := newInterfaceAllocation(t, input)
+
+ // ensure global ip with mac
+ ip := net.ParseIP(output.Get("GlobalIPv6"))
+ expected_ip := net.ParseIP("2001:db8:1234:1234:1234:abcd:abcd:abcd")
+ if ip.String() != expected_ip.String() {
+ t.Fatalf("Error ip %s should be %s", ip.String(), expected_ip.String())
+ }
+
+ // ensure link local format
+ ip = net.ParseIP(output.Get("LinkLocalIPv6"))
+ expected_ip = net.ParseIP("fe80::a9cd:abff:fecd:abcd")
+ if ip.String() != expected_ip.String() {
+ t.Fatalf("Error ip %s should be %s", ip.String(), expected_ip.String())
+ }
+
+}
+
+func TestIPv6InterfaceAllocationRequest(t *testing.T) {
+
+ input := engine.Env{}
+
+ _, subnet, _ := net.ParseCIDR("2001:db8:1234:1234:1234::/80")
+ expected_ip := net.ParseIP("2001:db8:1234:1234:1234::1328")
+
+ // set global ipv6
+ input.Set("globalIPv6Network", subnet.String())
+ input.Set("RequestedIPv6", expected_ip.String())
+
+ output := newInterfaceAllocation(t, input)
+
+ // ensure global ip with mac
+ ip := net.ParseIP(output.Get("GlobalIPv6"))
+ if ip.String() != expected_ip.String() {
+ t.Fatalf("Error ip %s should be %s", ip.String(), expected_ip.String())
+ }
+
+ // retry -> fails for duplicated address
+ input.SetBool("expectFail", true)
+ output = newInterfaceAllocation(t, input)
+}
+
func TestMacAddrGeneration(t *testing.T) {
ip := net.ParseIP("192.168.0.1")
mac := generateMacAddr(ip).String()
diff --git a/daemon/networkdriver/ipallocator/allocator.go b/daemon/networkdriver/ipallocator/allocator.go
index 40c3eb823e..a728d1bac4 100644
--- a/daemon/networkdriver/ipallocator/allocator.go
+++ b/daemon/networkdriver/ipallocator/allocator.go
@@ -23,11 +23,6 @@ func newAllocatedMap(network *net.IPNet) *allocatedMap {
begin := big.NewInt(0).Add(ipToBigInt(firstIP), big.NewInt(1))
end := big.NewInt(0).Sub(ipToBigInt(lastIP), big.NewInt(1))
- // if IPv4 network, then allocation range starts at begin + 1 because begin is bridge IP
- if len(firstIP) == 4 {
- begin = begin.Add(begin, big.NewInt(1))
- }
-
return &allocatedMap{
p: make(map[string]struct{}),
begin: begin,
diff --git a/daemon/networkdriver/ipallocator/allocator_test.go b/daemon/networkdriver/ipallocator/allocator_test.go
index 8e0e853fac..8e0d8fdca6 100644
--- a/daemon/networkdriver/ipallocator/allocator_test.go
+++ b/daemon/networkdriver/ipallocator/allocator_test.go
@@ -61,7 +61,7 @@ func TestRequestNewIps(t *testing.T) {
var ip net.IP
var err error
- for i := 2; i < 10; i++ {
+ for i := 1; i < 10; i++ {
ip, err = RequestIP(network, nil)
if err != nil {
t.Fatal(err)
@@ -167,7 +167,7 @@ func TestGetReleasedIp(t *testing.T) {
t.Fatal(err)
}
- for i := 0; i < 252; i++ {
+ for i := 0; i < 253; i++ {
_, err = RequestIP(network, nil)
if err != nil {
t.Fatal(err)
@@ -278,23 +278,24 @@ func TestRequestSpecificIpV6(t *testing.T) {
func TestIPAllocator(t *testing.T) {
expectedIPs := []net.IP{
- 0: net.IPv4(127, 0, 0, 2),
- 1: net.IPv4(127, 0, 0, 3),
- 2: net.IPv4(127, 0, 0, 4),
- 3: net.IPv4(127, 0, 0, 5),
- 4: net.IPv4(127, 0, 0, 6),
+ 0: net.IPv4(127, 0, 0, 1),
+ 1: net.IPv4(127, 0, 0, 2),
+ 2: net.IPv4(127, 0, 0, 3),
+ 3: net.IPv4(127, 0, 0, 4),
+ 4: net.IPv4(127, 0, 0, 5),
+ 5: net.IPv4(127, 0, 0, 6),
}
gwIP, n, _ := net.ParseCIDR("127.0.0.1/29")
network := &net.IPNet{IP: gwIP, Mask: n.Mask}
// Pool after initialisation (f = free, u = used)
- // 2(f) - 3(f) - 4(f) - 5(f) - 6(f)
+ // 1(f) - 2(f) - 3(f) - 4(f) - 5(f) - 6(f)
// ↑
- // Check that we get 5 IPs, from 127.0.0.2–127.0.0.6, in that
+ // Check that we get 6 IPs, from 127.0.0.1–127.0.0.6, in that
// order.
- for i := 0; i < 5; i++ {
+ for i := 0; i < 6; i++ {
ip, err := RequestIP(network, nil)
if err != nil {
t.Fatal(err)
@@ -303,27 +304,31 @@ func TestIPAllocator(t *testing.T) {
assertIPEquals(t, expectedIPs[i], ip)
}
// Before loop begin
- // 2(f) - 3(f) - 4(f) - 5(f) - 6(f)
+ // 1(f) - 2(f) - 3(f) - 4(f) - 5(f) - 6(f)
// ↑
// After i = 0
- // 2(u) - 3(f) - 4(f) - 5(f) - 6(f)
+ // 1(u) - 2(f) - 3(f) - 4(f) - 5(f) - 6(f)
// ↑
// After i = 1
- // 2(u) - 3(u) - 4(f) - 5(f) - 6(f)
+ // 1(u) - 2(u) - 3(f) - 4(f) - 5(f) - 6(f)
// ↑
// After i = 2
- // 2(u) - 3(u) - 4(u) - 5(f) - 6(f)
+ // 1(u) - 2(u) - 3(u) - 4(f) - 5(f) - 6(f)
// ↑
// After i = 3
- // 2(u) - 3(u) - 4(u) - 5(u) - 6(f)
+ // 1(u) - 2(u) - 3(u) - 4(u) - 5(f) - 6(f)
// ↑
// After i = 4
- // 2(u) - 3(u) - 4(u) - 5(u) - 6(u)
+ // 1(u) - 2(u) - 3(u) - 4(u) - 5(u) - 6(f)
+ // ↑
+
+ // After i = 5
+ // 1(u) - 2(u) - 3(u) - 4(u) - 5(u) - 6(u)
// ↑
// Check that there are no more IPs
@@ -336,20 +341,20 @@ func TestIPAllocator(t *testing.T) {
if err := ReleaseIP(network, expectedIPs[3]); err != nil {
t.Fatal(err)
}
- // 2(u) - 3(u) - 4(u) - 5(f) - 6(u)
+ // 1(u) - 2(u) - 3(u) - 4(f) - 5(u) - 6(u)
// ↑
if err := ReleaseIP(network, expectedIPs[2]); err != nil {
t.Fatal(err)
}
- // 2(u) - 3(u) - 4(f) - 5(f) - 6(u)
- // ↑
+ // 1(u) - 2(u) - 3(f) - 4(f) - 5(u) - 6(u)
+ // ↑
if err := ReleaseIP(network, expectedIPs[4]); err != nil {
t.Fatal(err)
}
- // 2(u) - 3(u) - 4(f) - 5(f) - 6(f)
- // ↑
+ // 1(u) - 2(u) - 3(f) - 4(f) - 5(f) - 6(u)
+ // ↑
// Make sure that IPs are reused in sequential order, starting
// with the first released IP
@@ -512,10 +517,10 @@ func TestAllocateDifferentSubnets(t *testing.T) {
Mask: []byte{255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0}, // /64 netmask
}
expectedIPs := []net.IP{
- 0: net.IPv4(192, 168, 0, 2),
- 1: net.IPv4(192, 168, 0, 3),
- 2: net.IPv4(127, 0, 0, 2),
- 3: net.IPv4(127, 0, 0, 3),
+ 0: net.IPv4(192, 168, 0, 1),
+ 1: net.IPv4(192, 168, 0, 2),
+ 2: net.IPv4(127, 0, 0, 1),
+ 3: net.IPv4(127, 0, 0, 2),
4: net.ParseIP("2a00:1450::1"),
5: net.ParseIP("2a00:1450::2"),
6: net.ParseIP("2a00:1450::3"),
diff --git a/daemon/networkdriver/portallocator/portallocator.go b/daemon/networkdriver/portallocator/portallocator.go
index 3414d11e7a..e4633b8cb7 100644
--- a/daemon/networkdriver/portallocator/portallocator.go
+++ b/daemon/networkdriver/portallocator/portallocator.go
@@ -1,50 +1,27 @@
package portallocator
import (
+ "bufio"
"errors"
"fmt"
"net"
+ "os"
"sync"
-)
-
-type portMap struct {
- p map[int]struct{}
- last int
-}
-
-func newPortMap() *portMap {
- return &portMap{
- p: map[int]struct{}{},
- last: EndPortRange,
- }
-}
-
-type protoMap map[string]*portMap
-
-func newProtoMap() protoMap {
- return protoMap{
- "tcp": newPortMap(),
- "udp": newPortMap(),
- }
-}
-type ipMapping map[string]protoMap
+ log "github.com/Sirupsen/logrus"
+)
const (
- BeginPortRange = 49153
- EndPortRange = 65535
+ DefaultPortRangeStart = 49153
+ DefaultPortRangeEnd = 65535
)
+type ipMapping map[string]protoMap
+
var (
ErrAllPortsAllocated = errors.New("all ports are allocated")
ErrUnknownProtocol = errors.New("unknown protocol")
-)
-
-var (
- mutex sync.Mutex
-
- defaultIP = net.ParseIP("0.0.0.0")
- globalMap = ipMapping{}
+ defaultIP = net.ParseIP("0.0.0.0")
)
type ErrPortAlreadyAllocated struct {
@@ -75,12 +52,57 @@ func (e ErrPortAlreadyAllocated) Error() string {
return fmt.Sprintf("Bind for %s:%d failed: port is already allocated", e.ip, e.port)
}
+type (
+ PortAllocator struct {
+ mutex sync.Mutex
+ ipMap ipMapping
+ Begin int
+ End int
+ }
+ portMap struct {
+ p map[int]struct{}
+ begin, end int
+ last int
+ }
+ protoMap map[string]*portMap
+)
+
+func New() *PortAllocator {
+ start, end, err := getDynamicPortRange()
+ if err != nil {
+ log.Warn(err)
+ start, end = DefaultPortRangeStart, DefaultPortRangeEnd
+ }
+ return &PortAllocator{
+ ipMap: ipMapping{},
+ Begin: start,
+ End: end,
+ }
+}
+
+func getDynamicPortRange() (start int, end int, err error) {
+ const portRangeKernelParam = "/proc/sys/net/ipv4/ip_local_port_range"
+ portRangeFallback := fmt.Sprintf("using fallback port range %d-%d", DefaultPortRangeStart, DefaultPortRangeEnd)
+ file, err := os.Open(portRangeKernelParam)
+ if err != nil {
+ return 0, 0, fmt.Errorf("port allocator - %s due to error: %v", portRangeFallback, err)
+ }
+ n, err := fmt.Fscanf(bufio.NewReader(file), "%d\t%d", &start, &end)
+ if n != 2 || err != nil {
+ if err == nil {
+ err = fmt.Errorf("unexpected count of parsed numbers (%d)", n)
+ }
+ return 0, 0, fmt.Errorf("port allocator - failed to parse system ephemeral port range from %s - %s: %v", portRangeKernelParam, portRangeFallback, err)
+ }
+ return start, end, nil
+}
+
// RequestPort requests new port from global ports pool for specified ip and proto.
// If port is 0 it returns first free port. Otherwise it cheks port availability
// in pool and return that port or error if port is already busy.
-func RequestPort(ip net.IP, proto string, port int) (int, error) {
- mutex.Lock()
- defer mutex.Unlock()
+func (p *PortAllocator) RequestPort(ip net.IP, proto string, port int) (int, error) {
+ p.mutex.Lock()
+ defer p.mutex.Unlock()
if proto != "tcp" && proto != "udp" {
return 0, ErrUnknownProtocol
@@ -90,10 +112,14 @@ func RequestPort(ip net.IP, proto string, port int) (int, error) {
ip = defaultIP
}
ipstr := ip.String()
- protomap, ok := globalMap[ipstr]
+ protomap, ok := p.ipMap[ipstr]
if !ok {
- protomap = newProtoMap()
- globalMap[ipstr] = protomap
+ protomap = protoMap{
+ "tcp": p.newPortMap(),
+ "udp": p.newPortMap(),
+ }
+
+ p.ipMap[ipstr] = protomap
}
mapping := protomap[proto]
if port > 0 {
@@ -112,14 +138,14 @@ func RequestPort(ip net.IP, proto string, port int) (int, error) {
}
// ReleasePort releases port from global ports pool for specified ip and proto.
-func ReleasePort(ip net.IP, proto string, port int) error {
- mutex.Lock()
- defer mutex.Unlock()
+func (p *PortAllocator) ReleasePort(ip net.IP, proto string, port int) error {
+ p.mutex.Lock()
+ defer p.mutex.Unlock()
if ip == nil {
ip = defaultIP
}
- protomap, ok := globalMap[ip.String()]
+ protomap, ok := p.ipMap[ip.String()]
if !ok {
return nil
}
@@ -127,20 +153,29 @@ func ReleasePort(ip net.IP, proto string, port int) error {
return nil
}
+func (p *PortAllocator) newPortMap() *portMap {
+ return &portMap{
+ p: map[int]struct{}{},
+ begin: p.Begin,
+ end: p.End,
+ last: p.End,
+ }
+}
+
// ReleaseAll releases all ports for all ips.
-func ReleaseAll() error {
- mutex.Lock()
- globalMap = ipMapping{}
- mutex.Unlock()
+func (p *PortAllocator) ReleaseAll() error {
+ p.mutex.Lock()
+ p.ipMap = ipMapping{}
+ p.mutex.Unlock()
return nil
}
func (pm *portMap) findPort() (int, error) {
port := pm.last
- for i := 0; i <= EndPortRange-BeginPortRange; i++ {
+ for i := 0; i <= pm.end-pm.begin; i++ {
port++
- if port > EndPortRange {
- port = BeginPortRange
+ if port > pm.end {
+ port = pm.begin
}
if _, ok := pm.p[port]; !ok {
diff --git a/daemon/networkdriver/portallocator/portallocator_test.go b/daemon/networkdriver/portallocator/portallocator_test.go
index 72581f1040..17201235e0 100644
--- a/daemon/networkdriver/portallocator/portallocator_test.go
+++ b/daemon/networkdriver/portallocator/portallocator_test.go
@@ -5,27 +5,23 @@ import (
"testing"
)
-func reset() {
- ReleaseAll()
-}
-
func TestRequestNewPort(t *testing.T) {
- defer reset()
+ p := New()
- port, err := RequestPort(defaultIP, "tcp", 0)
+ port, err := p.RequestPort(defaultIP, "tcp", 0)
if err != nil {
t.Fatal(err)
}
- if expected := BeginPortRange; port != expected {
+ if expected := p.Begin; port != expected {
t.Fatalf("Expected port %d got %d", expected, port)
}
}
func TestRequestSpecificPort(t *testing.T) {
- defer reset()
+ p := New()
- port, err := RequestPort(defaultIP, "tcp", 5000)
+ port, err := p.RequestPort(defaultIP, "tcp", 5000)
if err != nil {
t.Fatal(err)
}
@@ -35,9 +31,9 @@ func TestRequestSpecificPort(t *testing.T) {
}
func TestReleasePort(t *testing.T) {
- defer reset()
+ p := New()
- port, err := RequestPort(defaultIP, "tcp", 5000)
+ port, err := p.RequestPort(defaultIP, "tcp", 5000)
if err != nil {
t.Fatal(err)
}
@@ -45,15 +41,15 @@ func TestReleasePort(t *testing.T) {
t.Fatalf("Expected port 5000 got %d", port)
}
- if err := ReleasePort(defaultIP, "tcp", 5000); err != nil {
+ if err := p.ReleasePort(defaultIP, "tcp", 5000); err != nil {
t.Fatal(err)
}
}
func TestReuseReleasedPort(t *testing.T) {
- defer reset()
+ p := New()
- port, err := RequestPort(defaultIP, "tcp", 5000)
+ port, err := p.RequestPort(defaultIP, "tcp", 5000)
if err != nil {
t.Fatal(err)
}
@@ -61,20 +57,20 @@ func TestReuseReleasedPort(t *testing.T) {
t.Fatalf("Expected port 5000 got %d", port)
}
- if err := ReleasePort(defaultIP, "tcp", 5000); err != nil {
+ if err := p.ReleasePort(defaultIP, "tcp", 5000); err != nil {
t.Fatal(err)
}
- port, err = RequestPort(defaultIP, "tcp", 5000)
+ port, err = p.RequestPort(defaultIP, "tcp", 5000)
if err != nil {
t.Fatal(err)
}
}
func TestReleaseUnreadledPort(t *testing.T) {
- defer reset()
+ p := New()
- port, err := RequestPort(defaultIP, "tcp", 5000)
+ port, err := p.RequestPort(defaultIP, "tcp", 5000)
if err != nil {
t.Fatal(err)
}
@@ -82,7 +78,7 @@ func TestReleaseUnreadledPort(t *testing.T) {
t.Fatalf("Expected port 5000 got %d", port)
}
- port, err = RequestPort(defaultIP, "tcp", 5000)
+ port, err = p.RequestPort(defaultIP, "tcp", 5000)
switch err.(type) {
case ErrPortAlreadyAllocated:
@@ -92,42 +88,40 @@ func TestReleaseUnreadledPort(t *testing.T) {
}
func TestUnknowProtocol(t *testing.T) {
- defer reset()
-
- if _, err := RequestPort(defaultIP, "tcpp", 0); err != ErrUnknownProtocol {
+ if _, err := New().RequestPort(defaultIP, "tcpp", 0); err != ErrUnknownProtocol {
t.Fatalf("Expected error %s got %s", ErrUnknownProtocol, err)
}
}
func TestAllocateAllPorts(t *testing.T) {
- defer reset()
+ p := New()
- for i := 0; i <= EndPortRange-BeginPortRange; i++ {
- port, err := RequestPort(defaultIP, "tcp", 0)
+ for i := 0; i <= p.End-p.Begin; i++ {
+ port, err := p.RequestPort(defaultIP, "tcp", 0)
if err != nil {
t.Fatal(err)
}
- if expected := BeginPortRange + i; port != expected {
+ if expected := p.Begin + i; port != expected {
t.Fatalf("Expected port %d got %d", expected, port)
}
}
- if _, err := RequestPort(defaultIP, "tcp", 0); err != ErrAllPortsAllocated {
+ if _, err := p.RequestPort(defaultIP, "tcp", 0); err != ErrAllPortsAllocated {
t.Fatalf("Expected error %s got %s", ErrAllPortsAllocated, err)
}
- _, err := RequestPort(defaultIP, "udp", 0)
+ _, err := p.RequestPort(defaultIP, "udp", 0)
if err != nil {
t.Fatal(err)
}
// release a port in the middle and ensure we get another tcp port
- port := BeginPortRange + 5
- if err := ReleasePort(defaultIP, "tcp", port); err != nil {
+ port := p.Begin + 5
+ if err := p.ReleasePort(defaultIP, "tcp", port); err != nil {
t.Fatal(err)
}
- newPort, err := RequestPort(defaultIP, "tcp", 0)
+ newPort, err := p.RequestPort(defaultIP, "tcp", 0)
if err != nil {
t.Fatal(err)
}
@@ -137,10 +131,10 @@ func TestAllocateAllPorts(t *testing.T) {
// now pm.last == newPort, release it so that it's the only free port of
// the range, and ensure we get it back
- if err := ReleasePort(defaultIP, "tcp", newPort); err != nil {
+ if err := p.ReleasePort(defaultIP, "tcp", newPort); err != nil {
t.Fatal(err)
}
- port, err = RequestPort(defaultIP, "tcp", 0)
+ port, err = p.RequestPort(defaultIP, "tcp", 0)
if err != nil {
t.Fatal(err)
}
@@ -150,34 +144,34 @@ func TestAllocateAllPorts(t *testing.T) {
}
func BenchmarkAllocatePorts(b *testing.B) {
- defer reset()
+ p := New()
for i := 0; i < b.N; i++ {
- for i := 0; i <= EndPortRange-BeginPortRange; i++ {
- port, err := RequestPort(defaultIP, "tcp", 0)
+ for i := 0; i <= p.End-p.Begin; i++ {
+ port, err := p.RequestPort(defaultIP, "tcp", 0)
if err != nil {
b.Fatal(err)
}
- if expected := BeginPortRange + i; port != expected {
+ if expected := p.Begin + i; port != expected {
b.Fatalf("Expected port %d got %d", expected, port)
}
}
- reset()
+ p.ReleaseAll()
}
}
func TestPortAllocation(t *testing.T) {
- defer reset()
+ p := New()
ip := net.ParseIP("192.168.0.1")
ip2 := net.ParseIP("192.168.0.2")
- if port, err := RequestPort(ip, "tcp", 80); err != nil {
+ if port, err := p.RequestPort(ip, "tcp", 80); err != nil {
t.Fatal(err)
} else if port != 80 {
t.Fatalf("Acquire(80) should return 80, not %d", port)
}
- port, err := RequestPort(ip, "tcp", 0)
+ port, err := p.RequestPort(ip, "tcp", 0)
if err != nil {
t.Fatal(err)
}
@@ -185,41 +179,41 @@ func TestPortAllocation(t *testing.T) {
t.Fatalf("Acquire(0) should return a non-zero port")
}
- if _, err := RequestPort(ip, "tcp", port); err == nil {
+ if _, err := p.RequestPort(ip, "tcp", port); err == nil {
t.Fatalf("Acquiring a port already in use should return an error")
}
- if newPort, err := RequestPort(ip, "tcp", 0); err != nil {
+ if newPort, err := p.RequestPort(ip, "tcp", 0); err != nil {
t.Fatal(err)
} else if newPort == port {
t.Fatalf("Acquire(0) allocated the same port twice: %d", port)
}
- if _, err := RequestPort(ip, "tcp", 80); err == nil {
+ if _, err := p.RequestPort(ip, "tcp", 80); err == nil {
t.Fatalf("Acquiring a port already in use should return an error")
}
- if _, err := RequestPort(ip2, "tcp", 80); err != nil {
+ if _, err := p.RequestPort(ip2, "tcp", 80); err != nil {
t.Fatalf("It should be possible to allocate the same port on a different interface")
}
- if _, err := RequestPort(ip2, "tcp", 80); err == nil {
+ if _, err := p.RequestPort(ip2, "tcp", 80); err == nil {
t.Fatalf("Acquiring a port already in use should return an error")
}
- if err := ReleasePort(ip, "tcp", 80); err != nil {
+ if err := p.ReleasePort(ip, "tcp", 80); err != nil {
t.Fatal(err)
}
- if _, err := RequestPort(ip, "tcp", 80); err != nil {
+ if _, err := p.RequestPort(ip, "tcp", 80); err != nil {
t.Fatal(err)
}
- port, err = RequestPort(ip, "tcp", 0)
+ port, err = p.RequestPort(ip, "tcp", 0)
if err != nil {
t.Fatal(err)
}
- port2, err := RequestPort(ip, "tcp", port+1)
+ port2, err := p.RequestPort(ip, "tcp", port+1)
if err != nil {
t.Fatal(err)
}
- port3, err := RequestPort(ip, "tcp", 0)
+ port3, err := p.RequestPort(ip, "tcp", 0)
if err != nil {
t.Fatal(err)
}
@@ -229,17 +223,17 @@ func TestPortAllocation(t *testing.T) {
}
func TestNoDuplicateBPR(t *testing.T) {
- defer reset()
+ p := New()
- if port, err := RequestPort(defaultIP, "tcp", BeginPortRange); err != nil {
+ if port, err := p.RequestPort(defaultIP, "tcp", p.Begin); err != nil {
t.Fatal(err)
- } else if port != BeginPortRange {
- t.Fatalf("Expected port %d got %d", BeginPortRange, port)
+ } else if port != p.Begin {
+ t.Fatalf("Expected port %d got %d", p.Begin, port)
}
- if port, err := RequestPort(defaultIP, "tcp", 0); err != nil {
+ if port, err := p.RequestPort(defaultIP, "tcp", 0); err != nil {
t.Fatal(err)
- } else if port == BeginPortRange {
+ } else if port == p.Begin {
t.Fatalf("Acquire(0) allocated the same port twice: %d", port)
}
}
diff --git a/daemon/networkdriver/portmapper/mapper.go b/daemon/networkdriver/portmapper/mapper.go
index 9f2ca5a754..4a98d4a791 100644
--- a/daemon/networkdriver/portmapper/mapper.go
+++ b/daemon/networkdriver/portmapper/mapper.go
@@ -18,15 +18,7 @@ type mapping struct {
container net.Addr
}
-var (
- chain *iptables.Chain
- lock sync.Mutex
-
- // udp:ip:port
- currentMappings = make(map[string]*mapping)
-
- NewProxy = NewProxyCommand
-)
+var NewProxy = NewProxyCommand
var (
ErrUnknownBackendAddressType = errors.New("unknown container address type not supported")
@@ -34,13 +26,34 @@ var (
ErrPortNotMapped = errors.New("port is not mapped")
)
-func SetIptablesChain(c *iptables.Chain) {
- chain = c
+type PortMapper struct {
+ chain *iptables.Chain
+
+ // udp:ip:port
+ currentMappings map[string]*mapping
+ lock sync.Mutex
+
+ Allocator *portallocator.PortAllocator
+}
+
+func New() *PortMapper {
+ return NewWithPortAllocator(portallocator.New())
+}
+
+func NewWithPortAllocator(allocator *portallocator.PortAllocator) *PortMapper {
+ return &PortMapper{
+ currentMappings: make(map[string]*mapping),
+ Allocator: allocator,
+ }
+}
+
+func (pm *PortMapper) SetIptablesChain(c *iptables.Chain) {
+ pm.chain = c
}
-func Map(container net.Addr, hostIP net.IP, hostPort int) (host net.Addr, err error) {
- lock.Lock()
- defer lock.Unlock()
+func (pm *PortMapper) Map(container net.Addr, hostIP net.IP, hostPort int) (host net.Addr, err error) {
+ pm.lock.Lock()
+ defer pm.lock.Unlock()
var (
m *mapping
@@ -52,7 +65,7 @@ func Map(container net.Addr, hostIP net.IP, hostPort int) (host net.Addr, err er
switch container.(type) {
case *net.TCPAddr:
proto = "tcp"
- if allocatedHostPort, err = portallocator.RequestPort(hostIP, proto, hostPort); err != nil {
+ if allocatedHostPort, err = pm.Allocator.RequestPort(hostIP, proto, hostPort); err != nil {
return nil, err
}
@@ -65,7 +78,7 @@ func Map(container net.Addr, hostIP net.IP, hostPort int) (host net.Addr, err er
proxy = NewProxy(proto, hostIP, allocatedHostPort, container.(*net.TCPAddr).IP, container.(*net.TCPAddr).Port)
case *net.UDPAddr:
proto = "udp"
- if allocatedHostPort, err = portallocator.RequestPort(hostIP, proto, hostPort); err != nil {
+ if allocatedHostPort, err = pm.Allocator.RequestPort(hostIP, proto, hostPort); err != nil {
return nil, err
}
@@ -83,25 +96,25 @@ func Map(container net.Addr, hostIP net.IP, hostPort int) (host net.Addr, err er
// release the allocated port on any further error during return.
defer func() {
if err != nil {
- portallocator.ReleasePort(hostIP, proto, allocatedHostPort)
+ pm.Allocator.ReleasePort(hostIP, proto, allocatedHostPort)
}
}()
key := getKey(m.host)
- if _, exists := currentMappings[key]; exists {
+ if _, exists := pm.currentMappings[key]; exists {
return nil, ErrPortMappedForIP
}
containerIP, containerPort := getIPAndPort(m.container)
- if err := forward(iptables.Append, m.proto, hostIP, allocatedHostPort, containerIP.String(), containerPort); err != nil {
+ if err := pm.forward(iptables.Append, m.proto, hostIP, allocatedHostPort, containerIP.String(), containerPort); err != nil {
return nil, err
}
cleanup := func() error {
// need to undo the iptables rules before we return
proxy.Stop()
- forward(iptables.Delete, m.proto, hostIP, allocatedHostPort, containerIP.String(), containerPort)
- if err := portallocator.ReleasePort(hostIP, m.proto, allocatedHostPort); err != nil {
+ pm.forward(iptables.Delete, m.proto, hostIP, allocatedHostPort, containerIP.String(), containerPort)
+ if err := pm.Allocator.ReleasePort(hostIP, m.proto, allocatedHostPort); err != nil {
return err
}
@@ -115,35 +128,35 @@ func Map(container net.Addr, hostIP net.IP, hostPort int) (host net.Addr, err er
return nil, err
}
m.userlandProxy = proxy
- currentMappings[key] = m
+ pm.currentMappings[key] = m
return m.host, nil
}
-func Unmap(host net.Addr) error {
- lock.Lock()
- defer lock.Unlock()
+func (pm *PortMapper) Unmap(host net.Addr) error {
+ pm.lock.Lock()
+ defer pm.lock.Unlock()
key := getKey(host)
- data, exists := currentMappings[key]
+ data, exists := pm.currentMappings[key]
if !exists {
return ErrPortNotMapped
}
data.userlandProxy.Stop()
- delete(currentMappings, key)
+ delete(pm.currentMappings, key)
containerIP, containerPort := getIPAndPort(data.container)
hostIP, hostPort := getIPAndPort(data.host)
- if err := forward(iptables.Delete, data.proto, hostIP, hostPort, containerIP.String(), containerPort); err != nil {
+ if err := pm.forward(iptables.Delete, data.proto, hostIP, hostPort, containerIP.String(), containerPort); err != nil {
log.Errorf("Error on iptables delete: %s", err)
}
switch a := host.(type) {
case *net.TCPAddr:
- return portallocator.ReleasePort(a.IP, "tcp", a.Port)
+ return pm.Allocator.ReleasePort(a.IP, "tcp", a.Port)
case *net.UDPAddr:
- return portallocator.ReleasePort(a.IP, "udp", a.Port)
+ return pm.Allocator.ReleasePort(a.IP, "udp", a.Port)
}
return nil
}
@@ -168,9 +181,9 @@ func getIPAndPort(a net.Addr) (net.IP, int) {
return nil, 0
}
-func forward(action iptables.Action, proto string, sourceIP net.IP, sourcePort int, containerIP string, containerPort int) error {
- if chain == nil {
+func (pm *PortMapper) forward(action iptables.Action, proto string, sourceIP net.IP, sourcePort int, containerIP string, containerPort int) error {
+ if pm.chain == nil {
return nil
}
- return chain.Forward(action, sourceIP, sourcePort, proto, containerIP, containerPort)
+ return pm.chain.Forward(action, sourceIP, sourcePort, proto, containerIP, containerPort)
}
diff --git a/daemon/networkdriver/portmapper/mapper_test.go b/daemon/networkdriver/portmapper/mapper_test.go
index 42e44a11df..729fe56075 100644
--- a/daemon/networkdriver/portmapper/mapper_test.go
+++ b/daemon/networkdriver/portmapper/mapper_test.go
@@ -4,7 +4,6 @@ import (
"net"
"testing"
- "github.com/docker/docker/daemon/networkdriver/portallocator"
"github.com/docker/docker/pkg/iptables"
)
@@ -13,30 +12,26 @@ func init() {
NewProxy = NewMockProxyCommand
}
-func reset() {
- chain = nil
- currentMappings = make(map[string]*mapping)
-}
-
func TestSetIptablesChain(t *testing.T) {
- defer reset()
+ pm := New()
c := &iptables.Chain{
Name: "TEST",
Bridge: "192.168.1.1",
}
- if chain != nil {
+ if pm.chain != nil {
t.Fatal("chain should be nil at init")
}
- SetIptablesChain(c)
- if chain == nil {
+ pm.SetIptablesChain(c)
+ if pm.chain == nil {
t.Fatal("chain should not be nil after set")
}
}
func TestMapPorts(t *testing.T) {
+ pm := New()
dstIp1 := net.ParseIP("192.168.0.1")
dstIp2 := net.ParseIP("192.168.0.2")
dstAddr1 := &net.TCPAddr{IP: dstIp1, Port: 80}
@@ -49,34 +44,34 @@ func TestMapPorts(t *testing.T) {
return (addr1.Network() == addr2.Network()) && (addr1.String() == addr2.String())
}
- if host, err := Map(srcAddr1, dstIp1, 80); err != nil {
+ if host, err := pm.Map(srcAddr1, dstIp1, 80); err != nil {
t.Fatalf("Failed to allocate port: %s", err)
} else if !addrEqual(dstAddr1, host) {
t.Fatalf("Incorrect mapping result: expected %s:%s, got %s:%s",
dstAddr1.String(), dstAddr1.Network(), host.String(), host.Network())
}
- if _, err := Map(srcAddr1, dstIp1, 80); err == nil {
+ if _, err := pm.Map(srcAddr1, dstIp1, 80); err == nil {
t.Fatalf("Port is in use - mapping should have failed")
}
- if _, err := Map(srcAddr2, dstIp1, 80); err == nil {
+ if _, err := pm.Map(srcAddr2, dstIp1, 80); err == nil {
t.Fatalf("Port is in use - mapping should have failed")
}
- if _, err := Map(srcAddr2, dstIp2, 80); err != nil {
+ if _, err := pm.Map(srcAddr2, dstIp2, 80); err != nil {
t.Fatalf("Failed to allocate port: %s", err)
}
- if Unmap(dstAddr1) != nil {
+ if pm.Unmap(dstAddr1) != nil {
t.Fatalf("Failed to release port")
}
- if Unmap(dstAddr2) != nil {
+ if pm.Unmap(dstAddr2) != nil {
t.Fatalf("Failed to release port")
}
- if Unmap(dstAddr2) == nil {
+ if pm.Unmap(dstAddr2) == nil {
t.Fatalf("Port already released, but no error reported")
}
}
@@ -115,6 +110,7 @@ func TestGetUDPIPAndPort(t *testing.T) {
}
func TestMapAllPortsSingleInterface(t *testing.T) {
+ pm := New()
dstIp1 := net.ParseIP("0.0.0.0")
srcAddr1 := &net.TCPAddr{Port: 1080, IP: net.ParseIP("172.16.0.1")}
@@ -124,25 +120,26 @@ func TestMapAllPortsSingleInterface(t *testing.T) {
defer func() {
for _, val := range hosts {
- Unmap(val)
+ pm.Unmap(val)
}
}()
for i := 0; i < 10; i++ {
- for i := portallocator.BeginPortRange; i < portallocator.EndPortRange; i++ {
- if host, err = Map(srcAddr1, dstIp1, 0); err != nil {
+ start, end := pm.Allocator.Begin, pm.Allocator.End
+ for i := start; i < end; i++ {
+ if host, err = pm.Map(srcAddr1, dstIp1, 0); err != nil {
t.Fatal(err)
}
hosts = append(hosts, host)
}
- if _, err := Map(srcAddr1, dstIp1, portallocator.BeginPortRange); err == nil {
- t.Fatalf("Port %d should be bound but is not", portallocator.BeginPortRange)
+ if _, err := pm.Map(srcAddr1, dstIp1, start); err == nil {
+ t.Fatalf("Port %d should be bound but is not", start)
}
for _, val := range hosts {
- if err := Unmap(val); err != nil {
+ if err := pm.Unmap(val); err != nil {
t.Fatal(err)
}
}
diff --git a/daemon/pause.go b/daemon/pause.go
index 0e4323d9a8..af943de103 100644
--- a/daemon/pause.go
+++ b/daemon/pause.go
@@ -9,9 +9,9 @@ func (daemon *Daemon) ContainerPause(job *engine.Job) engine.Status {
return job.Errorf("Usage: %s CONTAINER", job.Name)
}
name := job.Args[0]
- container := daemon.Get(name)
- if container == nil {
- return job.Errorf("No such container: %s", name)
+ container, err := daemon.Get(name)
+ if err != nil {
+ return job.Error(err)
}
if err := container.Pause(); err != nil {
return job.Errorf("Cannot pause container %s: %s", name, err)
@@ -25,9 +25,9 @@ func (daemon *Daemon) ContainerUnpause(job *engine.Job) engine.Status {
return job.Errorf("Usage: %s CONTAINER", job.Name)
}
name := job.Args[0]
- container := daemon.Get(name)
- if container == nil {
- return job.Errorf("No such container: %s", name)
+ container, err := daemon.Get(name)
+ if err != nil {
+ return job.Error(err)
}
if err := container.Unpause(); err != nil {
return job.Errorf("Cannot unpause container %s: %s", name, err)
diff --git a/daemon/rename.go b/daemon/rename.go
index 1dedc7d3a7..6d8293f127 100644
--- a/daemon/rename.go
+++ b/daemon/rename.go
@@ -1,8 +1,6 @@
package daemon
-import (
- "github.com/docker/docker/engine"
-)
+import "github.com/docker/docker/engine"
func (daemon *Daemon) ContainerRename(job *engine.Job) engine.Status {
if len(job.Args) != 2 {
@@ -11,24 +9,36 @@ func (daemon *Daemon) ContainerRename(job *engine.Job) engine.Status {
oldName := job.Args[0]
newName := job.Args[1]
- container := daemon.Get(oldName)
- if container == nil {
- return job.Errorf("No such container: %s", oldName)
+ container, err := daemon.Get(oldName)
+ if err != nil {
+ return job.Error(err)
}
oldName = container.Name
container.Lock()
defer container.Unlock()
- if _, err := daemon.reserveName(container.ID, newName); err != nil {
+ if newName, err = daemon.reserveName(container.ID, newName); err != nil {
return job.Errorf("Error when allocating new name: %s", err)
}
container.Name = newName
+ undo := func() {
+ container.Name = oldName
+ daemon.reserveName(container.ID, oldName)
+ daemon.containerGraph.Delete(newName)
+ }
+
if err := daemon.containerGraph.Delete(oldName); err != nil {
+ undo()
return job.Errorf("Failed to delete container %q: %v", oldName, err)
}
+ if err := container.toDisk(); err != nil {
+ undo()
+ return job.Error(err)
+ }
+
return engine.StatusOK
}
diff --git a/daemon/resize.go b/daemon/resize.go
index 68c070370a..860f79eba4 100644
--- a/daemon/resize.go
+++ b/daemon/resize.go
@@ -19,14 +19,14 @@ func (daemon *Daemon) ContainerResize(job *engine.Job) engine.Status {
if err != nil {
return job.Error(err)
}
-
- if container := daemon.Get(name); container != nil {
- if err := container.Resize(height, width); err != nil {
- return job.Error(err)
- }
- return engine.StatusOK
+ container, err := daemon.Get(name)
+ if err != nil {
+ return job.Error(err)
}
- return job.Errorf("No such container: %s", name)
+ if err := container.Resize(height, width); err != nil {
+ return job.Error(err)
+ }
+ return engine.StatusOK
}
func (daemon *Daemon) ContainerExecResize(job *engine.Job) engine.Status {
diff --git a/daemon/restart.go b/daemon/restart.go
index bcc057156d..bcde628d38 100644
--- a/daemon/restart.go
+++ b/daemon/restart.go
@@ -15,13 +15,13 @@ func (daemon *Daemon) ContainerRestart(job *engine.Job) engine.Status {
if job.EnvExists("t") {
t = job.GetenvInt("t")
}
- if container := daemon.Get(name); container != nil {
- if err := container.Restart(int(t)); err != nil {
- return job.Errorf("Cannot restart container %s: %s\n", name, err)
- }
- container.LogEvent("restart")
- } else {
- return job.Errorf("No such container: %s\n", name)
+ container, err := daemon.Get(name)
+ if err != nil {
+ return job.Error(err)
}
+ if err := container.Restart(int(t)); err != nil {
+ return job.Errorf("Cannot restart container %s: %s\n", name, err)
+ }
+ container.LogEvent("restart")
return engine.StatusOK
}
diff --git a/daemon/start.go b/daemon/start.go
index d6655189d7..e51ada22a2 100644
--- a/daemon/start.go
+++ b/daemon/start.go
@@ -14,12 +14,12 @@ func (daemon *Daemon) ContainerStart(job *engine.Job) engine.Status {
return job.Errorf("Usage: %s container_id", job.Name)
}
var (
- name = job.Args[0]
- container = daemon.Get(name)
+ name = job.Args[0]
)
- if container == nil {
- return job.Errorf("No such container: %s", name)
+ container, err := daemon.Get(name)
+ if err != nil {
+ return job.Error(err)
}
if container.IsPaused() {
@@ -66,7 +66,7 @@ func (daemon *Daemon) setHostConfig(container *Container, hostConfig *runconfig.
if err != nil && os.IsNotExist(err) {
err = os.MkdirAll(source, 0755)
if err != nil {
- return fmt.Errorf("Could not create local directory '%s' for bind mount: %s!", source, err.Error())
+ return fmt.Errorf("Could not create local directory '%s' for bind mount: %v!", source, err)
}
}
}
@@ -74,6 +74,7 @@ func (daemon *Daemon) setHostConfig(container *Container, hostConfig *runconfig.
if err := daemon.RegisterLinks(container, hostConfig); err != nil {
return err
}
+
container.hostConfig = hostConfig
container.toDisk()
diff --git a/daemon/state.go b/daemon/state.go
index 3aba57090f..6387e6fc53 100644
--- a/daemon/state.go
+++ b/daemon/state.go
@@ -11,16 +11,18 @@ import (
type State struct {
sync.Mutex
- Running bool
- Paused bool
- Restarting bool
- OOMKilled bool
- Pid int
- ExitCode int
- Error string // contains last known error when starting the container
- StartedAt time.Time
- FinishedAt time.Time
- waitChan chan struct{}
+ Running bool
+ Paused bool
+ Restarting bool
+ OOMKilled bool
+ removalInProgress bool // Not need for this to be persistent on disk.
+ Dead bool
+ Pid int
+ ExitCode int
+ Error string // contains last known error when starting the container
+ StartedAt time.Time
+ FinishedAt time.Time
+ waitChan chan struct{}
}
func NewState() *State {
@@ -42,6 +44,14 @@ func (s *State) String() string {
return fmt.Sprintf("Up %s", units.HumanDuration(time.Now().UTC().Sub(s.StartedAt)))
}
+ if s.removalInProgress {
+ return "Removal In Progress"
+ }
+
+ if s.Dead {
+ return "Dead"
+ }
+
if s.FinishedAt.IsZero() {
return ""
}
@@ -60,6 +70,11 @@ func (s *State) StateString() string {
}
return "running"
}
+
+ if s.Dead {
+ return "dead"
+ }
+
return "exited"
}
@@ -217,3 +232,25 @@ func (s *State) IsPaused() bool {
s.Unlock()
return res
}
+
+func (s *State) SetRemovalInProgress() error {
+ s.Lock()
+ defer s.Unlock()
+ if s.removalInProgress {
+ return fmt.Errorf("Status is already RemovalInProgress")
+ }
+ s.removalInProgress = true
+ return nil
+}
+
+func (s *State) ResetRemovalInProgress() {
+ s.Lock()
+ s.removalInProgress = false
+ s.Unlock()
+}
+
+func (s *State) SetDead() {
+ s.Lock()
+ s.Dead = true
+ s.Unlock()
+}
diff --git a/daemon/stats.go b/daemon/stats.go
index e047497ec6..85d4a08550 100644
--- a/daemon/stats.go
+++ b/daemon/stats.go
@@ -3,7 +3,7 @@ package daemon
import (
"encoding/json"
- "github.com/docker/docker/api/stats"
+ "github.com/docker/docker/api/types"
"github.com/docker/docker/daemon/execdriver"
"github.com/docker/docker/engine"
"github.com/docker/libcontainer"
@@ -18,7 +18,7 @@ func (daemon *Daemon) ContainerStats(job *engine.Job) engine.Status {
enc := json.NewEncoder(job.Stdout)
for v := range updates {
update := v.(*execdriver.ResourceStats)
- ss := convertToAPITypes(update.ContainerStats)
+ ss := convertToAPITypes(update.Stats)
ss.MemoryStats.Limit = uint64(update.MemoryLimit)
ss.Read = update.Read
ss.CpuStats.SystemUsage = update.SystemUsage
@@ -31,25 +31,26 @@ func (daemon *Daemon) ContainerStats(job *engine.Job) engine.Status {
return engine.StatusOK
}
-// convertToAPITypes converts the libcontainer.ContainerStats to the api specific
+// convertToAPITypes converts the libcontainer.Stats to the api specific
// structs. This is done to preserve API compatibility and versioning.
-func convertToAPITypes(ls *libcontainer.ContainerStats) *stats.Stats {
- s := &stats.Stats{}
- if ls.NetworkStats != nil {
- s.Network = stats.Network{
- RxBytes: ls.NetworkStats.RxBytes,
- RxPackets: ls.NetworkStats.RxPackets,
- RxErrors: ls.NetworkStats.RxErrors,
- RxDropped: ls.NetworkStats.RxDropped,
- TxBytes: ls.NetworkStats.TxBytes,
- TxPackets: ls.NetworkStats.TxPackets,
- TxErrors: ls.NetworkStats.TxErrors,
- TxDropped: ls.NetworkStats.TxDropped,
+func convertToAPITypes(ls *libcontainer.Stats) *types.Stats {
+ s := &types.Stats{}
+ if ls.Interfaces != nil {
+ s.Network = types.Network{}
+ for _, iface := range ls.Interfaces {
+ s.Network.RxBytes += iface.RxBytes
+ s.Network.RxPackets += iface.RxPackets
+ s.Network.RxErrors += iface.RxErrors
+ s.Network.RxDropped += iface.RxDropped
+ s.Network.TxBytes += iface.TxBytes
+ s.Network.TxPackets += iface.TxPackets
+ s.Network.TxErrors += iface.TxErrors
+ s.Network.TxDropped += iface.TxDropped
}
}
cs := ls.CgroupStats
if cs != nil {
- s.BlkioStats = stats.BlkioStats{
+ s.BlkioStats = types.BlkioStats{
IoServiceBytesRecursive: copyBlkioEntry(cs.BlkioStats.IoServiceBytesRecursive),
IoServicedRecursive: copyBlkioEntry(cs.BlkioStats.IoServicedRecursive),
IoQueuedRecursive: copyBlkioEntry(cs.BlkioStats.IoQueuedRecursive),
@@ -60,21 +61,21 @@ func convertToAPITypes(ls *libcontainer.ContainerStats) *stats.Stats {
SectorsRecursive: copyBlkioEntry(cs.BlkioStats.SectorsRecursive),
}
cpu := cs.CpuStats
- s.CpuStats = stats.CpuStats{
- CpuUsage: stats.CpuUsage{
+ s.CpuStats = types.CpuStats{
+ CpuUsage: types.CpuUsage{
TotalUsage: cpu.CpuUsage.TotalUsage,
PercpuUsage: cpu.CpuUsage.PercpuUsage,
UsageInKernelmode: cpu.CpuUsage.UsageInKernelmode,
UsageInUsermode: cpu.CpuUsage.UsageInUsermode,
},
- ThrottlingData: stats.ThrottlingData{
+ ThrottlingData: types.ThrottlingData{
Periods: cpu.ThrottlingData.Periods,
ThrottledPeriods: cpu.ThrottlingData.ThrottledPeriods,
ThrottledTime: cpu.ThrottlingData.ThrottledTime,
},
}
mem := cs.MemoryStats
- s.MemoryStats = stats.MemoryStats{
+ s.MemoryStats = types.MemoryStats{
Usage: mem.Usage,
MaxUsage: mem.MaxUsage,
Stats: mem.Stats,
@@ -84,10 +85,10 @@ func convertToAPITypes(ls *libcontainer.ContainerStats) *stats.Stats {
return s
}
-func copyBlkioEntry(entries []cgroups.BlkioStatEntry) []stats.BlkioStatEntry {
- out := make([]stats.BlkioStatEntry, len(entries))
+func copyBlkioEntry(entries []cgroups.BlkioStatEntry) []types.BlkioStatEntry {
+ out := make([]types.BlkioStatEntry, len(entries))
for i, re := range entries {
- out[i] = stats.BlkioStatEntry{
+ out[i] = types.BlkioStatEntry{
Major: re.Major,
Minor: re.Minor,
Op: re.Op,
diff --git a/daemon/stop.go b/daemon/stop.go
index 1a098a1ad3..e2f1d284a8 100644
--- a/daemon/stop.go
+++ b/daemon/stop.go
@@ -15,16 +15,16 @@ func (daemon *Daemon) ContainerStop(job *engine.Job) engine.Status {
if job.EnvExists("t") {
t = job.GetenvInt("t")
}
- if container := daemon.Get(name); container != nil {
- if !container.IsRunning() {
- return job.Errorf("Container already stopped")
- }
- if err := container.Stop(int(t)); err != nil {
- return job.Errorf("Cannot stop container %s: %s\n", name, err)
- }
- container.LogEvent("stop")
- } else {
- return job.Errorf("No such container: %s\n", name)
+ container, err := daemon.Get(name)
+ if err != nil {
+ return job.Error(err)
}
+ if !container.IsRunning() {
+ return job.Errorf("Container already stopped")
+ }
+ if err := container.Stop(int(t)); err != nil {
+ return job.Errorf("Cannot stop container %s: %s\n", name, err)
+ }
+ container.LogEvent("stop")
return engine.StatusOK
}
diff --git a/daemon/top.go b/daemon/top.go
index 4d916ee5dc..782cc83dcf 100644
--- a/daemon/top.go
+++ b/daemon/top.go
@@ -21,59 +21,59 @@ func (daemon *Daemon) ContainerTop(job *engine.Job) engine.Status {
psArgs = job.Args[1]
}
- if container := daemon.Get(name); container != nil {
- if !container.IsRunning() {
- return job.Errorf("Container %s is not running", name)
- }
- pids, err := daemon.ExecutionDriver().GetPidsForContainer(container.ID)
- if err != nil {
- return job.Error(err)
- }
- output, err := exec.Command("ps", strings.Split(psArgs, " ")...).Output()
- if err != nil {
- return job.Errorf("Error running ps: %s", err)
- }
+ container, err := daemon.Get(name)
+ if err != nil {
+ return job.Error(err)
+ }
+ if !container.IsRunning() {
+ return job.Errorf("Container %s is not running", name)
+ }
+ pids, err := daemon.ExecutionDriver().GetPidsForContainer(container.ID)
+ if err != nil {
+ return job.Error(err)
+ }
+ output, err := exec.Command("ps", strings.Split(psArgs, " ")...).Output()
+ if err != nil {
+ return job.Errorf("Error running ps: %s", err)
+ }
- lines := strings.Split(string(output), "\n")
- header := strings.Fields(lines[0])
- out := &engine.Env{}
- out.SetList("Titles", header)
+ lines := strings.Split(string(output), "\n")
+ header := strings.Fields(lines[0])
+ out := &engine.Env{}
+ out.SetList("Titles", header)
- pidIndex := -1
- for i, name := range header {
- if name == "PID" {
- pidIndex = i
- }
- }
- if pidIndex == -1 {
- return job.Errorf("Couldn't find PID field in ps output")
+ pidIndex := -1
+ for i, name := range header {
+ if name == "PID" {
+ pidIndex = i
}
+ }
+ if pidIndex == -1 {
+ return job.Errorf("Couldn't find PID field in ps output")
+ }
- processes := [][]string{}
- for _, line := range lines[1:] {
- if len(line) == 0 {
- continue
- }
- fields := strings.Fields(line)
- p, err := strconv.Atoi(fields[pidIndex])
- if err != nil {
- return job.Errorf("Unexpected pid '%s': %s", fields[pidIndex], err)
- }
+ processes := [][]string{}
+ for _, line := range lines[1:] {
+ if len(line) == 0 {
+ continue
+ }
+ fields := strings.Fields(line)
+ p, err := strconv.Atoi(fields[pidIndex])
+ if err != nil {
+ return job.Errorf("Unexpected pid '%s': %s", fields[pidIndex], err)
+ }
- for _, pid := range pids {
- if pid == p {
- // Make sure number of fields equals number of header titles
- // merging "overhanging" fields
- process := fields[:len(header)-1]
- process = append(process, strings.Join(fields[len(header)-1:], " "))
- processes = append(processes, process)
- }
+ for _, pid := range pids {
+ if pid == p {
+ // Make sure number of fields equals number of header titles
+ // merging "overhanging" fields
+ process := fields[:len(header)-1]
+ process = append(process, strings.Join(fields[len(header)-1:], " "))
+ processes = append(processes, process)
}
}
- out.SetJson("Processes", processes)
- out.WriteTo(job.Stdout)
- return engine.StatusOK
-
}
- return job.Errorf("No such container: %s", name)
+ out.SetJson("Processes", processes)
+ out.WriteTo(job.Stdout)
+ return engine.StatusOK
}
diff --git a/daemon/volumes.go b/daemon/volumes.go
index 7b49733839..a076b461ca 100644
--- a/daemon/volumes.go
+++ b/daemon/volumes.go
@@ -8,14 +8,13 @@ import (
"path/filepath"
"sort"
"strings"
- "syscall"
log "github.com/Sirupsen/logrus"
"github.com/docker/docker/daemon/execdriver"
"github.com/docker/docker/pkg/chrootarchive"
"github.com/docker/docker/pkg/symlink"
+ "github.com/docker/docker/pkg/system"
"github.com/docker/docker/volumes"
- "github.com/docker/libcontainer/label"
)
type Mount struct {
@@ -25,6 +24,7 @@ type Mount struct {
Writable bool
copyData bool
from *Container
+ isBind bool
}
func (mnt *Mount) Export(resource string) (io.ReadCloser, error) {
@@ -80,7 +80,7 @@ func (m *Mount) initialize() error {
if hostPath, exists := m.container.Volumes[m.MountToPath]; exists {
// If this is a bind-mount/volumes-from, maybe it was passed in at start instead of create
// We need to make sure bind-mounts/volumes-from passed on start can override existing ones.
- if !m.volume.IsBindMount && m.from == nil {
+ if (!m.volume.IsBindMount && !m.isBind) && m.from == nil {
return nil
}
if m.volume.Path == hostPath {
@@ -89,9 +89,10 @@ func (m *Mount) initialize() error {
// Make sure we remove these old volumes we don't actually want now.
// Ignore any errors here since this is just cleanup, maybe someone volumes-from'd this volume
- v := m.container.daemon.volumes.Get(hostPath)
- v.RemoveContainer(m.container.ID)
- m.container.daemon.volumes.Delete(v.Path)
+ if v := m.container.daemon.volumes.Get(hostPath); v != nil {
+ v.RemoveContainer(m.container.ID)
+ m.container.daemon.volumes.Delete(v.Path)
+ }
}
// This is the full path to container fs + mntToPath
@@ -158,6 +159,10 @@ func (container *Container) parseVolumeMountConfig() (map[string]*Mount, error)
if err != nil {
return nil, err
}
+ // Check if a bind mount has already been specified for the same container path
+ if m, exists := mounts[mountToPath]; exists {
+ return nil, fmt.Errorf("Duplicate volume %q: %q already in use, mounted from %q", path, mountToPath, m.volume.Path)
+ }
// Check if a volume already exists for this and use it
vol, err := container.daemon.volumes.FindOrCreateVolume(path, writable)
if err != nil {
@@ -168,6 +173,7 @@ func (container *Container) parseVolumeMountConfig() (map[string]*Mount, error)
volume: vol,
MountToPath: mountToPath,
Writable: writable,
+ isBind: true, // in case the volume itself is a normal volume, but is being mounted in as a bindmount here
}
}
@@ -183,6 +189,15 @@ func (container *Container) parseVolumeMountConfig() (map[string]*Mount, error)
if _, exists := container.Volumes[path]; exists {
continue
}
+ realPath, err := container.getResourcePath(path)
+ if err != nil {
+ return nil, fmt.Errorf("failed to evaluate the absolute path of symlink")
+ }
+ if stat, err := os.Stat(realPath); err == nil {
+ if !stat.IsDir() {
+ return nil, fmt.Errorf("file exists at %s, can't create volume there", realPath)
+ }
+ }
vol, err := container.daemon.volumes.FindOrCreateVolume("", true)
if err != nil {
@@ -266,9 +281,9 @@ func (container *Container) applyVolumesFrom() error {
continue
}
- c := container.daemon.Get(id)
- if c == nil {
- return fmt.Errorf("container %s not found, impossible to mount its volumes", id)
+ c, err := container.daemon.Get(id)
+ if err != nil {
+ return fmt.Errorf("Could not apply volumes of non-existent container %q.", id)
}
var (
@@ -306,23 +321,7 @@ func validMountMode(mode string) bool {
}
func (container *Container) setupMounts() error {
- mounts := []execdriver.Mount{
- {Source: container.ResolvConfPath, Destination: "/etc/resolv.conf", Writable: true, Private: true},
- }
-
- if container.HostnamePath != "" {
- mounts = append(mounts, execdriver.Mount{Source: container.HostnamePath, Destination: "/etc/hostname", Writable: true, Private: true})
- }
-
- if container.HostsPath != "" {
- mounts = append(mounts, execdriver.Mount{Source: container.HostsPath, Destination: "/etc/hosts", Writable: true, Private: true})
- }
-
- for _, m := range mounts {
- if err := label.SetFileLabel(m.Source, container.MountLabel); err != nil {
- return err
- }
- }
+ mounts := []execdriver.Mount{}
// Mount user specified volumes
// Note, these are not private because you may want propagation of (un)mounts from host
@@ -337,6 +336,18 @@ func (container *Container) setupMounts() error {
})
}
+ if container.ResolvConfPath != "" {
+ mounts = append(mounts, execdriver.Mount{Source: container.ResolvConfPath, Destination: "/etc/resolv.conf", Writable: true, Private: true})
+ }
+
+ if container.HostnamePath != "" {
+ mounts = append(mounts, execdriver.Mount{Source: container.HostnamePath, Destination: "/etc/hostname", Writable: true, Private: true})
+ }
+
+ if container.HostsPath != "" {
+ mounts = append(mounts, execdriver.Mount{Source: container.HostsPath, Destination: "/etc/hosts", Writable: true, Private: true})
+ }
+
container.command.Mounts = mounts
return nil
}
@@ -379,15 +390,14 @@ func copyExistingContents(source, destination string) error {
// copyOwnership copies the permissions and uid:gid of the source file
// into the destination file
func copyOwnership(source, destination string) error {
- var stat syscall.Stat_t
-
- if err := syscall.Stat(source, &stat); err != nil {
+ stat, err := system.Stat(source)
+ if err != nil {
return err
}
- if err := os.Chown(destination, int(stat.Uid), int(stat.Gid)); err != nil {
+ if err := os.Chown(destination, int(stat.Uid()), int(stat.Gid())); err != nil {
return err
}
- return os.Chmod(destination, os.FileMode(stat.Mode))
+ return os.Chmod(destination, os.FileMode(stat.Mode()))
}
diff --git a/daemon/wait.go b/daemon/wait.go
index a1f657c353..7579467a00 100644
--- a/daemon/wait.go
+++ b/daemon/wait.go
@@ -11,10 +11,11 @@ func (daemon *Daemon) ContainerWait(job *engine.Job) engine.Status {
return job.Errorf("Usage: %s", job.Name)
}
name := job.Args[0]
- if container := daemon.Get(name); container != nil {
- status, _ := container.WaitStop(-1 * time.Second)
- job.Printf("%d\n", status)
- return engine.StatusOK
+ container, err := daemon.Get(name)
+ if err != nil {
+ return job.Errorf("%s: %v", job.Name, err)
}
- return job.Errorf("%s: No such container: %s", job.Name, name)
+ status, _ := container.WaitStop(-1 * time.Second)
+ job.Printf("%d\n", status)
+ return engine.StatusOK
}
diff --git a/docker/daemon.go b/docker/daemon.go
index 0923997375..b2a985b221 100644
--- a/docker/daemon.go
+++ b/docker/daemon.go
@@ -7,15 +7,17 @@ import (
"io"
"os"
"path/filepath"
+ "strings"
log "github.com/Sirupsen/logrus"
+ "github.com/docker/docker/autogen/dockerversion"
"github.com/docker/docker/builder"
"github.com/docker/docker/builtins"
"github.com/docker/docker/daemon"
_ "github.com/docker/docker/daemon/execdriver/lxc"
_ "github.com/docker/docker/daemon/execdriver/native"
- "github.com/docker/docker/dockerversion"
"github.com/docker/docker/engine"
+ "github.com/docker/docker/pkg/homedir"
flag "github.com/docker/docker/pkg/mflag"
"github.com/docker/docker/pkg/signal"
"github.com/docker/docker/registry"
@@ -36,7 +38,7 @@ func init() {
func migrateKey() (err error) {
// Migrate trust key if exists at ~/.docker/key.json and owned by current user
- oldPath := filepath.Join(getHomeDir(), ".docker", defaultTrustKeyFile)
+ oldPath := filepath.Join(homedir.Get(), ".docker", defaultTrustKeyFile)
newPath := filepath.Join(getDaemonConfDir(), defaultTrustKeyFile)
if _, statErr := os.Stat(newPath); os.IsNotExist(statErr) && utils.IsFileOwner(oldPath) {
defer func() {
@@ -100,11 +102,14 @@ func mainDaemon() {
// load the daemon in the background so we can immediately start
// the http api so that connections don't fail while the daemon
// is booting
+ daemonInitWait := make(chan error)
go func() {
d, err := daemon.NewDaemon(daemonCfg, eng)
if err != nil {
- log.Fatal(err)
+ daemonInitWait <- err
+ return
}
+
log.Infof("docker daemon: %s %s; execdriver: %s; graphdriver: %s",
dockerversion.VERSION,
dockerversion.GITCOMMIT,
@@ -113,7 +118,8 @@ func mainDaemon() {
)
if err := d.Install(eng); err != nil {
- log.Fatal(err)
+ daemonInitWait <- err
+ return
}
b := &builder.BuilderJob{eng, d}
@@ -122,16 +128,19 @@ func mainDaemon() {
// after the daemon is done setting up we can tell the api to start
// accepting connections
if err := eng.Job("acceptconnections").Run(); err != nil {
- log.Fatal(err)
+ daemonInitWait <- err
+ return
}
+ daemonInitWait <- nil
}()
// Serve api
job := eng.Job("serveapi", flHosts...)
job.SetenvBool("Logging", true)
- job.SetenvBool("EnableCors", *flEnableCors)
+ job.SetenvBool("EnableCors", daemonCfg.EnableCors)
+ job.Setenv("CorsHeaders", daemonCfg.CorsHeaders)
job.Setenv("Version", dockerversion.VERSION)
- job.Setenv("SocketGroup", *flSocketGroup)
+ job.Setenv("SocketGroup", daemonCfg.SocketGroup)
job.SetenvBool("Tls", *flTls)
job.SetenvBool("TlsVerify", *flTlsVerify)
@@ -139,7 +148,47 @@ func mainDaemon() {
job.Setenv("TlsCert", *flCert)
job.Setenv("TlsKey", *flKey)
job.SetenvBool("BufferRequests", true)
- if err := job.Run(); err != nil {
- log.Fatal(err)
+
+ // The serve API job never exits unless an error occurs
+ // We need to start it as a goroutine and wait on it so
+ // daemon doesn't exit
+ serveAPIWait := make(chan error)
+ go func() {
+ if err := job.Run(); err != nil {
+ log.Errorf("ServeAPI error: %v", err)
+ serveAPIWait <- err
+ return
+ }
+ serveAPIWait <- nil
+ }()
+
+ // Wait for the daemon startup goroutine to finish
+ // This makes sure we can actually cleanly shutdown the daemon
+ log.Debug("waiting for daemon to initialize")
+ errDaemon := <-daemonInitWait
+ if errDaemon != nil {
+ eng.Shutdown()
+ outStr := fmt.Sprintf("Shutting down daemon due to errors: %v", errDaemon)
+ if strings.Contains(errDaemon.Error(), "engine is shutdown") {
+ // if the error is "engine is shutdown", we've already reported (or
+ // will report below in API server errors) the error
+ outStr = "Shutting down daemon due to reported errors"
+ }
+ // we must "fatal" exit here as the API server may be happy to
+ // continue listening forever if the error had no impact to API
+ log.Fatal(outStr)
+ } else {
+ log.Info("Daemon has completed initialization")
}
+
+ // Daemon is fully initialized and handling API traffic
+ // Wait for serve API job to complete
+ errAPI := <-serveAPIWait
+ // If we have an error here it is unique to API (as daemonErr would have
+ // exited the daemon process above)
+ eng.Shutdown()
+ if errAPI != nil {
+ log.Fatalf("Shutting down due to ServeAPI error: %v", errAPI)
+ }
+
}
diff --git a/docker/docker.go b/docker/docker.go
index 80d5e13f10..347424432b 100644
--- a/docker/docker.go
+++ b/docker/docker.go
@@ -11,9 +11,10 @@ import (
log "github.com/Sirupsen/logrus"
"github.com/docker/docker/api"
"github.com/docker/docker/api/client"
- "github.com/docker/docker/dockerversion"
+ "github.com/docker/docker/autogen/dockerversion"
flag "github.com/docker/docker/pkg/mflag"
"github.com/docker/docker/pkg/reexec"
+ "github.com/docker/docker/pkg/term"
"github.com/docker/docker/utils"
)
@@ -29,6 +30,11 @@ func main() {
return
}
+ // Set terminal emulation based on platform as required.
+ stdin, stdout, stderr := term.StdStreams()
+
+ initLogging(stderr)
+
flag.Parse()
// FIXME: validate daemon flags here
@@ -42,16 +48,16 @@ func main() {
if err != nil {
log.Fatalf("Unable to parse logging level: %s", *flLogLevel)
}
- initLogging(lvl)
+ setLogLevel(lvl)
} else {
- initLogging(log.InfoLevel)
+ setLogLevel(log.InfoLevel)
}
// -D, --debug, -l/--log-level=debug processing
// When/if -D is removed this block can be deleted
if *flDebug {
os.Setenv("DEBUG", "1")
- initLogging(log.DebugLevel)
+ setLogLevel(log.DebugLevel)
}
if len(flHosts) == 0 {
@@ -70,6 +76,10 @@ func main() {
setDefaultConfFlag(flTrustKey, defaultTrustKeyFile)
if *flDaemon {
+ if *flHelp {
+ flag.Usage()
+ return
+ }
mainDaemon()
return
}
@@ -111,7 +121,7 @@ func main() {
*flTls = true
cert, err := tls.LoadX509KeyPair(*flCert, *flKey)
if err != nil {
- log.Fatalf("Couldn't load X509 key pair: %s. Key encrypted?", err)
+ log.Fatalf("Couldn't load X509 key pair: %q. Make sure the key is encrypted", err)
}
tlsConfig.Certificates = []tls.Certificate{cert}
}
@@ -120,9 +130,9 @@ func main() {
}
if *flTls || *flTlsVerify {
- cli = client.NewDockerCli(os.Stdin, os.Stdout, os.Stderr, *flTrustKey, protoAddrParts[0], protoAddrParts[1], &tlsConfig)
+ cli = client.NewDockerCli(stdin, stdout, stderr, *flTrustKey, protoAddrParts[0], protoAddrParts[1], &tlsConfig)
} else {
- cli = client.NewDockerCli(os.Stdin, os.Stdout, os.Stderr, *flTrustKey, protoAddrParts[0], protoAddrParts[1], nil)
+ cli = client.NewDockerCli(stdin, stdout, stderr, *flTrustKey, protoAddrParts[0], protoAddrParts[1], nil)
}
if err := cli.Cmd(flag.Args()...); err != nil {
diff --git a/docker/flags.go b/docker/flags.go
index d91a9a1de7..7f0c10d2d3 100644
--- a/docker/flags.go
+++ b/docker/flags.go
@@ -7,6 +7,7 @@ import (
"runtime"
"github.com/docker/docker/opts"
+ "github.com/docker/docker/pkg/homedir"
flag "github.com/docker/docker/pkg/mflag"
)
@@ -17,35 +18,26 @@ var (
func init() {
if dockerCertPath == "" {
- dockerCertPath = filepath.Join(getHomeDir(), ".docker")
+ dockerCertPath = filepath.Join(homedir.Get(), ".docker")
}
}
-func getHomeDir() string {
- if runtime.GOOS == "windows" {
- return os.Getenv("USERPROFILE")
- }
- return os.Getenv("HOME")
-}
-
func getDaemonConfDir() string {
// TODO: update for Windows daemon
if runtime.GOOS == "windows" {
- return filepath.Join(os.Getenv("USERPROFILE"), ".docker")
+ return filepath.Join(homedir.Get(), ".docker")
}
return "/etc/docker"
}
var (
- flVersion = flag.Bool([]string{"v", "-version"}, false, "Print version information and quit")
- flDaemon = flag.Bool([]string{"d", "-daemon"}, false, "Enable daemon mode")
- flDebug = flag.Bool([]string{"D", "-debug"}, false, "Enable debug mode")
- flSocketGroup = flag.String([]string{"G", "-group"}, "docker", "Group to assign the unix socket specified by -H when running in daemon mode\nuse '' (the empty string) to disable setting of a group")
- flLogLevel = flag.String([]string{"l", "-log-level"}, "info", "Set the logging level (debug, info, warn, error, fatal)")
- flEnableCors = flag.Bool([]string{"#api-enable-cors", "-api-enable-cors"}, false, "Enable CORS headers in the remote API")
- flTls = flag.Bool([]string{"-tls"}, false, "Use TLS; implied by --tlsverify flag")
- flHelp = flag.Bool([]string{"h", "-help"}, false, "Print usage")
- flTlsVerify = flag.Bool([]string{"-tlsverify"}, dockerTlsVerify, "Use TLS and verify the remote (daemon: verify client, client: verify daemon)")
+ flVersion = flag.Bool([]string{"v", "-version"}, false, "Print version information and quit")
+ flDaemon = flag.Bool([]string{"d", "-daemon"}, false, "Enable daemon mode")
+ flDebug = flag.Bool([]string{"D", "-debug"}, false, "Enable debug mode")
+ flLogLevel = flag.String([]string{"l", "-log-level"}, "info", "Set the logging level")
+ flTls = flag.Bool([]string{"-tls"}, false, "Use TLS; implied by --tlsverify")
+ flHelp = flag.Bool([]string{"h", "-help"}, false, "Print usage")
+ flTlsVerify = flag.Bool([]string{"-tlsverify"}, dockerTlsVerify, "Use TLS and verify the remote")
// these are initialized in init() below since their default values depend on dockerCertPath which isn't fully initialized until init() runs
flTrustKey *string
@@ -60,7 +52,7 @@ func setDefaultConfFlag(flag *string, def string) {
if *flDaemon {
*flag = filepath.Join(getDaemonConfDir(), def)
} else {
- *flag = filepath.Join(getHomeDir(), ".docker", def)
+ *flag = filepath.Join(homedir.Get(), ".docker", def)
}
}
}
@@ -70,10 +62,10 @@ func init() {
// TODO use flag flag.String([]string{"i", "-identity"}, "", "Path to libtrust key file")
flTrustKey = &placeholderTrustKey
- flCa = flag.String([]string{"-tlscacert"}, filepath.Join(dockerCertPath, defaultCaFile), "Trust only remotes providing a certificate signed by the CA given here")
+ flCa = flag.String([]string{"-tlscacert"}, filepath.Join(dockerCertPath, defaultCaFile), "Trust certs signed only by this CA")
flCert = flag.String([]string{"-tlscert"}, filepath.Join(dockerCertPath, defaultCertFile), "Path to TLS certificate file")
flKey = flag.String([]string{"-tlskey"}, filepath.Join(dockerCertPath, defaultKeyFile), "Path to TLS key file")
- opts.HostListVar(&flHosts, []string{"H", "-host"}, "The socket(s) to bind to in daemon mode or connect to in client mode, specified using one or more tcp://host:port, unix:///path/to/socket, fd://* or fd://socketfd.")
+ opts.HostListVar(&flHosts, []string{"H", "-host"}, "Daemon socket(s) to connect to")
flag.Usage = func() {
fmt.Fprint(os.Stdout, "Usage: docker [OPTIONS] COMMAND [arg...]\n\nA self-sufficient runtime for linux containers.\n\nOptions:\n")
@@ -116,7 +108,7 @@ func init() {
{"save", "Save an image to a tar archive"},
{"search", "Search for an image on the Docker Hub"},
{"start", "Start a stopped container"},
- {"stats", "Display a live stream of one or more containers' resource usage statistics"},
+ {"stats", "Display a stream of a containers' resource usage statistics"},
{"stop", "Stop a running container"},
{"tag", "Tag an image into a repository"},
{"top", "Lookup the running processes of a container"},
diff --git a/docker/log.go b/docker/log.go
index cdbbd4408f..0dd9a70eeb 100644
--- a/docker/log.go
+++ b/docker/log.go
@@ -1,12 +1,14 @@
package main
import (
- "os"
-
log "github.com/Sirupsen/logrus"
+ "io"
)
-func initLogging(lvl log.Level) {
- log.SetOutput(os.Stderr)
+func setLogLevel(lvl log.Level) {
log.SetLevel(lvl)
}
+
+func initLogging(stderr io.Writer) {
+ log.SetOutput(stderr)
+}
diff --git a/dockerversion/dockerversion.go b/dockerversion/dockerversion.go
deleted file mode 100644
index 1898d5c61f..0000000000
--- a/dockerversion/dockerversion.go
+++ /dev/null
@@ -1,15 +0,0 @@
-package dockerversion
-
-// FIXME: this should be embedded in the docker/docker.go,
-// but we can't because distro policy requires us to
-// package a separate dockerinit binary, and that binary needs
-// to know its version too.
-
-var (
- GITCOMMIT string
- VERSION string
-
- IAMSTATIC string // whether or not Docker itself was compiled statically via ./hack/make.sh binary ("true" or not "true")
- INITSHA1 string // sha1sum of separate static dockerinit, if Docker itself was compiled dynamically via ./hack/make.sh dynbinary
- INITPATH string // custom location to search for a valid dockerinit binary (available for packagers as a last resort escape hatch)
-)
diff --git a/docs/Dockerfile b/docs/Dockerfile
index ad23d33896..d5ffae4609 100644
--- a/docs/Dockerfile
+++ b/docs/Dockerfile
@@ -1,86 +1,108 @@
#
# See the top level Makefile in https://github.com/docker/docker for usage.
#
-FROM debian:jessie
+FROM docs/base:latest
MAINTAINER Sven Dowideit <SvenDowideit@docker.com> (@SvenDowideit)
-RUN apt-get update \
- && apt-get install -y \
- gettext \
- git \
- libssl-dev \
- make \
- python-dev \
- python-pip \
- python-setuptools \
- vim-tiny
-
-RUN pip install mkdocs
-
-# add MarkdownTools to get transclusion
-# (future development)
-#RUN easy_install -U setuptools
-#RUN pip install MarkdownTools2
-
-# this version works, the current versions fail in different ways
-RUN pip install awscli==1.4.4 pyopenssl==0.12
-
-# get my sitemap.xml branch of mkdocs and use that for now
-# commit hash of the newest commit of SvenDowideit/mkdocs on
-# docker-markdown-merge branch, it is used to break docker cache
-# see: https://github.com/SvenDowideit/mkdocs/tree/docker-markdown-merge
-RUN git clone -b docker-markdown-merge https://github.com/SvenDowideit/mkdocs \
- && cd mkdocs/ \
- && git checkout ad32549c452963b8854951d6783f4736c0f7c5d5 \
- && ./setup.py install
-
-COPY . /docs
-COPY MAINTAINERS /docs/sources/humans.txt
-WORKDIR /docs
-
-RUN VERSION=$(cat VERSION) \
- && MAJOR_MINOR="${VERSION%.*}" \
- && for i in $(seq $MAJOR_MINOR -0.1 1.0); do \
- echo "<li><a class='version' href='/v$i'>Version v$i</a></li>"; \
- done > sources/versions.html_fragment \
- && GIT_BRANCH=$(cat GIT_BRANCH) \
- && GITCOMMIT=$(cat GITCOMMIT) \
- && AWS_S3_BUCKET=$(cat AWS_S3_BUCKET) \
- && BUILD_DATE=$(date) \
- && sed -i "s/\$VERSION/$VERSION/g" theme/mkdocs/base.html \
- && sed -i "s/\$MAJOR_MINOR/v$MAJOR_MINOR/g" theme/mkdocs/base.html \
- && sed -i "s/\$GITCOMMIT/$GITCOMMIT/g" theme/mkdocs/base.html \
- && sed -i "s/\$GIT_BRANCH/$GIT_BRANCH/g" theme/mkdocs/base.html \
- && sed -i "s/\$BUILD_DATE/$BUILD_DATE/g" theme/mkdocs/base.html \
- && sed -i "s/\$AWS_S3_BUCKET/$AWS_S3_BUCKET/g" theme/mkdocs/base.html
-
-EXPOSE 8000
-
-RUN cd sources && rgrep --files-with-matches '{{ include ".*" }}' | xargs sed -i~ 's/{{ include "\(.*\)" }}/cat include\/\1/ge'
-
-CMD ["mkdocs", "serve"]
-
-# Initial Dockerfile driven documenation aggregation
-# Sven plans to move each Dockerfile into the respective repository
+# This section ensures we pull the correct version of each
+# sub project
+ENV COMPOSE_BRANCH 1.2.0
+ENV SWARM_BRANCH v0.2.0
+ENV MACHINE_BRANCH master
+ENV DISTRIB_BRANCH master
+
+
+
+# TODO: need the full repo source to get the git version info
+COPY . /src
+
+# Reset the /docs dir so we can replace the theme meta with the new repo's git info
+# RUN git reset --hard
+
+# Then copy the desired docs into the /docs/sources/ dir
+COPY ./sources/ /docs/sources
+
+COPY ./VERSION VERSION
+
+# adding the image spec will require Docker 1.5 and `docker build -f docs/Dockerfile .`
+#COPY ./image/spec/v1.md /docs/sources/reference/image-spec-v1.md
+
+# TODO: don't do this - look at merging the yml file in build.sh
+COPY ./mkdocs.yml mkdocs.yml
+COPY ./s3_website.json s3_website.json
+COPY ./release.sh release.sh
+
+
+# Docker Distribution
+#
+#ADD https://raw.githubusercontent.com/docker/distribution/${DISTRIB_BRANCH}/docs/mkdocs.yml /docs/mkdocs-distribution.yml
+
+ADD https://raw.githubusercontent.com/docker/distribution/${DISTRIB_BRANCH}/docs/images/notifications.png /docs/sources/registry/images/notifications.png
+ADD https://raw.githubusercontent.com/docker/distribution/${DISTRIB_BRANCH}/docs/images/registry.png /docs/sources/registry/images/registry.png
+
+ADD https://raw.githubusercontent.com/docker/distribution/${DISTRIB_BRANCH}/docs/overview.md /docs/sources/registry/overview.md
+RUN sed -i.old '1s;^;no_version_dropdown: true;' /docs/sources/registry/overview.md
+
+ADD https://raw.githubusercontent.com/docker/distribution/${DISTRIB_BRANCH}/docs/deploying.md /docs/sources/registry/deploying.md
+RUN sed -i.old '1s;^;no_version_dropdown: true;' /docs/sources/registry/deploying.md
+
+ADD https://raw.githubusercontent.com/docker/distribution/${DISTRIB_BRANCH}/docs/configuration.md /docs/sources/registry/configuration.md
+RUN sed -i.old '1s;^;no_version_dropdown: true;' /docs/sources/registry/configuration.md
+
+ADD https://raw.githubusercontent.com/docker/distribution/${DISTRIB_BRANCH}/docs/storagedrivers.md /docs/sources/registry/storagedrivers.md
+RUN sed -i.old '1s;^;no_version_dropdown: true;' /docs/sources/registry/storagedrivers.md
+
+ADD https://raw.githubusercontent.com/docker/distribution/${DISTRIB_BRANCH}/docs/notifications.md /docs/sources/registry/notifications.md
+RUN sed -i.old '1s;^;no_version_dropdown: true;' /docs/sources/registry/notifications.md
+
+ADD https://raw.githubusercontent.com/docker/distribution/${DISTRIB_BRANCH}/docs/spec/api.md /docs/sources/registry/spec/api.md
+RUN sed -i.old '1s;^;no_version_dropdown: true;' /docs/sources/registry/spec/api.md
+
+ADD https://raw.githubusercontent.com/docker/distribution/${DISTRIB_BRANCH}/docs/spec/json.md /docs/sources/registry/spec/json.md
+RUN sed -i.old '1s;^;no_version_dropdown: true;' /docs/sources/registry/spec/json.md
+
+ADD https://raw.githubusercontent.com/docker/distribution/${DISTRIB_BRANCH}/docs/spec/auth/token.md /docs/sources/registry/spec/auth/token.md
+RUN sed -i.old '1s;^;no_version_dropdown: true;' /docs/sources/registry/spec/auth/token.md
# Docker Swarm
-#ADD https://raw.githubusercontent.com/docker/swarm/master/userguide.md /docs/sources/swarm/README.md
-#ADD https://raw.githubusercontent.com/docker/swarm/master/discovery/README.md /docs/sources/swarm/discovery.md
-#ADD https://raw.githubusercontent.com/docker/swarm/master/api/README.md /docs/sources/swarm/API.md
-#ADD https://raw.githubusercontent.com/docker/swarm/master/scheduler/filter/README.md /docs/sources/swarm/scheduler/filter.md
-#ADD https://raw.githubusercontent.com/docker/swarm/master/scheduler/strategy/README.md /docs/sources/swarm/scheduler/strategy.md
+#ADD https://raw.githubusercontent.com/docker/swarm/${SWARM_BRANCH}/docs/mkdocs.yml /docs/mkdocs-swarm.yml
+ADD https://raw.githubusercontent.com/docker/swarm/${SWARM_BRANCH}/docs/index.md /docs/sources/swarm/index.md
+RUN sed -i.old '1s;^;no_version_dropdown: true;' /docs/sources/swarm/index.md
+ADD https://raw.githubusercontent.com/docker/swarm/${SWARM_BRANCH}/discovery/README.md /docs/sources/swarm/discovery.md
+RUN sed -i.old '1s;^;no_version_dropdown: true;' /docs/sources/swarm/discovery.md
+ADD https://raw.githubusercontent.com/docker/swarm/${SWARM_BRANCH}/api/README.md /docs/sources/swarm/API.md
+RUN sed -i.old '1s;^;no_version_dropdown: true;' /docs/sources/swarm/API.md
+ADD https://raw.githubusercontent.com/docker/swarm/${SWARM_BRANCH}/scheduler/filter/README.md /docs/sources/swarm/scheduler/filter.md
+RUN sed -i.old '1s;^;no_version_dropdown: true;' /docs/sources/swarm/scheduler/filter.md
+ADD https://raw.githubusercontent.com/docker/swarm/${SWARM_BRANCH}/scheduler/strategy/README.md /docs/sources/swarm/scheduler/strategy.md
+RUN sed -i.old '1s;^;no_version_dropdown: true;' /docs/sources/swarm/scheduler/strategy.md
# Docker Machine
-# ADD https://raw.githubusercontent.com/docker/machine/master/docs/dockermachine.md /docs/sources/machine/userguide.md
+#ADD https://raw.githubusercontent.com/docker/machine/${MACHINE_BRANCH}/docs/mkdocs.yml /docs/mkdocs-machine.yml
+ADD https://raw.githubusercontent.com/docker/machine/${MACHINE_BRANCH}/docs/index.md /docs/sources/machine/index.md
+RUN sed -i.old '1s;^;no_version_dropdown: true;' /docs/sources/machine/index.md
# Docker Compose
-# ADD https://raw.githubusercontent.com/docker/fig/master/docs/index.md /docs/sources/compose/userguide.md
-# ADD https://raw.githubusercontent.com/docker/fig/master/docs/install.md /docs/sources/compose/install.md
-# ADD https://raw.githubusercontent.com/docker/fig/master/docs/cli.md /docs/sources/compose/cli.md
-# ADD https://raw.githubusercontent.com/docker/fig/master/docs/yml.md /docs/sources/compose/yml.md
-
-# add the project docs from the `mkdocs-<project>.yml` files
-# RUN cd /docs && ./build.sh
-
-# remove `^---*` lines from md's
-# RUN cd /docs/sources && find . -name "*.md" | xargs sed -i~ -n '/^---*/!p'
+#ADD https://raw.githubusercontent.com/docker/compose/${COMPOSE_BRANCH}/docs/mkdocs.yml /docs/mkdocs-compose.yml
+ADD https://raw.githubusercontent.com/docker/compose/${COMPOSE_BRANCH}/docs/index.md /docs/sources/compose/index.md
+RUN sed -i.old '1s;^;no_version_dropdown: true;' /docs/sources/compose/index.md
+ADD https://raw.githubusercontent.com/docker/compose/${COMPOSE_BRANCH}/docs/install.md /docs/sources/compose/install.md
+RUN sed -i.old '1s;^;no_version_dropdown: true;' /docs/sources/compose/install.md
+ADD https://raw.githubusercontent.com/docker/compose/${COMPOSE_BRANCH}/docs/cli.md /docs/sources/compose/cli.md
+RUN sed -i.old '1s;^;no_version_dropdown: true;' /docs/sources/compose/cli.md
+ADD https://raw.githubusercontent.com/docker/compose/${COMPOSE_BRANCH}/docs/yml.md /docs/sources/compose/yml.md
+RUN sed -i.old '1s;^;no_version_dropdown: true;' /docs/sources/compose/yml.md
+ADD https://raw.githubusercontent.com/docker/compose/${COMPOSE_BRANCH}/docs/env.md /docs/sources/compose/env.md
+RUN sed -i.old '1s;^;no_version_dropdown: true;' /docs/sources/compose/env.md
+ADD https://raw.githubusercontent.com/docker/compose/${COMPOSE_BRANCH}/docs/completion.md /docs/sources/compose/completion.md
+RUN sed -i.old '1s;^;no_version_dropdown: true;' /docs/sources/compose/completion.md
+
+ADD https://raw.githubusercontent.com/docker/compose/${COMPOSE_BRANCH}/docs/django.md /docs/sources/compose/django.md
+RUN sed -i.old '1s;^;no_version_dropdown: true;' /docs/sources/compose/django.md
+ADD https://raw.githubusercontent.com/docker/compose/${COMPOSE_BRANCH}/docs/rails.md /docs/sources/compose/rails.md
+RUN sed -i.old '1s;^;no_version_dropdown: true;' /docs/sources/compose/rails.md
+ADD https://raw.githubusercontent.com/docker/compose/${COMPOSE_BRANCH}/docs/wordpress.md /docs/sources/compose/wordpress.md
+RUN sed -i.old '1s;^;no_version_dropdown: true;' /docs/sources/compose/wordpress.md
+
+# Then build everything together, ready for mkdocs
+RUN /docs/build.sh \ No newline at end of file
diff --git a/docs/MAINTAINERS b/docs/MAINTAINERS
deleted file mode 100644
index ecf56752c2..0000000000
--- a/docs/MAINTAINERS
+++ /dev/null
@@ -1,3 +0,0 @@
-Fred Lifton <fred.lifton@docker.com> (@fredlf)
-James Turnbull <james@lovedthanlost.net> (@jamtur01)
-Sven Dowideit <SvenDowideit@fosiki.com> (@SvenDowideit)
diff --git a/docs/README.md b/docs/README.md
index 3b471555cd..5feb496a73 100755
--- a/docs/README.md
+++ b/docs/README.md
@@ -1,159 +1,282 @@
# Docker Documentation
-The source for Docker documentation is here under `sources/` and uses extended
-Markdown, as implemented by [MkDocs](http://mkdocs.org).
+The source for Docker documentation is in this directory under `sources/`. Our
+documentation uses extended Markdown, as implemented by
+[MkDocs](http://mkdocs.org). The current release of the Docker documentation
+resides on [http://docs.docker.com](http://docs.docker.com).
-The HTML files are built and hosted on `https://docs.docker.com`, and update
-automatically after each change to the master or release branch of [Docker on
-GitHub](https://github.com/docker/docker) thanks to post-commit hooks. The
-`docs` branch maps to the "latest" documentation and the `master` (unreleased
-development) branch maps to the "master" documentation.
+## Understanding the documentation branches and processes
-## Contributing
+Docker has two primary branches for documentation:
-Be sure to follow the [contribution guidelines](../CONTRIBUTING.md).
-In particular, [remember to sign your work!](../CONTRIBUTING.md#sign-your-work)
+| Branch | Description | URL (published via commit-hook) |
+|----------|--------------------------------|------------------------------------------------------------------------------|
+| `docs` | Official release documentation | [http://docs.docker.com](http://docs.docker.com) |
+| `master` | Merged but unreleased development work | [http://docs.master.dockerproject.com](http://docs.master.dockerproject.com) |
-## Getting Started
+Additions and updates to upcoming releases are made in a feature branch off of
+the `master` branch. The Docker maintainers also support a `docs` branch that
+contains the last release of documentation.
-Docker documentation builds are done in a Docker container, which installs all
-the required tools, adds the local `docs/` directory and builds the HTML docs.
-It then starts a HTTP server on port 8000 so that you can connect and see your
-changes.
+After a release, documentation updates are continually merged into `master` as
+they occur. This work includes new documentation for forthcoming features, bug
+fixes, and other updates. Docker's CI system automatically builds and updates
+the `master` documentation after each merge and posts it to
+[http://docs.master.dockerproject.com](http://docs.master.dockerproject.com).
-In the root of the `docker` source directory:
+Periodically, the Docker maintainers update `docs.docker.com` between official
+releases of Docker. They do this by cherry-picking commits from `master`,
+merging them into `docs`, and then publishing the result.
- $ make docs
- .... (lots of output) ....
- docker run --rm -it -e AWS_S3_BUCKET -p 8000:8000 "docker-docs:master" mkdocs serve
- Running at: http://0.0.0.0:8000/
- Live reload enabled.
- Hold ctrl+c to quit.
+In the rare case where a change is not forward-compatible, changes may be made
+on other branches by special arrangement with the Docker maintainers.
-If you have any issues you need to debug, you can use `make docs-shell` and then
-run `mkdocs serve`
+### Quickstart for documentation contributors
+
+If you are a new or beginner contributor, we encourage you to read through the
+[our detailed contributors
+guide](https://docs.docker.com/project/who-written-for/). The guide explains in
+detail, with examples, how to contribute. If you are an experienced contributor
+this quickstart should be enough to get you started.
+
+The following is the essential workflow for contributing to the documentation:
+
+1. Fork the `docker/docker` repository.
+
+2. Clone the repository to your local machine.
+
+3. Select an issue from `docker/docker` to work on or submit a proposal of your
+own.
+
+4. Create a feature branch from `master` in which to work.
+
+ By basing from `master` your work is automatically included in the next
+ release. It also allows docs maintainers to easily cherry-pick your changes
+ into the `docs` release branch.
+
+4. Modify existing or add new `.md` files to the `docs/sources` directory.
+
+ If you add a new document (`.md`) file, you must also add it to the
+ appropriate section of the `docs/mkdocs.yml` file in this repository.
+
+
+5. As you work, build the documentation site locally to see your changes.
+
+ The `docker/docker` repository contains a `Dockerfile` and a `Makefile`.
+ Together, these create a development environment in which you can build and
+ run a container running the Docker documentation website. To build the
+ documentation site, enter `make docs` at the root of your `docker/docker`
+ fork:
+
+ $ make docs
+ .... (lots of output) ....
+ docker run --rm -it -e AWS_S3_BUCKET -p 8000:8000 "docker-docs:master" mkdocs serve
+ Running at: http://0.0.0.0:8000/
+ Live reload enabled.
+ Hold ctrl+c to quit.
+
+
+ The build creates an image containing all the required tools, adds the local
+ `docs/` directory and generates the HTML files. Then, it runs a Docker
+ container with this image.
-## Testing the links
+ The container exposes port 8000 on the localhost so that you can connect and
+ see your changes. If you are running Boot2Docker, use the `boot2docker ip`
+ to get the address of your server.
-You can use `make docs-test` to generate a report of missing links that are referenced in
-the documentation - there should be none.
+6. Check your writing for style and mechanical errors.
-## Adding a new document
+ Use our [documentation style
+ guide](https://docs.docker.com/project/doc-style/) to check style. There are
+ several [good grammar and spelling online
+ checkers](http://www.hemingwayapp.com/) that can check your writing
+ mechanics.
-New document (`.md`) files are added to the documentation builds by adding them
-to the menu definition in the `docs/mkdocs.yml` file.
+7. Squash your commits on your branch.
+
+8. Make a pull request from your fork back to Docker's `master` branch.
+
+9. Work with the reviewers until your change is approved and merged.
+
+### Debugging and testing
+
+If you have any issues you need to debug, you can use `make docs-shell` and then
+run `mkdocs serve`. You can use `make docs-test` to generate a report of missing
+links that are referenced in the documentation&mdash;there should be none.
## Style guide
-If you have questions about how to write for Docker's documentation (e.g.,
-questions about grammar, syntax, formatting, styling, language, or tone) please
-see the [style guide](sources/contributing/docs_style-guide.md). If something
-isn't clear in the guide, please submit a PR to help us improve it.
+If you have questions about how to write for Docker's documentation, please see
+the [style guide](sources/project/doc-style.md). The style guide provides
+guidance about grammar, syntax, formatting, styling, language, or tone. If
+something isn't clear in the guide, please submit an issue to let us know or
+submit a pull request to help us improve it.
+
-## Working using GitHub's file editor
+## Publishing documentation (for Docker maintainers)
-Alternatively, for small changes and typos you might want to use GitHub's built-
-in file editor. It allows you to preview your changes right on-line (though
-there can be some differences between GitHub Markdown and [MkDocs
-Markdown](http://www.mkdocs.org/user-guide/writing-your-docs/)). Just be
-careful not to create many commits. And you must still [sign your
-work!](../CONTRIBUTING.md#sign-your-work)
+To publish Docker's documentation you need to have Docker up and running on your
+machine. You'll also need a `docs/awsconfig` file containing the settings you
+need to access the AWS bucket you'll be deploying to.
-## Branches
+The process for publishing is to build first to an AWS bucket, verify the build,
+and then publish the final release.
-**There are two branches related to editing docs**: `master` and `docs`. You
-should always edit the documentation on a local branch of the `master`
-branch, and send a PR against `master`.
+1. Have Docker installed and running on your machine.
-That way your fixes will automatically get included in later releases, and docs
-maintainers can easily cherry-pick your changes into the `docs` release branch.
-In the rare case where your change is not forward-compatible, you may need to
-base your changes on the `docs` branch.
+2. Ask the core maintainers for the `awsconfig` file.
-Also, now that we have a `docs` branch, we can keep the
-[http://docs.docker.com](http://docs.docker.com) docs up to date with any bugs
-found between Docker code releases.
+3. Copy the `awsconfig` file to the `docs/` directory.
-> **Warning**: When *reading* the docs, the
-> [http://docs-stage.docker.com](http://docs-stage.docker.com) documentation may
-> include features not yet part of any official Docker release. The `beta-docs`
-> site should be used only for understanding bleeding-edge development and
-> `docs.docker.com` (which points to the `docs` branch`) should be used for the
-> latest official release.
+ The `awsconfig` file contains the profiles of the S3 buckets for our
+ documentation sites. (If needed, the release script creates an S3 bucket and
+ pushes the files to it.) Each profile has this format:
-## Publishing Documentation
+ [profile dowideit-docs]
+ aws_access_key_id = IHOIUAHSIDH234rwf....
+ aws_secret_access_key = OIUYSADJHLKUHQWIUHE......
+ region = ap-southeast-2
-To publish a copy of the documentation you need to have Docker up and running on
-your machine. You'll also need a `docs/awsconfig` file containing the settings
-you need to access the AWS bucket you'll be deploying to.
+ The `profile` name must be the same as the name of the bucket you are
+ deploying to.
-The release script will create an s3 if needed, and will then push the files to it.
+4. Call the `make` from the `docker` directory.
- [profile dowideit-docs]
- aws_access_key_id = IHOIUAHSIDH234rwf....
- aws_secret_access_key = OIUYSADJHLKUHQWIUHE......
- region = ap-southeast-2
+ $ make AWS_S3_BUCKET=dowideit-docs docs-release
-The `profile` name must be the same as the name of the bucket you are deploying
-to - which you call from the `docker` directory:
+ This publishes _only_ to the `http://bucket-url/v1.2/` version of the
+ documentation.
- make AWS_S3_BUCKET=dowideit-docs docs-release
+5. If you're publishing the current release's documentation, you need to also
+update the root docs pages by running
-This will publish _only_ to the `http://bucket-url/v1.2/` version of the
-documentation.
+ $ make AWS_S3_BUCKET=dowideit-docs BUILD_ROOT=yes docs-release
-If you're publishing the current release's documentation, you need to
-also update the root docs pages by running
+### Errors publishing using Boot2Docker
- make AWS_S3_BUCKET=dowideit-docs BUILD_ROOT=yes docs-release
+Sometimes, in a Boot2Docker environment, the publishing procedure returns this
+error:
-> **Note:**
-> if you are using Boot2Docker on OSX and the above command returns an error,
-> `Post http:///var/run/docker.sock/build?rm=1&t=docker-docs%3Apost-1.2.0-docs_update-2:
-> dial unix /var/run/docker.sock: no such file or directory', you need to set the Docker
-> host. Run `$(boot2docker shellinit)` to see the correct variable to set. The command
-> will return the full `export` command, so you can just cut and paste.
+ Post http:///var/run/docker.sock/build?rm=1&t=docker-docs%3Apost-1.2.0-docs_update-2:
+ dial unix /var/run/docker.sock: no such file or directory.
+
+If this happens, set the Docker host. Run the following command to set the
+variables in your shell:
+
+ $ eval "$(boot2docker shellinit)"
## Cherry-picking documentation changes to update an existing release.
-Whenever the core team makes a release, they publish the documentation based
-on the `release` branch (which is copied into the `docs` branch). The
-documentation team can make updates in the meantime, by cherry-picking changes
-from `master` into any of the docs branches.
+Whenever the core team makes a release, they publish the documentation based on
+the `release` branch. At that time, the `release` branch is copied into the
+`docs` branch. The documentation team makes updates between Docker releases by
+cherry-picking changes from `master` into any of the documentation branches.
+Typically, we cherry-pick into the `docs` branch.
+
+For example, to update the current release's docs, do the following:
+
+1. Go to your `docker/docker` fork and get the latest from master.
+
+ $ git fetch upstream
+
+2. Checkout a new branch based on `upstream/docs`.
+
+ You should give your new branch a descriptive name.
-For example, to update the current release's docs:
+ $ git checkout -b post-1.2.0-docs-update-1 upstream/docs
+
+3. In a browser window, open [https://github.com/docker/docker/commits/master].
- git fetch upstream
- git checkout -b post-1.2.0-docs-update-1 upstream/docs
- # Then go through the Merge commit linked to PR's (making sure they apply
- to that release)
- # see https://github.com/docker/docker/commits/master
- git cherry-pick -x fe845c4
- # Repeat until you have cherry picked everything you will propose to be merged
- git push upstream post-1.2.0-docs-update-1
+4. Locate the merges you want to publish.
-Then make a pull request to merge into the `docs` branch, __NOT__ into master.
+ You should only cherry-pick individual commits; do not cherry-pick merge
+ commits. To minimize merge conflicts, start with the oldest commit and work
+ your way forward in time.
-Once the PR has the needed `LGTM`s, merge it, then publish to our beta server
-to test:
+5. Copy the commit SHA from GitHub.
- git fetch upstream
- git checkout docs
- git reset --hard upstream/docs
- make AWS_S3_BUCKET=beta-docs.docker.io BUILD_ROOT=yes docs-release
+6. Cherry-pick the commit.
+
+ $ git cherry-pick -x fe845c4
+
+7. Repeat until you have cherry-picked everything you want to merge.
-Then go to http://beta-docs.docker.io.s3-website-us-west-2.amazonaws.com/
-to view your results and make sure what you published is what you wanted.
+8. Push your changes to your fork.
-When you're happy with it, publish the docs to our live site:
+ $ git push origin post-1.2.0-docs-update-1
- make AWS_S3_BUCKET=docs.docker.com BUILD_ROOT=yes DISTRIBUTION_ID=C2K6......FL2F docs-release
+9. Make a pull request to merge into the `docs` branch.
-Test the uncached version of the live docs at http://docs.docker.com.s3-website-us-east-1.amazonaws.com/
+ Do __NOT__ merge into `master`.
+
+10. Have maintainers review your pull request.
+
+11. Once the PR has the needed "LGTMs", merge it on GitHub.
+
+12. Return to your local fork and make sure you are still on the `docs` branch.
+
+ $ git checkout docs
+
+13. Fetch your merged pull request from `docs`.
+
+ $ git fetch upstream/docs
+
+14. Ensure your branch is clean and set to the latest.
+
+ $ git reset --hard upstream/docs
+
+15. Copy the `awsconfig` file into the `docs` directory.
-Note that the new docs will not appear live on the site until the cache (a complex,
-distributed CDN system) is flushed. The `make docs-release` command will do this
-_if_ the `DISTRIBUTION_ID` is set to the Cloudfront distribution ID (ask the meta
-team) - this will take at least 15 minutes to run and you can check its progress
-with the CDN Cloudfront Chrome addin.
+16. Make the beta documentation
+
+ $ make AWS_S3_BUCKET=beta-docs.docker.io BUILD_ROOT=yes docs-release
+
+17. Open [the beta
+website](http://beta-docs.docker.io.s3-website-us-west-2.amazonaws.com/) site
+and make sure what you published is correct.
+
+19. When you're happy with your content, publish the docs to our live site:
+
+ $ make AWS_S3_BUCKET=docs.docker.com BUILD_ROOT=yes
+DISTRIBUTION_ID=C2K6......FL2F docs-release
+
+20. Test the uncached version of the live docs at [http://docs.docker.com.s3-website-us-east-1.amazonaws.com/]
+
+
+### Caching and the docs
+
+New docs do not appear live on the site until the cache (a complex, distributed
+CDN system) is flushed. The `make docs-release` command flushes the cache _if_
+the `DISTRIBUTION_ID` is set to the Cloudfront distribution ID. The cache flush
+can take at least 15 minutes to run and you can check its progress with the CDN
+Cloudfront Purge Tool Chrome app.
+
+## Removing files from the docs.docker.com site
+
+Sometimes it becomes necessary to remove files from the historical published documentation.
+The most reliable way to do this is to do it directly using `aws s3` commands running in a
+docs container:
+
+Start the docs container like `make docs-shell`, but bind mount in your `awsconfig`:
+
+```
+docker run --rm -it -v $(CURDIR)/docs/awsconfig:/docs/awsconfig docker-docs:master bash
+```
+
+and then the following example shows deleting 2 documents from s3, and then requesting the
+CloudFlare cache to invalidate them:
+
+
+```
+export BUCKET BUCKET=docs.docker.com
+export AWS_CONFIG_FILE=$(pwd)/awsconfig
+aws s3 --profile $BUCKET ls s3://$BUCKET
+aws s3 --profile $BUCKET rm s3://$BUCKET/v1.0/reference/api/docker_io_oauth_api/index.html
+aws s3 --profile $BUCKET rm s3://$BUCKET/v1.1/reference/api/docker_io_oauth_api/index.html
+
+aws configure set preview.cloudfront true
+export DISTRIBUTION_ID=YUTIYUTIUTIUYTIUT
+aws cloudfront create-invalidation --profile docs.docker.com --distribution-id $DISTRIBUTION_ID --invalidation-batch '{"Paths":{"Quantity":1, "Items":["/v1.0/reference/api/docker_io_oauth_api/"]},"CallerReference":"6Mar2015sventest1"}'
+aws cloudfront create-invalidation --profile docs.docker.com --distribution-id $DISTRIBUTION_ID --invalidation-batch '{"Paths":{"Quantity":1, "Items":["/v1.1/reference/api/docker_io_oauth_api/"]},"CallerReference":"6Mar2015sventest1"}'
+```
diff --git a/docs/build.sh b/docs/build.sh
deleted file mode 100755
index 033820c67d..0000000000
--- a/docs/build.sh
+++ /dev/null
@@ -1,57 +0,0 @@
-#!/usr/bin/env bash
-set -e
-
-set -o pipefail
-
-usage() {
- exit 1
-}
-
-
-extrafiles=($(find . -name "mkdocs-*.yml"))
-extralines=()
-
-for file in "${extrafiles[@]}"
-do
- #echo "LOADING $file"
- while read line
- do
- if [[ "$line" != "" ]]
- then
- extralines+=("$line")
-
- #echo "LINE (${#extralines[@]}): $line"
- fi
- done < <(cat "$file")
-done
-
-#echo "extra count (${#extralines[@]})"
-mv mkdocs.yml mkdocs.yml.bak
-echo "# Generated mkdocs.yml from ${extrafiles[@]}"
-echo "# Generated mkdocs.yml from ${extrafiles[@]}" > mkdocs.yml
-
-while read line
-do
- menu=$(echo $line | sed "s/^- \['\([^']*\)', '\([^']*\)'.*/\2/")
- if [[ "$menu" != "**HIDDEN**" ]]
- # or starts with a '#'?
- then
- if [[ "$lastmenu" != "" && "$lastmenu" != "$menu" ]]
- then
- # insert extra elements here
- for extra in "${extralines[@]}"
- do
- #echo "EXTRA $extra"
- extramenu=$(echo $extra | sed "s/^- \['\([^']*\)', '\([^']*\)'.*/\2/")
- if [[ "$extramenu" == "$lastmenu" ]]
- then
- echo "$extra" >> mkdocs.yml
- fi
- done
- #echo "# JUST FINISHED $lastmenu"
- fi
- lastmenu="$menu"
- fi
- echo "$line" >> mkdocs.yml
-
-done < <(cat "mkdocs.yml.bak")
diff --git a/docs/docs-update.py b/docs/docs-update.py
deleted file mode 100755
index c40da773e3..0000000000
--- a/docs/docs-update.py
+++ /dev/null
@@ -1,272 +0,0 @@
-#!/usr/bin/env python
-
-#
-# Sven's quick hack script to update the documentation
-#
-# call with:
-# ./docs/update.py /usr/bin/docker
-#
-
-import datetime
-import re
-from sys import argv
-import subprocess
-import os
-import os.path
-
-script, docker_cmd = argv
-
-date_string = datetime.date.today().strftime('%B %Y')
-
-
-def print_usage(outtext, docker_cmd, command):
- try:
- help_string = subprocess.check_output(
- "".join((docker_cmd, " ", command, " --help")),
- stderr=subprocess.STDOUT,
- shell=True
- )
- except subprocess.CalledProcessError, e:
- help_string = e.output
- for l in str(help_string).strip().split("\n"):
- l = l.rstrip()
- if l == '':
- outtext.write("\n")
- else:
- # `docker --help` tells the user the path they called it with
- l = re.sub(docker_cmd, "docker", l)
- outtext.write(" {}\n".format(l))
- outtext.write("\n")
-
-
-# TODO: look for an complain about any missing commands
-def update_cli_reference():
- originalFile = "docs/sources/reference/commandline/cli.md"
- os.rename(originalFile, originalFile+".bak")
-
- intext = open("{}.bak".format(originalFile), "r")
- outtext = open(originalFile, "w")
-
- mode = 'p'
- space = " "
- command = ""
- # 2 mode line-by line parser
- for line in intext:
- if mode == 'p':
- # Prose
- match = re.match("( \s*)Usage: docker ([a-z]+)", line)
- if match:
- # the beginning of a Docker command usage block
- space = match.group(1)
- command = match.group(2)
- mode = 'c'
- else:
- match = re.match("( \s*)Usage of .*docker.*:", line)
- if match:
- # the beginning of the Docker --help usage block
- space = match.group(1)
- command = ""
- mode = 'c'
- else:
- outtext.write(line)
- else:
- # command usage block
- match = re.match("("+space+")(.*)|^$", line)
- if not match:
- # The end of the current usage block
- # Shell out to run docker to see the new output
- print_usage(outtext, docker_cmd, command)
- outtext.write(line)
- mode = 'p'
- if mode == 'c':
- print_usage(outtext, docker_cmd, command)
-
-
-def update_man_pages():
- cmds = []
- try:
- help_string = subprocess.check_output(
- "".join((docker_cmd)),
- stderr=subprocess.STDOUT,
- shell=True
- )
- except subprocess.CalledProcessError, e:
- help_string = e.output
- for l in str(help_string).strip().split("\n"):
- l = l.rstrip()
- if l != "":
- match = re.match(" (.*?) .*", l)
- if match:
- cmds.append(match.group(1))
-
- desc_re = re.compile(
- r".*# DESCRIPTION(.*?)# (OPTIONS|EXAMPLES?).*",
- re.MULTILINE | re.DOTALL
- )
-
- options_re = re.compile(
- r".*# OPTIONS(.*?)# (HISTORY|EXAMPLES?).*",
- re.MULTILINE | re.DOTALL
- )
-
- example_re = re.compile(
- r".*# EXAMPLES?(.*)# HISTORY.*",
- re.MULTILINE | re.DOTALL
- )
-
- history_re = re.compile(
- r".*# HISTORY(.*)",
- re.MULTILINE | re.DOTALL
- )
-
- for command in cmds:
- print "COMMAND: "+command
- if command == "":
- print "SKIPPING"
- continue
- history = ""
- description = ""
- original_options = ""
- examples = ""
- if os.path.isfile("docs/man/docker-"+command+".1.md"):
- intext = open("docs/man/docker-"+command+".1.md", "r")
- txt = intext.read()
- intext.close()
- match = desc_re.match(txt)
- if match:
- description = match.group(1)
- match = options_re.match(txt)
- if match:
- original_options = match.group(1)
- #print "MATCHED OPTIONS\n" + original_options
- match = example_re.match(txt)
- if match:
- examples = match.group(1)
- match = history_re.match(txt)
- if match:
- history = match.group(1).strip()
-
- usage = ""
- usage_description = ""
- params = {}
- key_params = {}
-
- try:
- help_string = subprocess.check_output(
- "".join((docker_cmd, " ", command, " --help")),
- stderr=subprocess.STDOUT,
- shell=True
- )
- except subprocess.CalledProcessError, e:
- help_string = e.output
-
- last_key = ""
- for l in str(help_string).split("\n"):
- l = l.rstrip()
- if l != "":
- match = re.match("Usage: docker {}(.*)".format(command), l)
- if match:
- usage = match.group(1).strip()
- else:
- match = re.match(" (-+)(.*) \s+(.*)", l)
- if match:
- last_key = match.group(2).rstrip()
- key_params[last_key] = match.group(1)+last_key
- params[last_key] = match.group(3)
- else:
- if last_key != "":
- params[last_key] = "{}\n{}".format(params[last_key], l)
- else:
- if usage_description != "":
- usage_description = usage_description + "\n"
- usage_description = usage_description + l
-
- # replace [OPTIONS] with the list of params
- options = ""
- match = re.match("\[OPTIONS\]\s*(.*)", usage)
- if match:
- usage = match.group(1)
-
- new_usage = ""
- # TODO: sort without the `-`'s
- for key in sorted(params.keys(), key=lambda s: s.lower()):
- # split on commas, remove --?.*=.*, put in *'s mumble
- flags = []
- ps = []
- opts = []
- for k in key_params[key].split(","):
- match = re.match("(-+)([A-Za-z-0-9]*)(?:=(.*))?", k.lstrip())
- if match:
- flags.append("{}{}".format(match.group(1), match.group(2)))
- p = "**{}{}**".format(match.group(1), match.group(2))
- o = "**{}{}**".format(match.group(1), match.group(2))
- if match.group(3):
- val = match.group(3)
- if val == "\"\"":
- val = match.group(2).upper()
- p = "{}[=*{}*]".format(p, val)
- val = match.group(3)
- if val in ("true", "false"):
- params[key] = params[key].rstrip()
- if not params[key].endswith('.'):
- params[key] = params[key]+ "."
- params[key] = "{} The default is *{}*.".format(params[key], val)
- val = "*true*|*false*"
- o = "{}={}".format(o, val)
- ps.append(p)
- opts.append(o)
- else:
- print "nomatch:{}".format(k)
- new_usage = "{}\n[{}]".format(new_usage, "|".join(ps))
-
- options = "{}{}\n {}\n\n".format(options, ", ".join(opts), params[key])
-
- # look at the original options documentation and if its hand written, add it too.
- print "SVEN_re: "+flags[0]
- singleoption_re = re.compile(
- r".*[\r\n]\*\*"+flags[0]+"\*\*([^\r\n]*)[\r\n]+(.*?)[\r\n](\*\*-|# [A-Z]|\*\*[A-Z]+\*\*).*",
- #r""+flags[0]+"(.*)(^\*\*-.*)?",
- re.MULTILINE | re.DOTALL
- )
- match = singleoption_re.match(original_options)
- if match:
- info = match.group(2).strip()
- print "MATCHED: " + match.group(1).strip()
- if info != params[key].strip():
- #info = re.sub(params[key].strip(), '', info, flags=re.MULTILINE)
- print "INFO changed: " +info
- options = "{} {}\n\n".format(options, info.strip())
-
- if new_usage != "":
- new_usage = "{}\n".format(new_usage.strip())
- usage = new_usage + usage
-
- outtext = open("docs/man/docker-{}.1.md".format(command), "w")
- outtext.write("""% DOCKER(1) Docker User Manuals
-% Docker Community
-% JUNE 2014
-# NAME
-""")
- outtext.write("docker-{} - {}\n\n".format(command, usage_description))
- outtext.write("# SYNOPSIS\n**docker {}**\n{}\n\n".format(command, usage))
- if description != "":
- outtext.write("# DESCRIPTION{}".format(description))
- if options == "":
- options = "There are no available options.\n\n"
- outtext.write("# OPTIONS\n{}".format(options))
- if examples != "":
- outtext.write("# EXAMPLES{}".format(examples))
- outtext.write("# HISTORY\n")
- if history != "":
- outtext.write("{}\n".format(history))
- recent_history_re = re.compile(
- ".*{}.*".format(date_string),
- re.MULTILINE | re.DOTALL
- )
-# if not recent_history_re.match(history):
-# outtext.write("{}, updated by Sven Dowideit <SvenDowideit@home.org.au>\n".format(date_string))
- outtext.close()
-
-# main
-update_cli_reference()
-update_man_pages()
diff --git a/docs/docvalidate.py b/docs/docvalidate.py
deleted file mode 100755
index 582b8521da..0000000000
--- a/docs/docvalidate.py
+++ /dev/null
@@ -1,79 +0,0 @@
-#!/usr/bin/env python
-
-""" I honestly don't even know how the hell this works, just use it. """
-__author__ = "Scott Stamp <scott@hypermine.com>"
-
-from HTMLParser import HTMLParser
-from urlparse import urljoin
-from sys import setrecursionlimit
-import re
-import requests
-
-setrecursionlimit(10000)
-root = 'http://localhost:8000'
-
-
-class DataHolder:
-
- def __init__(self, value=None, attr_name='value'):
- self._attr_name = attr_name
- self.set(value)
-
- def __call__(self, value):
- return self.set(value)
-
- def set(self, value):
- setattr(self, self._attr_name, value)
- return value
-
- def get(self):
- return getattr(self, self._attr_name)
-
-
-class Parser(HTMLParser):
- global root
-
- ids = set()
- crawled = set()
- anchors = {}
- pages = set()
- save_match = DataHolder(attr_name='match')
-
- def __init__(self, origin):
- self.origin = origin
- HTMLParser.__init__(self)
-
- def handle_starttag(self, tag, attrs):
- attrs = dict(attrs)
- if 'href' in attrs:
- href = attrs['href']
-
- if re.match('^{0}|\/|\#[\S]{{1,}}'.format(root), href):
- if self.save_match(re.search('.*\#(.*?)$', href)):
- if self.origin not in self.anchors:
- self.anchors[self.origin] = set()
- self.anchors[self.origin].add(
- self.save_match.match.groups(1)[0])
-
- url = urljoin(root, href)
-
- if url not in self.crawled and not re.match('^\#', href):
- self.crawled.add(url)
- Parser(url).feed(requests.get(url).content)
-
- if 'id' in attrs:
- self.ids.add(attrs['id'])
- # explicit <a name=""></a> references
- if 'name' in attrs:
- self.ids.add(attrs['name'])
-
-
-r = requests.get(root)
-parser = Parser(root)
-parser.feed(r.content)
-for anchor in sorted(parser.anchors):
- if not re.match('.*/\#.*', anchor):
- for anchor_name in parser.anchors[anchor]:
- if anchor_name not in parser.ids:
- print 'Missing - ({0}): #{1}'.format(
- anchor.replace(root, ''), anchor_name)
diff --git a/docs/man/Dockerfile.5.md b/docs/man/Dockerfile.5.md
index dd1d8b2ce1..7f884888e2 100644
--- a/docs/man/Dockerfile.5.md
+++ b/docs/man/Dockerfile.5.md
@@ -6,12 +6,14 @@
Dockerfile - automate the steps of creating a Docker image
# INTRODUCTION
+
The **Dockerfile** is a configuration file that automates the steps of creating
a Docker image. It is similar to a Makefile. Docker reads instructions from the
**Dockerfile** to automate the steps otherwise performed manually to create an
-image. To build an image, create a file called **Dockerfile**. The
-**Dockerfile** describes the steps taken to assemble the image. When the
-**Dockerfile** has been created, call the **docker build** command, using the
+image. To build an image, create a file called **Dockerfile**.
+
+The **Dockerfile** describes the steps taken to assemble the image. When the
+**Dockerfile** has been created, call the `docker build` command, using the
path of directory that contains **Dockerfile** as the argument.
# SYNOPSIS
@@ -20,7 +22,7 @@ INSTRUCTION arguments
For example:
-FROM image
+ FROM image
# DESCRIPTION
@@ -29,198 +31,292 @@ A Dockerfile is similar to a Makefile.
# USAGE
-**sudo docker build .**
- -- runs the steps and commits them, building a final image
- The path to the source repository defines where to find the context of the
- build. The build is run by the docker daemon, not the CLI. The whole
- context must be transferred to the daemon. The Docker CLI reports
- "Sending build context to Docker daemon" when the context is sent to the daemon.
-
-**sudo docker build -t repository/tag .**
- -- specifies a repository and tag at which to save the new image if the build
- succeeds. The Docker daemon runs the steps one-by-one, committing the result
- to a new image if necessary before finally outputting the ID of the new
- image. The Docker daemon automatically cleans up the context it is given.
-
-Docker re-uses intermediate images whenever possible. This significantly
-accelerates the *docker build* process.
-
+ sudo docker build .
+
+ -- Runs the steps and commits them, building a final image.
+ The path to the source repository defines where to find the context of the
+ build. The build is run by the Docker daemon, not the CLI. The whole
+ context must be transferred to the daemon. The Docker CLI reports
+ `"Sending build context to Docker daemon"` when the context is sent to the
+ daemon.
+
+ ```
+ sudo docker build -t repository/tag .
+ ```
+
+ -- specifies a repository and tag at which to save the new image if the build
+ succeeds. The Docker daemon runs the steps one-by-one, committing the result
+ to a new image if necessary, before finally outputting the ID of the new
+ image. The Docker daemon automatically cleans up the context it is given.
+
+ Docker re-uses intermediate images whenever possible. This significantly
+ accelerates the *docker build* process.
+
# FORMAT
-**FROM image**
-or
-**FROM image:tag**
- -- The FROM instruction sets the base image for subsequent instructions. A
- valid Dockerfile must have FROM as its first instruction. The image can be any
- valid image. It is easy to start by pulling an image from the public
- repositories.
- -- FROM must be he first non-comment instruction in Dockerfile.
- -- FROM may appear multiple times within a single Dockerfile in order to create
- multiple images. Make a note of the last image id output by the commit before
- each new FROM command.
- -- If no tag is given to the FROM instruction, latest is assumed. If the used
- tag does not exist, an error is returned.
+ `FROM image`
+
+ `FROM image:tag`
+
+ -- The **FROM** instruction sets the base image for subsequent instructions. A
+ valid Dockerfile must have **FROM** as its first instruction. The image can be any
+ valid image. It is easy to start by pulling an image from the public
+ repositories.
+
+ -- **FROM** must be the first non-comment instruction in Dockerfile.
+
+ -- **FROM** may appear multiple times within a single Dockerfile in order to create
+ multiple images. Make a note of the last image ID output by the commit before
+ each new **FROM** command.
+
+ -- If no tag is given to the **FROM** instruction, latest is assumed. If the
+ used tag does not exist, an error is returned.
**MAINTAINER**
- --The MAINTAINER instruction sets the Author field for the generated images.
+ -- **MAINTAINER** sets the Author field for the generated images.
**RUN**
- --RUN has two forms:
- **RUN <command>**
- -- (the command is run in a shell - /bin/sh -c)
- **RUN ["executable", "param1", "param2"]**
- --The above is executable form.
- --The RUN instruction executes any commands in a new layer on top of the
- current image and commits the results. The committed image is used for the next
- step in Dockerfile.
- --Layering RUN instructions and generating commits conforms to the core
- concepts of Docker where commits are cheap and containers can be created from
- any point in the history of an image. This is similar to source control. The
- exec form makes it possible to avoid shell string munging. The exec form makes
- it possible to RUN commands using a base image that does not contain /bin/sh.
+ -- **RUN** has two forms:
+
+ ```
+ # the command is run in a shell - /bin/sh -c
+ RUN <command>
+
+ # Executable form
+ RUN ["executable", "param1", "param2"]
+ ```
+
+
+ -- The **RUN** instruction executes any commands in a new layer on top of the current
+ image and commits the results. The committed image is used for the next step in
+ Dockerfile.
+
+ -- Layering **RUN** instructions and generating commits conforms to the core
+ concepts of Docker where commits are cheap and containers can be created from
+ any point in the history of an image. This is similar to source control. The
+ exec form makes it possible to avoid shell string munging. The exec form makes
+ it possible to **RUN** commands using a base image that does not contain `/bin/sh`.
+
+ Note that the exec form is parsed as a JSON array, which means that you must
+ use double-quotes (") around words not single-quotes (').
**CMD**
- --CMD has three forms:
- **CMD ["executable", "param1", "param2"]** This is the preferred form, the
- exec form.
- **CMD ["param1", "param2"]** This command provides default parameters to
- ENTRYPOINT)
- **CMD command param1 param2** This command is run as a shell.
- --There can be only one CMD in a Dockerfile. If more than one CMD is listed, only
- the last CMD takes effect.
- The main purpose of a CMD is to provide defaults for an executing container.
+ -- **CMD** has three forms:
+
+ ```
+ # Executable form
+ CMD ["executable", "param1", "param2"]`
+
+ # Provide default arguments to ENTRYPOINT
+ CMD ["param1", "param2"]`
+
+ # the command is run in a shell - /bin/sh -c
+ CMD command param1 param2
+ ```
+
+ -- There can be only one **CMD** in a Dockerfile. If more than one **CMD** is listed, only
+ the last **CMD** takes effect.
+ The main purpose of a **CMD** is to provide defaults for an executing container.
These defaults may include an executable, or they can omit the executable. If
- they omit the executable, an ENTRYPOINT must be specified.
- When used in the shell or exec formats, the CMD instruction sets the command to
+ they omit the executable, an **ENTRYPOINT** must be specified.
+ When used in the shell or exec formats, the **CMD** instruction sets the command to
be executed when running the image.
- If you use the shell form of the CMD, the <command> executes in /bin/sh -c:
- **FROM ubuntu**
- **CMD echo "This is a test." | wc -**
- If you run <command> without a shell, then you must express the command as a
+ If you use the shell form of the **CMD**, the `<command>` executes in `/bin/sh -c`:
+
+ Note that the exec form is parsed as a JSON array, which means that you must
+ use double-quotes (") around words not single-quotes (').
+
+ ```
+ FROM ubuntu
+ CMD echo "This is a test." | wc -
+ ```
+
+ -- If you run **command** without a shell, then you must express the command as a
JSON array and give the full path to the executable. This array form is the
- preferred form of CMD. All additional parameters must be individually expressed
+ preferred form of **CMD**. All additional parameters must be individually expressed
as strings in the array:
- **FROM ubuntu**
- **CMD ["/usr/bin/wc","--help"]**
- To make the container run the same executable every time, use ENTRYPOINT in
- combination with CMD.
- If the user specifies arguments to docker run, the specified commands override
- the default in CMD.
- Do not confuse **RUN** with **CMD**. RUN runs a command and commits the result. CMD
- executes nothing at build time, but specifies the intended command for the
- image.
+
+ ```
+ FROM ubuntu
+ CMD ["/usr/bin/wc","--help"]
+ ```
+
+ -- To make the container run the same executable every time, use **ENTRYPOINT** in
+ combination with **CMD**.
+ If the user specifies arguments to `docker run`, the specified commands
+ override the default in **CMD**.
+ Do not confuse **RUN** with **CMD**. **RUN** runs a command and commits the result.
+ **CMD** executes nothing at build time, but specifies the intended command for
+ the image.
+
+**LABEL**
+ -- `LABEL <key>[=<value>] [<key>[=<value>] ...]`
+ The **LABEL** instruction adds metadata to an image. A **LABEL** is a
+ key-value pair. To include spaces within a **LABEL** value, use quotes and
+ backslashes as you would in command-line parsing.
+
+ ```
+ LABEL "com.example.vendor"="ACME Incorporated"
+ ```
+
+ An image can have more than one label. To specify multiple labels, separate
+ each key-value pair by a space.
+
+ Labels are additive including `LABEL`s in `FROM` images. As the system
+ encounters and then applies a new label, new `key`s override any previous
+ labels with identical keys.
+
+ To display an image's labels, use the `docker inspect` command.
**EXPOSE**
- --**EXPOSE <port> [<port>...]**
- The **EXPOSE** instruction informs Docker that the container listens on the
- specified network ports at runtime. Docker uses this information to
- interconnect containers using links, and to set up port redirection on the host
- system.
+ -- `EXPOSE <port> [<port>...]`
+ The **EXPOSE** instruction informs Docker that the container listens on the
+ specified network ports at runtime. Docker uses this information to
+ interconnect containers using links, and to set up port redirection on the host
+ system.
**ENV**
- --**ENV <key> <value>**
- The ENV instruction sets the environment variable <key> to
- the value <value>. This value is passed to all future
- RUN, ENTRYPOINT, and CMD instructions. This is
- functionally equivalent to prefixing the command with **<key>=<value>**. The
- environment variables that are set with ENV persist when a container is run
- from the resulting image. Use docker inspect to inspect these values, and
- change them using docker run **--env <key>=<value>.**
-
- Note that setting Setting **ENV DEBIAN_FRONTEND noninteractive** may cause
- unintended consequences, because it will persist when the container is run
- interactively, as with the following command: **docker run -t -i image bash**
+ -- `ENV <key> <value>`
+ The **ENV** instruction sets the environment variable <key> to
+ the value `<value>`. This value is passed to all future
+ RUN, **ENTRYPOINT**, and **CMD** instructions. This is
+ functionally equivalent to prefixing the command with `<key>=<value>`. The
+ environment variables that are set with **ENV** persist when a container is run
+ from the resulting image. Use `docker inspect` to inspect these values, and
+ change them using `docker run --env <key>=<value>`.
+
+ Note that setting "`ENV DEBIAN_FRONTEND noninteractive`" may cause
+ unintended consequences, because it will persist when the container is run
+ interactively, as with the following command: `docker run -t -i image bash`
**ADD**
- --ADD has two forms:
- **ADD <src>... <dest>**
- **ADD ["<src>"... "<dest>"]** This form is required for paths containing
- whitespace.
- The ADD instruction copies new files, directories
- or remote file URLs to the filesystem of the container at path <dest>.
- Multiple <src> resources may be specified but if they are files or directories
- then they must be relative to the source directory that is being built
- (the context of the build). The <dest> is the absolute path, or path relative
- to `WORKDIR`, into which the source is copied inside the target container.
- All new files and directories are created with mode 0755 and with the uid
- and gid of 0.
+ -- **ADD** has two forms:
+
+ ```
+ ADD <src> <dest>
+
+ # Required for paths with whitespace
+ ADD ["<src>", "<dest>"]
+ ```
+
+ The **ADD** instruction copies new files, directories
+ or remote file URLs to the filesystem of the container at path `<dest>`.
+ Multiple `<src>` resources may be specified but if they are files or directories
+ then they must be relative to the source directory that is being built
+ (the context of the build). The `<dest>` is the absolute path, or path relative
+ to **WORKDIR**, into which the source is copied inside the target container.
+ All new files and directories are created with mode 0755 and with the uid
+ and gid of **0**.
**COPY**
- --COPY has two forms:
- **COPY <src>... <dest>**
- **COPY ["<src>"... "<dest>"]** This form is required for paths containing
- whitespace.
- The COPY instruction copies new files from <src> and
- adds them to the filesystem of the container at path <dest>. The <src> must be
- the path to a file or directory relative to the source directory that is
- being built (the context of the build) or a remote file URL. The `<dest>` is an
- absolute path, or a path relative to `WORKDIR`, into which the source will
- be copied inside the target container. All new files and directories are
- created with mode 0755 and with the uid and gid of 0.
+ -- **COPY** has two forms:
+
+ ```
+ COPY <src> <dest>
+
+ # Required for paths with whitespace
+ COPY ["<src>", "<dest>"]
+ ```
+
+ The **COPY** instruction copies new files from `<src>` and
+ adds them to the filesystem of the container at path <dest>. The `<src>` must be
+ the path to a file or directory relative to the source directory that is
+ being built (the context of the build) or a remote file URL. The `<dest>` is an
+ absolute path, or a path relative to **WORKDIR**, into which the source will
+ be copied inside the target container. All new files and directories are
+ created with mode **0755** and with the uid and gid of **0**.
**ENTRYPOINT**
- --**ENTRYPOINT** has two forms: ENTRYPOINT ["executable", "param1", "param2"]
- (This is like an exec, and is the preferred form.) ENTRYPOINT command param1
- param2 (This is running as a shell.) An ENTRYPOINT helps you configure a
- container that can be run as an executable. When you specify an ENTRYPOINT,
- the whole container runs as if it was only that executable. The ENTRYPOINT
- instruction adds an entry command that is not overwritten when arguments are
- passed to docker run. This is different from the behavior of CMD. This allows
- arguments to be passed to the entrypoint, for instance docker run <image> -d
- passes the -d argument to the ENTRYPOINT. Specify parameters either in the
- ENTRYPOINT JSON array (as in the preferred exec form above), or by using a CMD
- statement. Parameters in the ENTRYPOINT are not overwritten by the docker run
- arguments. Parameters specifies via CMD are overwritten by docker run
- arguments. Specify a plain string for the ENTRYPOINT, and it will execute in
- /bin/sh -c, like a CMD instruction:
- FROM ubuntu
- ENTRYPOINT wc -l -
- This means that the Dockerfile's image always takes stdin as input (that's
- what "-" means), and prints the number of lines (that's what "-l" means). To
- make this optional but default, use a CMD:
- FROM ubuntu
- CMD ["-l", "-"]
- ENTRYPOINT ["/usr/bin/wc"]
+ -- **ENTRYPOINT** has two forms:
+
+ ```
+ # executable form
+ ENTRYPOINT ["executable", "param1", "param2"]`
+
+ # run command in a shell - /bin/sh -c
+ ENTRYPOINT command param1 param2
+ ```
+
+ -- An **ENTRYPOINT** helps you configure a
+ container that can be run as an executable. When you specify an **ENTRYPOINT**,
+ the whole container runs as if it was only that executable. The **ENTRYPOINT**
+ instruction adds an entry command that is not overwritten when arguments are
+ passed to docker run. This is different from the behavior of CMD. This allows
+ arguments to be passed to the entrypoint, for instance `docker run <image> -d`
+ passes the -d argument to the **ENTRYPOINT**. Specify parameters either in the
+ **ENTRYPOINT** JSON array (as in the preferred exec form above), or by using a **CMD**
+ statement. Parameters in the **ENTRYPOINT** are not overwritten by the docker run
+ arguments. Parameters specifies via **CMD** are overwritten by docker run
+ arguments. Specify a plain string for the **ENTRYPOINT**, and it will execute in
+ `/bin/sh -c`, like a **CMD** instruction:
+
+ ```
+ FROM ubuntu
+ ENTRYPOINT wc -l -
+ ```
+
+ This means that the Dockerfile's image always takes stdin as input (that's
+ what "-" means), and prints the number of lines (that's what "-l" means). To
+ make this optional but default, use a **CMD**:
+
+ ```
+ FROM ubuntu
+ CMD ["-l", "-"]
+ ENTRYPOINT ["/usr/bin/wc"]
+ ```
**VOLUME**
- --**VOLUME ["/data"]**
- The VOLUME instruction creates a mount point with the specified name and marks
- it as holding externally-mounted volumes from the native host or from other
- containers.
+ -- `VOLUME ["/data"]`
+ The **VOLUME** instruction creates a mount point with the specified name and marks
+ it as holding externally-mounted volumes from the native host or from other
+ containers.
**USER**
- -- **USER daemon**
- The USER instruction sets the username or UID that is used when running the
- image.
+ -- `USER daemon`
+ The **USER** instruction sets the username or UID that is used when running the
+ image.
+
+**WRKDIR**
+ -- `WORKDIR /path/to/workdir`
+ The **WORKDIR** instruction sets the working directory for the **RUN**, **CMD**,
+ **ENTRYPOINT**, **COPY** and **ADD** Dockerfile commands that follow it. It can
+ be used multiple times in a single Dockerfile. Relative paths are defined
+ relative to the path of the previous **WORKDIR** instruction. For example:
-**WORKDIR**
- -- **WORKDIR /path/to/workdir**
- The WORKDIR instruction sets the working directory for the **RUN**, **CMD**, **ENTRYPOINT**, **COPY** and **ADD** Dockerfile commands that follow it.
- It can be used multiple times in a single Dockerfile. Relative paths are defined relative to the path of the previous **WORKDIR** instruction. For example:
- **WORKDIR /a WORKDIR b WORKDIR c RUN pwd**
- In the above example, the output of the **pwd** command is **a/b/c**.
+ ```
+ WORKDIR /a
+ WORKDIR b
+ WORKDIR c
+ RUN pwd
+ ```
+
+ In the above example, the output of the **pwd** command is **a/b/c**.
**ONBUILD**
- -- **ONBUILD [INSTRUCTION]**
- The ONBUILD instruction adds a trigger instruction to the image, which is
- executed at a later time, when the image is used as the base for another
- build. The trigger is executed in the context of the downstream build, as
- if it had been inserted immediately after the FROM instruction in the
- downstream Dockerfile. Any build instruction can be registered as a
- trigger. This is useful if you are building an image to be
- used as a base for building other images, for example an application build
- environment or a daemon to be customized with a user-specific
- configuration. For example, if your image is a reusable python
- application builder, it requires application source code to be
- added in a particular directory, and might require a build script
- to be called after that. You can't just call ADD and RUN now, because
- you don't yet have access to the application source code, and it
- is different for each application build. Providing
- application developers with a boilerplate Dockerfile to copy-paste
- into their application is inefficient, error-prone, and
- difficult to update because it mixes with application-specific code.
- The solution is to use **ONBUILD** to register instructions in advance, to
- run later, during the next build stage.
+ -- `ONBUILD [INSTRUCTION]`
+ The **ONBUILD** instruction adds a trigger instruction to an image. The
+ trigger is executed at a later time, when the image is used as the base for
+ another build. Docker executes the trigger in the context of the downstream
+ build, as if the trigger existed immediately after the **FROM** instruction in
+ the downstream Dockerfile.
+
+ You can register any build instruction as a trigger. A trigger is useful if
+ you are defining an image to use as a base for building other images. For
+ example, if you are defining an application build environment or a daemon that
+ is customized with a user-specific configuration.
+
+ Consider an image intended as a reusable python application builder. It must
+ add application source code to a particular directory, and might need a build
+ script called after that. You can't just call **ADD** and **RUN** now, because
+ you don't yet have access to the application source code, and it is different
+ for each application build.
+
+ -- Providing application developers with a boilerplate Dockerfile to copy-paste
+ into their application is inefficient, error-prone, and
+ difficult to update because it mixes with application-specific code.
+ The solution is to use **ONBUILD** to register instructions in advance, to
+ run later, during the next build stage.
# HISTORY
*May 2014, Compiled by Zac Dover (zdover at redhat dot com) based on docker.com Dockerfile documentation.
+*Feb 2015, updated by Brian Goff (cpuguy83@gmail.com) for readability
diff --git a/docs/man/docker-build.1.md b/docs/man/docker-build.1.md
index f6a89b54ed..fe6250fc19 100644
--- a/docs/man/docker-build.1.md
+++ b/docs/man/docker-build.1.md
@@ -7,13 +7,18 @@ docker-build - Build a new image from the source code at PATH
# SYNOPSIS
**docker build**
[**--help**]
-[**-f**|**--file**[=*Dockerfile*]]
+[**-f**|**--file**[=*PATH/Dockerfile*]]
[**--force-rm**[=*false*]]
[**--no-cache**[=*false*]]
[**--pull**[=*false*]]
[**-q**|**--quiet**[=*false*]]
[**--rm**[=*true*]]
[**-t**|**--tag**[=*TAG*]]
+[**-m**|**--memory**[=*MEMORY*]]
+[**--memory-swap**[=*MEMORY-SWAP*]]
+[**-c**|**--cpu-shares**[=*0*]]
+[**--cpuset-cpus**[=*CPUSET-CPUS*]]
+
PATH | URL | -
# DESCRIPTION
@@ -33,7 +38,7 @@ When a Git repository is set as the **URL**, the repository is used
as context.
# OPTIONS
-**-f**, **--file**=*Dockerfile*
+**-f**, **--file**=*PATH/Dockerfile*
Path to the Dockerfile to use. If the path is a relative path then it must be relative to the current directory. The file must be within the build context. The default is *Dockerfile*.
**--force-rm**=*true*|*false*
diff --git a/docs/man/docker-commit.1.md b/docs/man/docker-commit.1.md
index d7619133d0..e3459197a7 100644
--- a/docs/man/docker-commit.1.md
+++ b/docs/man/docker-commit.1.md
@@ -8,6 +8,7 @@ docker-commit - Create a new image from a container's changes
**docker commit**
[**-a**|**--author**[=*AUTHOR*]]
[**--help**]
+[**-c**|**--change**[= []**]]
[**-m**|**--message**[=*MESSAGE*]]
[**-p**|**--pause**[=*true*]]
CONTAINER [REPOSITORY[:TAG]]
@@ -19,6 +20,10 @@ Using an existing container's name or ID you can create a new image.
**-a**, **--author**=""
Author (e.g., "John Hannibal Smith <hannibal@a-team.com>")
+**-c** , **--change**=[]
+ Apply specified Dockerfile instructions while committing the image
+ Supported Dockerfile instructions: ADD|CMD|ENTRYPOINT|ENV|EXPOSE|FROM|MAINTAINER|RUN|USER|LABEL|VOLUME|WORKDIR|COPY
+
**--help**
Print usage statement
@@ -38,8 +43,17 @@ create a new image run docker ps to find the container's ID and then run:
# docker commit -m="Added Apache to Fedora base image" \
-a="A D Ministrator" 98bd7fc99854 fedora/fedora_httpd:20
+## Apply specified Dockerfile instructions while committing the image
+If an existing container was created without the DEBUG environment
+variable set to "true", you can create a new image based on that
+container by first getting the container's ID with docker ps and
+then running:
+
+ # docker commit -c="ENV DEBUG true" 98bd7fc99854 debug-image
+
# HISTORY
April 2014, Originally compiled by William Henry (whenry at redhat dot com)
based on docker.com source material and in
June 2014, updated by Sven Dowideit <SvenDowideit@home.org.au>
July 2014, updated by Sven Dowideit <SvenDowideit@home.org.au>
+Oct 2014, updated by Daniel, Dao Quang Minh <daniel at nitrous dot io>
diff --git a/docs/man/docker-cp.1.md b/docs/man/docker-cp.1.md
index ac49a47a54..3cd203a83d 100644
--- a/docs/man/docker-cp.1.md
+++ b/docs/man/docker-cp.1.md
@@ -2,17 +2,57 @@
% Docker Community
% JUNE 2014
# NAME
-docker-cp - Copy files/folders from the PATH to the HOSTPATH
+docker-cp - Copy files or folders from a container's PATH to a HOSTDIR
+or to STDOUT.
# SYNOPSIS
**docker cp**
[**--help**]
-CONTAINER:PATH HOSTPATH
+CONTAINER:PATH HOSTDIR|-
# DESCRIPTION
-Copy files/folders from a container's filesystem to the host
-path. Paths are relative to the root of the filesystem. Files
-can be copied from a running or stopped container.
+
+Copy files or folders from a `CONTAINER:PATH` to the `HOSTDIR` or to `STDOUT`.
+The `CONTAINER:PATH` is relative to the root of the container's filesystem. You
+can copy from either a running or stopped container.
+
+The `PATH` can be a file or directory. The `docker cp` command assumes all
+`PATH` values start at the `/` (root) directory. This means supplying the
+initial forward slash is optional; The command sees
+`compassionate_darwin:/tmp/foo/myfile.txt` and
+`compassionate_darwin:tmp/foo/myfile.txt` as identical.
+
+The `HOSTDIR` refers to a directory on the host. If you do not specify an
+absolute path for your `HOSTDIR` value, Docker creates the directory relative to
+where you run the `docker cp` command. For example, suppose you want to copy the
+`/tmp/foo` directory from a container to the `/tmp` directory on your host. If
+you run `docker cp` in your `~` (home) directory on the host:
+
+ $ docker cp compassionate_darwin:tmp/foo /tmp
+
+Docker creates a `/tmp/foo` directory on your host. Alternatively, you can omit
+the leading slash in the command. If you execute this command from your home directory:
+
+ $ docker cp compassionate_darwin:tmp/foo tmp
+
+Docker creates a `~/tmp/foo` subdirectory.
+
+When copying files to an existing `HOSTDIR`, the `cp` command adds the new files to
+the directory. For example, this command:
+
+ $ docker cp sharp_ptolemy:/tmp/foo/myfile.txt /tmp
+
+Creates a `/tmp/foo` directory on the host containing the `myfile.txt` file. If
+you repeat the command but change the filename:
+
+ $ docker cp sharp_ptolemy:/tmp/foo/secondfile.txt /tmp
+
+Your host's `/tmp/foo` directory will contain both files:
+
+ $ ls /tmp/foo
+ myfile.txt secondfile.txt
+
+Finally, use '-' to write the data as a `tar` file to STDOUT.
# OPTIONS
**--help**
diff --git a/docs/man/docker-create.1.md b/docs/man/docker-create.1.md
index 8a0b91f7c2..1a0da1b8f4 100644
--- a/docs/man/docker-create.1.md
+++ b/docs/man/docker-create.1.md
@@ -12,7 +12,7 @@ docker-create - Create a new container
[**--cap-add**[=*[]*]]
[**--cap-drop**[=*[]*]]
[**--cidfile**[=*CIDFILE*]]
-[**--cpuset**[=*CPUSET*]]
+[**--cpuset-cpus**[=*CPUSET-CPUS*]]
[**--device**[=*[]*]]
[**--dns-search**[=*[]*]]
[**--dns**[=*[]*]]
@@ -24,9 +24,13 @@ docker-create - Create a new container
[**--help**]
[**-i**|**--interactive**[=*false*]]
[**--ipc**[=*IPC*]]
+[**-l**|**--label**[=*[]*]]
+[**--label-file**[=*[]*]]
[**--link**[=*[]*]]
[**--lxc-conf**[=*[]*]]
+[**--log-driver**[=*[]*]]
[**-m**|**--memory**[=*MEMORY*]]
+[**--memory-swap**[=*MEMORY-SWAP*]]
[**--mac-address**[=*MAC-ADDRESS*]]
[**--name**[=*NAME*]]
[**--net**[=*"bridge"*]]
@@ -42,6 +46,7 @@ docker-create - Create a new container
[**-v**|**--volume**[=*[]*]]
[**--volumes-from**[=*[]*]]
[**-w**|**--workdir**[=*WORKDIR*]]
+[**--cgroup-parent**[=*CGROUP-PATH*]]
IMAGE [COMMAND] [ARG...]
# OPTIONS
@@ -63,7 +68,10 @@ IMAGE [COMMAND] [ARG...]
**--cidfile**=""
Write the container ID to the file
-**--cpuset**=""
+**--cgroup-parent**=""
+ Path to cgroups under which the cgroup for the container will be created. If the path is not absolute, the path is considered to be relative to the cgroups path of the init process. Cgroups will be created if they do not already exist.
+
+**--cpuset-cpus**=""
CPUs in which to allow execution (0-3, 0,1)
**--device**=[]
@@ -101,15 +109,37 @@ IMAGE [COMMAND] [ARG...]
'container:<name|id>': reuses another container shared memory, semaphores and message queues
'host': use the host shared memory,semaphores and message queues inside the container. Note: the host mode gives the container full access to local shared memory and is therefore considered insecure.
+**-l**, **--label**=[]
+ Adds metadata to a container (e.g., --label=com.example.key=value)
+
+**--label-file**=[]
+ Read labels from a file. Delimit each label with an EOL.
+
**--link**=[]
Add link to another container in the form of <name or id>:alias
**--lxc-conf**=[]
(lxc exec-driver only) Add custom lxc options --lxc-conf="lxc.cgroup.cpuset.cpus = 0,1"
+**--log-driver**="|*json-file*|*syslog*|*none*"
+ Logging driver for container. Default is defined by daemon `--log-driver` flag.
+ **Warning**: `docker logs` command works only for `json-file` logging driver.
+
**-m**, **--memory**=""
Memory limit (format: <number><optional unit>, where unit = b, k, m or g)
+ Allows you to constrain the memory available to a container. If the host
+supports swap memory, then the **-m** memory setting can be larger than physical
+RAM. If a limit of 0 is specified (not using **-m**), the container's memory is
+not limited. The actual limit may be rounded up to a multiple of the operating
+system's page size (the value would be very large, that's millions of trillions).
+
+**--memory-swap**=""
+ Total memory limit (memory + swap)
+
+ Set `-1` to disable swap (format: <number><optional unit>, where unit = b, k, m or g).
+This value should always larger than **-m**, so you should alway use this with **-m**.
+
**--mac-address**=""
Container MAC address (e.g. 92:d0:c6:0a:29:33)
@@ -142,9 +172,9 @@ IMAGE [COMMAND] [ARG...]
Give extended privileges to this container. The default is *false*.
**--read-only**=*true*|*false*
- Mount the container's root filesystem as read only.
+ Mount the container's root filesystem as read only.
-**--restart**=""
+**--restart**="no"
Restart policy to apply when a container exits (no, on-failure[:max-retry], always)
**--security-opt**=[]
diff --git a/docs/man/docker-export.1.md b/docs/man/docker-export.1.md
index d2b22d2217..df69bc37d8 100644
--- a/docs/man/docker-export.1.md
+++ b/docs/man/docker-export.1.md
@@ -14,19 +14,31 @@ Export the contents of a container's filesystem using the full or shortened
container ID or container name. The output is exported to STDOUT and can be
redirected to a tar file.
+Stream to a file instead of STDOUT by using **-o**.
+
# OPTIONS
**--help**
Print usage statement
+**-o**, **--output**=""
+ Write to a file, instead of STDOUT
# EXAMPLES
Export the contents of the container called angry_bell to a tar file
-called test.tar:
+called angry_bell.tar:
+
+ # docker export angry_bell > angry_bell.tar
+ # docker export --output=angry_bell-latest.tar angry_bell
+ # ls -sh angry_bell.tar
+ 321M angry_bell.tar
+ # ls -sh angry_bell-latest.tar
+ 321M angry_bell-latest.tar
- # docker export angry_bell > test.tar
- # ls *.tar
- test.tar
+# See also
+**docker-import(1)** to create an empty filesystem image
+and import the contents of the tarball into it, then optionally tag it.
# HISTORY
April 2014, Originally compiled by William Henry (whenry at redhat dot com)
based on docker.com source material and internal work.
June 2014, updated by Sven Dowideit <SvenDowideit@home.org.au>
+Janurary 2015, updated by Joseph Kern (josephakern at gmail dot com)
diff --git a/docs/man/docker-images.1.md b/docs/man/docker-images.1.md
index 16fad991ce..c5151f1107 100644
--- a/docs/man/docker-images.1.md
+++ b/docs/man/docker-images.1.md
@@ -8,6 +8,7 @@ docker-images - List images
**docker images**
[**--help**]
[**-a**|**--all**[=*false*]]
+[**--digests**[=*false*]]
[**-f**|**--filter**[=*[]*]]
[**--no-trunc**[=*false*]]
[**-q**|**--quiet**[=*false*]]
@@ -33,8 +34,11 @@ versions.
**-a**, **--all**=*true*|*false*
Show all images (by default filter out the intermediate image layers). The default is *false*.
+**--digests**=*true*|*false*
+ Show image digests. The default is *false*.
+
**-f**, **--filter**=[]
- Provide filter values (i.e., 'dangling=true')
+ Filters the output. The dangling=true filter finds unused images. While label=com.foo=amd64 filters for images with a com.foo value of amd64. The label=com.foo filter finds images with the label com.foo of any value.
**--help**
Print usage statement
diff --git a/docs/man/docker-import.1.md b/docs/man/docker-import.1.md
index 974288c721..6b3899b6a7 100644
--- a/docs/man/docker-import.1.md
+++ b/docs/man/docker-import.1.md
@@ -6,9 +6,15 @@ docker-import - Create an empty filesystem image and import the contents of the
# SYNOPSIS
**docker import**
+[**-c**|**--change**[= []**]]
[**--help**]
URL|- [REPOSITORY[:TAG]]
+# OPTIONS
+**-c**, **--change**=[]
+ Apply specified Dockerfile instructions while importing the image
+ Supported Dockerfile instructions: `ADD`|`CMD`|`ENTRYPOINT`|`ENV`|`EXPOSE`|`FROM`|`MAINTAINER`|`RUN`|`USER`|`LABEL`|`VOLUME`|`WORKDIR`|`COPY`
+
# DESCRIPTION
Create a new filesystem image from the contents of a tarball (`.tar`,
`.tar.gz`, `.tgz`, `.bzip`, `.tar.xz`, `.txz`) into it, then optionally tag it.
@@ -39,6 +45,14 @@ Import to docker via pipe and stdin:
# tar -c . | docker import - exampleimagedir
+## Apply specified Dockerfile instructions while importing the image
+This example sets the docker image ENV variable DEBUG to true by default.
+
+ # tar -c . | docker import -c="ENV DEBUG true" - exampleimagedir
+
+# See also
+**docker-export(1)** to export the contents of a filesystem as a tar archive to STDOUT.
+
# HISTORY
April 2014, Originally compiled by William Henry (whenry at redhat dot com)
based on docker.com source material and internal work.
diff --git a/docs/man/docker-inspect.1.md b/docs/man/docker-inspect.1.md
index 8cbef0f91d..85f6730004 100644
--- a/docs/man/docker-inspect.1.md
+++ b/docs/man/docker-inspect.1.md
@@ -83,6 +83,11 @@ To get information on a container use it's ID or instance name:
"Ghost": false
},
"Image": "df53773a4390e25936f9fd3739e0c0e60a62d024ea7b669282b27e65ae8458e6",
+ "Labels": {
+ "com.example.vendor": "Acme",
+ "com.example.license": "GPL",
+ "com.example.version": "1.0"
+ },
"NetworkSettings": {
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
@@ -101,6 +106,7 @@ To get information on a container use it's ID or instance name:
"ResolvConfPath": "/etc/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/1eb5fabf5a03807136561b3c00adcd2992b535d624d5e18b6cdc6a6844d9767b/hostname",
"HostsPath": "/var/lib/docker/containers/1eb5fabf5a03807136561b3c00adcd2992b535d624d5e18b6cdc6a6844d9767b/hosts",
+ "LogPath": "/var/lib/docker/containers/1eb5fabf5a03807136561b3c00adcd2992b535d624d5e18b6cdc6a6844d9767b/1eb5fabf5a03807136561b3c00adcd2992b535d624d5e18b6cdc6a6844d9767b-json.log",
"Name": "/ecstatic_ptolemy",
"Driver": "devicemapper",
"ExecDriver": "native-0.1",
diff --git a/docs/man/docker-load.1.md b/docs/man/docker-load.1.md
index 71bd28adf5..52eaa37a1f 100644
--- a/docs/man/docker-load.1.md
+++ b/docs/man/docker-load.1.md
@@ -36,6 +36,9 @@ Restores both images and tags.
fedora heisenbug 58394af37342 7 weeks ago 385.5 MB
fedora latest 58394af37342 7 weeks ago 385.5 MB
+# See also
+**docker-save(1)** to save an image(s) to a tar archive (streamed to STDOUT by default).
+
# HISTORY
April 2014, Originally compiled by William Henry (whenry at redhat dot com)
based on docker.com source material and internal work.
diff --git a/docs/man/docker-login.1.md b/docs/man/docker-login.1.md
index 5ee6aa1c6a..f73df77ed8 100644
--- a/docs/man/docker-login.1.md
+++ b/docs/man/docker-login.1.md
@@ -2,7 +2,7 @@
% Docker Community
% JUNE 2014
# NAME
-docker-login - Register or log in to a Docker registry server, if no server is specified "https://index.docker.io/v1/" is the default.
+docker-login - Register or log in to a Docker registry.
# SYNOPSIS
**docker login**
@@ -13,9 +13,14 @@ docker-login - Register or log in to a Docker registry server, if no server is s
[SERVER]
# DESCRIPTION
-Register or Login to a docker registry server, if no server is
-specified "https://index.docker.io/v1/" is the default. If you want to
-login to a private registry you can specify this by adding the server name.
+Register or log in to a Docker Registry Service located on the specified
+`SERVER`. You can specify a URL or a `hostname` for the `SERVER` value. If you
+do not specify a `SERVER`, the command uses Docker's public registry located at
+`https://registry-1.docker.io/` by default. To get a username/password for Docker's public registry, create an account on Docker Hub.
+
+You can log into any public or private repository for which you have
+credentials. When you log in, the command stores encoded credentials in
+`$HOME/.dockercfg` on Linux or `%USERPROFILE%/.dockercfg` on Windows.
# OPTIONS
**-e**, **--email**=""
@@ -32,11 +37,15 @@ login to a private registry you can specify this by adding the server name.
# EXAMPLES
-## Login to a local registry
+## Login to a registry on your localhost
# docker login localhost:8080
+# See also
+**docker-logout(1)** to log out from a Docker registry.
+
# HISTORY
April 2014, Originally compiled by William Henry (whenry at redhat dot com)
based on docker.com source material and internal work.
June 2014, updated by Sven Dowideit <SvenDowideit@home.org.au>
+April 2015, updated by Mary Anthony for v2 <mary@docker.com>
diff --git a/docs/man/docker-logout.1.md b/docs/man/docker-logout.1.md
index 07dcdcbc33..d464f00fd1 100644
--- a/docs/man/docker-logout.1.md
+++ b/docs/man/docker-logout.1.md
@@ -2,26 +2,31 @@
% Docker Community
% JUNE 2014
# NAME
-docker-logout - Log out from a Docker registry, if no server is specified "https://index.docker.io/v1/" is the default.
+docker-logout - Log out from a Docker Registry Service.
# SYNOPSIS
**docker logout**
[SERVER]
# DESCRIPTION
-Log the user out from a Docker registry, if no server is
-specified "https://index.docker.io/v1/" is the default. If you want to
-log out from a private registry you can specify this by adding the server name.
+Log out of a Docker Registry Service located on the specified `SERVER`. You can
+specify a URL or a `hostname` for the `SERVER` value. If you do not specify a
+`SERVER`, the command attempts to log you out of Docker's public registry
+located at `https://registry-1.docker.io/` by default.
# OPTIONS
There are no available options.
# EXAMPLES
-## Log out from a local registry
+## Log out from a registry on your localhost
# docker logout localhost:8080
+# See also
+**docker-login(1)** to register or log in to a Docker registry server.
+
# HISTORY
June 2014, Originally compiled by Daniel, Dao Quang Minh (daniel at nitrous dot io)
July 2014, updated by Sven Dowideit <SvenDowideit@home.org.au>
+April 2015, updated by Mary Anthony for v2 <mary@docker.com>
diff --git a/docs/man/docker-logs.1.md b/docs/man/docker-logs.1.md
index d55e8d8365..01a15f54dc 100644
--- a/docs/man/docker-logs.1.md
+++ b/docs/man/docker-logs.1.md
@@ -22,6 +22,8 @@ The **docker logs --follow** command combines commands **docker logs** and
**docker attach**. It will first return all logs from the beginning and
then continue streaming new output from the container’s stdout and stderr.
+**Warning**: This command works only for **json-file** logging driver.
+
# OPTIONS
**--help**
Print usage statement
diff --git a/docs/man/docker-pause.1.md b/docs/man/docker-pause.1.md
index 7b4b091a06..5d2267af62 100644
--- a/docs/man/docker-pause.1.md
+++ b/docs/man/docker-pause.1.md
@@ -6,7 +6,7 @@ docker-pause - Pause all processes within a container
# SYNOPSIS
**docker pause**
-CONTAINER
+CONTAINER [CONTAINER...]
# DESCRIPTION
@@ -23,5 +23,8 @@ further details.
# OPTIONS
There are no available options.
+# See also
+**docker-unpause(1)** to unpause all processes within a container.
+
# HISTORY
June 2014, updated by Sven Dowideit <SvenDowideit@home.org.au>
diff --git a/docs/man/docker-ps.1.md b/docs/man/docker-ps.1.md
index 4c94545e32..783f4621f6 100644
--- a/docs/man/docker-ps.1.md
+++ b/docs/man/docker-ps.1.md
@@ -1,6 +1,6 @@
% DOCKER(1) Docker User Manuals
% Docker Community
-% JUNE 2014
+% FEBRUARY 2015
# NAME
docker-ps - List containers
@@ -36,7 +36,10 @@ the running containers.
**-f**, **--filter**=[]
Provide filter values. Valid filters:
exited=<int> - containers with exit code of <int>
+ label=<key> or label=<key>=<value>
status=(restarting|running|paused|exited)
+ name=<string> - container's name
+ id=<ID> - container's ID
**-l**, **--latest**=*true*|*false*
Show only the latest created container, include non-running ones. The default is *false*.
@@ -74,9 +77,15 @@ the running containers.
c1d3b0166030
41d50ecd2f57
+# Display only IDs of all containers that have the name `determined_torvalds`
+
+ # docker ps -a -q --filter=name=determined_torvalds
+ c1d3b0166030
+
# HISTORY
April 2014, Originally compiled by William Henry (whenry at redhat dot com)
based on docker.com source material and internal work.
June 2014, updated by Sven Dowideit <SvenDowideit@home.org.au>
August 2014, updated by Sven Dowideit <SvenDowideit@home.org.au>
November 2014, updated by Sven Dowideit <SvenDowideit@home.org.au>
+February 2015, updated by André Martins <martins@noironetworks.com>
diff --git a/docs/man/docker-pull.1.md b/docs/man/docker-pull.1.md
index f1963df55b..d7c1d59adb 100644
--- a/docs/man/docker-pull.1.md
+++ b/docs/man/docker-pull.1.md
@@ -2,7 +2,7 @@
% Docker Community
% JUNE 2014
# NAME
-docker-pull - Pull an image or a repository from the registry
+docker-pull - Pull an image or a repository from a registry
# SYNOPSIS
**docker pull**
@@ -12,10 +12,12 @@ NAME[:TAG]
# DESCRIPTION
-This command pulls down an image or a repository from the registry. If
+This command pulls down an image or a repository from a registry. If
there is more than one image for a repository (e.g., fedora) then all
images for that repository name are pulled down including any tags.
-It is also possible to specify a non-default registry to pull from.
+
+If you do not specify a `REGISTRY_HOST`, the command uses Docker's public
+registry located at `registry-1.docker.io` by default.
# OPTIONS
**-a**, **--all-tags**=*true*|*false*
@@ -45,7 +47,7 @@ It is also possible to specify a non-default registry to pull from.
fedora heisenbug 105182bb5e8b 5 days ago 372.7 MB
fedora latest 105182bb5e8b 5 days ago 372.7 MB
-# Pull an image, manually specifying path to the registry and tag
+# Pull an image, manually specifying path to Docker's public registry and tag
# Note that if the image is previously downloaded then the status would be
# 'Status: Image is up to date for registry.hub.docker.com/fedora:20'
@@ -67,3 +69,5 @@ April 2014, Originally compiled by William Henry (whenry at redhat dot com)
based on docker.com source material and internal work.
June 2014, updated by Sven Dowideit <SvenDowideit@home.org.au>
August 2014, updated by Sven Dowideit <SvenDowideit@home.org.au>
+April 2015, updated by John Willis <john.willis@docker.com>
+April 2015, updated by Mary Anthony for v2 <mary@docker.com>
diff --git a/docs/man/docker-push.1.md b/docs/man/docker-push.1.md
index 2d4dc8f89e..b51bf5d281 100644
--- a/docs/man/docker-push.1.md
+++ b/docs/man/docker-push.1.md
@@ -2,18 +2,18 @@
% Docker Community
% JUNE 2014
# NAME
-docker-push - Push an image or a repository to the registry
+docker-push - Push an image or a repository to a registry
# SYNOPSIS
**docker push**
[**--help**]
-NAME[:TAG]
+NAME[:TAG] | [REGISTRY_HOST[:REGISTRY_PORT]/]NAME[:TAG]
# DESCRIPTION
-Push an image or a repository to a registry. The default registry is the Docker
-Hub located at [hub.docker.com](https://hub.docker.com/). However the
-image can be pushed to another, perhaps private, registry as demonstrated in
-the example below.
+
+This command pushes an image or a repository to a registry. If you do not
+specify a `REGISTRY_HOST`, the command uses Docker's public registry located at
+`registry-1.docker.io` by default.
# OPTIONS
**--help**
@@ -28,12 +28,10 @@ and then committing it to a new image name:
# docker commit c16378f943fe rhel-httpd
-Now push the image to the registry using the image ID. In this example
-the registry is on host named registry-host and listening on port 5000.
-Default Docker commands will push to the default `hub.docker.com`
-registry. Instead, push to the local registry, which is on a host called
-registry-host*. To do this, tag the image with the host name or IP
-address, and the port of the registry:
+Now, push the image to the registry using the image ID. In this example the
+registry is on host named `registry-host` and listening on port `5000`. To do
+this, tag the image with the host name or IP address, and the port of the
+registry:
# docker tag rhel-httpd registry-host:5000/myadmin/rhel-httpd
# docker push registry-host:5000/myadmin/rhel-httpd
@@ -49,3 +47,5 @@ listed.
April 2014, Originally compiled by William Henry (whenry at redhat dot com)
based on docker.com source material and internal work.
June 2014, updated by Sven Dowideit <SvenDowideit@home.org.au>
+April 2015, updated by Mary Anthony for v2 <mary@docker.com>
+
diff --git a/docs/man/docker-rmi.1.md b/docs/man/docker-rmi.1.md
index c1f131f40c..c288a4e85c 100644
--- a/docs/man/docker-rmi.1.md
+++ b/docs/man/docker-rmi.1.md
@@ -13,10 +13,9 @@ IMAGE [IMAGE...]
# DESCRIPTION
-This will remove one or more images from the host node. This does not
-remove images from a registry. You cannot remove an image of a running
-container unless you use the **-f** option. To see all images on a host
-use the **docker images** command.
+Removes one or more images from the host node. This does not remove images from
+a registry. You cannot remove an image of a running container unless you use the
+**-f** option. To see all images on a host use the **docker images** command.
# OPTIONS
**-f**, **--force**=*true*|*false*
@@ -40,3 +39,4 @@ Here is an example of removing and image:
April 2014, Originally compiled by William Henry (whenry at redhat dot com)
based on docker.com source material and internal work.
June 2014, updated by Sven Dowideit <SvenDowideit@home.org.au>
+April 2015, updated by Mary Anthony for v2 <mary@docker.com>
diff --git a/docs/man/docker-run.1.md b/docs/man/docker-run.1.md
index 61ce465c33..1831237de2 100644
--- a/docs/man/docker-run.1.md
+++ b/docs/man/docker-run.1.md
@@ -12,7 +12,7 @@ docker-run - Run a command in a new container
[**--cap-add**[=*[]*]]
[**--cap-drop**[=*[]*]]
[**--cidfile**[=*CIDFILE*]]
-[**--cpuset**[=*CPUSET*]]
+[**--cpuset-cpus**[=*CPUSET-CPUS*]]
[**-d**|**--detach**[=*false*]]
[**--device**[=*[]*]]
[**--dns-search**[=*[]*]]
@@ -25,10 +25,13 @@ docker-run - Run a command in a new container
[**--help**]
[**-i**|**--interactive**[=*false*]]
[**--ipc**[=*IPC*]]
+[**-l**|**--label**[=*[]*]]
+[**--label-file**[=*[]*]]
[**--link**[=*[]*]]
[**--lxc-conf**[=*[]*]]
+[**--log-driver**[=*[]*]]
[**-m**|**--memory**[=*MEMORY*]]
-[**--memory-swap**[=*MEMORY-SWAP]]
+[**--memory-swap**[=*MEMORY-SWAP*]]
[**--mac-address**[=*MAC-ADDRESS*]]
[**--name**[=*NAME*]]
[**--net**[=*"bridge"*]]
@@ -46,6 +49,7 @@ docker-run - Run a command in a new container
[**-v**|**--volume**[=*[]*]]
[**--volumes-from**[=*[]*]]
[**-w**|**--workdir**[=*WORKDIR*]]
+[**--cgroup-parent**[=*CGROUP-PATH*]]
IMAGE [COMMAND] [ARG...]
# DESCRIPTION
@@ -82,11 +86,38 @@ option can be set multiple times.
**-c**, **--cpu-shares**=0
CPU shares (relative weight)
- You can increase the priority of a container
-with the -c option. By default, all containers run at the same priority and get
-the same proportion of CPU cycles, but you can tell the kernel to give more
-shares of CPU time to one or more containers when you start them via **docker
-run**.
+ By default, all containers get the same proportion of CPU cycles. This proportion
+can be modified by changing the container's CPU share weighting relative
+to the weighting of all other running containers.
+
+To modify the proportion from the default of 1024, use the **-c** or **--cpu-shares**
+flag to set the weighting to 2 or higher.
+
+The proportion will only apply when CPU-intensive processes are running.
+When tasks in one container are idle, other containers can use the
+left-over CPU time. The actual amount of CPU time will vary depending on
+the number of containers running on the system.
+
+For example, consider three containers, one has a cpu-share of 1024 and
+two others have a cpu-share setting of 512. When processes in all three
+containers attempt to use 100% of CPU, the first container would receive
+50% of the total CPU time. If you add a fouth container with a cpu-share
+of 1024, the first container only gets 33% of the CPU. The remaining containers
+receive 16.5%, 16.5% and 33% of the CPU.
+
+On a multi-core system, the shares of CPU time are distributed over all CPU
+cores. Even if a container is limited to less than 100% of CPU time, it can
+use 100% of each individual CPU core.
+
+For example, consider a system with more than three cores. If you start one
+container **{C0}** with **-c=512** running one process, and another container
+**{C1}** with **-c=1024** running two processes, this can result in the following
+division of CPU shares:
+
+ PID container CPU CPU share
+ 100 {C0} 0 100% of CPU0
+ 101 {C1} 1 100% of CPU1
+ 102 {C1} 2 100% of CPU2
**--cap-add**=[]
Add Linux capabilities
@@ -94,10 +125,13 @@ run**.
**--cap-drop**=[]
Drop Linux capabilities
+**--cgroup-parent**=""
+ Path to cgroups under which the cgroup for the container will be created. If the path is not absolute, the path is considered to be relative to the cgroups path of the init process. Cgroups will be created if they do not already exist.
+
**--cidfile**=""
Write the container ID to the file
-**--cpuset**=""
+**--cpuset-cpus**=""
CPUs in which to allow execution (0-3, 0,1)
**-d**, **--detach**=*true*|*false*
@@ -170,6 +204,12 @@ ENTRYPOINT.
'container:<name|id>': reuses another container shared memory, semaphores and message queues
'host': use the host shared memory,semaphores and message queues inside the container. Note: the host mode gives the container full access to local shared memory and is therefore considered insecure.
+**-l**, **--label**=[]
+ Set metadata on the container (e.g., --label com.example.key=value)
+
+**--label-file**=[]
+ Read in a line delimited file of labels
+
**--link**=[]
Add link to another container in the form of <name or id>:alias
@@ -182,20 +222,24 @@ which interface and port to use.
**--lxc-conf**=[]
(lxc exec-driver only) Add custom lxc options --lxc-conf="lxc.cgroup.cpuset.cpus = 0,1"
+**--log-driver**="|*json-file*|*syslog*|*none*"
+ Logging driver for container. Default is defined by daemon `--log-driver` flag.
+ **Warning**: `docker logs` command works only for `json-file` logging driver.
+
**-m**, **--memory**=""
Memory limit (format: <number><optional unit>, where unit = b, k, m or g)
Allows you to constrain the memory available to a container. If the host
-supports swap memory, then the -m memory setting can be larger than physical
-RAM. If a limit of 0 is specified, the container's memory is not limited. The
-actual limit may be rounded up to a multiple of the operating system's page
-size, if it is not already. The memory limit should be formatted as follows:
-`<number><optional unit>`, where unit = b, k, m or g.
+supports swap memory, then the **-m** memory setting can be larger than physical
+RAM. If a limit of 0 is specified (not using **-m**), the container's memory is
+not limited. The actual limit may be rounded up to a multiple of the operating
+system's page size (the value would be very large, that's millions of trillions).
**--memory-swap**=""
- Total memory usage (memory + swap)
+ Total memory limit (memory + swap)
- Set '-1' to disable swap (format: <number><optional unit>, where unit = b, k, m or g)
+ Set `-1` to disable swap (format: <number><optional unit>, where unit = b, k, m or g).
+This value should always larger than **-m**, so you should alway use this with **-m**.
**--mac-address**=""
Container MAC address (e.g. 92:d0:c6:0a:29:33)
@@ -231,9 +275,10 @@ and foreground Docker containers.
When set to true publish all exposed ports to the host interfaces. The
default is false. If the operator uses -P (or -p) then Docker will make the
exposed port accessible on the host and the ports will be available to any
-client that can reach the host. When using -P, Docker will bind the exposed
-ports to a random port on the host between 49153 and 65535. To find the
-mapping between the host ports and the exposed ports, use **docker port**.
+client that can reach the host. When using -P, Docker will bind any exposed
+port to a random port on the host within an *ephemeral port range* defined by
+`/proc/sys/net/ipv4/ip_local_port_range`. To find the mapping between the host
+ports and the exposed ports, use `docker port`.
**-p**, **--publish**=[]
Publish a container's port, or range of ports, to the host.
@@ -261,15 +306,15 @@ allow the container nearly all the same access to the host as processes running
outside of a container on the host.
**--read-only**=*true*|*false*
- Mount the container's root filesystem as read only.
+ Mount the container's root filesystem as read only.
- By default a container will have its root filesystem writable allowing processes
+ By default a container will have its root filesystem writable allowing processes
to write files anywhere. By specifying the `--read-only` flag the container will have
its root filesystem mounted as read only prohibiting any writes.
-**--restart**=""
+**--restart**="no"
Restart policy to apply when a container exits (no, on-failure[:max-retry], always)
-
+
**--rm**=*true*|*false*
Automatically remove the container when it exits (incompatible with -d). The default is *false*.
@@ -312,16 +357,20 @@ read-write. See examples.
**--volumes-from**=[]
Mount volumes from the specified container(s)
- Will mount volumes from the specified container identified by container-id.
-Once a volume is mounted in a one container it can be shared with other
-containers using the **--volumes-from** option when running those other
-containers. The volumes can be shared even if the original container with the
-mount is not running.
+ Mounts already mounted volumes from a source container onto another
+ container. You must supply the source's container-id. To share
+ a volume, use the **--volumes-from** option when running
+ the target container. You can share volumes even if the source container
+ is not running.
+
+ By default, Docker mounts the volumes in the same mode (read-write or
+ read-only) as it is mounted in the source container. Optionally, you
+ can change this by suffixing the container-id with either the `:ro` or
+ `:rw ` keyword.
- The container ID may be optionally suffixed with :ro or
-:rw to mount the volumes in read-only or read-write mode, respectively. By
-default, the volumes are mounted in the same mode (read write or read only) as
-the reference container.
+ If the location of the volume from the source container overlaps with
+ data residing on a target container, then the volume hides
+ that data on the target.
**-w**, **--workdir**=""
Working directory inside the container
diff --git a/docs/man/docker-save.1.md b/docs/man/docker-save.1.md
index 987d18b84b..91be06c350 100644
--- a/docs/man/docker-save.1.md
+++ b/docs/man/docker-save.1.md
@@ -35,6 +35,9 @@ fedora image to a fedora-latest.tar:
$ ls -sh fedora-latest.tar
367M fedora-latest.tar
+# See also
+**docker-load(1)** to load an image from a tar archive on STDIN.
+
# HISTORY
April 2014, Originally compiled by William Henry (whenry at redhat dot com)
based on docker.com source material and internal work.
diff --git a/docs/man/docker-search.1.md b/docs/man/docker-search.1.md
index 0b9df1015c..3c8e0a7b16 100644
--- a/docs/man/docker-search.1.md
+++ b/docs/man/docker-search.1.md
@@ -14,10 +14,9 @@ TERM
# DESCRIPTION
-Search an index for an image with that matches the term TERM. The table
-of images returned displays the name, description (truncated by default),
-number of stars awarded, whether the image is official, and whether it
-is automated.
+Search Docker Hub for an image with that matches the specified `TERM`. The table
+of images returned displays the name, description (truncated by default), number
+of stars awarded, whether the image is official, and whether it is automated.
*Note* - Search queries will only return up to 25 results
@@ -36,9 +35,9 @@ is automated.
# EXAMPLES
-## Search the registry for ranked images
+## Search Docker Hub for ranked images
-Search the registry for the term 'fedora' and only display those images
+Search a registry for the term 'fedora' and only display those images
ranked 3 or higher:
$ sudo docker search -s 3 fedora
@@ -48,9 +47,9 @@ ranked 3 or higher:
mattdm/fedora-small A small Fedora image on which to build. Co... 8
goldmann/wildfly A WildFly application server running on a ... 3 [OK]
-## Search the registry for automated images
+## Search Docker Hub for automated images
-Search the registry for the term 'fedora' and only display automated images
+Search Docker Hub for the term 'fedora' and only display automated images
ranked 1 or higher:
$ sudo docker search -s 1 -t fedora
@@ -62,3 +61,5 @@ ranked 1 or higher:
April 2014, Originally compiled by William Henry (whenry at redhat dot com)
based on docker.com source material and internal work.
June 2014, updated by Sven Dowideit <SvenDowideit@home.org.au>
+April 2015, updated by Mary Anthony for v2 <mary@docker.com>
+
diff --git a/docs/man/docker-start.1.md b/docs/man/docker-start.1.md
index 965c5bcaf7..523b315594 100644
--- a/docs/man/docker-start.1.md
+++ b/docs/man/docker-start.1.md
@@ -2,7 +2,7 @@
% Docker Community
% JUNE 2014
# NAME
-docker-start - Restart a stopped container
+docker-start - Start one or more stopped containers
# SYNOPSIS
**docker start**
@@ -13,7 +13,7 @@ CONTAINER [CONTAINER...]
# DESCRIPTION
-Start a stopped container.
+Start one or more stopped containers.
# OPTIONS
**-a**, **--attach**=*true*|*false*
@@ -25,6 +25,9 @@ Start a stopped container.
**-i**, **--interactive**=*true*|*false*
Attach container's STDIN. The default is *false*.
+# See also
+**docker-stop(1)** to stop a running container.
+
# HISTORY
April 2014, Originally compiled by William Henry (whenry at redhat dot com)
based on docker.com source material and internal work.
diff --git a/docs/man/docker-stats.1.md b/docs/man/docker-stats.1.md
index 968babab53..493e402fb2 100644
--- a/docs/man/docker-stats.1.md
+++ b/docs/man/docker-stats.1.md
@@ -7,14 +7,12 @@ docker-stats - Display a live stream of one or more containers' resource usage s
# SYNOPSIS
**docker stats**
[**--help**]
-[CONTAINERS]
+CONTAINER [CONTAINER...]
# DESCRIPTION
Display a live stream of one or more containers' resource usage statistics
-Note: this functionality currently only works when using the *libcontainer* exec-driver.
-
# OPTIONS
**--help**
Print usage statement
diff --git a/docs/man/docker-stop.1.md b/docs/man/docker-stop.1.md
index 09972347af..9b882db49d 100644
--- a/docs/man/docker-stop.1.md
+++ b/docs/man/docker-stop.1.md
@@ -21,6 +21,9 @@ Stop a running container (Send SIGTERM, and then SIGKILL after
**-t**, **--time**=10
Number of seconds to wait for the container to stop before killing it. Default is 10 seconds.
+#See also
+**docker-start(1)** to restart a stopped container.
+
# HISTORY
April 2014, Originally compiled by William Henry (whenry at redhat dot com)
based on docker.com source material and internal work.
diff --git a/docs/man/docker-tag.1.md b/docs/man/docker-tag.1.md
index 20125e5dfc..898ecd8a1c 100644
--- a/docs/man/docker-tag.1.md
+++ b/docs/man/docker-tag.1.md
@@ -8,11 +8,14 @@ docker-tag - Tag an image into a repository
**docker tag**
[**-f**|**--force**[=*false*]]
[**--help**]
-IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
+IMAGE[:TAG] [REGISTRY_HOST/][USERNAME/]NAME[:TAG]
# DESCRIPTION
-This will give a new alias to an image in the repository. This refers to the
-entire image name including the optional TAG after the ':'.
+Assigns a new alias to an image in a registry. An alias refers to the
+entire image name including the optional `TAG` after the ':'.
+
+If you do not specify a `REGISTRY_HOST`, the command uses Docker's public
+registry located at `registry-1.docker.io` by default.
# "OPTIONS"
**-f**, **--force**=*true*|*false*
@@ -58,3 +61,5 @@ April 2014, Originally compiled by William Henry (whenry at redhat dot com)
based on docker.com source material and internal work.
June 2014, updated by Sven Dowideit <SvenDowideit@home.org.au>
July 2014, updated by Sven Dowideit <SvenDowideit@home.org.au>
+April 2015, updated by Mary Anthony for v2 <mary@docker.com>
+
diff --git a/docs/man/docker-unpause.1.md b/docs/man/docker-unpause.1.md
index dfce16324e..466e1bb1a3 100644
--- a/docs/man/docker-unpause.1.md
+++ b/docs/man/docker-unpause.1.md
@@ -6,7 +6,7 @@ docker-unpause - Unpause all processes within a container
# SYNOPSIS
**docker unpause**
-CONTAINER
+CONTAINER [CONTAINER...]
# DESCRIPTION
@@ -20,5 +20,8 @@ further details.
# OPTIONS
There are no available options.
+# See also
+**docker-pause(1)** to pause all processes within a container.
+
# HISTORY
June 2014, updated by Sven Dowideit <SvenDowideit@home.org.au>
diff --git a/docs/man/docker.1.md b/docs/man/docker.1.md
index 1e0016f536..bcb9d25414 100644
--- a/docs/man/docker.1.md
+++ b/docs/man/docker.1.md
@@ -23,34 +23,29 @@ its own man page which explain usage and arguments.
To see the man page for a command run **man docker <command>**.
# OPTIONS
-**-D**=*true*|*false*
- Enable debug mode. Default is false.
-
-**--help**
+**-h**, **--help**
Print usage statement
-**-H**, **--host**=[unix:///var/run/docker.sock]: tcp://[host:port] to bind or
-unix://[/path/to/socket] to use.
- The socket(s) to bind to in daemon mode specified using one or more
- tcp://host:port, unix:///path/to/socket, fd://* or fd://socketfd.
-
-**--api-enable-cors**=*true*|*false*
- Enable CORS headers in the remote API. Default is false.
+**--api-cors-header**=""
+ Set CORS headers in the remote API. Default is cors disabled. Give urls like "http://foo, http://bar, ...". Give "*" to allow all.
-**-b**=""
+**-b**, **--bridge**=""
Attach containers to a pre\-existing network bridge; use 'none' to disable container networking
**--bip**=""
Use the provided CIDR notation address for the dynamically created bridge (docker0); Mutually exclusive of \-b
-**-d**=*true*|*false*
+**-D**, **--debug**=*true*|*false*
+ Enable debug mode. Default is false.
+
+**-d**, **--daemon**=*true*|*false*
Enable daemon mode. Default is false.
**--dns**=""
Force Docker to use specific DNS servers
-**-g**=""
- Path to use as the root of the Docker runtime. Default is `/var/lib/docker`.
+**-e**, **--exec-driver**=""
+ Force Docker to use specific exec driver. Default is `native`.
**--fixed-cidr**=""
IPv4 subnet for fixed IPs (e.g., 10.20.0.0/16); this subnet must be nested in the bridge subnet (which is defined by \-b or \-\-bip)
@@ -58,6 +53,18 @@ unix://[/path/to/socket] to use.
**--fixed-cidr-v6**=""
IPv6 subnet for global IPv6 addresses (e.g., 2a00:1450::/64)
+**-G**, **--group**=""
+ Group to assign the unix socket specified by -H when running in daemon mode.
+ use '' (the empty string) to disable setting of a group. Default is `docker`.
+
+**-g**, **--graph**=""
+ Path to use as the root of the Docker runtime. Default is `/var/lib/docker`.
+
+**-H**, **--host**=[unix:///var/run/docker.sock]: tcp://[host:port] to bind or
+unix://[/path/to/socket] to use.
+ The socket(s) to bind to in daemon mode specified using one or more
+ tcp://host:port, unix:///path/to/socket, fd://* or fd://socketfd.
+
**--icc**=*true*|*false*
Allow unrestricted inter\-container and Docker daemon host communication. If disabled, containers can still be linked together using **--link** option (see **docker-run(1)**). Default is true.
@@ -71,7 +78,7 @@ unix://[/path/to/socket] to use.
Enable IP masquerading for bridge's IP range. Default is true.
**--iptables**=*true*|*false*
- Disable Docker's addition of iptables rules. Default is true.
+ Enable Docker's addition of iptables rules. Default is true.
**--ipv6**=*true*|*false*
Enable IPv6 support. Default is false. Docker will create an IPv6-enabled bridge with address fe80::1 which will allow you to create IPv6-enabled containers. Use together with `--fixed-cidr-v6` to provide globally routable IPv6 addresses. IPv6 forwarding will be enabled if not used with `--ip-forward=false`. This may collide with your host's current IPv6 settings. For more information please consult the documentation about "Advanced Networking - IPv6".
@@ -82,22 +89,33 @@ unix://[/path/to/socket] to use.
**--label**="[]"
Set key=value labels to the daemon (displayed in `docker info`)
+**--log-driver**="*json-file*|*syslog*|*none*"
+ Container's logging driver. Default is `default`.
+ **Warning**: `docker logs` command works only for `json-file` logging driver.
+
**--mtu**=VALUE
- Set the containers network mtu. Default is `1500`.
+ Set the containers network mtu. Default is `0`.
-**-p**=""
+**-p**, **--pidfile**=""
Path to use for daemon PID file. Default is `/var/run/docker.pid`
**--registry-mirror**=<scheme>://<host>
Prepend a registry mirror to be used for image pulls. May be specified multiple times.
-**-s**=""
+**-s**, **--storage-driver**=""
Force the Docker runtime to use a specific storage driver.
**--storage-opt**=[]
Set storage driver options. See STORAGE DRIVER OPTIONS.
-**-v**=*true*|*false*
+**-tls**=*true*|*false*
+ Use TLS; implied by --tlsverify. Default is false.
+
+**-tlsverify**=*true*|*false*
+ Use TLS and verify the remote (daemon: verify client, client: verify daemon).
+ Default is false.
+
+**-v**, **--version**=*true*|*false*
Print version information and quit. Default is false.
**--selinux-enabled**=*true*|*false*
@@ -114,7 +132,7 @@ unix://[/path/to/socket] to use.
Create a new image from a container's changes
**docker-cp(1)**
- Copy files/folders from a container's filesystem to the host at path
+ Copy files/folders from a container's filesystem to the host
**docker-create(1)**
Create a new container
@@ -154,10 +172,10 @@ inside it)
Load an image from a tar archive
**docker-login(1)**
- Register or Login to a Docker registry server
+ Register or login to a Docker Registry Service
**docker-logout(1)**
- Log the user out of a Docker registry server
+ Log the user out of a Docker Registry Service
**docker-logs(1)**
Fetch the logs of a container
@@ -172,10 +190,10 @@ inside it)
List containers
**docker-pull(1)**
- Pull an image or a repository from a Docker registry server
+ Pull an image or a repository from a Docker Registry Service
**docker-push(1)**
- Push an image or a repository to a Docker registry server
+ Push an image or a repository to a Docker Registry Service
**docker-restart(1)**
Restart a running container
@@ -198,6 +216,9 @@ inside it)
**docker-start(1)**
Start a stopped container
+**docker-stats(1)**
+ Display a live stream of one or more containers' resource usage statistics
+
**docker-stop(1)**
Stop a running container
@@ -296,7 +317,7 @@ for data and metadata:
For specific client examples please see the man page for the specific Docker
command. For example:
- man docker run
+ man docker-run
# HISTORY
April 2014, Originally compiled by William Henry (whenry at redhat dot com) based on docker.com source material and internal work.
diff --git a/docs/mkdocs-compose.yml b/docs/mkdocs-compose.yml
deleted file mode 100644
index e2738f328d..0000000000
--- a/docs/mkdocs-compose.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-- ['compose/userguide.md', 'User Guide', 'Docker Compose' ]
-- ['compose/install.md', 'Installation', 'Docker Compose']
-- ['compose/cli.md', 'Reference', 'Compose command line']
-- ['compose/yml.md', 'Reference', 'Compose yml']
diff --git a/docs/mkdocs-machine.yml b/docs/mkdocs-machine.yml
deleted file mode 100644
index 45b2c5c846..0000000000
--- a/docs/mkdocs-machine.yml
+++ /dev/null
@@ -1,2 +0,0 @@
-
-- ['machine/userguide.md', 'User Guide', 'Docker Machine' ]
diff --git a/docs/mkdocs-swarm.yml b/docs/mkdocs-swarm.yml
deleted file mode 100644
index 5c9654f8f8..0000000000
--- a/docs/mkdocs-swarm.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-- ['swarm/README.md', 'User Guide', 'Docker Swarm' ]
-- ['swarm/discovery.md', 'Reference', 'Swarm discovery']
-- ['swarm/API.md', 'Reference', 'Swarm API']
-- ['swarm/scheduler/filter.md', 'Reference', 'Swarm filters']
diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml
index 332be55bfd..30f2d11624 100644
--- a/docs/mkdocs.yml
+++ b/docs/mkdocs.yml
@@ -31,24 +31,27 @@ pages:
# Installation:
- ['installation/index.md', '**HIDDEN**']
-- ['installation/mac.md', 'Installation', 'Mac OS X']
- ['installation/ubuntulinux.md', 'Installation', 'Ubuntu']
-- ['installation/rhel.md', 'Installation', 'Red Hat Enterprise Linux']
-- ['installation/oracle.md', 'Installation', 'Oracle Linux']
+- ['installation/mac.md', 'Installation', 'Mac OS X']
+- ['installation/windows.md', 'Installation', 'Microsoft Windows']
+- ['installation/amazon.md', 'Installation', 'Amazon EC2']
+- ['installation/archlinux.md', 'Installation', 'Arch Linux']
+- ['installation/binaries.md', 'Installation', 'Binaries']
- ['installation/centos.md', 'Installation', 'CentOS']
+- ['installation/cruxlinux.md', 'Installation', 'CRUX Linux']
- ['installation/debian.md', 'Installation', 'Debian']
-- ['installation/gentoolinux.md', 'Installation', 'Gentoo']
+- ['installation/fedora.md', 'Installation', 'Fedora']
+- ['installation/frugalware.md', 'Installation', 'FrugalWare']
- ['installation/google.md', 'Installation', 'Google Cloud Platform']
-- ['installation/rackspace.md', 'Installation', 'Rackspace Cloud']
-- ['installation/amazon.md', 'Installation', 'Amazon EC2']
+- ['installation/gentoolinux.md', 'Installation', 'Gentoo']
- ['installation/softlayer.md', 'Installation', 'IBM Softlayer']
-- ['installation/archlinux.md', 'Installation', 'Arch Linux']
-- ['installation/frugalware.md', 'Installation', 'FrugalWare']
-- ['installation/fedora.md', 'Installation', 'Fedora']
+- ['installation/joyent.md', 'Installation', 'Joyent Compute Service']
+- ['installation/azure.md', 'Installation', 'Microsoft Azure']
+- ['installation/rackspace.md', 'Installation', 'Rackspace Cloud']
+- ['installation/rhel.md', 'Installation', 'Red Hat Enterprise Linux']
+- ['installation/oracle.md', 'Installation', 'Oracle Linux']
- ['installation/SUSE.md', 'Installation', 'SUSE']
-- ['installation/cruxlinux.md', 'Installation', 'CRUX Linux']
-- ['installation/windows.md', 'Installation', 'Microsoft Windows']
-- ['installation/binaries.md', 'Installation', 'Binaries']
+- ['compose/install.md', 'Installation', 'Docker Compose']
# User Guide:
- ['userguide/index.md', 'User Guide', 'The Docker User Guide' ]
@@ -58,9 +61,13 @@ pages:
- ['userguide/dockerimages.md', 'User Guide', 'Working with Docker Images' ]
- ['userguide/dockerlinks.md', 'User Guide', 'Linking containers together' ]
- ['userguide/dockervolumes.md', 'User Guide', 'Managing data in containers' ]
+- ['userguide/labels-custom-metadata.md', 'User Guide', 'Apply custom metadata' ]
- ['userguide/dockerrepos.md', 'User Guide', 'Working with Docker Hub' ]
- ['userguide/level1.md', '**HIDDEN**' ]
- ['userguide/level2.md', '**HIDDEN**' ]
+- ['compose/index.md', 'User Guide', 'Docker Compose' ]
+- ['machine/index.md', 'User Guide', 'Docker Machine' ]
+- ['swarm/index.md', 'User Guide', 'Docker Swarm' ]
# Docker Hub docs:
- ['docker-hub/index.md', 'Docker Hub', 'Docker Hub' ]
@@ -84,6 +91,9 @@ pages:
- ['examples/running_ssh_service.md', 'Examples', 'Dockerizing an SSH service']
- ['examples/couchdb_data_volumes.md', 'Examples', 'Dockerizing a CouchDB service']
- ['examples/apt-cacher-ng.md', 'Examples', 'Dockerizing an Apt-Cacher-ng service']
+- ['compose/django.md', 'Examples', 'Getting started with Compose and Django']
+- ['compose/rails.md', 'Examples', 'Getting started with Compose and Rails']
+- ['compose/wordpress.md', 'Examples', 'Getting started with Compose and Wordpress']
# Articles
- ['articles/index.md', '**HIDDEN**']
@@ -109,16 +119,35 @@ pages:
# Reference
- ['reference/index.md', '**HIDDEN**']
- ['reference/commandline/index.md', '**HIDDEN**']
-- ['reference/commandline/cli.md', 'Reference', 'Command line']
+- ['reference/commandline/cli.md', 'Reference', 'Docker command line']
- ['reference/builder.md', 'Reference', 'Dockerfile']
- ['faq.md', 'Reference', 'FAQ']
- ['reference/run.md', 'Reference', 'Run Reference']
+- ['compose/cli.md', 'Reference', 'Compose command line']
+- ['compose/yml.md', 'Reference', 'Compose yml']
+- ['compose/env.md', 'Reference', 'Compose ENV variables']
+- ['compose/completion.md', 'Reference', 'Compose commandline completion']
+- ['swarm/discovery.md', 'Reference', 'Swarm discovery']
+- ['swarm/scheduler/strategy.md', 'Reference', 'Swarm strategies']
+- ['swarm/scheduler/filter.md', 'Reference', 'Swarm filters']
+- ['swarm/API.md', 'Reference', 'Swarm API']
- ['reference/api/index.md', '**HIDDEN**']
+- ['registry/overview.md', 'Reference', 'Docker Registry 2.0']
+- ['registry/deploying.md', 'Reference', '&nbsp;&nbsp;&nbsp;&nbsp;&blacksquare;&nbsp; Deploy a registry' ]
+- ['registry/configuration.md', 'Reference', '&nbsp;&nbsp;&nbsp;&nbsp;&blacksquare;&nbsp; Configure a registry' ]
+- ['registry/storagedrivers.md', 'Reference', '&nbsp;&nbsp;&nbsp;&nbsp;&blacksquare;&nbsp; Storage driver model' ]
+- ['registry/notifications.md', 'Reference', '&nbsp;&nbsp;&nbsp;&nbsp;&blacksquare;&nbsp; Work with notifications' ]
+- ['registry/spec/api.md', 'Reference', '&nbsp;&nbsp;&nbsp;&nbsp;&blacksquare;&nbsp; Registry Service API v2' ]
+- ['registry/spec/json.md', 'Reference', '&nbsp;&nbsp;&nbsp;&nbsp;&blacksquare;&nbsp; JSON format' ]
+- ['registry/spec/auth/token.md', 'Reference', '&nbsp;&nbsp;&nbsp;&nbsp;&blacksquare;&nbsp; Authenticate via central service' ]
+- ['reference/api/hub_registry_spec.md', 'Reference', 'Docker Hub and Registry 1.0']
+- ['reference/api/registry_api.md', 'Reference', '&nbsp;&nbsp;&nbsp;&nbsp;&blacksquare;&nbsp;Docker Registry API v1']
+- ['reference/api/registry_api_client_libraries.md', 'Reference', '&nbsp;&nbsp;&nbsp;&nbsp;&blacksquare;&nbsp;Docker Registry 1.0 API Client Libraries']
+#- ['reference/image-spec-v1.md', 'Reference', 'Docker Image Specification v1.0.0']
- ['reference/api/docker-io_api.md', 'Reference', 'Docker Hub API']
-- ['reference/api/registry_api.md', 'Reference', 'Docker Registry API']
-- ['reference/api/registry_api_client_libraries.md', 'Reference', 'Docker Registry API Client Libraries']
-- ['reference/api/hub_registry_spec.md', 'Reference', 'Docker Hub and Registry Spec']
+#- ['reference/image-spec-v1.md', 'Reference', 'Docker Image Specification v1.0.0']
- ['reference/api/docker_remote_api.md', 'Reference', 'Docker Remote API']
+- ['reference/api/docker_remote_api_v1.18.md', 'Reference', 'Docker Remote API v1.18']
- ['reference/api/docker_remote_api_v1.17.md', 'Reference', 'Docker Remote API v1.17']
- ['reference/api/docker_remote_api_v1.16.md', 'Reference', 'Docker Remote API v1.16']
- ['reference/api/docker_remote_api_v1.15.md', '**HIDDEN**']
@@ -152,8 +181,21 @@ pages:
- ['terms/filesystem.md', '**HIDDEN**']
- ['terms/image.md', '**HIDDEN**']
-# Contribute:
-- ['contributing/index.md', '**HIDDEN**']
-- ['contributing/contributing.md', 'Contribute', 'Contributing']
-- ['contributing/devenvironment.md', 'Contribute', 'Development environment']
-- ['contributing/docs_style-guide.md', 'Contribute', 'Documentation style guide']
+
+# Project:
+- ['project/index.md', '**HIDDEN**']
+- ['project/who-written-for.md', 'Contributor Guide', 'README first']
+- ['project/software-required.md', 'Contributor Guide', 'Get required software']
+- ['project/set-up-git.md', 'Contributor Guide', 'Configure Git for contributing']
+- ['project/set-up-dev-env.md', 'Contributor Guide', 'Work with a development container']
+- ['project/test-and-docs.md', 'Contributor Guide', 'Run tests and test documentation']
+- ['project/make-a-contribution.md', 'Contributor Guide', 'Understand contribution workflow']
+- ['project/find-an-issue.md', 'Contributor Guide', 'Find an issue']
+- ['project/work-issue.md', 'Contributor Guide', 'Work on an issue']
+- ['project/create-pr.md', 'Contributor Guide', 'Create a pull request']
+- ['project/review-pr.md', 'Contributor Guide', 'Participate in the PR review']
+- ['project/advanced-contributing.md', 'Contributor Guide', 'Advanced contributing']
+- ['project/get-help.md', 'Contributor Guide', 'Where to get help']
+- ['project/coding-style.md', 'Contributor Guide', 'Coding style guide']
+- ['project/doc-style.md', 'Contributor Guide', 'Documentation style guide']
+
diff --git a/docs/release.sh b/docs/release.sh
index 975940f5d5..74e8085de2 100755
--- a/docs/release.sh
+++ b/docs/release.sh
@@ -1,4 +1,4 @@
-#!/usr/bin/env bash
+#!/bin/bash
set -e
set -o pipefail
@@ -16,57 +16,38 @@ make AWS_S3_BUCKET=docs-stage.docker.com docs-release
will then push the documentation site to your s3 bucket.
Note: you can add `OPTIONS=--dryrun` to see what will be done without sending to the server
+ You can also add NOCACHE=1 to publish without a cache, which is what we do for the master docs.
EOF
exit 1
}
-[ "$AWS_S3_BUCKET" ] || usage
-
-VERSION=$(cat VERSION)
-
-if [ "$AWS_S3_BUCKET" == "docs.docker.com" ]; then
- if [ "${VERSION%-dev}" != "$VERSION" ]; then
- echo "Please do not push '-dev' documentation to docs.docker.com ($VERSION)"
- exit 1
+create_robots_txt() {
+ if [ "$AWS_S3_BUCKET" == "docs.docker.com" ]; then
+ cat > ./sources/robots.txt <<-'EOF'
+ User-agent: *
+ Allow: /
+ EOF
+ else
+ cat > ./sources/robots.txt <<-'EOF'
+ User-agent: *
+ Disallow: /
+ EOF
fi
- cat > ./sources/robots.txt <<'EOF'
-User-agent: *
-Allow: /
-EOF
-
-else
- cat > ./sources/robots.txt <<'EOF'
-User-agent: *
-Disallow: /
-EOF
-fi
-
-# Remove the last version - 1.0.2-dev -> 1.0
-MAJOR_MINOR="v${VERSION%.*}"
-export MAJOR_MINOR
-
-export BUCKET=$AWS_S3_BUCKET
-
-export AWS_CONFIG_FILE=$(pwd)/awsconfig
-[ -e "$AWS_CONFIG_FILE" ] || usage
-export AWS_DEFAULT_PROFILE=$BUCKET
-
-echo "cfg file: $AWS_CONFIG_FILE ; profile: $AWS_DEFAULT_PROFILE"
+}
setup_s3() {
- echo "Create $BUCKET"
# Try creating the bucket. Ignore errors (it might already exist).
+ echo "create $BUCKET if it does not exist"
aws s3 mb --profile $BUCKET s3://$BUCKET 2>/dev/null || true
+
# Check access to the bucket.
echo "test $BUCKET exists"
aws s3 --profile $BUCKET ls s3://$BUCKET
+
# Make the bucket accessible through website endpoints.
echo "make $BUCKET accessible as a website"
#aws s3 website s3://$BUCKET --index-document index.html --error-document jsearch/index.html
- s3conf=$(cat s3_website.json | envsubst)
- echo
- echo $s3conf
- echo
+ local s3conf=$(cat s3_website.json | envsubst)
aws s3api --profile $BUCKET put-bucket-website --bucket $BUCKET --website-configuration "$s3conf"
}
@@ -86,51 +67,44 @@ upload_current_documentation() {
cache=no-cache
fi
- echo
- echo "Uploading $src"
- echo " to $dst"
- echo
+ printf "\nUploading $src to $dst\n"
# a really complicated way to send only the files we want
# if there are too many in any one set, aws s3 sync seems to fall over with 2 files to go
# versions.html_fragment
- include="--recursive --include \"*.$i\" "
- echo "uploading *.$i"
- run="aws s3 cp $src $dst $OPTIONS --profile $BUCKET --cache-control $cache --acl public-read $include"
- echo "======================="
- echo "$run"
- echo "======================="
- $run
+ include="--recursive --include \"*.$i\" "
+ run="aws s3 cp $src $dst $OPTIONS --profile $BUCKET --cache-control $cache --acl public-read $include"
+ printf "\n=====\n$run\n=====\n"
+ $run
# Make sure the search_content.json.gz file has the right content-encoding
aws s3 cp --profile $BUCKET --cache-control $cache --content-encoding="gzip" --acl public-read "site/search_content.json.gz" "$dst"
}
invalidate_cache() {
- if [ "" == "$DISTRIBUTION_ID" ]; then
+ if [[ -z "$DISTRIBUTION_ID" ]]; then
echo "Skipping Cloudfront cache invalidation"
return
fi
dst=$1
- #aws cloudfront create-invalidation --profile docs.docker.com --distribution-id $DISTRIBUTION_ID --invalidation-batch '{"Paths":{"Quantity":1, "Items":["'+$file+'"]},"CallerReference":"19dec2014sventest1"}'
aws configure set preview.cloudfront true
- files=($(cat changed-files | grep 'sources/.*$' | sed -E 's#.*docs/sources##' | sed -E 's#index\.md#index.html#' | sed -E 's#\.md#/index.html#'))
- files[${#files[@]}]="/index.html"
- files[${#files[@]}]="/versions.html_fragment"
+ # Get all the files
+ # not .md~ files
+ # replace spaces w %20 so urlencoded
+ files=( $(find site/ -not -name "*.md*" -type f | sed 's/site//g' | sed 's/ /%20/g') )
len=${#files[@]}
+ last_file=${files[$((len-1))]}
echo "aws cloudfront create-invalidation --profile $AWS_S3_BUCKET --distribution-id $DISTRIBUTION_ID --invalidation-batch '" > batchfile
echo "{\"Paths\":{\"Quantity\":$len," >> batchfile
echo "\"Items\": [" >> batchfile
- #for file in $(cat changed-files | grep 'sources/.*$' | sed -E 's#.*docs/sources##' | sed -E 's#index\.md#index.html#' | sed -E 's#\.md#/index.html#')
- for file in "${files[@]}"
- do
- if [ "$file" == "${files[${#files[@]}-1]}" ]; then
+ for file in "${files[@]}" ; do
+ if [[ $file == $last_file ]]; then
comma=""
else
comma=","
@@ -138,33 +112,65 @@ invalidate_cache() {
echo "\"$dst$file\"$comma" >> batchfile
done
- echo "]}, \"CallerReference\":" >> batchfile
- echo "\"$(date)\"}'" >> batchfile
-
+ echo "]}, \"CallerReference\":\"$(date)\"}'" >> batchfile
- echo "-----"
- cat batchfile
- echo "-----"
sh batchfile
- echo "-----"
}
+main() {
+ [ "$AWS_S3_BUCKET" ] || usage
-if [ "$OPTIONS" != "--dryrun" ]; then
- setup_s3
-fi
+ # Make sure there is an awsconfig file
+ export AWS_CONFIG_FILE=$(pwd)/awsconfig
+ [ -f "$AWS_CONFIG_FILE" ] || usage
-# Default to only building the version specific docs so we don't clober the latest by accident with old versions
-if [ "$BUILD_ROOT" == "yes" ]; then
- echo "Building root documentation"
+ # Get the version
+ VERSION=$(cat VERSION)
+
+ # Disallow pushing dev docs to master
+ if [ "$AWS_S3_BUCKET" == "docs.docker.com" ] && [ "${VERSION%-dev}" != "$VERSION" ]; then
+ echo "Please do not push '-dev' documentation to docs.docker.com ($VERSION)"
+ exit 1
+ fi
+
+ # Clean version - 1.0.2-dev -> 1.0
+ export MAJOR_MINOR="v${VERSION%.*}"
+
+ export BUCKET=$AWS_S3_BUCKET
+ export AWS_DEFAULT_PROFILE=$BUCKET
+
+ # debug variables
+ echo "bucket: $BUCKET, full version: $VERSION, major-minor: $MAJOR_MINOR"
+ echo "cfg file: $AWS_CONFIG_FILE ; profile: $AWS_DEFAULT_PROFILE"
+
+ # create the robots.txt
+ create_robots_txt
+
+ if [ "$OPTIONS" != "--dryrun" ]; then
+ setup_s3
+ fi
+
+ # Default to only building the version specific docs
+ # so we don't clober the latest by accident with old versions
+ if [ "$BUILD_ROOT" == "yes" ]; then
+ echo "Building root documentation"
+ build_current_documentation
+
+ echo "Uploading root documentation"
+ upload_current_documentation
+ [ "$NOCACHE" ] || invalidate_cache
+ fi
+
+ #build again with /v1.0/ prefix
+ sed -i "s/^site_url:.*/site_url: \/$MAJOR_MINOR\//" mkdocs.yml
+ echo "Building the /$MAJOR_MINOR/ documentation"
build_current_documentation
- upload_current_documentation
- [ "$NOCACHE" ] || invalidate_cache
-fi
-
-#build again with /v1.0/ prefix
-sed -i "s/^site_url:.*/site_url: \/$MAJOR_MINOR\//" mkdocs.yml
-echo "Building the /$MAJOR_MINOR/ documentation"
-build_current_documentation
-upload_current_documentation "/$MAJOR_MINOR/"
-[ "$NOCACHE" ] || invalidate_cache "/$MAJOR_MINOR"
+
+ echo "Uploading the documentation"
+ upload_current_documentation "/$MAJOR_MINOR/"
+
+ # Invalidating cache
+ [ "$NOCACHE" ] || invalidate_cache "/$MAJOR_MINOR"
+}
+
+main
diff --git a/docs/s3_website.json b/docs/s3_website.json
index e468b678af..0ce0b8c292 100644
--- a/docs/s3_website.json
+++ b/docs/s3_website.json
@@ -12,6 +12,11 @@
{ "Condition": { "KeyPrefixEquals": "jsearch/index.html" }, "Redirect": { "HostName": "$BUCKET", "ReplaceKeyPrefixWith": "jsearch/" } },
{ "Condition": { "KeyPrefixEquals": "index/" }, "Redirect": { "HostName": "$BUCKET", "ReplaceKeyPrefixWith": "docker-io/" } },
{ "Condition": { "KeyPrefixEquals": "reference/api/index_api/" }, "Redirect": { "HostName": "$BUCKET", "ReplaceKeyPrefixWith": "reference/api/docker-io_api/" } },
+ { "Condition": { "KeyPrefixEquals": "docker-hub/groups.png" }, "Redirect": { "HostName": "$BUCKET", "ReplaceKeyPrefixWith": "docker-hub/hub-images/groups.png" } },
+ { "Condition": { "KeyPrefixEquals": "docker-hub/hub.png" }, "Redirect": { "HostName": "$BUCKET", "ReplaceKeyPrefixWith": "docker-hub/hub-images/hub.png" } },
+ { "Condition": { "KeyPrefixEquals": "docker-hub/invite.png" }, "Redirect": { "HostName": "$BUCKET", "ReplaceKeyPrefixWith": "docker-hub/hub-images/invite.png" } },
+ { "Condition": { "KeyPrefixEquals": "docker-hub/orgs.png" }, "Redirect": { "HostName": "$BUCKET", "ReplaceKeyPrefixWith": "docker-hub/hub-images/orgs.png" } },
+ { "Condition": { "KeyPrefixEquals": "docker-hub/repos.png" }, "Redirect": { "HostName": "$BUCKET", "ReplaceKeyPrefixWith": "docker-hub/hub-images/repos.png" } },
{ "Condition": { "KeyPrefixEquals": "examples/hello_world/" }, "Redirect": { "HostName": "$BUCKET", "ReplaceKeyPrefixWith": "userguide/dockerizing/" } },
{ "Condition": { "KeyPrefixEquals": "examples/python_web_app/" }, "Redirect": { "HostName": "$BUCKET", "ReplaceKeyPrefixWith": "userguide/dockerizing/" } },
{ "Condition": { "KeyPrefixEquals": "use/working_with_volumes/" }, "Redirect": { "HostName": "$BUCKET", "ReplaceKeyPrefixWith": "userguide/dockervolumes/" } },
@@ -31,7 +36,11 @@
{ "Condition": { "KeyPrefixEquals": "examples/using_supervisord/" }, "Redirect": { "HostName": "$BUCKET", "ReplaceKeyPrefixWith": "articles/using_supervisord/" } },
{ "Condition": { "KeyPrefixEquals": "reference/api/registry_index_spec/" }, "Redirect": { "HostName": "$BUCKET", "ReplaceKeyPrefixWith": "reference/api/hub_registry_spec/" } },
{ "Condition": { "KeyPrefixEquals": "use/" }, "Redirect": { "HostName": "$BUCKET", "ReplaceKeyPrefixWith": "examples/" } },
- { "Condition": { "KeyPrefixEquals": "installation/openSUSE/" }, "Redirect": { "HostName": "$BUCKET", "ReplaceKeyPrefixWith": "installation/SUSE/" } }
+ { "Condition": { "KeyPrefixEquals": "installation/openSUSE/" }, "Redirect": { "HostName": "$BUCKET", "ReplaceKeyPrefixWith": "installation/SUSE/" } },
+ { "Condition": { "KeyPrefixEquals": "contributing/contributing/" }, "Redirect": { "HostName": "$BUCKET", "ReplaceKeyPrefixWith": "project/who-written-for/" } },
+ { "Condition": { "KeyPrefixEquals": "contributing/devenvironment/" }, "Redirect": { "HostName": "$BUCKET", "ReplaceKeyPrefixWith": "project/set-up-prereqs/" } },
+ { "Condition": { "KeyPrefixEquals": "contributing/docs_style-guide/" }, "Redirect": { "HostName": "$BUCKET", "ReplaceKeyPrefixWith": "project/doc-style/" } },
+ { "Condition": { "KeyPrefixEquals": "registry/" }, "Redirect": { "HostName": "$BUCKET", "ReplaceKeyPrefixWith": "registry/overview/" } }
]
}
diff --git a/docs/sources/article-img/ipv6_basic_host_config.gliffy b/docs/sources/article-img/ipv6_basic_host_config.gliffy
index f28c3f6f94..8d0450fc7c 100644
--- a/docs/sources/article-img/ipv6_basic_host_config.gliffy
+++ b/docs/sources/article-img/ipv6_basic_host_config.gliffy
@@ -1 +1 @@
-{"contentType":"application/gliffy+json","version":"1.3","stage":{"background":"#FFFFFF","width":420,"height":127,"nodeIndex":173,"autoFit":true,"exportBorder":false,"gridOn":false,"snapToGrid":false,"drawingGuidesOn":false,"pageBreaksOn":false,"printGridOn":false,"printPaper":"LETTER","printShrinkToFit":false,"printPortrait":true,"maxWidth":5000,"maxHeight":5000,"themeData":null,"viewportType":"default","fitBB":{"min":{"x":8.5,"y":0.5},"max":{"x":419.75,"y":126.5}},"objects":[{"x":6.5,"y":106.0,"rotation":0.0,"id":9,"width":150.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":20,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:12px;font-family:Arial;\"><span style=\"\">docker0 fe80::1/64</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":19.5,"y":8.0,"rotation":0.0,"id":7,"width":150.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":19,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:left;\"><span style=\"color:rgb(183, 183, 183);\">eth0 2001:db8:0:1::1/64</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":31.5,"y":23.5,"rotation":0.0,"id":4,"width":100.0,"height":75.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":16,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#a4c2f4","gradient":true,"dashStyle":null,"dropShadow":true,"state":0,"opacity":1.0,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":5,"width":96.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:12px;text-decoration:none;font-family:Arial;\"><span style=\"text-decoration:none;\">Host2</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[]}]},{"x":11.75,"y":0.5,"rotation":0.0,"id":60,"width":402.0,"height":126.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":2,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dashStyle":"2,2","dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[]},{"x":146.5,"y":82.0,"rotation":0.0,"id":164,"width":249.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":44,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:left;\"><span style=\"font-size:12px;font-family:Arial;\"><span style=\"\">route -A inet6 2001:db8:0:2::/64 </span></span><span style=\"\">dev docker0</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":146.5,"y":27.5,"rotation":0.0,"id":73,"width":249.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":35,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:left;\"><span style=\"color:#b7b7b7;\"><span style=\"\">route -A inet6 default gw fe80::1</span><span style=\"\"> dev eth0</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]}],"shapeStyles":{"com.gliffy.shape.basic.basic_v1.default":{"fill":"#fff2cc","stroke":"#333333","strokeWidth":2,"dashStyle":"2.0,2.0","gradient":true,"shadow":true}},"lineStyles":{"global":{"stroke":"#d9d9d9"}},"textStyles":{"global":{"italic":false,"size":"12px","color":"#b7b7b7"}}},"metadata":{"title":"untitled","revision":0,"exportBorder":false,"loadPosition":"default","libraries":["com.gliffy.libraries.basic.basic_v1.default","com.gliffy.libraries.flowchart.flowchart_v1.default","com.gliffy.libraries.swimlanes.swimlanes_v1.default","com.gliffy.libraries.uml.uml_v2.class","com.gliffy.libraries.uml.uml_v2.sequence","com.gliffy.libraries.uml.uml_v2.activity","com.gliffy.libraries.erd.erd_v1.default","com.gliffy.libraries.ui.ui_v3.containers_content","com.gliffy.libraries.ui.ui_v3.forms_controls","com.gliffy.libraries.images"],"autosaveDisabled":false},"embeddedResources":{"index":0,"resources":[]}} \ No newline at end of file
+{"contentType":"application/gliffy+json","version":"1.3","stage":{"background":"#FFFFFF","width":414,"height":127,"nodeIndex":173,"autoFit":true,"exportBorder":false,"gridOn":false,"snapToGrid":false,"drawingGuidesOn":false,"pageBreaksOn":false,"printGridOn":false,"printPaper":"LETTER","printShrinkToFit":false,"printPortrait":true,"maxWidth":5000,"maxHeight":5000,"themeData":null,"viewportType":"default","fitBB":{"min":{"x":8.5,"y":0.5},"max":{"x":413.75,"y":126.5}},"objects":[{"x":6.5,"y":106.0,"rotation":0.0,"id":9,"width":150.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":20,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:12px;font-family:Arial;\"><span style=\"\">docker0 fe80::1/64</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":19.5,"y":9.0,"rotation":0.0,"id":7,"width":150.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":19,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:left;\"><span style=\"color:rgb(183, 183, 183);\">eth0 2001:db8::1/64</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":31.5,"y":23.5,"rotation":0.0,"id":4,"width":100.0,"height":75.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":16,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#a4c2f4","gradient":true,"dashStyle":null,"dropShadow":true,"state":0,"opacity":1.0,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":5,"width":96.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:12px;text-decoration:none;font-family:Arial;\"><span style=\"text-decoration:none;\">Host2</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[]}]},{"x":11.75,"y":0.5,"rotation":0.0,"id":60,"width":402.0,"height":126.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":2,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dashStyle":"2,2","dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[]},{"x":146.5,"y":83.0,"rotation":0.0,"id":164,"width":249.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":44,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:left;\"><span style=\"font-size:12px;font-family:Arial;\"><span style=\"\">ip -6 route add 2001:db8:1::/64 </span></span><span style=\"\">dev docker0</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":146.5,"y":27.5,"rotation":0.0,"id":73,"width":249.0,"height":16.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":35,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:left;\"><span style=\"color:rgb(183, 183, 183);\"><span style=\"\">ip -6 route add default via fe80::1</span><span style=\"\"> dev eth0</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]}],"shapeStyles":{"com.gliffy.shape.basic.basic_v1.default":{"fill":"#fff2cc","stroke":"#333333","strokeWidth":2,"dashStyle":"2.0,2.0","gradient":true,"shadow":true}},"lineStyles":{"global":{"stroke":"#d9d9d9"}},"textStyles":{"global":{"size":"12px","color":"#b7b7b7"}}},"metadata":{"title":"untitled","revision":0,"exportBorder":false,"loadPosition":"default","libraries":["com.gliffy.libraries.basic.basic_v1.default","com.gliffy.libraries.flowchart.flowchart_v1.default","com.gliffy.libraries.swimlanes.swimlanes_v1.default","com.gliffy.libraries.uml.uml_v2.class","com.gliffy.libraries.uml.uml_v2.sequence","com.gliffy.libraries.uml.uml_v2.activity","com.gliffy.libraries.erd.erd_v1.default","com.gliffy.libraries.ui.ui_v3.containers_content","com.gliffy.libraries.ui.ui_v3.forms_controls","com.gliffy.libraries.images"],"autosaveDisabled":false},"embeddedResources":{"index":0,"resources":[]}} \ No newline at end of file
diff --git a/docs/sources/article-img/ipv6_basic_host_config.svg b/docs/sources/article-img/ipv6_basic_host_config.svg
index b5f9eeebeb..0095b8bdc7 100644
--- a/docs/sources/article-img/ipv6_basic_host_config.svg
+++ b/docs/sources/article-img/ipv6_basic_host_config.svg
@@ -1 +1 @@
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="439.75" height="146.5"><defs><linearGradient id="LTqAuhEQNvFp" x1="0px" x2="0px" y1="100px" y2="-50px" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#a4c2f4"/><stop offset="1" stop-color="#FFFFFF"/></linearGradient></defs><g transform="translate(0,0)"><g><rect fill="#FFFFFF" stroke="none" x="0" y="0" width="439.75" height="146.5"/></g><g transform="translate(0,0) matrix(1,0,0,1,11.75,0.5)"><g><g transform="translate(0,0) scale(4.02,1.26)"><g><path fill="#FFFFFF" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(0.24875621890547267,0.7936507936507936)"><path fill="none" stroke="none" d="M 0 0 L 401.99999999999994 0 Q 401.99999999999994 0 401.99999999999994 0 L 401.99999999999994 126 Q 401.99999999999994 126 401.99999999999994 126 L 0 126 Q 0 126 0 126 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" d="M 0 0 M 0 0 L 2 0 M 2 0 M 4 0 L 6 0 M 6 0 M 8 0 L 10 0 M 10 0 M 12 0 L 14 0 M 14 0 M 16 0 L 18 0 M 18 0 M 20 0 L 22 0 M 22 0 M 24 0 L 26 0 M 26 0 M 28 0 L 30 0 M 30 0 M 32 0 L 34 0 M 34 0 M 36 0 L 38 0 M 38 0 M 40 0 L 42 0 M 42 0 M 44 0 L 46 0 M 46 0 M 48 0 L 50 0 M 50 0 M 52 0 L 54 0 M 54 0 M 56 0 L 58 0 M 58 0 M 60 0 L 62 0 M 62 0 M 64 0 L 66 0 M 66 0 M 68 0 L 70 0 M 70 0 M 72 0 L 74 0 M 74 0 M 76 0 L 78 0 M 78 0 M 80 0 L 82 0 M 82 0 M 84 0 L 86 0 M 86 0 M 88 0 L 90 0 M 90 0 M 92 0 L 94 0 M 94 0 M 96 0 L 98 0 M 98 0 M 100 0 L 102 0 M 102 0 M 104 0 L 106 0 M 106 0 M 108 0 L 110 0 M 110 0 M 112 0 L 114 0 M 114 0 M 116 0 L 118 0 M 118 0 M 120 0 L 122 0 M 122 0 M 124 0 L 126 0 M 126 0 M 128 0 L 130 0 M 130 0 M 132 0 L 134 0 M 134 0 M 136 0 L 138 0 M 138 0 M 140 0 L 142 0 M 142 0 M 144 0 L 146 0 M 146 0 M 148 0 L 150 0 M 150 0 M 152 0 L 154 0 M 154 0 M 156 0 L 158 0 M 158 0 M 160 0 L 162 0 M 162 0 M 164 0 L 166 0 M 166 0 M 168 0 L 170 0 M 170 0 M 172 0 L 174 0 M 174 0 M 176 0 L 178 0 M 178 0 M 180 0 L 182 0 M 182 0 M 184 0 L 186 0 M 186 0 M 188 0 L 190 0 M 190 0 M 192 0 L 194 0 M 194 0 M 196 0 L 198 0 M 198 0 M 200 0 L 202 0 M 202 0 M 204 0 L 206 0 M 206 0 M 208 0 L 210 0 M 210 0 M 212 0 L 214 0 M 214 0 M 216 0 L 218 0 M 218 0 M 220 0 L 222 0 M 222 0 M 224 0 L 226 0 M 226 0 M 228 0 L 230 0 M 230 0 M 232 0 L 234 0 M 234 0 M 236 0 L 238 0 M 238 0 M 240 0 L 242 0 M 242 0 M 244 0 L 246 0 M 246 0 M 248 0 L 250 0 M 250 0 M 252 0 L 254 0 M 254 0 M 256 0 L 258 0 M 258 0 M 260 0 L 262 0 M 262 0 M 264 0 L 266 0 M 266 0 M 268 0 L 270 0 M 270 0 M 272 0 L 274 0 M 274 0 M 276 0 L 278 0 M 278 0 M 280 0 L 282 0 M 282 0 M 284 0 L 286 0 M 286 0 M 288 0 L 290 0 M 290 0 M 292 0 L 294 0 M 294 0 M 296 0 L 298 0 M 298 0 M 300 0 L 302 0 M 302 0 M 304 0 L 306 0 M 306 0 M 308 0 L 310 0 M 310 0 M 312 0 L 314 0 M 314 0 M 316 0 L 318 0 M 318 0 M 320 0 L 322 0 M 322 0 M 324 0 L 326 0 M 326 0 M 328 0 L 330 0 M 330 0 M 332 0 L 334 0 M 334 0 M 336 0 L 338 0 M 338 0 M 340 0 L 342 0 M 342 0 M 344 0 L 346 0 M 346 0 M 348 0 L 350 0 M 350 0 M 352 0 L 354 0 M 354 0 M 356 0 L 358 0 M 358 0 M 360 0 L 362 0 M 362 0 M 364 0 L 366 0 M 366 0 M 368 0 L 370 0 M 370 0 M 372 0 L 374 0 M 374 0 M 376 0 L 378 0 M 378 0 M 380 0 L 382 0 M 382 0 M 384 0 L 386 0 M 386 0 M 388 0 L 390 0 M 390 0 M 392 0 L 394 0 M 394 0 M 396 0 L 398 0 M 398 0 M 400 0 L 401.99999999999994 0 Q 401.99999999999994 0 401.99999999999994 0 L 401.99999999999994 5.684341886080802e-14 M 401.99999999999994 5.684341886080802e-14 M 401.99999999999994 2.000000000000057 L 401.99999999999994 4.000000000000057 M 401.99999999999994 4.000000000000057 M 401.99999999999994 6.000000000000057 L 401.99999999999994 8.000000000000057 M 401.99999999999994 8.000000000000057 M 401.99999999999994 10.000000000000057 L 401.99999999999994 12.000000000000057 M 401.99999999999994 12.000000000000057 M 401.99999999999994 14.000000000000057 L 401.99999999999994 16.000000000000057 M 401.99999999999994 16.000000000000057 M 401.99999999999994 18.000000000000057 L 401.99999999999994 20.000000000000057 M 401.99999999999994 20.000000000000057 M 401.99999999999994 22.000000000000057 L 401.99999999999994 24.000000000000057 M 401.99999999999994 24.000000000000057 M 401.99999999999994 26.000000000000057 L 401.99999999999994 28.000000000000057 M 401.99999999999994 28.000000000000057 M 401.99999999999994 30.000000000000057 L 401.99999999999994 32.00000000000006 M 401.99999999999994 32.00000000000006 M 401.99999999999994 34.00000000000006 L 401.99999999999994 36.00000000000006 M 401.99999999999994 36.00000000000006 M 401.99999999999994 38.00000000000006 L 401.99999999999994 40.00000000000006 M 401.99999999999994 40.00000000000006 M 401.99999999999994 42.00000000000006 L 401.99999999999994 44.00000000000006 M 401.99999999999994 44.00000000000006 M 401.99999999999994 46.00000000000006 L 401.99999999999994 48.00000000000006 M 401.99999999999994 48.00000000000006 M 401.99999999999994 50.00000000000006 L 401.99999999999994 52.00000000000006 M 401.99999999999994 52.00000000000006 M 401.99999999999994 54.00000000000006 L 401.99999999999994 56.00000000000006 M 401.99999999999994 56.00000000000006 M 401.99999999999994 58.00000000000006 L 401.99999999999994 60.00000000000006 M 401.99999999999994 60.00000000000006 M 401.99999999999994 62.00000000000006 L 401.99999999999994 64.00000000000006 M 401.99999999999994 64.00000000000006 M 401.99999999999994 66.00000000000006 L 401.99999999999994 68.00000000000006 M 401.99999999999994 68.00000000000006 M 401.99999999999994 70.00000000000006 L 401.99999999999994 72.00000000000006 M 401.99999999999994 72.00000000000006 M 401.99999999999994 74.00000000000006 L 401.99999999999994 76.00000000000006 M 401.99999999999994 76.00000000000006 M 401.99999999999994 78.00000000000006 L 401.99999999999994 80.00000000000006 M 401.99999999999994 80.00000000000006 M 401.99999999999994 82.00000000000006 L 401.99999999999994 84.00000000000006 M 401.99999999999994 84.00000000000006 M 401.99999999999994 86.00000000000006 L 401.99999999999994 88.00000000000006 M 401.99999999999994 88.00000000000006 M 401.99999999999994 90.00000000000006 L 401.99999999999994 92.00000000000006 M 401.99999999999994 92.00000000000006 M 401.99999999999994 94.00000000000006 L 401.99999999999994 96.00000000000006 M 401.99999999999994 96.00000000000006 M 401.99999999999994 98.00000000000006 L 401.99999999999994 100.00000000000006 M 401.99999999999994 100.00000000000006 M 401.99999999999994 102.00000000000006 L 401.99999999999994 104.00000000000006 M 401.99999999999994 104.00000000000006 M 401.99999999999994 106.00000000000006 L 401.99999999999994 108.00000000000006 M 401.99999999999994 108.00000000000006 M 401.99999999999994 110.00000000000006 L 401.99999999999994 112.00000000000006 M 401.99999999999994 112.00000000000006 M 401.99999999999994 114.00000000000006 L 401.99999999999994 116.00000000000006 M 401.99999999999994 116.00000000000006 M 401.99999999999994 118.00000000000006 L 401.99999999999994 120.00000000000006 M 401.99999999999994 120.00000000000006 M 401.99999999999994 122.00000000000006 L 401.99999999999994 124.00000000000006 M 401.99999999999994 124.00000000000006 M 401.9999999999999 126 L 399.9999999999999 126 M 399.9999999999999 126 M 397.9999999999999 126 L 395.9999999999999 126 M 395.9999999999999 126 M 393.9999999999999 126 L 391.9999999999999 126 M 391.9999999999999 126 M 389.9999999999999 126 L 387.9999999999999 126 M 387.9999999999999 126 M 385.9999999999999 126 L 383.9999999999999 126 M 383.9999999999999 126 M 381.9999999999999 126 L 379.9999999999999 126 M 379.9999999999999 126 M 377.9999999999999 126 L 375.9999999999999 126 M 375.9999999999999 126 M 373.9999999999999 126 L 371.9999999999999 126 M 371.9999999999999 126 M 369.9999999999999 126 L 367.9999999999999 126 M 367.9999999999999 126 M 365.9999999999999 126 L 363.9999999999999 126 M 363.9999999999999 126 M 361.9999999999999 126 L 359.9999999999999 126 M 359.9999999999999 126 M 357.9999999999999 126 L 355.9999999999999 126 M 355.9999999999999 126 M 353.9999999999999 126 L 351.9999999999999 126 M 351.9999999999999 126 M 349.9999999999999 126 L 347.9999999999999 126 M 347.9999999999999 126 M 345.9999999999999 126 L 343.9999999999999 126 M 343.9999999999999 126 M 341.9999999999999 126 L 339.9999999999999 126 M 339.9999999999999 126 M 337.9999999999999 126 L 335.9999999999999 126 M 335.9999999999999 126 M 333.9999999999999 126 L 331.9999999999999 126 M 331.9999999999999 126 M 329.9999999999999 126 L 327.9999999999999 126 M 327.9999999999999 126 M 325.9999999999999 126 L 323.9999999999999 126 M 323.9999999999999 126 M 321.9999999999999 126 L 319.9999999999999 126 M 319.9999999999999 126 M 317.9999999999999 126 L 315.9999999999999 126 M 315.9999999999999 126 M 313.9999999999999 126 L 311.9999999999999 126 M 311.9999999999999 126 M 309.9999999999999 126 L 307.9999999999999 126 M 307.9999999999999 126 M 305.9999999999999 126 L 303.9999999999999 126 M 303.9999999999999 126 M 301.9999999999999 126 L 299.9999999999999 126 M 299.9999999999999 126 M 297.9999999999999 126 L 295.9999999999999 126 M 295.9999999999999 126 M 293.9999999999999 126 L 291.9999999999999 126 M 291.9999999999999 126 M 289.9999999999999 126 L 287.9999999999999 126 M 287.9999999999999 126 M 285.9999999999999 126 L 283.9999999999999 126 M 283.9999999999999 126 M 281.9999999999999 126 L 279.9999999999999 126 M 279.9999999999999 126 M 277.9999999999999 126 L 275.9999999999999 126 M 275.9999999999999 126 M 273.9999999999999 126 L 271.9999999999999 126 M 271.9999999999999 126 M 269.9999999999999 126 L 267.9999999999999 126 M 267.9999999999999 126 M 265.9999999999999 126 L 263.9999999999999 126 M 263.9999999999999 126 M 261.9999999999999 126 L 259.9999999999999 126 M 259.9999999999999 126 M 257.9999999999999 126 L 255.9999999999999 126 M 255.9999999999999 126 M 253.9999999999999 126 L 251.9999999999999 126 M 251.9999999999999 126 M 249.9999999999999 126 L 247.9999999999999 126 M 247.9999999999999 126 M 245.9999999999999 126 L 243.9999999999999 126 M 243.9999999999999 126 M 241.9999999999999 126 L 239.9999999999999 126 M 239.9999999999999 126 M 237.9999999999999 126 L 235.9999999999999 126 M 235.9999999999999 126 M 233.9999999999999 126 L 231.9999999999999 126 M 231.9999999999999 126 M 229.9999999999999 126 L 227.9999999999999 126 M 227.9999999999999 126 M 225.9999999999999 126 L 223.9999999999999 126 M 223.9999999999999 126 M 221.9999999999999 126 L 219.9999999999999 126 M 219.9999999999999 126 M 217.9999999999999 126 L 215.9999999999999 126 M 215.9999999999999 126 M 213.9999999999999 126 L 211.9999999999999 126 M 211.9999999999999 126 M 209.9999999999999 126 L 207.9999999999999 126 M 207.9999999999999 126 M 205.9999999999999 126 L 203.9999999999999 126 M 203.9999999999999 126 M 201.9999999999999 126 L 199.9999999999999 126 M 199.9999999999999 126 M 197.9999999999999 126 L 195.9999999999999 126 M 195.9999999999999 126 M 193.9999999999999 126 L 191.9999999999999 126 M 191.9999999999999 126 M 189.9999999999999 126 L 187.9999999999999 126 M 187.9999999999999 126 M 185.9999999999999 126 L 183.9999999999999 126 M 183.9999999999999 126 M 181.9999999999999 126 L 179.9999999999999 126 M 179.9999999999999 126 M 177.9999999999999 126 L 175.9999999999999 126 M 175.9999999999999 126 M 173.9999999999999 126 L 171.9999999999999 126 M 171.9999999999999 126 M 169.9999999999999 126 L 167.9999999999999 126 M 167.9999999999999 126 M 165.9999999999999 126 L 163.9999999999999 126 M 163.9999999999999 126 M 161.9999999999999 126 L 159.9999999999999 126 M 159.9999999999999 126 M 157.9999999999999 126 L 155.9999999999999 126 M 155.9999999999999 126 M 153.9999999999999 126 L 151.9999999999999 126 M 151.9999999999999 126 M 149.9999999999999 126 L 147.9999999999999 126 M 147.9999999999999 126 M 145.9999999999999 126 L 143.9999999999999 126 M 143.9999999999999 126 M 141.9999999999999 126 L 139.9999999999999 126 M 139.9999999999999 126 M 137.9999999999999 126 L 135.9999999999999 126 M 135.9999999999999 126 M 133.9999999999999 126 L 131.9999999999999 126 M 131.9999999999999 126 M 129.9999999999999 126 L 127.99999999999989 126 M 127.99999999999989 126 M 125.99999999999989 126 L 123.99999999999989 126 M 123.99999999999989 126 M 121.99999999999989 126 L 119.99999999999989 126 M 119.99999999999989 126 M 117.99999999999989 126 L 115.99999999999989 126 M 115.99999999999989 126 M 113.99999999999989 126 L 111.99999999999989 126 M 111.99999999999989 126 M 109.99999999999989 126 L 107.99999999999989 126 M 107.99999999999989 126 M 105.99999999999989 126 L 103.99999999999989 126 M 103.99999999999989 126 M 101.99999999999989 126 L 99.99999999999989 126 M 99.99999999999989 126 M 97.99999999999989 126 L 95.99999999999989 126 M 95.99999999999989 126 M 93.99999999999989 126 L 91.99999999999989 126 M 91.99999999999989 126 M 89.99999999999989 126 L 87.99999999999989 126 M 87.99999999999989 126 M 85.99999999999989 126 L 83.99999999999989 126 M 83.99999999999989 126 M 81.99999999999989 126 L 79.99999999999989 126 M 79.99999999999989 126 M 77.99999999999989 126 L 75.99999999999989 126 M 75.99999999999989 126 M 73.99999999999989 126 L 71.99999999999989 126 M 71.99999999999989 126 M 69.99999999999989 126 L 67.99999999999989 126 M 67.99999999999989 126 M 65.99999999999989 126 L 63.999999999999886 126 M 63.999999999999886 126 M 61.999999999999886 126 L 59.999999999999886 126 M 59.999999999999886 126 M 57.999999999999886 126 L 55.999999999999886 126 M 55.999999999999886 126 M 53.999999999999886 126 L 51.999999999999886 126 M 51.999999999999886 126 M 49.999999999999886 126 L 47.999999999999886 126 M 47.999999999999886 126 M 45.999999999999886 126 L 43.999999999999886 126 M 43.999999999999886 126 M 41.999999999999886 126 L 39.999999999999886 126 M 39.999999999999886 126 M 37.999999999999886 126 L 35.999999999999886 126 M 35.999999999999886 126 M 33.999999999999886 126 L 31.999999999999886 126 M 31.999999999999886 126 M 29.999999999999886 126 L 27.999999999999886 126 M 27.999999999999886 126 M 25.999999999999886 126 L 23.999999999999886 126 M 23.999999999999886 126 M 21.999999999999886 126 L 19.999999999999886 126 M 19.999999999999886 126 M 17.999999999999886 126 L 15.999999999999886 126 M 15.999999999999886 126 M 13.999999999999886 126 L 11.999999999999886 126 M 11.999999999999886 126 M 9.999999999999886 126 L 7.999999999999886 126 M 7.999999999999886 126 M 5.999999999999886 126 L 3.9999999999998863 126 M 3.9999999999998863 126 M 1.9999999999998863 126 L 0 126 Q 0 126 0 126 L 0 125.99999999999989 M 0 125.99999999999989 M 0 123.99999999999989 L 0 121.99999999999989 M 0 121.99999999999989 M 0 119.99999999999989 L 0 117.99999999999989 M 0 117.99999999999989 M 0 115.99999999999989 L 0 113.99999999999989 M 0 113.99999999999989 M 0 111.99999999999989 L 0 109.99999999999989 M 0 109.99999999999989 M 0 107.99999999999989 L 0 105.99999999999989 M 0 105.99999999999989 M 0 103.99999999999989 L 0 101.99999999999989 M 0 101.99999999999989 M 0 99.99999999999989 L 0 97.99999999999989 M 0 97.99999999999989 M 0 95.99999999999989 L 0 93.99999999999989 M 0 93.99999999999989 M 0 91.99999999999989 L 0 89.99999999999989 M 0 89.99999999999989 M 0 87.99999999999989 L 0 85.99999999999989 M 0 85.99999999999989 M 0 83.99999999999989 L 0 81.99999999999989 M 0 81.99999999999989 M 0 79.99999999999989 L 0 77.99999999999989 M 0 77.99999999999989 M 0 75.99999999999989 L 0 73.99999999999989 M 0 73.99999999999989 M 0 71.99999999999989 L 0 69.99999999999989 M 0 69.99999999999989 M 0 67.99999999999989 L 0 65.99999999999989 M 0 65.99999999999989 M 0 63.999999999999886 L 0 61.999999999999886 M 0 61.999999999999886 M 0 59.999999999999886 L 0 57.999999999999886 M 0 57.999999999999886 M 0 55.999999999999886 L 0 53.999999999999886 M 0 53.999999999999886 M 0 51.999999999999886 L 0 49.999999999999886 M 0 49.999999999999886 M 0 47.999999999999886 L 0 45.999999999999886 M 0 45.999999999999886 M 0 43.999999999999886 L 0 41.999999999999886 M 0 41.999999999999886 M 0 39.999999999999886 L 0 37.999999999999886 M 0 37.999999999999886 M 0 35.999999999999886 L 0 33.999999999999886 M 0 33.999999999999886 M 0 31.999999999999886 L 0 29.999999999999886 M 0 29.999999999999886 M 0 27.999999999999886 L 0 25.999999999999886 M 0 25.999999999999886 M 0 23.999999999999886 L 0 21.999999999999886 M 0 21.999999999999886 M 0 19.999999999999886 L 0 17.999999999999886 M 0 17.999999999999886 M 0 15.999999999999886 L 0 13.999999999999886 M 0 13.999999999999886 M 0 11.999999999999886 L 0 9.999999999999886 M 0 9.999999999999886 M 0 7.999999999999886 L 0 5.999999999999886 M 0 5.999999999999886 M 0 3.9999999999998863 L 0 1.9999999999998863 M 0 1.9999999999998863 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="translate(0,0) matrix(1,0,0,1,31.5,23.5)"><g transform="translate(4,4) scale(1.01,1.0133333333333334)"><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="#000000" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" opacity="0.294117647"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="rgb(0,0,0)" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-opacity="0" stroke-miterlimit="10" stroke-width="2" opacity="0.294117647"/></g></g></g></g></g><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="url(#LTqAuhEQNvFp)" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="url(#LTqAuhEQNvFp)" stroke="#333333" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="scale(1,1) matrix(1,0,0,1,33.5,23.5) translate(8,30.5)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="24.326171875" y="11">Host2</text></g><g transform="scale(1,1) matrix(1,0,0,1,19.5,8) translate(2,0)"><text fill="rgb(183, 183, 183)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="0" y="11">eth0 2001:db8:0:1::1/64</text></g><g transform="scale(1,1) matrix(1,0,0,1,6.5,106) translate(2,0)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="23.2978515625" y="11">docker0 fe80::1/64</text></g><g transform="scale(1,1) matrix(1,0,0,1,146.5,27.5) translate(2,0)"><text fill="rgb(183, 183, 183)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="0" y="11">route -A inet6 default gw fe80::1</text><text fill="rgb(183, 183, 183)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="170.109375" y="11">&#160;dev eth0</text></g><g transform="scale(1,1) matrix(1,0,0,1,146.5,82) translate(2,0)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="0" y="11">route -A inet6 2001:db8:0:2::/64&#160;</text><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="172.125" y="11">dev docker0</text></g></g></svg> \ No newline at end of file
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="433.75" height="146.5"><style xmlns="http://www.w3.org/1999/xhtml"></style><defs><linearGradient id="hEFQTXIBbAaX" x1="0px" x2="0px" y1="100px" y2="-50px" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#a4c2f4"/><stop offset="1" stop-color="#FFFFFF"/></linearGradient></defs><g transform="translate(0,0)"><g><rect fill="#FFFFFF" stroke="none" x="0" y="0" width="433.75" height="146.5"/></g><g transform="translate(0,0) matrix(1,0,0,1,11.75,0.5)"><g><g transform="translate(0,0) scale(4.02,1.26)"><g><path fill="#FFFFFF" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(0.24875621890547267,0.7936507936507936)"><path fill="none" stroke="none" d="M 0 0 L 401.99999999999994 0 Q 401.99999999999994 0 401.99999999999994 0 L 401.99999999999994 126 Q 401.99999999999994 126 401.99999999999994 126 L 0 126 Q 0 126 0 126 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" d="M 0 0 M 0 0 L 2 0 M 2 0 M 4 0 L 6 0 M 6 0 M 8 0 L 10 0 M 10 0 M 12 0 L 14 0 M 14 0 M 16 0 L 18 0 M 18 0 M 20 0 L 22 0 M 22 0 M 24 0 L 26 0 M 26 0 M 28 0 L 30 0 M 30 0 M 32 0 L 34 0 M 34 0 M 36 0 L 38 0 M 38 0 M 40 0 L 42 0 M 42 0 M 44 0 L 46 0 M 46 0 M 48 0 L 50 0 M 50 0 M 52 0 L 54 0 M 54 0 M 56 0 L 58 0 M 58 0 M 60 0 L 62 0 M 62 0 M 64 0 L 66 0 M 66 0 M 68 0 L 70 0 M 70 0 M 72 0 L 74 0 M 74 0 M 76 0 L 78 0 M 78 0 M 80 0 L 82 0 M 82 0 M 84 0 L 86 0 M 86 0 M 88 0 L 90 0 M 90 0 M 92 0 L 94 0 M 94 0 M 96 0 L 98 0 M 98 0 M 100 0 L 102 0 M 102 0 M 104 0 L 106 0 M 106 0 M 108 0 L 110 0 M 110 0 M 112 0 L 114 0 M 114 0 M 116 0 L 118 0 M 118 0 M 120 0 L 122 0 M 122 0 M 124 0 L 126 0 M 126 0 M 128 0 L 130 0 M 130 0 M 132 0 L 134 0 M 134 0 M 136 0 L 138 0 M 138 0 M 140 0 L 142 0 M 142 0 M 144 0 L 146 0 M 146 0 M 148 0 L 150 0 M 150 0 M 152 0 L 154 0 M 154 0 M 156 0 L 158 0 M 158 0 M 160 0 L 162 0 M 162 0 M 164 0 L 166 0 M 166 0 M 168 0 L 170 0 M 170 0 M 172 0 L 174 0 M 174 0 M 176 0 L 178 0 M 178 0 M 180 0 L 182 0 M 182 0 M 184 0 L 186 0 M 186 0 M 188 0 L 190 0 M 190 0 M 192 0 L 194 0 M 194 0 M 196 0 L 198 0 M 198 0 M 200 0 L 202 0 M 202 0 M 204 0 L 206 0 M 206 0 M 208 0 L 210 0 M 210 0 M 212 0 L 214 0 M 214 0 M 216 0 L 218 0 M 218 0 M 220 0 L 222 0 M 222 0 M 224 0 L 226 0 M 226 0 M 228 0 L 230 0 M 230 0 M 232 0 L 234 0 M 234 0 M 236 0 L 238 0 M 238 0 M 240 0 L 242 0 M 242 0 M 244 0 L 246 0 M 246 0 M 248 0 L 250 0 M 250 0 M 252 0 L 254 0 M 254 0 M 256 0 L 258 0 M 258 0 M 260 0 L 262 0 M 262 0 M 264 0 L 266 0 M 266 0 M 268 0 L 270 0 M 270 0 M 272 0 L 274 0 M 274 0 M 276 0 L 278 0 M 278 0 M 280 0 L 282 0 M 282 0 M 284 0 L 286 0 M 286 0 M 288 0 L 290 0 M 290 0 M 292 0 L 294 0 M 294 0 M 296 0 L 298 0 M 298 0 M 300 0 L 302 0 M 302 0 M 304 0 L 306 0 M 306 0 M 308 0 L 310 0 M 310 0 M 312 0 L 314 0 M 314 0 M 316 0 L 318 0 M 318 0 M 320 0 L 322 0 M 322 0 M 324 0 L 326 0 M 326 0 M 328 0 L 330 0 M 330 0 M 332 0 L 334 0 M 334 0 M 336 0 L 338 0 M 338 0 M 340 0 L 342 0 M 342 0 M 344 0 L 346 0 M 346 0 M 348 0 L 350 0 M 350 0 M 352 0 L 354 0 M 354 0 M 356 0 L 358 0 M 358 0 M 360 0 L 362 0 M 362 0 M 364 0 L 366 0 M 366 0 M 368 0 L 370 0 M 370 0 M 372 0 L 374 0 M 374 0 M 376 0 L 378 0 M 378 0 M 380 0 L 382 0 M 382 0 M 384 0 L 386 0 M 386 0 M 388 0 L 390 0 M 390 0 M 392 0 L 394 0 M 394 0 M 396 0 L 398 0 M 398 0 M 400 0 L 401.99999999999994 0 Q 401.99999999999994 0 401.99999999999994 0 L 401.99999999999994 5.684341886080802e-14 M 401.99999999999994 5.684341886080802e-14 M 401.99999999999994 2.000000000000057 L 401.99999999999994 4.000000000000057 M 401.99999999999994 4.000000000000057 M 401.99999999999994 6.000000000000057 L 401.99999999999994 8.000000000000057 M 401.99999999999994 8.000000000000057 M 401.99999999999994 10.000000000000057 L 401.99999999999994 12.000000000000057 M 401.99999999999994 12.000000000000057 M 401.99999999999994 14.000000000000057 L 401.99999999999994 16.000000000000057 M 401.99999999999994 16.000000000000057 M 401.99999999999994 18.000000000000057 L 401.99999999999994 20.000000000000057 M 401.99999999999994 20.000000000000057 M 401.99999999999994 22.000000000000057 L 401.99999999999994 24.000000000000057 M 401.99999999999994 24.000000000000057 M 401.99999999999994 26.000000000000057 L 401.99999999999994 28.000000000000057 M 401.99999999999994 28.000000000000057 M 401.99999999999994 30.000000000000057 L 401.99999999999994 32.00000000000006 M 401.99999999999994 32.00000000000006 M 401.99999999999994 34.00000000000006 L 401.99999999999994 36.00000000000006 M 401.99999999999994 36.00000000000006 M 401.99999999999994 38.00000000000006 L 401.99999999999994 40.00000000000006 M 401.99999999999994 40.00000000000006 M 401.99999999999994 42.00000000000006 L 401.99999999999994 44.00000000000006 M 401.99999999999994 44.00000000000006 M 401.99999999999994 46.00000000000006 L 401.99999999999994 48.00000000000006 M 401.99999999999994 48.00000000000006 M 401.99999999999994 50.00000000000006 L 401.99999999999994 52.00000000000006 M 401.99999999999994 52.00000000000006 M 401.99999999999994 54.00000000000006 L 401.99999999999994 56.00000000000006 M 401.99999999999994 56.00000000000006 M 401.99999999999994 58.00000000000006 L 401.99999999999994 60.00000000000006 M 401.99999999999994 60.00000000000006 M 401.99999999999994 62.00000000000006 L 401.99999999999994 64.00000000000006 M 401.99999999999994 64.00000000000006 M 401.99999999999994 66.00000000000006 L 401.99999999999994 68.00000000000006 M 401.99999999999994 68.00000000000006 M 401.99999999999994 70.00000000000006 L 401.99999999999994 72.00000000000006 M 401.99999999999994 72.00000000000006 M 401.99999999999994 74.00000000000006 L 401.99999999999994 76.00000000000006 M 401.99999999999994 76.00000000000006 M 401.99999999999994 78.00000000000006 L 401.99999999999994 80.00000000000006 M 401.99999999999994 80.00000000000006 M 401.99999999999994 82.00000000000006 L 401.99999999999994 84.00000000000006 M 401.99999999999994 84.00000000000006 M 401.99999999999994 86.00000000000006 L 401.99999999999994 88.00000000000006 M 401.99999999999994 88.00000000000006 M 401.99999999999994 90.00000000000006 L 401.99999999999994 92.00000000000006 M 401.99999999999994 92.00000000000006 M 401.99999999999994 94.00000000000006 L 401.99999999999994 96.00000000000006 M 401.99999999999994 96.00000000000006 M 401.99999999999994 98.00000000000006 L 401.99999999999994 100.00000000000006 M 401.99999999999994 100.00000000000006 M 401.99999999999994 102.00000000000006 L 401.99999999999994 104.00000000000006 M 401.99999999999994 104.00000000000006 M 401.99999999999994 106.00000000000006 L 401.99999999999994 108.00000000000006 M 401.99999999999994 108.00000000000006 M 401.99999999999994 110.00000000000006 L 401.99999999999994 112.00000000000006 M 401.99999999999994 112.00000000000006 M 401.99999999999994 114.00000000000006 L 401.99999999999994 116.00000000000006 M 401.99999999999994 116.00000000000006 M 401.99999999999994 118.00000000000006 L 401.99999999999994 120.00000000000006 M 401.99999999999994 120.00000000000006 M 401.99999999999994 122.00000000000006 L 401.99999999999994 124.00000000000006 M 401.99999999999994 124.00000000000006 M 401.9999999999999 126 L 399.9999999999999 126 M 399.9999999999999 126 M 397.9999999999999 126 L 395.9999999999999 126 M 395.9999999999999 126 M 393.9999999999999 126 L 391.9999999999999 126 M 391.9999999999999 126 M 389.9999999999999 126 L 387.9999999999999 126 M 387.9999999999999 126 M 385.9999999999999 126 L 383.9999999999999 126 M 383.9999999999999 126 M 381.9999999999999 126 L 379.9999999999999 126 M 379.9999999999999 126 M 377.9999999999999 126 L 375.9999999999999 126 M 375.9999999999999 126 M 373.9999999999999 126 L 371.9999999999999 126 M 371.9999999999999 126 M 369.9999999999999 126 L 367.9999999999999 126 M 367.9999999999999 126 M 365.9999999999999 126 L 363.9999999999999 126 M 363.9999999999999 126 M 361.9999999999999 126 L 359.9999999999999 126 M 359.9999999999999 126 M 357.9999999999999 126 L 355.9999999999999 126 M 355.9999999999999 126 M 353.9999999999999 126 L 351.9999999999999 126 M 351.9999999999999 126 M 349.9999999999999 126 L 347.9999999999999 126 M 347.9999999999999 126 M 345.9999999999999 126 L 343.9999999999999 126 M 343.9999999999999 126 M 341.9999999999999 126 L 339.9999999999999 126 M 339.9999999999999 126 M 337.9999999999999 126 L 335.9999999999999 126 M 335.9999999999999 126 M 333.9999999999999 126 L 331.9999999999999 126 M 331.9999999999999 126 M 329.9999999999999 126 L 327.9999999999999 126 M 327.9999999999999 126 M 325.9999999999999 126 L 323.9999999999999 126 M 323.9999999999999 126 M 321.9999999999999 126 L 319.9999999999999 126 M 319.9999999999999 126 M 317.9999999999999 126 L 315.9999999999999 126 M 315.9999999999999 126 M 313.9999999999999 126 L 311.9999999999999 126 M 311.9999999999999 126 M 309.9999999999999 126 L 307.9999999999999 126 M 307.9999999999999 126 M 305.9999999999999 126 L 303.9999999999999 126 M 303.9999999999999 126 M 301.9999999999999 126 L 299.9999999999999 126 M 299.9999999999999 126 M 297.9999999999999 126 L 295.9999999999999 126 M 295.9999999999999 126 M 293.9999999999999 126 L 291.9999999999999 126 M 291.9999999999999 126 M 289.9999999999999 126 L 287.9999999999999 126 M 287.9999999999999 126 M 285.9999999999999 126 L 283.9999999999999 126 M 283.9999999999999 126 M 281.9999999999999 126 L 279.9999999999999 126 M 279.9999999999999 126 M 277.9999999999999 126 L 275.9999999999999 126 M 275.9999999999999 126 M 273.9999999999999 126 L 271.9999999999999 126 M 271.9999999999999 126 M 269.9999999999999 126 L 267.9999999999999 126 M 267.9999999999999 126 M 265.9999999999999 126 L 263.9999999999999 126 M 263.9999999999999 126 M 261.9999999999999 126 L 259.9999999999999 126 M 259.9999999999999 126 M 257.9999999999999 126 L 255.9999999999999 126 M 255.9999999999999 126 M 253.9999999999999 126 L 251.9999999999999 126 M 251.9999999999999 126 M 249.9999999999999 126 L 247.9999999999999 126 M 247.9999999999999 126 M 245.9999999999999 126 L 243.9999999999999 126 M 243.9999999999999 126 M 241.9999999999999 126 L 239.9999999999999 126 M 239.9999999999999 126 M 237.9999999999999 126 L 235.9999999999999 126 M 235.9999999999999 126 M 233.9999999999999 126 L 231.9999999999999 126 M 231.9999999999999 126 M 229.9999999999999 126 L 227.9999999999999 126 M 227.9999999999999 126 M 225.9999999999999 126 L 223.9999999999999 126 M 223.9999999999999 126 M 221.9999999999999 126 L 219.9999999999999 126 M 219.9999999999999 126 M 217.9999999999999 126 L 215.9999999999999 126 M 215.9999999999999 126 M 213.9999999999999 126 L 211.9999999999999 126 M 211.9999999999999 126 M 209.9999999999999 126 L 207.9999999999999 126 M 207.9999999999999 126 M 205.9999999999999 126 L 203.9999999999999 126 M 203.9999999999999 126 M 201.9999999999999 126 L 199.9999999999999 126 M 199.9999999999999 126 M 197.9999999999999 126 L 195.9999999999999 126 M 195.9999999999999 126 M 193.9999999999999 126 L 191.9999999999999 126 M 191.9999999999999 126 M 189.9999999999999 126 L 187.9999999999999 126 M 187.9999999999999 126 M 185.9999999999999 126 L 183.9999999999999 126 M 183.9999999999999 126 M 181.9999999999999 126 L 179.9999999999999 126 M 179.9999999999999 126 M 177.9999999999999 126 L 175.9999999999999 126 M 175.9999999999999 126 M 173.9999999999999 126 L 171.9999999999999 126 M 171.9999999999999 126 M 169.9999999999999 126 L 167.9999999999999 126 M 167.9999999999999 126 M 165.9999999999999 126 L 163.9999999999999 126 M 163.9999999999999 126 M 161.9999999999999 126 L 159.9999999999999 126 M 159.9999999999999 126 M 157.9999999999999 126 L 155.9999999999999 126 M 155.9999999999999 126 M 153.9999999999999 126 L 151.9999999999999 126 M 151.9999999999999 126 M 149.9999999999999 126 L 147.9999999999999 126 M 147.9999999999999 126 M 145.9999999999999 126 L 143.9999999999999 126 M 143.9999999999999 126 M 141.9999999999999 126 L 139.9999999999999 126 M 139.9999999999999 126 M 137.9999999999999 126 L 135.9999999999999 126 M 135.9999999999999 126 M 133.9999999999999 126 L 131.9999999999999 126 M 131.9999999999999 126 M 129.9999999999999 126 L 127.99999999999989 126 M 127.99999999999989 126 M 125.99999999999989 126 L 123.99999999999989 126 M 123.99999999999989 126 M 121.99999999999989 126 L 119.99999999999989 126 M 119.99999999999989 126 M 117.99999999999989 126 L 115.99999999999989 126 M 115.99999999999989 126 M 113.99999999999989 126 L 111.99999999999989 126 M 111.99999999999989 126 M 109.99999999999989 126 L 107.99999999999989 126 M 107.99999999999989 126 M 105.99999999999989 126 L 103.99999999999989 126 M 103.99999999999989 126 M 101.99999999999989 126 L 99.99999999999989 126 M 99.99999999999989 126 M 97.99999999999989 126 L 95.99999999999989 126 M 95.99999999999989 126 M 93.99999999999989 126 L 91.99999999999989 126 M 91.99999999999989 126 M 89.99999999999989 126 L 87.99999999999989 126 M 87.99999999999989 126 M 85.99999999999989 126 L 83.99999999999989 126 M 83.99999999999989 126 M 81.99999999999989 126 L 79.99999999999989 126 M 79.99999999999989 126 M 77.99999999999989 126 L 75.99999999999989 126 M 75.99999999999989 126 M 73.99999999999989 126 L 71.99999999999989 126 M 71.99999999999989 126 M 69.99999999999989 126 L 67.99999999999989 126 M 67.99999999999989 126 M 65.99999999999989 126 L 63.999999999999886 126 M 63.999999999999886 126 M 61.999999999999886 126 L 59.999999999999886 126 M 59.999999999999886 126 M 57.999999999999886 126 L 55.999999999999886 126 M 55.999999999999886 126 M 53.999999999999886 126 L 51.999999999999886 126 M 51.999999999999886 126 M 49.999999999999886 126 L 47.999999999999886 126 M 47.999999999999886 126 M 45.999999999999886 126 L 43.999999999999886 126 M 43.999999999999886 126 M 41.999999999999886 126 L 39.999999999999886 126 M 39.999999999999886 126 M 37.999999999999886 126 L 35.999999999999886 126 M 35.999999999999886 126 M 33.999999999999886 126 L 31.999999999999886 126 M 31.999999999999886 126 M 29.999999999999886 126 L 27.999999999999886 126 M 27.999999999999886 126 M 25.999999999999886 126 L 23.999999999999886 126 M 23.999999999999886 126 M 21.999999999999886 126 L 19.999999999999886 126 M 19.999999999999886 126 M 17.999999999999886 126 L 15.999999999999886 126 M 15.999999999999886 126 M 13.999999999999886 126 L 11.999999999999886 126 M 11.999999999999886 126 M 9.999999999999886 126 L 7.999999999999886 126 M 7.999999999999886 126 M 5.999999999999886 126 L 3.9999999999998863 126 M 3.9999999999998863 126 M 1.9999999999998863 126 L 0 126 Q 0 126 0 126 L 0 125.99999999999989 M 0 125.99999999999989 M 0 123.99999999999989 L 0 121.99999999999989 M 0 121.99999999999989 M 0 119.99999999999989 L 0 117.99999999999989 M 0 117.99999999999989 M 0 115.99999999999989 L 0 113.99999999999989 M 0 113.99999999999989 M 0 111.99999999999989 L 0 109.99999999999989 M 0 109.99999999999989 M 0 107.99999999999989 L 0 105.99999999999989 M 0 105.99999999999989 M 0 103.99999999999989 L 0 101.99999999999989 M 0 101.99999999999989 M 0 99.99999999999989 L 0 97.99999999999989 M 0 97.99999999999989 M 0 95.99999999999989 L 0 93.99999999999989 M 0 93.99999999999989 M 0 91.99999999999989 L 0 89.99999999999989 M 0 89.99999999999989 M 0 87.99999999999989 L 0 85.99999999999989 M 0 85.99999999999989 M 0 83.99999999999989 L 0 81.99999999999989 M 0 81.99999999999989 M 0 79.99999999999989 L 0 77.99999999999989 M 0 77.99999999999989 M 0 75.99999999999989 L 0 73.99999999999989 M 0 73.99999999999989 M 0 71.99999999999989 L 0 69.99999999999989 M 0 69.99999999999989 M 0 67.99999999999989 L 0 65.99999999999989 M 0 65.99999999999989 M 0 63.999999999999886 L 0 61.999999999999886 M 0 61.999999999999886 M 0 59.999999999999886 L 0 57.999999999999886 M 0 57.999999999999886 M 0 55.999999999999886 L 0 53.999999999999886 M 0 53.999999999999886 M 0 51.999999999999886 L 0 49.999999999999886 M 0 49.999999999999886 M 0 47.999999999999886 L 0 45.999999999999886 M 0 45.999999999999886 M 0 43.999999999999886 L 0 41.999999999999886 M 0 41.999999999999886 M 0 39.999999999999886 L 0 37.999999999999886 M 0 37.999999999999886 M 0 35.999999999999886 L 0 33.999999999999886 M 0 33.999999999999886 M 0 31.999999999999886 L 0 29.999999999999886 M 0 29.999999999999886 M 0 27.999999999999886 L 0 25.999999999999886 M 0 25.999999999999886 M 0 23.999999999999886 L 0 21.999999999999886 M 0 21.999999999999886 M 0 19.999999999999886 L 0 17.999999999999886 M 0 17.999999999999886 M 0 15.999999999999886 L 0 13.999999999999886 M 0 13.999999999999886 M 0 11.999999999999886 L 0 9.999999999999886 M 0 9.999999999999886 M 0 7.999999999999886 L 0 5.999999999999886 M 0 5.999999999999886 M 0 3.9999999999998863 L 0 1.9999999999998863 M 0 1.9999999999998863 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="translate(0,0) matrix(1,0,0,1,31.5,23.5)"><g transform="translate(4,4) scale(1.01,1.0133333333333334)"><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="#000000" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" opacity="0.294117647"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="rgb(0,0,0)" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-opacity="0" stroke-miterlimit="10" stroke-width="2" opacity="0.294117647"/></g></g></g></g></g><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="url(#hEFQTXIBbAaX)" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="url(#hEFQTXIBbAaX)" stroke="#333333" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,42,54)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="80" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="80" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="24.326171875" y="0" width="32" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="24.326171875" y="0" width="32" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="24" y="11">H</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="33" y="11">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="40" y="11">s</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="46" y="11">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="49" y="11">2</text></g></g><g transform="matrix(1,0,0,1,22,9)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="146" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="146" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="107" height="14" fill-opacity="0"/></g><text fill="rgb(183, 183, 183)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="0" y="11">eth0</text><text fill="rgb(183, 183, 183)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="27" y="11">2001</text><text fill="rgb(183, 183, 183)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="53" y="11">:</text><text fill="rgb(183, 183, 183)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="57" y="11">db8</text><text fill="rgb(183, 183, 183)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="77" y="11">::</text><text fill="rgb(183, 183, 183)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="83" y="11">1</text><text fill="rgb(183, 183, 183)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="90" y="11">/</text><text fill="rgb(183, 183, 183)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="93" y="11">64</text></g></g><g transform="matrix(1,0,0,1,9,106)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="146" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="146" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="23.2978515625" y="0" width="100" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="23.2978515625" y="0" width="100" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="23" y="11">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="30" y="11">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="37" y="11">c</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="43" y="11">k</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="49" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="55" y="11">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="59" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="69" y="11">f</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="73" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="79" y="11">8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="86" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="93" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="96" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="99" y="11">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="106" y="11">/</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="109" y="11">6</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="116" y="11">4</text></g></g><g transform="matrix(1,0,0,1,149,29)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="245" height="16" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="245" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="225" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="176" height="14" fill-opacity="0"/></g><text fill="rgb(183, 183, 183)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="0" y="11">ip</text><text fill="rgb(183, 183, 183)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="9" y="11"> -</text><text fill="rgb(183, 183, 183)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="17" y="11">6</text><text fill="rgb(183, 183, 183)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="27" y="11">route</text><text fill="rgb(183, 183, 183)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="57" y="11">add</text><text fill="rgb(183, 183, 183)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="81" y="11">default</text><text fill="rgb(183, 183, 183)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="120" y="11">via</text><text fill="rgb(183, 183, 183)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="139" y="11">fe80</text><text fill="rgb(183, 183, 183)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="162" y="11">::</text><text fill="rgb(183, 183, 183)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="169" y="11">1</text></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="175.453125" y="0" width="50" height="14" fill-opacity="0"/></g><text fill="rgb(183, 183, 183)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="179" y="11">dev</text><text fill="rgb(183, 183, 183)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="201" y="11">eth0</text></g></g><g transform="matrix(1,0,0,1,149,83)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="245" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="245" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="168" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="168" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="0" y="11">ip</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="9" y="11"> -</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="17" y="11">6</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="27" y="11">route</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="57" y="11">add</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="81" y="11">2001</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="107" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="111" y="11">db8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="131" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="134" y="11">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="141" y="11">::/</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="151" y="11">64</text></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="167.4609375" y="0" width="66" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="167" y="11">dev</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="190" y="11">docker0</text></g></g></g></svg> \ No newline at end of file
diff --git a/docs/sources/article-img/ipv6_ndp_proxying.gliffy b/docs/sources/article-img/ipv6_ndp_proxying.gliffy
new file mode 100644
index 0000000000..698723e19f
--- /dev/null
+++ b/docs/sources/article-img/ipv6_ndp_proxying.gliffy
@@ -0,0 +1 @@
+{"contentType":"application/gliffy+json","version":"1.3","stage":{"background":"#FFFFFF","width":616,"height":438,"nodeIndex":207,"autoFit":true,"exportBorder":false,"gridOn":false,"snapToGrid":false,"drawingGuidesOn":true,"pageBreaksOn":false,"printGridOn":false,"printPaper":"LETTER","printShrinkToFit":false,"printPortrait":true,"maxWidth":5000,"maxHeight":5000,"themeData":null,"viewportType":"default","fitBB":{"min":{"x":3,"y":-7.75},"max":{"x":615.5,"y":437.5}},"objects":[{"x":173.0,"y":117.0,"rotation":0.0,"id":190,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":30,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":0,"py":1.0,"px":0.7071067811865476}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":186,"py":0.0,"px":0.2928932188134524}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#cccccc","fillColor":"none","dashStyle":"4.0,4.0","startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[120.21067811865476,-7.0],[335.78932188134524,57.5]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]},{"x":195.0,"y":117.0,"rotation":0.0,"id":83,"width":150.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":23,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-family:Arial;font-size:12px;\"><span style=\"\">eth0 2001:db8::1/64</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":222.5,"y":35.0,"rotation":0.0,"id":0,"width":100.0,"height":75.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":7,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#fff2cc","gradient":true,"dashStyle":null,"dropShadow":true,"state":0,"opacity":1.0,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":1,"width":96.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-family:Arial;font-size:12px;text-decoration:none;\"><span style=\"text-decoration:none;\">Router</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[]}]},{"x":26.0,"y":109.0,"rotation":0.0,"id":33,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":6,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":0,"py":0.9999999999999998,"px":0.29289321881345254}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":2,"py":0.0,"px":0.7071067811865476}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#cccccc","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[225.78932188134524,0.9999999999999858],[57.710678118654755,65.5]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]},{"x":20.289321881345245,"y":150.0,"rotation":0.0,"id":32,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":5,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":4,"py":0.0,"px":0.2928932188134524}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":0,"py":1.0,"px":0.7071067811865476}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#cccccc","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[333.5,24.5],[272.9213562373095,-40.0]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]},{"x":271.0,"y":37.0,"rotation":0.0,"id":89,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":1,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":0,"py":0.0,"px":0.5}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#d9d9d9","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":10.0,"controlPath":[[1.5,-2.0],[1.5,-21.125],[1.5,-21.125],[1.5,-40.25]],"lockSegments":{},"ortho":true}},"linkMap":[],"children":[]},{"x":151.0,"y":115.0,"rotation":0.0,"id":183,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":0,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":0,"py":1.0,"px":0.5}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":179,"py":0.0,"px":0.5}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#cccccc","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[121.5,-5.0],[62.5,59.5]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]},{"x":455.5,"y":257.0,"rotation":0.0,"id":200,"width":150.0,"height":28.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":200,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":5,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-family:Arial;font-style:italic;font-size:12px;\"><span style=\"\">expected Container location</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":467.5,"y":156.0,"rotation":0.0,"id":185,"width":150.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":29,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:left;\"><span style=\"font-family:Arial;font-size:12px;\"><span style=\"\">eth0 2001:db8::c00y/64</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":479.5,"y":174.5,"rotation":0.0,"id":186,"width":100.0,"height":75.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":27,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#e2e2e2","gradient":false,"dashStyle":"2,2","dropShadow":true,"state":0,"opacity":1.0,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":187,"width":96.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-family:Arial;font-size:12px;text-decoration:none;\"><span style=\"text-decoration:none;\">Container x</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[]}]},{"x":151.5,"y":156.0,"rotation":0.0,"id":178,"width":150.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":26,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:left;\"><span style=\"font-family:Arial;font-size:12px;\"><span style=\"\">eth0 2001:db8::b001/64</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":163.5,"y":174.5,"rotation":0.0,"id":179,"width":100.0,"height":75.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":24,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#a4c2f4","gradient":true,"dashStyle":null,"dropShadow":true,"state":0,"opacity":1.0,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":180,"width":96.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-family:Arial;font-size:12px;text-decoration:none;\"><span style=\"text-decoration:none;\">Host2</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[]}]},{"x":299.5,"y":257.0,"rotation":0.0,"id":9,"width":150.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":15,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-family:Arial;font-size:12px;\"><span style=\"\">docker0 fe80::1/64</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":317.5,"y":156.0,"rotation":0.0,"id":7,"width":150.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":14,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:left;\"><span style=\"\">eth0 2001:db8::c001/64</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":1.0,"y":156.0,"rotation":0.0,"id":6,"width":150.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":13,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:left;\"><span style=\"font-family:Arial;font-size:12px;\"><span style=\"\">eth0 2001:db8::a001/64</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":324.5,"y":174.5,"rotation":0.0,"id":4,"width":100.0,"height":75.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":11,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#a4c2f4","gradient":true,"dashStyle":null,"dropShadow":true,"state":0,"opacity":1.0,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":5,"width":96.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-family:Arial;font-size:12px;text-decoration:none;\"><span style=\"text-decoration:none;\">Host3</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[]}]},{"x":13.0,"y":174.5,"rotation":0.0,"id":2,"width":100.0,"height":75.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":9,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#a4c2f4","gradient":true,"dashStyle":null,"dropShadow":true,"state":0,"opacity":1.0,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":3,"width":96.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-family:Arial;font-size:12px;text-decoration:none;\"><span style=\"text-decoration:none;\">Host1</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[]}]},{"x":-142.5,"y":118.5,"rotation":0.0,"id":31,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":4,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":4,"py":1.0,"px":0.7071067811865476}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":25,"py":0.0,"px":0.5}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#cccccc","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[537.7106781186548,131.0],[602.0,204.5]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]},{"x":-181.5,"y":122.5,"rotation":0.0,"id":30,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":3,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":4,"py":0.9999999999999998,"px":0.29289321881345254}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":27,"py":0.0,"px":0.5}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#cccccc","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[535.2893218813452,127.0],[473.0,200.5]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]},{"x":386.0,"y":306.0,"rotation":0.0,"id":78,"width":150.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":22,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"\">eth0 2001:db8::c00a/125</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":218.0,"y":306.0,"rotation":0.0,"id":77,"width":150.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":21,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"\">eth0 2001:db8::c009/125</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":409.5,"y":323.0,"rotation":0.0,"id":25,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.square","order":18,"lockAspectRatio":true,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#ead1dc","gradient":true,"dashStyle":null,"dropShadow":true,"state":0,"opacity":1.0,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":26,"width":96.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-family:Arial;font-size:12px;text-decoration:none;\"><span style=\"text-decoration:none;\">Container2</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[]}]},{"x":241.5,"y":323.0,"rotation":0.0,"id":27,"width":99.99999999999999,"height":99.99999999999999,"uid":"com.gliffy.shape.basic.basic_v1.default.square","order":16,"lockAspectRatio":true,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#ead1dc","gradient":true,"dashStyle":null,"dropShadow":true,"state":0,"opacity":1.0,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":28,"width":95.99999999999999,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-family:Arial;font-size:12px;text-decoration:none;\"><span style=\"text-decoration:none;\">Container1</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[]}]},{"x":207.75,"y":297.5,"rotation":0.0,"id":58,"width":339.75,"height":140.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":2,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dashStyle":"2,2","dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[]}],"shapeStyles":{"com.gliffy.shape.basic.basic_v1.default":{"fill":"#e2e2e2","stroke":"#333333","strokeWidth":2,"dashStyle":"2.0,2.0","gradient":false,"shadow":true}},"lineStyles":{"global":{"stroke":"#cccccc","strokeWidth":2,"dashStyle":"4.0,4.0"}},"textStyles":{"global":{"size":"12px","italic":true}}},"metadata":{"title":"untitled","revision":0,"exportBorder":false,"loadPosition":"default","libraries":["com.gliffy.libraries.basic.basic_v1.default","com.gliffy.libraries.flowchart.flowchart_v1.default","com.gliffy.libraries.swimlanes.swimlanes_v1.default","com.gliffy.libraries.uml.uml_v2.class","com.gliffy.libraries.uml.uml_v2.sequence","com.gliffy.libraries.uml.uml_v2.activity","com.gliffy.libraries.erd.erd_v1.default","com.gliffy.libraries.ui.ui_v3.containers_content","com.gliffy.libraries.ui.ui_v3.forms_controls","com.gliffy.libraries.images"],"autosaveDisabled":false},"embeddedResources":{"index":0,"resources":[]}} \ No newline at end of file
diff --git a/docs/sources/article-img/ipv6_ndp_proxying.svg b/docs/sources/article-img/ipv6_ndp_proxying.svg
new file mode 100644
index 0000000000..49b2da9f0d
--- /dev/null
+++ b/docs/sources/article-img/ipv6_ndp_proxying.svg
@@ -0,0 +1 @@
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="635.5" height="457.5"><style xmlns="http://www.w3.org/1999/xhtml"></style><defs><linearGradient id="xKnpNsEUztog" x1="0px" x2="0px" y1="100px" y2="-50px" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#fff2cc"/><stop offset="1" stop-color="#FFFFFF"/></linearGradient><linearGradient id="oGRgamfHfecD" x1="0px" x2="0px" y1="100px" y2="-50px" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#a4c2f4"/><stop offset="1" stop-color="#FFFFFF"/></linearGradient><linearGradient id="ubSpGvJiSkdd" x1="0px" x2="0px" y1="100px" y2="-50px" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#a4c2f4"/><stop offset="1" stop-color="#FFFFFF"/></linearGradient><linearGradient id="keFrGZTtpCuO" x1="0px" x2="0px" y1="100px" y2="-50px" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ead1dc"/><stop offset="1" stop-color="#FFFFFF"/></linearGradient><linearGradient id="naovqTKySRGJ" x1="0px" x2="0px" y1="100px" y2="-50px" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ead1dc"/><stop offset="1" stop-color="#FFFFFF"/></linearGradient><linearGradient id="AKcGbNDhiIrM" x1="0px" x2="0px" y1="100px" y2="-50px" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#a4c2f4"/><stop offset="1" stop-color="#FFFFFF"/></linearGradient></defs><g transform="translate(0,0)"><g><rect fill="#FFFFFF" stroke="none" x="0" y="0" width="635.5" height="457.5"/></g><g transform="matrix(1,0,0,1,209,105.5)"><g transform="translate(0,0)"><g transform="translate(-151,-115) translate(-58,9.5) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#cccccc" d="M 272.5 110 L 213.5 174.5" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g><g transform="matrix(1,0,0,1,268,-7.75)"><g transform="translate(0,0)"><g transform="translate(-271,-37) translate(3,44.75) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#d9d9d9" d="M 272.5 35 L 272.5 25.4375 Q 272.5 15.875 272.5 15.875 L 272.5 15.875 Q 272.5 15.875 272.5 6.3125 L 272.5 -3.25" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g><g transform="translate(0,0) matrix(1,0,0,1,207.75,297.5)"><g><g transform="translate(0,0) scale(3.3975,1.4)"><g><path fill="#FFFFFF" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(0.29433406916850624,0.7142857142857143)"><path fill="none" stroke="none" d="M 0 0 L 339.75 0 Q 339.75 0 339.75 0 L 339.75 140 Q 339.75 140 339.75 140 L 0 140 Q 0 140 0 140 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" d="M 0 0 M 0 0 L 2 0 M 2 0 M 4 0 L 6 0 M 6 0 M 8 0 L 10 0 M 10 0 M 12 0 L 14 0 M 14 0 M 16 0 L 18 0 M 18 0 M 20 0 L 22 0 M 22 0 M 24 0 L 26 0 M 26 0 M 28 0 L 30 0 M 30 0 M 32 0 L 34 0 M 34 0 M 36 0 L 38 0 M 38 0 M 40 0 L 42 0 M 42 0 M 44 0 L 46 0 M 46 0 M 48 0 L 50 0 M 50 0 M 52 0 L 54 0 M 54 0 M 56 0 L 58 0 M 58 0 M 60 0 L 62 0 M 62 0 M 64 0 L 66 0 M 66 0 M 68 0 L 70 0 M 70 0 M 72 0 L 74 0 M 74 0 M 76 0 L 78 0 M 78 0 M 80 0 L 82 0 M 82 0 M 84 0 L 86 0 M 86 0 M 88 0 L 90 0 M 90 0 M 92 0 L 94 0 M 94 0 M 96 0 L 98 0 M 98 0 M 100 0 L 102 0 M 102 0 M 104 0 L 106 0 M 106 0 M 108 0 L 110 0 M 110 0 M 112 0 L 114 0 M 114 0 M 116 0 L 118 0 M 118 0 M 120 0 L 122 0 M 122 0 M 124 0 L 126 0 M 126 0 M 128 0 L 130 0 M 130 0 M 132 0 L 134 0 M 134 0 M 136 0 L 138 0 M 138 0 M 140 0 L 142 0 M 142 0 M 144 0 L 146 0 M 146 0 M 148 0 L 150 0 M 150 0 M 152 0 L 154 0 M 154 0 M 156 0 L 158 0 M 158 0 M 160 0 L 162 0 M 162 0 M 164 0 L 166 0 M 166 0 M 168 0 L 170 0 M 170 0 M 172 0 L 174 0 M 174 0 M 176 0 L 178 0 M 178 0 M 180 0 L 182 0 M 182 0 M 184 0 L 186 0 M 186 0 M 188 0 L 190 0 M 190 0 M 192 0 L 194 0 M 194 0 M 196 0 L 198 0 M 198 0 M 200 0 L 202 0 M 202 0 M 204 0 L 206 0 M 206 0 M 208 0 L 210 0 M 210 0 M 212 0 L 214 0 M 214 0 M 216 0 L 218 0 M 218 0 M 220 0 L 222 0 M 222 0 M 224 0 L 226 0 M 226 0 M 228 0 L 230 0 M 230 0 M 232 0 L 234 0 M 234 0 M 236 0 L 238 0 M 238 0 M 240 0 L 242 0 M 242 0 M 244 0 L 246 0 M 246 0 M 248 0 L 250 0 M 250 0 M 252 0 L 254 0 M 254 0 M 256 0 L 258 0 M 258 0 M 260 0 L 262 0 M 262 0 M 264 0 L 266 0 M 266 0 M 268 0 L 270 0 M 270 0 M 272 0 L 274 0 M 274 0 M 276 0 L 278 0 M 278 0 M 280 0 L 282 0 M 282 0 M 284 0 L 286 0 M 286 0 M 288 0 L 290 0 M 290 0 M 292 0 L 294 0 M 294 0 M 296 0 L 298 0 M 298 0 M 300 0 L 302 0 M 302 0 M 304 0 L 306 0 M 306 0 M 308 0 L 310 0 M 310 0 M 312 0 L 314 0 M 314 0 M 316 0 L 318 0 M 318 0 M 320 0 L 322 0 M 322 0 M 324 0 L 326 0 M 326 0 M 328 0 L 330 0 M 330 0 M 332 0 L 334 0 M 334 0 M 336 0 L 338 0 M 338 0 M 339.75 0.25 L 339.75 2.25 M 339.75 2.25 M 339.75 4.25 L 339.75 6.25 M 339.75 6.25 M 339.75 8.25 L 339.75 10.25 M 339.75 10.25 M 339.75 12.25 L 339.75 14.25 M 339.75 14.25 M 339.75 16.25 L 339.75 18.25 M 339.75 18.25 M 339.75 20.25 L 339.75 22.25 M 339.75 22.25 M 339.75 24.25 L 339.75 26.25 M 339.75 26.25 M 339.75 28.25 L 339.75 30.25 M 339.75 30.25 M 339.75 32.25 L 339.75 34.25 M 339.75 34.25 M 339.75 36.25 L 339.75 38.25 M 339.75 38.25 M 339.75 40.25 L 339.75 42.25 M 339.75 42.25 M 339.75 44.25 L 339.75 46.25 M 339.75 46.25 M 339.75 48.25 L 339.75 50.25 M 339.75 50.25 M 339.75 52.25 L 339.75 54.25 M 339.75 54.25 M 339.75 56.25 L 339.75 58.25 M 339.75 58.25 M 339.75 60.25 L 339.75 62.25 M 339.75 62.25 M 339.75 64.25 L 339.75 66.25 M 339.75 66.25 M 339.75 68.25 L 339.75 70.25 M 339.75 70.25 M 339.75 72.25 L 339.75 74.25 M 339.75 74.25 M 339.75 76.25 L 339.75 78.25 M 339.75 78.25 M 339.75 80.25 L 339.75 82.25 M 339.75 82.25 M 339.75 84.25 L 339.75 86.25 M 339.75 86.25 M 339.75 88.25 L 339.75 90.25 M 339.75 90.25 M 339.75 92.25 L 339.75 94.25 M 339.75 94.25 M 339.75 96.25 L 339.75 98.25 M 339.75 98.25 M 339.75 100.25 L 339.75 102.25 M 339.75 102.25 M 339.75 104.25 L 339.75 106.25 M 339.75 106.25 M 339.75 108.25 L 339.75 110.25 M 339.75 110.25 M 339.75 112.25 L 339.75 114.25 M 339.75 114.25 M 339.75 116.25 L 339.75 118.25 M 339.75 118.25 M 339.75 120.25 L 339.75 122.25 M 339.75 122.25 M 339.75 124.25 L 339.75 126.25 M 339.75 126.25 M 339.75 128.25 L 339.75 130.25 M 339.75 130.25 M 339.75 132.25 L 339.75 134.25 M 339.75 134.25 M 339.75 136.25 L 339.75 138.25 M 339.75 138.25 M 339.5 140 L 337.5 140 M 337.5 140 M 335.5 140 L 333.5 140 M 333.5 140 M 331.5 140 L 329.5 140 M 329.5 140 M 327.5 140 L 325.5 140 M 325.5 140 M 323.5 140 L 321.5 140 M 321.5 140 M 319.5 140 L 317.5 140 M 317.5 140 M 315.5 140 L 313.5 140 M 313.5 140 M 311.5 140 L 309.5 140 M 309.5 140 M 307.5 140 L 305.5 140 M 305.5 140 M 303.5 140 L 301.5 140 M 301.5 140 M 299.5 140 L 297.5 140 M 297.5 140 M 295.5 140 L 293.5 140 M 293.5 140 M 291.5 140 L 289.5 140 M 289.5 140 M 287.5 140 L 285.5 140 M 285.5 140 M 283.5 140 L 281.5 140 M 281.5 140 M 279.5 140 L 277.5 140 M 277.5 140 M 275.5 140 L 273.5 140 M 273.5 140 M 271.5 140 L 269.5 140 M 269.5 140 M 267.5 140 L 265.5 140 M 265.5 140 M 263.5 140 L 261.5 140 M 261.5 140 M 259.5 140 L 257.5 140 M 257.5 140 M 255.5 140 L 253.5 140 M 253.5 140 M 251.5 140 L 249.5 140 M 249.5 140 M 247.5 140 L 245.5 140 M 245.5 140 M 243.5 140 L 241.5 140 M 241.5 140 M 239.5 140 L 237.5 140 M 237.5 140 M 235.5 140 L 233.5 140 M 233.5 140 M 231.5 140 L 229.5 140 M 229.5 140 M 227.5 140 L 225.5 140 M 225.5 140 M 223.5 140 L 221.5 140 M 221.5 140 M 219.5 140 L 217.5 140 M 217.5 140 M 215.5 140 L 213.5 140 M 213.5 140 M 211.5 140 L 209.5 140 M 209.5 140 M 207.5 140 L 205.5 140 M 205.5 140 M 203.5 140 L 201.5 140 M 201.5 140 M 199.5 140 L 197.5 140 M 197.5 140 M 195.5 140 L 193.5 140 M 193.5 140 M 191.5 140 L 189.5 140 M 189.5 140 M 187.5 140 L 185.5 140 M 185.5 140 M 183.5 140 L 181.5 140 M 181.5 140 M 179.5 140 L 177.5 140 M 177.5 140 M 175.5 140 L 173.5 140 M 173.5 140 M 171.5 140 L 169.5 140 M 169.5 140 M 167.5 140 L 165.5 140 M 165.5 140 M 163.5 140 L 161.5 140 M 161.5 140 M 159.5 140 L 157.5 140 M 157.5 140 M 155.5 140 L 153.5 140 M 153.5 140 M 151.5 140 L 149.5 140 M 149.5 140 M 147.5 140 L 145.5 140 M 145.5 140 M 143.5 140 L 141.5 140 M 141.5 140 M 139.5 140 L 137.5 140 M 137.5 140 M 135.5 140 L 133.5 140 M 133.5 140 M 131.5 140 L 129.5 140 M 129.5 140 M 127.5 140 L 125.5 140 M 125.5 140 M 123.5 140 L 121.5 140 M 121.5 140 M 119.5 140 L 117.5 140 M 117.5 140 M 115.5 140 L 113.5 140 M 113.5 140 M 111.5 140 L 109.5 140 M 109.5 140 M 107.5 140 L 105.5 140 M 105.5 140 M 103.5 140 L 101.5 140 M 101.5 140 M 99.5 140 L 97.5 140 M 97.5 140 M 95.5 140 L 93.5 140 M 93.5 140 M 91.5 140 L 89.5 140 M 89.5 140 M 87.5 140 L 85.5 140 M 85.5 140 M 83.5 140 L 81.5 140 M 81.5 140 M 79.5 140 L 77.5 140 M 77.5 140 M 75.5 140 L 73.5 140 M 73.5 140 M 71.5 140 L 69.5 140 M 69.5 140 M 67.5 140 L 65.5 140 M 65.5 140 M 63.5 140 L 61.5 140 M 61.5 140 M 59.5 140 L 57.5 140 M 57.5 140 M 55.5 140 L 53.5 140 M 53.5 140 M 51.5 140 L 49.5 140 M 49.5 140 M 47.5 140 L 45.5 140 M 45.5 140 M 43.5 140 L 41.5 140 M 41.5 140 M 39.5 140 L 37.5 140 M 37.5 140 M 35.5 140 L 33.5 140 M 33.5 140 M 31.5 140 L 29.5 140 M 29.5 140 M 27.5 140 L 25.5 140 M 25.5 140 M 23.5 140 L 21.5 140 M 21.5 140 M 19.5 140 L 17.5 140 M 17.5 140 M 15.5 140 L 13.5 140 M 13.5 140 M 11.5 140 L 9.5 140 M 9.5 140 M 7.5 140 L 5.5 140 M 5.5 140 M 3.5 140 L 1.5 140 M 1.5 140 M 0 139.5 L 0 137.5 M 0 137.5 M 0 135.5 L 0 133.5 M 0 133.5 M 0 131.5 L 0 129.5 M 0 129.5 M 0 127.5 L 0 125.5 M 0 125.5 M 0 123.5 L 0 121.5 M 0 121.5 M 0 119.5 L 0 117.5 M 0 117.5 M 0 115.5 L 0 113.5 M 0 113.5 M 0 111.5 L 0 109.5 M 0 109.5 M 0 107.5 L 0 105.5 M 0 105.5 M 0 103.5 L 0 101.5 M 0 101.5 M 0 99.5 L 0 97.5 M 0 97.5 M 0 95.5 L 0 93.5 M 0 93.5 M 0 91.5 L 0 89.5 M 0 89.5 M 0 87.5 L 0 85.5 M 0 85.5 M 0 83.5 L 0 81.5 M 0 81.5 M 0 79.5 L 0 77.5 M 0 77.5 M 0 75.5 L 0 73.5 M 0 73.5 M 0 71.5 L 0 69.5 M 0 69.5 M 0 67.5 L 0 65.5 M 0 65.5 M 0 63.5 L 0 61.5 M 0 61.5 M 0 59.5 L 0 57.5 M 0 57.5 M 0 55.5 L 0 53.5 M 0 53.5 M 0 51.5 L 0 49.5 M 0 49.5 M 0 47.5 L 0 45.5 M 0 45.5 M 0 43.5 L 0 41.5 M 0 41.5 M 0 39.5 L 0 37.5 M 0 37.5 M 0 35.5 L 0 33.5 M 0 33.5 M 0 31.5 L 0 29.5 M 0 29.5 M 0 27.5 L 0 25.5 M 0 25.5 M 0 23.5 L 0 21.5 M 0 21.5 M 0 19.5 L 0 17.5 M 0 17.5 M 0 15.5 L 0 13.5 M 0 13.5 M 0 11.5 L 0 9.5 M 0 9.5 M 0 7.5 L 0 5.5 M 0 5.5 M 0 3.5 L 0 1.5 M 0 1.5 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,287,245)"><g transform="translate(0,0)"><g transform="translate(181.5,-122.5) translate(-468.5,-122.5) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#cccccc" d="M 353.78932188134524 249.5 L 291.5 323" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g><g transform="matrix(1,0,0,1,390.71067811865476,245)"><g transform="translate(0,0)"><g transform="translate(142.5,-118.5) translate(-533.2106781186548,-126.5) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#cccccc" d="M 395.21067811865476 249.5 L 459.5 323" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g><g transform="matrix(1,0,0,1,288.71067811865476,105.5)"><g transform="translate(0,0)"><g transform="translate(-20.289321881345245,-150) translate(-268.4213562373095,44.5) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#cccccc" d="M 353.78932188134524 174.5 L 293.21067811865476 110" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g><g transform="matrix(1,0,0,1,79.21067811865476,105.49999999999999)"><g transform="translate(0,0)"><g transform="translate(-26,-109) translate(-53.210678118654755,3.500000000000014) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#cccccc" d="M 251.78932188134524 109.99999999999999 L 83.71067811865476 174.5" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g><g transform="translate(0,0) matrix(1,0,0,1,222.5,35)"><g transform="translate(4,4) scale(1.01,1.0133333333333334)"><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="#000000" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" opacity="0.294117647"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="rgb(0,0,0)" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-opacity="0" stroke-miterlimit="10" stroke-width="2" opacity="0.294117647"/></g></g></g></g></g><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="url(#xKnpNsEUztog)" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="url(#xKnpNsEUztog)" stroke="#333333" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,233,66)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="80" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="80" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="21.9912109375" y="0" width="38" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="21.9912109375" y="0" width="38" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="22" y="11">R</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="31" y="11">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="37" y="11">u</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="44" y="11">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="47" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="54" y="11">r</text></g></g><g transform="translate(0,0) matrix(1,0,0,1,13,174.5)"><g transform="translate(4,4) scale(1.01,1.0133333333333334)"><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="#000000" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" opacity="0.294117647"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="rgb(0,0,0)" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-opacity="0" stroke-miterlimit="10" stroke-width="2" opacity="0.294117647"/></g></g></g></g></g><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="url(#oGRgamfHfecD)" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="url(#oGRgamfHfecD)" stroke="#333333" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,23,205)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="80" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="80" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="24.326171875" y="0" width="32" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="24.326171875" y="0" width="32" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="24" y="11">H</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="33" y="11">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="40" y="11">s</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="46" y="11">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="49" y="11">1</text></g></g><g transform="translate(0,0) matrix(1,0,0,1,324.5,174.5)"><g transform="translate(4,4) scale(1.01,1.0133333333333334)"><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="#000000" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" opacity="0.294117647"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="rgb(0,0,0)" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-opacity="0" stroke-miterlimit="10" stroke-width="2" opacity="0.294117647"/></g></g></g></g></g><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="url(#ubSpGvJiSkdd)" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="url(#ubSpGvJiSkdd)" stroke="#333333" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,335,205)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="80" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="80" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="24.326171875" y="0" width="32" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="24.326171875" y="0" width="32" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="24" y="11">H</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="33" y="11">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="40" y="11">s</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="46" y="11">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="49" y="11">3</text></g></g><g transform="matrix(1,0,0,1,3,156)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="146" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="146" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="127" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="127" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="0" y="11">eth0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="27" y="11">2001</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="53" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="57" y="11">db8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="77" y="11">::</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="83" y="11">a001</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="110" y="11">/</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="113" y="11">64</text></g></g><g transform="matrix(1,0,0,1,320,156)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="146" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="146" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="127" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="0" y="11">eth0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="27" y="11">2001</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="53" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="57" y="11">db8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="77" y="11">::</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="83" y="11">c001</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="109" y="11">/</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="113" y="11">64</text></g></g><g transform="matrix(1,0,0,1,302,257)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="146" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="146" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="23.2978515625" y="0" width="100" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="23.2978515625" y="0" width="100" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="23" y="11">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="30" y="11">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="37" y="11">c</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="43" y="11">k</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="49" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="55" y="11">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="59" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="69" y="11">f</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="73" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="79" y="11">8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="86" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="93" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="96" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="99" y="11">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="106" y="11">/</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="109" y="11">6</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="116" y="11">4</text></g></g><g transform="translate(0,0) matrix(1,0,0,1,241.5,323)"><g transform="translate(4,4) scale(1.01,1.01)"><g><g transform="translate(0,0) scale(0.9999999999999999,0.9999999999999999)"><g><path fill="#000000" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" opacity="0.294117647"/><g transform="scale(1.0000000000000002,1.0000000000000002)"><path fill="none" stroke="none" d="M 0 0 L 99.99999999999999 0 Q 99.99999999999999 0 99.99999999999999 0 L 99.99999999999999 99.99999999999999 Q 99.99999999999999 99.99999999999999 99.99999999999999 99.99999999999999 L 0 99.99999999999999 Q 0 99.99999999999999 0 99.99999999999999 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="rgb(0,0,0)" d="M 0 0 M 0 0 L 99.99999999999999 0 Q 99.99999999999999 0 99.99999999999999 0 L 99.99999999999999 99.99999999999999 Q 99.99999999999999 99.99999999999999 99.99999999999999 99.99999999999999 L 0 99.99999999999999 Q 0 99.99999999999999 0 99.99999999999999 L 0 0 Q 0 0 0 0 Z" stroke-opacity="0" stroke-miterlimit="10" stroke-width="2" opacity="0.294117647"/></g></g></g></g></g><g><g transform="translate(0,0) scale(0.9999999999999999,0.9999999999999999)"><g><path fill="url(#keFrGZTtpCuO)" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1.0000000000000002,1.0000000000000002)"><path fill="none" stroke="none" d="M 0 0 L 99.99999999999999 0 Q 99.99999999999999 0 99.99999999999999 0 L 99.99999999999999 99.99999999999999 Q 99.99999999999999 99.99999999999999 99.99999999999999 99.99999999999999 L 0 99.99999999999999 Q 0 99.99999999999999 0 99.99999999999999 L 0 0 Q 0 0 0 0 Z"/><path fill="url(#keFrGZTtpCuO)" stroke="#333333" d="M 0 0 M 0 0 L 99.99999999999999 0 Q 99.99999999999999 0 99.99999999999999 0 L 99.99999999999999 99.99999999999999 Q 99.99999999999999 99.99999999999999 99.99999999999999 99.99999999999999 L 0 99.99999999999999 Q 0 99.99999999999999 0 99.99999999999999 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,252,366)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="80" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="80" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="10.6474609375" y="0" width="60" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="10.6474609375" y="0" width="60" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="11" y="11">C</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="19" y="11">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="26" y="11">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="33" y="11">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="36" y="11">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="43" y="11">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="45" y="11">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="52" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="59" y="11">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="63" y="11">1</text></g></g><g transform="translate(0,0) matrix(1,0,0,1,409.5,323)"><g transform="translate(4,4) scale(1.01,1.01)"><g><g transform="translate(0,0) scale(1,1)"><g><path fill="#000000" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" opacity="0.294117647"/><g transform="scale(1,1)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="rgb(0,0,0)" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" stroke-opacity="0" stroke-miterlimit="10" stroke-width="2" opacity="0.294117647"/></g></g></g></g></g><g><g transform="translate(0,0) scale(1,1)"><g><path fill="url(#naovqTKySRGJ)" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><path fill="url(#naovqTKySRGJ)" stroke="#333333" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,420,366)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="80" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="80" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="10.6474609375" y="0" width="60" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="10.6474609375" y="0" width="60" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="11" y="11">C</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="19" y="11">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="26" y="11">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="33" y="11">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="36" y="11">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="43" y="11">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="45" y="11">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="52" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="59" y="11">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="63" y="11">2</text></g></g><g transform="matrix(1,0,0,1,220,306)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="146" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="146" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="6.607421875" y="0" width="134" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="7" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="13" y="11">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="17" y="11">h</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="23" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="33" y="11">2</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="40" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="47" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="53" y="11">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="60" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="63" y="11">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="70" y="11">b</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="77" y="11">8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="83" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="87" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="90" y="11">c</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="96" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="103" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="109" y="11">9</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="116" y="11">/</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="119" y="11">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="126" y="11">2</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="133" y="11">5</text></g></g><g transform="matrix(1,0,0,1,388,306)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="146" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="146" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="6.607421875" y="0" width="134" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="7" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="13" y="11">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="17" y="11">h</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="23" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="33" y="11">2</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="40" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="47" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="53" y="11">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="60" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="63" y="11">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="70" y="11">b</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="77" y="11">8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="83" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="87" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="90" y="11">c</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="96" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="103" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="109" y="11">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="116" y="11">/</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="119" y="11">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="126" y="11">2</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="133" y="11">5</text></g></g><g transform="matrix(1,0,0,1,197,117)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="146" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="146" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="19.6181640625" y="0" width="108" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="19.6181640625" y="0" width="108" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="20" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="26" y="11">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="30" y="11">h</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="36" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="46" y="11">2</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="53" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="60" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="66" y="11">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="73" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="76" y="11">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="83" y="11">b</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="90" y="11">8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="96" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="100" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="103" y="11">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="110" y="11">/</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="113" y="11">6</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="120" y="11">4</text></g></g><g transform="translate(0,0) matrix(1,0,0,1,163.5,174.5)"><g transform="translate(4,4) scale(1.01,1.0133333333333334)"><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="#000000" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" opacity="0.294117647"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="rgb(0,0,0)" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-opacity="0" stroke-miterlimit="10" stroke-width="2" opacity="0.294117647"/></g></g></g></g></g><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="url(#AKcGbNDhiIrM)" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="url(#AKcGbNDhiIrM)" stroke="#333333" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,174,205)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="80" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="80" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="24.326171875" y="0" width="32" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="24.326171875" y="0" width="32" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="24" y="11">H</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="33" y="11">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="40" y="11">s</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="46" y="11">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="49" y="11">2</text></g></g><g transform="matrix(1,0,0,1,154,156)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="146" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="146" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="127" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="127" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="0" y="11">eth0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="27" y="11">2001</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="53" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="57" y="11">db8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="77" y="11">::</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="83" y="11">b001</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="110" y="11">/</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="113" y="11">64</text></g></g><g transform="translate(0,0) matrix(1,0,0,1,479.5,174.5)"><g transform="translate(4,4) scale(1.01,1.0133333333333334)"><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="#000000" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" opacity="0.294117647"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="rgb(0,0,0)" d="M 0 0 M 0 0 L 2 0 M 2 0 M 4 0 L 6 0 M 6 0 M 8 0 L 10 0 M 10 0 M 12 0 L 14 0 M 14 0 M 16 0 L 18 0 M 18 0 M 20 0 L 22 0 M 22 0 M 24 0 L 26 0 M 26 0 M 28 0 L 30 0 M 30 0 M 32 0 L 34 0 M 34 0 M 36 0 L 38 0 M 38 0 M 40 0 L 42 0 M 42 0 M 44 0 L 46 0 M 46 0 M 48 0 L 50 0 M 50 0 M 52 0 L 54 0 M 54 0 M 56 0 L 58 0 M 58 0 M 60 0 L 62 0 M 62 0 M 64 0 L 66 0 M 66 0 M 68 0 L 70 0 M 70 0 M 72 0 L 74 0 M 74 0 M 76 0 L 78 0 M 78 0 M 80 0 L 82 0 M 82 0 M 84 0 L 86 0 M 86 0 M 88 0 L 90 0 M 90 0 M 92 0 L 94 0 M 94 0 M 96 0 L 98 0 M 98 0 M 100 0 L 100 0 Q 100 0 100 0 L 100 2 M 100 2 M 100 4 L 100 6 M 100 6 M 100 8 L 100 10 M 100 10 M 100 12 L 100 14 M 100 14 M 100 16 L 100 18 M 100 18 M 100 20 L 100 22 M 100 22 M 100 24 L 100 26 M 100 26 M 100 28 L 100 30 M 100 30 M 100 32 L 100 34 M 100 34 M 100 36 L 100 38 M 100 38 M 100 40 L 100 42 M 100 42 M 100 44 L 100 46 M 100 46 M 100 48 L 100 50 M 100 50 M 100 52 L 100 54 M 100 54 M 100 56 L 100 58 M 100 58 M 100 60 L 100 62 M 100 62 M 100 64 L 100 66 M 100 66 M 100 68 L 100 70 M 100 70 M 100 72 L 100 74 M 100 74 M 99 75 L 97 75 M 97 75 M 95 75 L 93 75 M 93 75 M 91 75 L 89 75 M 89 75 M 87 75 L 85 75 M 85 75 M 83 75 L 81 75 M 81 75 M 79 75 L 77 75 M 77 75 M 75 75 L 73 75 M 73 75 M 71 75 L 69 75 M 69 75 M 67 75 L 65 75 M 65 75 M 63 75 L 61 75 M 61 75 M 59 75 L 57 75 M 57 75 M 55 75 L 53 75 M 53 75 M 51 75 L 49 75 M 49 75 M 47 75 L 45 75 M 45 75 M 43 75 L 41 75 M 41 75 M 39 75 L 37 75 M 37 75 M 35 75 L 33 75 M 33 75 M 31 75 L 29 75 M 29 75 M 27 75 L 25 75 M 25 75 M 23 75 L 21 75 M 21 75 M 19 75 L 17 75 M 17 75 M 15 75 L 13 75 M 13 75 M 11 75 L 9 75 M 9 75 M 7 75 L 5 75 M 5 75 M 3 75 L 1 75 M 1 75 M 0 74 L 0 72 M 0 72 M 0 70 L 0 68 M 0 68 M 0 66 L 0 64 M 0 64 M 0 62 L 0 60 M 0 60 M 0 58 L 0 56 M 0 56 M 0 54 L 0 52 M 0 52 M 0 50 L 0 48 M 0 48 M 0 46 L 0 44 M 0 44 M 0 42 L 0 40 M 0 40 M 0 38 L 0 36 M 0 36 M 0 34 L 0 32 M 0 32 M 0 30 L 0 28 M 0 28 M 0 26 L 0 24 M 0 24 M 0 22 L 0 20 M 0 20 M 0 18 L 0 16 M 0 16 M 0 14 L 0 12 M 0 12 M 0 10 L 0 8 M 0 8 M 0 6 L 0 4 M 0 4 M 0 2 L 0 0 M 0 0 Z" stroke-opacity="0" stroke-miterlimit="10" stroke-width="2" opacity="0.294117647"/></g></g></g></g></g><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="#e2e2e2" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" d="M 0 0 M 0 0 L 2 0 M 2 0 M 4 0 L 6 0 M 6 0 M 8 0 L 10 0 M 10 0 M 12 0 L 14 0 M 14 0 M 16 0 L 18 0 M 18 0 M 20 0 L 22 0 M 22 0 M 24 0 L 26 0 M 26 0 M 28 0 L 30 0 M 30 0 M 32 0 L 34 0 M 34 0 M 36 0 L 38 0 M 38 0 M 40 0 L 42 0 M 42 0 M 44 0 L 46 0 M 46 0 M 48 0 L 50 0 M 50 0 M 52 0 L 54 0 M 54 0 M 56 0 L 58 0 M 58 0 M 60 0 L 62 0 M 62 0 M 64 0 L 66 0 M 66 0 M 68 0 L 70 0 M 70 0 M 72 0 L 74 0 M 74 0 M 76 0 L 78 0 M 78 0 M 80 0 L 82 0 M 82 0 M 84 0 L 86 0 M 86 0 M 88 0 L 90 0 M 90 0 M 92 0 L 94 0 M 94 0 M 96 0 L 98 0 M 98 0 M 100 0 L 100 0 Q 100 0 100 0 L 100 2 M 100 2 M 100 4 L 100 6 M 100 6 M 100 8 L 100 10 M 100 10 M 100 12 L 100 14 M 100 14 M 100 16 L 100 18 M 100 18 M 100 20 L 100 22 M 100 22 M 100 24 L 100 26 M 100 26 M 100 28 L 100 30 M 100 30 M 100 32 L 100 34 M 100 34 M 100 36 L 100 38 M 100 38 M 100 40 L 100 42 M 100 42 M 100 44 L 100 46 M 100 46 M 100 48 L 100 50 M 100 50 M 100 52 L 100 54 M 100 54 M 100 56 L 100 58 M 100 58 M 100 60 L 100 62 M 100 62 M 100 64 L 100 66 M 100 66 M 100 68 L 100 70 M 100 70 M 100 72 L 100 74 M 100 74 M 99 75 L 97 75 M 97 75 M 95 75 L 93 75 M 93 75 M 91 75 L 89 75 M 89 75 M 87 75 L 85 75 M 85 75 M 83 75 L 81 75 M 81 75 M 79 75 L 77 75 M 77 75 M 75 75 L 73 75 M 73 75 M 71 75 L 69 75 M 69 75 M 67 75 L 65 75 M 65 75 M 63 75 L 61 75 M 61 75 M 59 75 L 57 75 M 57 75 M 55 75 L 53 75 M 53 75 M 51 75 L 49 75 M 49 75 M 47 75 L 45 75 M 45 75 M 43 75 L 41 75 M 41 75 M 39 75 L 37 75 M 37 75 M 35 75 L 33 75 M 33 75 M 31 75 L 29 75 M 29 75 M 27 75 L 25 75 M 25 75 M 23 75 L 21 75 M 21 75 M 19 75 L 17 75 M 17 75 M 15 75 L 13 75 M 13 75 M 11 75 L 9 75 M 9 75 M 7 75 L 5 75 M 5 75 M 3 75 L 1 75 M 1 75 M 0 74 L 0 72 M 0 72 M 0 70 L 0 68 M 0 68 M 0 66 L 0 64 M 0 64 M 0 62 L 0 60 M 0 60 M 0 58 L 0 56 M 0 56 M 0 54 L 0 52 M 0 52 M 0 50 L 0 48 M 0 48 M 0 46 L 0 44 M 0 44 M 0 42 L 0 40 M 0 40 M 0 38 L 0 36 M 0 36 M 0 34 L 0 32 M 0 32 M 0 30 L 0 28 M 0 28 M 0 26 L 0 24 M 0 24 M 0 22 L 0 20 M 0 20 M 0 18 L 0 16 M 0 16 M 0 14 L 0 12 M 0 12 M 0 10 L 0 8 M 0 8 M 0 6 L 0 4 M 0 4 M 0 2 L 0 0 M 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,490,205)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="80" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="80" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="9.3173828125" y="0" width="62" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="9.3173828125" y="0" width="62" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="9" y="11">C</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="18" y="11">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="25" y="11">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="31" y="11">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="35" y="11">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="41" y="11">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="44" y="11">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="51" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="57" y="11">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="65" y="11">x</text></g></g><g transform="matrix(1,0,0,1,470,156)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="146" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="146" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="126" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="126" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="0" y="11">eth0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="27" y="11">2001</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="53" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="57" y="11">db8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="77" y="11">::</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="83" y="11">c00y</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="109" y="11">/</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="112" y="11">64</text></g></g><g transform="matrix(1,0,0,1,288.71067811865476,105.5)"><g transform="translate(0,0)"><g transform="translate(-173,-117) translate(-115.71067811865476,11.5) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#cccccc" d="M 293.21067811865476 110 M 293.21067811865476 110 L 300.8749849214907 112.29312041376 M 300.8749849214907 112.29312041376 M 308.53929172432663 114.58624082751999 L 316.20359852716257 116.87936124127998 M 316.20359852716257 116.87936124127998 M 323.8679053299985 119.17248165503997 L 331.53221213283445 121.46560206879997 M 331.53221213283445 121.46560206879997 M 339.1965189356704 123.75872248255996 L 346.8608257385063 126.05184289631995 M 346.8608257385063 126.05184289631995 M 354.52513254134226 128.34496331007995 L 362.1894393441782 130.63808372383994 M 362.1894393441782 130.63808372383994 M 369.85374614701414 132.93120413759993 L 377.5180529498501 135.22432455135993 M 377.5180529498501 135.22432455135993 M 385.182359752686 137.51744496511992 L 392.84666655552195 139.81056537887991 M 392.84666655552195 139.81056537887991 M 400.5109733583579 142.1036857926399 L 408.1752801611938 144.3968062063999 M 408.1752801611938 144.3968062063999 M 415.83958696402976 146.6899266201599 L 423.5038937668657 148.9830470339199 M 423.5038937668657 148.9830470339199 M 431.16820056970164 151.27616744767988 L 438.8325073725376 153.56928786143988 M 438.8325073725376 153.56928786143988 M 446.4968141753735 155.86240827519987 L 454.16112097820945 158.15552868895983 M 454.16112097820945 158.15552868895983 M 461.8254277810454 160.4486491027198 L 469.48973458388133 162.7417695164798 M 469.48973458388133 162.7417695164798 M 477.15404138671727 165.03488993023976 L 484.8183481895532 167.32801034399975 M 484.8183481895532 167.32801034399975 M 492.48265499238914 169.62113075775972 L 500.1469617952251 171.9142511715197 M 500.1469617952251 171.9142511715197 M 507.811268598061 174.20737158527967 L 508.78932188134524 174.5" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g><g transform="matrix(1,0,0,1,458,257)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="146" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="146" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="20.9658203125" y="0" width="106" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="20.9658203125" y="0" width="106" height="28" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="italic" font-weight="normal" text-decoration="" line-height="14px" x="21" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="italic" font-weight="normal" text-decoration="" line-height="14px" x="28" y="11">x</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="italic" font-weight="normal" text-decoration="" line-height="14px" x="34" y="11">p</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="italic" font-weight="normal" text-decoration="" line-height="14px" x="40" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="italic" font-weight="normal" text-decoration="" line-height="14px" x="47" y="11">c</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="italic" font-weight="normal" text-decoration="" line-height="14px" x="53" y="11">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="italic" font-weight="normal" text-decoration="" line-height="14px" x="56" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="italic" font-weight="normal" text-decoration="" line-height="14px" x="63" y="11">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="italic" font-weight="normal" text-decoration="" line-height="14px" x="73" y="11">C</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="italic" font-weight="normal" text-decoration="" line-height="14px" x="82" y="11">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="italic" font-weight="normal" text-decoration="" line-height="14px" x="88" y="11">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="italic" font-weight="normal" text-decoration="" line-height="14px" x="95" y="11">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="italic" font-weight="normal" text-decoration="" line-height="14px" x="98" y="11">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="italic" font-weight="normal" text-decoration="" line-height="14px" x="105" y="11">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="italic" font-weight="normal" text-decoration="" line-height="14px" x="108" y="11">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="italic" font-weight="normal" text-decoration="" line-height="14px" x="114" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="italic" font-weight="normal" text-decoration="" line-height="14px" x="121" y="11">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="italic" font-weight="normal" text-decoration="" line-height="14px" x="52" y="25">l</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="italic" font-weight="normal" text-decoration="" line-height="14px" x="55" y="25">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="italic" font-weight="normal" text-decoration="" line-height="14px" x="62" y="25">c</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="italic" font-weight="normal" text-decoration="" line-height="14px" x="68" y="25">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="italic" font-weight="normal" text-decoration="" line-height="14px" x="74" y="25">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="italic" font-weight="normal" text-decoration="" line-height="14px" x="78" y="25">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="italic" font-weight="normal" text-decoration="" line-height="14px" x="80" y="25">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="italic" font-weight="normal" text-decoration="" line-height="14px" x="87" y="25">n</text></g></g></g></svg> \ No newline at end of file
diff --git a/docs/sources/article-img/ipv6_routed_network_example.gliffy b/docs/sources/article-img/ipv6_routed_network_example.gliffy
index aea452b625..81ab0ed879 100644
--- a/docs/sources/article-img/ipv6_routed_network_example.gliffy
+++ b/docs/sources/article-img/ipv6_routed_network_example.gliffy
@@ -1 +1 @@
-{"contentType":"application/gliffy+json","version":"1.3","stage":{"background":"#FFFFFF","width":757,"height":503,"nodeIndex":174,"autoFit":true,"exportBorder":false,"gridOn":false,"snapToGrid":false,"drawingGuidesOn":true,"pageBreaksOn":false,"printGridOn":false,"printPaper":"LETTER","printShrinkToFit":false,"printPortrait":true,"maxWidth":5000,"maxHeight":5000,"themeData":null,"viewportType":"default","fitBB":{"min":{"x":-9.000680271168676,"y":-4.75},"max":{"x":756.0183424505415,"y":502.5}},"objects":[{"x":765.0,"y":250.0,"rotation":0.0,"id":169,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":47,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Line","Line":{"strokeWidth":1.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[-12.982306425886122,0.0],[-41.25,0.0]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]},{"x":663.0,"y":362.5,"rotation":270.0,"id":168,"width":150.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":46,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:12px;font-family:Arial;\"><span style=\"\">managed by Docker</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":747.0,"y":472.0,"rotation":0.0,"id":166,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":45,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Line","Line":{"strokeWidth":1.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":2,"endArrow":2,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[0.0,14.008510484195028],[0.0,-221.0]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]},{"x":25.5,"y":254.0,"rotation":0.0,"id":162,"width":194.49999999999997,"height":28.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":43,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:left;\"><span style=\"font-size:12px;font-family:Arial;\"><span style=\"\">route -A inet6 2001:db8:1:1::/64 \\</span></span></p><p style=\"text-align:left;\"><span style=\"font-size:12px;font-family:Arial;\"><span style=\"\">    dev docker0</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":239.28932188134524,"y":150.0,"rotation":0.0,"id":32,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":8,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":4,"py":0.0,"px":0.2928932188134524}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":0,"py":1.0,"px":0.7071067811865476}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#cccccc","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[196.5,47.5],[151.9213562373095,-37.0]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]},{"x":195.0,"y":261.5,"rotation":0.0,"id":35,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":11,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":2,"py":0.9999999999999998,"px":0.29289321881345254}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":13,"py":0.0,"px":0.5}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#cccccc","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[66.28932188134524,11.0],[-92.0,91.5]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]},{"x":182.0,"y":272.5,"rotation":0.0,"id":34,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":10,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":2,"py":1.0,"px":0.5}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":15,"py":0.0,"px":0.5}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#cccccc","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[100.0,0.0],[82.0,80.5]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]},{"x":11.5,"y":463.0,"rotation":0.0,"id":53,"width":346.49999999999994,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":33,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"\">route -A inet6 default gw fe80::1 dev eth0</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":11.5,"y":323.5,"rotation":0.0,"id":56,"width":346.49999999999994,"height":163.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":5,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dashStyle":"2,2","dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[]},{"x":245.0,"y":109.0,"rotation":0.0,"id":33,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":9,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":0,"py":0.9999999999999998,"px":0.29289321881345254}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":2,"py":0.0,"px":0.7071067811865476}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#cccccc","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[104.78932188134524,3.999999999999986],[57.710678118654755,88.5]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]},{"x":76.5,"y":141.5,"rotation":0.0,"id":31,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":7,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":4,"py":1.0,"px":0.7071067811865476}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":25,"py":0.0,"px":0.5}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#cccccc","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[400.71067811865476,131.0],[560.0,211.5]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]},{"x":37.5,"y":145.5,"rotation":0.0,"id":30,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":6,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":4,"py":1.0,"px":0.5}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":27,"py":0.0,"px":0.5}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#cccccc","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[419.0,127.0],[431.0,207.5]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]},{"x":296.0,"y":21.0,"rotation":0.0,"id":87,"width":150.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":41,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:12px;font-family:Arial;\"><span style=\"\">eth0 2001:db8::1/64</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":293.0,"y":120.0,"rotation":0.0,"id":83,"width":150.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":40,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:12px;font-family:Arial;\"><span style=\"\">eth1 fe80::1/64</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":433.5,"y":42.5,"rotation":0.0,"id":82,"width":291.0,"height":70.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":39,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:left;\"><span style=\"\">route -A inet6 default gw fe80::1 </span><span style=\"\">dev eth0</span></p><p style=\"text-align:left;\"><span style=\"text-decoration:none;\"> </span></p><p style=\"text-align:left;\"><span style=\"text-decoration:none;\"> </span></p><p style=\"text-align:left;\"><span style=\"\">route -A inet6 2001:db8:1::/48 </span><span style=\"\">gw fe80::1:1 dev eth1</span></p><p style=\"text-align:left;\"><span style=\"\">route -A inet6 2001:db8:2::/48 </span><span style=\"\">gw fe80::2:1 dev eth1</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":320.5,"y":38.0,"rotation":0.0,"id":0,"width":100.0,"height":75.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":12,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#fff2cc","gradient":true,"dashStyle":null,"dropShadow":true,"state":0,"opacity":1.0,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":1,"width":96.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"text-decoration:none;font-size:12px;font-family:Arial;\"><span style=\"text-decoration:none;\">Router</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[]}]},{"x":369.0,"y":40.0,"rotation":0.0,"id":89,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":1,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":0,"py":0.0,"px":0.5}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#d9d9d9","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":10.0,"controlPath":[[1.5,-2.0],[1.5,-21.125],[1.5,-21.125],[1.5,-40.25]],"lockSegments":{},"ortho":true}},"linkMap":[],"children":[]},{"x":297.75,"y":10.5,"rotation":0.0,"id":80,"width":425.99999999999994,"height":133.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":0,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dashStyle":"2,2","dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[]},{"x":528.5,"y":197.5,"rotation":0.0,"id":73,"width":195.25,"height":28.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":35,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:left;\"><span style=\"\">route -A inet6 default gw fe80::1 \\</span></p><p style=\"text-align:left;\"><span style=\"\">    dev eth0</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":793.0,"y":250.0,"rotation":0.0,"id":64,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":34,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":60,"py":0.6205673758865248,"px":1.0}}},"graphic":{"type":"Line","Line":{"strokeWidth":1.0,"strokeColor":"#000000","fillColor":"none","dashStyle":"8.0,8.0","startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[-69.25,0.0],[-798.0006802711687,-3.410605131648481E-13]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]},{"x":25.5,"y":199.5,"rotation":0.0,"id":47,"width":291.0,"height":28.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":31,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:left;\"><span style=\"\">route -A inet6 default gw fe80::1 \\</span></p><p style=\"text-align:left;\"><span style=\"\">   dev eth0</span><span style=\"text-decoration:none;\"> </span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":207.0,"y":281.0,"rotation":0.0,"id":11,"width":150.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":21,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:12px;font-family:Arial;\"><span style=\"\">docker0 fe80::1/64</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":220.0,"y":168.0,"rotation":0.0,"id":6,"width":150.0,"height":28.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":18,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:left;\"><span style=\"font-size:12px;font-family:Arial;\"><span style=\"\">eth0 2001:db8:1:0::1/64</span></span></p><p style=\"text-align:left;\"><span style=\"font-size:12px;font-family:Arial;\"><span style=\"\">        fe80::1:1/64</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":232.0,"y":197.5,"rotation":0.0,"id":2,"width":100.0,"height":75.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":14,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#a4c2f4","gradient":true,"dashStyle":null,"dropShadow":true,"state":0,"opacity":1.0,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":3,"width":96.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"text-decoration:none;font-size:12px;font-family:Arial;\"><span style=\"text-decoration:none;\">Host1</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[]}]},{"x":11.5,"y":162.5,"rotation":0.0,"id":59,"width":346.50000000000006,"height":141.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":3,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dashStyle":"2,2","dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[]},{"x":384.75,"y":162.5,"rotation":0.0,"id":60,"width":339.0,"height":141.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":2,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dashStyle":"2,2","dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[]},{"x":189.0,"y":336.0,"rotation":0.0,"id":74,"width":150.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":36,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"\">eth0 2001:db8:1:1::2/64</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":28.000000000000014,"y":336.0,"rotation":0.0,"id":19,"width":149.99999999999997,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":26,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"\">eth0 2001:db8:1:1::1/64</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":214.0,"y":353.0,"rotation":0.0,"id":15,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.square","order":24,"lockAspectRatio":true,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#ead1dc","gradient":true,"dashStyle":null,"dropShadow":true,"state":0,"opacity":1.0,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":16,"width":96.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"text-decoration:none;font-size:12px;font-family:Arial;\"><span style=\"text-decoration:none;\">Container1-2</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[]}]},{"x":53.0,"y":353.0,"rotation":0.0,"id":13,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.square","order":22,"lockAspectRatio":true,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#ead1dc","gradient":true,"dashStyle":null,"dropShadow":true,"state":0,"opacity":1.0,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":14,"width":96.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"text-decoration:none;font-size:12px;font-family:Arial;\"><span style=\"text-decoration:none;\">Container1-1</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[]}]},{"x":395.0,"y":336.0,"rotation":0.0,"id":77,"width":150.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":37,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"\">eth0 2001:db8:2:1::1/64</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":384.75,"y":323.5,"rotation":0.0,"id":58,"width":339.75,"height":163.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":4,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dashStyle":"2,2","dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[]},{"x":384.75,"y":462.0,"rotation":0.0,"id":51,"width":339.75,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":32,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"\">route -A inet6 default gw fe80::1 dev eth0</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":418.5,"y":353.0,"rotation":0.0,"id":27,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.square","order":27,"lockAspectRatio":true,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#ead1dc","gradient":true,"dashStyle":null,"dropShadow":true,"state":0,"opacity":1.0,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":28,"width":96.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"text-decoration:none;font-size:12px;font-family:Arial;\"><span style=\"text-decoration:none;\">Container2-1</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[]}]},{"x":563.0,"y":336.0,"rotation":0.0,"id":78,"width":150.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":38,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"\">eth0 2001:db8:2:1::2/64</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":586.5,"y":353.0,"rotation":0.0,"id":25,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.square","order":29,"lockAspectRatio":true,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#ead1dc","gradient":true,"dashStyle":null,"dropShadow":true,"state":0,"opacity":1.0,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":26,"width":96.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"text-decoration:none;font-size:12px;font-family:Arial;\"><span style=\"text-decoration:none;\">Container2-2</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[]}]},{"x":259.0,"y":491.5,"rotation":0.0,"id":107,"width":223.00000000000003,"height":11.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":42,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-style:italic;font-size:10px;\">containers&#39; link-local addresses are not displayed</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":394.5,"y":168.0,"rotation":0.0,"id":7,"width":150.0,"height":28.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":19,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:left;\"><span style=\"\">eth0 2001:db8:2:0::1/64<br />        fe80::2:1/64</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":381.5,"y":280.0,"rotation":0.0,"id":9,"width":150.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":20,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:12px;font-family:Arial;\"><span style=\"\">docker0 fe80::1/64</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":406.5,"y":197.5,"rotation":0.0,"id":4,"width":100.0,"height":75.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":16,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#a4c2f4","gradient":true,"dashStyle":null,"dropShadow":true,"state":0,"opacity":1.0,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":5,"width":96.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"text-decoration:none;font-size:12px;font-family:Arial;\"><span style=\"text-decoration:none;\">Host2</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[]}]},{"x":528.5,"y":252.0,"rotation":0.0,"id":164,"width":194.49999999999997,"height":28.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":44,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:left;\"><span style=\"font-size:12px;font-family:Arial;\"><span style=\"\">route -A inet6 2001:db8:2:1::/64 \\</span></span></p><p style=\"text-align:left;\"><span style=\"font-size:12px;font-family:Arial;\"><span style=\"\">    dev docker0</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":766.0,"y":487.0,"rotation":0.0,"id":171,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":48,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Line","Line":{"strokeWidth":1.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[-13.981657549458532,0.0],[-41.25,0.0]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]}],"shapeStyles":{"com.gliffy.shape.basic.basic_v1.default":{"fill":"#fff2cc","stroke":"#333333","strokeWidth":2,"dashStyle":"2.0,2.0","gradient":true,"shadow":true}},"lineStyles":{"global":{"stroke":"#000000","strokeWidth":1}},"textStyles":{"global":{"size":"12px"}}},"metadata":{"title":"untitled","revision":0,"exportBorder":false,"loadPosition":"default","libraries":["com.gliffy.libraries.basic.basic_v1.default","com.gliffy.libraries.flowchart.flowchart_v1.default","com.gliffy.libraries.swimlanes.swimlanes_v1.default","com.gliffy.libraries.uml.uml_v2.class","com.gliffy.libraries.uml.uml_v2.sequence","com.gliffy.libraries.uml.uml_v2.activity","com.gliffy.libraries.erd.erd_v1.default","com.gliffy.libraries.ui.ui_v3.containers_content","com.gliffy.libraries.ui.ui_v3.forms_controls","com.gliffy.libraries.images"],"autosaveDisabled":false},"embeddedResources":{"index":0,"resources":[]}} \ No newline at end of file
+{"contentType":"application/gliffy+json","version":"1.3","stage":{"background":"#FFFFFF","width":903,"height":598,"nodeIndex":174,"autoFit":true,"exportBorder":false,"gridOn":false,"snapToGrid":false,"drawingGuidesOn":true,"pageBreaksOn":false,"printGridOn":false,"printPaper":"LETTER","printShrinkToFit":false,"printPortrait":true,"maxWidth":5000,"maxHeight":5000,"themeData":null,"viewportType":"default","fitBB":{"min":{"x":-9.000680271168676,"y":-4.75},"max":{"x":756.0183424505415,"y":502.5}},"objects":[{"x":765.0,"y":250.0,"rotation":0.0,"id":169,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":47,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Line","Line":{"strokeWidth":1.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[-12.982306425886122,0.0],[-41.25,0.0]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]},{"x":663.0,"y":362.5,"rotation":270.0,"id":168,"width":150.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":46,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:12px;font-family:Arial;\"><span style=\"\">managed by Docker</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":747.0,"y":472.0,"rotation":0.0,"id":166,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":45,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Line","Line":{"strokeWidth":1.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":2,"endArrow":2,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[0.0,14.008510484195028],[0.0,-221.0]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]},{"x":25.5,"y":254.0,"rotation":0.0,"id":162,"width":194.49999999999997,"height":28.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":43,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:left;\"><span style=\"font-size:12px;font-family:Arial;\"><span style=\"\">ip -6 route add 2001:db8:1:1::/64 \\</span></span></p><p style=\"text-align:left;\"><span style=\"font-size:12px;font-family:Arial;\"><span style=\"\">    dev docker0</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":239.28932188134524,"y":150.0,"rotation":0.0,"id":32,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":8,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":4,"py":0.0,"px":0.2928932188134524}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":0,"py":1.0,"px":0.7071067811865476}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#cccccc","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[196.5,47.5],[151.9213562373095,-37.0]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]},{"x":195.0,"y":261.5,"rotation":0.0,"id":35,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":11,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":2,"py":0.9999999999999998,"px":0.29289321881345254}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":13,"py":0.0,"px":0.5}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#cccccc","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[66.28932188134524,11.0],[-92.0,91.5]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]},{"x":182.0,"y":272.5,"rotation":0.0,"id":34,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":10,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":2,"py":1.0,"px":0.5}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":15,"py":0.0,"px":0.5}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#cccccc","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[100.0,0.0],[82.0,80.5]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]},{"x":11.5,"y":464.0,"rotation":0.0,"id":53,"width":346.49999999999994,"height":16.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":33,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"\">ip -6 route add default via fe80::1 dev eth0</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":11.5,"y":323.5,"rotation":0.0,"id":56,"width":346.49999999999994,"height":163.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":5,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dashStyle":"2,2","dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[]},{"x":245.0,"y":109.0,"rotation":0.0,"id":33,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":9,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":0,"py":0.9999999999999998,"px":0.29289321881345254}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":2,"py":0.0,"px":0.7071067811865476}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#cccccc","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[104.78932188134524,3.999999999999986],[57.710678118654755,88.5]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]},{"x":76.5,"y":141.5,"rotation":0.0,"id":31,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":7,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":4,"py":1.0,"px":0.7071067811865476}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":25,"py":0.0,"px":0.5}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#cccccc","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[400.71067811865476,131.0],[560.0,211.5]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]},{"x":37.5,"y":145.5,"rotation":0.0,"id":30,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":6,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":4,"py":1.0,"px":0.5}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":27,"py":0.0,"px":0.5}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#cccccc","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[419.0,127.0],[431.0,207.5]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]},{"x":296.0,"y":21.0,"rotation":0.0,"id":87,"width":150.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":41,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:12px;font-family:Arial;\"><span style=\"\">eth0 2001:db8::1/64</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":293.0,"y":120.0,"rotation":0.0,"id":83,"width":150.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":40,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:12px;font-family:Arial;\"><span style=\"\">eth1 fe80::1/64</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":433.5,"y":46.5,"rotation":0.0,"id":82,"width":291.0,"height":78.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":39,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:left;\"><span style=\"\">ip -6 route add default via fe80::1 </span><span style=\"\">dev eth0</span></p><p style=\"text-align:left;\"><span style=\"text-decoration:none;\"> </span></p><p style=\"text-align:left;\"><span style=\"text-decoration:none;\"> </span></p><p style=\"text-align:left;\"><span style=\"\">ip -6 route add 2001:db8:1::/48 </span><span style=\"\">via fe80::1:1 dev eth1</span></p><p style=\"text-align:left;\"><span style=\"\">ip -6 route add 2001:db8:2::/48 via</span><span style=\"\"> fe80::2:1 dev eth1</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":320.5,"y":38.0,"rotation":0.0,"id":0,"width":100.0,"height":75.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":12,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#fff2cc","gradient":true,"dashStyle":null,"dropShadow":true,"state":0,"opacity":1.0,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":1,"width":96.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:12px;text-decoration:none;font-family:Arial;\"><span style=\"text-decoration:none;\">Router</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[]}]},{"x":369.0,"y":40.0,"rotation":0.0,"id":89,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":1,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":0,"py":0.0,"px":0.5}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#d9d9d9","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":10.0,"controlPath":[[1.5,-2.0],[1.5,-21.125],[1.5,-21.125],[1.5,-40.25]],"lockSegments":{},"ortho":true}},"linkMap":[],"children":[]},{"x":297.75,"y":10.5,"rotation":0.0,"id":80,"width":425.99999999999994,"height":133.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":0,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dashStyle":"2,2","dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[]},{"x":528.5,"y":199.0,"rotation":0.0,"id":73,"width":195.25,"height":31.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":35,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:left;\"><span style=\"\">ip -6 route add default via fe80::1 \\</span></p><p style=\"text-align:left;\"><span style=\"\">    dev eth0</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":793.0,"y":250.0,"rotation":0.0,"id":64,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":34,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":60,"py":0.6205673758865248,"px":1.0}}},"graphic":{"type":"Line","Line":{"strokeWidth":1.0,"strokeColor":"#000000","fillColor":"none","dashStyle":"8.0,8.0","startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[-69.25,0.0],[-798.0006802711687,-3.410605131648481E-13]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]},{"x":25.5,"y":201.0,"rotation":0.0,"id":47,"width":291.0,"height":31.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":31,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:left;\"><span style=\"\">ip -6 route add default via fe80::1 \\</span></p><p style=\"text-align:left;\"><span style=\"\">   dev eth0</span><span style=\"text-decoration:none;\"> </span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":207.0,"y":281.0,"rotation":0.0,"id":11,"width":150.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":21,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:12px;font-family:Arial;\"><span style=\"\">docker0 fe80::1/64</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":220.0,"y":168.0,"rotation":0.0,"id":6,"width":150.0,"height":28.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":18,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:left;\"><span style=\"font-size:12px;font-family:Arial;\"><span style=\"\">eth0 2001:db8:1:0::1/64</span></span></p><p style=\"text-align:left;\"><span style=\"font-size:12px;font-family:Arial;\"><span style=\"\">        fe80::1:1/64</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":232.0,"y":197.5,"rotation":0.0,"id":2,"width":100.0,"height":75.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":14,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#a4c2f4","gradient":true,"dashStyle":null,"dropShadow":true,"state":0,"opacity":1.0,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":3,"width":96.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:12px;text-decoration:none;font-family:Arial;\"><span style=\"text-decoration:none;\">Host1</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[]}]},{"x":11.5,"y":162.5,"rotation":0.0,"id":59,"width":346.50000000000006,"height":141.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":3,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dashStyle":"2,2","dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[]},{"x":384.75,"y":162.5,"rotation":0.0,"id":60,"width":339.0,"height":141.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":2,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dashStyle":"2,2","dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[]},{"x":189.0,"y":336.0,"rotation":0.0,"id":74,"width":150.0,"height":16.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":36,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"\">eth0 2001:db8:1:1::2/64</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":28.000000000000014,"y":336.0,"rotation":0.0,"id":19,"width":149.99999999999997,"height":16.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":26,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"\">eth0 2001:db8:1:1::1/64</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":214.0,"y":353.0,"rotation":0.0,"id":15,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.square","order":24,"lockAspectRatio":true,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#ead1dc","gradient":true,"dashStyle":null,"dropShadow":true,"state":0,"opacity":1.0,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":16,"width":96.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:12px;text-decoration:none;font-family:Arial;\"><span style=\"text-decoration:none;\">Container1-2</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[]}]},{"x":53.0,"y":353.0,"rotation":0.0,"id":13,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.square","order":22,"lockAspectRatio":true,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#ead1dc","gradient":true,"dashStyle":null,"dropShadow":true,"state":0,"opacity":1.0,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":14,"width":96.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:12px;text-decoration:none;font-family:Arial;\"><span style=\"text-decoration:none;\">Container1-1</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[]}]},{"x":395.0,"y":336.0,"rotation":0.0,"id":77,"width":150.0,"height":16.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":37,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"\">eth0 2001:db8:2:1::1/64</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":384.75,"y":323.5,"rotation":0.0,"id":58,"width":339.75,"height":163.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":4,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dashStyle":"2,2","dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[]},{"x":384.75,"y":463.0,"rotation":0.0,"id":51,"width":339.75,"height":16.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":32,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"\">ip -6 route add default via fe80::1 dev eth0</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":418.5,"y":353.0,"rotation":0.0,"id":27,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.square","order":27,"lockAspectRatio":true,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#ead1dc","gradient":true,"dashStyle":null,"dropShadow":true,"state":0,"opacity":1.0,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":28,"width":96.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:12px;text-decoration:none;font-family:Arial;\"><span style=\"text-decoration:none;\">Container2-1</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[]}]},{"x":563.0,"y":336.0,"rotation":0.0,"id":78,"width":150.0,"height":16.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":38,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"\">eth0 2001:db8:2:1::2/64</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":586.5,"y":353.0,"rotation":0.0,"id":25,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.square","order":29,"lockAspectRatio":true,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#ead1dc","gradient":true,"dashStyle":null,"dropShadow":true,"state":0,"opacity":1.0,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":26,"width":96.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:12px;text-decoration:none;font-family:Arial;\"><span style=\"text-decoration:none;\">Container2-2</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[]}]},{"x":259.0,"y":491.5,"rotation":0.0,"id":107,"width":223.00000000000003,"height":11.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":42,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:10px;font-style:italic;\">containers&#39; link-local addresses are not displayed</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":394.5,"y":168.0,"rotation":0.0,"id":7,"width":150.0,"height":31.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":19,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:left;\"><span style=\"\">eth0 2001:db8:2:0::1/64<br />        fe80::2:1/64</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":381.5,"y":280.0,"rotation":0.0,"id":9,"width":150.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":20,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:12px;font-family:Arial;\"><span style=\"\">docker0 fe80::1/64</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":406.5,"y":197.5,"rotation":0.0,"id":4,"width":100.0,"height":75.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":16,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#a4c2f4","gradient":true,"dashStyle":null,"dropShadow":true,"state":0,"opacity":1.0,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":5,"width":96.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:12px;text-decoration:none;font-family:Arial;\"><span style=\"text-decoration:none;\">Host2</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[]}]},{"x":528.5,"y":252.0,"rotation":0.0,"id":164,"width":194.49999999999997,"height":28.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":44,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:left;\"><span style=\"font-size:12px;font-family:Arial;\"><span style=\"\">ip -6 route add 2001:db8:2:1::/64 \\</span></span></p><p style=\"text-align:left;\"><span style=\"font-size:12px;font-family:Arial;\"><span style=\"\">    dev docker0</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":766.0,"y":487.0,"rotation":0.0,"id":171,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":48,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Line","Line":{"strokeWidth":1.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[-13.981657549458532,0.0],[-41.25,0.0]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]}],"shapeStyles":{"com.gliffy.shape.basic.basic_v1.default":{"fill":"#fff2cc","stroke":"#333333","strokeWidth":2,"dashStyle":"2.0,2.0","gradient":true,"shadow":true}},"lineStyles":{"global":{"stroke":"#000000","strokeWidth":1}},"textStyles":{"global":{"size":"12px"}}},"metadata":{"title":"untitled","revision":0,"exportBorder":false,"loadPosition":"default","libraries":["com.gliffy.libraries.basic.basic_v1.default","com.gliffy.libraries.flowchart.flowchart_v1.default","com.gliffy.libraries.swimlanes.swimlanes_v1.default","com.gliffy.libraries.uml.uml_v2.class","com.gliffy.libraries.uml.uml_v2.sequence","com.gliffy.libraries.uml.uml_v2.activity","com.gliffy.libraries.erd.erd_v1.default","com.gliffy.libraries.ui.ui_v3.containers_content","com.gliffy.libraries.ui.ui_v3.forms_controls","com.gliffy.libraries.images"],"autosaveDisabled":false},"embeddedResources":{"index":0,"resources":[]}} \ No newline at end of file
diff --git a/docs/sources/article-img/ipv6_routed_network_example.svg b/docs/sources/article-img/ipv6_routed_network_example.svg
index 7050657f9f..da621433f3 100644
--- a/docs/sources/article-img/ipv6_routed_network_example.svg
+++ b/docs/sources/article-img/ipv6_routed_network_example.svg
@@ -1 +1 @@
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="776.0183424505415" height="522.5"><defs><linearGradient id="ClVsETaxurTF" x1="0px" x2="0px" y1="100px" y2="-50px" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#fff2cc"/><stop offset="1" stop-color="#FFFFFF"/></linearGradient><linearGradient id="GTSMrnemlxgL" x1="0px" x2="0px" y1="100px" y2="-50px" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#a4c2f4"/><stop offset="1" stop-color="#FFFFFF"/></linearGradient><linearGradient id="IASCltgTKxVX" x1="0px" x2="0px" y1="100px" y2="-50px" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#a4c2f4"/><stop offset="1" stop-color="#FFFFFF"/></linearGradient><linearGradient id="JnuicmrpqmBN" x1="0px" x2="0px" y1="100px" y2="-50px" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ead1dc"/><stop offset="1" stop-color="#FFFFFF"/></linearGradient><linearGradient id="hFaybqmFxMro" x1="0px" x2="0px" y1="100px" y2="-50px" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ead1dc"/><stop offset="1" stop-color="#FFFFFF"/></linearGradient><linearGradient id="xTMAzNEEftvg" x1="0px" x2="0px" y1="100px" y2="-50px" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ead1dc"/><stop offset="1" stop-color="#FFFFFF"/></linearGradient><linearGradient id="ZNvsdvOaDeTx" x1="0px" x2="0px" y1="100px" y2="-50px" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ead1dc"/><stop offset="1" stop-color="#FFFFFF"/></linearGradient></defs><g transform="translate(0,0)"><g><rect fill="#FFFFFF" stroke="none" x="0" y="0" width="776.0183424505415" height="522.5"/></g><g transform="translate(0,0) matrix(1,0,0,1,297.75,10.5)"><g><g transform="translate(0,0) scale(4.26,1.33)"><g><path fill="#FFFFFF" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(0.2347417840375587,0.7518796992481203)"><path fill="none" stroke="none" d="M 0 0 L 426 0 Q 426 0 426 0 L 426 133 Q 426 133 426 133 L 0 133 Q 0 133 0 133 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" d="M 0 0 M 0 0 L 2 0 M 2 0 M 4 0 L 6 0 M 6 0 M 8 0 L 10 0 M 10 0 M 12 0 L 14 0 M 14 0 M 16 0 L 18 0 M 18 0 M 20 0 L 22 0 M 22 0 M 24 0 L 26 0 M 26 0 M 28 0 L 30 0 M 30 0 M 32 0 L 34 0 M 34 0 M 36 0 L 38 0 M 38 0 M 40 0 L 42 0 M 42 0 M 44 0 L 46 0 M 46 0 M 48 0 L 50 0 M 50 0 M 52 0 L 54 0 M 54 0 M 56 0 L 58 0 M 58 0 M 60 0 L 62 0 M 62 0 M 64 0 L 66 0 M 66 0 M 68 0 L 70 0 M 70 0 M 72 0 L 74 0 M 74 0 M 76 0 L 78 0 M 78 0 M 80 0 L 82 0 M 82 0 M 84 0 L 86 0 M 86 0 M 88 0 L 90 0 M 90 0 M 92 0 L 94 0 M 94 0 M 96 0 L 98 0 M 98 0 M 100 0 L 102 0 M 102 0 M 104 0 L 106 0 M 106 0 M 108 0 L 110 0 M 110 0 M 112 0 L 114 0 M 114 0 M 116 0 L 118 0 M 118 0 M 120 0 L 122 0 M 122 0 M 124 0 L 126 0 M 126 0 M 128 0 L 130 0 M 130 0 M 132 0 L 134 0 M 134 0 M 136 0 L 138 0 M 138 0 M 140 0 L 142 0 M 142 0 M 144 0 L 146 0 M 146 0 M 148 0 L 150 0 M 150 0 M 152 0 L 154 0 M 154 0 M 156 0 L 158 0 M 158 0 M 160 0 L 162 0 M 162 0 M 164 0 L 166 0 M 166 0 M 168 0 L 170 0 M 170 0 M 172 0 L 174 0 M 174 0 M 176 0 L 178 0 M 178 0 M 180 0 L 182 0 M 182 0 M 184 0 L 186 0 M 186 0 M 188 0 L 190 0 M 190 0 M 192 0 L 194 0 M 194 0 M 196 0 L 198 0 M 198 0 M 200 0 L 202 0 M 202 0 M 204 0 L 206 0 M 206 0 M 208 0 L 210 0 M 210 0 M 212 0 L 214 0 M 214 0 M 216 0 L 218 0 M 218 0 M 220 0 L 222 0 M 222 0 M 224 0 L 226 0 M 226 0 M 228 0 L 230 0 M 230 0 M 232 0 L 234 0 M 234 0 M 236 0 L 238 0 M 238 0 M 240 0 L 242 0 M 242 0 M 244 0 L 246 0 M 246 0 M 248 0 L 250 0 M 250 0 M 252 0 L 254 0 M 254 0 M 256 0 L 258 0 M 258 0 M 260 0 L 262 0 M 262 0 M 264 0 L 266 0 M 266 0 M 268 0 L 270 0 M 270 0 M 272 0 L 274 0 M 274 0 M 276 0 L 278 0 M 278 0 M 280 0 L 282 0 M 282 0 M 284 0 L 286 0 M 286 0 M 288 0 L 290 0 M 290 0 M 292 0 L 294 0 M 294 0 M 296 0 L 298 0 M 298 0 M 300 0 L 302 0 M 302 0 M 304 0 L 306 0 M 306 0 M 308 0 L 310 0 M 310 0 M 312 0 L 314 0 M 314 0 M 316 0 L 318 0 M 318 0 M 320 0 L 322 0 M 322 0 M 324 0 L 326 0 M 326 0 M 328 0 L 330 0 M 330 0 M 332 0 L 334 0 M 334 0 M 336 0 L 338 0 M 338 0 M 340 0 L 342 0 M 342 0 M 344 0 L 346 0 M 346 0 M 348 0 L 350 0 M 350 0 M 352 0 L 354 0 M 354 0 M 356 0 L 358 0 M 358 0 M 360 0 L 362 0 M 362 0 M 364 0 L 366 0 M 366 0 M 368 0 L 370 0 M 370 0 M 372 0 L 374 0 M 374 0 M 376 0 L 378 0 M 378 0 M 380 0 L 382 0 M 382 0 M 384 0 L 386 0 M 386 0 M 388 0 L 390 0 M 390 0 M 392 0 L 394 0 M 394 0 M 396 0 L 398 0 M 398 0 M 400 0 L 402 0 M 402 0 M 404 0 L 406 0 M 406 0 M 408 0 L 410 0 M 410 0 M 412 0 L 414 0 M 414 0 M 416 0 L 418 0 M 418 0 M 420 0 L 422 0 M 422 0 M 424 0 L 426 0 M 426 0 M 426 2 L 426 4 M 426 4 M 426 6 L 426 8 M 426 8 M 426 10 L 426 12 M 426 12 M 426 14 L 426 16 M 426 16 M 426 18 L 426 20 M 426 20 M 426 22 L 426 24 M 426 24 M 426 26 L 426 28 M 426 28 M 426 30 L 426 32 M 426 32 M 426 34 L 426 36 M 426 36 M 426 38 L 426 40 M 426 40 M 426 42 L 426 44 M 426 44 M 426 46 L 426 48 M 426 48 M 426 50 L 426 52 M 426 52 M 426 54 L 426 56 M 426 56 M 426 58 L 426 60 M 426 60 M 426 62 L 426 64 M 426 64 M 426 66 L 426 68 M 426 68 M 426 70 L 426 72 M 426 72 M 426 74 L 426 76 M 426 76 M 426 78 L 426 80 M 426 80 M 426 82 L 426 84 M 426 84 M 426 86 L 426 88 M 426 88 M 426 90 L 426 92 M 426 92 M 426 94 L 426 96 M 426 96 M 426 98 L 426 100 M 426 100 M 426 102 L 426 104 M 426 104 M 426 106 L 426 108 M 426 108 M 426 110 L 426 112 M 426 112 M 426 114 L 426 116 M 426 116 M 426 118 L 426 120 M 426 120 M 426 122 L 426 124 M 426 124 M 426 126 L 426 128 M 426 128 M 426 130 L 426 132 M 426 132 M 425 133 L 423 133 M 423 133 M 421 133 L 419 133 M 419 133 M 417 133 L 415 133 M 415 133 M 413 133 L 411 133 M 411 133 M 409 133 L 407 133 M 407 133 M 405 133 L 403 133 M 403 133 M 401 133 L 399 133 M 399 133 M 397 133 L 395 133 M 395 133 M 393 133 L 391 133 M 391 133 M 389 133 L 387 133 M 387 133 M 385 133 L 383 133 M 383 133 M 381 133 L 379 133 M 379 133 M 377 133 L 375 133 M 375 133 M 373 133 L 371 133 M 371 133 M 369 133 L 367 133 M 367 133 M 365 133 L 363 133 M 363 133 M 361 133 L 359 133 M 359 133 M 357 133 L 355 133 M 355 133 M 353 133 L 351 133 M 351 133 M 349 133 L 347 133 M 347 133 M 345 133 L 343 133 M 343 133 M 341 133 L 339 133 M 339 133 M 337 133 L 335 133 M 335 133 M 333 133 L 331 133 M 331 133 M 329 133 L 327 133 M 327 133 M 325 133 L 323 133 M 323 133 M 321 133 L 319 133 M 319 133 M 317 133 L 315 133 M 315 133 M 313 133 L 311 133 M 311 133 M 309 133 L 307 133 M 307 133 M 305 133 L 303 133 M 303 133 M 301 133 L 299 133 M 299 133 M 297 133 L 295 133 M 295 133 M 293 133 L 291 133 M 291 133 M 289 133 L 287 133 M 287 133 M 285 133 L 283 133 M 283 133 M 281 133 L 279 133 M 279 133 M 277 133 L 275 133 M 275 133 M 273 133 L 271 133 M 271 133 M 269 133 L 267 133 M 267 133 M 265 133 L 263 133 M 263 133 M 261 133 L 259 133 M 259 133 M 257 133 L 255 133 M 255 133 M 253 133 L 251 133 M 251 133 M 249 133 L 247 133 M 247 133 M 245 133 L 243 133 M 243 133 M 241 133 L 239 133 M 239 133 M 237 133 L 235 133 M 235 133 M 233 133 L 231 133 M 231 133 M 229 133 L 227 133 M 227 133 M 225 133 L 223 133 M 223 133 M 221 133 L 219 133 M 219 133 M 217 133 L 215 133 M 215 133 M 213 133 L 211 133 M 211 133 M 209 133 L 207 133 M 207 133 M 205 133 L 203 133 M 203 133 M 201 133 L 199 133 M 199 133 M 197 133 L 195 133 M 195 133 M 193 133 L 191 133 M 191 133 M 189 133 L 187 133 M 187 133 M 185 133 L 183 133 M 183 133 M 181 133 L 179 133 M 179 133 M 177 133 L 175 133 M 175 133 M 173 133 L 171 133 M 171 133 M 169 133 L 167 133 M 167 133 M 165 133 L 163 133 M 163 133 M 161 133 L 159 133 M 159 133 M 157 133 L 155 133 M 155 133 M 153 133 L 151 133 M 151 133 M 149 133 L 147 133 M 147 133 M 145 133 L 143 133 M 143 133 M 141 133 L 139 133 M 139 133 M 137 133 L 135 133 M 135 133 M 133 133 L 131 133 M 131 133 M 129 133 L 127 133 M 127 133 M 125 133 L 123 133 M 123 133 M 121 133 L 119 133 M 119 133 M 117 133 L 115 133 M 115 133 M 113 133 L 111 133 M 111 133 M 109 133 L 107 133 M 107 133 M 105 133 L 103 133 M 103 133 M 101 133 L 99 133 M 99 133 M 97 133 L 95 133 M 95 133 M 93 133 L 91 133 M 91 133 M 89 133 L 87 133 M 87 133 M 85 133 L 83 133 M 83 133 M 81 133 L 79 133 M 79 133 M 77 133 L 75 133 M 75 133 M 73 133 L 71 133 M 71 133 M 69 133 L 67 133 M 67 133 M 65 133 L 63 133 M 63 133 M 61 133 L 59 133 M 59 133 M 57 133 L 55 133 M 55 133 M 53 133 L 51 133 M 51 133 M 49 133 L 47 133 M 47 133 M 45 133 L 43 133 M 43 133 M 41 133 L 39 133 M 39 133 M 37 133 L 35 133 M 35 133 M 33 133 L 31 133 M 31 133 M 29 133 L 27 133 M 27 133 M 25 133 L 23 133 M 23 133 M 21 133 L 19 133 M 19 133 M 17 133 L 15 133 M 15 133 M 13 133 L 11 133 M 11 133 M 9 133 L 7 133 M 7 133 M 5 133 L 3 133 M 3 133 M 1 133 L 0 133 Q 0 133 0 133 L 0 132 M 0 132 M 0 130 L 0 128 M 0 128 M 0 126 L 0 124 M 0 124 M 0 122 L 0 120 M 0 120 M 0 118 L 0 116 M 0 116 M 0 114 L 0 112 M 0 112 M 0 110 L 0 108 M 0 108 M 0 106 L 0 104 M 0 104 M 0 102 L 0 100 M 0 100 M 0 98 L 0 96 M 0 96 M 0 94 L 0 92 M 0 92 M 0 90 L 0 88 M 0 88 M 0 86 L 0 84 M 0 84 M 0 82 L 0 80 M 0 80 M 0 78 L 0 76 M 0 76 M 0 74 L 0 72 M 0 72 M 0 70 L 0 68 M 0 68 M 0 66 L 0 64 M 0 64 M 0 62 L 0 60 M 0 60 M 0 58 L 0 56 M 0 56 M 0 54 L 0 52 M 0 52 M 0 50 L 0 48 M 0 48 M 0 46 L 0 44 M 0 44 M 0 42 L 0 40 M 0 40 M 0 38 L 0 36 M 0 36 M 0 34 L 0 32 M 0 32 M 0 30 L 0 28 M 0 28 M 0 26 L 0 24 M 0 24 M 0 22 L 0 20 M 0 20 M 0 18 L 0 16 M 0 16 M 0 14 L 0 12 M 0 12 M 0 10 L 0 8 M 0 8 M 0 6 L 0 4 M 0 4 M 0 2 L 0 0 M 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,366,-4.75)"><g transform="translate(0,0)"><g transform="translate(-369,-40) translate(3,44.75) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#d9d9d9" d="M 370.5 38 L 370.5 28.4375 Q 370.5 18.875 370.5 18.875 L 370.5 18.875 Q 370.5 18.875 370.5 9.3125 L 370.5 -0.25" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g><g transform="translate(0,0) matrix(1,0,0,1,384.75,162.5)"><g><g transform="translate(0,0) scale(3.39,1.41)"><g><path fill="#FFFFFF" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(0.2949852507374631,0.7092198581560284)"><path fill="none" stroke="none" d="M 0 0 L 339 0 Q 339 0 339 0 L 339 141 Q 339 141 339 141 L 0 141 Q 0 141 0 141 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" d="M 0 0 M 0 0 L 2 0 M 2 0 M 4 0 L 6 0 M 6 0 M 8 0 L 10 0 M 10 0 M 12 0 L 14 0 M 14 0 M 16 0 L 18 0 M 18 0 M 20 0 L 22 0 M 22 0 M 24 0 L 26 0 M 26 0 M 28 0 L 30 0 M 30 0 M 32 0 L 34 0 M 34 0 M 36 0 L 38 0 M 38 0 M 40 0 L 42 0 M 42 0 M 44 0 L 46 0 M 46 0 M 48 0 L 50 0 M 50 0 M 52 0 L 54 0 M 54 0 M 56 0 L 58 0 M 58 0 M 60 0 L 62 0 M 62 0 M 64 0 L 66 0 M 66 0 M 68 0 L 70 0 M 70 0 M 72 0 L 74 0 M 74 0 M 76 0 L 78 0 M 78 0 M 80 0 L 82 0 M 82 0 M 84 0 L 86 0 M 86 0 M 88 0 L 90 0 M 90 0 M 92 0 L 94 0 M 94 0 M 96 0 L 98 0 M 98 0 M 100 0 L 102 0 M 102 0 M 104 0 L 106 0 M 106 0 M 108 0 L 110 0 M 110 0 M 112 0 L 114 0 M 114 0 M 116 0 L 118 0 M 118 0 M 120 0 L 122 0 M 122 0 M 124 0 L 126 0 M 126 0 M 128 0 L 130 0 M 130 0 M 132 0 L 134 0 M 134 0 M 136 0 L 138 0 M 138 0 M 140 0 L 142 0 M 142 0 M 144 0 L 146 0 M 146 0 M 148 0 L 150 0 M 150 0 M 152 0 L 154 0 M 154 0 M 156 0 L 158 0 M 158 0 M 160 0 L 162 0 M 162 0 M 164 0 L 166 0 M 166 0 M 168 0 L 170 0 M 170 0 M 172 0 L 174 0 M 174 0 M 176 0 L 178 0 M 178 0 M 180 0 L 182 0 M 182 0 M 184 0 L 186 0 M 186 0 M 188 0 L 190 0 M 190 0 M 192 0 L 194 0 M 194 0 M 196 0 L 198 0 M 198 0 M 200 0 L 202 0 M 202 0 M 204 0 L 206 0 M 206 0 M 208 0 L 210 0 M 210 0 M 212 0 L 214 0 M 214 0 M 216 0 L 218 0 M 218 0 M 220 0 L 222 0 M 222 0 M 224 0 L 226 0 M 226 0 M 228 0 L 230 0 M 230 0 M 232 0 L 234 0 M 234 0 M 236 0 L 238 0 M 238 0 M 240 0 L 242 0 M 242 0 M 244 0 L 246 0 M 246 0 M 248 0 L 250 0 M 250 0 M 252 0 L 254 0 M 254 0 M 256 0 L 258 0 M 258 0 M 260 0 L 262 0 M 262 0 M 264 0 L 266 0 M 266 0 M 268 0 L 270 0 M 270 0 M 272 0 L 274 0 M 274 0 M 276 0 L 278 0 M 278 0 M 280 0 L 282 0 M 282 0 M 284 0 L 286 0 M 286 0 M 288 0 L 290 0 M 290 0 M 292 0 L 294 0 M 294 0 M 296 0 L 298 0 M 298 0 M 300 0 L 302 0 M 302 0 M 304 0 L 306 0 M 306 0 M 308 0 L 310 0 M 310 0 M 312 0 L 314 0 M 314 0 M 316 0 L 318 0 M 318 0 M 320 0 L 322 0 M 322 0 M 324 0 L 326 0 M 326 0 M 328 0 L 330 0 M 330 0 M 332 0 L 334 0 M 334 0 M 336 0 L 338 0 M 338 0 M 339 1 L 339 3 M 339 3 M 339 5 L 339 7 M 339 7 M 339 9 L 339 11 M 339 11 M 339 13 L 339 15 M 339 15 M 339 17 L 339 19 M 339 19 M 339 21 L 339 23 M 339 23 M 339 25 L 339 27 M 339 27 M 339 29 L 339 31 M 339 31 M 339 33 L 339 35 M 339 35 M 339 37 L 339 39 M 339 39 M 339 41 L 339 43 M 339 43 M 339 45 L 339 47 M 339 47 M 339 49 L 339 51 M 339 51 M 339 53 L 339 55 M 339 55 M 339 57 L 339 59 M 339 59 M 339 61 L 339 63 M 339 63 M 339 65 L 339 67 M 339 67 M 339 69 L 339 71 M 339 71 M 339 73 L 339 75 M 339 75 M 339 77 L 339 79 M 339 79 M 339 81 L 339 83 M 339 83 M 339 85 L 339 87 M 339 87 M 339 89 L 339 91 M 339 91 M 339 93 L 339 95 M 339 95 M 339 97 L 339 99 M 339 99 M 339 101 L 339 103 M 339 103 M 339 105 L 339 107 M 339 107 M 339 109 L 339 111 M 339 111 M 339 113 L 339 115 M 339 115 M 339 117 L 339 119 M 339 119 M 339 121 L 339 123 M 339 123 M 339 125 L 339 127 M 339 127 M 339 129 L 339 131 M 339 131 M 339 133 L 339 135 M 339 135 M 339 137 L 339 139 M 339 139 M 339 141 L 339 141 Q 339 141 339 141 L 337 141 M 337 141 M 335 141 L 333 141 M 333 141 M 331 141 L 329 141 M 329 141 M 327 141 L 325 141 M 325 141 M 323 141 L 321 141 M 321 141 M 319 141 L 317 141 M 317 141 M 315 141 L 313 141 M 313 141 M 311 141 L 309 141 M 309 141 M 307 141 L 305 141 M 305 141 M 303 141 L 301 141 M 301 141 M 299 141 L 297 141 M 297 141 M 295 141 L 293 141 M 293 141 M 291 141 L 289 141 M 289 141 M 287 141 L 285 141 M 285 141 M 283 141 L 281 141 M 281 141 M 279 141 L 277 141 M 277 141 M 275 141 L 273 141 M 273 141 M 271 141 L 269 141 M 269 141 M 267 141 L 265 141 M 265 141 M 263 141 L 261 141 M 261 141 M 259 141 L 257 141 M 257 141 M 255 141 L 253 141 M 253 141 M 251 141 L 249 141 M 249 141 M 247 141 L 245 141 M 245 141 M 243 141 L 241 141 M 241 141 M 239 141 L 237 141 M 237 141 M 235 141 L 233 141 M 233 141 M 231 141 L 229 141 M 229 141 M 227 141 L 225 141 M 225 141 M 223 141 L 221 141 M 221 141 M 219 141 L 217 141 M 217 141 M 215 141 L 213 141 M 213 141 M 211 141 L 209 141 M 209 141 M 207 141 L 205 141 M 205 141 M 203 141 L 201 141 M 201 141 M 199 141 L 197 141 M 197 141 M 195 141 L 193 141 M 193 141 M 191 141 L 189 141 M 189 141 M 187 141 L 185 141 M 185 141 M 183 141 L 181 141 M 181 141 M 179 141 L 177 141 M 177 141 M 175 141 L 173 141 M 173 141 M 171 141 L 169 141 M 169 141 M 167 141 L 165 141 M 165 141 M 163 141 L 161 141 M 161 141 M 159 141 L 157 141 M 157 141 M 155 141 L 153 141 M 153 141 M 151 141 L 149 141 M 149 141 M 147 141 L 145 141 M 145 141 M 143 141 L 141 141 M 141 141 M 139 141 L 137 141 M 137 141 M 135 141 L 133 141 M 133 141 M 131 141 L 129 141 M 129 141 M 127 141 L 125 141 M 125 141 M 123 141 L 121 141 M 121 141 M 119 141 L 117 141 M 117 141 M 115 141 L 113 141 M 113 141 M 111 141 L 109 141 M 109 141 M 107 141 L 105 141 M 105 141 M 103 141 L 101 141 M 101 141 M 99 141 L 97 141 M 97 141 M 95 141 L 93 141 M 93 141 M 91 141 L 89 141 M 89 141 M 87 141 L 85 141 M 85 141 M 83 141 L 81 141 M 81 141 M 79 141 L 77 141 M 77 141 M 75 141 L 73 141 M 73 141 M 71 141 L 69 141 M 69 141 M 67 141 L 65 141 M 65 141 M 63 141 L 61 141 M 61 141 M 59 141 L 57 141 M 57 141 M 55 141 L 53 141 M 53 141 M 51 141 L 49 141 M 49 141 M 47 141 L 45 141 M 45 141 M 43 141 L 41 141 M 41 141 M 39 141 L 37 141 M 37 141 M 35 141 L 33 141 M 33 141 M 31 141 L 29 141 M 29 141 M 27 141 L 25 141 M 25 141 M 23 141 L 21 141 M 21 141 M 19 141 L 17 141 M 17 141 M 15 141 L 13 141 M 13 141 M 11 141 L 9 141 M 9 141 M 7 141 L 5 141 M 5 141 M 3 141 L 1 141 M 1 141 M 0 140 L 0 138 M 0 138 M 0 136 L 0 134 M 0 134 M 0 132 L 0 130 M 0 130 M 0 128 L 0 126 M 0 126 M 0 124 L 0 122 M 0 122 M 0 120 L 0 118 M 0 118 M 0 116 L 0 114 M 0 114 M 0 112 L 0 110 M 0 110 M 0 108 L 0 106 M 0 106 M 0 104 L 0 102 M 0 102 M 0 100 L 0 98 M 0 98 M 0 96 L 0 94 M 0 94 M 0 92 L 0 90 M 0 90 M 0 88 L 0 86 M 0 86 M 0 84 L 0 82 M 0 82 M 0 80 L 0 78 M 0 78 M 0 76 L 0 74 M 0 74 M 0 72 L 0 70 M 0 70 M 0 68 L 0 66 M 0 66 M 0 64 L 0 62 M 0 62 M 0 60 L 0 58 M 0 58 M 0 56 L 0 54 M 0 54 M 0 52 L 0 50 M 0 50 M 0 48 L 0 46 M 0 46 M 0 44 L 0 42 M 0 42 M 0 40 L 0 38 M 0 38 M 0 36 L 0 34 M 0 34 M 0 32 L 0 30 M 0 30 M 0 28 L 0 26 M 0 26 M 0 24 L 0 22 M 0 22 M 0 20 L 0 18 M 0 18 M 0 16 L 0 14 M 0 14 M 0 12 L 0 10 M 0 10 M 0 8 L 0 6 M 0 6 M 0 4 L 0 2 M 0 2 M 0 0 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="translate(0,0) matrix(1,0,0,1,11.5,162.5)"><g><g transform="translate(0,0) scale(3.4650000000000007,1.41)"><g><path fill="#FFFFFF" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(0.2886002886002885,0.7092198581560284)"><path fill="none" stroke="none" d="M 0 0 L 346.50000000000006 0 Q 346.50000000000006 0 346.50000000000006 0 L 346.50000000000006 141 Q 346.50000000000006 141 346.50000000000006 141 L 0 141 Q 0 141 0 141 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" d="M 0 0 M 0 0 L 2 0 M 2 0 M 4 0 L 6 0 M 6 0 M 8 0 L 10 0 M 10 0 M 12 0 L 14 0 M 14 0 M 16 0 L 18 0 M 18 0 M 20 0 L 22 0 M 22 0 M 24 0 L 26 0 M 26 0 M 28 0 L 30 0 M 30 0 M 32 0 L 34 0 M 34 0 M 36 0 L 38 0 M 38 0 M 40 0 L 42 0 M 42 0 M 44 0 L 46 0 M 46 0 M 48 0 L 50 0 M 50 0 M 52 0 L 54 0 M 54 0 M 56 0 L 58 0 M 58 0 M 60 0 L 62 0 M 62 0 M 64 0 L 66 0 M 66 0 M 68 0 L 70 0 M 70 0 M 72 0 L 74 0 M 74 0 M 76 0 L 78 0 M 78 0 M 80 0 L 82 0 M 82 0 M 84 0 L 86 0 M 86 0 M 88 0 L 90 0 M 90 0 M 92 0 L 94 0 M 94 0 M 96 0 L 98 0 M 98 0 M 100 0 L 102 0 M 102 0 M 104 0 L 106 0 M 106 0 M 108 0 L 110 0 M 110 0 M 112 0 L 114 0 M 114 0 M 116 0 L 118 0 M 118 0 M 120 0 L 122 0 M 122 0 M 124 0 L 126 0 M 126 0 M 128 0 L 130 0 M 130 0 M 132 0 L 134 0 M 134 0 M 136 0 L 138 0 M 138 0 M 140 0 L 142 0 M 142 0 M 144 0 L 146 0 M 146 0 M 148 0 L 150 0 M 150 0 M 152 0 L 154 0 M 154 0 M 156 0 L 158 0 M 158 0 M 160 0 L 162 0 M 162 0 M 164 0 L 166 0 M 166 0 M 168 0 L 170 0 M 170 0 M 172 0 L 174 0 M 174 0 M 176 0 L 178 0 M 178 0 M 180 0 L 182 0 M 182 0 M 184 0 L 186 0 M 186 0 M 188 0 L 190 0 M 190 0 M 192 0 L 194 0 M 194 0 M 196 0 L 198 0 M 198 0 M 200 0 L 202 0 M 202 0 M 204 0 L 206 0 M 206 0 M 208 0 L 210 0 M 210 0 M 212 0 L 214 0 M 214 0 M 216 0 L 218 0 M 218 0 M 220 0 L 222 0 M 222 0 M 224 0 L 226 0 M 226 0 M 228 0 L 230 0 M 230 0 M 232 0 L 234 0 M 234 0 M 236 0 L 238 0 M 238 0 M 240 0 L 242 0 M 242 0 M 244 0 L 246 0 M 246 0 M 248 0 L 250 0 M 250 0 M 252 0 L 254 0 M 254 0 M 256 0 L 258 0 M 258 0 M 260 0 L 262 0 M 262 0 M 264 0 L 266 0 M 266 0 M 268 0 L 270 0 M 270 0 M 272 0 L 274 0 M 274 0 M 276 0 L 278 0 M 278 0 M 280 0 L 282 0 M 282 0 M 284 0 L 286 0 M 286 0 M 288 0 L 290 0 M 290 0 M 292 0 L 294 0 M 294 0 M 296 0 L 298 0 M 298 0 M 300 0 L 302 0 M 302 0 M 304 0 L 306 0 M 306 0 M 308 0 L 310 0 M 310 0 M 312 0 L 314 0 M 314 0 M 316 0 L 318 0 M 318 0 M 320 0 L 322 0 M 322 0 M 324 0 L 326 0 M 326 0 M 328 0 L 330 0 M 330 0 M 332 0 L 334 0 M 334 0 M 336 0 L 338 0 M 338 0 M 340 0 L 342 0 M 342 0 M 344 0 L 346 0 M 346 0 M 346.50000000000006 1.4999999999999432 L 346.50000000000006 3.499999999999943 M 346.50000000000006 3.499999999999943 M 346.50000000000006 5.499999999999943 L 346.50000000000006 7.499999999999943 M 346.50000000000006 7.499999999999943 M 346.50000000000006 9.499999999999943 L 346.50000000000006 11.499999999999943 M 346.50000000000006 11.499999999999943 M 346.50000000000006 13.499999999999943 L 346.50000000000006 15.499999999999943 M 346.50000000000006 15.499999999999943 M 346.50000000000006 17.499999999999943 L 346.50000000000006 19.499999999999943 M 346.50000000000006 19.499999999999943 M 346.50000000000006 21.499999999999943 L 346.50000000000006 23.499999999999943 M 346.50000000000006 23.499999999999943 M 346.50000000000006 25.499999999999943 L 346.50000000000006 27.499999999999943 M 346.50000000000006 27.499999999999943 M 346.50000000000006 29.499999999999943 L 346.50000000000006 31.499999999999943 M 346.50000000000006 31.499999999999943 M 346.50000000000006 33.49999999999994 L 346.50000000000006 35.49999999999994 M 346.50000000000006 35.49999999999994 M 346.50000000000006 37.49999999999994 L 346.50000000000006 39.49999999999994 M 346.50000000000006 39.49999999999994 M 346.50000000000006 41.49999999999994 L 346.50000000000006 43.49999999999994 M 346.50000000000006 43.49999999999994 M 346.50000000000006 45.49999999999994 L 346.50000000000006 47.49999999999994 M 346.50000000000006 47.49999999999994 M 346.50000000000006 49.49999999999994 L 346.50000000000006 51.49999999999994 M 346.50000000000006 51.49999999999994 M 346.50000000000006 53.49999999999994 L 346.50000000000006 55.49999999999994 M 346.50000000000006 55.49999999999994 M 346.50000000000006 57.49999999999994 L 346.50000000000006 59.49999999999994 M 346.50000000000006 59.49999999999994 M 346.50000000000006 61.49999999999994 L 346.50000000000006 63.49999999999994 M 346.50000000000006 63.49999999999994 M 346.50000000000006 65.49999999999994 L 346.50000000000006 67.49999999999994 M 346.50000000000006 67.49999999999994 M 346.50000000000006 69.49999999999994 L 346.50000000000006 71.49999999999994 M 346.50000000000006 71.49999999999994 M 346.50000000000006 73.49999999999994 L 346.50000000000006 75.49999999999994 M 346.50000000000006 75.49999999999994 M 346.50000000000006 77.49999999999994 L 346.50000000000006 79.49999999999994 M 346.50000000000006 79.49999999999994 M 346.50000000000006 81.49999999999994 L 346.50000000000006 83.49999999999994 M 346.50000000000006 83.49999999999994 M 346.50000000000006 85.49999999999994 L 346.50000000000006 87.49999999999994 M 346.50000000000006 87.49999999999994 M 346.50000000000006 89.49999999999994 L 346.50000000000006 91.49999999999994 M 346.50000000000006 91.49999999999994 M 346.50000000000006 93.49999999999994 L 346.50000000000006 95.49999999999994 M 346.50000000000006 95.49999999999994 M 346.50000000000006 97.49999999999994 L 346.50000000000006 99.49999999999994 M 346.50000000000006 99.49999999999994 M 346.50000000000006 101.49999999999994 L 346.50000000000006 103.49999999999994 M 346.50000000000006 103.49999999999994 M 346.50000000000006 105.49999999999994 L 346.50000000000006 107.49999999999994 M 346.50000000000006 107.49999999999994 M 346.50000000000006 109.49999999999994 L 346.50000000000006 111.49999999999994 M 346.50000000000006 111.49999999999994 M 346.50000000000006 113.49999999999994 L 346.50000000000006 115.49999999999994 M 346.50000000000006 115.49999999999994 M 346.50000000000006 117.49999999999994 L 346.50000000000006 119.49999999999994 M 346.50000000000006 119.49999999999994 M 346.50000000000006 121.49999999999994 L 346.50000000000006 123.49999999999994 M 346.50000000000006 123.49999999999994 M 346.50000000000006 125.49999999999994 L 346.50000000000006 127.49999999999994 M 346.50000000000006 127.49999999999994 M 346.50000000000006 129.49999999999994 L 346.50000000000006 131.49999999999994 M 346.50000000000006 131.49999999999994 M 346.50000000000006 133.49999999999994 L 346.50000000000006 135.49999999999994 M 346.50000000000006 135.49999999999994 M 346.50000000000006 137.49999999999994 L 346.50000000000006 139.49999999999994 M 346.50000000000006 139.49999999999994 M 346.0000000000001 141 L 344.0000000000001 141 M 344.0000000000001 141 M 342.0000000000001 141 L 340.0000000000001 141 M 340.0000000000001 141 M 338.0000000000001 141 L 336.0000000000001 141 M 336.0000000000001 141 M 334.0000000000001 141 L 332.0000000000001 141 M 332.0000000000001 141 M 330.0000000000001 141 L 328.0000000000001 141 M 328.0000000000001 141 M 326.0000000000001 141 L 324.0000000000001 141 M 324.0000000000001 141 M 322.0000000000001 141 L 320.0000000000001 141 M 320.0000000000001 141 M 318.0000000000001 141 L 316.0000000000001 141 M 316.0000000000001 141 M 314.0000000000001 141 L 312.0000000000001 141 M 312.0000000000001 141 M 310.0000000000001 141 L 308.0000000000001 141 M 308.0000000000001 141 M 306.0000000000001 141 L 304.0000000000001 141 M 304.0000000000001 141 M 302.0000000000001 141 L 300.0000000000001 141 M 300.0000000000001 141 M 298.0000000000001 141 L 296.0000000000001 141 M 296.0000000000001 141 M 294.0000000000001 141 L 292.0000000000001 141 M 292.0000000000001 141 M 290.0000000000001 141 L 288.0000000000001 141 M 288.0000000000001 141 M 286.0000000000001 141 L 284.0000000000001 141 M 284.0000000000001 141 M 282.0000000000001 141 L 280.0000000000001 141 M 280.0000000000001 141 M 278.0000000000001 141 L 276.0000000000001 141 M 276.0000000000001 141 M 274.0000000000001 141 L 272.0000000000001 141 M 272.0000000000001 141 M 270.0000000000001 141 L 268.0000000000001 141 M 268.0000000000001 141 M 266.0000000000001 141 L 264.0000000000001 141 M 264.0000000000001 141 M 262.0000000000001 141 L 260.0000000000001 141 M 260.0000000000001 141 M 258.0000000000001 141 L 256.0000000000001 141 M 256.0000000000001 141 M 254.0000000000001 141 L 252.0000000000001 141 M 252.0000000000001 141 M 250.0000000000001 141 L 248.0000000000001 141 M 248.0000000000001 141 M 246.0000000000001 141 L 244.0000000000001 141 M 244.0000000000001 141 M 242.0000000000001 141 L 240.0000000000001 141 M 240.0000000000001 141 M 238.0000000000001 141 L 236.0000000000001 141 M 236.0000000000001 141 M 234.0000000000001 141 L 232.0000000000001 141 M 232.0000000000001 141 M 230.0000000000001 141 L 228.0000000000001 141 M 228.0000000000001 141 M 226.0000000000001 141 L 224.0000000000001 141 M 224.0000000000001 141 M 222.0000000000001 141 L 220.0000000000001 141 M 220.0000000000001 141 M 218.0000000000001 141 L 216.0000000000001 141 M 216.0000000000001 141 M 214.0000000000001 141 L 212.0000000000001 141 M 212.0000000000001 141 M 210.0000000000001 141 L 208.0000000000001 141 M 208.0000000000001 141 M 206.0000000000001 141 L 204.0000000000001 141 M 204.0000000000001 141 M 202.0000000000001 141 L 200.0000000000001 141 M 200.0000000000001 141 M 198.0000000000001 141 L 196.0000000000001 141 M 196.0000000000001 141 M 194.0000000000001 141 L 192.0000000000001 141 M 192.0000000000001 141 M 190.0000000000001 141 L 188.0000000000001 141 M 188.0000000000001 141 M 186.0000000000001 141 L 184.0000000000001 141 M 184.0000000000001 141 M 182.0000000000001 141 L 180.0000000000001 141 M 180.0000000000001 141 M 178.0000000000001 141 L 176.0000000000001 141 M 176.0000000000001 141 M 174.0000000000001 141 L 172.0000000000001 141 M 172.0000000000001 141 M 170.0000000000001 141 L 168.0000000000001 141 M 168.0000000000001 141 M 166.0000000000001 141 L 164.0000000000001 141 M 164.0000000000001 141 M 162.0000000000001 141 L 160.0000000000001 141 M 160.0000000000001 141 M 158.0000000000001 141 L 156.0000000000001 141 M 156.0000000000001 141 M 154.0000000000001 141 L 152.0000000000001 141 M 152.0000000000001 141 M 150.0000000000001 141 L 148.0000000000001 141 M 148.0000000000001 141 M 146.0000000000001 141 L 144.0000000000001 141 M 144.0000000000001 141 M 142.0000000000001 141 L 140.0000000000001 141 M 140.0000000000001 141 M 138.0000000000001 141 L 136.0000000000001 141 M 136.0000000000001 141 M 134.0000000000001 141 L 132.0000000000001 141 M 132.0000000000001 141 M 130.0000000000001 141 L 128.0000000000001 141 M 128.0000000000001 141 M 126.00000000000011 141 L 124.00000000000011 141 M 124.00000000000011 141 M 122.00000000000011 141 L 120.00000000000011 141 M 120.00000000000011 141 M 118.00000000000011 141 L 116.00000000000011 141 M 116.00000000000011 141 M 114.00000000000011 141 L 112.00000000000011 141 M 112.00000000000011 141 M 110.00000000000011 141 L 108.00000000000011 141 M 108.00000000000011 141 M 106.00000000000011 141 L 104.00000000000011 141 M 104.00000000000011 141 M 102.00000000000011 141 L 100.00000000000011 141 M 100.00000000000011 141 M 98.00000000000011 141 L 96.00000000000011 141 M 96.00000000000011 141 M 94.00000000000011 141 L 92.00000000000011 141 M 92.00000000000011 141 M 90.00000000000011 141 L 88.00000000000011 141 M 88.00000000000011 141 M 86.00000000000011 141 L 84.00000000000011 141 M 84.00000000000011 141 M 82.00000000000011 141 L 80.00000000000011 141 M 80.00000000000011 141 M 78.00000000000011 141 L 76.00000000000011 141 M 76.00000000000011 141 M 74.00000000000011 141 L 72.00000000000011 141 M 72.00000000000011 141 M 70.00000000000011 141 L 68.00000000000011 141 M 68.00000000000011 141 M 66.00000000000011 141 L 64.00000000000011 141 M 64.00000000000011 141 M 62.000000000000114 141 L 60.000000000000114 141 M 60.000000000000114 141 M 58.000000000000114 141 L 56.000000000000114 141 M 56.000000000000114 141 M 54.000000000000114 141 L 52.000000000000114 141 M 52.000000000000114 141 M 50.000000000000114 141 L 48.000000000000114 141 M 48.000000000000114 141 M 46.000000000000114 141 L 44.000000000000114 141 M 44.000000000000114 141 M 42.000000000000114 141 L 40.000000000000114 141 M 40.000000000000114 141 M 38.000000000000114 141 L 36.000000000000114 141 M 36.000000000000114 141 M 34.000000000000114 141 L 32.000000000000114 141 M 32.000000000000114 141 M 30.000000000000114 141 L 28.000000000000114 141 M 28.000000000000114 141 M 26.000000000000114 141 L 24.000000000000114 141 M 24.000000000000114 141 M 22.000000000000114 141 L 20.000000000000114 141 M 20.000000000000114 141 M 18.000000000000114 141 L 16.000000000000114 141 M 16.000000000000114 141 M 14.000000000000114 141 L 12.000000000000114 141 M 12.000000000000114 141 M 10.000000000000114 141 L 8.000000000000114 141 M 8.000000000000114 141 M 6.000000000000114 141 L 4.000000000000114 141 M 4.000000000000114 141 M 2.0000000000001137 141 L 1.1368683772161603e-13 141 M 1.1368683772161603e-13 141 M 0 139.0000000000001 L 0 137.0000000000001 M 0 137.0000000000001 M 0 135.0000000000001 L 0 133.0000000000001 M 0 133.0000000000001 M 0 131.0000000000001 L 0 129.0000000000001 M 0 129.0000000000001 M 0 127.00000000000011 L 0 125.00000000000011 M 0 125.00000000000011 M 0 123.00000000000011 L 0 121.00000000000011 M 0 121.00000000000011 M 0 119.00000000000011 L 0 117.00000000000011 M 0 117.00000000000011 M 0 115.00000000000011 L 0 113.00000000000011 M 0 113.00000000000011 M 0 111.00000000000011 L 0 109.00000000000011 M 0 109.00000000000011 M 0 107.00000000000011 L 0 105.00000000000011 M 0 105.00000000000011 M 0 103.00000000000011 L 0 101.00000000000011 M 0 101.00000000000011 M 0 99.00000000000011 L 0 97.00000000000011 M 0 97.00000000000011 M 0 95.00000000000011 L 0 93.00000000000011 M 0 93.00000000000011 M 0 91.00000000000011 L 0 89.00000000000011 M 0 89.00000000000011 M 0 87.00000000000011 L 0 85.00000000000011 M 0 85.00000000000011 M 0 83.00000000000011 L 0 81.00000000000011 M 0 81.00000000000011 M 0 79.00000000000011 L 0 77.00000000000011 M 0 77.00000000000011 M 0 75.00000000000011 L 0 73.00000000000011 M 0 73.00000000000011 M 0 71.00000000000011 L 0 69.00000000000011 M 0 69.00000000000011 M 0 67.00000000000011 L 0 65.00000000000011 M 0 65.00000000000011 M 0 63.000000000000114 L 0 61.000000000000114 M 0 61.000000000000114 M 0 59.000000000000114 L 0 57.000000000000114 M 0 57.000000000000114 M 0 55.000000000000114 L 0 53.000000000000114 M 0 53.000000000000114 M 0 51.000000000000114 L 0 49.000000000000114 M 0 49.000000000000114 M 0 47.000000000000114 L 0 45.000000000000114 M 0 45.000000000000114 M 0 43.000000000000114 L 0 41.000000000000114 M 0 41.000000000000114 M 0 39.000000000000114 L 0 37.000000000000114 M 0 37.000000000000114 M 0 35.000000000000114 L 0 33.000000000000114 M 0 33.000000000000114 M 0 31.000000000000114 L 0 29.000000000000114 M 0 29.000000000000114 M 0 27.000000000000114 L 0 25.000000000000114 M 0 25.000000000000114 M 0 23.000000000000114 L 0 21.000000000000114 M 0 21.000000000000114 M 0 19.000000000000114 L 0 17.000000000000114 M 0 17.000000000000114 M 0 15.000000000000114 L 0 13.000000000000114 M 0 13.000000000000114 M 0 11.000000000000114 L 0 9.000000000000114 M 0 9.000000000000114 M 0 7.000000000000114 L 0 5.000000000000114 M 0 5.000000000000114 M 0 3.0000000000001137 L 0 1.0000000000001137 M 0 1.0000000000001137 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="translate(0,0) matrix(1,0,0,1,384.75,323.5)"><g><g transform="translate(0,0) scale(3.3975,1.63)"><g><path fill="#FFFFFF" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(0.29433406916850624,0.6134969325153374)"><path fill="none" stroke="none" d="M 0 0 L 339.75 0 Q 339.75 0 339.75 0 L 339.75 163 Q 339.75 163 339.75 163 L 0 163 Q 0 163 0 163 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" d="M 0 0 M 0 0 L 2 0 M 2 0 M 4 0 L 6 0 M 6 0 M 8 0 L 10 0 M 10 0 M 12 0 L 14 0 M 14 0 M 16 0 L 18 0 M 18 0 M 20 0 L 22 0 M 22 0 M 24 0 L 26 0 M 26 0 M 28 0 L 30 0 M 30 0 M 32 0 L 34 0 M 34 0 M 36 0 L 38 0 M 38 0 M 40 0 L 42 0 M 42 0 M 44 0 L 46 0 M 46 0 M 48 0 L 50 0 M 50 0 M 52 0 L 54 0 M 54 0 M 56 0 L 58 0 M 58 0 M 60 0 L 62 0 M 62 0 M 64 0 L 66 0 M 66 0 M 68 0 L 70 0 M 70 0 M 72 0 L 74 0 M 74 0 M 76 0 L 78 0 M 78 0 M 80 0 L 82 0 M 82 0 M 84 0 L 86 0 M 86 0 M 88 0 L 90 0 M 90 0 M 92 0 L 94 0 M 94 0 M 96 0 L 98 0 M 98 0 M 100 0 L 102 0 M 102 0 M 104 0 L 106 0 M 106 0 M 108 0 L 110 0 M 110 0 M 112 0 L 114 0 M 114 0 M 116 0 L 118 0 M 118 0 M 120 0 L 122 0 M 122 0 M 124 0 L 126 0 M 126 0 M 128 0 L 130 0 M 130 0 M 132 0 L 134 0 M 134 0 M 136 0 L 138 0 M 138 0 M 140 0 L 142 0 M 142 0 M 144 0 L 146 0 M 146 0 M 148 0 L 150 0 M 150 0 M 152 0 L 154 0 M 154 0 M 156 0 L 158 0 M 158 0 M 160 0 L 162 0 M 162 0 M 164 0 L 166 0 M 166 0 M 168 0 L 170 0 M 170 0 M 172 0 L 174 0 M 174 0 M 176 0 L 178 0 M 178 0 M 180 0 L 182 0 M 182 0 M 184 0 L 186 0 M 186 0 M 188 0 L 190 0 M 190 0 M 192 0 L 194 0 M 194 0 M 196 0 L 198 0 M 198 0 M 200 0 L 202 0 M 202 0 M 204 0 L 206 0 M 206 0 M 208 0 L 210 0 M 210 0 M 212 0 L 214 0 M 214 0 M 216 0 L 218 0 M 218 0 M 220 0 L 222 0 M 222 0 M 224 0 L 226 0 M 226 0 M 228 0 L 230 0 M 230 0 M 232 0 L 234 0 M 234 0 M 236 0 L 238 0 M 238 0 M 240 0 L 242 0 M 242 0 M 244 0 L 246 0 M 246 0 M 248 0 L 250 0 M 250 0 M 252 0 L 254 0 M 254 0 M 256 0 L 258 0 M 258 0 M 260 0 L 262 0 M 262 0 M 264 0 L 266 0 M 266 0 M 268 0 L 270 0 M 270 0 M 272 0 L 274 0 M 274 0 M 276 0 L 278 0 M 278 0 M 280 0 L 282 0 M 282 0 M 284 0 L 286 0 M 286 0 M 288 0 L 290 0 M 290 0 M 292 0 L 294 0 M 294 0 M 296 0 L 298 0 M 298 0 M 300 0 L 302 0 M 302 0 M 304 0 L 306 0 M 306 0 M 308 0 L 310 0 M 310 0 M 312 0 L 314 0 M 314 0 M 316 0 L 318 0 M 318 0 M 320 0 L 322 0 M 322 0 M 324 0 L 326 0 M 326 0 M 328 0 L 330 0 M 330 0 M 332 0 L 334 0 M 334 0 M 336 0 L 338 0 M 338 0 M 339.75 0.25 L 339.75 2.25 M 339.75 2.25 M 339.75 4.25 L 339.75 6.25 M 339.75 6.25 M 339.75 8.25 L 339.75 10.25 M 339.75 10.25 M 339.75 12.25 L 339.75 14.25 M 339.75 14.25 M 339.75 16.25 L 339.75 18.25 M 339.75 18.25 M 339.75 20.25 L 339.75 22.25 M 339.75 22.25 M 339.75 24.25 L 339.75 26.25 M 339.75 26.25 M 339.75 28.25 L 339.75 30.25 M 339.75 30.25 M 339.75 32.25 L 339.75 34.25 M 339.75 34.25 M 339.75 36.25 L 339.75 38.25 M 339.75 38.25 M 339.75 40.25 L 339.75 42.25 M 339.75 42.25 M 339.75 44.25 L 339.75 46.25 M 339.75 46.25 M 339.75 48.25 L 339.75 50.25 M 339.75 50.25 M 339.75 52.25 L 339.75 54.25 M 339.75 54.25 M 339.75 56.25 L 339.75 58.25 M 339.75 58.25 M 339.75 60.25 L 339.75 62.25 M 339.75 62.25 M 339.75 64.25 L 339.75 66.25 M 339.75 66.25 M 339.75 68.25 L 339.75 70.25 M 339.75 70.25 M 339.75 72.25 L 339.75 74.25 M 339.75 74.25 M 339.75 76.25 L 339.75 78.25 M 339.75 78.25 M 339.75 80.25 L 339.75 82.25 M 339.75 82.25 M 339.75 84.25 L 339.75 86.25 M 339.75 86.25 M 339.75 88.25 L 339.75 90.25 M 339.75 90.25 M 339.75 92.25 L 339.75 94.25 M 339.75 94.25 M 339.75 96.25 L 339.75 98.25 M 339.75 98.25 M 339.75 100.25 L 339.75 102.25 M 339.75 102.25 M 339.75 104.25 L 339.75 106.25 M 339.75 106.25 M 339.75 108.25 L 339.75 110.25 M 339.75 110.25 M 339.75 112.25 L 339.75 114.25 M 339.75 114.25 M 339.75 116.25 L 339.75 118.25 M 339.75 118.25 M 339.75 120.25 L 339.75 122.25 M 339.75 122.25 M 339.75 124.25 L 339.75 126.25 M 339.75 126.25 M 339.75 128.25 L 339.75 130.25 M 339.75 130.25 M 339.75 132.25 L 339.75 134.25 M 339.75 134.25 M 339.75 136.25 L 339.75 138.25 M 339.75 138.25 M 339.75 140.25 L 339.75 142.25 M 339.75 142.25 M 339.75 144.25 L 339.75 146.25 M 339.75 146.25 M 339.75 148.25 L 339.75 150.25 M 339.75 150.25 M 339.75 152.25 L 339.75 154.25 M 339.75 154.25 M 339.75 156.25 L 339.75 158.25 M 339.75 158.25 M 339.75 160.25 L 339.75 162.25 M 339.75 162.25 M 338.5 163 L 336.5 163 M 336.5 163 M 334.5 163 L 332.5 163 M 332.5 163 M 330.5 163 L 328.5 163 M 328.5 163 M 326.5 163 L 324.5 163 M 324.5 163 M 322.5 163 L 320.5 163 M 320.5 163 M 318.5 163 L 316.5 163 M 316.5 163 M 314.5 163 L 312.5 163 M 312.5 163 M 310.5 163 L 308.5 163 M 308.5 163 M 306.5 163 L 304.5 163 M 304.5 163 M 302.5 163 L 300.5 163 M 300.5 163 M 298.5 163 L 296.5 163 M 296.5 163 M 294.5 163 L 292.5 163 M 292.5 163 M 290.5 163 L 288.5 163 M 288.5 163 M 286.5 163 L 284.5 163 M 284.5 163 M 282.5 163 L 280.5 163 M 280.5 163 M 278.5 163 L 276.5 163 M 276.5 163 M 274.5 163 L 272.5 163 M 272.5 163 M 270.5 163 L 268.5 163 M 268.5 163 M 266.5 163 L 264.5 163 M 264.5 163 M 262.5 163 L 260.5 163 M 260.5 163 M 258.5 163 L 256.5 163 M 256.5 163 M 254.5 163 L 252.5 163 M 252.5 163 M 250.5 163 L 248.5 163 M 248.5 163 M 246.5 163 L 244.5 163 M 244.5 163 M 242.5 163 L 240.5 163 M 240.5 163 M 238.5 163 L 236.5 163 M 236.5 163 M 234.5 163 L 232.5 163 M 232.5 163 M 230.5 163 L 228.5 163 M 228.5 163 M 226.5 163 L 224.5 163 M 224.5 163 M 222.5 163 L 220.5 163 M 220.5 163 M 218.5 163 L 216.5 163 M 216.5 163 M 214.5 163 L 212.5 163 M 212.5 163 M 210.5 163 L 208.5 163 M 208.5 163 M 206.5 163 L 204.5 163 M 204.5 163 M 202.5 163 L 200.5 163 M 200.5 163 M 198.5 163 L 196.5 163 M 196.5 163 M 194.5 163 L 192.5 163 M 192.5 163 M 190.5 163 L 188.5 163 M 188.5 163 M 186.5 163 L 184.5 163 M 184.5 163 M 182.5 163 L 180.5 163 M 180.5 163 M 178.5 163 L 176.5 163 M 176.5 163 M 174.5 163 L 172.5 163 M 172.5 163 M 170.5 163 L 168.5 163 M 168.5 163 M 166.5 163 L 164.5 163 M 164.5 163 M 162.5 163 L 160.5 163 M 160.5 163 M 158.5 163 L 156.5 163 M 156.5 163 M 154.5 163 L 152.5 163 M 152.5 163 M 150.5 163 L 148.5 163 M 148.5 163 M 146.5 163 L 144.5 163 M 144.5 163 M 142.5 163 L 140.5 163 M 140.5 163 M 138.5 163 L 136.5 163 M 136.5 163 M 134.5 163 L 132.5 163 M 132.5 163 M 130.5 163 L 128.5 163 M 128.5 163 M 126.5 163 L 124.5 163 M 124.5 163 M 122.5 163 L 120.5 163 M 120.5 163 M 118.5 163 L 116.5 163 M 116.5 163 M 114.5 163 L 112.5 163 M 112.5 163 M 110.5 163 L 108.5 163 M 108.5 163 M 106.5 163 L 104.5 163 M 104.5 163 M 102.5 163 L 100.5 163 M 100.5 163 M 98.5 163 L 96.5 163 M 96.5 163 M 94.5 163 L 92.5 163 M 92.5 163 M 90.5 163 L 88.5 163 M 88.5 163 M 86.5 163 L 84.5 163 M 84.5 163 M 82.5 163 L 80.5 163 M 80.5 163 M 78.5 163 L 76.5 163 M 76.5 163 M 74.5 163 L 72.5 163 M 72.5 163 M 70.5 163 L 68.5 163 M 68.5 163 M 66.5 163 L 64.5 163 M 64.5 163 M 62.5 163 L 60.5 163 M 60.5 163 M 58.5 163 L 56.5 163 M 56.5 163 M 54.5 163 L 52.5 163 M 52.5 163 M 50.5 163 L 48.5 163 M 48.5 163 M 46.5 163 L 44.5 163 M 44.5 163 M 42.5 163 L 40.5 163 M 40.5 163 M 38.5 163 L 36.5 163 M 36.5 163 M 34.5 163 L 32.5 163 M 32.5 163 M 30.5 163 L 28.5 163 M 28.5 163 M 26.5 163 L 24.5 163 M 24.5 163 M 22.5 163 L 20.5 163 M 20.5 163 M 18.5 163 L 16.5 163 M 16.5 163 M 14.5 163 L 12.5 163 M 12.5 163 M 10.5 163 L 8.5 163 M 8.5 163 M 6.5 163 L 4.5 163 M 4.5 163 M 2.5 163 L 0.5 163 M 0.5 163 M 0 161.5 L 0 159.5 M 0 159.5 M 0 157.5 L 0 155.5 M 0 155.5 M 0 153.5 L 0 151.5 M 0 151.5 M 0 149.5 L 0 147.5 M 0 147.5 M 0 145.5 L 0 143.5 M 0 143.5 M 0 141.5 L 0 139.5 M 0 139.5 M 0 137.5 L 0 135.5 M 0 135.5 M 0 133.5 L 0 131.5 M 0 131.5 M 0 129.5 L 0 127.5 M 0 127.5 M 0 125.5 L 0 123.5 M 0 123.5 M 0 121.5 L 0 119.5 M 0 119.5 M 0 117.5 L 0 115.5 M 0 115.5 M 0 113.5 L 0 111.5 M 0 111.5 M 0 109.5 L 0 107.5 M 0 107.5 M 0 105.5 L 0 103.5 M 0 103.5 M 0 101.5 L 0 99.5 M 0 99.5 M 0 97.5 L 0 95.5 M 0 95.5 M 0 93.5 L 0 91.5 M 0 91.5 M 0 89.5 L 0 87.5 M 0 87.5 M 0 85.5 L 0 83.5 M 0 83.5 M 0 81.5 L 0 79.5 M 0 79.5 M 0 77.5 L 0 75.5 M 0 75.5 M 0 73.5 L 0 71.5 M 0 71.5 M 0 69.5 L 0 67.5 M 0 67.5 M 0 65.5 L 0 63.5 M 0 63.5 M 0 61.5 L 0 59.5 M 0 59.5 M 0 57.5 L 0 55.5 M 0 55.5 M 0 53.5 L 0 51.5 M 0 51.5 M 0 49.5 L 0 47.5 M 0 47.5 M 0 45.5 L 0 43.5 M 0 43.5 M 0 41.5 L 0 39.5 M 0 39.5 M 0 37.5 L 0 35.5 M 0 35.5 M 0 33.5 L 0 31.5 M 0 31.5 M 0 29.5 L 0 27.5 M 0 27.5 M 0 25.5 L 0 23.5 M 0 23.5 M 0 21.5 L 0 19.5 M 0 19.5 M 0 17.5 L 0 15.5 M 0 15.5 M 0 13.5 L 0 11.5 M 0 11.5 M 0 9.5 L 0 7.5 M 0 7.5 M 0 5.5 L 0 3.5 M 0 3.5 M 0 1.5 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="translate(0,0) matrix(1,0,0,1,11.5,323.5)"><g><g transform="translate(0,0) scale(3.4649999999999994,1.63)"><g><path fill="#FFFFFF" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(0.28860028860028863,0.6134969325153374)"><path fill="none" stroke="none" d="M 0 0 L 346.49999999999994 0 Q 346.49999999999994 0 346.49999999999994 0 L 346.49999999999994 163 Q 346.49999999999994 163 346.49999999999994 163 L 0 163 Q 0 163 0 163 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" d="M 0 0 M 0 0 L 2 0 M 2 0 M 4 0 L 6 0 M 6 0 M 8 0 L 10 0 M 10 0 M 12 0 L 14 0 M 14 0 M 16 0 L 18 0 M 18 0 M 20 0 L 22 0 M 22 0 M 24 0 L 26 0 M 26 0 M 28 0 L 30 0 M 30 0 M 32 0 L 34 0 M 34 0 M 36 0 L 38 0 M 38 0 M 40 0 L 42 0 M 42 0 M 44 0 L 46 0 M 46 0 M 48 0 L 50 0 M 50 0 M 52 0 L 54 0 M 54 0 M 56 0 L 58 0 M 58 0 M 60 0 L 62 0 M 62 0 M 64 0 L 66 0 M 66 0 M 68 0 L 70 0 M 70 0 M 72 0 L 74 0 M 74 0 M 76 0 L 78 0 M 78 0 M 80 0 L 82 0 M 82 0 M 84 0 L 86 0 M 86 0 M 88 0 L 90 0 M 90 0 M 92 0 L 94 0 M 94 0 M 96 0 L 98 0 M 98 0 M 100 0 L 102 0 M 102 0 M 104 0 L 106 0 M 106 0 M 108 0 L 110 0 M 110 0 M 112 0 L 114 0 M 114 0 M 116 0 L 118 0 M 118 0 M 120 0 L 122 0 M 122 0 M 124 0 L 126 0 M 126 0 M 128 0 L 130 0 M 130 0 M 132 0 L 134 0 M 134 0 M 136 0 L 138 0 M 138 0 M 140 0 L 142 0 M 142 0 M 144 0 L 146 0 M 146 0 M 148 0 L 150 0 M 150 0 M 152 0 L 154 0 M 154 0 M 156 0 L 158 0 M 158 0 M 160 0 L 162 0 M 162 0 M 164 0 L 166 0 M 166 0 M 168 0 L 170 0 M 170 0 M 172 0 L 174 0 M 174 0 M 176 0 L 178 0 M 178 0 M 180 0 L 182 0 M 182 0 M 184 0 L 186 0 M 186 0 M 188 0 L 190 0 M 190 0 M 192 0 L 194 0 M 194 0 M 196 0 L 198 0 M 198 0 M 200 0 L 202 0 M 202 0 M 204 0 L 206 0 M 206 0 M 208 0 L 210 0 M 210 0 M 212 0 L 214 0 M 214 0 M 216 0 L 218 0 M 218 0 M 220 0 L 222 0 M 222 0 M 224 0 L 226 0 M 226 0 M 228 0 L 230 0 M 230 0 M 232 0 L 234 0 M 234 0 M 236 0 L 238 0 M 238 0 M 240 0 L 242 0 M 242 0 M 244 0 L 246 0 M 246 0 M 248 0 L 250 0 M 250 0 M 252 0 L 254 0 M 254 0 M 256 0 L 258 0 M 258 0 M 260 0 L 262 0 M 262 0 M 264 0 L 266 0 M 266 0 M 268 0 L 270 0 M 270 0 M 272 0 L 274 0 M 274 0 M 276 0 L 278 0 M 278 0 M 280 0 L 282 0 M 282 0 M 284 0 L 286 0 M 286 0 M 288 0 L 290 0 M 290 0 M 292 0 L 294 0 M 294 0 M 296 0 L 298 0 M 298 0 M 300 0 L 302 0 M 302 0 M 304 0 L 306 0 M 306 0 M 308 0 L 310 0 M 310 0 M 312 0 L 314 0 M 314 0 M 316 0 L 318 0 M 318 0 M 320 0 L 322 0 M 322 0 M 324 0 L 326 0 M 326 0 M 328 0 L 330 0 M 330 0 M 332 0 L 334 0 M 334 0 M 336 0 L 338 0 M 338 0 M 340 0 L 342 0 M 342 0 M 344 0 L 346 0 M 346 0 M 346.49999999999994 1.5000000000000568 L 346.49999999999994 3.500000000000057 M 346.49999999999994 3.500000000000057 M 346.49999999999994 5.500000000000057 L 346.49999999999994 7.500000000000057 M 346.49999999999994 7.500000000000057 M 346.49999999999994 9.500000000000057 L 346.49999999999994 11.500000000000057 M 346.49999999999994 11.500000000000057 M 346.49999999999994 13.500000000000057 L 346.49999999999994 15.500000000000057 M 346.49999999999994 15.500000000000057 M 346.49999999999994 17.500000000000057 L 346.49999999999994 19.500000000000057 M 346.49999999999994 19.500000000000057 M 346.49999999999994 21.500000000000057 L 346.49999999999994 23.500000000000057 M 346.49999999999994 23.500000000000057 M 346.49999999999994 25.500000000000057 L 346.49999999999994 27.500000000000057 M 346.49999999999994 27.500000000000057 M 346.49999999999994 29.500000000000057 L 346.49999999999994 31.500000000000057 M 346.49999999999994 31.500000000000057 M 346.49999999999994 33.50000000000006 L 346.49999999999994 35.50000000000006 M 346.49999999999994 35.50000000000006 M 346.49999999999994 37.50000000000006 L 346.49999999999994 39.50000000000006 M 346.49999999999994 39.50000000000006 M 346.49999999999994 41.50000000000006 L 346.49999999999994 43.50000000000006 M 346.49999999999994 43.50000000000006 M 346.49999999999994 45.50000000000006 L 346.49999999999994 47.50000000000006 M 346.49999999999994 47.50000000000006 M 346.49999999999994 49.50000000000006 L 346.49999999999994 51.50000000000006 M 346.49999999999994 51.50000000000006 M 346.49999999999994 53.50000000000006 L 346.49999999999994 55.50000000000006 M 346.49999999999994 55.50000000000006 M 346.49999999999994 57.50000000000006 L 346.49999999999994 59.50000000000006 M 346.49999999999994 59.50000000000006 M 346.49999999999994 61.50000000000006 L 346.49999999999994 63.50000000000006 M 346.49999999999994 63.50000000000006 M 346.49999999999994 65.50000000000006 L 346.49999999999994 67.50000000000006 M 346.49999999999994 67.50000000000006 M 346.49999999999994 69.50000000000006 L 346.49999999999994 71.50000000000006 M 346.49999999999994 71.50000000000006 M 346.49999999999994 73.50000000000006 L 346.49999999999994 75.50000000000006 M 346.49999999999994 75.50000000000006 M 346.49999999999994 77.50000000000006 L 346.49999999999994 79.50000000000006 M 346.49999999999994 79.50000000000006 M 346.49999999999994 81.50000000000006 L 346.49999999999994 83.50000000000006 M 346.49999999999994 83.50000000000006 M 346.49999999999994 85.50000000000006 L 346.49999999999994 87.50000000000006 M 346.49999999999994 87.50000000000006 M 346.49999999999994 89.50000000000006 L 346.49999999999994 91.50000000000006 M 346.49999999999994 91.50000000000006 M 346.49999999999994 93.50000000000006 L 346.49999999999994 95.50000000000006 M 346.49999999999994 95.50000000000006 M 346.49999999999994 97.50000000000006 L 346.49999999999994 99.50000000000006 M 346.49999999999994 99.50000000000006 M 346.49999999999994 101.50000000000006 L 346.49999999999994 103.50000000000006 M 346.49999999999994 103.50000000000006 M 346.49999999999994 105.50000000000006 L 346.49999999999994 107.50000000000006 M 346.49999999999994 107.50000000000006 M 346.49999999999994 109.50000000000006 L 346.49999999999994 111.50000000000006 M 346.49999999999994 111.50000000000006 M 346.49999999999994 113.50000000000006 L 346.49999999999994 115.50000000000006 M 346.49999999999994 115.50000000000006 M 346.49999999999994 117.50000000000006 L 346.49999999999994 119.50000000000006 M 346.49999999999994 119.50000000000006 M 346.49999999999994 121.50000000000006 L 346.49999999999994 123.50000000000006 M 346.49999999999994 123.50000000000006 M 346.49999999999994 125.50000000000006 L 346.49999999999994 127.50000000000006 M 346.49999999999994 127.50000000000006 M 346.49999999999994 129.50000000000006 L 346.49999999999994 131.50000000000006 M 346.49999999999994 131.50000000000006 M 346.49999999999994 133.50000000000006 L 346.49999999999994 135.50000000000006 M 346.49999999999994 135.50000000000006 M 346.49999999999994 137.50000000000006 L 346.49999999999994 139.50000000000006 M 346.49999999999994 139.50000000000006 M 346.49999999999994 141.50000000000006 L 346.49999999999994 143.50000000000006 M 346.49999999999994 143.50000000000006 M 346.49999999999994 145.50000000000006 L 346.49999999999994 147.50000000000006 M 346.49999999999994 147.50000000000006 M 346.49999999999994 149.50000000000006 L 346.49999999999994 151.50000000000006 M 346.49999999999994 151.50000000000006 M 346.49999999999994 153.50000000000006 L 346.49999999999994 155.50000000000006 M 346.49999999999994 155.50000000000006 M 346.49999999999994 157.50000000000006 L 346.49999999999994 159.50000000000006 M 346.49999999999994 159.50000000000006 M 346.49999999999994 161.50000000000006 L 346.49999999999994 163 Q 346.49999999999994 163 346.49999999999994 163 L 345.9999999999999 163 M 345.9999999999999 163 M 343.9999999999999 163 L 341.9999999999999 163 M 341.9999999999999 163 M 339.9999999999999 163 L 337.9999999999999 163 M 337.9999999999999 163 M 335.9999999999999 163 L 333.9999999999999 163 M 333.9999999999999 163 M 331.9999999999999 163 L 329.9999999999999 163 M 329.9999999999999 163 M 327.9999999999999 163 L 325.9999999999999 163 M 325.9999999999999 163 M 323.9999999999999 163 L 321.9999999999999 163 M 321.9999999999999 163 M 319.9999999999999 163 L 317.9999999999999 163 M 317.9999999999999 163 M 315.9999999999999 163 L 313.9999999999999 163 M 313.9999999999999 163 M 311.9999999999999 163 L 309.9999999999999 163 M 309.9999999999999 163 M 307.9999999999999 163 L 305.9999999999999 163 M 305.9999999999999 163 M 303.9999999999999 163 L 301.9999999999999 163 M 301.9999999999999 163 M 299.9999999999999 163 L 297.9999999999999 163 M 297.9999999999999 163 M 295.9999999999999 163 L 293.9999999999999 163 M 293.9999999999999 163 M 291.9999999999999 163 L 289.9999999999999 163 M 289.9999999999999 163 M 287.9999999999999 163 L 285.9999999999999 163 M 285.9999999999999 163 M 283.9999999999999 163 L 281.9999999999999 163 M 281.9999999999999 163 M 279.9999999999999 163 L 277.9999999999999 163 M 277.9999999999999 163 M 275.9999999999999 163 L 273.9999999999999 163 M 273.9999999999999 163 M 271.9999999999999 163 L 269.9999999999999 163 M 269.9999999999999 163 M 267.9999999999999 163 L 265.9999999999999 163 M 265.9999999999999 163 M 263.9999999999999 163 L 261.9999999999999 163 M 261.9999999999999 163 M 259.9999999999999 163 L 257.9999999999999 163 M 257.9999999999999 163 M 255.9999999999999 163 L 253.9999999999999 163 M 253.9999999999999 163 M 251.9999999999999 163 L 249.9999999999999 163 M 249.9999999999999 163 M 247.9999999999999 163 L 245.9999999999999 163 M 245.9999999999999 163 M 243.9999999999999 163 L 241.9999999999999 163 M 241.9999999999999 163 M 239.9999999999999 163 L 237.9999999999999 163 M 237.9999999999999 163 M 235.9999999999999 163 L 233.9999999999999 163 M 233.9999999999999 163 M 231.9999999999999 163 L 229.9999999999999 163 M 229.9999999999999 163 M 227.9999999999999 163 L 225.9999999999999 163 M 225.9999999999999 163 M 223.9999999999999 163 L 221.9999999999999 163 M 221.9999999999999 163 M 219.9999999999999 163 L 217.9999999999999 163 M 217.9999999999999 163 M 215.9999999999999 163 L 213.9999999999999 163 M 213.9999999999999 163 M 211.9999999999999 163 L 209.9999999999999 163 M 209.9999999999999 163 M 207.9999999999999 163 L 205.9999999999999 163 M 205.9999999999999 163 M 203.9999999999999 163 L 201.9999999999999 163 M 201.9999999999999 163 M 199.9999999999999 163 L 197.9999999999999 163 M 197.9999999999999 163 M 195.9999999999999 163 L 193.9999999999999 163 M 193.9999999999999 163 M 191.9999999999999 163 L 189.9999999999999 163 M 189.9999999999999 163 M 187.9999999999999 163 L 185.9999999999999 163 M 185.9999999999999 163 M 183.9999999999999 163 L 181.9999999999999 163 M 181.9999999999999 163 M 179.9999999999999 163 L 177.9999999999999 163 M 177.9999999999999 163 M 175.9999999999999 163 L 173.9999999999999 163 M 173.9999999999999 163 M 171.9999999999999 163 L 169.9999999999999 163 M 169.9999999999999 163 M 167.9999999999999 163 L 165.9999999999999 163 M 165.9999999999999 163 M 163.9999999999999 163 L 161.9999999999999 163 M 161.9999999999999 163 M 159.9999999999999 163 L 157.9999999999999 163 M 157.9999999999999 163 M 155.9999999999999 163 L 153.9999999999999 163 M 153.9999999999999 163 M 151.9999999999999 163 L 149.9999999999999 163 M 149.9999999999999 163 M 147.9999999999999 163 L 145.9999999999999 163 M 145.9999999999999 163 M 143.9999999999999 163 L 141.9999999999999 163 M 141.9999999999999 163 M 139.9999999999999 163 L 137.9999999999999 163 M 137.9999999999999 163 M 135.9999999999999 163 L 133.9999999999999 163 M 133.9999999999999 163 M 131.9999999999999 163 L 129.9999999999999 163 M 129.9999999999999 163 M 127.99999999999989 163 L 125.99999999999989 163 M 125.99999999999989 163 M 123.99999999999989 163 L 121.99999999999989 163 M 121.99999999999989 163 M 119.99999999999989 163 L 117.99999999999989 163 M 117.99999999999989 163 M 115.99999999999989 163 L 113.99999999999989 163 M 113.99999999999989 163 M 111.99999999999989 163 L 109.99999999999989 163 M 109.99999999999989 163 M 107.99999999999989 163 L 105.99999999999989 163 M 105.99999999999989 163 M 103.99999999999989 163 L 101.99999999999989 163 M 101.99999999999989 163 M 99.99999999999989 163 L 97.99999999999989 163 M 97.99999999999989 163 M 95.99999999999989 163 L 93.99999999999989 163 M 93.99999999999989 163 M 91.99999999999989 163 L 89.99999999999989 163 M 89.99999999999989 163 M 87.99999999999989 163 L 85.99999999999989 163 M 85.99999999999989 163 M 83.99999999999989 163 L 81.99999999999989 163 M 81.99999999999989 163 M 79.99999999999989 163 L 77.99999999999989 163 M 77.99999999999989 163 M 75.99999999999989 163 L 73.99999999999989 163 M 73.99999999999989 163 M 71.99999999999989 163 L 69.99999999999989 163 M 69.99999999999989 163 M 67.99999999999989 163 L 65.99999999999989 163 M 65.99999999999989 163 M 63.999999999999886 163 L 61.999999999999886 163 M 61.999999999999886 163 M 59.999999999999886 163 L 57.999999999999886 163 M 57.999999999999886 163 M 55.999999999999886 163 L 53.999999999999886 163 M 53.999999999999886 163 M 51.999999999999886 163 L 49.999999999999886 163 M 49.999999999999886 163 M 47.999999999999886 163 L 45.999999999999886 163 M 45.999999999999886 163 M 43.999999999999886 163 L 41.999999999999886 163 M 41.999999999999886 163 M 39.999999999999886 163 L 37.999999999999886 163 M 37.999999999999886 163 M 35.999999999999886 163 L 33.999999999999886 163 M 33.999999999999886 163 M 31.999999999999886 163 L 29.999999999999886 163 M 29.999999999999886 163 M 27.999999999999886 163 L 25.999999999999886 163 M 25.999999999999886 163 M 23.999999999999886 163 L 21.999999999999886 163 M 21.999999999999886 163 M 19.999999999999886 163 L 17.999999999999886 163 M 17.999999999999886 163 M 15.999999999999886 163 L 13.999999999999886 163 M 13.999999999999886 163 M 11.999999999999886 163 L 9.999999999999886 163 M 9.999999999999886 163 M 7.999999999999886 163 L 5.999999999999886 163 M 5.999999999999886 163 M 3.9999999999998863 163 L 1.9999999999998863 163 M 1.9999999999998863 163 M 0 162.9999999999999 L 0 160.9999999999999 M 0 160.9999999999999 M 0 158.9999999999999 L 0 156.9999999999999 M 0 156.9999999999999 M 0 154.9999999999999 L 0 152.9999999999999 M 0 152.9999999999999 M 0 150.9999999999999 L 0 148.9999999999999 M 0 148.9999999999999 M 0 146.9999999999999 L 0 144.9999999999999 M 0 144.9999999999999 M 0 142.9999999999999 L 0 140.9999999999999 M 0 140.9999999999999 M 0 138.9999999999999 L 0 136.9999999999999 M 0 136.9999999999999 M 0 134.9999999999999 L 0 132.9999999999999 M 0 132.9999999999999 M 0 130.9999999999999 L 0 128.9999999999999 M 0 128.9999999999999 M 0 126.99999999999989 L 0 124.99999999999989 M 0 124.99999999999989 M 0 122.99999999999989 L 0 120.99999999999989 M 0 120.99999999999989 M 0 118.99999999999989 L 0 116.99999999999989 M 0 116.99999999999989 M 0 114.99999999999989 L 0 112.99999999999989 M 0 112.99999999999989 M 0 110.99999999999989 L 0 108.99999999999989 M 0 108.99999999999989 M 0 106.99999999999989 L 0 104.99999999999989 M 0 104.99999999999989 M 0 102.99999999999989 L 0 100.99999999999989 M 0 100.99999999999989 M 0 98.99999999999989 L 0 96.99999999999989 M 0 96.99999999999989 M 0 94.99999999999989 L 0 92.99999999999989 M 0 92.99999999999989 M 0 90.99999999999989 L 0 88.99999999999989 M 0 88.99999999999989 M 0 86.99999999999989 L 0 84.99999999999989 M 0 84.99999999999989 M 0 82.99999999999989 L 0 80.99999999999989 M 0 80.99999999999989 M 0 78.99999999999989 L 0 76.99999999999989 M 0 76.99999999999989 M 0 74.99999999999989 L 0 72.99999999999989 M 0 72.99999999999989 M 0 70.99999999999989 L 0 68.99999999999989 M 0 68.99999999999989 M 0 66.99999999999989 L 0 64.99999999999989 M 0 64.99999999999989 M 0 62.999999999999886 L 0 60.999999999999886 M 0 60.999999999999886 M 0 58.999999999999886 L 0 56.999999999999886 M 0 56.999999999999886 M 0 54.999999999999886 L 0 52.999999999999886 M 0 52.999999999999886 M 0 50.999999999999886 L 0 48.999999999999886 M 0 48.999999999999886 M 0 46.999999999999886 L 0 44.999999999999886 M 0 44.999999999999886 M 0 42.999999999999886 L 0 40.999999999999886 M 0 40.999999999999886 M 0 38.999999999999886 L 0 36.999999999999886 M 0 36.999999999999886 M 0 34.999999999999886 L 0 32.999999999999886 M 0 32.999999999999886 M 0 30.999999999999886 L 0 28.999999999999886 M 0 28.999999999999886 M 0 26.999999999999886 L 0 24.999999999999886 M 0 24.999999999999886 M 0 22.999999999999886 L 0 20.999999999999886 M 0 20.999999999999886 M 0 18.999999999999886 L 0 16.999999999999886 M 0 16.999999999999886 M 0 14.999999999999886 L 0 12.999999999999886 M 0 12.999999999999886 M 0 10.999999999999886 L 0 8.999999999999886 M 0 8.999999999999886 M 0 6.999999999999886 L 0 4.999999999999886 M 0 4.999999999999886 M 0 2.9999999999998863 L 0 0.9999999999998863 M 0 0.9999999999998863 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,452,268)"><g transform="translate(0,0)"><g transform="translate(-37.5,-145.5) translate(-414.5,-122.5) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#cccccc" d="M 456.5 272.5 L 468.5 353" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g><g transform="matrix(1,0,0,1,472.71067811865476,268)"><g transform="translate(0,0)"><g transform="translate(-76.5,-141.5) translate(-396.21067811865476,-126.5) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#cccccc" d="M 477.21067811865476 272.5 L 636.5 353" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g><g transform="matrix(1,0,0,1,386.71067811865476,108.5)"><g transform="translate(0,0)"><g transform="translate(-239.28932188134524,-150) translate(-147.4213562373095,41.5) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#cccccc" d="M 435.78932188134524 197.5 L 391.21067811865476 113" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g><g transform="matrix(1,0,0,1,298.21067811865476,108.49999999999999)"><g transform="translate(0,0)"><g transform="translate(-245,-109) translate(-53.210678118654755,0.5000000000000142) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#cccccc" d="M 349.78932188134524 112.99999999999999 L 302.71067811865476 197.5" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g><g transform="matrix(1,0,0,1,259.5,268)"><g transform="translate(0,0)"><g transform="translate(-182,-272.5) translate(-77.5,4.5) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#cccccc" d="M 282 272.5 L 264 353" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g><g transform="matrix(1,0,0,1,98.5,268)"><g transform="translate(0,0)"><g transform="translate(-195,-261.5) translate(96.5,-6.5) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#cccccc" d="M 261.28932188134524 272.5 L 103 353" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g><g transform="translate(0,0) matrix(1,0,0,1,320.5,38)"><g transform="translate(4,4) scale(1.01,1.0133333333333334)"><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="#000000" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" opacity="0.294117647"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="rgb(0,0,0)" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-opacity="0" stroke-miterlimit="10" stroke-width="2" opacity="0.294117647"/></g></g></g></g></g><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="url(#ClVsETaxurTF)" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="url(#ClVsETaxurTF)" stroke="#333333" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="scale(1,1) matrix(1,0,0,1,322.5,38) translate(8,30.5)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="21.9912109375" y="11">Router</text></g><g transform="translate(0,0) matrix(1,0,0,1,232,197.5)"><g transform="translate(4,4) scale(1.01,1.0133333333333334)"><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="#000000" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" opacity="0.294117647"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="rgb(0,0,0)" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-opacity="0" stroke-miterlimit="10" stroke-width="2" opacity="0.294117647"/></g></g></g></g></g><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="url(#GTSMrnemlxgL)" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="url(#GTSMrnemlxgL)" stroke="#333333" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="scale(1,1) matrix(1,0,0,1,234,197.5) translate(8,30.5)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="24.326171875" y="11">Host1</text></g><g transform="translate(0,0) matrix(1,0,0,1,406.5,197.5)"><g transform="translate(4,4) scale(1.01,1.0133333333333334)"><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="#000000" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" opacity="0.294117647"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="rgb(0,0,0)" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-opacity="0" stroke-miterlimit="10" stroke-width="2" opacity="0.294117647"/></g></g></g></g></g><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="url(#IASCltgTKxVX)" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="url(#IASCltgTKxVX)" stroke="#333333" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="scale(1,1) matrix(1,0,0,1,408.5,197.5) translate(8,30.5)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="24.326171875" y="11">Host2</text></g><g transform="scale(1,1) matrix(1,0,0,1,220,168) translate(2,0)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="0" y="11">eth0 2001:db8:1:0::1/64</text><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="0" y="25">&#160; &#160; &#160; &#160; fe80::1:1/64</text></g><g transform="scale(1,1) matrix(1,0,0,1,394.5,168) translate(2,0)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="0" y="11">eth0 2001:db8:2:0::1/64</text><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="0" y="25">&#160; &#160; &#160; &#160; fe80::2:1/64</text></g><g transform="scale(1,1) matrix(1,0,0,1,381.5,280) translate(2,0)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="23.2978515625" y="11">docker0 fe80::1/64</text></g><g transform="scale(1,1) matrix(1,0,0,1,207,281) translate(2,0)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="23.2978515625" y="11">docker0 fe80::1/64</text></g><g transform="translate(0,0) matrix(1,0,0,1,53,353)"><g transform="translate(4,4) scale(1.01,1.01)"><g><g transform="translate(0,0) scale(1,1)"><g><path fill="#000000" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" opacity="0.294117647"/><g transform="scale(1,1)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="rgb(0,0,0)" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" stroke-opacity="0" stroke-miterlimit="10" stroke-width="2" opacity="0.294117647"/></g></g></g></g></g><g><g transform="translate(0,0) scale(1,1)"><g><path fill="url(#JnuicmrpqmBN)" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><path fill="url(#JnuicmrpqmBN)" stroke="#333333" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="scale(1,1) matrix(1,0,0,1,55,353) translate(8,43)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="5.3125" y="11">Container1-1</text></g><g transform="translate(0,0) matrix(1,0,0,1,214,353)"><g transform="translate(4,4) scale(1.01,1.01)"><g><g transform="translate(0,0) scale(1,1)"><g><path fill="#000000" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" opacity="0.294117647"/><g transform="scale(1,1)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="rgb(0,0,0)" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" stroke-opacity="0" stroke-miterlimit="10" stroke-width="2" opacity="0.294117647"/></g></g></g></g></g><g><g transform="translate(0,0) scale(1,1)"><g><path fill="url(#hFaybqmFxMro)" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><path fill="url(#hFaybqmFxMro)" stroke="#333333" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="scale(1,1) matrix(1,0,0,1,216,353) translate(8,43)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="5.3125" y="11">Container1-2</text></g><g transform="scale(1,1) matrix(1,0,0,1,28.000000000000014,336) translate(2,0)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="9.610351562499986" y="11">eth0 2001:db8:1:1::1/64</text></g><g transform="translate(0,0) matrix(1,0,0,1,418.5,353)"><g transform="translate(4,4) scale(1.01,1.01)"><g><g transform="translate(0,0) scale(1,1)"><g><path fill="#000000" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" opacity="0.294117647"/><g transform="scale(1,1)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="rgb(0,0,0)" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" stroke-opacity="0" stroke-miterlimit="10" stroke-width="2" opacity="0.294117647"/></g></g></g></g></g><g><g transform="translate(0,0) scale(1,1)"><g><path fill="url(#xTMAzNEEftvg)" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><path fill="url(#xTMAzNEEftvg)" stroke="#333333" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="scale(1,1) matrix(1,0,0,1,420.5,353) translate(8,43)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="5.3125" y="11">Container2-1</text></g><g transform="translate(0,0) matrix(1,0,0,1,586.5,353)"><g transform="translate(4,4) scale(1.01,1.01)"><g><g transform="translate(0,0) scale(1,1)"><g><path fill="#000000" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" opacity="0.294117647"/><g transform="scale(1,1)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="rgb(0,0,0)" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" stroke-opacity="0" stroke-miterlimit="10" stroke-width="2" opacity="0.294117647"/></g></g></g></g></g><g><g transform="translate(0,0) scale(1,1)"><g><path fill="url(#ZNvsdvOaDeTx)" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><path fill="url(#ZNvsdvOaDeTx)" stroke="#333333" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="scale(1,1) matrix(1,0,0,1,588.5,353) translate(8,43)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="5.3125" y="11">Container2-2</text></g><g transform="scale(1,1) matrix(1,0,0,1,25.5,199.5) translate(2,0)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="0" y="11">route -A inet6 default gw fe80::1 \</text><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="0" y="25">&#160; &#160;dev eth0</text><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="56.0390625" y="25">&#160;</text></g><g transform="scale(1,1) matrix(1,0,0,1,384.75,462) translate(2,0)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="58.134765625" y="11">route -A inet6 default gw fe80::1 dev eth0</text></g><g transform="scale(1,1) matrix(1,0,0,1,11.5,463) translate(2,0)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="61.50976562499997" y="11">route -A inet6 default gw fe80::1 dev eth0</text></g><g transform="matrix(1,0,0,1,-9.000680271168676,245.99999999999966)"><g transform="translate(0,0)"><g transform="translate(-793,-250) translate(802.0006802711687,4.000000000000341) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#000000" d="M 723.75 250 M 723.75 250 L 715.75 250 M 715.75 250 M 707.75 250 L 699.75 250 M 699.75 250 M 691.75 250 L 683.75 250 M 683.75 250 M 675.75 250 L 667.75 250 M 667.75 250 M 659.75 250 L 651.75 250 M 651.75 250 M 643.75 250 L 635.75 250 M 635.75 250 M 627.75 250 L 619.75 250 M 619.75 250 M 611.75 250 L 603.75 250 M 603.75 250 M 595.75 250 L 587.75 250 M 587.75 250 M 579.75 250 L 571.75 250 M 571.75 250 M 563.75 250 L 555.75 250 M 555.75 250 M 547.75 250 L 539.75 250 M 539.75 250 M 531.75 250 L 523.75 250 M 523.75 250 M 515.75 250 L 507.75 250 M 507.75 250 M 499.75 250 L 491.75 250 M 491.75 250 M 483.75 250 L 475.75 250 M 475.75 250 M 467.75 250 L 459.75 250 M 459.75 250 M 451.75 250 L 443.75 250 M 443.75 250 M 435.75 250 L 427.75 250 M 427.75 250 M 419.75 250 L 411.75 250 M 411.75 250 M 403.75 250 L 395.75 250 M 395.75 250 M 387.75 250 L 379.75 250 M 379.75 250 M 371.75 250 L 363.75 250 M 363.75 250 M 355.75 250 L 347.75 250 M 347.75 250 M 339.75 250 L 331.75 250 M 331.75 250 M 323.75 250 L 315.75 250 M 315.75 250 M 307.75 250 L 299.75 250 M 299.75 250 M 291.75 250 L 283.75 250 M 283.75 250 M 275.75 250 L 267.75 250 M 267.75 250 M 259.75 250 L 251.75 250 M 251.75 250 M 243.75 250 L 235.75 250 M 235.75 250 M 227.75 250 L 219.75 250 M 219.75 250 M 211.75 250 L 203.75 250 M 203.75 250 M 195.75 250 L 187.75 250 M 187.75 250 M 179.75 250 L 171.75 249.99999999999997 M 171.75 249.99999999999997 M 163.75 249.99999999999997 L 155.75 249.99999999999994 M 155.75 249.99999999999994 M 147.75 249.99999999999994 L 139.75 249.99999999999991 M 139.75 249.99999999999991 M 131.75 249.99999999999991 L 123.75 249.9999999999999 M 123.75 249.9999999999999 M 115.75 249.9999999999999 L 107.75 249.99999999999986 M 107.75 249.99999999999986 M 99.75 249.99999999999986 L 91.75 249.99999999999983 M 91.75 249.99999999999983 M 83.75 249.99999999999983 L 75.75 249.9999999999998 M 75.75 249.9999999999998 M 67.75 249.9999999999998 L 59.75 249.99999999999977 M 59.75 249.99999999999977 M 51.75 249.99999999999977 L 43.75 249.99999999999974 M 43.75 249.99999999999974 M 35.75 249.99999999999974 L 27.75 249.99999999999972 M 27.75 249.99999999999972 M 19.75 249.99999999999972 L 11.75 249.9999999999997 M 11.75 249.9999999999997 M 3.75 249.9999999999997 L -4.25 249.99999999999966 M -4.25 249.99999999999966" stroke-miterlimit="10"/></g></g></g></g><g transform="scale(1,1) matrix(1,0,0,1,528.5,197.5) translate(2,0)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="0" y="11">route -A inet6 default gw fe80::1 \</text><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="0" y="25">&#160; &#160; dev eth0</text></g><g transform="scale(1,1) matrix(1,0,0,1,189,336) translate(2,0)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="9.6103515625" y="11">eth0 2001:db8:1:1::2/64</text></g><g transform="scale(1,1) matrix(1,0,0,1,395,336) translate(2,0)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="9.6103515625" y="11">eth0 2001:db8:2:1::1/64</text></g><g transform="scale(1,1) matrix(1,0,0,1,563,336) translate(2,0)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="9.6103515625" y="11">eth0 2001:db8:2:1::2/64</text></g><g transform="scale(1,1) matrix(1,0,0,1,433.5,42.5) translate(2,0)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="0" y="11">route -A inet6 default gw fe80::1&#160;</text><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="173.443359375" y="11">dev eth0</text><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="0" y="25">&#160;</text><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="0" y="39">&#160;</text><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="0" y="53">route -A inet6 2001:db8:1::/48&#160;</text><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="162.1171875" y="53">gw fe80::1:1 dev eth1</text><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="0" y="67">route -A inet6 2001:db8:2::/48&#160;</text><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="162.1171875" y="67">gw fe80::2:1 dev eth1</text></g><g transform="scale(1,1) matrix(1,0,0,1,293,120) translate(2,0)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="32.9658203125" y="11">eth1 fe80::1/64</text></g><g transform="scale(1,1) matrix(1,0,0,1,296,21) translate(2,0)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="19.6181640625" y="11">eth0 2001:db8::1/64</text></g><g transform="scale(1,1) matrix(1,0,0,1,259,491.5) translate(2,0)"><text fill="#000000" stroke="none" font-family="Arial" font-size="10px" font-style="italic" font-weight="normal" text-decoration="none" x="0.7084960937500142" y="9">containers' link-local addresses are not displayed</text></g><g transform="scale(1,1) matrix(1,0,0,1,25.5,254) translate(2,0)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="0" y="11">route -A inet6 2001:db8:1:1::/64 \</text><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="0" y="25">&#160; &#160; dev docker0</text></g><g transform="scale(1,1) matrix(1,0,0,1,528.5,252) translate(2,0)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="0" y="11">route -A inet6 2001:db8:2:1::/64 \</text><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="0" y="25">&#160; &#160; dev docker0</text></g><g transform="matrix(1,0,0,1,727,231)"><image width="40" height="275" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAETCAYAAABENES3AAAC+klEQVR4Xu3a/00CQRCGYShApQOwAzuAUqAStRIoBTuwA7ED1AJwxuyZ84Q/Pr4xIea9ZMMPb5fJs8MwuXM8uvBjfOHxjQjQ3SEEEXQF3PnkIIKugDufHETQFXDnk4MIugLu/OocXLaANm5g3fzqAHex8CHG7SUGmHrrFtgqHksUKwVTb9oCzOclilUBPkRA94NtfYzX+b51VAQ4iQhS7DpGt17m4XuMWYy9E2FFgMf0uphsRTfA1HuJkY/HjtTLXDxb0Q1wER+eozvmbZu3vffyef+1tONugMMPyy9KrpnbXnIQoMuIIIKiAN9iEezX6QgiqApQqFWx4fkIIigKUKhFMH7qyu8Xk4PkoCrAT50qRrPAtRkzZyjUJuDXhXSuDzqKCDp6ORdBBFUB2i1VjHaLnzozZyjUJiA/dS4gggjKAjQLMtlgAoIIigI0CyIYN3K4keOmDIIIqgIUalVseD6CCKoCdNSqGBcwuYBp5gyF2gTk8psLiCCCsgDNgkzGBUz+scdLGpoFz49/7HH9EERQF6BZ0M1+zkAQQVGAZkEE424n9+rclEEQQVWAQq2KcbeTftDNGQQRFAUo1CIYHTX9oJsyCCKoClCoVTE6avpBN2cQRFAUoFCLYHTU9INuyiCIoCpAoVbF6KjpB92cQRBBUYBCLYLRUdMPuimDIIKqAIVaFaOjph90cwZBBEUBCrUIRkdNP+imDIIIqgIUalWMjpp+0M0ZBBEUBSjUIhgdNf2gmzIIIqgKUKhVMTpq+kE3ZxBEUBSgUItgdNT/vx9cxCbPexudz7O2bnvvPQ1eS2nkFupJfNouxs2JT32L92cx9lJUvZPdAHOphxhZXo4dj+3v58ZXkoOp+Brjqm1vBnOI8RFj6ujlQhWCpxRtvcoAU/G5ieW6KXrn6lUGmGstY6xbsq3icXN24vUmVm1xt+SuPZlVBFct2CnmY4neXwRYBfe9TvUWE2C5gLsgW4ygK+DOJwcRdAXc+eQggq6AO58cRNAVcOd/AkIABCN/o+CNAAAAAElFTkSuQmCC" transform="translate(0,0)"/></g><g transform="scale(1,1) matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,731,444.5) translate(2,0)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="19.3046875" y="11">managed by Docker</text></g><g transform="matrix(1,0,0,1,719.75,246)"><g transform="translate(0,0)"><g transform="translate(-765,-250) translate(45.25,4) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#000000" d="M 752.0176935741139 250 L 723.75 250" stroke-miterlimit="10"/></g></g></g></g><g transform="matrix(1,0,0,1,720.75,483)"><g transform="translate(0,0)"><g transform="translate(-766,-487) translate(45.25,4) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#000000" d="M 752.0183424505415 487 L 724.75 487" stroke-miterlimit="10"/></g></g></g></g></g></svg> \ No newline at end of file
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="776.0183424505415" height="522.5"><style xmlns="http://www.w3.org/1999/xhtml"></style><defs><linearGradient id="pTwRJlTmoXQS" x1="0px" x2="0px" y1="100px" y2="-50px" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#fff2cc"/><stop offset="1" stop-color="#FFFFFF"/></linearGradient><linearGradient id="FvZELeRwLGTV" x1="0px" x2="0px" y1="100px" y2="-50px" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#a4c2f4"/><stop offset="1" stop-color="#FFFFFF"/></linearGradient><linearGradient id="icpEixOwIatD" x1="0px" x2="0px" y1="100px" y2="-50px" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#a4c2f4"/><stop offset="1" stop-color="#FFFFFF"/></linearGradient><linearGradient id="LkNSHLFhaxIA" x1="0px" x2="0px" y1="100px" y2="-50px" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ead1dc"/><stop offset="1" stop-color="#FFFFFF"/></linearGradient><linearGradient id="oKDqFTggfkIn" x1="0px" x2="0px" y1="100px" y2="-50px" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ead1dc"/><stop offset="1" stop-color="#FFFFFF"/></linearGradient><linearGradient id="ibePzzWmRSgC" x1="0px" x2="0px" y1="100px" y2="-50px" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ead1dc"/><stop offset="1" stop-color="#FFFFFF"/></linearGradient><linearGradient id="OTKSvGQcxRpB" x1="0px" x2="0px" y1="100px" y2="-50px" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ead1dc"/><stop offset="1" stop-color="#FFFFFF"/></linearGradient></defs><g transform="translate(0,0)"><g><rect fill="#FFFFFF" stroke="none" x="0" y="0" width="776.0183424505415" height="522.5"/></g><g transform="translate(0,0) matrix(1,0,0,1,297.75,10.5)"><g><g transform="translate(0,0) scale(4.26,1.33)"><g><path fill="#FFFFFF" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(0.2347417840375587,0.7518796992481203)"><path fill="none" stroke="none" d="M 0 0 L 426 0 Q 426 0 426 0 L 426 133 Q 426 133 426 133 L 0 133 Q 0 133 0 133 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" d="M 0 0 M 0 0 L 2 0 M 2 0 M 4 0 L 6 0 M 6 0 M 8 0 L 10 0 M 10 0 M 12 0 L 14 0 M 14 0 M 16 0 L 18 0 M 18 0 M 20 0 L 22 0 M 22 0 M 24 0 L 26 0 M 26 0 M 28 0 L 30 0 M 30 0 M 32 0 L 34 0 M 34 0 M 36 0 L 38 0 M 38 0 M 40 0 L 42 0 M 42 0 M 44 0 L 46 0 M 46 0 M 48 0 L 50 0 M 50 0 M 52 0 L 54 0 M 54 0 M 56 0 L 58 0 M 58 0 M 60 0 L 62 0 M 62 0 M 64 0 L 66 0 M 66 0 M 68 0 L 70 0 M 70 0 M 72 0 L 74 0 M 74 0 M 76 0 L 78 0 M 78 0 M 80 0 L 82 0 M 82 0 M 84 0 L 86 0 M 86 0 M 88 0 L 90 0 M 90 0 M 92 0 L 94 0 M 94 0 M 96 0 L 98 0 M 98 0 M 100 0 L 102 0 M 102 0 M 104 0 L 106 0 M 106 0 M 108 0 L 110 0 M 110 0 M 112 0 L 114 0 M 114 0 M 116 0 L 118 0 M 118 0 M 120 0 L 122 0 M 122 0 M 124 0 L 126 0 M 126 0 M 128 0 L 130 0 M 130 0 M 132 0 L 134 0 M 134 0 M 136 0 L 138 0 M 138 0 M 140 0 L 142 0 M 142 0 M 144 0 L 146 0 M 146 0 M 148 0 L 150 0 M 150 0 M 152 0 L 154 0 M 154 0 M 156 0 L 158 0 M 158 0 M 160 0 L 162 0 M 162 0 M 164 0 L 166 0 M 166 0 M 168 0 L 170 0 M 170 0 M 172 0 L 174 0 M 174 0 M 176 0 L 178 0 M 178 0 M 180 0 L 182 0 M 182 0 M 184 0 L 186 0 M 186 0 M 188 0 L 190 0 M 190 0 M 192 0 L 194 0 M 194 0 M 196 0 L 198 0 M 198 0 M 200 0 L 202 0 M 202 0 M 204 0 L 206 0 M 206 0 M 208 0 L 210 0 M 210 0 M 212 0 L 214 0 M 214 0 M 216 0 L 218 0 M 218 0 M 220 0 L 222 0 M 222 0 M 224 0 L 226 0 M 226 0 M 228 0 L 230 0 M 230 0 M 232 0 L 234 0 M 234 0 M 236 0 L 238 0 M 238 0 M 240 0 L 242 0 M 242 0 M 244 0 L 246 0 M 246 0 M 248 0 L 250 0 M 250 0 M 252 0 L 254 0 M 254 0 M 256 0 L 258 0 M 258 0 M 260 0 L 262 0 M 262 0 M 264 0 L 266 0 M 266 0 M 268 0 L 270 0 M 270 0 M 272 0 L 274 0 M 274 0 M 276 0 L 278 0 M 278 0 M 280 0 L 282 0 M 282 0 M 284 0 L 286 0 M 286 0 M 288 0 L 290 0 M 290 0 M 292 0 L 294 0 M 294 0 M 296 0 L 298 0 M 298 0 M 300 0 L 302 0 M 302 0 M 304 0 L 306 0 M 306 0 M 308 0 L 310 0 M 310 0 M 312 0 L 314 0 M 314 0 M 316 0 L 318 0 M 318 0 M 320 0 L 322 0 M 322 0 M 324 0 L 326 0 M 326 0 M 328 0 L 330 0 M 330 0 M 332 0 L 334 0 M 334 0 M 336 0 L 338 0 M 338 0 M 340 0 L 342 0 M 342 0 M 344 0 L 346 0 M 346 0 M 348 0 L 350 0 M 350 0 M 352 0 L 354 0 M 354 0 M 356 0 L 358 0 M 358 0 M 360 0 L 362 0 M 362 0 M 364 0 L 366 0 M 366 0 M 368 0 L 370 0 M 370 0 M 372 0 L 374 0 M 374 0 M 376 0 L 378 0 M 378 0 M 380 0 L 382 0 M 382 0 M 384 0 L 386 0 M 386 0 M 388 0 L 390 0 M 390 0 M 392 0 L 394 0 M 394 0 M 396 0 L 398 0 M 398 0 M 400 0 L 402 0 M 402 0 M 404 0 L 406 0 M 406 0 M 408 0 L 410 0 M 410 0 M 412 0 L 414 0 M 414 0 M 416 0 L 418 0 M 418 0 M 420 0 L 422 0 M 422 0 M 424 0 L 426 0 M 426 0 M 426 2 L 426 4 M 426 4 M 426 6 L 426 8 M 426 8 M 426 10 L 426 12 M 426 12 M 426 14 L 426 16 M 426 16 M 426 18 L 426 20 M 426 20 M 426 22 L 426 24 M 426 24 M 426 26 L 426 28 M 426 28 M 426 30 L 426 32 M 426 32 M 426 34 L 426 36 M 426 36 M 426 38 L 426 40 M 426 40 M 426 42 L 426 44 M 426 44 M 426 46 L 426 48 M 426 48 M 426 50 L 426 52 M 426 52 M 426 54 L 426 56 M 426 56 M 426 58 L 426 60 M 426 60 M 426 62 L 426 64 M 426 64 M 426 66 L 426 68 M 426 68 M 426 70 L 426 72 M 426 72 M 426 74 L 426 76 M 426 76 M 426 78 L 426 80 M 426 80 M 426 82 L 426 84 M 426 84 M 426 86 L 426 88 M 426 88 M 426 90 L 426 92 M 426 92 M 426 94 L 426 96 M 426 96 M 426 98 L 426 100 M 426 100 M 426 102 L 426 104 M 426 104 M 426 106 L 426 108 M 426 108 M 426 110 L 426 112 M 426 112 M 426 114 L 426 116 M 426 116 M 426 118 L 426 120 M 426 120 M 426 122 L 426 124 M 426 124 M 426 126 L 426 128 M 426 128 M 426 130 L 426 132 M 426 132 M 425 133 L 423 133 M 423 133 M 421 133 L 419 133 M 419 133 M 417 133 L 415 133 M 415 133 M 413 133 L 411 133 M 411 133 M 409 133 L 407 133 M 407 133 M 405 133 L 403 133 M 403 133 M 401 133 L 399 133 M 399 133 M 397 133 L 395 133 M 395 133 M 393 133 L 391 133 M 391 133 M 389 133 L 387 133 M 387 133 M 385 133 L 383 133 M 383 133 M 381 133 L 379 133 M 379 133 M 377 133 L 375 133 M 375 133 M 373 133 L 371 133 M 371 133 M 369 133 L 367 133 M 367 133 M 365 133 L 363 133 M 363 133 M 361 133 L 359 133 M 359 133 M 357 133 L 355 133 M 355 133 M 353 133 L 351 133 M 351 133 M 349 133 L 347 133 M 347 133 M 345 133 L 343 133 M 343 133 M 341 133 L 339 133 M 339 133 M 337 133 L 335 133 M 335 133 M 333 133 L 331 133 M 331 133 M 329 133 L 327 133 M 327 133 M 325 133 L 323 133 M 323 133 M 321 133 L 319 133 M 319 133 M 317 133 L 315 133 M 315 133 M 313 133 L 311 133 M 311 133 M 309 133 L 307 133 M 307 133 M 305 133 L 303 133 M 303 133 M 301 133 L 299 133 M 299 133 M 297 133 L 295 133 M 295 133 M 293 133 L 291 133 M 291 133 M 289 133 L 287 133 M 287 133 M 285 133 L 283 133 M 283 133 M 281 133 L 279 133 M 279 133 M 277 133 L 275 133 M 275 133 M 273 133 L 271 133 M 271 133 M 269 133 L 267 133 M 267 133 M 265 133 L 263 133 M 263 133 M 261 133 L 259 133 M 259 133 M 257 133 L 255 133 M 255 133 M 253 133 L 251 133 M 251 133 M 249 133 L 247 133 M 247 133 M 245 133 L 243 133 M 243 133 M 241 133 L 239 133 M 239 133 M 237 133 L 235 133 M 235 133 M 233 133 L 231 133 M 231 133 M 229 133 L 227 133 M 227 133 M 225 133 L 223 133 M 223 133 M 221 133 L 219 133 M 219 133 M 217 133 L 215 133 M 215 133 M 213 133 L 211 133 M 211 133 M 209 133 L 207 133 M 207 133 M 205 133 L 203 133 M 203 133 M 201 133 L 199 133 M 199 133 M 197 133 L 195 133 M 195 133 M 193 133 L 191 133 M 191 133 M 189 133 L 187 133 M 187 133 M 185 133 L 183 133 M 183 133 M 181 133 L 179 133 M 179 133 M 177 133 L 175 133 M 175 133 M 173 133 L 171 133 M 171 133 M 169 133 L 167 133 M 167 133 M 165 133 L 163 133 M 163 133 M 161 133 L 159 133 M 159 133 M 157 133 L 155 133 M 155 133 M 153 133 L 151 133 M 151 133 M 149 133 L 147 133 M 147 133 M 145 133 L 143 133 M 143 133 M 141 133 L 139 133 M 139 133 M 137 133 L 135 133 M 135 133 M 133 133 L 131 133 M 131 133 M 129 133 L 127 133 M 127 133 M 125 133 L 123 133 M 123 133 M 121 133 L 119 133 M 119 133 M 117 133 L 115 133 M 115 133 M 113 133 L 111 133 M 111 133 M 109 133 L 107 133 M 107 133 M 105 133 L 103 133 M 103 133 M 101 133 L 99 133 M 99 133 M 97 133 L 95 133 M 95 133 M 93 133 L 91 133 M 91 133 M 89 133 L 87 133 M 87 133 M 85 133 L 83 133 M 83 133 M 81 133 L 79 133 M 79 133 M 77 133 L 75 133 M 75 133 M 73 133 L 71 133 M 71 133 M 69 133 L 67 133 M 67 133 M 65 133 L 63 133 M 63 133 M 61 133 L 59 133 M 59 133 M 57 133 L 55 133 M 55 133 M 53 133 L 51 133 M 51 133 M 49 133 L 47 133 M 47 133 M 45 133 L 43 133 M 43 133 M 41 133 L 39 133 M 39 133 M 37 133 L 35 133 M 35 133 M 33 133 L 31 133 M 31 133 M 29 133 L 27 133 M 27 133 M 25 133 L 23 133 M 23 133 M 21 133 L 19 133 M 19 133 M 17 133 L 15 133 M 15 133 M 13 133 L 11 133 M 11 133 M 9 133 L 7 133 M 7 133 M 5 133 L 3 133 M 3 133 M 1 133 L 0 133 Q 0 133 0 133 L 0 132 M 0 132 M 0 130 L 0 128 M 0 128 M 0 126 L 0 124 M 0 124 M 0 122 L 0 120 M 0 120 M 0 118 L 0 116 M 0 116 M 0 114 L 0 112 M 0 112 M 0 110 L 0 108 M 0 108 M 0 106 L 0 104 M 0 104 M 0 102 L 0 100 M 0 100 M 0 98 L 0 96 M 0 96 M 0 94 L 0 92 M 0 92 M 0 90 L 0 88 M 0 88 M 0 86 L 0 84 M 0 84 M 0 82 L 0 80 M 0 80 M 0 78 L 0 76 M 0 76 M 0 74 L 0 72 M 0 72 M 0 70 L 0 68 M 0 68 M 0 66 L 0 64 M 0 64 M 0 62 L 0 60 M 0 60 M 0 58 L 0 56 M 0 56 M 0 54 L 0 52 M 0 52 M 0 50 L 0 48 M 0 48 M 0 46 L 0 44 M 0 44 M 0 42 L 0 40 M 0 40 M 0 38 L 0 36 M 0 36 M 0 34 L 0 32 M 0 32 M 0 30 L 0 28 M 0 28 M 0 26 L 0 24 M 0 24 M 0 22 L 0 20 M 0 20 M 0 18 L 0 16 M 0 16 M 0 14 L 0 12 M 0 12 M 0 10 L 0 8 M 0 8 M 0 6 L 0 4 M 0 4 M 0 2 L 0 0 M 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,366,-4.75)"><g transform="translate(0,0)"><g transform="translate(-369,-40) translate(3,44.75) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#d9d9d9" d="M 370.5 38 L 370.5 28.4375 Q 370.5 18.875 370.5 18.875 L 370.5 18.875 Q 370.5 18.875 370.5 9.3125 L 370.5 -0.25" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g><g transform="translate(0,0) matrix(1,0,0,1,384.75,162.5)"><g><g transform="translate(0,0) scale(3.39,1.41)"><g><path fill="#FFFFFF" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(0.2949852507374631,0.7092198581560284)"><path fill="none" stroke="none" d="M 0 0 L 339 0 Q 339 0 339 0 L 339 141 Q 339 141 339 141 L 0 141 Q 0 141 0 141 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" d="M 0 0 M 0 0 L 2 0 M 2 0 M 4 0 L 6 0 M 6 0 M 8 0 L 10 0 M 10 0 M 12 0 L 14 0 M 14 0 M 16 0 L 18 0 M 18 0 M 20 0 L 22 0 M 22 0 M 24 0 L 26 0 M 26 0 M 28 0 L 30 0 M 30 0 M 32 0 L 34 0 M 34 0 M 36 0 L 38 0 M 38 0 M 40 0 L 42 0 M 42 0 M 44 0 L 46 0 M 46 0 M 48 0 L 50 0 M 50 0 M 52 0 L 54 0 M 54 0 M 56 0 L 58 0 M 58 0 M 60 0 L 62 0 M 62 0 M 64 0 L 66 0 M 66 0 M 68 0 L 70 0 M 70 0 M 72 0 L 74 0 M 74 0 M 76 0 L 78 0 M 78 0 M 80 0 L 82 0 M 82 0 M 84 0 L 86 0 M 86 0 M 88 0 L 90 0 M 90 0 M 92 0 L 94 0 M 94 0 M 96 0 L 98 0 M 98 0 M 100 0 L 102 0 M 102 0 M 104 0 L 106 0 M 106 0 M 108 0 L 110 0 M 110 0 M 112 0 L 114 0 M 114 0 M 116 0 L 118 0 M 118 0 M 120 0 L 122 0 M 122 0 M 124 0 L 126 0 M 126 0 M 128 0 L 130 0 M 130 0 M 132 0 L 134 0 M 134 0 M 136 0 L 138 0 M 138 0 M 140 0 L 142 0 M 142 0 M 144 0 L 146 0 M 146 0 M 148 0 L 150 0 M 150 0 M 152 0 L 154 0 M 154 0 M 156 0 L 158 0 M 158 0 M 160 0 L 162 0 M 162 0 M 164 0 L 166 0 M 166 0 M 168 0 L 170 0 M 170 0 M 172 0 L 174 0 M 174 0 M 176 0 L 178 0 M 178 0 M 180 0 L 182 0 M 182 0 M 184 0 L 186 0 M 186 0 M 188 0 L 190 0 M 190 0 M 192 0 L 194 0 M 194 0 M 196 0 L 198 0 M 198 0 M 200 0 L 202 0 M 202 0 M 204 0 L 206 0 M 206 0 M 208 0 L 210 0 M 210 0 M 212 0 L 214 0 M 214 0 M 216 0 L 218 0 M 218 0 M 220 0 L 222 0 M 222 0 M 224 0 L 226 0 M 226 0 M 228 0 L 230 0 M 230 0 M 232 0 L 234 0 M 234 0 M 236 0 L 238 0 M 238 0 M 240 0 L 242 0 M 242 0 M 244 0 L 246 0 M 246 0 M 248 0 L 250 0 M 250 0 M 252 0 L 254 0 M 254 0 M 256 0 L 258 0 M 258 0 M 260 0 L 262 0 M 262 0 M 264 0 L 266 0 M 266 0 M 268 0 L 270 0 M 270 0 M 272 0 L 274 0 M 274 0 M 276 0 L 278 0 M 278 0 M 280 0 L 282 0 M 282 0 M 284 0 L 286 0 M 286 0 M 288 0 L 290 0 M 290 0 M 292 0 L 294 0 M 294 0 M 296 0 L 298 0 M 298 0 M 300 0 L 302 0 M 302 0 M 304 0 L 306 0 M 306 0 M 308 0 L 310 0 M 310 0 M 312 0 L 314 0 M 314 0 M 316 0 L 318 0 M 318 0 M 320 0 L 322 0 M 322 0 M 324 0 L 326 0 M 326 0 M 328 0 L 330 0 M 330 0 M 332 0 L 334 0 M 334 0 M 336 0 L 338 0 M 338 0 M 339 1 L 339 3 M 339 3 M 339 5 L 339 7 M 339 7 M 339 9 L 339 11 M 339 11 M 339 13 L 339 15 M 339 15 M 339 17 L 339 19 M 339 19 M 339 21 L 339 23 M 339 23 M 339 25 L 339 27 M 339 27 M 339 29 L 339 31 M 339 31 M 339 33 L 339 35 M 339 35 M 339 37 L 339 39 M 339 39 M 339 41 L 339 43 M 339 43 M 339 45 L 339 47 M 339 47 M 339 49 L 339 51 M 339 51 M 339 53 L 339 55 M 339 55 M 339 57 L 339 59 M 339 59 M 339 61 L 339 63 M 339 63 M 339 65 L 339 67 M 339 67 M 339 69 L 339 71 M 339 71 M 339 73 L 339 75 M 339 75 M 339 77 L 339 79 M 339 79 M 339 81 L 339 83 M 339 83 M 339 85 L 339 87 M 339 87 M 339 89 L 339 91 M 339 91 M 339 93 L 339 95 M 339 95 M 339 97 L 339 99 M 339 99 M 339 101 L 339 103 M 339 103 M 339 105 L 339 107 M 339 107 M 339 109 L 339 111 M 339 111 M 339 113 L 339 115 M 339 115 M 339 117 L 339 119 M 339 119 M 339 121 L 339 123 M 339 123 M 339 125 L 339 127 M 339 127 M 339 129 L 339 131 M 339 131 M 339 133 L 339 135 M 339 135 M 339 137 L 339 139 M 339 139 M 339 141 L 339 141 Q 339 141 339 141 L 337 141 M 337 141 M 335 141 L 333 141 M 333 141 M 331 141 L 329 141 M 329 141 M 327 141 L 325 141 M 325 141 M 323 141 L 321 141 M 321 141 M 319 141 L 317 141 M 317 141 M 315 141 L 313 141 M 313 141 M 311 141 L 309 141 M 309 141 M 307 141 L 305 141 M 305 141 M 303 141 L 301 141 M 301 141 M 299 141 L 297 141 M 297 141 M 295 141 L 293 141 M 293 141 M 291 141 L 289 141 M 289 141 M 287 141 L 285 141 M 285 141 M 283 141 L 281 141 M 281 141 M 279 141 L 277 141 M 277 141 M 275 141 L 273 141 M 273 141 M 271 141 L 269 141 M 269 141 M 267 141 L 265 141 M 265 141 M 263 141 L 261 141 M 261 141 M 259 141 L 257 141 M 257 141 M 255 141 L 253 141 M 253 141 M 251 141 L 249 141 M 249 141 M 247 141 L 245 141 M 245 141 M 243 141 L 241 141 M 241 141 M 239 141 L 237 141 M 237 141 M 235 141 L 233 141 M 233 141 M 231 141 L 229 141 M 229 141 M 227 141 L 225 141 M 225 141 M 223 141 L 221 141 M 221 141 M 219 141 L 217 141 M 217 141 M 215 141 L 213 141 M 213 141 M 211 141 L 209 141 M 209 141 M 207 141 L 205 141 M 205 141 M 203 141 L 201 141 M 201 141 M 199 141 L 197 141 M 197 141 M 195 141 L 193 141 M 193 141 M 191 141 L 189 141 M 189 141 M 187 141 L 185 141 M 185 141 M 183 141 L 181 141 M 181 141 M 179 141 L 177 141 M 177 141 M 175 141 L 173 141 M 173 141 M 171 141 L 169 141 M 169 141 M 167 141 L 165 141 M 165 141 M 163 141 L 161 141 M 161 141 M 159 141 L 157 141 M 157 141 M 155 141 L 153 141 M 153 141 M 151 141 L 149 141 M 149 141 M 147 141 L 145 141 M 145 141 M 143 141 L 141 141 M 141 141 M 139 141 L 137 141 M 137 141 M 135 141 L 133 141 M 133 141 M 131 141 L 129 141 M 129 141 M 127 141 L 125 141 M 125 141 M 123 141 L 121 141 M 121 141 M 119 141 L 117 141 M 117 141 M 115 141 L 113 141 M 113 141 M 111 141 L 109 141 M 109 141 M 107 141 L 105 141 M 105 141 M 103 141 L 101 141 M 101 141 M 99 141 L 97 141 M 97 141 M 95 141 L 93 141 M 93 141 M 91 141 L 89 141 M 89 141 M 87 141 L 85 141 M 85 141 M 83 141 L 81 141 M 81 141 M 79 141 L 77 141 M 77 141 M 75 141 L 73 141 M 73 141 M 71 141 L 69 141 M 69 141 M 67 141 L 65 141 M 65 141 M 63 141 L 61 141 M 61 141 M 59 141 L 57 141 M 57 141 M 55 141 L 53 141 M 53 141 M 51 141 L 49 141 M 49 141 M 47 141 L 45 141 M 45 141 M 43 141 L 41 141 M 41 141 M 39 141 L 37 141 M 37 141 M 35 141 L 33 141 M 33 141 M 31 141 L 29 141 M 29 141 M 27 141 L 25 141 M 25 141 M 23 141 L 21 141 M 21 141 M 19 141 L 17 141 M 17 141 M 15 141 L 13 141 M 13 141 M 11 141 L 9 141 M 9 141 M 7 141 L 5 141 M 5 141 M 3 141 L 1 141 M 1 141 M 0 140 L 0 138 M 0 138 M 0 136 L 0 134 M 0 134 M 0 132 L 0 130 M 0 130 M 0 128 L 0 126 M 0 126 M 0 124 L 0 122 M 0 122 M 0 120 L 0 118 M 0 118 M 0 116 L 0 114 M 0 114 M 0 112 L 0 110 M 0 110 M 0 108 L 0 106 M 0 106 M 0 104 L 0 102 M 0 102 M 0 100 L 0 98 M 0 98 M 0 96 L 0 94 M 0 94 M 0 92 L 0 90 M 0 90 M 0 88 L 0 86 M 0 86 M 0 84 L 0 82 M 0 82 M 0 80 L 0 78 M 0 78 M 0 76 L 0 74 M 0 74 M 0 72 L 0 70 M 0 70 M 0 68 L 0 66 M 0 66 M 0 64 L 0 62 M 0 62 M 0 60 L 0 58 M 0 58 M 0 56 L 0 54 M 0 54 M 0 52 L 0 50 M 0 50 M 0 48 L 0 46 M 0 46 M 0 44 L 0 42 M 0 42 M 0 40 L 0 38 M 0 38 M 0 36 L 0 34 M 0 34 M 0 32 L 0 30 M 0 30 M 0 28 L 0 26 M 0 26 M 0 24 L 0 22 M 0 22 M 0 20 L 0 18 M 0 18 M 0 16 L 0 14 M 0 14 M 0 12 L 0 10 M 0 10 M 0 8 L 0 6 M 0 6 M 0 4 L 0 2 M 0 2 M 0 0 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="translate(0,0) matrix(1,0,0,1,11.5,162.5)"><g><g transform="translate(0,0) scale(3.4650000000000007,1.41)"><g><path fill="#FFFFFF" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(0.2886002886002885,0.7092198581560284)"><path fill="none" stroke="none" d="M 0 0 L 346.50000000000006 0 Q 346.50000000000006 0 346.50000000000006 0 L 346.50000000000006 141 Q 346.50000000000006 141 346.50000000000006 141 L 0 141 Q 0 141 0 141 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" d="M 0 0 M 0 0 L 2 0 M 2 0 M 4 0 L 6 0 M 6 0 M 8 0 L 10 0 M 10 0 M 12 0 L 14 0 M 14 0 M 16 0 L 18 0 M 18 0 M 20 0 L 22 0 M 22 0 M 24 0 L 26 0 M 26 0 M 28 0 L 30 0 M 30 0 M 32 0 L 34 0 M 34 0 M 36 0 L 38 0 M 38 0 M 40 0 L 42 0 M 42 0 M 44 0 L 46 0 M 46 0 M 48 0 L 50 0 M 50 0 M 52 0 L 54 0 M 54 0 M 56 0 L 58 0 M 58 0 M 60 0 L 62 0 M 62 0 M 64 0 L 66 0 M 66 0 M 68 0 L 70 0 M 70 0 M 72 0 L 74 0 M 74 0 M 76 0 L 78 0 M 78 0 M 80 0 L 82 0 M 82 0 M 84 0 L 86 0 M 86 0 M 88 0 L 90 0 M 90 0 M 92 0 L 94 0 M 94 0 M 96 0 L 98 0 M 98 0 M 100 0 L 102 0 M 102 0 M 104 0 L 106 0 M 106 0 M 108 0 L 110 0 M 110 0 M 112 0 L 114 0 M 114 0 M 116 0 L 118 0 M 118 0 M 120 0 L 122 0 M 122 0 M 124 0 L 126 0 M 126 0 M 128 0 L 130 0 M 130 0 M 132 0 L 134 0 M 134 0 M 136 0 L 138 0 M 138 0 M 140 0 L 142 0 M 142 0 M 144 0 L 146 0 M 146 0 M 148 0 L 150 0 M 150 0 M 152 0 L 154 0 M 154 0 M 156 0 L 158 0 M 158 0 M 160 0 L 162 0 M 162 0 M 164 0 L 166 0 M 166 0 M 168 0 L 170 0 M 170 0 M 172 0 L 174 0 M 174 0 M 176 0 L 178 0 M 178 0 M 180 0 L 182 0 M 182 0 M 184 0 L 186 0 M 186 0 M 188 0 L 190 0 M 190 0 M 192 0 L 194 0 M 194 0 M 196 0 L 198 0 M 198 0 M 200 0 L 202 0 M 202 0 M 204 0 L 206 0 M 206 0 M 208 0 L 210 0 M 210 0 M 212 0 L 214 0 M 214 0 M 216 0 L 218 0 M 218 0 M 220 0 L 222 0 M 222 0 M 224 0 L 226 0 M 226 0 M 228 0 L 230 0 M 230 0 M 232 0 L 234 0 M 234 0 M 236 0 L 238 0 M 238 0 M 240 0 L 242 0 M 242 0 M 244 0 L 246 0 M 246 0 M 248 0 L 250 0 M 250 0 M 252 0 L 254 0 M 254 0 M 256 0 L 258 0 M 258 0 M 260 0 L 262 0 M 262 0 M 264 0 L 266 0 M 266 0 M 268 0 L 270 0 M 270 0 M 272 0 L 274 0 M 274 0 M 276 0 L 278 0 M 278 0 M 280 0 L 282 0 M 282 0 M 284 0 L 286 0 M 286 0 M 288 0 L 290 0 M 290 0 M 292 0 L 294 0 M 294 0 M 296 0 L 298 0 M 298 0 M 300 0 L 302 0 M 302 0 M 304 0 L 306 0 M 306 0 M 308 0 L 310 0 M 310 0 M 312 0 L 314 0 M 314 0 M 316 0 L 318 0 M 318 0 M 320 0 L 322 0 M 322 0 M 324 0 L 326 0 M 326 0 M 328 0 L 330 0 M 330 0 M 332 0 L 334 0 M 334 0 M 336 0 L 338 0 M 338 0 M 340 0 L 342 0 M 342 0 M 344 0 L 346 0 M 346 0 M 346.50000000000006 1.4999999999999432 L 346.50000000000006 3.499999999999943 M 346.50000000000006 3.499999999999943 M 346.50000000000006 5.499999999999943 L 346.50000000000006 7.499999999999943 M 346.50000000000006 7.499999999999943 M 346.50000000000006 9.499999999999943 L 346.50000000000006 11.499999999999943 M 346.50000000000006 11.499999999999943 M 346.50000000000006 13.499999999999943 L 346.50000000000006 15.499999999999943 M 346.50000000000006 15.499999999999943 M 346.50000000000006 17.499999999999943 L 346.50000000000006 19.499999999999943 M 346.50000000000006 19.499999999999943 M 346.50000000000006 21.499999999999943 L 346.50000000000006 23.499999999999943 M 346.50000000000006 23.499999999999943 M 346.50000000000006 25.499999999999943 L 346.50000000000006 27.499999999999943 M 346.50000000000006 27.499999999999943 M 346.50000000000006 29.499999999999943 L 346.50000000000006 31.499999999999943 M 346.50000000000006 31.499999999999943 M 346.50000000000006 33.49999999999994 L 346.50000000000006 35.49999999999994 M 346.50000000000006 35.49999999999994 M 346.50000000000006 37.49999999999994 L 346.50000000000006 39.49999999999994 M 346.50000000000006 39.49999999999994 M 346.50000000000006 41.49999999999994 L 346.50000000000006 43.49999999999994 M 346.50000000000006 43.49999999999994 M 346.50000000000006 45.49999999999994 L 346.50000000000006 47.49999999999994 M 346.50000000000006 47.49999999999994 M 346.50000000000006 49.49999999999994 L 346.50000000000006 51.49999999999994 M 346.50000000000006 51.49999999999994 M 346.50000000000006 53.49999999999994 L 346.50000000000006 55.49999999999994 M 346.50000000000006 55.49999999999994 M 346.50000000000006 57.49999999999994 L 346.50000000000006 59.49999999999994 M 346.50000000000006 59.49999999999994 M 346.50000000000006 61.49999999999994 L 346.50000000000006 63.49999999999994 M 346.50000000000006 63.49999999999994 M 346.50000000000006 65.49999999999994 L 346.50000000000006 67.49999999999994 M 346.50000000000006 67.49999999999994 M 346.50000000000006 69.49999999999994 L 346.50000000000006 71.49999999999994 M 346.50000000000006 71.49999999999994 M 346.50000000000006 73.49999999999994 L 346.50000000000006 75.49999999999994 M 346.50000000000006 75.49999999999994 M 346.50000000000006 77.49999999999994 L 346.50000000000006 79.49999999999994 M 346.50000000000006 79.49999999999994 M 346.50000000000006 81.49999999999994 L 346.50000000000006 83.49999999999994 M 346.50000000000006 83.49999999999994 M 346.50000000000006 85.49999999999994 L 346.50000000000006 87.49999999999994 M 346.50000000000006 87.49999999999994 M 346.50000000000006 89.49999999999994 L 346.50000000000006 91.49999999999994 M 346.50000000000006 91.49999999999994 M 346.50000000000006 93.49999999999994 L 346.50000000000006 95.49999999999994 M 346.50000000000006 95.49999999999994 M 346.50000000000006 97.49999999999994 L 346.50000000000006 99.49999999999994 M 346.50000000000006 99.49999999999994 M 346.50000000000006 101.49999999999994 L 346.50000000000006 103.49999999999994 M 346.50000000000006 103.49999999999994 M 346.50000000000006 105.49999999999994 L 346.50000000000006 107.49999999999994 M 346.50000000000006 107.49999999999994 M 346.50000000000006 109.49999999999994 L 346.50000000000006 111.49999999999994 M 346.50000000000006 111.49999999999994 M 346.50000000000006 113.49999999999994 L 346.50000000000006 115.49999999999994 M 346.50000000000006 115.49999999999994 M 346.50000000000006 117.49999999999994 L 346.50000000000006 119.49999999999994 M 346.50000000000006 119.49999999999994 M 346.50000000000006 121.49999999999994 L 346.50000000000006 123.49999999999994 M 346.50000000000006 123.49999999999994 M 346.50000000000006 125.49999999999994 L 346.50000000000006 127.49999999999994 M 346.50000000000006 127.49999999999994 M 346.50000000000006 129.49999999999994 L 346.50000000000006 131.49999999999994 M 346.50000000000006 131.49999999999994 M 346.50000000000006 133.49999999999994 L 346.50000000000006 135.49999999999994 M 346.50000000000006 135.49999999999994 M 346.50000000000006 137.49999999999994 L 346.50000000000006 139.49999999999994 M 346.50000000000006 139.49999999999994 M 346.0000000000001 141 L 344.0000000000001 141 M 344.0000000000001 141 M 342.0000000000001 141 L 340.0000000000001 141 M 340.0000000000001 141 M 338.0000000000001 141 L 336.0000000000001 141 M 336.0000000000001 141 M 334.0000000000001 141 L 332.0000000000001 141 M 332.0000000000001 141 M 330.0000000000001 141 L 328.0000000000001 141 M 328.0000000000001 141 M 326.0000000000001 141 L 324.0000000000001 141 M 324.0000000000001 141 M 322.0000000000001 141 L 320.0000000000001 141 M 320.0000000000001 141 M 318.0000000000001 141 L 316.0000000000001 141 M 316.0000000000001 141 M 314.0000000000001 141 L 312.0000000000001 141 M 312.0000000000001 141 M 310.0000000000001 141 L 308.0000000000001 141 M 308.0000000000001 141 M 306.0000000000001 141 L 304.0000000000001 141 M 304.0000000000001 141 M 302.0000000000001 141 L 300.0000000000001 141 M 300.0000000000001 141 M 298.0000000000001 141 L 296.0000000000001 141 M 296.0000000000001 141 M 294.0000000000001 141 L 292.0000000000001 141 M 292.0000000000001 141 M 290.0000000000001 141 L 288.0000000000001 141 M 288.0000000000001 141 M 286.0000000000001 141 L 284.0000000000001 141 M 284.0000000000001 141 M 282.0000000000001 141 L 280.0000000000001 141 M 280.0000000000001 141 M 278.0000000000001 141 L 276.0000000000001 141 M 276.0000000000001 141 M 274.0000000000001 141 L 272.0000000000001 141 M 272.0000000000001 141 M 270.0000000000001 141 L 268.0000000000001 141 M 268.0000000000001 141 M 266.0000000000001 141 L 264.0000000000001 141 M 264.0000000000001 141 M 262.0000000000001 141 L 260.0000000000001 141 M 260.0000000000001 141 M 258.0000000000001 141 L 256.0000000000001 141 M 256.0000000000001 141 M 254.0000000000001 141 L 252.0000000000001 141 M 252.0000000000001 141 M 250.0000000000001 141 L 248.0000000000001 141 M 248.0000000000001 141 M 246.0000000000001 141 L 244.0000000000001 141 M 244.0000000000001 141 M 242.0000000000001 141 L 240.0000000000001 141 M 240.0000000000001 141 M 238.0000000000001 141 L 236.0000000000001 141 M 236.0000000000001 141 M 234.0000000000001 141 L 232.0000000000001 141 M 232.0000000000001 141 M 230.0000000000001 141 L 228.0000000000001 141 M 228.0000000000001 141 M 226.0000000000001 141 L 224.0000000000001 141 M 224.0000000000001 141 M 222.0000000000001 141 L 220.0000000000001 141 M 220.0000000000001 141 M 218.0000000000001 141 L 216.0000000000001 141 M 216.0000000000001 141 M 214.0000000000001 141 L 212.0000000000001 141 M 212.0000000000001 141 M 210.0000000000001 141 L 208.0000000000001 141 M 208.0000000000001 141 M 206.0000000000001 141 L 204.0000000000001 141 M 204.0000000000001 141 M 202.0000000000001 141 L 200.0000000000001 141 M 200.0000000000001 141 M 198.0000000000001 141 L 196.0000000000001 141 M 196.0000000000001 141 M 194.0000000000001 141 L 192.0000000000001 141 M 192.0000000000001 141 M 190.0000000000001 141 L 188.0000000000001 141 M 188.0000000000001 141 M 186.0000000000001 141 L 184.0000000000001 141 M 184.0000000000001 141 M 182.0000000000001 141 L 180.0000000000001 141 M 180.0000000000001 141 M 178.0000000000001 141 L 176.0000000000001 141 M 176.0000000000001 141 M 174.0000000000001 141 L 172.0000000000001 141 M 172.0000000000001 141 M 170.0000000000001 141 L 168.0000000000001 141 M 168.0000000000001 141 M 166.0000000000001 141 L 164.0000000000001 141 M 164.0000000000001 141 M 162.0000000000001 141 L 160.0000000000001 141 M 160.0000000000001 141 M 158.0000000000001 141 L 156.0000000000001 141 M 156.0000000000001 141 M 154.0000000000001 141 L 152.0000000000001 141 M 152.0000000000001 141 M 150.0000000000001 141 L 148.0000000000001 141 M 148.0000000000001 141 M 146.0000000000001 141 L 144.0000000000001 141 M 144.0000000000001 141 M 142.0000000000001 141 L 140.0000000000001 141 M 140.0000000000001 141 M 138.0000000000001 141 L 136.0000000000001 141 M 136.0000000000001 141 M 134.0000000000001 141 L 132.0000000000001 141 M 132.0000000000001 141 M 130.0000000000001 141 L 128.0000000000001 141 M 128.0000000000001 141 M 126.00000000000011 141 L 124.00000000000011 141 M 124.00000000000011 141 M 122.00000000000011 141 L 120.00000000000011 141 M 120.00000000000011 141 M 118.00000000000011 141 L 116.00000000000011 141 M 116.00000000000011 141 M 114.00000000000011 141 L 112.00000000000011 141 M 112.00000000000011 141 M 110.00000000000011 141 L 108.00000000000011 141 M 108.00000000000011 141 M 106.00000000000011 141 L 104.00000000000011 141 M 104.00000000000011 141 M 102.00000000000011 141 L 100.00000000000011 141 M 100.00000000000011 141 M 98.00000000000011 141 L 96.00000000000011 141 M 96.00000000000011 141 M 94.00000000000011 141 L 92.00000000000011 141 M 92.00000000000011 141 M 90.00000000000011 141 L 88.00000000000011 141 M 88.00000000000011 141 M 86.00000000000011 141 L 84.00000000000011 141 M 84.00000000000011 141 M 82.00000000000011 141 L 80.00000000000011 141 M 80.00000000000011 141 M 78.00000000000011 141 L 76.00000000000011 141 M 76.00000000000011 141 M 74.00000000000011 141 L 72.00000000000011 141 M 72.00000000000011 141 M 70.00000000000011 141 L 68.00000000000011 141 M 68.00000000000011 141 M 66.00000000000011 141 L 64.00000000000011 141 M 64.00000000000011 141 M 62.000000000000114 141 L 60.000000000000114 141 M 60.000000000000114 141 M 58.000000000000114 141 L 56.000000000000114 141 M 56.000000000000114 141 M 54.000000000000114 141 L 52.000000000000114 141 M 52.000000000000114 141 M 50.000000000000114 141 L 48.000000000000114 141 M 48.000000000000114 141 M 46.000000000000114 141 L 44.000000000000114 141 M 44.000000000000114 141 M 42.000000000000114 141 L 40.000000000000114 141 M 40.000000000000114 141 M 38.000000000000114 141 L 36.000000000000114 141 M 36.000000000000114 141 M 34.000000000000114 141 L 32.000000000000114 141 M 32.000000000000114 141 M 30.000000000000114 141 L 28.000000000000114 141 M 28.000000000000114 141 M 26.000000000000114 141 L 24.000000000000114 141 M 24.000000000000114 141 M 22.000000000000114 141 L 20.000000000000114 141 M 20.000000000000114 141 M 18.000000000000114 141 L 16.000000000000114 141 M 16.000000000000114 141 M 14.000000000000114 141 L 12.000000000000114 141 M 12.000000000000114 141 M 10.000000000000114 141 L 8.000000000000114 141 M 8.000000000000114 141 M 6.000000000000114 141 L 4.000000000000114 141 M 4.000000000000114 141 M 2.0000000000001137 141 L 1.1368683772161603e-13 141 M 1.1368683772161603e-13 141 M 0 139.0000000000001 L 0 137.0000000000001 M 0 137.0000000000001 M 0 135.0000000000001 L 0 133.0000000000001 M 0 133.0000000000001 M 0 131.0000000000001 L 0 129.0000000000001 M 0 129.0000000000001 M 0 127.00000000000011 L 0 125.00000000000011 M 0 125.00000000000011 M 0 123.00000000000011 L 0 121.00000000000011 M 0 121.00000000000011 M 0 119.00000000000011 L 0 117.00000000000011 M 0 117.00000000000011 M 0 115.00000000000011 L 0 113.00000000000011 M 0 113.00000000000011 M 0 111.00000000000011 L 0 109.00000000000011 M 0 109.00000000000011 M 0 107.00000000000011 L 0 105.00000000000011 M 0 105.00000000000011 M 0 103.00000000000011 L 0 101.00000000000011 M 0 101.00000000000011 M 0 99.00000000000011 L 0 97.00000000000011 M 0 97.00000000000011 M 0 95.00000000000011 L 0 93.00000000000011 M 0 93.00000000000011 M 0 91.00000000000011 L 0 89.00000000000011 M 0 89.00000000000011 M 0 87.00000000000011 L 0 85.00000000000011 M 0 85.00000000000011 M 0 83.00000000000011 L 0 81.00000000000011 M 0 81.00000000000011 M 0 79.00000000000011 L 0 77.00000000000011 M 0 77.00000000000011 M 0 75.00000000000011 L 0 73.00000000000011 M 0 73.00000000000011 M 0 71.00000000000011 L 0 69.00000000000011 M 0 69.00000000000011 M 0 67.00000000000011 L 0 65.00000000000011 M 0 65.00000000000011 M 0 63.000000000000114 L 0 61.000000000000114 M 0 61.000000000000114 M 0 59.000000000000114 L 0 57.000000000000114 M 0 57.000000000000114 M 0 55.000000000000114 L 0 53.000000000000114 M 0 53.000000000000114 M 0 51.000000000000114 L 0 49.000000000000114 M 0 49.000000000000114 M 0 47.000000000000114 L 0 45.000000000000114 M 0 45.000000000000114 M 0 43.000000000000114 L 0 41.000000000000114 M 0 41.000000000000114 M 0 39.000000000000114 L 0 37.000000000000114 M 0 37.000000000000114 M 0 35.000000000000114 L 0 33.000000000000114 M 0 33.000000000000114 M 0 31.000000000000114 L 0 29.000000000000114 M 0 29.000000000000114 M 0 27.000000000000114 L 0 25.000000000000114 M 0 25.000000000000114 M 0 23.000000000000114 L 0 21.000000000000114 M 0 21.000000000000114 M 0 19.000000000000114 L 0 17.000000000000114 M 0 17.000000000000114 M 0 15.000000000000114 L 0 13.000000000000114 M 0 13.000000000000114 M 0 11.000000000000114 L 0 9.000000000000114 M 0 9.000000000000114 M 0 7.000000000000114 L 0 5.000000000000114 M 0 5.000000000000114 M 0 3.0000000000001137 L 0 1.0000000000001137 M 0 1.0000000000001137 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="translate(0,0) matrix(1,0,0,1,384.75,323.5)"><g><g transform="translate(0,0) scale(3.3975,1.63)"><g><path fill="#FFFFFF" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(0.29433406916850624,0.6134969325153374)"><path fill="none" stroke="none" d="M 0 0 L 339.75 0 Q 339.75 0 339.75 0 L 339.75 163 Q 339.75 163 339.75 163 L 0 163 Q 0 163 0 163 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" d="M 0 0 M 0 0 L 2 0 M 2 0 M 4 0 L 6 0 M 6 0 M 8 0 L 10 0 M 10 0 M 12 0 L 14 0 M 14 0 M 16 0 L 18 0 M 18 0 M 20 0 L 22 0 M 22 0 M 24 0 L 26 0 M 26 0 M 28 0 L 30 0 M 30 0 M 32 0 L 34 0 M 34 0 M 36 0 L 38 0 M 38 0 M 40 0 L 42 0 M 42 0 M 44 0 L 46 0 M 46 0 M 48 0 L 50 0 M 50 0 M 52 0 L 54 0 M 54 0 M 56 0 L 58 0 M 58 0 M 60 0 L 62 0 M 62 0 M 64 0 L 66 0 M 66 0 M 68 0 L 70 0 M 70 0 M 72 0 L 74 0 M 74 0 M 76 0 L 78 0 M 78 0 M 80 0 L 82 0 M 82 0 M 84 0 L 86 0 M 86 0 M 88 0 L 90 0 M 90 0 M 92 0 L 94 0 M 94 0 M 96 0 L 98 0 M 98 0 M 100 0 L 102 0 M 102 0 M 104 0 L 106 0 M 106 0 M 108 0 L 110 0 M 110 0 M 112 0 L 114 0 M 114 0 M 116 0 L 118 0 M 118 0 M 120 0 L 122 0 M 122 0 M 124 0 L 126 0 M 126 0 M 128 0 L 130 0 M 130 0 M 132 0 L 134 0 M 134 0 M 136 0 L 138 0 M 138 0 M 140 0 L 142 0 M 142 0 M 144 0 L 146 0 M 146 0 M 148 0 L 150 0 M 150 0 M 152 0 L 154 0 M 154 0 M 156 0 L 158 0 M 158 0 M 160 0 L 162 0 M 162 0 M 164 0 L 166 0 M 166 0 M 168 0 L 170 0 M 170 0 M 172 0 L 174 0 M 174 0 M 176 0 L 178 0 M 178 0 M 180 0 L 182 0 M 182 0 M 184 0 L 186 0 M 186 0 M 188 0 L 190 0 M 190 0 M 192 0 L 194 0 M 194 0 M 196 0 L 198 0 M 198 0 M 200 0 L 202 0 M 202 0 M 204 0 L 206 0 M 206 0 M 208 0 L 210 0 M 210 0 M 212 0 L 214 0 M 214 0 M 216 0 L 218 0 M 218 0 M 220 0 L 222 0 M 222 0 M 224 0 L 226 0 M 226 0 M 228 0 L 230 0 M 230 0 M 232 0 L 234 0 M 234 0 M 236 0 L 238 0 M 238 0 M 240 0 L 242 0 M 242 0 M 244 0 L 246 0 M 246 0 M 248 0 L 250 0 M 250 0 M 252 0 L 254 0 M 254 0 M 256 0 L 258 0 M 258 0 M 260 0 L 262 0 M 262 0 M 264 0 L 266 0 M 266 0 M 268 0 L 270 0 M 270 0 M 272 0 L 274 0 M 274 0 M 276 0 L 278 0 M 278 0 M 280 0 L 282 0 M 282 0 M 284 0 L 286 0 M 286 0 M 288 0 L 290 0 M 290 0 M 292 0 L 294 0 M 294 0 M 296 0 L 298 0 M 298 0 M 300 0 L 302 0 M 302 0 M 304 0 L 306 0 M 306 0 M 308 0 L 310 0 M 310 0 M 312 0 L 314 0 M 314 0 M 316 0 L 318 0 M 318 0 M 320 0 L 322 0 M 322 0 M 324 0 L 326 0 M 326 0 M 328 0 L 330 0 M 330 0 M 332 0 L 334 0 M 334 0 M 336 0 L 338 0 M 338 0 M 339.75 0.25 L 339.75 2.25 M 339.75 2.25 M 339.75 4.25 L 339.75 6.25 M 339.75 6.25 M 339.75 8.25 L 339.75 10.25 M 339.75 10.25 M 339.75 12.25 L 339.75 14.25 M 339.75 14.25 M 339.75 16.25 L 339.75 18.25 M 339.75 18.25 M 339.75 20.25 L 339.75 22.25 M 339.75 22.25 M 339.75 24.25 L 339.75 26.25 M 339.75 26.25 M 339.75 28.25 L 339.75 30.25 M 339.75 30.25 M 339.75 32.25 L 339.75 34.25 M 339.75 34.25 M 339.75 36.25 L 339.75 38.25 M 339.75 38.25 M 339.75 40.25 L 339.75 42.25 M 339.75 42.25 M 339.75 44.25 L 339.75 46.25 M 339.75 46.25 M 339.75 48.25 L 339.75 50.25 M 339.75 50.25 M 339.75 52.25 L 339.75 54.25 M 339.75 54.25 M 339.75 56.25 L 339.75 58.25 M 339.75 58.25 M 339.75 60.25 L 339.75 62.25 M 339.75 62.25 M 339.75 64.25 L 339.75 66.25 M 339.75 66.25 M 339.75 68.25 L 339.75 70.25 M 339.75 70.25 M 339.75 72.25 L 339.75 74.25 M 339.75 74.25 M 339.75 76.25 L 339.75 78.25 M 339.75 78.25 M 339.75 80.25 L 339.75 82.25 M 339.75 82.25 M 339.75 84.25 L 339.75 86.25 M 339.75 86.25 M 339.75 88.25 L 339.75 90.25 M 339.75 90.25 M 339.75 92.25 L 339.75 94.25 M 339.75 94.25 M 339.75 96.25 L 339.75 98.25 M 339.75 98.25 M 339.75 100.25 L 339.75 102.25 M 339.75 102.25 M 339.75 104.25 L 339.75 106.25 M 339.75 106.25 M 339.75 108.25 L 339.75 110.25 M 339.75 110.25 M 339.75 112.25 L 339.75 114.25 M 339.75 114.25 M 339.75 116.25 L 339.75 118.25 M 339.75 118.25 M 339.75 120.25 L 339.75 122.25 M 339.75 122.25 M 339.75 124.25 L 339.75 126.25 M 339.75 126.25 M 339.75 128.25 L 339.75 130.25 M 339.75 130.25 M 339.75 132.25 L 339.75 134.25 M 339.75 134.25 M 339.75 136.25 L 339.75 138.25 M 339.75 138.25 M 339.75 140.25 L 339.75 142.25 M 339.75 142.25 M 339.75 144.25 L 339.75 146.25 M 339.75 146.25 M 339.75 148.25 L 339.75 150.25 M 339.75 150.25 M 339.75 152.25 L 339.75 154.25 M 339.75 154.25 M 339.75 156.25 L 339.75 158.25 M 339.75 158.25 M 339.75 160.25 L 339.75 162.25 M 339.75 162.25 M 338.5 163 L 336.5 163 M 336.5 163 M 334.5 163 L 332.5 163 M 332.5 163 M 330.5 163 L 328.5 163 M 328.5 163 M 326.5 163 L 324.5 163 M 324.5 163 M 322.5 163 L 320.5 163 M 320.5 163 M 318.5 163 L 316.5 163 M 316.5 163 M 314.5 163 L 312.5 163 M 312.5 163 M 310.5 163 L 308.5 163 M 308.5 163 M 306.5 163 L 304.5 163 M 304.5 163 M 302.5 163 L 300.5 163 M 300.5 163 M 298.5 163 L 296.5 163 M 296.5 163 M 294.5 163 L 292.5 163 M 292.5 163 M 290.5 163 L 288.5 163 M 288.5 163 M 286.5 163 L 284.5 163 M 284.5 163 M 282.5 163 L 280.5 163 M 280.5 163 M 278.5 163 L 276.5 163 M 276.5 163 M 274.5 163 L 272.5 163 M 272.5 163 M 270.5 163 L 268.5 163 M 268.5 163 M 266.5 163 L 264.5 163 M 264.5 163 M 262.5 163 L 260.5 163 M 260.5 163 M 258.5 163 L 256.5 163 M 256.5 163 M 254.5 163 L 252.5 163 M 252.5 163 M 250.5 163 L 248.5 163 M 248.5 163 M 246.5 163 L 244.5 163 M 244.5 163 M 242.5 163 L 240.5 163 M 240.5 163 M 238.5 163 L 236.5 163 M 236.5 163 M 234.5 163 L 232.5 163 M 232.5 163 M 230.5 163 L 228.5 163 M 228.5 163 M 226.5 163 L 224.5 163 M 224.5 163 M 222.5 163 L 220.5 163 M 220.5 163 M 218.5 163 L 216.5 163 M 216.5 163 M 214.5 163 L 212.5 163 M 212.5 163 M 210.5 163 L 208.5 163 M 208.5 163 M 206.5 163 L 204.5 163 M 204.5 163 M 202.5 163 L 200.5 163 M 200.5 163 M 198.5 163 L 196.5 163 M 196.5 163 M 194.5 163 L 192.5 163 M 192.5 163 M 190.5 163 L 188.5 163 M 188.5 163 M 186.5 163 L 184.5 163 M 184.5 163 M 182.5 163 L 180.5 163 M 180.5 163 M 178.5 163 L 176.5 163 M 176.5 163 M 174.5 163 L 172.5 163 M 172.5 163 M 170.5 163 L 168.5 163 M 168.5 163 M 166.5 163 L 164.5 163 M 164.5 163 M 162.5 163 L 160.5 163 M 160.5 163 M 158.5 163 L 156.5 163 M 156.5 163 M 154.5 163 L 152.5 163 M 152.5 163 M 150.5 163 L 148.5 163 M 148.5 163 M 146.5 163 L 144.5 163 M 144.5 163 M 142.5 163 L 140.5 163 M 140.5 163 M 138.5 163 L 136.5 163 M 136.5 163 M 134.5 163 L 132.5 163 M 132.5 163 M 130.5 163 L 128.5 163 M 128.5 163 M 126.5 163 L 124.5 163 M 124.5 163 M 122.5 163 L 120.5 163 M 120.5 163 M 118.5 163 L 116.5 163 M 116.5 163 M 114.5 163 L 112.5 163 M 112.5 163 M 110.5 163 L 108.5 163 M 108.5 163 M 106.5 163 L 104.5 163 M 104.5 163 M 102.5 163 L 100.5 163 M 100.5 163 M 98.5 163 L 96.5 163 M 96.5 163 M 94.5 163 L 92.5 163 M 92.5 163 M 90.5 163 L 88.5 163 M 88.5 163 M 86.5 163 L 84.5 163 M 84.5 163 M 82.5 163 L 80.5 163 M 80.5 163 M 78.5 163 L 76.5 163 M 76.5 163 M 74.5 163 L 72.5 163 M 72.5 163 M 70.5 163 L 68.5 163 M 68.5 163 M 66.5 163 L 64.5 163 M 64.5 163 M 62.5 163 L 60.5 163 M 60.5 163 M 58.5 163 L 56.5 163 M 56.5 163 M 54.5 163 L 52.5 163 M 52.5 163 M 50.5 163 L 48.5 163 M 48.5 163 M 46.5 163 L 44.5 163 M 44.5 163 M 42.5 163 L 40.5 163 M 40.5 163 M 38.5 163 L 36.5 163 M 36.5 163 M 34.5 163 L 32.5 163 M 32.5 163 M 30.5 163 L 28.5 163 M 28.5 163 M 26.5 163 L 24.5 163 M 24.5 163 M 22.5 163 L 20.5 163 M 20.5 163 M 18.5 163 L 16.5 163 M 16.5 163 M 14.5 163 L 12.5 163 M 12.5 163 M 10.5 163 L 8.5 163 M 8.5 163 M 6.5 163 L 4.5 163 M 4.5 163 M 2.5 163 L 0.5 163 M 0.5 163 M 0 161.5 L 0 159.5 M 0 159.5 M 0 157.5 L 0 155.5 M 0 155.5 M 0 153.5 L 0 151.5 M 0 151.5 M 0 149.5 L 0 147.5 M 0 147.5 M 0 145.5 L 0 143.5 M 0 143.5 M 0 141.5 L 0 139.5 M 0 139.5 M 0 137.5 L 0 135.5 M 0 135.5 M 0 133.5 L 0 131.5 M 0 131.5 M 0 129.5 L 0 127.5 M 0 127.5 M 0 125.5 L 0 123.5 M 0 123.5 M 0 121.5 L 0 119.5 M 0 119.5 M 0 117.5 L 0 115.5 M 0 115.5 M 0 113.5 L 0 111.5 M 0 111.5 M 0 109.5 L 0 107.5 M 0 107.5 M 0 105.5 L 0 103.5 M 0 103.5 M 0 101.5 L 0 99.5 M 0 99.5 M 0 97.5 L 0 95.5 M 0 95.5 M 0 93.5 L 0 91.5 M 0 91.5 M 0 89.5 L 0 87.5 M 0 87.5 M 0 85.5 L 0 83.5 M 0 83.5 M 0 81.5 L 0 79.5 M 0 79.5 M 0 77.5 L 0 75.5 M 0 75.5 M 0 73.5 L 0 71.5 M 0 71.5 M 0 69.5 L 0 67.5 M 0 67.5 M 0 65.5 L 0 63.5 M 0 63.5 M 0 61.5 L 0 59.5 M 0 59.5 M 0 57.5 L 0 55.5 M 0 55.5 M 0 53.5 L 0 51.5 M 0 51.5 M 0 49.5 L 0 47.5 M 0 47.5 M 0 45.5 L 0 43.5 M 0 43.5 M 0 41.5 L 0 39.5 M 0 39.5 M 0 37.5 L 0 35.5 M 0 35.5 M 0 33.5 L 0 31.5 M 0 31.5 M 0 29.5 L 0 27.5 M 0 27.5 M 0 25.5 L 0 23.5 M 0 23.5 M 0 21.5 L 0 19.5 M 0 19.5 M 0 17.5 L 0 15.5 M 0 15.5 M 0 13.5 L 0 11.5 M 0 11.5 M 0 9.5 L 0 7.5 M 0 7.5 M 0 5.5 L 0 3.5 M 0 3.5 M 0 1.5 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="translate(0,0) matrix(1,0,0,1,11.5,323.5)"><g><g transform="translate(0,0) scale(3.4649999999999994,1.63)"><g><path fill="#FFFFFF" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(0.28860028860028863,0.6134969325153374)"><path fill="none" stroke="none" d="M 0 0 L 346.49999999999994 0 Q 346.49999999999994 0 346.49999999999994 0 L 346.49999999999994 163 Q 346.49999999999994 163 346.49999999999994 163 L 0 163 Q 0 163 0 163 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" d="M 0 0 M 0 0 L 2 0 M 2 0 M 4 0 L 6 0 M 6 0 M 8 0 L 10 0 M 10 0 M 12 0 L 14 0 M 14 0 M 16 0 L 18 0 M 18 0 M 20 0 L 22 0 M 22 0 M 24 0 L 26 0 M 26 0 M 28 0 L 30 0 M 30 0 M 32 0 L 34 0 M 34 0 M 36 0 L 38 0 M 38 0 M 40 0 L 42 0 M 42 0 M 44 0 L 46 0 M 46 0 M 48 0 L 50 0 M 50 0 M 52 0 L 54 0 M 54 0 M 56 0 L 58 0 M 58 0 M 60 0 L 62 0 M 62 0 M 64 0 L 66 0 M 66 0 M 68 0 L 70 0 M 70 0 M 72 0 L 74 0 M 74 0 M 76 0 L 78 0 M 78 0 M 80 0 L 82 0 M 82 0 M 84 0 L 86 0 M 86 0 M 88 0 L 90 0 M 90 0 M 92 0 L 94 0 M 94 0 M 96 0 L 98 0 M 98 0 M 100 0 L 102 0 M 102 0 M 104 0 L 106 0 M 106 0 M 108 0 L 110 0 M 110 0 M 112 0 L 114 0 M 114 0 M 116 0 L 118 0 M 118 0 M 120 0 L 122 0 M 122 0 M 124 0 L 126 0 M 126 0 M 128 0 L 130 0 M 130 0 M 132 0 L 134 0 M 134 0 M 136 0 L 138 0 M 138 0 M 140 0 L 142 0 M 142 0 M 144 0 L 146 0 M 146 0 M 148 0 L 150 0 M 150 0 M 152 0 L 154 0 M 154 0 M 156 0 L 158 0 M 158 0 M 160 0 L 162 0 M 162 0 M 164 0 L 166 0 M 166 0 M 168 0 L 170 0 M 170 0 M 172 0 L 174 0 M 174 0 M 176 0 L 178 0 M 178 0 M 180 0 L 182 0 M 182 0 M 184 0 L 186 0 M 186 0 M 188 0 L 190 0 M 190 0 M 192 0 L 194 0 M 194 0 M 196 0 L 198 0 M 198 0 M 200 0 L 202 0 M 202 0 M 204 0 L 206 0 M 206 0 M 208 0 L 210 0 M 210 0 M 212 0 L 214 0 M 214 0 M 216 0 L 218 0 M 218 0 M 220 0 L 222 0 M 222 0 M 224 0 L 226 0 M 226 0 M 228 0 L 230 0 M 230 0 M 232 0 L 234 0 M 234 0 M 236 0 L 238 0 M 238 0 M 240 0 L 242 0 M 242 0 M 244 0 L 246 0 M 246 0 M 248 0 L 250 0 M 250 0 M 252 0 L 254 0 M 254 0 M 256 0 L 258 0 M 258 0 M 260 0 L 262 0 M 262 0 M 264 0 L 266 0 M 266 0 M 268 0 L 270 0 M 270 0 M 272 0 L 274 0 M 274 0 M 276 0 L 278 0 M 278 0 M 280 0 L 282 0 M 282 0 M 284 0 L 286 0 M 286 0 M 288 0 L 290 0 M 290 0 M 292 0 L 294 0 M 294 0 M 296 0 L 298 0 M 298 0 M 300 0 L 302 0 M 302 0 M 304 0 L 306 0 M 306 0 M 308 0 L 310 0 M 310 0 M 312 0 L 314 0 M 314 0 M 316 0 L 318 0 M 318 0 M 320 0 L 322 0 M 322 0 M 324 0 L 326 0 M 326 0 M 328 0 L 330 0 M 330 0 M 332 0 L 334 0 M 334 0 M 336 0 L 338 0 M 338 0 M 340 0 L 342 0 M 342 0 M 344 0 L 346 0 M 346 0 M 346.49999999999994 1.5000000000000568 L 346.49999999999994 3.500000000000057 M 346.49999999999994 3.500000000000057 M 346.49999999999994 5.500000000000057 L 346.49999999999994 7.500000000000057 M 346.49999999999994 7.500000000000057 M 346.49999999999994 9.500000000000057 L 346.49999999999994 11.500000000000057 M 346.49999999999994 11.500000000000057 M 346.49999999999994 13.500000000000057 L 346.49999999999994 15.500000000000057 M 346.49999999999994 15.500000000000057 M 346.49999999999994 17.500000000000057 L 346.49999999999994 19.500000000000057 M 346.49999999999994 19.500000000000057 M 346.49999999999994 21.500000000000057 L 346.49999999999994 23.500000000000057 M 346.49999999999994 23.500000000000057 M 346.49999999999994 25.500000000000057 L 346.49999999999994 27.500000000000057 M 346.49999999999994 27.500000000000057 M 346.49999999999994 29.500000000000057 L 346.49999999999994 31.500000000000057 M 346.49999999999994 31.500000000000057 M 346.49999999999994 33.50000000000006 L 346.49999999999994 35.50000000000006 M 346.49999999999994 35.50000000000006 M 346.49999999999994 37.50000000000006 L 346.49999999999994 39.50000000000006 M 346.49999999999994 39.50000000000006 M 346.49999999999994 41.50000000000006 L 346.49999999999994 43.50000000000006 M 346.49999999999994 43.50000000000006 M 346.49999999999994 45.50000000000006 L 346.49999999999994 47.50000000000006 M 346.49999999999994 47.50000000000006 M 346.49999999999994 49.50000000000006 L 346.49999999999994 51.50000000000006 M 346.49999999999994 51.50000000000006 M 346.49999999999994 53.50000000000006 L 346.49999999999994 55.50000000000006 M 346.49999999999994 55.50000000000006 M 346.49999999999994 57.50000000000006 L 346.49999999999994 59.50000000000006 M 346.49999999999994 59.50000000000006 M 346.49999999999994 61.50000000000006 L 346.49999999999994 63.50000000000006 M 346.49999999999994 63.50000000000006 M 346.49999999999994 65.50000000000006 L 346.49999999999994 67.50000000000006 M 346.49999999999994 67.50000000000006 M 346.49999999999994 69.50000000000006 L 346.49999999999994 71.50000000000006 M 346.49999999999994 71.50000000000006 M 346.49999999999994 73.50000000000006 L 346.49999999999994 75.50000000000006 M 346.49999999999994 75.50000000000006 M 346.49999999999994 77.50000000000006 L 346.49999999999994 79.50000000000006 M 346.49999999999994 79.50000000000006 M 346.49999999999994 81.50000000000006 L 346.49999999999994 83.50000000000006 M 346.49999999999994 83.50000000000006 M 346.49999999999994 85.50000000000006 L 346.49999999999994 87.50000000000006 M 346.49999999999994 87.50000000000006 M 346.49999999999994 89.50000000000006 L 346.49999999999994 91.50000000000006 M 346.49999999999994 91.50000000000006 M 346.49999999999994 93.50000000000006 L 346.49999999999994 95.50000000000006 M 346.49999999999994 95.50000000000006 M 346.49999999999994 97.50000000000006 L 346.49999999999994 99.50000000000006 M 346.49999999999994 99.50000000000006 M 346.49999999999994 101.50000000000006 L 346.49999999999994 103.50000000000006 M 346.49999999999994 103.50000000000006 M 346.49999999999994 105.50000000000006 L 346.49999999999994 107.50000000000006 M 346.49999999999994 107.50000000000006 M 346.49999999999994 109.50000000000006 L 346.49999999999994 111.50000000000006 M 346.49999999999994 111.50000000000006 M 346.49999999999994 113.50000000000006 L 346.49999999999994 115.50000000000006 M 346.49999999999994 115.50000000000006 M 346.49999999999994 117.50000000000006 L 346.49999999999994 119.50000000000006 M 346.49999999999994 119.50000000000006 M 346.49999999999994 121.50000000000006 L 346.49999999999994 123.50000000000006 M 346.49999999999994 123.50000000000006 M 346.49999999999994 125.50000000000006 L 346.49999999999994 127.50000000000006 M 346.49999999999994 127.50000000000006 M 346.49999999999994 129.50000000000006 L 346.49999999999994 131.50000000000006 M 346.49999999999994 131.50000000000006 M 346.49999999999994 133.50000000000006 L 346.49999999999994 135.50000000000006 M 346.49999999999994 135.50000000000006 M 346.49999999999994 137.50000000000006 L 346.49999999999994 139.50000000000006 M 346.49999999999994 139.50000000000006 M 346.49999999999994 141.50000000000006 L 346.49999999999994 143.50000000000006 M 346.49999999999994 143.50000000000006 M 346.49999999999994 145.50000000000006 L 346.49999999999994 147.50000000000006 M 346.49999999999994 147.50000000000006 M 346.49999999999994 149.50000000000006 L 346.49999999999994 151.50000000000006 M 346.49999999999994 151.50000000000006 M 346.49999999999994 153.50000000000006 L 346.49999999999994 155.50000000000006 M 346.49999999999994 155.50000000000006 M 346.49999999999994 157.50000000000006 L 346.49999999999994 159.50000000000006 M 346.49999999999994 159.50000000000006 M 346.49999999999994 161.50000000000006 L 346.49999999999994 163 Q 346.49999999999994 163 346.49999999999994 163 L 345.9999999999999 163 M 345.9999999999999 163 M 343.9999999999999 163 L 341.9999999999999 163 M 341.9999999999999 163 M 339.9999999999999 163 L 337.9999999999999 163 M 337.9999999999999 163 M 335.9999999999999 163 L 333.9999999999999 163 M 333.9999999999999 163 M 331.9999999999999 163 L 329.9999999999999 163 M 329.9999999999999 163 M 327.9999999999999 163 L 325.9999999999999 163 M 325.9999999999999 163 M 323.9999999999999 163 L 321.9999999999999 163 M 321.9999999999999 163 M 319.9999999999999 163 L 317.9999999999999 163 M 317.9999999999999 163 M 315.9999999999999 163 L 313.9999999999999 163 M 313.9999999999999 163 M 311.9999999999999 163 L 309.9999999999999 163 M 309.9999999999999 163 M 307.9999999999999 163 L 305.9999999999999 163 M 305.9999999999999 163 M 303.9999999999999 163 L 301.9999999999999 163 M 301.9999999999999 163 M 299.9999999999999 163 L 297.9999999999999 163 M 297.9999999999999 163 M 295.9999999999999 163 L 293.9999999999999 163 M 293.9999999999999 163 M 291.9999999999999 163 L 289.9999999999999 163 M 289.9999999999999 163 M 287.9999999999999 163 L 285.9999999999999 163 M 285.9999999999999 163 M 283.9999999999999 163 L 281.9999999999999 163 M 281.9999999999999 163 M 279.9999999999999 163 L 277.9999999999999 163 M 277.9999999999999 163 M 275.9999999999999 163 L 273.9999999999999 163 M 273.9999999999999 163 M 271.9999999999999 163 L 269.9999999999999 163 M 269.9999999999999 163 M 267.9999999999999 163 L 265.9999999999999 163 M 265.9999999999999 163 M 263.9999999999999 163 L 261.9999999999999 163 M 261.9999999999999 163 M 259.9999999999999 163 L 257.9999999999999 163 M 257.9999999999999 163 M 255.9999999999999 163 L 253.9999999999999 163 M 253.9999999999999 163 M 251.9999999999999 163 L 249.9999999999999 163 M 249.9999999999999 163 M 247.9999999999999 163 L 245.9999999999999 163 M 245.9999999999999 163 M 243.9999999999999 163 L 241.9999999999999 163 M 241.9999999999999 163 M 239.9999999999999 163 L 237.9999999999999 163 M 237.9999999999999 163 M 235.9999999999999 163 L 233.9999999999999 163 M 233.9999999999999 163 M 231.9999999999999 163 L 229.9999999999999 163 M 229.9999999999999 163 M 227.9999999999999 163 L 225.9999999999999 163 M 225.9999999999999 163 M 223.9999999999999 163 L 221.9999999999999 163 M 221.9999999999999 163 M 219.9999999999999 163 L 217.9999999999999 163 M 217.9999999999999 163 M 215.9999999999999 163 L 213.9999999999999 163 M 213.9999999999999 163 M 211.9999999999999 163 L 209.9999999999999 163 M 209.9999999999999 163 M 207.9999999999999 163 L 205.9999999999999 163 M 205.9999999999999 163 M 203.9999999999999 163 L 201.9999999999999 163 M 201.9999999999999 163 M 199.9999999999999 163 L 197.9999999999999 163 M 197.9999999999999 163 M 195.9999999999999 163 L 193.9999999999999 163 M 193.9999999999999 163 M 191.9999999999999 163 L 189.9999999999999 163 M 189.9999999999999 163 M 187.9999999999999 163 L 185.9999999999999 163 M 185.9999999999999 163 M 183.9999999999999 163 L 181.9999999999999 163 M 181.9999999999999 163 M 179.9999999999999 163 L 177.9999999999999 163 M 177.9999999999999 163 M 175.9999999999999 163 L 173.9999999999999 163 M 173.9999999999999 163 M 171.9999999999999 163 L 169.9999999999999 163 M 169.9999999999999 163 M 167.9999999999999 163 L 165.9999999999999 163 M 165.9999999999999 163 M 163.9999999999999 163 L 161.9999999999999 163 M 161.9999999999999 163 M 159.9999999999999 163 L 157.9999999999999 163 M 157.9999999999999 163 M 155.9999999999999 163 L 153.9999999999999 163 M 153.9999999999999 163 M 151.9999999999999 163 L 149.9999999999999 163 M 149.9999999999999 163 M 147.9999999999999 163 L 145.9999999999999 163 M 145.9999999999999 163 M 143.9999999999999 163 L 141.9999999999999 163 M 141.9999999999999 163 M 139.9999999999999 163 L 137.9999999999999 163 M 137.9999999999999 163 M 135.9999999999999 163 L 133.9999999999999 163 M 133.9999999999999 163 M 131.9999999999999 163 L 129.9999999999999 163 M 129.9999999999999 163 M 127.99999999999989 163 L 125.99999999999989 163 M 125.99999999999989 163 M 123.99999999999989 163 L 121.99999999999989 163 M 121.99999999999989 163 M 119.99999999999989 163 L 117.99999999999989 163 M 117.99999999999989 163 M 115.99999999999989 163 L 113.99999999999989 163 M 113.99999999999989 163 M 111.99999999999989 163 L 109.99999999999989 163 M 109.99999999999989 163 M 107.99999999999989 163 L 105.99999999999989 163 M 105.99999999999989 163 M 103.99999999999989 163 L 101.99999999999989 163 M 101.99999999999989 163 M 99.99999999999989 163 L 97.99999999999989 163 M 97.99999999999989 163 M 95.99999999999989 163 L 93.99999999999989 163 M 93.99999999999989 163 M 91.99999999999989 163 L 89.99999999999989 163 M 89.99999999999989 163 M 87.99999999999989 163 L 85.99999999999989 163 M 85.99999999999989 163 M 83.99999999999989 163 L 81.99999999999989 163 M 81.99999999999989 163 M 79.99999999999989 163 L 77.99999999999989 163 M 77.99999999999989 163 M 75.99999999999989 163 L 73.99999999999989 163 M 73.99999999999989 163 M 71.99999999999989 163 L 69.99999999999989 163 M 69.99999999999989 163 M 67.99999999999989 163 L 65.99999999999989 163 M 65.99999999999989 163 M 63.999999999999886 163 L 61.999999999999886 163 M 61.999999999999886 163 M 59.999999999999886 163 L 57.999999999999886 163 M 57.999999999999886 163 M 55.999999999999886 163 L 53.999999999999886 163 M 53.999999999999886 163 M 51.999999999999886 163 L 49.999999999999886 163 M 49.999999999999886 163 M 47.999999999999886 163 L 45.999999999999886 163 M 45.999999999999886 163 M 43.999999999999886 163 L 41.999999999999886 163 M 41.999999999999886 163 M 39.999999999999886 163 L 37.999999999999886 163 M 37.999999999999886 163 M 35.999999999999886 163 L 33.999999999999886 163 M 33.999999999999886 163 M 31.999999999999886 163 L 29.999999999999886 163 M 29.999999999999886 163 M 27.999999999999886 163 L 25.999999999999886 163 M 25.999999999999886 163 M 23.999999999999886 163 L 21.999999999999886 163 M 21.999999999999886 163 M 19.999999999999886 163 L 17.999999999999886 163 M 17.999999999999886 163 M 15.999999999999886 163 L 13.999999999999886 163 M 13.999999999999886 163 M 11.999999999999886 163 L 9.999999999999886 163 M 9.999999999999886 163 M 7.999999999999886 163 L 5.999999999999886 163 M 5.999999999999886 163 M 3.9999999999998863 163 L 1.9999999999998863 163 M 1.9999999999998863 163 M 0 162.9999999999999 L 0 160.9999999999999 M 0 160.9999999999999 M 0 158.9999999999999 L 0 156.9999999999999 M 0 156.9999999999999 M 0 154.9999999999999 L 0 152.9999999999999 M 0 152.9999999999999 M 0 150.9999999999999 L 0 148.9999999999999 M 0 148.9999999999999 M 0 146.9999999999999 L 0 144.9999999999999 M 0 144.9999999999999 M 0 142.9999999999999 L 0 140.9999999999999 M 0 140.9999999999999 M 0 138.9999999999999 L 0 136.9999999999999 M 0 136.9999999999999 M 0 134.9999999999999 L 0 132.9999999999999 M 0 132.9999999999999 M 0 130.9999999999999 L 0 128.9999999999999 M 0 128.9999999999999 M 0 126.99999999999989 L 0 124.99999999999989 M 0 124.99999999999989 M 0 122.99999999999989 L 0 120.99999999999989 M 0 120.99999999999989 M 0 118.99999999999989 L 0 116.99999999999989 M 0 116.99999999999989 M 0 114.99999999999989 L 0 112.99999999999989 M 0 112.99999999999989 M 0 110.99999999999989 L 0 108.99999999999989 M 0 108.99999999999989 M 0 106.99999999999989 L 0 104.99999999999989 M 0 104.99999999999989 M 0 102.99999999999989 L 0 100.99999999999989 M 0 100.99999999999989 M 0 98.99999999999989 L 0 96.99999999999989 M 0 96.99999999999989 M 0 94.99999999999989 L 0 92.99999999999989 M 0 92.99999999999989 M 0 90.99999999999989 L 0 88.99999999999989 M 0 88.99999999999989 M 0 86.99999999999989 L 0 84.99999999999989 M 0 84.99999999999989 M 0 82.99999999999989 L 0 80.99999999999989 M 0 80.99999999999989 M 0 78.99999999999989 L 0 76.99999999999989 M 0 76.99999999999989 M 0 74.99999999999989 L 0 72.99999999999989 M 0 72.99999999999989 M 0 70.99999999999989 L 0 68.99999999999989 M 0 68.99999999999989 M 0 66.99999999999989 L 0 64.99999999999989 M 0 64.99999999999989 M 0 62.999999999999886 L 0 60.999999999999886 M 0 60.999999999999886 M 0 58.999999999999886 L 0 56.999999999999886 M 0 56.999999999999886 M 0 54.999999999999886 L 0 52.999999999999886 M 0 52.999999999999886 M 0 50.999999999999886 L 0 48.999999999999886 M 0 48.999999999999886 M 0 46.999999999999886 L 0 44.999999999999886 M 0 44.999999999999886 M 0 42.999999999999886 L 0 40.999999999999886 M 0 40.999999999999886 M 0 38.999999999999886 L 0 36.999999999999886 M 0 36.999999999999886 M 0 34.999999999999886 L 0 32.999999999999886 M 0 32.999999999999886 M 0 30.999999999999886 L 0 28.999999999999886 M 0 28.999999999999886 M 0 26.999999999999886 L 0 24.999999999999886 M 0 24.999999999999886 M 0 22.999999999999886 L 0 20.999999999999886 M 0 20.999999999999886 M 0 18.999999999999886 L 0 16.999999999999886 M 0 16.999999999999886 M 0 14.999999999999886 L 0 12.999999999999886 M 0 12.999999999999886 M 0 10.999999999999886 L 0 8.999999999999886 M 0 8.999999999999886 M 0 6.999999999999886 L 0 4.999999999999886 M 0 4.999999999999886 M 0 2.9999999999998863 L 0 0.9999999999998863 M 0 0.9999999999998863 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,452,268)"><g transform="translate(0,0)"><g transform="translate(-37.5,-145.5) translate(-414.5,-122.5) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#cccccc" d="M 456.5 272.5 L 468.5 353" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g><g transform="matrix(1,0,0,1,472.71067811865476,268)"><g transform="translate(0,0)"><g transform="translate(-76.5,-141.5) translate(-396.21067811865476,-126.5) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#cccccc" d="M 477.21067811865476 272.5 L 636.5 353" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g><g transform="matrix(1,0,0,1,386.71067811865476,108.5)"><g transform="translate(0,0)"><g transform="translate(-239.28932188134524,-150) translate(-147.4213562373095,41.5) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#cccccc" d="M 435.78932188134524 197.5 L 391.21067811865476 113" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g><g transform="matrix(1,0,0,1,298.21067811865476,108.49999999999999)"><g transform="translate(0,0)"><g transform="translate(-245,-109) translate(-53.210678118654755,0.5000000000000142) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#cccccc" d="M 349.78932188134524 112.99999999999999 L 302.71067811865476 197.5" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g><g transform="matrix(1,0,0,1,259.5,268)"><g transform="translate(0,0)"><g transform="translate(-182,-272.5) translate(-77.5,4.5) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#cccccc" d="M 282 272.5 L 264 353" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g><g transform="matrix(1,0,0,1,98.5,268)"><g transform="translate(0,0)"><g transform="translate(-195,-261.5) translate(96.5,-6.5) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#cccccc" d="M 261.28932188134524 272.5 L 103 353" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g><g transform="translate(0,0) matrix(1,0,0,1,320.5,38)"><g transform="translate(4,4) scale(1.01,1.0133333333333334)"><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="#000000" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" opacity="0.294117647"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="rgb(0,0,0)" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-opacity="0" stroke-miterlimit="10" stroke-width="2" opacity="0.294117647"/></g></g></g></g></g><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="url(#pTwRJlTmoXQS)" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="url(#pTwRJlTmoXQS)" stroke="#333333" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,331,69)"><g><g/></g><g><g/></g><g><g/></g><g><g/><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="22" y="11">R</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="30.666671752929688" y="11">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="37.33332824707031" y="11">u</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="44" y="11">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="47.33332824707031" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="54" y="11">r</text></g></g><g transform="translate(0,0) matrix(1,0,0,1,232,197.5)"><g transform="translate(4,4) scale(1.01,1.0133333333333334)"><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="#000000" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" opacity="0.294117647"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="rgb(0,0,0)" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-opacity="0" stroke-miterlimit="10" stroke-width="2" opacity="0.294117647"/></g></g></g></g></g><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="url(#FvZELeRwLGTV)" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="url(#FvZELeRwLGTV)" stroke="#333333" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,242,228)"><g><g/></g><g><g/></g><g><g/></g><g><g/><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="24.333328247070312" y="11">H</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="33" y="11">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="39.66667175292969" y="11">s</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="45.66667175292969" y="11">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="49" y="11">1</text></g></g><g transform="translate(0,0) matrix(1,0,0,1,406.5,197.5)"><g transform="translate(4,4) scale(1.01,1.0133333333333334)"><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="#000000" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" opacity="0.294117647"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="rgb(0,0,0)" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-opacity="0" stroke-miterlimit="10" stroke-width="2" opacity="0.294117647"/></g></g></g></g></g><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="url(#icpEixOwIatD)" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="url(#icpEixOwIatD)" stroke="#333333" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,417,228)"><g><g/></g><g><g/></g><g><g/></g><g><g/><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="24.333328247070312" y="11">H</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="33" y="11">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="39.66667175292969" y="11">s</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="45.66667175292969" y="11">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="49" y="11">2</text></g></g><g transform="matrix(1,0,0,1,222,168)"><g><g/></g><g><g/></g><g><g/></g><g><g/><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="0" y="11">eth0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="26.666671752929688" y="11">2001</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="53.33332824707031" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="56.66667175292969" y="11">db8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="76.66667175292969" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="80" y="11">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="86.66667175292969" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="90" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="96.66667175292969" y="11">::</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="103.33332824707031" y="11">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="110" y="11">/</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="113.33332824707031" y="11">64</text></g><g><g/></g><g><g/></g><g><g/><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="26.666671752929688" y="25">fe80</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="50" y="25">::</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="56.66667175292969" y="25">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="63.33332824707031" y="25">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="66.66667175292969" y="25">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="73.33332824707031" y="25">/</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="76.66667175292969" y="25">64</text></g></g><g transform="matrix(1,0,0,1,397,168)"><g><g/></g><g><g/></g><g><g/><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="0" y="11.75">eth0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="26.666671752929688" y="11.75">2001</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="53.33332824707031" y="11.75">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="56.66667175292969" y="11.75">db8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="76.66667175292969" y="11.75">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="80" y="11.75">2</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="86.66667175292969" y="11.75">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="90" y="11.75">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="96.66667175292969" y="11.75">::</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="103.33332824707031" y="11.75">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="110" y="11.75">/</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="113.33332824707031" y="11.75">64</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="26.666671752929688" y="27.25">fe80</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="50" y="27.25">::</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="56.66667175292969" y="27.25">2</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="63.33332824707031" y="27.25">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="66.66667175292969" y="27.25">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="73.33332824707031" y="27.25">/</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="76.66667175292969" y="27.25">64</text></g><g><g/></g></g><g transform="matrix(1,0,0,1,384,280)"><g><g/></g><g><g/></g><g><g/></g><g><g/><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="23.333328247070312" y="11">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="30" y="11">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="36.66667175292969" y="11">c</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="42.66667175292969" y="11">k</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="48.66667175292969" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="55.33332824707031" y="11">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="59.33332824707031" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="69.33332824707031" y="11">f</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="72.66667175292969" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="79.33332824707031" y="11">8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="86" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="92.66667175292969" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="96" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="99.33332824707031" y="11">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="106" y="11">/</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="109.33332824707031" y="11">6</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="116" y="11">4</text></g></g><g transform="matrix(1,0,0,1,209,281)"><g><g/></g><g><g/></g><g><g/></g><g><g/><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="23.333328247070312" y="11">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="30" y="11">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="36.66667175292969" y="11">c</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="42.66667175292969" y="11">k</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="48.66667175292969" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="55.33332824707031" y="11">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="59.33332824707031" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="69.33332824707031" y="11">f</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="72.66667175292969" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="79.33332824707031" y="11">8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="86" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="92.66667175292969" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="96" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="99.33332824707031" y="11">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="106" y="11">/</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="109.33332824707031" y="11">6</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="116" y="11">4</text></g></g><g transform="translate(0,0) matrix(1,0,0,1,53,353)"><g transform="translate(4,4) scale(1.01,1.01)"><g><g transform="translate(0,0) scale(1,1)"><g><path fill="#000000" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" opacity="0.294117647"/><g transform="scale(1,1)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="rgb(0,0,0)" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" stroke-opacity="0" stroke-miterlimit="10" stroke-width="2" opacity="0.294117647"/></g></g></g></g></g><g><g transform="translate(0,0) scale(1,1)"><g><path fill="url(#LkNSHLFhaxIA)" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><path fill="url(#LkNSHLFhaxIA)" stroke="#333333" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,63,396)"><g><g/></g><g><g/></g><g><g/></g><g><g/><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="5.3333282470703125" y="11">C</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="14" y="11">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="20.666671752929688" y="11">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="27.333328247070312" y="11">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="30.666671752929688" y="11">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="37.33332824707031" y="11">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="40" y="11">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="46.66667175292969" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="53.33332824707031" y="11">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="57.33332824707031" y="11">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="64" y="11">-</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="68" y="11">1</text></g></g><g transform="translate(0,0) matrix(1,0,0,1,214,353)"><g transform="translate(4,4) scale(1.01,1.01)"><g><g transform="translate(0,0) scale(1,1)"><g><path fill="#000000" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" opacity="0.294117647"/><g transform="scale(1,1)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="rgb(0,0,0)" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" stroke-opacity="0" stroke-miterlimit="10" stroke-width="2" opacity="0.294117647"/></g></g></g></g></g><g><g transform="translate(0,0) scale(1,1)"><g><path fill="url(#oKDqFTggfkIn)" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><path fill="url(#oKDqFTggfkIn)" stroke="#333333" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,224,396)"><g><g/></g><g><g/></g><g><g/></g><g><g/><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="5.3333282470703125" y="11">C</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="14" y="11">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="20.666671752929688" y="11">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="27.333328247070312" y="11">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="30.666671752929688" y="11">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="37.33332824707031" y="11">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="40" y="11">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="46.66667175292969" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="53.33332824707031" y="11">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="57.33332824707031" y="11">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="64" y="11">-</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="68" y="11">2</text></g></g><g transform="matrix(1,0,0,1,30,336)"><g><g/></g><g><g/></g><g><g/><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="9.666671752929688" y="11.75">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="16.333328247070312" y="11.75">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="19.666671752929688" y="11.75">h</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="26.333328247070312" y="11.75">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="36.33332824707031" y="11.75">2</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="43" y="11.75">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="49.66667175292969" y="11.75">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="56.33332824707031" y="11.75">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="63" y="11.75">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="66.33332824707031" y="11.75">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="73" y="11.75">b</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="79.66667175292969" y="11.75">8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="86.33332824707031" y="11.75">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="89.66667175292969" y="11.75">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="96.33332824707031" y="11.75">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="99.66667175292969" y="11.75">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="106.33332824707031" y="11.75">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="109.66667175292969" y="11.75">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="113" y="11.75">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="119.66667175292969" y="11.75">/</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="123" y="11.75">6</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="129.6666717529297" y="11.75">4</text></g></g><g transform="translate(0,0) matrix(1,0,0,1,418.5,353)"><g transform="translate(4,4) scale(1.01,1.01)"><g><g transform="translate(0,0) scale(1,1)"><g><path fill="#000000" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" opacity="0.294117647"/><g transform="scale(1,1)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="rgb(0,0,0)" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" stroke-opacity="0" stroke-miterlimit="10" stroke-width="2" opacity="0.294117647"/></g></g></g></g></g><g><g transform="translate(0,0) scale(1,1)"><g><path fill="url(#ibePzzWmRSgC)" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><path fill="url(#ibePzzWmRSgC)" stroke="#333333" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,429,396)"><g><g/></g><g><g/></g><g><g/></g><g><g/><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="5.3333282470703125" y="11">C</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="14" y="11">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="20.666671752929688" y="11">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="27.333328247070312" y="11">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="30.666671752929688" y="11">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="37.33332824707031" y="11">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="40" y="11">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="46.66667175292969" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="53.33332824707031" y="11">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="57.33332824707031" y="11">2</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="64" y="11">-</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="68" y="11">1</text></g></g><g transform="translate(0,0) matrix(1,0,0,1,586.5,353)"><g transform="translate(4,4) scale(1.01,1.01)"><g><g transform="translate(0,0) scale(1,1)"><g><path fill="#000000" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" opacity="0.294117647"/><g transform="scale(1,1)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="rgb(0,0,0)" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" stroke-opacity="0" stroke-miterlimit="10" stroke-width="2" opacity="0.294117647"/></g></g></g></g></g><g><g transform="translate(0,0) scale(1,1)"><g><path fill="url(#OTKSvGQcxRpB)" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><path fill="url(#OTKSvGQcxRpB)" stroke="#333333" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,597,396)"><g><g/></g><g><g/></g><g><g/></g><g><g/><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="5.3333282470703125" y="11">C</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="14" y="11">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="20.666671752929688" y="11">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="27.333328247070312" y="11">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="30.666671752929688" y="11">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="37.33332824707031" y="11">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="40" y="11">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="46.66667175292969" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="53.33332824707031" y="11">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="57.33332824707031" y="11">2</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="64" y="11">-</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="68" y="11">2</text></g></g><g transform="matrix(1,0,0,1,28,201)"><g><g/></g><g><g/></g><g><g/><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="0" y="11.75">ip</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="9.333328247070312" y="11.75"> -</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="16.666671752929688" y="11.75">6</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="26.666671752929688" y="11.75">route</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="57.33332824707031" y="11.75">add</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="80.66667175292969" y="11.75">default</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="120" y="11.75">via</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="138.6666717529297" y="11.75">fe80</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="162" y="11.75">::</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="168.6666717529297" y="11.75">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="175.3333282470703" y="11.75"> \</text></g><g><g/></g><g><g/><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="10" y="27.25">dev</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="32.66667175292969" y="27.25">eth0</text></g><g><g/></g></g><g transform="matrix(1,0,0,1,387,463)"><g><g/></g><g><g/></g><g><g/><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="55.53334045410156" y="11.75">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="58.19999694824219" y="11.75">p</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="68.19999694824219" y="11.75">-</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="72.19999694824219" y="11.75">6</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="82.19999694824219" y="11.75">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="86.19999694824219" y="11.75">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="92.86666870117188" y="11.75">u</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="99.53334045410156" y="11.75">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="102.86666870117188" y="11.75">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="112.86666870117188" y="11.75">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="119.53334045410156" y="11.75">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="126.19999694824219" y="11.75">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="136.1999969482422" y="11.75">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="142.86666870117188" y="11.75">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="149.53334045410156" y="11.75">f</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="152.86666870117188" y="11.75">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="159.53334045410156" y="11.75">u</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="166.1999969482422" y="11.75">l</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="168.86666870117188" y="11.75">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="175.53334045410156" y="11.75">v</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="181.53334045410156" y="11.75">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="184.1999969482422" y="11.75">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="194.1999969482422" y="11.75">f</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="197.53334045410156" y="11.75">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="204.1999969482422" y="11.75">8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="210.86666870117188" y="11.75">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="217.53334045410156" y="11.75">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="220.86666870117188" y="11.75">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="224.1999969482422" y="11.75">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="234.1999969482422" y="11.75">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="240.86666870117188" y="11.75">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="247.53334045410156" y="11.75">v</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="256.8666687011719" y="11.75">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="263.5333251953125" y="11.75">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="266.8666687011719" y="11.75">h</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="273.5333251953125" y="11.75">0</text></g></g><g transform="matrix(1,0,0,1,14,464)"><g><g/></g><g><g/></g><g><g/><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="58.91667175292969" y="11.75">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="61.58332824707031" y="11.75">p</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="71.58332824707031" y="11.75">-</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="75.58332824707031" y="11.75">6</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="85.58332824707031" y="11.75">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="89.58332824707031" y="11.75">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="96.25" y="11.75">u</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="102.91667175292969" y="11.75">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="106.25" y="11.75">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="116.25" y="11.75">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="122.91667175292969" y="11.75">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="129.5833282470703" y="11.75">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="139.5833282470703" y="11.75">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="146.25" y="11.75">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="152.9166717529297" y="11.75">f</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="156.25" y="11.75">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="162.9166717529297" y="11.75">u</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="169.5833282470703" y="11.75">l</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="172.25" y="11.75">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="178.9166717529297" y="11.75">v</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="184.9166717529297" y="11.75">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="187.5833282470703" y="11.75">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="197.5833282470703" y="11.75">f</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="200.9166717529297" y="11.75">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="207.5833282470703" y="11.75">8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="214.25" y="11.75">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="220.9166717529297" y="11.75">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="224.25" y="11.75">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="227.5833282470703" y="11.75">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="237.5833282470703" y="11.75">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="244.25" y="11.75">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="250.9166717529297" y="11.75">v</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="260.25" y="11.75">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="266.91668701171875" y="11.75">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="270.25" y="11.75">h</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="276.91668701171875" y="11.75">0</text></g></g><g transform="matrix(1,0,0,1,-9.000680271168676,245.99999999999966)"><g transform="translate(0,0)"><g transform="translate(-793,-250) translate(802.0006802711687,4.000000000000341) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#000000" d="M 723.75 250 M 723.75 250 L 715.75 250 M 715.75 250 M 707.75 250 L 699.75 250 M 699.75 250 M 691.75 250 L 683.75 250 M 683.75 250 M 675.75 250 L 667.75 250 M 667.75 250 M 659.75 250 L 651.75 250 M 651.75 250 M 643.75 250 L 635.75 250 M 635.75 250 M 627.75 250 L 619.75 250 M 619.75 250 M 611.75 250 L 603.75 250 M 603.75 250 M 595.75 250 L 587.75 250 M 587.75 250 M 579.75 250 L 571.75 250 M 571.75 250 M 563.75 250 L 555.75 250 M 555.75 250 M 547.75 250 L 539.75 250 M 539.75 250 M 531.75 250 L 523.75 250 M 523.75 250 M 515.75 250 L 507.75 250 M 507.75 250 M 499.75 250 L 491.75 250 M 491.75 250 M 483.75 250 L 475.75 250 M 475.75 250 M 467.75 250 L 459.75 250 M 459.75 250 M 451.75 250 L 443.75 250 M 443.75 250 M 435.75 250 L 427.75 250 M 427.75 250 M 419.75 250 L 411.75 250 M 411.75 250 M 403.75 250 L 395.75 250 M 395.75 250 M 387.75 250 L 379.75 250 M 379.75 250 M 371.75 250 L 363.75 250 M 363.75 250 M 355.75 250 L 347.75 250 M 347.75 250 M 339.75 250 L 331.75 250 M 331.75 250 M 323.75 250 L 315.75 250 M 315.75 250 M 307.75 250 L 299.75 250 M 299.75 250 M 291.75 250 L 283.75 250 M 283.75 250 M 275.75 250 L 267.75 250 M 267.75 250 M 259.75 250 L 251.75 250 M 251.75 250 M 243.75 250 L 235.75 250 M 235.75 250 M 227.75 250 L 219.75 250 M 219.75 250 M 211.75 250 L 203.75 250 M 203.75 250 M 195.75 250 L 187.75 250 M 187.75 250 M 179.75 250 L 171.75 249.99999999999997 M 171.75 249.99999999999997 M 163.75 249.99999999999997 L 155.75 249.99999999999994 M 155.75 249.99999999999994 M 147.75 249.99999999999994 L 139.75 249.99999999999991 M 139.75 249.99999999999991 M 131.75 249.99999999999991 L 123.75 249.9999999999999 M 123.75 249.9999999999999 M 115.75 249.9999999999999 L 107.75 249.99999999999986 M 107.75 249.99999999999986 M 99.75 249.99999999999986 L 91.75 249.99999999999983 M 91.75 249.99999999999983 M 83.75 249.99999999999983 L 75.75 249.9999999999998 M 75.75 249.9999999999998 M 67.75 249.9999999999998 L 59.75 249.99999999999977 M 59.75 249.99999999999977 M 51.75 249.99999999999977 L 43.75 249.99999999999974 M 43.75 249.99999999999974 M 35.75 249.99999999999974 L 27.75 249.99999999999972 M 27.75 249.99999999999972 M 19.75 249.99999999999972 L 11.75 249.9999999999997 M 11.75 249.9999999999997 M 3.75 249.9999999999997 L -4.25 249.99999999999966 M -4.25 249.99999999999966" stroke-miterlimit="10"/></g></g></g></g><g transform="matrix(1,0,0,1,531,199)"><g><g/></g><g><g/></g><g><g/><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="0" y="11.75">ip</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="9.333328247070312" y="11.75"> -</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="16.666671752929688" y="11.75">6</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="26.666671752929688" y="11.75">route</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="57.33332824707031" y="11.75">add</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="80.66667175292969" y="11.75">default</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="120" y="11.75">via</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="138.6666717529297" y="11.75">fe80</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="162" y="11.75">::</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="168.6666717529297" y="11.75">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="175.3333282470703" y="11.75"> \</text></g><g><g/></g><g><g/><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="13.333328247070312" y="27.25">dev</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="36" y="27.25">eth0</text></g></g><g transform="matrix(1,0,0,1,191,336)"><g><g/></g><g><g/></g><g><g/><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="9.666671752929688" y="11.75">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="16.333328247070312" y="11.75">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="19.666671752929688" y="11.75">h</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="26.333328247070312" y="11.75">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="36.33332824707031" y="11.75">2</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="43" y="11.75">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="49.66667175292969" y="11.75">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="56.33332824707031" y="11.75">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="63" y="11.75">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="66.33332824707031" y="11.75">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="73" y="11.75">b</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="79.66667175292969" y="11.75">8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="86.33332824707031" y="11.75">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="89.66667175292969" y="11.75">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="96.33332824707031" y="11.75">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="99.66667175292969" y="11.75">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="106.33332824707031" y="11.75">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="109.66667175292969" y="11.75">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="113" y="11.75">2</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="119.66667175292969" y="11.75">/</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="123" y="11.75">6</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="129.6666717529297" y="11.75">4</text></g></g><g transform="matrix(1,0,0,1,397,336)"><g><g/></g><g><g/></g><g><g/><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="9.666671752929688" y="11.75">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="16.333328247070312" y="11.75">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="19.666671752929688" y="11.75">h</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="26.333328247070312" y="11.75">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="36.33332824707031" y="11.75">2</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="43" y="11.75">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="49.66667175292969" y="11.75">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="56.33332824707031" y="11.75">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="63" y="11.75">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="66.33332824707031" y="11.75">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="73" y="11.75">b</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="79.66667175292969" y="11.75">8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="86.33332824707031" y="11.75">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="89.66667175292969" y="11.75">2</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="96.33332824707031" y="11.75">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="99.66667175292969" y="11.75">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="106.33332824707031" y="11.75">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="109.66667175292969" y="11.75">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="113" y="11.75">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="119.66667175292969" y="11.75">/</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="123" y="11.75">6</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="129.6666717529297" y="11.75">4</text></g></g><g transform="matrix(1,0,0,1,565,336)"><g><g/></g><g><g/></g><g><g/><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="9.666671752929688" y="11.75">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="16.333328247070312" y="11.75">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="19.666671752929688" y="11.75">h</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="26.333328247070312" y="11.75">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="36.33332824707031" y="11.75">2</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="43" y="11.75">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="49.66667175292969" y="11.75">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="56.33332824707031" y="11.75">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="63" y="11.75">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="66.33332824707031" y="11.75">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="73" y="11.75">b</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="79.66667175292969" y="11.75">8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="86.33332824707031" y="11.75">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="89.66667175292969" y="11.75">2</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="96.33332824707031" y="11.75">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="99.66667175292969" y="11.75">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="106.33332824707031" y="11.75">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="109.66667175292969" y="11.75">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="113" y="11.75">2</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="119.66667175292969" y="11.75">/</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="123" y="11.75">6</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="129.6666717529297" y="11.75">4</text></g></g><g transform="matrix(1,0,0,1,436,47)"><g><g/></g><g><g/></g><g><g/><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="0" y="11.75">ip</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="9.333328247070312" y="11.75"> -</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="16.666671752929688" y="11.75">6</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="26.666671752929688" y="11.75">route</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="57.33332824707031" y="11.75">add</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="80.66667175292969" y="11.75">default</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="120" y="11.75">via</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="138.6666717529297" y="11.75">fe80</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="162" y="11.75">::</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="168.6666717529297" y="11.75">1</text></g><g><g/><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="178.6666717529297" y="11.75">dev</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="201.3333282470703" y="11.75">eth0</text></g><g><g/></g><g><g/></g><g><g/></g><g><g/></g><g><g/></g><g><g/><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="0" y="58.25">ip</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="9.333328247070312" y="58.25"> -</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="16.666671752929688" y="58.25">6</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="26.666671752929688" y="58.25">route</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="57.33332824707031" y="58.25">add</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="80.66667175292969" y="58.25">2001</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="107.33332824707031" y="58.25">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="110.66667175292969" y="58.25">db8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="130.6666717529297" y="58.25">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="134" y="58.25">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="140.6666717529297" y="58.25">::/</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="150.6666717529297" y="58.25">48</text></g><g><g/><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="167.3333282470703" y="58.25">via</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="186" y="58.25">fe80</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="209.3333282470703" y="58.25">::</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="216" y="58.25">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="222.6666717529297" y="58.25">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="226" y="58.25">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="236" y="58.25">dev</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="258.66668701171875" y="58.25">eth1</text></g><g><g/></g><g><g/><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="0" y="73.75">ip</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="9.333328247070312" y="73.75"> -</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="16.666671752929688" y="73.75">6</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="26.666671752929688" y="73.75">route</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="57.33332824707031" y="73.75">add</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="80.66667175292969" y="73.75">2001</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="107.33332824707031" y="73.75">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="110.66667175292969" y="73.75">db8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="130.6666717529297" y="73.75">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="134" y="73.75">2</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="140.6666717529297" y="73.75">::/</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="150.6666717529297" y="73.75">48</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="167.3333282470703" y="73.75">via</text></g><g><g/><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="186" y="73.75">fe80</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="209.3333282470703" y="73.75">::</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="216" y="73.75">2</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="222.6666717529297" y="73.75">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="226" y="73.75">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="236" y="73.75">dev</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15.5px" x="258.66668701171875" y="73.75">eth1</text></g></g><g transform="matrix(1,0,0,1,295,120)"><g><g/></g><g><g/></g><g><g/></g><g><g/><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="33" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="39.66667175292969" y="11">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="43" y="11">h</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="49.66667175292969" y="11">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="59.66667175292969" y="11">f</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="63" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="69.66667175292969" y="11">8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="76.33332824707031" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="83" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="86.33332824707031" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="89.66667175292969" y="11">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="96.33332824707031" y="11">/</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="99.66667175292969" y="11">6</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="106.33332824707031" y="11">4</text></g></g><g transform="matrix(1,0,0,1,298,21)"><g><g/></g><g><g/></g><g><g/></g><g><g/><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="19.666671752929688" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="26.333328247070312" y="11">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="29.666671752929688" y="11">h</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="36.33332824707031" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="46.33332824707031" y="11">2</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="53" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="59.66667175292969" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="66.33332824707031" y="11">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="73" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="76.33332824707031" y="11">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="83" y="11">b</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="89.66667175292969" y="11">8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="96.33332824707031" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="99.66667175292969" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="103" y="11">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="109.66667175292969" y="11">/</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="113" y="11">6</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="119.66667175292969" y="11">4</text></g></g><g transform="matrix(1,0,0,1,261,492)"><g><g/></g><g><g/></g><g><g/><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="0.633331298828125" y="9">c</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="5.633331298828125" y="9">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="11.199996948242188" y="9">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="16.76666259765625" y="9">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="19.550003051757812" y="9">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="25.116668701171875" y="9">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="27.333328247070312" y="9">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="32.899993896484375" y="9">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="38.46665954589844" y="9">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="41.80000305175781" y="9">s</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="46.80000305175781" y="9">'</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="51.5" y="9">l</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="53.71665954589844" y="9">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="55.93333435058594" y="9">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="61.5" y="9">k</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="66.5" y="9">-</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="69.83332824707031" y="9">l</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="72.05000305175781" y="9">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="77.61666870117188" y="9">c</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="82.61666870117188" y="9">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="88.18333435058594" y="9">l</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="93.18333435058594" y="9">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="98.75" y="9">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="104.31666564941406" y="9">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="109.88333129882812" y="9">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="113.21665954589844" y="9">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="118.78334045410156" y="9">s</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="123.78334045410156" y="9">s</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="128.78334045410156" y="9">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="134.35000610351562" y="9">s</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="142.13333129882812" y="9">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="147.6999969482422" y="9">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="151.03334045410156" y="9">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="159.38333129882812" y="9">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="164.9499969482422" y="9">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="170.51666259765625" y="9">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="176.0833282470703" y="9">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="181.64999389648438" y="9">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="183.86666870117188" y="9">s</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="188.86666870117188" y="9">p</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="194.43333435058594" y="9">l</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="196.64999389648438" y="9">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="202.21665954589844" y="9">y</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="207.21665954589844" y="9">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="212.78334045410156" y="9">d</text></g></g><g transform="matrix(1,0,0,1,28,254)"><g><g/></g><g><g/></g><g><g/></g><g><g/><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="0" y="11">ip</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="9.333328247070312" y="11"> -</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="16.666671752929688" y="11">6</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="26.666671752929688" y="11">route</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="57.33332824707031" y="11">add</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="80.66667175292969" y="11">2001</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="107.33332824707031" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="110.66667175292969" y="11">db8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="130.6666717529297" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="134" y="11">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="140.6666717529297" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="144" y="11">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="150.6666717529297" y="11">::/</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="160.6666717529297" y="11">64</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="174" y="11"> \</text></g><g><g/></g><g><g/></g><g><g/><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="13.333328247070312" y="25">dev</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="36" y="25">docker0</text></g></g><g transform="matrix(1,0,0,1,531,252)"><g><g/></g><g><g/></g><g><g/></g><g><g/><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="0" y="11">ip</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="9.333328247070312" y="11"> -</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="16.666671752929688" y="11">6</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="26.666671752929688" y="11">route</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="57.33332824707031" y="11">add</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="80.66667175292969" y="11">2001</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="107.33332824707031" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="110.66667175292969" y="11">db8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="130.6666717529297" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="134" y="11">2</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="140.6666717529297" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="144" y="11">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="150.6666717529297" y="11">::/</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="160.6666717529297" y="11">64</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="174" y="11"> \</text></g><g><g/></g><g><g/></g><g><g/><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="13.333328247070312" y="25">dev</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="36" y="25">docker0</text></g></g><g transform="matrix(1,0,0,1,727,231)"><image width="40" height="275" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAETCAYAAABENES3AAABz0lEQVR4nO3QMU4CURhF4UukoJtS1wFb0R3ACoTaBvekO9EaWzrqwYIHjMJEzCneFOdLbjJ5meLkTyRJkiTpZqPaAX95LBukuyQfZXeVW66aJ9mXzSu3XJgk2SRpyzblbTCWOV/vuGXVoo4myTaHyx3j2vLWVOw6WefyesetK3YlSe6T7NIfuCv/VDNLsursvaz7NqtWd8VL2WAZSBlIGUgZSBlIGUgZSBlIGUgZSBlIGUgZSBlIGUgZSBlIGUgZSBlIGUgZSBlIGUgZSBlIGUgZSBlIGUgZSBlIGUgZSBlIGUgZSBlIGUgZSBlIGUgZSBlIGUgZSBlIGUgZSBlIGUgZSBlIGUgZSBlIGUgZSBlIGUgZSBlIGUgZSBlIGUgZSBlIGUgZSBlIGUgZSBlIGUgZSBlIGUgZSBlIGUgZSBlIGUgZSBlIGUgZSBlIGUgZSBlIGUgZSBlIGUgZSBlIGUgZSBlIGUgZSBlIGUgZSBlIGfhf0yTPnb2Vdd+m1eqSPCTZJdn3bFf+qeo1/YHril0nTZJtkjbnsLa8NRW7fljl8nqrqkW/TJJ85XC5tnxPqhZdscj5eovKLVeNk3yWjSu39HoqG6xRmSRJkiTd4hsDlSZIihHtWwAAAABJRU5ErkJggg==" transform="translate(0,0)"/></g><g transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,731,443)"><g><g/></g><g><g/></g><g><g/></g><g><g/><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="19.333328247070312" y="11">m</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="29.333328247070312" y="11">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="36" y="11">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="42.66667175292969" y="11">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="49.33332824707031" y="11">g</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="56" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="62.66667175292969" y="11">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="72.66667175292969" y="11">b</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="79.33332824707031" y="11">y</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="88.66667175292969" y="11">D</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="97.33332824707031" y="11">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="104" y="11">c</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="110" y="11">k</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="116" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="&quot;Arial&quot;" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="122.66667175292969" y="11">r</text></g></g><g transform="matrix(1,0,0,1,719.75,246)"><g transform="translate(0,0)"><g transform="translate(-765,-250) translate(45.25,4) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#000000" d="M 752.0176935741139 250 L 723.75 250" stroke-miterlimit="10"/></g></g></g></g><g transform="matrix(1,0,0,1,720.75,483)"><g transform="translate(0,0)"><g transform="translate(-766,-487) translate(45.25,4) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#000000" d="M 752.0183424505415 487 L 724.75 487" stroke-miterlimit="10"/></g></g></g></g></g></svg> \ No newline at end of file
diff --git a/docs/sources/article-img/ipv6_slash64_subnet_config.gliffy b/docs/sources/article-img/ipv6_slash64_subnet_config.gliffy
index efafc02efc..6914fd074d 100644
--- a/docs/sources/article-img/ipv6_slash64_subnet_config.gliffy
+++ b/docs/sources/article-img/ipv6_slash64_subnet_config.gliffy
@@ -1 +1 @@
-{"contentType":"application/gliffy+json","version":"1.3","stage":{"background":"#FFFFFF","width":550,"height":341,"nodeIndex":88,"autoFit":true,"exportBorder":false,"gridOn":false,"snapToGrid":false,"drawingGuidesOn":false,"pageBreaksOn":false,"printGridOn":false,"printPaper":"LETTER","printShrinkToFit":false,"printPortrait":true,"maxWidth":5000,"maxHeight":5000,"themeData":null,"viewportType":"default","fitBB":{"min":{"x":2.5,"y":2.5},"max":{"x":550,"y":341}},"objects":[{"x":10.5,"y":53.5,"rotation":0.0,"id":74,"width":150.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":26,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"\">fe80::1/64</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":37.0,"y":2.5,"rotation":0.0,"id":72,"width":100.0,"height":46.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":24,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#d9d9d9","gradient":true,"dashStyle":null,"dropShadow":true,"state":0,"opacity":1.0,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":73,"width":96.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:12px;text-decoration:none;font-family:Arial;\"><span style=\"text-decoration:none;\">Router</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[]}]},{"x":89.5,"y":83.5,"rotation":0.0,"id":59,"width":150.0,"height":28.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":17,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:left;\"><span style=\"font-style:italic;font-size:12px;font-family:Arial;\"><span style=\"\">Routed Network:<br />2001:db8::/64</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":313.0,"y":313.0,"rotation":0.0,"id":39,"width":235.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":16,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"\">route -A inet6 default gw fe80::1 dev eth0</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":352.0,"y":185.5,"rotation":0.0,"id":36,"width":169.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":15,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:12px;font-family:Arial;\"><span style=\"\">eth0 2001:db8:0:0:1::2/80</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":351.0,"y":49.5,"rotation":0.0,"id":29,"width":171.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":14,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:12px;font-family:Arial;\"><span style=\"\">eth0 2001:db8:0:0:1::1/80</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":382.1250000000001,"y":202.5,"rotation":0.0,"id":30,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.square","order":12,"lockAspectRatio":true,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#ead1dc","gradient":true,"dashStyle":null,"dropShadow":true,"state":0,"opacity":1.0,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":31,"width":96.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:12px;text-decoration:none;font-family:Arial;\"><span style=\"text-decoration:none;\">container1-2</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[]}]},{"x":382.0,"y":65.5,"rotation":0.0,"id":32,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.square","order":10,"lockAspectRatio":true,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#ead1dc","gradient":true,"dashStyle":null,"dropShadow":true,"state":0,"opacity":1.0,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":33,"width":96.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:12px;text-decoration:none;font-family:Arial;\"><span style=\"text-decoration:none;\">container1-1</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[]}]},{"x":15.125000000000057,"y":261.0,"rotation":0.0,"id":20,"width":273.0,"height":28.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":9,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:left;\"><span style=\"\">route -A inet6 default gw fe80::1 dev eth0</span><span style=\"text-decoration:none;\"><br /></span></p><p style=\"text-align:left;\"><span style=\"text-align:center;\">route -A inet6 2001:db8:0:0:1::/80 d</span><span style=\"text-align:center;\">ev docker0</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":120.0,"y":178.5,"rotation":0.0,"id":21,"width":150.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":8,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:12px;font-family:Arial;\"><span style=\"\">docker0 fe80::1/64</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":13.0,"y":132.5,"rotation":0.0,"id":22,"width":150.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":7,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:12px;font-family:Arial;\"><span style=\"\">eth0 2001:db8::1/80</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":38.0,"y":149.0,"rotation":0.0,"id":23,"width":100.0,"height":75.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":5,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#a4c2f4","gradient":true,"dashStyle":null,"dropShadow":true,"state":0,"opacity":1.0,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":24,"width":96.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:12px;text-decoration:none;font-family:Arial;\"><span style=\"text-decoration:none;\">host1</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[]}]},{"x":-118.0,"y":123.0,"rotation":0.0,"id":44,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":4,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":23,"py":0.7071067811865475,"px":0.9999999999999998}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":30,"py":0.5,"px":0.0}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#cccccc","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[255.99999999999997,79.03300858899107],[500.1250000000001,129.5]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]},{"x":-138.0,"y":129.0,"rotation":0.0,"id":43,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":3,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":23,"py":0.29289321881345237,"px":1.0}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":32,"py":0.5,"px":0.0}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#cccccc","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[276.0,41.966991411008934],[520.0,-13.5]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]},{"x":313.0,"y":40.0,"rotation":0.0,"id":34,"width":237.00000000000003,"height":301.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":2,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dashStyle":"2,2","dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[]},{"x":87.0,"y":150.0,"rotation":0.0,"id":58,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":1,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":23,"py":0.0,"px":0.5}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":72,"py":1.0,"px":0.5}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#cccccc","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[1.0,-1.0],[0.0,-101.5]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]},{"x":2.5,"y":118.50000000000001,"rotation":0.0,"id":25,"width":292.0,"height":178.99999999999997,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":0,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dashStyle":"2,2","dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[]}],"shapeStyles":{},"lineStyles":{"global":{"stroke":"#cccccc"}},"textStyles":{"global":{"bold":true,"italic":true}}},"metadata":{"title":"untitled","revision":0,"exportBorder":false,"loadPosition":"default","libraries":["com.gliffy.libraries.basic.basic_v1.default","com.gliffy.libraries.flowchart.flowchart_v1.default","com.gliffy.libraries.swimlanes.swimlanes_v1.default","com.gliffy.libraries.uml.uml_v1.default","com.gliffy.libraries.erd.erd_v1.default","com.gliffy.libraries.ui.ui_v2.forms_components","com.gliffy.libraries.network.network_v3.home","com.gliffy.libraries.images"],"autosaveDisabled":false},"embeddedResources":{"index":0,"resources":[]}} \ No newline at end of file
+{"contentType":"application/gliffy+json","version":"1.3","stage":{"background":"#FFFFFF","width":550,"height":341,"nodeIndex":88,"autoFit":true,"exportBorder":false,"gridOn":false,"snapToGrid":false,"drawingGuidesOn":false,"pageBreaksOn":false,"printGridOn":false,"printPaper":"LETTER","printShrinkToFit":false,"printPortrait":true,"maxWidth":5000,"maxHeight":5000,"themeData":null,"viewportType":"default","fitBB":{"min":{"x":2.5,"y":2.5},"max":{"x":550,"y":341}},"objects":[{"x":10.5,"y":53.5,"rotation":0.0,"id":74,"width":150.0,"height":16.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":26,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"\">fe80::1/64</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":37.0,"y":2.5,"rotation":0.0,"id":72,"width":100.0,"height":46.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":24,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#d9d9d9","gradient":true,"dashStyle":null,"dropShadow":true,"state":0,"opacity":1.0,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":73,"width":96.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:12px;text-decoration:none;font-family:Arial;\"><span style=\"text-decoration:none;\">Router</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[]}]},{"x":89.5,"y":83.5,"rotation":0.0,"id":59,"width":150.0,"height":28.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":17,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:left;\"><span style=\"font-size:12px;font-style:italic;font-family:Arial;\"><span style=\"\">Routed Network:<br />2001:db8:23:42::/64</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":313.0,"y":314.0,"rotation":0.0,"id":39,"width":235.0,"height":16.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":16,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"\">ip -6 route add default via fe80::1 dev eth0</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":352.0,"y":185.5,"rotation":0.0,"id":36,"width":169.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":15,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:12px;font-family:Arial;\"><span style=\"\">eth0 2001:db8:23:42:1::2/80</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":351.0,"y":49.5,"rotation":0.0,"id":29,"width":171.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":14,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:12px;font-family:Arial;\"><span style=\"\">eth0 2001:db8:23:42:1::1/80</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":382.1250000000001,"y":202.5,"rotation":0.0,"id":30,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.square","order":12,"lockAspectRatio":true,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#ead1dc","gradient":true,"dashStyle":null,"dropShadow":true,"state":0,"opacity":1.0,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":31,"width":96.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:12px;text-decoration:none;font-family:Arial;\"><span style=\"text-decoration:none;\">container1-2</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[]}]},{"x":382.0,"y":65.5,"rotation":0.0,"id":32,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.square","order":10,"lockAspectRatio":true,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#ead1dc","gradient":true,"dashStyle":null,"dropShadow":true,"state":0,"opacity":1.0,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":33,"width":96.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:12px;text-decoration:none;font-family:Arial;\"><span style=\"text-decoration:none;\">container1-1</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[]}]},{"x":15.125000000000057,"y":264.0,"rotation":0.0,"id":20,"width":273.0,"height":28.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":9,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:left;\"><span style=\"\">ip -6 route add default via fe80::1 dev eth0</span><span style=\"text-decoration:none;\"><br /></span></p><p style=\"text-align:left;\"><span style=\"text-align:center;\">ip -6 route add 2001:db8:23:42:1::/80 d</span><span style=\"text-align:center;\">ev docker0</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":120.0,"y":178.5,"rotation":0.0,"id":21,"width":150.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":8,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:12px;font-family:Arial;\"><span style=\"\">docker0 fe80::1/64</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":13.0,"y":132.5,"rotation":0.0,"id":22,"width":150.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":7,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:12px;font-family:Arial;\"><span style=\"\">eth0 2001:db8:23:42::1/80</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":38.0,"y":149.0,"rotation":0.0,"id":23,"width":100.0,"height":75.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":5,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#a4c2f4","gradient":true,"dashStyle":null,"dropShadow":true,"state":0,"opacity":1.0,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":24,"width":96.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:12px;text-decoration:none;font-family:Arial;\"><span style=\"text-decoration:none;\">host1</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[]}]},{"x":-118.0,"y":123.0,"rotation":0.0,"id":44,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":4,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":23,"py":0.7071067811865475,"px":0.9999999999999998}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":30,"py":0.5,"px":0.0}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#cccccc","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[255.99999999999997,79.03300858899107],[500.1250000000001,129.5]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]},{"x":-138.0,"y":129.0,"rotation":0.0,"id":43,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":3,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":23,"py":0.29289321881345237,"px":1.0}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":32,"py":0.5,"px":0.0}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#cccccc","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[276.0,41.966991411008934],[520.0,-13.5]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]},{"x":313.0,"y":40.0,"rotation":0.0,"id":34,"width":237.00000000000003,"height":301.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":2,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dashStyle":"2,2","dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[]},{"x":87.0,"y":150.0,"rotation":0.0,"id":58,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":1,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":23,"py":0.0,"px":0.5}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":72,"py":1.0,"px":0.5}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#cccccc","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[1.0,-1.0],[0.0,-101.5]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]},{"x":2.5,"y":118.50000000000001,"rotation":0.0,"id":25,"width":292.0,"height":178.99999999999997,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":0,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dashStyle":"2,2","dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[]}],"shapeStyles":{},"lineStyles":{"global":{"stroke":"#cccccc"}},"textStyles":{"global":{"bold":true,"italic":true}}},"metadata":{"title":"untitled","revision":0,"exportBorder":false,"loadPosition":"default","libraries":["com.gliffy.libraries.basic.basic_v1.default","com.gliffy.libraries.flowchart.flowchart_v1.default","com.gliffy.libraries.swimlanes.swimlanes_v1.default","com.gliffy.libraries.uml.uml_v1.default","com.gliffy.libraries.erd.erd_v1.default","com.gliffy.libraries.ui.ui_v2.forms_components","com.gliffy.libraries.network.network_v3.home","com.gliffy.libraries.images"],"autosaveDisabled":false},"embeddedResources":{"index":0,"resources":[]}} \ No newline at end of file
diff --git a/docs/sources/article-img/ipv6_slash64_subnet_config.svg b/docs/sources/article-img/ipv6_slash64_subnet_config.svg
index c731eddd35..70b140e2dc 100644
--- a/docs/sources/article-img/ipv6_slash64_subnet_config.svg
+++ b/docs/sources/article-img/ipv6_slash64_subnet_config.svg
@@ -1 +1 @@
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="570" height="361"><defs><linearGradient id="ELZfsiqoWTlJ" x1="0px" x2="0px" y1="100px" y2="-50px" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#a4c2f4"/><stop offset="1" stop-color="#FFFFFF"/></linearGradient><linearGradient id="LRIZIyfLhGTN" x1="0px" x2="0px" y1="100px" y2="-50px" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ead1dc"/><stop offset="1" stop-color="#FFFFFF"/></linearGradient><linearGradient id="mhyHooPGpGXu" x1="0px" x2="0px" y1="100px" y2="-50px" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ead1dc"/><stop offset="1" stop-color="#FFFFFF"/></linearGradient><linearGradient id="yGMyvOlKqDXf" x1="0px" x2="0px" y1="100px" y2="-50px" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#d9d9d9"/><stop offset="1" stop-color="#FFFFFF"/></linearGradient></defs><g transform="translate(0,0)"><g><rect fill="#FFFFFF" stroke="none" x="0" y="0" width="570" height="361"/></g><g transform="translate(0,0) matrix(1,0,0,1,2.5,118.50000000000001)"><g><g transform="translate(0,0) scale(2.92,1.7899999999999998)"><g><path fill="#FFFFFF" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(0.3424657534246575,0.558659217877095)"><path fill="none" stroke="none" d="M 0 0 L 292 0 Q 292 0 292 0 L 292 178.99999999999997 Q 292 178.99999999999997 292 178.99999999999997 L 0 178.99999999999997 Q 0 178.99999999999997 0 178.99999999999997 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" d="M 0 0 M 0 0 L 2 0 M 2 0 M 4 0 L 6 0 M 6 0 M 8 0 L 10 0 M 10 0 M 12 0 L 14 0 M 14 0 M 16 0 L 18 0 M 18 0 M 20 0 L 22 0 M 22 0 M 24 0 L 26 0 M 26 0 M 28 0 L 30 0 M 30 0 M 32 0 L 34 0 M 34 0 M 36 0 L 38 0 M 38 0 M 40 0 L 42 0 M 42 0 M 44 0 L 46 0 M 46 0 M 48 0 L 50 0 M 50 0 M 52 0 L 54 0 M 54 0 M 56 0 L 58 0 M 58 0 M 60 0 L 62 0 M 62 0 M 64 0 L 66 0 M 66 0 M 68 0 L 70 0 M 70 0 M 72 0 L 74 0 M 74 0 M 76 0 L 78 0 M 78 0 M 80 0 L 82 0 M 82 0 M 84 0 L 86 0 M 86 0 M 88 0 L 90 0 M 90 0 M 92 0 L 94 0 M 94 0 M 96 0 L 98 0 M 98 0 M 100 0 L 102 0 M 102 0 M 104 0 L 106 0 M 106 0 M 108 0 L 110 0 M 110 0 M 112 0 L 114 0 M 114 0 M 116 0 L 118 0 M 118 0 M 120 0 L 122 0 M 122 0 M 124 0 L 126 0 M 126 0 M 128 0 L 130 0 M 130 0 M 132 0 L 134 0 M 134 0 M 136 0 L 138 0 M 138 0 M 140 0 L 142 0 M 142 0 M 144 0 L 146 0 M 146 0 M 148 0 L 150 0 M 150 0 M 152 0 L 154 0 M 154 0 M 156 0 L 158 0 M 158 0 M 160 0 L 162 0 M 162 0 M 164 0 L 166 0 M 166 0 M 168 0 L 170 0 M 170 0 M 172 0 L 174 0 M 174 0 M 176 0 L 178 0 M 178 0 M 180 0 L 182 0 M 182 0 M 184 0 L 186 0 M 186 0 M 188 0 L 190 0 M 190 0 M 192 0 L 194 0 M 194 0 M 196 0 L 198 0 M 198 0 M 200 0 L 202 0 M 202 0 M 204 0 L 206 0 M 206 0 M 208 0 L 210 0 M 210 0 M 212 0 L 214 0 M 214 0 M 216 0 L 218 0 M 218 0 M 220 0 L 222 0 M 222 0 M 224 0 L 226 0 M 226 0 M 228 0 L 230 0 M 230 0 M 232 0 L 234 0 M 234 0 M 236 0 L 238 0 M 238 0 M 240 0 L 242 0 M 242 0 M 244 0 L 246 0 M 246 0 M 248 0 L 250 0 M 250 0 M 252 0 L 254 0 M 254 0 M 256 0 L 258 0 M 258 0 M 260 0 L 262 0 M 262 0 M 264 0 L 266 0 M 266 0 M 268 0 L 270 0 M 270 0 M 272 0 L 274 0 M 274 0 M 276 0 L 278 0 M 278 0 M 280 0 L 282 0 M 282 0 M 284 0 L 286 0 M 286 0 M 288 0 L 290 0 M 290 0 M 292 0 L 292 0 Q 292 0 292 0 L 292 2 M 292 2 M 292 4 L 292 6 M 292 6 M 292 8 L 292 10 M 292 10 M 292 12 L 292 14 M 292 14 M 292 16 L 292 18 M 292 18 M 292 20 L 292 22 M 292 22 M 292 24 L 292 26 M 292 26 M 292 28 L 292 30 M 292 30 M 292 32 L 292 34 M 292 34 M 292 36 L 292 38 M 292 38 M 292 40 L 292 42 M 292 42 M 292 44 L 292 46 M 292 46 M 292 48 L 292 50 M 292 50 M 292 52 L 292 54 M 292 54 M 292 56 L 292 58 M 292 58 M 292 60 L 292 62 M 292 62 M 292 64 L 292 66 M 292 66 M 292 68 L 292 70 M 292 70 M 292 72 L 292 74 M 292 74 M 292 76 L 292 78 M 292 78 M 292 80 L 292 82 M 292 82 M 292 84 L 292 86 M 292 86 M 292 88 L 292 90 M 292 90 M 292 92 L 292 94 M 292 94 M 292 96 L 292 98 M 292 98 M 292 100 L 292 102 M 292 102 M 292 104 L 292 106 M 292 106 M 292 108 L 292 110 M 292 110 M 292 112 L 292 114 M 292 114 M 292 116 L 292 118 M 292 118 M 292 120 L 292 122 M 292 122 M 292 124 L 292 126 M 292 126 M 292 128 L 292 130 M 292 130 M 292 132 L 292 134 M 292 134 M 292 136 L 292 138 M 292 138 M 292 140 L 292 142 M 292 142 M 292 144 L 292 146 M 292 146 M 292 148 L 292 150 M 292 150 M 292 152 L 292 154 M 292 154 M 292 156 L 292 158 M 292 158 M 292 160 L 292 162 M 292 162 M 292 164 L 292 166 M 292 166 M 292 168 L 292 170 M 292 170 M 292 172 L 292 174 M 292 174 M 292 176 L 292 178 M 292 178 M 291 178.99999999999997 L 289 178.99999999999997 M 289 178.99999999999997 M 287 178.99999999999997 L 285 178.99999999999997 M 285 178.99999999999997 M 283 178.99999999999997 L 281 178.99999999999997 M 281 178.99999999999997 M 279 178.99999999999997 L 277 178.99999999999997 M 277 178.99999999999997 M 275 178.99999999999997 L 273 178.99999999999997 M 273 178.99999999999997 M 271 178.99999999999997 L 269 178.99999999999997 M 269 178.99999999999997 M 267 178.99999999999997 L 265 178.99999999999997 M 265 178.99999999999997 M 263 178.99999999999997 L 261 178.99999999999997 M 261 178.99999999999997 M 259 178.99999999999997 L 257 178.99999999999997 M 257 178.99999999999997 M 255 178.99999999999997 L 253 178.99999999999997 M 253 178.99999999999997 M 251 178.99999999999997 L 249 178.99999999999997 M 249 178.99999999999997 M 247 178.99999999999997 L 245 178.99999999999997 M 245 178.99999999999997 M 243 178.99999999999997 L 241 178.99999999999997 M 241 178.99999999999997 M 239 178.99999999999997 L 237 178.99999999999997 M 237 178.99999999999997 M 235 178.99999999999997 L 233 178.99999999999997 M 233 178.99999999999997 M 231 178.99999999999997 L 229 178.99999999999997 M 229 178.99999999999997 M 227 178.99999999999997 L 225 178.99999999999997 M 225 178.99999999999997 M 223 178.99999999999997 L 221 178.99999999999997 M 221 178.99999999999997 M 219 178.99999999999997 L 217 178.99999999999997 M 217 178.99999999999997 M 215 178.99999999999997 L 213 178.99999999999997 M 213 178.99999999999997 M 211 178.99999999999997 L 209 178.99999999999997 M 209 178.99999999999997 M 207 178.99999999999997 L 205 178.99999999999997 M 205 178.99999999999997 M 203 178.99999999999997 L 201 178.99999999999997 M 201 178.99999999999997 M 199 178.99999999999997 L 197 178.99999999999997 M 197 178.99999999999997 M 195 178.99999999999997 L 193 178.99999999999997 M 193 178.99999999999997 M 191 178.99999999999997 L 189 178.99999999999997 M 189 178.99999999999997 M 187 178.99999999999997 L 185 178.99999999999997 M 185 178.99999999999997 M 183 178.99999999999997 L 181 178.99999999999997 M 181 178.99999999999997 M 179 178.99999999999997 L 177 178.99999999999997 M 177 178.99999999999997 M 175 178.99999999999997 L 173 178.99999999999997 M 173 178.99999999999997 M 171 178.99999999999997 L 169 178.99999999999997 M 169 178.99999999999997 M 167 178.99999999999997 L 165 178.99999999999997 M 165 178.99999999999997 M 163 178.99999999999997 L 161 178.99999999999997 M 161 178.99999999999997 M 159 178.99999999999997 L 157 178.99999999999997 M 157 178.99999999999997 M 155 178.99999999999997 L 153 178.99999999999997 M 153 178.99999999999997 M 151 178.99999999999997 L 149 178.99999999999997 M 149 178.99999999999997 M 147 178.99999999999997 L 145 178.99999999999997 M 145 178.99999999999997 M 143 178.99999999999997 L 141 178.99999999999997 M 141 178.99999999999997 M 139 178.99999999999997 L 137 178.99999999999997 M 137 178.99999999999997 M 135 178.99999999999997 L 133 178.99999999999997 M 133 178.99999999999997 M 131 178.99999999999997 L 129 178.99999999999997 M 129 178.99999999999997 M 127 178.99999999999997 L 125 178.99999999999997 M 125 178.99999999999997 M 123 178.99999999999997 L 121 178.99999999999997 M 121 178.99999999999997 M 119 178.99999999999997 L 117 178.99999999999997 M 117 178.99999999999997 M 115 178.99999999999997 L 113 178.99999999999997 M 113 178.99999999999997 M 111 178.99999999999997 L 109 178.99999999999997 M 109 178.99999999999997 M 107 178.99999999999997 L 105 178.99999999999997 M 105 178.99999999999997 M 103 178.99999999999997 L 101 178.99999999999997 M 101 178.99999999999997 M 99 178.99999999999997 L 97 178.99999999999997 M 97 178.99999999999997 M 95 178.99999999999997 L 93 178.99999999999997 M 93 178.99999999999997 M 91 178.99999999999997 L 89 178.99999999999997 M 89 178.99999999999997 M 87 178.99999999999997 L 85 178.99999999999997 M 85 178.99999999999997 M 83 178.99999999999997 L 81 178.99999999999997 M 81 178.99999999999997 M 79 178.99999999999997 L 77 178.99999999999997 M 77 178.99999999999997 M 75 178.99999999999997 L 73 178.99999999999997 M 73 178.99999999999997 M 71 178.99999999999997 L 69 178.99999999999997 M 69 178.99999999999997 M 67 178.99999999999997 L 65 178.99999999999997 M 65 178.99999999999997 M 63 178.99999999999997 L 61 178.99999999999997 M 61 178.99999999999997 M 59 178.99999999999997 L 57 178.99999999999997 M 57 178.99999999999997 M 55 178.99999999999997 L 53 178.99999999999997 M 53 178.99999999999997 M 51 178.99999999999997 L 49 178.99999999999997 M 49 178.99999999999997 M 47 178.99999999999997 L 45 178.99999999999997 M 45 178.99999999999997 M 43 178.99999999999997 L 41 178.99999999999997 M 41 178.99999999999997 M 39 178.99999999999997 L 37 178.99999999999997 M 37 178.99999999999997 M 35 178.99999999999997 L 33 178.99999999999997 M 33 178.99999999999997 M 31 178.99999999999997 L 29 178.99999999999997 M 29 178.99999999999997 M 27 178.99999999999997 L 25 178.99999999999997 M 25 178.99999999999997 M 23 178.99999999999997 L 21 178.99999999999997 M 21 178.99999999999997 M 19 178.99999999999997 L 17 178.99999999999997 M 17 178.99999999999997 M 15 178.99999999999997 L 13 178.99999999999997 M 13 178.99999999999997 M 11 178.99999999999997 L 9 178.99999999999997 M 9 178.99999999999997 M 7 178.99999999999997 L 5 178.99999999999997 M 5 178.99999999999997 M 3 178.99999999999997 L 1 178.99999999999997 M 1 178.99999999999997 M 0 177.99999999999997 L 0 175.99999999999997 M 0 175.99999999999997 M 0 173.99999999999997 L 0 171.99999999999997 M 0 171.99999999999997 M 0 169.99999999999997 L 0 167.99999999999997 M 0 167.99999999999997 M 0 165.99999999999997 L 0 163.99999999999997 M 0 163.99999999999997 M 0 161.99999999999997 L 0 159.99999999999997 M 0 159.99999999999997 M 0 157.99999999999997 L 0 155.99999999999997 M 0 155.99999999999997 M 0 153.99999999999997 L 0 151.99999999999997 M 0 151.99999999999997 M 0 149.99999999999997 L 0 147.99999999999997 M 0 147.99999999999997 M 0 145.99999999999997 L 0 143.99999999999997 M 0 143.99999999999997 M 0 141.99999999999997 L 0 139.99999999999997 M 0 139.99999999999997 M 0 137.99999999999997 L 0 135.99999999999997 M 0 135.99999999999997 M 0 133.99999999999997 L 0 131.99999999999997 M 0 131.99999999999997 M 0 129.99999999999997 L 0 127.99999999999997 M 0 127.99999999999997 M 0 125.99999999999997 L 0 123.99999999999997 M 0 123.99999999999997 M 0 121.99999999999997 L 0 119.99999999999997 M 0 119.99999999999997 M 0 117.99999999999997 L 0 115.99999999999997 M 0 115.99999999999997 M 0 113.99999999999997 L 0 111.99999999999997 M 0 111.99999999999997 M 0 109.99999999999997 L 0 107.99999999999997 M 0 107.99999999999997 M 0 105.99999999999997 L 0 103.99999999999997 M 0 103.99999999999997 M 0 101.99999999999997 L 0 99.99999999999997 M 0 99.99999999999997 M 0 97.99999999999997 L 0 95.99999999999997 M 0 95.99999999999997 M 0 93.99999999999997 L 0 91.99999999999997 M 0 91.99999999999997 M 0 89.99999999999997 L 0 87.99999999999997 M 0 87.99999999999997 M 0 85.99999999999997 L 0 83.99999999999997 M 0 83.99999999999997 M 0 81.99999999999997 L 0 79.99999999999997 M 0 79.99999999999997 M 0 77.99999999999997 L 0 75.99999999999997 M 0 75.99999999999997 M 0 73.99999999999997 L 0 71.99999999999997 M 0 71.99999999999997 M 0 69.99999999999997 L 0 67.99999999999997 M 0 67.99999999999997 M 0 65.99999999999997 L 0 63.99999999999997 M 0 63.99999999999997 M 0 61.99999999999997 L 0 59.99999999999997 M 0 59.99999999999997 M 0 57.99999999999997 L 0 55.99999999999997 M 0 55.99999999999997 M 0 53.99999999999997 L 0 51.99999999999997 M 0 51.99999999999997 M 0 49.99999999999997 L 0 47.99999999999997 M 0 47.99999999999997 M 0 45.99999999999997 L 0 43.99999999999997 M 0 43.99999999999997 M 0 41.99999999999997 L 0 39.99999999999997 M 0 39.99999999999997 M 0 37.99999999999997 L 0 35.99999999999997 M 0 35.99999999999997 M 0 33.99999999999997 L 0 31.99999999999997 M 0 31.99999999999997 M 0 29.99999999999997 L 0 27.99999999999997 M 0 27.99999999999997 M 0 25.99999999999997 L 0 23.99999999999997 M 0 23.99999999999997 M 0 21.99999999999997 L 0 19.99999999999997 M 0 19.99999999999997 M 0 17.99999999999997 L 0 15.999999999999972 M 0 15.999999999999972 M 0 13.999999999999972 L 0 11.999999999999972 M 0 11.999999999999972 M 0 9.999999999999972 L 0 7.999999999999972 M 0 7.999999999999972 M 0 5.999999999999972 L 0 3.9999999999999716 M 0 3.9999999999999716 M 0 1.9999999999999716 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,82.5,44)"><g transform="translate(0,0)"><g transform="translate(-87,-150) translate(4.5,106) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#cccccc" d="M 88 149 L 87 48.5" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g><g transform="translate(0,0) matrix(1,0,0,1,313,40)"><g><g transform="translate(0,0) scale(2.37,3.01)"><g><path fill="#FFFFFF" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(0.42194092827004215,0.33222591362126247)"><path fill="none" stroke="none" d="M 0 0 L 237 0 Q 237 0 237 0 L 237 301 Q 237 301 237 301 L 0 301 Q 0 301 0 301 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" d="M 0 0 M 0 0 L 1.9999999999999998 0 M 1.9999999999999998 0 M 4 0 L 6 0 M 6 0 M 8 0 L 10 0 M 10 0 M 12 0 L 14 0 M 14 0 M 16 0 L 18 0 M 18 0 M 20 0 L 22 0 M 22 0 M 24 0 L 26 0 M 26 0 M 28 0 L 30 0 M 30 0 M 32 0 L 34 0 M 34 0 M 36 0 L 38 0 M 38 0 M 40 0 L 42 0 M 42 0 M 44 0 L 46 0 M 46 0 M 48 0 L 50 0 M 50 0 M 52 0 L 54 0 M 54 0 M 56 0 L 58 0 M 58 0 M 60 0 L 62 0 M 62 0 M 64 0 L 66 0 M 66 0 M 68 0 L 70 0 M 70 0 M 72 0 L 74 0 M 74 0 M 76 0 L 78 0 M 78 0 M 80 0 L 82 0 M 82 0 M 84 0 L 86 0 M 86 0 M 88 0 L 90 0 M 90 0 M 92 0 L 94 0 M 94 0 M 96 0 L 98 0 M 98 0 M 100 0 L 102 0 M 102 0 M 104 0 L 106 0 M 106 0 M 108 0 L 110 0 M 110 0 M 112 0 L 114 0 M 114 0 M 116 0 L 118 0 M 118 0 M 120 0 L 122 0 M 122 0 M 124 0 L 126 0 M 126 0 M 128 0 L 130 0 M 130 0 M 132 0 L 134 0 M 134 0 M 136 0 L 138 0 M 138 0 M 140 0 L 142 0 M 142 0 M 144 0 L 146 0 M 146 0 M 148 0 L 150 0 M 150 0 M 152 0 L 154 0 M 154 0 M 156 0 L 158 0 M 158 0 M 160 0 L 162 0 M 162 0 M 164 0 L 166 0 M 166 0 M 168 0 L 170 0 M 170 0 M 172 0 L 174 0 M 174 0 M 176 0 L 178 0 M 178 0 M 180 0 L 182 0 M 182 0 M 184 0 L 186 0 M 186 0 M 188 0 L 190 0 M 190 0 M 192 0 L 194 0 M 194 0 M 196 0 L 198 0 M 198 0 M 200 0 L 202 0 M 202 0 M 204 0 L 206 0 M 206 0 M 208 0 L 210 0 M 210 0 M 212 0 L 214 0 M 214 0 M 216 0 L 218 0 M 218 0 M 220 0 L 222 0 M 222 0 M 224 0 L 226 0 M 226 0 M 228 0 L 230 0 M 230 0 M 232 0 L 234 0 M 234 0 M 236 0 L 237 0 Q 237 0 237 0 L 237 1 M 237 1 M 237 3 L 237 5 M 237 5 M 237 7 L 237 9 M 237 9 M 237 11 L 237 13 M 237 13 M 237 15 L 237 17 M 237 17 M 237 19 L 237 21 M 237 21 M 237 23 L 237 25 M 237 25 M 237 27 L 237 29 M 237 29 M 237 31 L 237 33 M 237 33 M 237 35 L 237 37 M 237 37 M 237 39 L 237 41 M 237 41 M 237 43 L 237 45 M 237 45 M 237 47 L 237 49 M 237 49 M 237 51 L 237 53 M 237 53 M 237 55 L 237 57 M 237 57 M 237 59 L 237 61 M 237 61 M 237 63 L 237 65 M 237 65 M 237 67 L 237 69 M 237 69 M 237 71 L 237 73 M 237 73 M 237 75 L 237 77 M 237 77 M 237 79 L 237 81 M 237 81 M 237 83 L 237 85 M 237 85 M 237 87 L 237 89 M 237 89 M 237 91 L 237 93 M 237 93 M 237 95 L 237 97 M 237 97 M 237 99 L 237 101 M 237 101 M 237 103 L 237 105 M 237 105 M 237 107 L 237 109 M 237 109 M 237 111 L 237 113 M 237 113 M 237 115 L 237 117 M 237 117 M 237 119 L 237 121 M 237 121 M 237 123 L 237 125 M 237 125 M 237 127 L 237 129 M 237 129 M 237 131 L 237 133 M 237 133 M 237 135 L 237 137 M 237 137 M 237 139 L 237 141 M 237 141 M 237 143 L 237 145 M 237 145 M 237 147 L 237 149 M 237 149 M 237 151 L 237 153 M 237 153 M 237 155 L 237 157 M 237 157 M 237 159 L 237 161 M 237 161 M 237 163 L 237 165 M 237 165 M 237 167 L 237 169 M 237 169 M 237 171 L 237 173 M 237 173 M 237 175 L 237 177 M 237 177 M 237 179 L 237 181 M 237 181 M 237 183 L 237 185 M 237 185 M 237 187 L 237 189 M 237 189 M 237 191 L 237 193 M 237 193 M 237 195 L 237 197 M 237 197 M 237 199 L 237 201 M 237 201 M 237 203 L 237 205 M 237 205 M 237 207 L 237 209 M 237 209 M 237 211 L 237 213 M 237 213 M 237 215 L 237 217 M 237 217 M 237 219 L 237 221 M 237 221 M 237 223 L 237 225 M 237 225 M 237 227 L 237 229 M 237 229 M 237 231 L 237 233 M 237 233 M 237 235 L 237 237 M 237 237 M 237 239 L 237 241 M 237 241 M 237 243 L 237 245 M 237 245 M 237 247 L 237 249 M 237 249 M 237 251 L 237 253 M 237 253 M 237 255 L 237 257 M 237 257 M 237 259 L 237 261 M 237 261 M 237 263 L 237 265 M 237 265 M 237 267 L 237 269 M 237 269 M 237 271 L 237 273 M 237 273 M 237 275 L 237 277 M 237 277 M 237 279 L 237 281 M 237 281 M 237 283 L 237 285 M 237 285 M 237 287 L 237 289 M 237 289 M 237 291 L 237 293 M 237 293 M 237 295 L 237 297 M 237 297 M 237 299 L 237 301 M 237 301 M 235 301 L 233 301 M 233 301 M 231 301 L 229 301 M 229 301 M 227 301 L 225 301 M 225 301 M 223 301 L 221 301 M 221 301 M 219 301 L 217 301 M 217 301 M 215 301 L 213 301 M 213 301 M 211 301 L 209 301 M 209 301 M 207 301 L 205 301 M 205 301 M 203 301 L 201 301 M 201 301 M 199 301 L 197 301 M 197 301 M 195 301 L 193 301 M 193 301 M 191 301 L 189 301 M 189 301 M 187 301 L 185 301 M 185 301 M 183 301 L 181 301 M 181 301 M 179 301 L 177 301 M 177 301 M 175 301 L 173 301 M 173 301 M 171 301 L 169 301 M 169 301 M 167 301 L 165 301 M 165 301 M 163 301 L 161 301 M 161 301 M 159 301 L 157 301 M 157 301 M 155 301 L 153 301 M 153 301 M 151 301 L 149 301 M 149 301 M 147 301 L 145 301 M 145 301 M 143 301 L 141 301 M 141 301 M 139 301 L 137 301 M 137 301 M 135 301 L 133 301 M 133 301 M 131 301 L 129 301 M 129 301 M 127 301 L 125 301 M 125 301 M 123 301 L 121 301 M 121 301 M 119 301 L 117 301 M 117 301 M 115 301 L 113 301 M 113 301 M 111 301 L 109 301 M 109 301 M 107 301 L 105 301 M 105 301 M 103 301 L 101 301 M 101 301 M 99 301 L 97 301 M 97 301 M 95 301 L 93 301 M 93 301 M 91 301 L 89 301 M 89 301 M 87 301 L 85 301 M 85 301 M 83 301 L 81 301 M 81 301 M 79 301 L 77 301 M 77 301 M 75 301 L 73 301 M 73 301 M 71 301 L 69 301 M 69 301 M 67 301 L 65 301 M 65 301 M 63 301 L 61 301 M 61 301 M 59 301 L 57 301 M 57 301 M 55 301 L 53 301 M 53 301 M 51 301 L 49 301 M 49 301 M 47 301 L 45 301 M 45 301 M 43 301 L 41 301 M 41 301 M 39 301 L 37 301 M 37 301 M 35 301 L 33 301 M 33 301 M 31 301 L 29 301 M 29 301 M 27 301 L 25 301 M 25 301 M 23 301 L 21 301 M 21 301 M 19 301 L 17 301 M 17 301 M 15 301 L 13 301 M 13 301 M 11 301 L 9 301 M 9 301 M 7 301 L 5 301 M 5 301 M 3 301 L 1 301 M 1 301 M 0 300 L 0 298 M 0 298 M 0 296 L 0 294 M 0 294 M 0 292 L 0 290 M 0 290 M 0 288 L 0 286 M 0 286 M 0 284 L 0 282 M 0 282 M 0 280 L 0 278 M 0 278 M 0 276 L 0 274 M 0 274 M 0 272 L 0 270 M 0 270 M 0 268 L 0 266 M 0 266 M 0 264 L 0 262 M 0 262 M 0 260 L 0 258 M 0 258 M 0 256 L 0 254 M 0 254 M 0 252 L 0 250 M 0 250 M 0 248 L 0 246 M 0 246 M 0 244 L 0 242 M 0 242 M 0 240 L 0 238 M 0 238 M 0 236 L 0 234 M 0 234 M 0 232 L 0 230 M 0 230 M 0 228 L 0 226 M 0 226 M 0 224 L 0 222 M 0 222 M 0 220 L 0 218 M 0 218 M 0 216 L 0 214 M 0 214 M 0 212 L 0 210 M 0 210 M 0 208 L 0 206 M 0 206 M 0 204 L 0 202 M 0 202 M 0 200 L 0 198 M 0 198 M 0 196 L 0 194 M 0 194 M 0 192 L 0 190 M 0 190 M 0 188 L 0 186 M 0 186 M 0 184 L 0 182 M 0 182 M 0 180 L 0 178 M 0 178 M 0 176 L 0 174 M 0 174 M 0 172 L 0 170 M 0 170 M 0 168 L 0 166 M 0 166 M 0 164 L 0 162 M 0 162 M 0 160 L 0 158 M 0 158 M 0 156 L 0 154 M 0 154 M 0 152 L 0 150 M 0 150 M 0 148 L 0 146 M 0 146 M 0 144 L 0 142 M 0 142 M 0 140 L 0 138 M 0 138 M 0 136 L 0 134 M 0 134 M 0 132 L 0 130 M 0 130 M 0 128 L 0 126 M 0 126 M 0 124 L 0 122 M 0 122 M 0 120 L 0 118 M 0 118 M 0 116 L 0 114 M 0 114 M 0 112 L 0 110 M 0 110 M 0 108 L 0 106 M 0 106 M 0 104 L 0 102 M 0 102 M 0 100 L 0 98 M 0 98 M 0 96 L 0 94 M 0 94 M 0 92 L 0 90 M 0 90 M 0 88 L 0 86 M 0 86 M 0 84 L 0 82 M 0 82 M 0 80 L 0 78 M 0 78 M 0 76 L 0 74 M 0 74 M 0 72 L 0 70 M 0 70 M 0 68 L 0 66 M 0 66 M 0 64 L 0 62 M 0 62 M 0 60 L 0 58 M 0 58 M 0 56 L 0 54 M 0 54 M 0 52 L 0 50 M 0 50 M 0 48 L 0 46 M 0 46 M 0 44 L 0 42 M 0 42 M 0 40 L 0 38 M 0 38 M 0 36 L 0 34 M 0 34 M 0 32 L 0 30 M 0 30 M 0 28 L 0 26 M 0 26 M 0 24 L 0 22 M 0 22 M 0 20 L 0 18 M 0 18 M 0 16 L 0 14 M 0 14 M 0 12 L 0 10 M 0 10 M 0 8 L 0 6 M 0 6 M 0 4 L 0 2 M 0 2 M 0 0 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,133.5,111)"><g transform="translate(0,0)"><g transform="translate(138,-129) translate(-271.5,18) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#cccccc" d="M 138 170.96699141100893 L 382 115.5" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g><g transform="matrix(1,0,0,1,133.49999999999997,197.53300858899107)"><g transform="translate(0,0)"><g transform="translate(118,-123) translate(-251.49999999999997,-74.53300858899107) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#cccccc" d="M 137.99999999999997 202.03300858899107 L 382.1250000000001 252.5" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g><g transform="translate(0,0) matrix(1,0,0,1,38,149)"><g transform="translate(4,4) scale(1.01,1.0133333333333334)"><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="#000000" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" opacity="0.294117647"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="rgb(0,0,0)" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-opacity="0" stroke-miterlimit="10" stroke-width="2" opacity="0.294117647"/></g></g></g></g></g><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="url(#ELZfsiqoWTlJ)" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="url(#ELZfsiqoWTlJ)" stroke="#333333" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="scale(1,1) matrix(1,0,0,1,40,149) translate(8,30.5)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="25.322265625" y="11">host1</text></g><g transform="scale(1,1) matrix(1,0,0,1,13,132.5) translate(2,0)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="19.6181640625" y="11">eth0 2001:db8::1/80</text></g><g transform="scale(1,1) matrix(1,0,0,1,120,178.5) translate(2,0)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="23.2978515625" y="11">docker0 fe80::1/64</text></g><g transform="scale(1,1) matrix(1,0,0,1,15.125000000000057,261) translate(2,0)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="0" y="11">route -A inet6 default gw fe80::1 dev eth0</text><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="10.7470703125" y="25">route -A inet6 2001:db8:0:0:1::/80 d</text><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="199.5537109375" y="25">ev docker0</text></g><g transform="translate(0,0) matrix(1,0,0,1,382,65.5)"><g transform="translate(4,4) scale(1.01,1.01)"><g><g transform="translate(0,0) scale(1,1)"><g><path fill="#000000" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" opacity="0.294117647"/><g transform="scale(1,1)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="rgb(0,0,0)" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" stroke-opacity="0" stroke-miterlimit="10" stroke-width="2" opacity="0.294117647"/></g></g></g></g></g><g><g transform="translate(0,0) scale(1,1)"><g><path fill="url(#LRIZIyfLhGTN)" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><path fill="url(#LRIZIyfLhGTN)" stroke="#333333" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="scale(1,1) matrix(1,0,0,1,384,65.5) translate(8,43)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="6.6455078125" y="11">container1-1</text></g><g transform="translate(0,0) matrix(1,0,0,1,382.1250000000001,202.5)"><g transform="translate(4,4) scale(1.01,1.01)"><g><g transform="translate(0,0) scale(1,1)"><g><path fill="#000000" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" opacity="0.294117647"/><g transform="scale(1,1)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="rgb(0,0,0)" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" stroke-opacity="0" stroke-miterlimit="10" stroke-width="2" opacity="0.294117647"/></g></g></g></g></g><g><g transform="translate(0,0) scale(1,1)"><g><path fill="url(#mhyHooPGpGXu)" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><path fill="url(#mhyHooPGpGXu)" stroke="#333333" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="scale(1,1) matrix(1,0,0,1,384.1250000000001,202.5) translate(8,43)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="6.6455078125" y="11">container1-2</text></g><g transform="scale(1,1) matrix(1,0,0,1,351,49.5) translate(2,0)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="15.1064453125" y="11">eth0 2001:db8:0:0:1::1/80</text></g><g transform="scale(1,1) matrix(1,0,0,1,352,185.5) translate(2,0)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="14.1064453125" y="11">eth0 2001:db8:0:0:1::2/80</text></g><g transform="scale(1,1) matrix(1,0,0,1,313,313) translate(2,0)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="5.759765625" y="11">route -A inet6 default gw fe80::1 dev eth0</text></g><g transform="scale(1,1) matrix(1,0,0,1,89.5,83.5) translate(2,0)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="italic" font-weight="normal" text-decoration="none" x="0" y="11">Routed Network:</text><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="italic" font-weight="normal" text-decoration="none" x="0" y="25">2001:db8::/64</text></g><g transform="translate(0,0) matrix(1,0,0,1,37,2.5)"><g transform="translate(4,4) scale(1.01,1.0217391304347827)"><g><g transform="translate(0,0) scale(1,0.46)"><g><path fill="#000000" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" opacity="0.294117647"/><g transform="scale(1,2.1739130434782608)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 46 Q 100 46 100 46 L 0 46 Q 0 46 0 46 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="rgb(0,0,0)" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 46 Q 100 46 100 46 L 0 46 Q 0 46 0 46 L 0 0 Q 0 0 0 0 Z" stroke-opacity="0" stroke-miterlimit="10" stroke-width="2" opacity="0.294117647"/></g></g></g></g></g><g><g transform="translate(0,0) scale(1,0.46)"><g><path fill="url(#yGMyvOlKqDXf)" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,2.1739130434782608)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 46 Q 100 46 100 46 L 0 46 Q 0 46 0 46 L 0 0 Q 0 0 0 0 Z"/><path fill="url(#yGMyvOlKqDXf)" stroke="#333333" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 46 Q 100 46 100 46 L 0 46 Q 0 46 0 46 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="scale(1,1) matrix(1,0,0,1,39,2.5) translate(8,16)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="21.9912109375" y="11">Router</text></g><g transform="scale(1,1) matrix(1,0,0,1,10.5,53.5) translate(2,0)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="46.310546875" y="11">fe80::1/64</text></g></g></svg> \ No newline at end of file
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="570" height="361"><style xmlns="http://www.w3.org/1999/xhtml"></style><defs><linearGradient id="MVLBsVARSTmi" x1="0px" x2="0px" y1="100px" y2="-50px" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#a4c2f4"/><stop offset="1" stop-color="#FFFFFF"/></linearGradient><linearGradient id="idliOCdyLFTX" x1="0px" x2="0px" y1="100px" y2="-50px" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ead1dc"/><stop offset="1" stop-color="#FFFFFF"/></linearGradient><linearGradient id="eprnSotBuoMn" x1="0px" x2="0px" y1="100px" y2="-50px" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ead1dc"/><stop offset="1" stop-color="#FFFFFF"/></linearGradient><linearGradient id="iWDbcgPdOTMR" x1="0px" x2="0px" y1="100px" y2="-50px" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#d9d9d9"/><stop offset="1" stop-color="#FFFFFF"/></linearGradient></defs><g transform="translate(0,0)"><g><rect fill="#FFFFFF" stroke="none" x="0" y="0" width="570" height="361"/></g><g transform="translate(0,0) matrix(1,0,0,1,2.5,118.50000000000001)"><g><g transform="translate(0,0) scale(2.92,1.7899999999999998)"><g><path fill="#FFFFFF" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(0.3424657534246575,0.558659217877095)"><path fill="none" stroke="none" d="M 0 0 L 292 0 Q 292 0 292 0 L 292 178.99999999999997 Q 292 178.99999999999997 292 178.99999999999997 L 0 178.99999999999997 Q 0 178.99999999999997 0 178.99999999999997 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" d="M 0 0 M 0 0 L 2 0 M 2 0 M 4 0 L 6 0 M 6 0 M 8 0 L 10 0 M 10 0 M 12 0 L 14 0 M 14 0 M 16 0 L 18 0 M 18 0 M 20 0 L 22 0 M 22 0 M 24 0 L 26 0 M 26 0 M 28 0 L 30 0 M 30 0 M 32 0 L 34 0 M 34 0 M 36 0 L 38 0 M 38 0 M 40 0 L 42 0 M 42 0 M 44 0 L 46 0 M 46 0 M 48 0 L 50 0 M 50 0 M 52 0 L 54 0 M 54 0 M 56 0 L 58 0 M 58 0 M 60 0 L 62 0 M 62 0 M 64 0 L 66 0 M 66 0 M 68 0 L 70 0 M 70 0 M 72 0 L 74 0 M 74 0 M 76 0 L 78 0 M 78 0 M 80 0 L 82 0 M 82 0 M 84 0 L 86 0 M 86 0 M 88 0 L 90 0 M 90 0 M 92 0 L 94 0 M 94 0 M 96 0 L 98 0 M 98 0 M 100 0 L 102 0 M 102 0 M 104 0 L 106 0 M 106 0 M 108 0 L 110 0 M 110 0 M 112 0 L 114 0 M 114 0 M 116 0 L 118 0 M 118 0 M 120 0 L 122 0 M 122 0 M 124 0 L 126 0 M 126 0 M 128 0 L 130 0 M 130 0 M 132 0 L 134 0 M 134 0 M 136 0 L 138 0 M 138 0 M 140 0 L 142 0 M 142 0 M 144 0 L 146 0 M 146 0 M 148 0 L 150 0 M 150 0 M 152 0 L 154 0 M 154 0 M 156 0 L 158 0 M 158 0 M 160 0 L 162 0 M 162 0 M 164 0 L 166 0 M 166 0 M 168 0 L 170 0 M 170 0 M 172 0 L 174 0 M 174 0 M 176 0 L 178 0 M 178 0 M 180 0 L 182 0 M 182 0 M 184 0 L 186 0 M 186 0 M 188 0 L 190 0 M 190 0 M 192 0 L 194 0 M 194 0 M 196 0 L 198 0 M 198 0 M 200 0 L 202 0 M 202 0 M 204 0 L 206 0 M 206 0 M 208 0 L 210 0 M 210 0 M 212 0 L 214 0 M 214 0 M 216 0 L 218 0 M 218 0 M 220 0 L 222 0 M 222 0 M 224 0 L 226 0 M 226 0 M 228 0 L 230 0 M 230 0 M 232 0 L 234 0 M 234 0 M 236 0 L 238 0 M 238 0 M 240 0 L 242 0 M 242 0 M 244 0 L 246 0 M 246 0 M 248 0 L 250 0 M 250 0 M 252 0 L 254 0 M 254 0 M 256 0 L 258 0 M 258 0 M 260 0 L 262 0 M 262 0 M 264 0 L 266 0 M 266 0 M 268 0 L 270 0 M 270 0 M 272 0 L 274 0 M 274 0 M 276 0 L 278 0 M 278 0 M 280 0 L 282 0 M 282 0 M 284 0 L 286 0 M 286 0 M 288 0 L 290 0 M 290 0 M 292 0 L 292 0 Q 292 0 292 0 L 292 2 M 292 2 M 292 4 L 292 6 M 292 6 M 292 8 L 292 10 M 292 10 M 292 12 L 292 14 M 292 14 M 292 16 L 292 18 M 292 18 M 292 20 L 292 22 M 292 22 M 292 24 L 292 26 M 292 26 M 292 28 L 292 30 M 292 30 M 292 32 L 292 34 M 292 34 M 292 36 L 292 38 M 292 38 M 292 40 L 292 42 M 292 42 M 292 44 L 292 46 M 292 46 M 292 48 L 292 50 M 292 50 M 292 52 L 292 54 M 292 54 M 292 56 L 292 58 M 292 58 M 292 60 L 292 62 M 292 62 M 292 64 L 292 66 M 292 66 M 292 68 L 292 70 M 292 70 M 292 72 L 292 74 M 292 74 M 292 76 L 292 78 M 292 78 M 292 80 L 292 82 M 292 82 M 292 84 L 292 86 M 292 86 M 292 88 L 292 90 M 292 90 M 292 92 L 292 94 M 292 94 M 292 96 L 292 98 M 292 98 M 292 100 L 292 102 M 292 102 M 292 104 L 292 106 M 292 106 M 292 108 L 292 110 M 292 110 M 292 112 L 292 114 M 292 114 M 292 116 L 292 118 M 292 118 M 292 120 L 292 122 M 292 122 M 292 124 L 292 126 M 292 126 M 292 128 L 292 130 M 292 130 M 292 132 L 292 134 M 292 134 M 292 136 L 292 138 M 292 138 M 292 140 L 292 142 M 292 142 M 292 144 L 292 146 M 292 146 M 292 148 L 292 150 M 292 150 M 292 152 L 292 154 M 292 154 M 292 156 L 292 158 M 292 158 M 292 160 L 292 162 M 292 162 M 292 164 L 292 166 M 292 166 M 292 168 L 292 170 M 292 170 M 292 172 L 292 174 M 292 174 M 292 176 L 292 178 M 292 178 M 291 178.99999999999997 L 289 178.99999999999997 M 289 178.99999999999997 M 287 178.99999999999997 L 285 178.99999999999997 M 285 178.99999999999997 M 283 178.99999999999997 L 281 178.99999999999997 M 281 178.99999999999997 M 279 178.99999999999997 L 277 178.99999999999997 M 277 178.99999999999997 M 275 178.99999999999997 L 273 178.99999999999997 M 273 178.99999999999997 M 271 178.99999999999997 L 269 178.99999999999997 M 269 178.99999999999997 M 267 178.99999999999997 L 265 178.99999999999997 M 265 178.99999999999997 M 263 178.99999999999997 L 261 178.99999999999997 M 261 178.99999999999997 M 259 178.99999999999997 L 257 178.99999999999997 M 257 178.99999999999997 M 255 178.99999999999997 L 253 178.99999999999997 M 253 178.99999999999997 M 251 178.99999999999997 L 249 178.99999999999997 M 249 178.99999999999997 M 247 178.99999999999997 L 245 178.99999999999997 M 245 178.99999999999997 M 243 178.99999999999997 L 241 178.99999999999997 M 241 178.99999999999997 M 239 178.99999999999997 L 237 178.99999999999997 M 237 178.99999999999997 M 235 178.99999999999997 L 233 178.99999999999997 M 233 178.99999999999997 M 231 178.99999999999997 L 229 178.99999999999997 M 229 178.99999999999997 M 227 178.99999999999997 L 225 178.99999999999997 M 225 178.99999999999997 M 223 178.99999999999997 L 221 178.99999999999997 M 221 178.99999999999997 M 219 178.99999999999997 L 217 178.99999999999997 M 217 178.99999999999997 M 215 178.99999999999997 L 213 178.99999999999997 M 213 178.99999999999997 M 211 178.99999999999997 L 209 178.99999999999997 M 209 178.99999999999997 M 207 178.99999999999997 L 205 178.99999999999997 M 205 178.99999999999997 M 203 178.99999999999997 L 201 178.99999999999997 M 201 178.99999999999997 M 199 178.99999999999997 L 197 178.99999999999997 M 197 178.99999999999997 M 195 178.99999999999997 L 193 178.99999999999997 M 193 178.99999999999997 M 191 178.99999999999997 L 189 178.99999999999997 M 189 178.99999999999997 M 187 178.99999999999997 L 185 178.99999999999997 M 185 178.99999999999997 M 183 178.99999999999997 L 181 178.99999999999997 M 181 178.99999999999997 M 179 178.99999999999997 L 177 178.99999999999997 M 177 178.99999999999997 M 175 178.99999999999997 L 173 178.99999999999997 M 173 178.99999999999997 M 171 178.99999999999997 L 169 178.99999999999997 M 169 178.99999999999997 M 167 178.99999999999997 L 165 178.99999999999997 M 165 178.99999999999997 M 163 178.99999999999997 L 161 178.99999999999997 M 161 178.99999999999997 M 159 178.99999999999997 L 157 178.99999999999997 M 157 178.99999999999997 M 155 178.99999999999997 L 153 178.99999999999997 M 153 178.99999999999997 M 151 178.99999999999997 L 149 178.99999999999997 M 149 178.99999999999997 M 147 178.99999999999997 L 145 178.99999999999997 M 145 178.99999999999997 M 143 178.99999999999997 L 141 178.99999999999997 M 141 178.99999999999997 M 139 178.99999999999997 L 137 178.99999999999997 M 137 178.99999999999997 M 135 178.99999999999997 L 133 178.99999999999997 M 133 178.99999999999997 M 131 178.99999999999997 L 129 178.99999999999997 M 129 178.99999999999997 M 127 178.99999999999997 L 125 178.99999999999997 M 125 178.99999999999997 M 123 178.99999999999997 L 121 178.99999999999997 M 121 178.99999999999997 M 119 178.99999999999997 L 117 178.99999999999997 M 117 178.99999999999997 M 115 178.99999999999997 L 113 178.99999999999997 M 113 178.99999999999997 M 111 178.99999999999997 L 109 178.99999999999997 M 109 178.99999999999997 M 107 178.99999999999997 L 105 178.99999999999997 M 105 178.99999999999997 M 103 178.99999999999997 L 101 178.99999999999997 M 101 178.99999999999997 M 99 178.99999999999997 L 97 178.99999999999997 M 97 178.99999999999997 M 95 178.99999999999997 L 93 178.99999999999997 M 93 178.99999999999997 M 91 178.99999999999997 L 89 178.99999999999997 M 89 178.99999999999997 M 87 178.99999999999997 L 85 178.99999999999997 M 85 178.99999999999997 M 83 178.99999999999997 L 81 178.99999999999997 M 81 178.99999999999997 M 79 178.99999999999997 L 77 178.99999999999997 M 77 178.99999999999997 M 75 178.99999999999997 L 73 178.99999999999997 M 73 178.99999999999997 M 71 178.99999999999997 L 69 178.99999999999997 M 69 178.99999999999997 M 67 178.99999999999997 L 65 178.99999999999997 M 65 178.99999999999997 M 63 178.99999999999997 L 61 178.99999999999997 M 61 178.99999999999997 M 59 178.99999999999997 L 57 178.99999999999997 M 57 178.99999999999997 M 55 178.99999999999997 L 53 178.99999999999997 M 53 178.99999999999997 M 51 178.99999999999997 L 49 178.99999999999997 M 49 178.99999999999997 M 47 178.99999999999997 L 45 178.99999999999997 M 45 178.99999999999997 M 43 178.99999999999997 L 41 178.99999999999997 M 41 178.99999999999997 M 39 178.99999999999997 L 37 178.99999999999997 M 37 178.99999999999997 M 35 178.99999999999997 L 33 178.99999999999997 M 33 178.99999999999997 M 31 178.99999999999997 L 29 178.99999999999997 M 29 178.99999999999997 M 27 178.99999999999997 L 25 178.99999999999997 M 25 178.99999999999997 M 23 178.99999999999997 L 21 178.99999999999997 M 21 178.99999999999997 M 19 178.99999999999997 L 17 178.99999999999997 M 17 178.99999999999997 M 15 178.99999999999997 L 13 178.99999999999997 M 13 178.99999999999997 M 11 178.99999999999997 L 9 178.99999999999997 M 9 178.99999999999997 M 7 178.99999999999997 L 5 178.99999999999997 M 5 178.99999999999997 M 3 178.99999999999997 L 1 178.99999999999997 M 1 178.99999999999997 M 0 177.99999999999997 L 0 175.99999999999997 M 0 175.99999999999997 M 0 173.99999999999997 L 0 171.99999999999997 M 0 171.99999999999997 M 0 169.99999999999997 L 0 167.99999999999997 M 0 167.99999999999997 M 0 165.99999999999997 L 0 163.99999999999997 M 0 163.99999999999997 M 0 161.99999999999997 L 0 159.99999999999997 M 0 159.99999999999997 M 0 157.99999999999997 L 0 155.99999999999997 M 0 155.99999999999997 M 0 153.99999999999997 L 0 151.99999999999997 M 0 151.99999999999997 M 0 149.99999999999997 L 0 147.99999999999997 M 0 147.99999999999997 M 0 145.99999999999997 L 0 143.99999999999997 M 0 143.99999999999997 M 0 141.99999999999997 L 0 139.99999999999997 M 0 139.99999999999997 M 0 137.99999999999997 L 0 135.99999999999997 M 0 135.99999999999997 M 0 133.99999999999997 L 0 131.99999999999997 M 0 131.99999999999997 M 0 129.99999999999997 L 0 127.99999999999997 M 0 127.99999999999997 M 0 125.99999999999997 L 0 123.99999999999997 M 0 123.99999999999997 M 0 121.99999999999997 L 0 119.99999999999997 M 0 119.99999999999997 M 0 117.99999999999997 L 0 115.99999999999997 M 0 115.99999999999997 M 0 113.99999999999997 L 0 111.99999999999997 M 0 111.99999999999997 M 0 109.99999999999997 L 0 107.99999999999997 M 0 107.99999999999997 M 0 105.99999999999997 L 0 103.99999999999997 M 0 103.99999999999997 M 0 101.99999999999997 L 0 99.99999999999997 M 0 99.99999999999997 M 0 97.99999999999997 L 0 95.99999999999997 M 0 95.99999999999997 M 0 93.99999999999997 L 0 91.99999999999997 M 0 91.99999999999997 M 0 89.99999999999997 L 0 87.99999999999997 M 0 87.99999999999997 M 0 85.99999999999997 L 0 83.99999999999997 M 0 83.99999999999997 M 0 81.99999999999997 L 0 79.99999999999997 M 0 79.99999999999997 M 0 77.99999999999997 L 0 75.99999999999997 M 0 75.99999999999997 M 0 73.99999999999997 L 0 71.99999999999997 M 0 71.99999999999997 M 0 69.99999999999997 L 0 67.99999999999997 M 0 67.99999999999997 M 0 65.99999999999997 L 0 63.99999999999997 M 0 63.99999999999997 M 0 61.99999999999997 L 0 59.99999999999997 M 0 59.99999999999997 M 0 57.99999999999997 L 0 55.99999999999997 M 0 55.99999999999997 M 0 53.99999999999997 L 0 51.99999999999997 M 0 51.99999999999997 M 0 49.99999999999997 L 0 47.99999999999997 M 0 47.99999999999997 M 0 45.99999999999997 L 0 43.99999999999997 M 0 43.99999999999997 M 0 41.99999999999997 L 0 39.99999999999997 M 0 39.99999999999997 M 0 37.99999999999997 L 0 35.99999999999997 M 0 35.99999999999997 M 0 33.99999999999997 L 0 31.99999999999997 M 0 31.99999999999997 M 0 29.99999999999997 L 0 27.99999999999997 M 0 27.99999999999997 M 0 25.99999999999997 L 0 23.99999999999997 M 0 23.99999999999997 M 0 21.99999999999997 L 0 19.99999999999997 M 0 19.99999999999997 M 0 17.99999999999997 L 0 15.999999999999972 M 0 15.999999999999972 M 0 13.999999999999972 L 0 11.999999999999972 M 0 11.999999999999972 M 0 9.999999999999972 L 0 7.999999999999972 M 0 7.999999999999972 M 0 5.999999999999972 L 0 3.9999999999999716 M 0 3.9999999999999716 M 0 1.9999999999999716 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,82.5,44)"><g transform="translate(0,0)"><g transform="translate(-87,-150) translate(4.5,106) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#cccccc" d="M 88 149 L 87 48.5" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g><g transform="translate(0,0) matrix(1,0,0,1,313,40)"><g><g transform="translate(0,0) scale(2.37,3.01)"><g><path fill="#FFFFFF" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(0.42194092827004215,0.33222591362126247)"><path fill="none" stroke="none" d="M 0 0 L 237 0 Q 237 0 237 0 L 237 301 Q 237 301 237 301 L 0 301 Q 0 301 0 301 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" d="M 0 0 M 0 0 L 1.9999999999999998 0 M 1.9999999999999998 0 M 4 0 L 6 0 M 6 0 M 8 0 L 10 0 M 10 0 M 12 0 L 14 0 M 14 0 M 16 0 L 18 0 M 18 0 M 20 0 L 22 0 M 22 0 M 24 0 L 26 0 M 26 0 M 28 0 L 30 0 M 30 0 M 32 0 L 34 0 M 34 0 M 36 0 L 38 0 M 38 0 M 40 0 L 42 0 M 42 0 M 44 0 L 46 0 M 46 0 M 48 0 L 50 0 M 50 0 M 52 0 L 54 0 M 54 0 M 56 0 L 58 0 M 58 0 M 60 0 L 62 0 M 62 0 M 64 0 L 66 0 M 66 0 M 68 0 L 70 0 M 70 0 M 72 0 L 74 0 M 74 0 M 76 0 L 78 0 M 78 0 M 80 0 L 82 0 M 82 0 M 84 0 L 86 0 M 86 0 M 88 0 L 90 0 M 90 0 M 92 0 L 94 0 M 94 0 M 96 0 L 98 0 M 98 0 M 100 0 L 102 0 M 102 0 M 104 0 L 106 0 M 106 0 M 108 0 L 110 0 M 110 0 M 112 0 L 114 0 M 114 0 M 116 0 L 118 0 M 118 0 M 120 0 L 122 0 M 122 0 M 124 0 L 126 0 M 126 0 M 128 0 L 130 0 M 130 0 M 132 0 L 134 0 M 134 0 M 136 0 L 138 0 M 138 0 M 140 0 L 142 0 M 142 0 M 144 0 L 146 0 M 146 0 M 148 0 L 150 0 M 150 0 M 152 0 L 154 0 M 154 0 M 156 0 L 158 0 M 158 0 M 160 0 L 162 0 M 162 0 M 164 0 L 166 0 M 166 0 M 168 0 L 170 0 M 170 0 M 172 0 L 174 0 M 174 0 M 176 0 L 178 0 M 178 0 M 180 0 L 182 0 M 182 0 M 184 0 L 186 0 M 186 0 M 188 0 L 190 0 M 190 0 M 192 0 L 194 0 M 194 0 M 196 0 L 198 0 M 198 0 M 200 0 L 202 0 M 202 0 M 204 0 L 206 0 M 206 0 M 208 0 L 210 0 M 210 0 M 212 0 L 214 0 M 214 0 M 216 0 L 218 0 M 218 0 M 220 0 L 222 0 M 222 0 M 224 0 L 226 0 M 226 0 M 228 0 L 230 0 M 230 0 M 232 0 L 234 0 M 234 0 M 236 0 L 237 0 Q 237 0 237 0 L 237 1 M 237 1 M 237 3 L 237 5 M 237 5 M 237 7 L 237 9 M 237 9 M 237 11 L 237 13 M 237 13 M 237 15 L 237 17 M 237 17 M 237 19 L 237 21 M 237 21 M 237 23 L 237 25 M 237 25 M 237 27 L 237 29 M 237 29 M 237 31 L 237 33 M 237 33 M 237 35 L 237 37 M 237 37 M 237 39 L 237 41 M 237 41 M 237 43 L 237 45 M 237 45 M 237 47 L 237 49 M 237 49 M 237 51 L 237 53 M 237 53 M 237 55 L 237 57 M 237 57 M 237 59 L 237 61 M 237 61 M 237 63 L 237 65 M 237 65 M 237 67 L 237 69 M 237 69 M 237 71 L 237 73 M 237 73 M 237 75 L 237 77 M 237 77 M 237 79 L 237 81 M 237 81 M 237 83 L 237 85 M 237 85 M 237 87 L 237 89 M 237 89 M 237 91 L 237 93 M 237 93 M 237 95 L 237 97 M 237 97 M 237 99 L 237 101 M 237 101 M 237 103 L 237 105 M 237 105 M 237 107 L 237 109 M 237 109 M 237 111 L 237 113 M 237 113 M 237 115 L 237 117 M 237 117 M 237 119 L 237 121 M 237 121 M 237 123 L 237 125 M 237 125 M 237 127 L 237 129 M 237 129 M 237 131 L 237 133 M 237 133 M 237 135 L 237 137 M 237 137 M 237 139 L 237 141 M 237 141 M 237 143 L 237 145 M 237 145 M 237 147 L 237 149 M 237 149 M 237 151 L 237 153 M 237 153 M 237 155 L 237 157 M 237 157 M 237 159 L 237 161 M 237 161 M 237 163 L 237 165 M 237 165 M 237 167 L 237 169 M 237 169 M 237 171 L 237 173 M 237 173 M 237 175 L 237 177 M 237 177 M 237 179 L 237 181 M 237 181 M 237 183 L 237 185 M 237 185 M 237 187 L 237 189 M 237 189 M 237 191 L 237 193 M 237 193 M 237 195 L 237 197 M 237 197 M 237 199 L 237 201 M 237 201 M 237 203 L 237 205 M 237 205 M 237 207 L 237 209 M 237 209 M 237 211 L 237 213 M 237 213 M 237 215 L 237 217 M 237 217 M 237 219 L 237 221 M 237 221 M 237 223 L 237 225 M 237 225 M 237 227 L 237 229 M 237 229 M 237 231 L 237 233 M 237 233 M 237 235 L 237 237 M 237 237 M 237 239 L 237 241 M 237 241 M 237 243 L 237 245 M 237 245 M 237 247 L 237 249 M 237 249 M 237 251 L 237 253 M 237 253 M 237 255 L 237 257 M 237 257 M 237 259 L 237 261 M 237 261 M 237 263 L 237 265 M 237 265 M 237 267 L 237 269 M 237 269 M 237 271 L 237 273 M 237 273 M 237 275 L 237 277 M 237 277 M 237 279 L 237 281 M 237 281 M 237 283 L 237 285 M 237 285 M 237 287 L 237 289 M 237 289 M 237 291 L 237 293 M 237 293 M 237 295 L 237 297 M 237 297 M 237 299 L 237 301 M 237 301 M 235 301 L 233 301 M 233 301 M 231 301 L 229 301 M 229 301 M 227 301 L 225 301 M 225 301 M 223 301 L 221 301 M 221 301 M 219 301 L 217 301 M 217 301 M 215 301 L 213 301 M 213 301 M 211 301 L 209 301 M 209 301 M 207 301 L 205 301 M 205 301 M 203 301 L 201 301 M 201 301 M 199 301 L 197 301 M 197 301 M 195 301 L 193 301 M 193 301 M 191 301 L 189 301 M 189 301 M 187 301 L 185 301 M 185 301 M 183 301 L 181 301 M 181 301 M 179 301 L 177 301 M 177 301 M 175 301 L 173 301 M 173 301 M 171 301 L 169 301 M 169 301 M 167 301 L 165 301 M 165 301 M 163 301 L 161 301 M 161 301 M 159 301 L 157 301 M 157 301 M 155 301 L 153 301 M 153 301 M 151 301 L 149 301 M 149 301 M 147 301 L 145 301 M 145 301 M 143 301 L 141 301 M 141 301 M 139 301 L 137 301 M 137 301 M 135 301 L 133 301 M 133 301 M 131 301 L 129 301 M 129 301 M 127 301 L 125 301 M 125 301 M 123 301 L 121 301 M 121 301 M 119 301 L 117 301 M 117 301 M 115 301 L 113 301 M 113 301 M 111 301 L 109 301 M 109 301 M 107 301 L 105 301 M 105 301 M 103 301 L 101 301 M 101 301 M 99 301 L 97 301 M 97 301 M 95 301 L 93 301 M 93 301 M 91 301 L 89 301 M 89 301 M 87 301 L 85 301 M 85 301 M 83 301 L 81 301 M 81 301 M 79 301 L 77 301 M 77 301 M 75 301 L 73 301 M 73 301 M 71 301 L 69 301 M 69 301 M 67 301 L 65 301 M 65 301 M 63 301 L 61 301 M 61 301 M 59 301 L 57 301 M 57 301 M 55 301 L 53 301 M 53 301 M 51 301 L 49 301 M 49 301 M 47 301 L 45 301 M 45 301 M 43 301 L 41 301 M 41 301 M 39 301 L 37 301 M 37 301 M 35 301 L 33 301 M 33 301 M 31 301 L 29 301 M 29 301 M 27 301 L 25 301 M 25 301 M 23 301 L 21 301 M 21 301 M 19 301 L 17 301 M 17 301 M 15 301 L 13 301 M 13 301 M 11 301 L 9 301 M 9 301 M 7 301 L 5 301 M 5 301 M 3 301 L 1 301 M 1 301 M 0 300 L 0 298 M 0 298 M 0 296 L 0 294 M 0 294 M 0 292 L 0 290 M 0 290 M 0 288 L 0 286 M 0 286 M 0 284 L 0 282 M 0 282 M 0 280 L 0 278 M 0 278 M 0 276 L 0 274 M 0 274 M 0 272 L 0 270 M 0 270 M 0 268 L 0 266 M 0 266 M 0 264 L 0 262 M 0 262 M 0 260 L 0 258 M 0 258 M 0 256 L 0 254 M 0 254 M 0 252 L 0 250 M 0 250 M 0 248 L 0 246 M 0 246 M 0 244 L 0 242 M 0 242 M 0 240 L 0 238 M 0 238 M 0 236 L 0 234 M 0 234 M 0 232 L 0 230 M 0 230 M 0 228 L 0 226 M 0 226 M 0 224 L 0 222 M 0 222 M 0 220 L 0 218 M 0 218 M 0 216 L 0 214 M 0 214 M 0 212 L 0 210 M 0 210 M 0 208 L 0 206 M 0 206 M 0 204 L 0 202 M 0 202 M 0 200 L 0 198 M 0 198 M 0 196 L 0 194 M 0 194 M 0 192 L 0 190 M 0 190 M 0 188 L 0 186 M 0 186 M 0 184 L 0 182 M 0 182 M 0 180 L 0 178 M 0 178 M 0 176 L 0 174 M 0 174 M 0 172 L 0 170 M 0 170 M 0 168 L 0 166 M 0 166 M 0 164 L 0 162 M 0 162 M 0 160 L 0 158 M 0 158 M 0 156 L 0 154 M 0 154 M 0 152 L 0 150 M 0 150 M 0 148 L 0 146 M 0 146 M 0 144 L 0 142 M 0 142 M 0 140 L 0 138 M 0 138 M 0 136 L 0 134 M 0 134 M 0 132 L 0 130 M 0 130 M 0 128 L 0 126 M 0 126 M 0 124 L 0 122 M 0 122 M 0 120 L 0 118 M 0 118 M 0 116 L 0 114 M 0 114 M 0 112 L 0 110 M 0 110 M 0 108 L 0 106 M 0 106 M 0 104 L 0 102 M 0 102 M 0 100 L 0 98 M 0 98 M 0 96 L 0 94 M 0 94 M 0 92 L 0 90 M 0 90 M 0 88 L 0 86 M 0 86 M 0 84 L 0 82 M 0 82 M 0 80 L 0 78 M 0 78 M 0 76 L 0 74 M 0 74 M 0 72 L 0 70 M 0 70 M 0 68 L 0 66 M 0 66 M 0 64 L 0 62 M 0 62 M 0 60 L 0 58 M 0 58 M 0 56 L 0 54 M 0 54 M 0 52 L 0 50 M 0 50 M 0 48 L 0 46 M 0 46 M 0 44 L 0 42 M 0 42 M 0 40 L 0 38 M 0 38 M 0 36 L 0 34 M 0 34 M 0 32 L 0 30 M 0 30 M 0 28 L 0 26 M 0 26 M 0 24 L 0 22 M 0 22 M 0 20 L 0 18 M 0 18 M 0 16 L 0 14 M 0 14 M 0 12 L 0 10 M 0 10 M 0 8 L 0 6 M 0 6 M 0 4 L 0 2 M 0 2 M 0 0 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,133.5,111)"><g transform="translate(0,0)"><g transform="translate(138,-129) translate(-271.5,18) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#cccccc" d="M 138 170.96699141100893 L 382 115.5" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g><g transform="matrix(1,0,0,1,133.49999999999997,197.53300858899107)"><g transform="translate(0,0)"><g transform="translate(118,-123) translate(-251.49999999999997,-74.53300858899107) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#cccccc" d="M 137.99999999999997 202.03300858899107 L 382.1250000000001 252.5" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g><g transform="translate(0,0) matrix(1,0,0,1,38,149)"><g transform="translate(4,4) scale(1.01,1.0133333333333334)"><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="#000000" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" opacity="0.294117647"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="rgb(0,0,0)" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-opacity="0" stroke-miterlimit="10" stroke-width="2" opacity="0.294117647"/></g></g></g></g></g><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="url(#MVLBsVARSTmi)" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="url(#MVLBsVARSTmi)" stroke="#333333" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,48,180)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="80" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="80" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="25.322265625" y="0" width="30" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="25.322265625" y="0" width="30" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="25" y="11">h</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="32" y="11">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="39" y="11">s</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="45" y="11">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="48" y="11">1</text></g></g><g transform="matrix(1,0,0,1,15,133)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="146" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="146" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="2.9365234375" y="0" width="142" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="2.9365234375" y="0" width="142" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="3" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="10" y="11">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="13" y="11">h</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="20" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="30" y="11">2</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="36" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="43" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="50" y="11">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="56" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="60" y="11">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="66" y="11">b</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="73" y="11">8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="80" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="83" y="11">2</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="90" y="11">3</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="96" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="100" y="11">4</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="106" y="11">2</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="113" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="116" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="120" y="11">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="126" y="11">/</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="130" y="11">8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="136" y="11">0</text></g></g><g transform="matrix(1,0,0,1,122,179)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="146" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="146" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="23.2978515625" y="0" width="100" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="23.2978515625" y="0" width="100" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="23" y="11">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="30" y="11">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="37" y="11">c</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="43" y="11">k</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="49" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="55" y="11">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="59" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="69" y="11">f</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="73" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="79" y="11">8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="86" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="93" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="96" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="99" y="11">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="106" y="11">/</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="109" y="11">6</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="116" y="11">4</text></g></g><g transform="matrix(1,0,0,1,17,264)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="269" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="269" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="225" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="0" y="11">ip</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="9" y="11"> -</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="17" y="11">6</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="27" y="11">route</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="57" y="11">add</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="81" y="11">default</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="120" y="11">via</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="139" y="11">fe80</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="162" y="11">::</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="169" y="11">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="179" y="11">dev</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="201" y="11">eth0</text></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="224.82421875" y="0" width="1" height="14" fill-opacity="0"/></g></g><g><g/></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="14" width="269" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="14" width="208" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="0" y="25">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="3" y="25">p</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="13" y="25">-</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="17" y="25">6</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="27" y="25">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="31" y="25">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="37" y="25">u</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="44" y="25">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="47" y="25">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="57" y="25">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="64" y="25">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="71" y="25">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="81" y="25">2</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="87" y="25">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="94" y="25">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="101" y="25">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="107" y="25">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="111" y="25">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="117" y="25">b</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="124" y="25">8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="131" y="25">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="134" y="25">2</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="141" y="25">3</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="147" y="25">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="151" y="25">4</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="157" y="25">2</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="164" y="25">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="167" y="25">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="174" y="25">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="177" y="25">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="181" y="25">/</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="184" y="25">8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="191" y="25">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="201" y="25">d</text></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="207.498046875" y="14" width="60" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="207" y="25">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="214" y="25">v</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="224" y="25">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="230" y="25">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="237" y="25">c</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="243" y="25">k</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="249" y="25">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="256" y="25">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="260" y="25">0</text></g></g><g transform="translate(0,0) matrix(1,0,0,1,382,65.5)"><g transform="translate(4,4) scale(1.01,1.01)"><g><g transform="translate(0,0) scale(1,1)"><g><path fill="#000000" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" opacity="0.294117647"/><g transform="scale(1,1)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="rgb(0,0,0)" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" stroke-opacity="0" stroke-miterlimit="10" stroke-width="2" opacity="0.294117647"/></g></g></g></g></g><g><g transform="translate(0,0) scale(1,1)"><g><path fill="url(#idliOCdyLFTX)" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><path fill="url(#idliOCdyLFTX)" stroke="#333333" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,392,109)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="80" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="80" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="6.6455078125" y="0" width="68" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="6.6455078125" y="0" width="68" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="7" y="11">c</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="13" y="11">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="19" y="11">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="26" y="11">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="29" y="11">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="36" y="11">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="39" y="11">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="45" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="52" y="11">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="56" y="11">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="63" y="11">-</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="67" y="11">1</text></g></g><g transform="translate(0,0) matrix(1,0,0,1,382.1250000000001,202.5)"><g transform="translate(4,4) scale(1.01,1.01)"><g><g transform="translate(0,0) scale(1,1)"><g><path fill="#000000" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" opacity="0.294117647"/><g transform="scale(1,1)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="rgb(0,0,0)" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" stroke-opacity="0" stroke-miterlimit="10" stroke-width="2" opacity="0.294117647"/></g></g></g></g></g><g><g transform="translate(0,0) scale(1,1)"><g><path fill="url(#eprnSotBuoMn)" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><path fill="url(#eprnSotBuoMn)" stroke="#333333" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,392,246)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="80" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="80" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="6.6455078125" y="0" width="68" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="6.6455078125" y="0" width="68" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="7" y="11">c</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="13" y="11">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="19" y="11">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="26" y="11">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="29" y="11">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="36" y="11">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="39" y="11">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="45" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="52" y="11">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="56" y="11">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="63" y="11">-</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="67" y="11">2</text></g></g><g transform="matrix(1,0,0,1,353,50)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="167" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="167" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="8.4326171875" y="0" width="151" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="8.4326171875" y="0" width="151" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="8" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="15" y="11">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="18" y="11">h</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="25" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="35" y="11">2</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="42" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="48" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="55" y="11">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="62" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="65" y="11">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="72" y="11">b</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="78" y="11">8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="85" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="89" y="11">2</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="95" y="11">3</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="102" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="105" y="11">4</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="112" y="11">2</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="119" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="122" y="11">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="129" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="132" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="135" y="11">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="142" y="11">/</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="145" y="11">8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="152" y="11">0</text></g></g><g transform="matrix(1,0,0,1,354,186)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="165" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="165" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="7.4326171875" y="0" width="151" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="7.4326171875" y="0" width="151" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="7" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="14" y="11">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="17" y="11">h</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="24" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="34" y="11">2</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="41" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="47" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="54" y="11">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="61" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="64" y="11">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="71" y="11">b</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="77" y="11">8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="84" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="88" y="11">2</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="94" y="11">3</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="101" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="104" y="11">4</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="111" y="11">2</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="118" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="121" y="11">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="128" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="131" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="134" y="11">2</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="141" y="11">/</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="144" y="11">8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="151" y="11">0</text></g></g><g transform="matrix(1,0,0,1,315,315)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="231" height="16" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="231" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="3.087890625" y="0" width="225" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="3" y="11">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="6" y="11">p</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="16" y="11">-</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="20" y="11">6</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="30" y="11">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="34" y="11">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="40" y="11">u</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="47" y="11">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="50" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="60" y="11">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="67" y="11">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="74" y="11">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="84" y="11">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="90" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="97" y="11">f</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="100" y="11">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="107" y="11">u</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="114" y="11">l</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="117" y="11">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="123" y="11">v</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="129" y="11">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="132" y="11">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="142" y="11">f</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="145" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="152" y="11">8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="159" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="165" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="169" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="172" y="11">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="182" y="11">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="189" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="195" y="11">v</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="205" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="211" y="11">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="215" y="11">h</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="221" y="11">0</text></g></g><g transform="matrix(1,0,0,1,92,84)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="146" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="146" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="107" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="107" height="28" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="italic" font-weight="normal" text-decoration="" line-height="14px" x="0" y="11">Routed</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="italic" font-weight="normal" text-decoration="" line-height="14px" x="42" y="11">Network</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="italic" font-weight="normal" text-decoration="" line-height="14px" x="86" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="italic" font-weight="normal" text-decoration="" line-height="14px" x="0" y="25">2001</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="italic" font-weight="normal" text-decoration="" line-height="14px" x="27" y="25">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="italic" font-weight="normal" text-decoration="" line-height="14px" x="30" y="25">db8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="italic" font-weight="normal" text-decoration="" line-height="14px" x="50" y="25">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="italic" font-weight="normal" text-decoration="" line-height="14px" x="53" y="25">23</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="italic" font-weight="normal" text-decoration="" line-height="14px" x="67" y="25">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="italic" font-weight="normal" text-decoration="" line-height="14px" x="70" y="25">42</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="italic" font-weight="normal" text-decoration="" line-height="14px" x="83" y="25">::/</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="italic" font-weight="normal" text-decoration="" line-height="14px" x="93" y="25">64</text></g><g><g/></g></g><g transform="translate(0,0) matrix(1,0,0,1,37,2.5)"><g transform="translate(4,4) scale(1.01,1.0217391304347827)"><g><g transform="translate(0,0) scale(1,0.46)"><g><path fill="#000000" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" opacity="0.294117647"/><g transform="scale(1,2.1739130434782608)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 46 Q 100 46 100 46 L 0 46 Q 0 46 0 46 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="rgb(0,0,0)" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 46 Q 100 46 100 46 L 0 46 Q 0 46 0 46 L 0 0 Q 0 0 0 0 Z" stroke-opacity="0" stroke-miterlimit="10" stroke-width="2" opacity="0.294117647"/></g></g></g></g></g><g><g transform="translate(0,0) scale(1,0.46)"><g><path fill="url(#iWDbcgPdOTMR)" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,2.1739130434782608)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 46 Q 100 46 100 46 L 0 46 Q 0 46 0 46 L 0 0 Q 0 0 0 0 Z"/><path fill="url(#iWDbcgPdOTMR)" stroke="#333333" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 46 Q 100 46 100 46 L 0 46 Q 0 46 0 46 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,47,19)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="80" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="80" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="21.9912109375" y="0" width="38" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="21.9912109375" y="0" width="38" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="22" y="11">R</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="31" y="11">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="37" y="11">u</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="44" y="11">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="47" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="54" y="11">r</text></g></g><g transform="matrix(1,0,0,1,13,55)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="146" height="16" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="146" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="46.310546875" y="0" width="54" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="46" y="11">f</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="50" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="56" y="11">8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="63" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="70" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="73" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="76" y="11">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="83" y="11">/</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="86" y="11">6</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="93" y="11">4</text></g></g></g></svg> \ No newline at end of file
diff --git a/docs/sources/article-img/ipv6_switched_network_example.gliffy b/docs/sources/article-img/ipv6_switched_network_example.gliffy
index 7f2b73f186..75cbfcaadc 100644
--- a/docs/sources/article-img/ipv6_switched_network_example.gliffy
+++ b/docs/sources/article-img/ipv6_switched_network_example.gliffy
@@ -1 +1 @@
-{"contentType":"application/gliffy+json","version":"1.3","stage":{"background":"#FFFFFF","width":748,"height":448,"nodeIndex":182,"autoFit":true,"exportBorder":false,"gridOn":false,"snapToGrid":false,"drawingGuidesOn":true,"pageBreaksOn":false,"printGridOn":false,"printPaper":"LETTER","printShrinkToFit":false,"printPortrait":true,"maxWidth":5000,"maxHeight":5000,"themeData":null,"viewportType":"default","fitBB":{"min":{"x":-17.000680271168676,"y":5},"max":{"x":747.7683424505416,"y":447.5}},"objects":[{"x":17.5,"y":202.0,"rotation":0.0,"id":167,"width":204.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":38,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:left;\"><span style=\"\">route -A inet6 2001::/64 dev docker0</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":231.28932188134524,"y":95.0,"rotation":0.0,"id":120,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":6,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":161,"py":0.0,"px":0.2928932188134524}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":131,"py":1.0,"px":0.7071067811865476}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#cccccc","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[196.5,47.5],[151.9213562373095,-15.0]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]},{"x":187.0,"y":206.5,"rotation":0.0,"id":121,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":9,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":140,"py":0.9999999999999998,"px":0.29289321881345254}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":148,"py":0.0,"px":0.5}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#cccccc","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[66.28932188134524,11.0],[-92.0,91.5]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]},{"x":174.0,"y":217.5,"rotation":0.0,"id":122,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":8,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":140,"py":1.0,"px":0.5}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":146,"py":0.0,"px":0.5}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#cccccc","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[100.0,0.0],[82.0,80.5]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]},{"x":3.5000000000000284,"y":408.0,"rotation":0.0,"id":123,"width":346.49999999999994,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":31,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"\">route -A inet6 default gw fe80::1 dev eth0</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":3.5000000000000284,"y":268.5,"rotation":0.0,"id":124,"width":346.49999999999994,"height":163.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":3,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dashStyle":"2,2","dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[]},{"x":237.0,"y":54.0,"rotation":0.0,"id":125,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":7,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":131,"py":0.9999999999999998,"px":0.29289321881345254}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":140,"py":0.0,"px":0.7071067811865476}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#cccccc","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[104.78932188134524,25.999999999999986],[57.710678118654755,88.5]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]},{"x":68.5,"y":86.5,"rotation":0.0,"id":126,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":5,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":161,"py":1.0,"px":0.7071067811865476}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":156,"py":0.0,"px":0.5}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#cccccc","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[400.71067811865476,131.0],[560.0,211.5]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]},{"x":29.5,"y":90.5,"rotation":0.0,"id":127,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":4,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":161,"py":1.0,"px":0.5}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":153,"py":0.0,"px":0.5}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#cccccc","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[419.0,127.0],[431.0,207.5]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]},{"x":312.5,"y":5.0,"rotation":0.0,"id":131,"width":100.0,"height":75.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":10,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#e2e2e2","gradient":true,"dashStyle":null,"dropShadow":true,"state":0,"opacity":1.0,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":132,"width":96.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"text-decoration:none;font-size:12px;font-family:Arial;\"><span style=\"text-decoration:none;\">Level 2 Switch</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[]}]},{"x":785.0,"y":195.0,"rotation":0.0,"id":136,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":32,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":143,"py":0.6187943262411347,"px":1.0}}},"graphic":{"type":"Line","Line":{"strokeWidth":1.0,"strokeColor":"#000000","fillColor":"none","dashStyle":"8.0,8.0","startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[-69.25,-0.25],[-798.0006802711687,-3.410605131648481E-13]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]},{"x":199.0,"y":224.0,"rotation":0.0,"id":138,"width":150.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":19,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:12px;font-family:Arial;\"><span style=\"\">docker0 fe80::1/64</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":229.0,"y":126.0,"rotation":0.0,"id":139,"width":150.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":16,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:left;\"><span style=\"font-size:12px;font-family:Arial;\"><span style=\"\">eth0 2000::1/64</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":224.0,"y":142.5,"rotation":0.0,"id":140,"width":100.0,"height":75.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":12,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#a4c2f4","gradient":true,"dashStyle":null,"dropShadow":true,"state":0,"opacity":1.0,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":141,"width":96.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"text-decoration:none;font-size:12px;font-family:Arial;\"><span style=\"text-decoration:none;\">Host1</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[]}]},{"x":3.4999999999999716,"y":107.5,"rotation":0.0,"id":142,"width":346.50000000000006,"height":141.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":1,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dashStyle":"2,2","dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[]},{"x":376.75,"y":107.5,"rotation":0.0,"id":143,"width":339.0,"height":141.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":0,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dashStyle":"2,2","dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[]},{"x":181.0,"y":281.0,"rotation":0.0,"id":144,"width":150.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":34,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"\">eth0 2001::2/64</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":20.000000000000014,"y":281.0,"rotation":0.0,"id":145,"width":149.99999999999997,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":24,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"\">eth0 2001::1/64</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":206.0,"y":298.0,"rotation":0.0,"id":146,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.square","order":22,"lockAspectRatio":true,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#ead1dc","gradient":true,"dashStyle":null,"dropShadow":true,"state":0,"opacity":1.0,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":147,"width":96.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"text-decoration:none;font-size:12px;font-family:Arial;\"><span style=\"text-decoration:none;\">Container1-2</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[]}]},{"x":45.0,"y":298.0,"rotation":0.0,"id":148,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.square","order":20,"lockAspectRatio":true,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#ead1dc","gradient":true,"dashStyle":null,"dropShadow":true,"state":0,"opacity":1.0,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":149,"width":96.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"text-decoration:none;font-size:12px;font-family:Arial;\"><span style=\"text-decoration:none;\">Container1-1</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[]}]},{"x":387.0,"y":281.0,"rotation":0.0,"id":150,"width":150.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":35,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"\">eth0 2002::1/64</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":376.75,"y":268.5,"rotation":0.0,"id":151,"width":339.75,"height":163.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":2,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dashStyle":"2,2","dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[]},{"x":376.75,"y":407.0,"rotation":0.0,"id":152,"width":339.75,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":30,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"\">route -A inet6 default gw fe80::1 dev eth0</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":410.5,"y":298.0,"rotation":0.0,"id":153,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.square","order":25,"lockAspectRatio":true,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#ead1dc","gradient":true,"dashStyle":null,"dropShadow":true,"state":0,"opacity":1.0,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":154,"width":96.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"text-decoration:none;font-size:12px;font-family:Arial;\"><span style=\"text-decoration:none;\">Container2-1</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[]}]},{"x":555.0,"y":281.0,"rotation":0.0,"id":155,"width":150.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":36,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"\">eth0 2002::2/64</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":578.5,"y":298.0,"rotation":0.0,"id":156,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.square","order":27,"lockAspectRatio":true,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#ead1dc","gradient":true,"dashStyle":null,"dropShadow":true,"state":0,"opacity":1.0,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":157,"width":96.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"text-decoration:none;font-size:12px;font-family:Arial;\"><span style=\"text-decoration:none;\">Container2-2</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[]}]},{"x":251.0,"y":436.5,"rotation":0.0,"id":158,"width":223.00000000000003,"height":11.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":37,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-style:italic;font-size:10px;\">containers&#39; link-local addresses are not displayed</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":403.5,"y":126.0,"rotation":0.0,"id":159,"width":150.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":17,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:left;\"><span style=\"\">eth0 2000::2/64</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":373.5,"y":223.0,"rotation":0.0,"id":160,"width":150.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":18,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:12px;font-family:Arial;\"><span style=\"\">docker0 fe80::1/64</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":398.5,"y":142.5,"rotation":0.0,"id":161,"width":100.0,"height":75.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":14,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#a4c2f4","gradient":true,"dashStyle":null,"dropShadow":true,"state":0,"opacity":1.0,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":162,"width":96.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"text-decoration:none;font-size:12px;font-family:Arial;\"><span style=\"text-decoration:none;\">Host2</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[]}]},{"x":17.5,"y":143.5,"rotation":0.0,"id":137,"width":291.0,"height":28.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":29,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:left;\"><span style=\"\">route -A inet6 2000::/64 dev eth0</span></p><p style=\"text-align:left;\"><span style=\"\">route -A inet6 2002::/64 gw 2000::2</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":507.5,"y":144.0,"rotation":0.0,"id":135,"width":209.0,"height":28.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":33,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:left;\"><span style=\"\">route -A inet6 2000::/64 dev eth0</span></p><p style=\"text-align:left;\"><span style=\"\">route -A inet6 2001::/64 gw 2000::1</span><span style=\"text-decoration:none;\"> </span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":508.0,"y":195.0,"rotation":0.0,"id":168,"width":204.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":39,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:left;\"><span style=\"\">route -A inet6 2002::/64 dev docker0</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":756.7500000000001,"y":195.0,"rotation":0.0,"id":172,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":43,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Line","Line":{"strokeWidth":1.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[-12.982306425886122,0.0],[-41.25,0.0]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]},{"x":757.7500000000001,"y":432.0,"rotation":0.0,"id":171,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":42,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Line","Line":{"strokeWidth":1.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[-13.981657549458532,0.0],[-41.25,0.0]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]},{"x":654.7500000000001,"y":307.5,"rotation":270.0,"id":173,"width":150.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":41,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:12px;font-family:Arial;\"><span style=\"\">managed by Docker</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":738.7500000000001,"y":417.0,"rotation":0.0,"id":174,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":40,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Line","Line":{"strokeWidth":1.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":2,"endArrow":2,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[0.0,14.008510484195028],[0.0,-221.0]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]}],"shapeStyles":{"com.gliffy.shape.basic.basic_v1.default":{"fill":"#e2e2e2","stroke":"#333333","strokeWidth":2,"dashStyle":"2.0,2.0","gradient":true,"shadow":true}},"lineStyles":{"global":{"stroke":"#000000","dashStyle":"8.0,8.0","strokeWidth":1}},"textStyles":{}},"metadata":{"title":"untitled","revision":0,"exportBorder":false,"loadPosition":"default","libraries":["com.gliffy.libraries.basic.basic_v1.default","com.gliffy.libraries.flowchart.flowchart_v1.default","com.gliffy.libraries.swimlanes.swimlanes_v1.default","com.gliffy.libraries.uml.uml_v2.class","com.gliffy.libraries.uml.uml_v2.sequence","com.gliffy.libraries.uml.uml_v2.activity","com.gliffy.libraries.erd.erd_v1.default","com.gliffy.libraries.ui.ui_v3.containers_content","com.gliffy.libraries.ui.ui_v3.forms_controls","com.gliffy.libraries.images"],"autosaveDisabled":false},"embeddedResources":{"index":0,"resources":[]}} \ No newline at end of file
+{"contentType":"application/gliffy+json","version":"1.3","stage":{"background":"#FFFFFF","width":893,"height":448,"nodeIndex":185,"autoFit":true,"exportBorder":false,"gridOn":false,"snapToGrid":false,"drawingGuidesOn":true,"pageBreaksOn":false,"printGridOn":false,"printPaper":"LETTER","printShrinkToFit":false,"printPortrait":true,"maxWidth":5000,"maxHeight":5000,"themeData":null,"viewportType":"default","fitBB":{"min":{"x":-17.000680271168676,"y":7},"max":{"x":892.767693574114,"y":447.5}},"objects":[{"x":17.5,"y":205.5,"rotation":0.0,"id":167,"width":238.5,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":38,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:left;\"><span style=\"\">ip -6 route add 2001:db8:1::/64 dev docker0</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":231.28932188134524,"y":95.0,"rotation":0.0,"id":120,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":6,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":161,"py":0.0,"px":0.2928932188134524}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":131,"py":1.0,"px":0.7071067811865476}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#cccccc","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[267.5,47.5],[217.9213562373095,-13.0]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]},{"x":187.0,"y":206.5,"rotation":0.0,"id":121,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":9,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":140,"py":0.9999999999999998,"px":0.29289321881345254}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":148,"py":0.0,"px":0.5}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#cccccc","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[130.28932188134524,11.0],[-79.0,91.5]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]},{"x":174.0,"y":217.5,"rotation":0.0,"id":122,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":8,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":140,"py":1.0,"px":0.5}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":146,"py":0.0,"px":0.5}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#cccccc","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[164.0,0.0],[120.0,81.5]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]},{"x":33.50000000000003,"y":409.0,"rotation":0.0,"id":123,"width":346.49999999999994,"height":16.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":31,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"\">ip -6 route add default via fe80::1 dev eth0</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":3.5000000000000284,"y":268.5,"rotation":0.0,"id":124,"width":411.00000000000006,"height":163.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":3,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dashStyle":"2,2","dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[]},{"x":237.0,"y":54.0,"rotation":0.0,"id":125,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":7,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":131,"py":0.9999999999999998,"px":0.29289321881345254}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":140,"py":0.0,"px":0.7071067811865476}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#cccccc","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[170.78932188134524,27.999999999999986],[121.71067811865476,88.5]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]},{"x":378.5,"y":7.0,"rotation":0.0,"id":131,"width":100.0,"height":75.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":10,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#e2e2e2","gradient":true,"dashStyle":null,"dropShadow":true,"state":0,"opacity":1.0,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":132,"width":96.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:12px;text-decoration:none;font-family:Arial;\"><span style=\"text-decoration:none;\">Level 2 Switch</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[]}]},{"x":785.0,"y":195.0,"rotation":0.0,"id":136,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":32,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":143,"py":0.6187943262411347,"px":1.0}}},"graphic":{"type":"Line","Line":{"strokeWidth":1.0,"strokeColor":"#000000","fillColor":"none","dashStyle":"8.0,8.0","startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[78.75000000000011,-0.25],[-798.0006802711687,-3.410605131648481E-13]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]},{"x":262.0,"y":224.0,"rotation":0.0,"id":138,"width":150.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":19,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:12px;font-family:Arial;\"><span style=\"\">docker0 fe80::1/64</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":278.0,"y":126.0,"rotation":0.0,"id":139,"width":150.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":16,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:left;\"><span style=\"font-size:12px;font-family:Arial;\"><span style=\"\">eth0 2001:db8:0::1/64</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":288.0,"y":142.5,"rotation":0.0,"id":140,"width":100.0,"height":75.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":12,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#a4c2f4","gradient":true,"dashStyle":null,"dropShadow":true,"state":0,"opacity":1.0,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":141,"width":96.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:12px;text-decoration:none;font-family:Arial;\"><span style=\"text-decoration:none;\">Host1</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[]}]},{"x":3.4999999999999716,"y":107.5,"rotation":0.0,"id":142,"width":411.0,"height":141.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":1,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dashStyle":"2,2","dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[]},{"x":221.0,"y":283.0,"rotation":0.0,"id":144,"width":150.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":34,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"\">eth0 2001:db8:1::2/64</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":34.000000000000014,"y":283.0,"rotation":0.0,"id":145,"width":149.99999999999997,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":24,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"\">eth0 2001:db8:1::1/64</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":244.0,"y":299.0,"rotation":0.0,"id":146,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.square","order":22,"lockAspectRatio":true,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#ead1dc","gradient":true,"dashStyle":null,"dropShadow":true,"state":0,"opacity":1.0,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":147,"width":96.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:12px;text-decoration:none;font-family:Arial;\"><span style=\"text-decoration:none;\">Container1-2</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[]}]},{"x":58.0,"y":298.0,"rotation":0.0,"id":148,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.square","order":20,"lockAspectRatio":true,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#ead1dc","gradient":true,"dashStyle":null,"dropShadow":true,"state":0,"opacity":1.0,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":149,"width":96.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:12px;text-decoration:none;font-family:Arial;\"><span style=\"text-decoration:none;\">Container1-1</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[]}]},{"x":317.0,"y":436.5,"rotation":0.0,"id":158,"width":223.00000000000003,"height":11.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":37,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:10px;font-style:italic;\">containers&#39; link-local addresses are not displayed</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":17.5,"y":148.0,"rotation":0.0,"id":137,"width":291.0,"height":28.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":29,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:left;\"><span style=\"\">ip -6 route add 2001:db8:0::/64 dev eth0</span></p><p style=\"text-align:left;\"><span style=\"\">ip -6 route add 2001:db8:2::/64 via 2001:db8:0::2</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":901.7500000000001,"y":195.0,"rotation":0.0,"id":172,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":43,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Line","Line":{"strokeWidth":1.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[-12.982306425886122,0.0],[-41.25,0.0]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]},{"x":670.0,"y":284.0,"rotation":0.0,"id":155,"width":150.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":36,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"\">eth0 2001:db8:2::2/64</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":479.0,"y":284.0,"rotation":0.0,"id":150,"width":150.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":35,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"\">eth0 2001:db8:2::1/64</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":488.75,"y":408.0,"rotation":0.0,"id":152,"width":339.75,"height":16.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":30,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"\">ip -6 route add default via fe80::1 dev eth0</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":694.5,"y":298.0,"rotation":0.0,"id":156,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.square","order":27,"lockAspectRatio":true,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#ead1dc","gradient":true,"dashStyle":null,"dropShadow":true,"state":0,"opacity":1.0,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":157,"width":96.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:12px;text-decoration:none;font-family:Arial;\"><span style=\"text-decoration:none;\">Container2-2</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[]}]},{"x":501.5,"y":298.0,"rotation":0.0,"id":153,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.square","order":25,"lockAspectRatio":true,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#ead1dc","gradient":true,"dashStyle":null,"dropShadow":true,"state":0,"opacity":1.0,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":154,"width":96.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:12px;text-decoration:none;font-family:Arial;\"><span style=\"text-decoration:none;\">Container2-1</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[]}]},{"x":444.5,"y":223.0,"rotation":0.0,"id":160,"width":150.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":18,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:12px;font-family:Arial;\"><span style=\"\">docker0 fe80::1/64</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":460.5,"y":128.0,"rotation":0.0,"id":159,"width":150.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":17,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:left;\"><span style=\"\">eth0 2001:db8:0::2/64</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":469.5,"y":142.5,"rotation":0.0,"id":161,"width":100.0,"height":75.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":14,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#a4c2f4","gradient":true,"dashStyle":null,"dropShadow":true,"state":0,"opacity":1.0,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":162,"width":96.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:12px;text-decoration:none;font-family:Arial;\"><span style=\"text-decoration:none;\">Host2</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[]}]},{"x":139.5,"y":86.5,"rotation":0.0,"id":126,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":5,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":161,"py":1.0,"px":0.7071067811865476}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":156,"py":0.0,"px":0.5}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#cccccc","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[400.71067811865476,131.0],[605.0,211.5]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]},{"x":100.5,"y":90.5,"rotation":0.0,"id":127,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":4,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":161,"py":1.0,"px":0.5}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":153,"py":0.0,"px":0.5}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#cccccc","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[419.0,127.0],[451.0,207.5]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]},{"x":447.75,"y":268.5,"rotation":0.0,"id":151,"width":416.0000000000001,"height":163.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":2,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dashStyle":"2,2","dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[]},{"x":447.75,"y":107.5,"rotation":0.0,"id":143,"width":416.0000000000001,"height":141.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":0,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dashStyle":"2,2","dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[]},{"x":795.7500000000001,"y":307.5,"rotation":270.0,"id":173,"width":150.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":41,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:12px;font-family:Arial;\"><span style=\"\">managed by Docker</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":879.7500000000001,"y":417.0,"rotation":0.0,"id":174,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":40,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Line","Line":{"strokeWidth":1.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":2,"endArrow":2,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[0.0,14.008510484195028],[0.0,-221.0]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]},{"x":898.7500000000001,"y":432.0,"rotation":0.0,"id":171,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":42,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Line","Line":{"strokeWidth":1.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[-13.981657549458532,0.0],[-41.25,0.0]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[]},{"x":582.5,"y":151.0,"rotation":0.0,"id":135,"width":285.25000000000017,"height":28.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":33,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:left;\"><span style=\"\">ip -6 route add 2001:db8:0::/64 dev eth0</span></p><p style=\"text-align:left;\"><span style=\"\">ip -6 route add 2001:db8:1::/64 via 2001:db8:0::1</span><span style=\"text-decoration:none;\"> </span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":583.0,"y":204.0,"rotation":0.0,"id":168,"width":272.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":39,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:left;\"><span style=\"\">ip -6 route add 2001:db8:2::/64 dev docker0</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]}],"shapeStyles":{"com.gliffy.shape.basic.basic_v1.default":{"fill":"#e2e2e2","stroke":"#333333","strokeWidth":2,"dashStyle":"2.0,2.0","gradient":true,"shadow":true}},"lineStyles":{"global":{"stroke":"#000000","strokeWidth":1,"dashStyle":"8.0,8.0"}},"textStyles":{}},"metadata":{"title":"untitled","revision":0,"exportBorder":false,"loadPosition":"default","libraries":["com.gliffy.libraries.basic.basic_v1.default","com.gliffy.libraries.flowchart.flowchart_v1.default","com.gliffy.libraries.swimlanes.swimlanes_v1.default","com.gliffy.libraries.uml.uml_v2.class","com.gliffy.libraries.uml.uml_v2.sequence","com.gliffy.libraries.uml.uml_v2.activity","com.gliffy.libraries.erd.erd_v1.default","com.gliffy.libraries.ui.ui_v3.containers_content","com.gliffy.libraries.ui.ui_v3.forms_controls","com.gliffy.libraries.images"],"autosaveDisabled":false},"embeddedResources":{"index":0,"resources":[]}} \ No newline at end of file
diff --git a/docs/sources/article-img/ipv6_switched_network_example.svg b/docs/sources/article-img/ipv6_switched_network_example.svg
index 5c391c24ad..4cbf709b13 100644
--- a/docs/sources/article-img/ipv6_switched_network_example.svg
+++ b/docs/sources/article-img/ipv6_switched_network_example.svg
@@ -1 +1 @@
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="767.7683424505416" height="467.5"><defs><linearGradient id="WMQTRvrWqxuI" x1="0px" x2="0px" y1="100px" y2="-50px" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#e2e2e2"/><stop offset="1" stop-color="#FFFFFF"/></linearGradient><linearGradient id="HyUeTUFmfnXX" x1="0px" x2="0px" y1="100px" y2="-50px" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#a4c2f4"/><stop offset="1" stop-color="#FFFFFF"/></linearGradient><linearGradient id="VJTRlcfnETOd" x1="0px" x2="0px" y1="100px" y2="-50px" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#a4c2f4"/><stop offset="1" stop-color="#FFFFFF"/></linearGradient><linearGradient id="yJIaTyLVTinm" x1="0px" x2="0px" y1="100px" y2="-50px" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ead1dc"/><stop offset="1" stop-color="#FFFFFF"/></linearGradient><linearGradient id="aIVvGxASoFVL" x1="0px" x2="0px" y1="100px" y2="-50px" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ead1dc"/><stop offset="1" stop-color="#FFFFFF"/></linearGradient><linearGradient id="BOdfyPCXaAKX" x1="0px" x2="0px" y1="100px" y2="-50px" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ead1dc"/><stop offset="1" stop-color="#FFFFFF"/></linearGradient><linearGradient id="oXtAQOaNMCTL" x1="0px" x2="0px" y1="100px" y2="-50px" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ead1dc"/><stop offset="1" stop-color="#FFFFFF"/></linearGradient></defs><g transform="translate(0,0)"><g><rect fill="#FFFFFF" stroke="none" x="0" y="0" width="767.7683424505416" height="467.5"/></g><g transform="translate(0,0) matrix(1,0,0,1,376.75,107.5)"><g><g transform="translate(0,0) scale(3.39,1.41)"><g><path fill="#FFFFFF" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(0.2949852507374631,0.7092198581560284)"><path fill="none" stroke="none" d="M 0 0 L 339 0 Q 339 0 339 0 L 339 141 Q 339 141 339 141 L 0 141 Q 0 141 0 141 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" d="M 0 0 M 0 0 L 2 0 M 2 0 M 4 0 L 6 0 M 6 0 M 8 0 L 10 0 M 10 0 M 12 0 L 14 0 M 14 0 M 16 0 L 18 0 M 18 0 M 20 0 L 22 0 M 22 0 M 24 0 L 26 0 M 26 0 M 28 0 L 30 0 M 30 0 M 32 0 L 34 0 M 34 0 M 36 0 L 38 0 M 38 0 M 40 0 L 42 0 M 42 0 M 44 0 L 46 0 M 46 0 M 48 0 L 50 0 M 50 0 M 52 0 L 54 0 M 54 0 M 56 0 L 58 0 M 58 0 M 60 0 L 62 0 M 62 0 M 64 0 L 66 0 M 66 0 M 68 0 L 70 0 M 70 0 M 72 0 L 74 0 M 74 0 M 76 0 L 78 0 M 78 0 M 80 0 L 82 0 M 82 0 M 84 0 L 86 0 M 86 0 M 88 0 L 90 0 M 90 0 M 92 0 L 94 0 M 94 0 M 96 0 L 98 0 M 98 0 M 100 0 L 102 0 M 102 0 M 104 0 L 106 0 M 106 0 M 108 0 L 110 0 M 110 0 M 112 0 L 114 0 M 114 0 M 116 0 L 118 0 M 118 0 M 120 0 L 122 0 M 122 0 M 124 0 L 126 0 M 126 0 M 128 0 L 130 0 M 130 0 M 132 0 L 134 0 M 134 0 M 136 0 L 138 0 M 138 0 M 140 0 L 142 0 M 142 0 M 144 0 L 146 0 M 146 0 M 148 0 L 150 0 M 150 0 M 152 0 L 154 0 M 154 0 M 156 0 L 158 0 M 158 0 M 160 0 L 162 0 M 162 0 M 164 0 L 166 0 M 166 0 M 168 0 L 170 0 M 170 0 M 172 0 L 174 0 M 174 0 M 176 0 L 178 0 M 178 0 M 180 0 L 182 0 M 182 0 M 184 0 L 186 0 M 186 0 M 188 0 L 190 0 M 190 0 M 192 0 L 194 0 M 194 0 M 196 0 L 198 0 M 198 0 M 200 0 L 202 0 M 202 0 M 204 0 L 206 0 M 206 0 M 208 0 L 210 0 M 210 0 M 212 0 L 214 0 M 214 0 M 216 0 L 218 0 M 218 0 M 220 0 L 222 0 M 222 0 M 224 0 L 226 0 M 226 0 M 228 0 L 230 0 M 230 0 M 232 0 L 234 0 M 234 0 M 236 0 L 238 0 M 238 0 M 240 0 L 242 0 M 242 0 M 244 0 L 246 0 M 246 0 M 248 0 L 250 0 M 250 0 M 252 0 L 254 0 M 254 0 M 256 0 L 258 0 M 258 0 M 260 0 L 262 0 M 262 0 M 264 0 L 266 0 M 266 0 M 268 0 L 270 0 M 270 0 M 272 0 L 274 0 M 274 0 M 276 0 L 278 0 M 278 0 M 280 0 L 282 0 M 282 0 M 284 0 L 286 0 M 286 0 M 288 0 L 290 0 M 290 0 M 292 0 L 294 0 M 294 0 M 296 0 L 298 0 M 298 0 M 300 0 L 302 0 M 302 0 M 304 0 L 306 0 M 306 0 M 308 0 L 310 0 M 310 0 M 312 0 L 314 0 M 314 0 M 316 0 L 318 0 M 318 0 M 320 0 L 322 0 M 322 0 M 324 0 L 326 0 M 326 0 M 328 0 L 330 0 M 330 0 M 332 0 L 334 0 M 334 0 M 336 0 L 338 0 M 338 0 M 339 1 L 339 3 M 339 3 M 339 5 L 339 7 M 339 7 M 339 9 L 339 11 M 339 11 M 339 13 L 339 15 M 339 15 M 339 17 L 339 19 M 339 19 M 339 21 L 339 23 M 339 23 M 339 25 L 339 27 M 339 27 M 339 29 L 339 31 M 339 31 M 339 33 L 339 35 M 339 35 M 339 37 L 339 39 M 339 39 M 339 41 L 339 43 M 339 43 M 339 45 L 339 47 M 339 47 M 339 49 L 339 51 M 339 51 M 339 53 L 339 55 M 339 55 M 339 57 L 339 59 M 339 59 M 339 61 L 339 63 M 339 63 M 339 65 L 339 67 M 339 67 M 339 69 L 339 71 M 339 71 M 339 73 L 339 75 M 339 75 M 339 77 L 339 79 M 339 79 M 339 81 L 339 83 M 339 83 M 339 85 L 339 87 M 339 87 M 339 89 L 339 91 M 339 91 M 339 93 L 339 95 M 339 95 M 339 97 L 339 99 M 339 99 M 339 101 L 339 103 M 339 103 M 339 105 L 339 107 M 339 107 M 339 109 L 339 111 M 339 111 M 339 113 L 339 115 M 339 115 M 339 117 L 339 119 M 339 119 M 339 121 L 339 123 M 339 123 M 339 125 L 339 127 M 339 127 M 339 129 L 339 131 M 339 131 M 339 133 L 339 135 M 339 135 M 339 137 L 339 139 M 339 139 M 339 141 L 339 141 Q 339 141 339 141 L 337 141 M 337 141 M 335 141 L 333 141 M 333 141 M 331 141 L 329 141 M 329 141 M 327 141 L 325 141 M 325 141 M 323 141 L 321 141 M 321 141 M 319 141 L 317 141 M 317 141 M 315 141 L 313 141 M 313 141 M 311 141 L 309 141 M 309 141 M 307 141 L 305 141 M 305 141 M 303 141 L 301 141 M 301 141 M 299 141 L 297 141 M 297 141 M 295 141 L 293 141 M 293 141 M 291 141 L 289 141 M 289 141 M 287 141 L 285 141 M 285 141 M 283 141 L 281 141 M 281 141 M 279 141 L 277 141 M 277 141 M 275 141 L 273 141 M 273 141 M 271 141 L 269 141 M 269 141 M 267 141 L 265 141 M 265 141 M 263 141 L 261 141 M 261 141 M 259 141 L 257 141 M 257 141 M 255 141 L 253 141 M 253 141 M 251 141 L 249 141 M 249 141 M 247 141 L 245 141 M 245 141 M 243 141 L 241 141 M 241 141 M 239 141 L 237 141 M 237 141 M 235 141 L 233 141 M 233 141 M 231 141 L 229 141 M 229 141 M 227 141 L 225 141 M 225 141 M 223 141 L 221 141 M 221 141 M 219 141 L 217 141 M 217 141 M 215 141 L 213 141 M 213 141 M 211 141 L 209 141 M 209 141 M 207 141 L 205 141 M 205 141 M 203 141 L 201 141 M 201 141 M 199 141 L 197 141 M 197 141 M 195 141 L 193 141 M 193 141 M 191 141 L 189 141 M 189 141 M 187 141 L 185 141 M 185 141 M 183 141 L 181 141 M 181 141 M 179 141 L 177 141 M 177 141 M 175 141 L 173 141 M 173 141 M 171 141 L 169 141 M 169 141 M 167 141 L 165 141 M 165 141 M 163 141 L 161 141 M 161 141 M 159 141 L 157 141 M 157 141 M 155 141 L 153 141 M 153 141 M 151 141 L 149 141 M 149 141 M 147 141 L 145 141 M 145 141 M 143 141 L 141 141 M 141 141 M 139 141 L 137 141 M 137 141 M 135 141 L 133 141 M 133 141 M 131 141 L 129 141 M 129 141 M 127 141 L 125 141 M 125 141 M 123 141 L 121 141 M 121 141 M 119 141 L 117 141 M 117 141 M 115 141 L 113 141 M 113 141 M 111 141 L 109 141 M 109 141 M 107 141 L 105 141 M 105 141 M 103 141 L 101 141 M 101 141 M 99 141 L 97 141 M 97 141 M 95 141 L 93 141 M 93 141 M 91 141 L 89 141 M 89 141 M 87 141 L 85 141 M 85 141 M 83 141 L 81 141 M 81 141 M 79 141 L 77 141 M 77 141 M 75 141 L 73 141 M 73 141 M 71 141 L 69 141 M 69 141 M 67 141 L 65 141 M 65 141 M 63 141 L 61 141 M 61 141 M 59 141 L 57 141 M 57 141 M 55 141 L 53 141 M 53 141 M 51 141 L 49 141 M 49 141 M 47 141 L 45 141 M 45 141 M 43 141 L 41 141 M 41 141 M 39 141 L 37 141 M 37 141 M 35 141 L 33 141 M 33 141 M 31 141 L 29 141 M 29 141 M 27 141 L 25 141 M 25 141 M 23 141 L 21 141 M 21 141 M 19 141 L 17 141 M 17 141 M 15 141 L 13 141 M 13 141 M 11 141 L 9 141 M 9 141 M 7 141 L 5 141 M 5 141 M 3 141 L 1 141 M 1 141 M 0 140 L 0 138 M 0 138 M 0 136 L 0 134 M 0 134 M 0 132 L 0 130 M 0 130 M 0 128 L 0 126 M 0 126 M 0 124 L 0 122 M 0 122 M 0 120 L 0 118 M 0 118 M 0 116 L 0 114 M 0 114 M 0 112 L 0 110 M 0 110 M 0 108 L 0 106 M 0 106 M 0 104 L 0 102 M 0 102 M 0 100 L 0 98 M 0 98 M 0 96 L 0 94 M 0 94 M 0 92 L 0 90 M 0 90 M 0 88 L 0 86 M 0 86 M 0 84 L 0 82 M 0 82 M 0 80 L 0 78 M 0 78 M 0 76 L 0 74 M 0 74 M 0 72 L 0 70 M 0 70 M 0 68 L 0 66 M 0 66 M 0 64 L 0 62 M 0 62 M 0 60 L 0 58 M 0 58 M 0 56 L 0 54 M 0 54 M 0 52 L 0 50 M 0 50 M 0 48 L 0 46 M 0 46 M 0 44 L 0 42 M 0 42 M 0 40 L 0 38 M 0 38 M 0 36 L 0 34 M 0 34 M 0 32 L 0 30 M 0 30 M 0 28 L 0 26 M 0 26 M 0 24 L 0 22 M 0 22 M 0 20 L 0 18 M 0 18 M 0 16 L 0 14 M 0 14 M 0 12 L 0 10 M 0 10 M 0 8 L 0 6 M 0 6 M 0 4 L 0 2 M 0 2 M 0 0 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="translate(0,0) matrix(1,0,0,1,3.4999999999999716,107.5)"><g><g transform="translate(0,0) scale(3.4650000000000007,1.41)"><g><path fill="#FFFFFF" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(0.2886002886002885,0.7092198581560284)"><path fill="none" stroke="none" d="M 0 0 L 346.50000000000006 0 Q 346.50000000000006 0 346.50000000000006 0 L 346.50000000000006 141 Q 346.50000000000006 141 346.50000000000006 141 L 0 141 Q 0 141 0 141 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" d="M 0 0 M 0 0 L 2 0 M 2 0 M 4 0 L 6 0 M 6 0 M 8 0 L 10 0 M 10 0 M 12 0 L 14 0 M 14 0 M 16 0 L 18 0 M 18 0 M 20 0 L 22 0 M 22 0 M 24 0 L 26 0 M 26 0 M 28 0 L 30 0 M 30 0 M 32 0 L 34 0 M 34 0 M 36 0 L 38 0 M 38 0 M 40 0 L 42 0 M 42 0 M 44 0 L 46 0 M 46 0 M 48 0 L 50 0 M 50 0 M 52 0 L 54 0 M 54 0 M 56 0 L 58 0 M 58 0 M 60 0 L 62 0 M 62 0 M 64 0 L 66 0 M 66 0 M 68 0 L 70 0 M 70 0 M 72 0 L 74 0 M 74 0 M 76 0 L 78 0 M 78 0 M 80 0 L 82 0 M 82 0 M 84 0 L 86 0 M 86 0 M 88 0 L 90 0 M 90 0 M 92 0 L 94 0 M 94 0 M 96 0 L 98 0 M 98 0 M 100 0 L 102 0 M 102 0 M 104 0 L 106 0 M 106 0 M 108 0 L 110 0 M 110 0 M 112 0 L 114 0 M 114 0 M 116 0 L 118 0 M 118 0 M 120 0 L 122 0 M 122 0 M 124 0 L 126 0 M 126 0 M 128 0 L 130 0 M 130 0 M 132 0 L 134 0 M 134 0 M 136 0 L 138 0 M 138 0 M 140 0 L 142 0 M 142 0 M 144 0 L 146 0 M 146 0 M 148 0 L 150 0 M 150 0 M 152 0 L 154 0 M 154 0 M 156 0 L 158 0 M 158 0 M 160 0 L 162 0 M 162 0 M 164 0 L 166 0 M 166 0 M 168 0 L 170 0 M 170 0 M 172 0 L 174 0 M 174 0 M 176 0 L 178 0 M 178 0 M 180 0 L 182 0 M 182 0 M 184 0 L 186 0 M 186 0 M 188 0 L 190 0 M 190 0 M 192 0 L 194 0 M 194 0 M 196 0 L 198 0 M 198 0 M 200 0 L 202 0 M 202 0 M 204 0 L 206 0 M 206 0 M 208 0 L 210 0 M 210 0 M 212 0 L 214 0 M 214 0 M 216 0 L 218 0 M 218 0 M 220 0 L 222 0 M 222 0 M 224 0 L 226 0 M 226 0 M 228 0 L 230 0 M 230 0 M 232 0 L 234 0 M 234 0 M 236 0 L 238 0 M 238 0 M 240 0 L 242 0 M 242 0 M 244 0 L 246 0 M 246 0 M 248 0 L 250 0 M 250 0 M 252 0 L 254 0 M 254 0 M 256 0 L 258 0 M 258 0 M 260 0 L 262 0 M 262 0 M 264 0 L 266 0 M 266 0 M 268 0 L 270 0 M 270 0 M 272 0 L 274 0 M 274 0 M 276 0 L 278 0 M 278 0 M 280 0 L 282 0 M 282 0 M 284 0 L 286 0 M 286 0 M 288 0 L 290 0 M 290 0 M 292 0 L 294 0 M 294 0 M 296 0 L 298 0 M 298 0 M 300 0 L 302 0 M 302 0 M 304 0 L 306 0 M 306 0 M 308 0 L 310 0 M 310 0 M 312 0 L 314 0 M 314 0 M 316 0 L 318 0 M 318 0 M 320 0 L 322 0 M 322 0 M 324 0 L 326 0 M 326 0 M 328 0 L 330 0 M 330 0 M 332 0 L 334 0 M 334 0 M 336 0 L 338 0 M 338 0 M 340 0 L 342 0 M 342 0 M 344 0 L 346 0 M 346 0 M 346.50000000000006 1.4999999999999432 L 346.50000000000006 3.499999999999943 M 346.50000000000006 3.499999999999943 M 346.50000000000006 5.499999999999943 L 346.50000000000006 7.499999999999943 M 346.50000000000006 7.499999999999943 M 346.50000000000006 9.499999999999943 L 346.50000000000006 11.499999999999943 M 346.50000000000006 11.499999999999943 M 346.50000000000006 13.499999999999943 L 346.50000000000006 15.499999999999943 M 346.50000000000006 15.499999999999943 M 346.50000000000006 17.499999999999943 L 346.50000000000006 19.499999999999943 M 346.50000000000006 19.499999999999943 M 346.50000000000006 21.499999999999943 L 346.50000000000006 23.499999999999943 M 346.50000000000006 23.499999999999943 M 346.50000000000006 25.499999999999943 L 346.50000000000006 27.499999999999943 M 346.50000000000006 27.499999999999943 M 346.50000000000006 29.499999999999943 L 346.50000000000006 31.499999999999943 M 346.50000000000006 31.499999999999943 M 346.50000000000006 33.49999999999994 L 346.50000000000006 35.49999999999994 M 346.50000000000006 35.49999999999994 M 346.50000000000006 37.49999999999994 L 346.50000000000006 39.49999999999994 M 346.50000000000006 39.49999999999994 M 346.50000000000006 41.49999999999994 L 346.50000000000006 43.49999999999994 M 346.50000000000006 43.49999999999994 M 346.50000000000006 45.49999999999994 L 346.50000000000006 47.49999999999994 M 346.50000000000006 47.49999999999994 M 346.50000000000006 49.49999999999994 L 346.50000000000006 51.49999999999994 M 346.50000000000006 51.49999999999994 M 346.50000000000006 53.49999999999994 L 346.50000000000006 55.49999999999994 M 346.50000000000006 55.49999999999994 M 346.50000000000006 57.49999999999994 L 346.50000000000006 59.49999999999994 M 346.50000000000006 59.49999999999994 M 346.50000000000006 61.49999999999994 L 346.50000000000006 63.49999999999994 M 346.50000000000006 63.49999999999994 M 346.50000000000006 65.49999999999994 L 346.50000000000006 67.49999999999994 M 346.50000000000006 67.49999999999994 M 346.50000000000006 69.49999999999994 L 346.50000000000006 71.49999999999994 M 346.50000000000006 71.49999999999994 M 346.50000000000006 73.49999999999994 L 346.50000000000006 75.49999999999994 M 346.50000000000006 75.49999999999994 M 346.50000000000006 77.49999999999994 L 346.50000000000006 79.49999999999994 M 346.50000000000006 79.49999999999994 M 346.50000000000006 81.49999999999994 L 346.50000000000006 83.49999999999994 M 346.50000000000006 83.49999999999994 M 346.50000000000006 85.49999999999994 L 346.50000000000006 87.49999999999994 M 346.50000000000006 87.49999999999994 M 346.50000000000006 89.49999999999994 L 346.50000000000006 91.49999999999994 M 346.50000000000006 91.49999999999994 M 346.50000000000006 93.49999999999994 L 346.50000000000006 95.49999999999994 M 346.50000000000006 95.49999999999994 M 346.50000000000006 97.49999999999994 L 346.50000000000006 99.49999999999994 M 346.50000000000006 99.49999999999994 M 346.50000000000006 101.49999999999994 L 346.50000000000006 103.49999999999994 M 346.50000000000006 103.49999999999994 M 346.50000000000006 105.49999999999994 L 346.50000000000006 107.49999999999994 M 346.50000000000006 107.49999999999994 M 346.50000000000006 109.49999999999994 L 346.50000000000006 111.49999999999994 M 346.50000000000006 111.49999999999994 M 346.50000000000006 113.49999999999994 L 346.50000000000006 115.49999999999994 M 346.50000000000006 115.49999999999994 M 346.50000000000006 117.49999999999994 L 346.50000000000006 119.49999999999994 M 346.50000000000006 119.49999999999994 M 346.50000000000006 121.49999999999994 L 346.50000000000006 123.49999999999994 M 346.50000000000006 123.49999999999994 M 346.50000000000006 125.49999999999994 L 346.50000000000006 127.49999999999994 M 346.50000000000006 127.49999999999994 M 346.50000000000006 129.49999999999994 L 346.50000000000006 131.49999999999994 M 346.50000000000006 131.49999999999994 M 346.50000000000006 133.49999999999994 L 346.50000000000006 135.49999999999994 M 346.50000000000006 135.49999999999994 M 346.50000000000006 137.49999999999994 L 346.50000000000006 139.49999999999994 M 346.50000000000006 139.49999999999994 M 346.0000000000001 141 L 344.0000000000001 141 M 344.0000000000001 141 M 342.0000000000001 141 L 340.0000000000001 141 M 340.0000000000001 141 M 338.0000000000001 141 L 336.0000000000001 141 M 336.0000000000001 141 M 334.0000000000001 141 L 332.0000000000001 141 M 332.0000000000001 141 M 330.0000000000001 141 L 328.0000000000001 141 M 328.0000000000001 141 M 326.0000000000001 141 L 324.0000000000001 141 M 324.0000000000001 141 M 322.0000000000001 141 L 320.0000000000001 141 M 320.0000000000001 141 M 318.0000000000001 141 L 316.0000000000001 141 M 316.0000000000001 141 M 314.0000000000001 141 L 312.0000000000001 141 M 312.0000000000001 141 M 310.0000000000001 141 L 308.0000000000001 141 M 308.0000000000001 141 M 306.0000000000001 141 L 304.0000000000001 141 M 304.0000000000001 141 M 302.0000000000001 141 L 300.0000000000001 141 M 300.0000000000001 141 M 298.0000000000001 141 L 296.0000000000001 141 M 296.0000000000001 141 M 294.0000000000001 141 L 292.0000000000001 141 M 292.0000000000001 141 M 290.0000000000001 141 L 288.0000000000001 141 M 288.0000000000001 141 M 286.0000000000001 141 L 284.0000000000001 141 M 284.0000000000001 141 M 282.0000000000001 141 L 280.0000000000001 141 M 280.0000000000001 141 M 278.0000000000001 141 L 276.0000000000001 141 M 276.0000000000001 141 M 274.0000000000001 141 L 272.0000000000001 141 M 272.0000000000001 141 M 270.0000000000001 141 L 268.0000000000001 141 M 268.0000000000001 141 M 266.0000000000001 141 L 264.0000000000001 141 M 264.0000000000001 141 M 262.0000000000001 141 L 260.0000000000001 141 M 260.0000000000001 141 M 258.0000000000001 141 L 256.0000000000001 141 M 256.0000000000001 141 M 254.0000000000001 141 L 252.0000000000001 141 M 252.0000000000001 141 M 250.0000000000001 141 L 248.0000000000001 141 M 248.0000000000001 141 M 246.0000000000001 141 L 244.0000000000001 141 M 244.0000000000001 141 M 242.0000000000001 141 L 240.0000000000001 141 M 240.0000000000001 141 M 238.0000000000001 141 L 236.0000000000001 141 M 236.0000000000001 141 M 234.0000000000001 141 L 232.0000000000001 141 M 232.0000000000001 141 M 230.0000000000001 141 L 228.0000000000001 141 M 228.0000000000001 141 M 226.0000000000001 141 L 224.0000000000001 141 M 224.0000000000001 141 M 222.0000000000001 141 L 220.0000000000001 141 M 220.0000000000001 141 M 218.0000000000001 141 L 216.0000000000001 141 M 216.0000000000001 141 M 214.0000000000001 141 L 212.0000000000001 141 M 212.0000000000001 141 M 210.0000000000001 141 L 208.0000000000001 141 M 208.0000000000001 141 M 206.0000000000001 141 L 204.0000000000001 141 M 204.0000000000001 141 M 202.0000000000001 141 L 200.0000000000001 141 M 200.0000000000001 141 M 198.0000000000001 141 L 196.0000000000001 141 M 196.0000000000001 141 M 194.0000000000001 141 L 192.0000000000001 141 M 192.0000000000001 141 M 190.0000000000001 141 L 188.0000000000001 141 M 188.0000000000001 141 M 186.0000000000001 141 L 184.0000000000001 141 M 184.0000000000001 141 M 182.0000000000001 141 L 180.0000000000001 141 M 180.0000000000001 141 M 178.0000000000001 141 L 176.0000000000001 141 M 176.0000000000001 141 M 174.0000000000001 141 L 172.0000000000001 141 M 172.0000000000001 141 M 170.0000000000001 141 L 168.0000000000001 141 M 168.0000000000001 141 M 166.0000000000001 141 L 164.0000000000001 141 M 164.0000000000001 141 M 162.0000000000001 141 L 160.0000000000001 141 M 160.0000000000001 141 M 158.0000000000001 141 L 156.0000000000001 141 M 156.0000000000001 141 M 154.0000000000001 141 L 152.0000000000001 141 M 152.0000000000001 141 M 150.0000000000001 141 L 148.0000000000001 141 M 148.0000000000001 141 M 146.0000000000001 141 L 144.0000000000001 141 M 144.0000000000001 141 M 142.0000000000001 141 L 140.0000000000001 141 M 140.0000000000001 141 M 138.0000000000001 141 L 136.0000000000001 141 M 136.0000000000001 141 M 134.0000000000001 141 L 132.0000000000001 141 M 132.0000000000001 141 M 130.0000000000001 141 L 128.0000000000001 141 M 128.0000000000001 141 M 126.00000000000011 141 L 124.00000000000011 141 M 124.00000000000011 141 M 122.00000000000011 141 L 120.00000000000011 141 M 120.00000000000011 141 M 118.00000000000011 141 L 116.00000000000011 141 M 116.00000000000011 141 M 114.00000000000011 141 L 112.00000000000011 141 M 112.00000000000011 141 M 110.00000000000011 141 L 108.00000000000011 141 M 108.00000000000011 141 M 106.00000000000011 141 L 104.00000000000011 141 M 104.00000000000011 141 M 102.00000000000011 141 L 100.00000000000011 141 M 100.00000000000011 141 M 98.00000000000011 141 L 96.00000000000011 141 M 96.00000000000011 141 M 94.00000000000011 141 L 92.00000000000011 141 M 92.00000000000011 141 M 90.00000000000011 141 L 88.00000000000011 141 M 88.00000000000011 141 M 86.00000000000011 141 L 84.00000000000011 141 M 84.00000000000011 141 M 82.00000000000011 141 L 80.00000000000011 141 M 80.00000000000011 141 M 78.00000000000011 141 L 76.00000000000011 141 M 76.00000000000011 141 M 74.00000000000011 141 L 72.00000000000011 141 M 72.00000000000011 141 M 70.00000000000011 141 L 68.00000000000011 141 M 68.00000000000011 141 M 66.00000000000011 141 L 64.00000000000011 141 M 64.00000000000011 141 M 62.000000000000114 141 L 60.000000000000114 141 M 60.000000000000114 141 M 58.000000000000114 141 L 56.000000000000114 141 M 56.000000000000114 141 M 54.000000000000114 141 L 52.000000000000114 141 M 52.000000000000114 141 M 50.000000000000114 141 L 48.000000000000114 141 M 48.000000000000114 141 M 46.000000000000114 141 L 44.000000000000114 141 M 44.000000000000114 141 M 42.000000000000114 141 L 40.000000000000114 141 M 40.000000000000114 141 M 38.000000000000114 141 L 36.000000000000114 141 M 36.000000000000114 141 M 34.000000000000114 141 L 32.000000000000114 141 M 32.000000000000114 141 M 30.000000000000114 141 L 28.000000000000114 141 M 28.000000000000114 141 M 26.000000000000114 141 L 24.000000000000114 141 M 24.000000000000114 141 M 22.000000000000114 141 L 20.000000000000114 141 M 20.000000000000114 141 M 18.000000000000114 141 L 16.000000000000114 141 M 16.000000000000114 141 M 14.000000000000114 141 L 12.000000000000114 141 M 12.000000000000114 141 M 10.000000000000114 141 L 8.000000000000114 141 M 8.000000000000114 141 M 6.000000000000114 141 L 4.000000000000114 141 M 4.000000000000114 141 M 2.0000000000001137 141 L 1.1368683772161603e-13 141 M 1.1368683772161603e-13 141 M 0 139.0000000000001 L 0 137.0000000000001 M 0 137.0000000000001 M 0 135.0000000000001 L 0 133.0000000000001 M 0 133.0000000000001 M 0 131.0000000000001 L 0 129.0000000000001 M 0 129.0000000000001 M 0 127.00000000000011 L 0 125.00000000000011 M 0 125.00000000000011 M 0 123.00000000000011 L 0 121.00000000000011 M 0 121.00000000000011 M 0 119.00000000000011 L 0 117.00000000000011 M 0 117.00000000000011 M 0 115.00000000000011 L 0 113.00000000000011 M 0 113.00000000000011 M 0 111.00000000000011 L 0 109.00000000000011 M 0 109.00000000000011 M 0 107.00000000000011 L 0 105.00000000000011 M 0 105.00000000000011 M 0 103.00000000000011 L 0 101.00000000000011 M 0 101.00000000000011 M 0 99.00000000000011 L 0 97.00000000000011 M 0 97.00000000000011 M 0 95.00000000000011 L 0 93.00000000000011 M 0 93.00000000000011 M 0 91.00000000000011 L 0 89.00000000000011 M 0 89.00000000000011 M 0 87.00000000000011 L 0 85.00000000000011 M 0 85.00000000000011 M 0 83.00000000000011 L 0 81.00000000000011 M 0 81.00000000000011 M 0 79.00000000000011 L 0 77.00000000000011 M 0 77.00000000000011 M 0 75.00000000000011 L 0 73.00000000000011 M 0 73.00000000000011 M 0 71.00000000000011 L 0 69.00000000000011 M 0 69.00000000000011 M 0 67.00000000000011 L 0 65.00000000000011 M 0 65.00000000000011 M 0 63.000000000000114 L 0 61.000000000000114 M 0 61.000000000000114 M 0 59.000000000000114 L 0 57.000000000000114 M 0 57.000000000000114 M 0 55.000000000000114 L 0 53.000000000000114 M 0 53.000000000000114 M 0 51.000000000000114 L 0 49.000000000000114 M 0 49.000000000000114 M 0 47.000000000000114 L 0 45.000000000000114 M 0 45.000000000000114 M 0 43.000000000000114 L 0 41.000000000000114 M 0 41.000000000000114 M 0 39.000000000000114 L 0 37.000000000000114 M 0 37.000000000000114 M 0 35.000000000000114 L 0 33.000000000000114 M 0 33.000000000000114 M 0 31.000000000000114 L 0 29.000000000000114 M 0 29.000000000000114 M 0 27.000000000000114 L 0 25.000000000000114 M 0 25.000000000000114 M 0 23.000000000000114 L 0 21.000000000000114 M 0 21.000000000000114 M 0 19.000000000000114 L 0 17.000000000000114 M 0 17.000000000000114 M 0 15.000000000000114 L 0 13.000000000000114 M 0 13.000000000000114 M 0 11.000000000000114 L 0 9.000000000000114 M 0 9.000000000000114 M 0 7.000000000000114 L 0 5.000000000000114 M 0 5.000000000000114 M 0 3.0000000000001137 L 0 1.0000000000001137 M 0 1.0000000000001137 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="translate(0,0) matrix(1,0,0,1,376.75,268.5)"><g><g transform="translate(0,0) scale(3.3975,1.63)"><g><path fill="#FFFFFF" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(0.29433406916850624,0.6134969325153374)"><path fill="none" stroke="none" d="M 0 0 L 339.75 0 Q 339.75 0 339.75 0 L 339.75 163 Q 339.75 163 339.75 163 L 0 163 Q 0 163 0 163 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" d="M 0 0 M 0 0 L 2 0 M 2 0 M 4 0 L 6 0 M 6 0 M 8 0 L 10 0 M 10 0 M 12 0 L 14 0 M 14 0 M 16 0 L 18 0 M 18 0 M 20 0 L 22 0 M 22 0 M 24 0 L 26 0 M 26 0 M 28 0 L 30 0 M 30 0 M 32 0 L 34 0 M 34 0 M 36 0 L 38 0 M 38 0 M 40 0 L 42 0 M 42 0 M 44 0 L 46 0 M 46 0 M 48 0 L 50 0 M 50 0 M 52 0 L 54 0 M 54 0 M 56 0 L 58 0 M 58 0 M 60 0 L 62 0 M 62 0 M 64 0 L 66 0 M 66 0 M 68 0 L 70 0 M 70 0 M 72 0 L 74 0 M 74 0 M 76 0 L 78 0 M 78 0 M 80 0 L 82 0 M 82 0 M 84 0 L 86 0 M 86 0 M 88 0 L 90 0 M 90 0 M 92 0 L 94 0 M 94 0 M 96 0 L 98 0 M 98 0 M 100 0 L 102 0 M 102 0 M 104 0 L 106 0 M 106 0 M 108 0 L 110 0 M 110 0 M 112 0 L 114 0 M 114 0 M 116 0 L 118 0 M 118 0 M 120 0 L 122 0 M 122 0 M 124 0 L 126 0 M 126 0 M 128 0 L 130 0 M 130 0 M 132 0 L 134 0 M 134 0 M 136 0 L 138 0 M 138 0 M 140 0 L 142 0 M 142 0 M 144 0 L 146 0 M 146 0 M 148 0 L 150 0 M 150 0 M 152 0 L 154 0 M 154 0 M 156 0 L 158 0 M 158 0 M 160 0 L 162 0 M 162 0 M 164 0 L 166 0 M 166 0 M 168 0 L 170 0 M 170 0 M 172 0 L 174 0 M 174 0 M 176 0 L 178 0 M 178 0 M 180 0 L 182 0 M 182 0 M 184 0 L 186 0 M 186 0 M 188 0 L 190 0 M 190 0 M 192 0 L 194 0 M 194 0 M 196 0 L 198 0 M 198 0 M 200 0 L 202 0 M 202 0 M 204 0 L 206 0 M 206 0 M 208 0 L 210 0 M 210 0 M 212 0 L 214 0 M 214 0 M 216 0 L 218 0 M 218 0 M 220 0 L 222 0 M 222 0 M 224 0 L 226 0 M 226 0 M 228 0 L 230 0 M 230 0 M 232 0 L 234 0 M 234 0 M 236 0 L 238 0 M 238 0 M 240 0 L 242 0 M 242 0 M 244 0 L 246 0 M 246 0 M 248 0 L 250 0 M 250 0 M 252 0 L 254 0 M 254 0 M 256 0 L 258 0 M 258 0 M 260 0 L 262 0 M 262 0 M 264 0 L 266 0 M 266 0 M 268 0 L 270 0 M 270 0 M 272 0 L 274 0 M 274 0 M 276 0 L 278 0 M 278 0 M 280 0 L 282 0 M 282 0 M 284 0 L 286 0 M 286 0 M 288 0 L 290 0 M 290 0 M 292 0 L 294 0 M 294 0 M 296 0 L 298 0 M 298 0 M 300 0 L 302 0 M 302 0 M 304 0 L 306 0 M 306 0 M 308 0 L 310 0 M 310 0 M 312 0 L 314 0 M 314 0 M 316 0 L 318 0 M 318 0 M 320 0 L 322 0 M 322 0 M 324 0 L 326 0 M 326 0 M 328 0 L 330 0 M 330 0 M 332 0 L 334 0 M 334 0 M 336 0 L 338 0 M 338 0 M 339.75 0.25 L 339.75 2.25 M 339.75 2.25 M 339.75 4.25 L 339.75 6.25 M 339.75 6.25 M 339.75 8.25 L 339.75 10.25 M 339.75 10.25 M 339.75 12.25 L 339.75 14.25 M 339.75 14.25 M 339.75 16.25 L 339.75 18.25 M 339.75 18.25 M 339.75 20.25 L 339.75 22.25 M 339.75 22.25 M 339.75 24.25 L 339.75 26.25 M 339.75 26.25 M 339.75 28.25 L 339.75 30.25 M 339.75 30.25 M 339.75 32.25 L 339.75 34.25 M 339.75 34.25 M 339.75 36.25 L 339.75 38.25 M 339.75 38.25 M 339.75 40.25 L 339.75 42.25 M 339.75 42.25 M 339.75 44.25 L 339.75 46.25 M 339.75 46.25 M 339.75 48.25 L 339.75 50.25 M 339.75 50.25 M 339.75 52.25 L 339.75 54.25 M 339.75 54.25 M 339.75 56.25 L 339.75 58.25 M 339.75 58.25 M 339.75 60.25 L 339.75 62.25 M 339.75 62.25 M 339.75 64.25 L 339.75 66.25 M 339.75 66.25 M 339.75 68.25 L 339.75 70.25 M 339.75 70.25 M 339.75 72.25 L 339.75 74.25 M 339.75 74.25 M 339.75 76.25 L 339.75 78.25 M 339.75 78.25 M 339.75 80.25 L 339.75 82.25 M 339.75 82.25 M 339.75 84.25 L 339.75 86.25 M 339.75 86.25 M 339.75 88.25 L 339.75 90.25 M 339.75 90.25 M 339.75 92.25 L 339.75 94.25 M 339.75 94.25 M 339.75 96.25 L 339.75 98.25 M 339.75 98.25 M 339.75 100.25 L 339.75 102.25 M 339.75 102.25 M 339.75 104.25 L 339.75 106.25 M 339.75 106.25 M 339.75 108.25 L 339.75 110.25 M 339.75 110.25 M 339.75 112.25 L 339.75 114.25 M 339.75 114.25 M 339.75 116.25 L 339.75 118.25 M 339.75 118.25 M 339.75 120.25 L 339.75 122.25 M 339.75 122.25 M 339.75 124.25 L 339.75 126.25 M 339.75 126.25 M 339.75 128.25 L 339.75 130.25 M 339.75 130.25 M 339.75 132.25 L 339.75 134.25 M 339.75 134.25 M 339.75 136.25 L 339.75 138.25 M 339.75 138.25 M 339.75 140.25 L 339.75 142.25 M 339.75 142.25 M 339.75 144.25 L 339.75 146.25 M 339.75 146.25 M 339.75 148.25 L 339.75 150.25 M 339.75 150.25 M 339.75 152.25 L 339.75 154.25 M 339.75 154.25 M 339.75 156.25 L 339.75 158.25 M 339.75 158.25 M 339.75 160.25 L 339.75 162.25 M 339.75 162.25 M 338.5 163 L 336.5 163 M 336.5 163 M 334.5 163 L 332.5 163 M 332.5 163 M 330.5 163 L 328.5 163 M 328.5 163 M 326.5 163 L 324.5 163 M 324.5 163 M 322.5 163 L 320.5 163 M 320.5 163 M 318.5 163 L 316.5 163 M 316.5 163 M 314.5 163 L 312.5 163 M 312.5 163 M 310.5 163 L 308.5 163 M 308.5 163 M 306.5 163 L 304.5 163 M 304.5 163 M 302.5 163 L 300.5 163 M 300.5 163 M 298.5 163 L 296.5 163 M 296.5 163 M 294.5 163 L 292.5 163 M 292.5 163 M 290.5 163 L 288.5 163 M 288.5 163 M 286.5 163 L 284.5 163 M 284.5 163 M 282.5 163 L 280.5 163 M 280.5 163 M 278.5 163 L 276.5 163 M 276.5 163 M 274.5 163 L 272.5 163 M 272.5 163 M 270.5 163 L 268.5 163 M 268.5 163 M 266.5 163 L 264.5 163 M 264.5 163 M 262.5 163 L 260.5 163 M 260.5 163 M 258.5 163 L 256.5 163 M 256.5 163 M 254.5 163 L 252.5 163 M 252.5 163 M 250.5 163 L 248.5 163 M 248.5 163 M 246.5 163 L 244.5 163 M 244.5 163 M 242.5 163 L 240.5 163 M 240.5 163 M 238.5 163 L 236.5 163 M 236.5 163 M 234.5 163 L 232.5 163 M 232.5 163 M 230.5 163 L 228.5 163 M 228.5 163 M 226.5 163 L 224.5 163 M 224.5 163 M 222.5 163 L 220.5 163 M 220.5 163 M 218.5 163 L 216.5 163 M 216.5 163 M 214.5 163 L 212.5 163 M 212.5 163 M 210.5 163 L 208.5 163 M 208.5 163 M 206.5 163 L 204.5 163 M 204.5 163 M 202.5 163 L 200.5 163 M 200.5 163 M 198.5 163 L 196.5 163 M 196.5 163 M 194.5 163 L 192.5 163 M 192.5 163 M 190.5 163 L 188.5 163 M 188.5 163 M 186.5 163 L 184.5 163 M 184.5 163 M 182.5 163 L 180.5 163 M 180.5 163 M 178.5 163 L 176.5 163 M 176.5 163 M 174.5 163 L 172.5 163 M 172.5 163 M 170.5 163 L 168.5 163 M 168.5 163 M 166.5 163 L 164.5 163 M 164.5 163 M 162.5 163 L 160.5 163 M 160.5 163 M 158.5 163 L 156.5 163 M 156.5 163 M 154.5 163 L 152.5 163 M 152.5 163 M 150.5 163 L 148.5 163 M 148.5 163 M 146.5 163 L 144.5 163 M 144.5 163 M 142.5 163 L 140.5 163 M 140.5 163 M 138.5 163 L 136.5 163 M 136.5 163 M 134.5 163 L 132.5 163 M 132.5 163 M 130.5 163 L 128.5 163 M 128.5 163 M 126.5 163 L 124.5 163 M 124.5 163 M 122.5 163 L 120.5 163 M 120.5 163 M 118.5 163 L 116.5 163 M 116.5 163 M 114.5 163 L 112.5 163 M 112.5 163 M 110.5 163 L 108.5 163 M 108.5 163 M 106.5 163 L 104.5 163 M 104.5 163 M 102.5 163 L 100.5 163 M 100.5 163 M 98.5 163 L 96.5 163 M 96.5 163 M 94.5 163 L 92.5 163 M 92.5 163 M 90.5 163 L 88.5 163 M 88.5 163 M 86.5 163 L 84.5 163 M 84.5 163 M 82.5 163 L 80.5 163 M 80.5 163 M 78.5 163 L 76.5 163 M 76.5 163 M 74.5 163 L 72.5 163 M 72.5 163 M 70.5 163 L 68.5 163 M 68.5 163 M 66.5 163 L 64.5 163 M 64.5 163 M 62.5 163 L 60.5 163 M 60.5 163 M 58.5 163 L 56.5 163 M 56.5 163 M 54.5 163 L 52.5 163 M 52.5 163 M 50.5 163 L 48.5 163 M 48.5 163 M 46.5 163 L 44.5 163 M 44.5 163 M 42.5 163 L 40.5 163 M 40.5 163 M 38.5 163 L 36.5 163 M 36.5 163 M 34.5 163 L 32.5 163 M 32.5 163 M 30.5 163 L 28.5 163 M 28.5 163 M 26.5 163 L 24.5 163 M 24.5 163 M 22.5 163 L 20.5 163 M 20.5 163 M 18.5 163 L 16.5 163 M 16.5 163 M 14.5 163 L 12.5 163 M 12.5 163 M 10.5 163 L 8.5 163 M 8.5 163 M 6.5 163 L 4.5 163 M 4.5 163 M 2.5 163 L 0.5 163 M 0.5 163 M 0 161.5 L 0 159.5 M 0 159.5 M 0 157.5 L 0 155.5 M 0 155.5 M 0 153.5 L 0 151.5 M 0 151.5 M 0 149.5 L 0 147.5 M 0 147.5 M 0 145.5 L 0 143.5 M 0 143.5 M 0 141.5 L 0 139.5 M 0 139.5 M 0 137.5 L 0 135.5 M 0 135.5 M 0 133.5 L 0 131.5 M 0 131.5 M 0 129.5 L 0 127.5 M 0 127.5 M 0 125.5 L 0 123.5 M 0 123.5 M 0 121.5 L 0 119.5 M 0 119.5 M 0 117.5 L 0 115.5 M 0 115.5 M 0 113.5 L 0 111.5 M 0 111.5 M 0 109.5 L 0 107.5 M 0 107.5 M 0 105.5 L 0 103.5 M 0 103.5 M 0 101.5 L 0 99.5 M 0 99.5 M 0 97.5 L 0 95.5 M 0 95.5 M 0 93.5 L 0 91.5 M 0 91.5 M 0 89.5 L 0 87.5 M 0 87.5 M 0 85.5 L 0 83.5 M 0 83.5 M 0 81.5 L 0 79.5 M 0 79.5 M 0 77.5 L 0 75.5 M 0 75.5 M 0 73.5 L 0 71.5 M 0 71.5 M 0 69.5 L 0 67.5 M 0 67.5 M 0 65.5 L 0 63.5 M 0 63.5 M 0 61.5 L 0 59.5 M 0 59.5 M 0 57.5 L 0 55.5 M 0 55.5 M 0 53.5 L 0 51.5 M 0 51.5 M 0 49.5 L 0 47.5 M 0 47.5 M 0 45.5 L 0 43.5 M 0 43.5 M 0 41.5 L 0 39.5 M 0 39.5 M 0 37.5 L 0 35.5 M 0 35.5 M 0 33.5 L 0 31.5 M 0 31.5 M 0 29.5 L 0 27.5 M 0 27.5 M 0 25.5 L 0 23.5 M 0 23.5 M 0 21.5 L 0 19.5 M 0 19.5 M 0 17.5 L 0 15.5 M 0 15.5 M 0 13.5 L 0 11.5 M 0 11.5 M 0 9.5 L 0 7.5 M 0 7.5 M 0 5.5 L 0 3.5 M 0 3.5 M 0 1.5 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="translate(0,0) matrix(1,0,0,1,3.5000000000000284,268.5)"><g><g transform="translate(0,0) scale(3.4649999999999994,1.63)"><g><path fill="#FFFFFF" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(0.28860028860028863,0.6134969325153374)"><path fill="none" stroke="none" d="M 0 0 L 346.49999999999994 0 Q 346.49999999999994 0 346.49999999999994 0 L 346.49999999999994 163 Q 346.49999999999994 163 346.49999999999994 163 L 0 163 Q 0 163 0 163 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" d="M 0 0 M 0 0 L 2 0 M 2 0 M 4 0 L 6 0 M 6 0 M 8 0 L 10 0 M 10 0 M 12 0 L 14 0 M 14 0 M 16 0 L 18 0 M 18 0 M 20 0 L 22 0 M 22 0 M 24 0 L 26 0 M 26 0 M 28 0 L 30 0 M 30 0 M 32 0 L 34 0 M 34 0 M 36 0 L 38 0 M 38 0 M 40 0 L 42 0 M 42 0 M 44 0 L 46 0 M 46 0 M 48 0 L 50 0 M 50 0 M 52 0 L 54 0 M 54 0 M 56 0 L 58 0 M 58 0 M 60 0 L 62 0 M 62 0 M 64 0 L 66 0 M 66 0 M 68 0 L 70 0 M 70 0 M 72 0 L 74 0 M 74 0 M 76 0 L 78 0 M 78 0 M 80 0 L 82 0 M 82 0 M 84 0 L 86 0 M 86 0 M 88 0 L 90 0 M 90 0 M 92 0 L 94 0 M 94 0 M 96 0 L 98 0 M 98 0 M 100 0 L 102 0 M 102 0 M 104 0 L 106 0 M 106 0 M 108 0 L 110 0 M 110 0 M 112 0 L 114 0 M 114 0 M 116 0 L 118 0 M 118 0 M 120 0 L 122 0 M 122 0 M 124 0 L 126 0 M 126 0 M 128 0 L 130 0 M 130 0 M 132 0 L 134 0 M 134 0 M 136 0 L 138 0 M 138 0 M 140 0 L 142 0 M 142 0 M 144 0 L 146 0 M 146 0 M 148 0 L 150 0 M 150 0 M 152 0 L 154 0 M 154 0 M 156 0 L 158 0 M 158 0 M 160 0 L 162 0 M 162 0 M 164 0 L 166 0 M 166 0 M 168 0 L 170 0 M 170 0 M 172 0 L 174 0 M 174 0 M 176 0 L 178 0 M 178 0 M 180 0 L 182 0 M 182 0 M 184 0 L 186 0 M 186 0 M 188 0 L 190 0 M 190 0 M 192 0 L 194 0 M 194 0 M 196 0 L 198 0 M 198 0 M 200 0 L 202 0 M 202 0 M 204 0 L 206 0 M 206 0 M 208 0 L 210 0 M 210 0 M 212 0 L 214 0 M 214 0 M 216 0 L 218 0 M 218 0 M 220 0 L 222 0 M 222 0 M 224 0 L 226 0 M 226 0 M 228 0 L 230 0 M 230 0 M 232 0 L 234 0 M 234 0 M 236 0 L 238 0 M 238 0 M 240 0 L 242 0 M 242 0 M 244 0 L 246 0 M 246 0 M 248 0 L 250 0 M 250 0 M 252 0 L 254 0 M 254 0 M 256 0 L 258 0 M 258 0 M 260 0 L 262 0 M 262 0 M 264 0 L 266 0 M 266 0 M 268 0 L 270 0 M 270 0 M 272 0 L 274 0 M 274 0 M 276 0 L 278 0 M 278 0 M 280 0 L 282 0 M 282 0 M 284 0 L 286 0 M 286 0 M 288 0 L 290 0 M 290 0 M 292 0 L 294 0 M 294 0 M 296 0 L 298 0 M 298 0 M 300 0 L 302 0 M 302 0 M 304 0 L 306 0 M 306 0 M 308 0 L 310 0 M 310 0 M 312 0 L 314 0 M 314 0 M 316 0 L 318 0 M 318 0 M 320 0 L 322 0 M 322 0 M 324 0 L 326 0 M 326 0 M 328 0 L 330 0 M 330 0 M 332 0 L 334 0 M 334 0 M 336 0 L 338 0 M 338 0 M 340 0 L 342 0 M 342 0 M 344 0 L 346 0 M 346 0 M 346.49999999999994 1.5000000000000568 L 346.49999999999994 3.500000000000057 M 346.49999999999994 3.500000000000057 M 346.49999999999994 5.500000000000057 L 346.49999999999994 7.500000000000057 M 346.49999999999994 7.500000000000057 M 346.49999999999994 9.500000000000057 L 346.49999999999994 11.500000000000057 M 346.49999999999994 11.500000000000057 M 346.49999999999994 13.500000000000057 L 346.49999999999994 15.500000000000057 M 346.49999999999994 15.500000000000057 M 346.49999999999994 17.500000000000057 L 346.49999999999994 19.500000000000057 M 346.49999999999994 19.500000000000057 M 346.49999999999994 21.500000000000057 L 346.49999999999994 23.500000000000057 M 346.49999999999994 23.500000000000057 M 346.49999999999994 25.500000000000057 L 346.49999999999994 27.500000000000057 M 346.49999999999994 27.500000000000057 M 346.49999999999994 29.500000000000057 L 346.49999999999994 31.500000000000057 M 346.49999999999994 31.500000000000057 M 346.49999999999994 33.50000000000006 L 346.49999999999994 35.50000000000006 M 346.49999999999994 35.50000000000006 M 346.49999999999994 37.50000000000006 L 346.49999999999994 39.50000000000006 M 346.49999999999994 39.50000000000006 M 346.49999999999994 41.50000000000006 L 346.49999999999994 43.50000000000006 M 346.49999999999994 43.50000000000006 M 346.49999999999994 45.50000000000006 L 346.49999999999994 47.50000000000006 M 346.49999999999994 47.50000000000006 M 346.49999999999994 49.50000000000006 L 346.49999999999994 51.50000000000006 M 346.49999999999994 51.50000000000006 M 346.49999999999994 53.50000000000006 L 346.49999999999994 55.50000000000006 M 346.49999999999994 55.50000000000006 M 346.49999999999994 57.50000000000006 L 346.49999999999994 59.50000000000006 M 346.49999999999994 59.50000000000006 M 346.49999999999994 61.50000000000006 L 346.49999999999994 63.50000000000006 M 346.49999999999994 63.50000000000006 M 346.49999999999994 65.50000000000006 L 346.49999999999994 67.50000000000006 M 346.49999999999994 67.50000000000006 M 346.49999999999994 69.50000000000006 L 346.49999999999994 71.50000000000006 M 346.49999999999994 71.50000000000006 M 346.49999999999994 73.50000000000006 L 346.49999999999994 75.50000000000006 M 346.49999999999994 75.50000000000006 M 346.49999999999994 77.50000000000006 L 346.49999999999994 79.50000000000006 M 346.49999999999994 79.50000000000006 M 346.49999999999994 81.50000000000006 L 346.49999999999994 83.50000000000006 M 346.49999999999994 83.50000000000006 M 346.49999999999994 85.50000000000006 L 346.49999999999994 87.50000000000006 M 346.49999999999994 87.50000000000006 M 346.49999999999994 89.50000000000006 L 346.49999999999994 91.50000000000006 M 346.49999999999994 91.50000000000006 M 346.49999999999994 93.50000000000006 L 346.49999999999994 95.50000000000006 M 346.49999999999994 95.50000000000006 M 346.49999999999994 97.50000000000006 L 346.49999999999994 99.50000000000006 M 346.49999999999994 99.50000000000006 M 346.49999999999994 101.50000000000006 L 346.49999999999994 103.50000000000006 M 346.49999999999994 103.50000000000006 M 346.49999999999994 105.50000000000006 L 346.49999999999994 107.50000000000006 M 346.49999999999994 107.50000000000006 M 346.49999999999994 109.50000000000006 L 346.49999999999994 111.50000000000006 M 346.49999999999994 111.50000000000006 M 346.49999999999994 113.50000000000006 L 346.49999999999994 115.50000000000006 M 346.49999999999994 115.50000000000006 M 346.49999999999994 117.50000000000006 L 346.49999999999994 119.50000000000006 M 346.49999999999994 119.50000000000006 M 346.49999999999994 121.50000000000006 L 346.49999999999994 123.50000000000006 M 346.49999999999994 123.50000000000006 M 346.49999999999994 125.50000000000006 L 346.49999999999994 127.50000000000006 M 346.49999999999994 127.50000000000006 M 346.49999999999994 129.50000000000006 L 346.49999999999994 131.50000000000006 M 346.49999999999994 131.50000000000006 M 346.49999999999994 133.50000000000006 L 346.49999999999994 135.50000000000006 M 346.49999999999994 135.50000000000006 M 346.49999999999994 137.50000000000006 L 346.49999999999994 139.50000000000006 M 346.49999999999994 139.50000000000006 M 346.49999999999994 141.50000000000006 L 346.49999999999994 143.50000000000006 M 346.49999999999994 143.50000000000006 M 346.49999999999994 145.50000000000006 L 346.49999999999994 147.50000000000006 M 346.49999999999994 147.50000000000006 M 346.49999999999994 149.50000000000006 L 346.49999999999994 151.50000000000006 M 346.49999999999994 151.50000000000006 M 346.49999999999994 153.50000000000006 L 346.49999999999994 155.50000000000006 M 346.49999999999994 155.50000000000006 M 346.49999999999994 157.50000000000006 L 346.49999999999994 159.50000000000006 M 346.49999999999994 159.50000000000006 M 346.49999999999994 161.50000000000006 L 346.49999999999994 163 Q 346.49999999999994 163 346.49999999999994 163 L 345.9999999999999 163 M 345.9999999999999 163 M 343.9999999999999 163 L 341.9999999999999 163 M 341.9999999999999 163 M 339.9999999999999 163 L 337.9999999999999 163 M 337.9999999999999 163 M 335.9999999999999 163 L 333.9999999999999 163 M 333.9999999999999 163 M 331.9999999999999 163 L 329.9999999999999 163 M 329.9999999999999 163 M 327.9999999999999 163 L 325.9999999999999 163 M 325.9999999999999 163 M 323.9999999999999 163 L 321.9999999999999 163 M 321.9999999999999 163 M 319.9999999999999 163 L 317.9999999999999 163 M 317.9999999999999 163 M 315.9999999999999 163 L 313.9999999999999 163 M 313.9999999999999 163 M 311.9999999999999 163 L 309.9999999999999 163 M 309.9999999999999 163 M 307.9999999999999 163 L 305.9999999999999 163 M 305.9999999999999 163 M 303.9999999999999 163 L 301.9999999999999 163 M 301.9999999999999 163 M 299.9999999999999 163 L 297.9999999999999 163 M 297.9999999999999 163 M 295.9999999999999 163 L 293.9999999999999 163 M 293.9999999999999 163 M 291.9999999999999 163 L 289.9999999999999 163 M 289.9999999999999 163 M 287.9999999999999 163 L 285.9999999999999 163 M 285.9999999999999 163 M 283.9999999999999 163 L 281.9999999999999 163 M 281.9999999999999 163 M 279.9999999999999 163 L 277.9999999999999 163 M 277.9999999999999 163 M 275.9999999999999 163 L 273.9999999999999 163 M 273.9999999999999 163 M 271.9999999999999 163 L 269.9999999999999 163 M 269.9999999999999 163 M 267.9999999999999 163 L 265.9999999999999 163 M 265.9999999999999 163 M 263.9999999999999 163 L 261.9999999999999 163 M 261.9999999999999 163 M 259.9999999999999 163 L 257.9999999999999 163 M 257.9999999999999 163 M 255.9999999999999 163 L 253.9999999999999 163 M 253.9999999999999 163 M 251.9999999999999 163 L 249.9999999999999 163 M 249.9999999999999 163 M 247.9999999999999 163 L 245.9999999999999 163 M 245.9999999999999 163 M 243.9999999999999 163 L 241.9999999999999 163 M 241.9999999999999 163 M 239.9999999999999 163 L 237.9999999999999 163 M 237.9999999999999 163 M 235.9999999999999 163 L 233.9999999999999 163 M 233.9999999999999 163 M 231.9999999999999 163 L 229.9999999999999 163 M 229.9999999999999 163 M 227.9999999999999 163 L 225.9999999999999 163 M 225.9999999999999 163 M 223.9999999999999 163 L 221.9999999999999 163 M 221.9999999999999 163 M 219.9999999999999 163 L 217.9999999999999 163 M 217.9999999999999 163 M 215.9999999999999 163 L 213.9999999999999 163 M 213.9999999999999 163 M 211.9999999999999 163 L 209.9999999999999 163 M 209.9999999999999 163 M 207.9999999999999 163 L 205.9999999999999 163 M 205.9999999999999 163 M 203.9999999999999 163 L 201.9999999999999 163 M 201.9999999999999 163 M 199.9999999999999 163 L 197.9999999999999 163 M 197.9999999999999 163 M 195.9999999999999 163 L 193.9999999999999 163 M 193.9999999999999 163 M 191.9999999999999 163 L 189.9999999999999 163 M 189.9999999999999 163 M 187.9999999999999 163 L 185.9999999999999 163 M 185.9999999999999 163 M 183.9999999999999 163 L 181.9999999999999 163 M 181.9999999999999 163 M 179.9999999999999 163 L 177.9999999999999 163 M 177.9999999999999 163 M 175.9999999999999 163 L 173.9999999999999 163 M 173.9999999999999 163 M 171.9999999999999 163 L 169.9999999999999 163 M 169.9999999999999 163 M 167.9999999999999 163 L 165.9999999999999 163 M 165.9999999999999 163 M 163.9999999999999 163 L 161.9999999999999 163 M 161.9999999999999 163 M 159.9999999999999 163 L 157.9999999999999 163 M 157.9999999999999 163 M 155.9999999999999 163 L 153.9999999999999 163 M 153.9999999999999 163 M 151.9999999999999 163 L 149.9999999999999 163 M 149.9999999999999 163 M 147.9999999999999 163 L 145.9999999999999 163 M 145.9999999999999 163 M 143.9999999999999 163 L 141.9999999999999 163 M 141.9999999999999 163 M 139.9999999999999 163 L 137.9999999999999 163 M 137.9999999999999 163 M 135.9999999999999 163 L 133.9999999999999 163 M 133.9999999999999 163 M 131.9999999999999 163 L 129.9999999999999 163 M 129.9999999999999 163 M 127.99999999999989 163 L 125.99999999999989 163 M 125.99999999999989 163 M 123.99999999999989 163 L 121.99999999999989 163 M 121.99999999999989 163 M 119.99999999999989 163 L 117.99999999999989 163 M 117.99999999999989 163 M 115.99999999999989 163 L 113.99999999999989 163 M 113.99999999999989 163 M 111.99999999999989 163 L 109.99999999999989 163 M 109.99999999999989 163 M 107.99999999999989 163 L 105.99999999999989 163 M 105.99999999999989 163 M 103.99999999999989 163 L 101.99999999999989 163 M 101.99999999999989 163 M 99.99999999999989 163 L 97.99999999999989 163 M 97.99999999999989 163 M 95.99999999999989 163 L 93.99999999999989 163 M 93.99999999999989 163 M 91.99999999999989 163 L 89.99999999999989 163 M 89.99999999999989 163 M 87.99999999999989 163 L 85.99999999999989 163 M 85.99999999999989 163 M 83.99999999999989 163 L 81.99999999999989 163 M 81.99999999999989 163 M 79.99999999999989 163 L 77.99999999999989 163 M 77.99999999999989 163 M 75.99999999999989 163 L 73.99999999999989 163 M 73.99999999999989 163 M 71.99999999999989 163 L 69.99999999999989 163 M 69.99999999999989 163 M 67.99999999999989 163 L 65.99999999999989 163 M 65.99999999999989 163 M 63.999999999999886 163 L 61.999999999999886 163 M 61.999999999999886 163 M 59.999999999999886 163 L 57.999999999999886 163 M 57.999999999999886 163 M 55.999999999999886 163 L 53.999999999999886 163 M 53.999999999999886 163 M 51.999999999999886 163 L 49.999999999999886 163 M 49.999999999999886 163 M 47.999999999999886 163 L 45.999999999999886 163 M 45.999999999999886 163 M 43.999999999999886 163 L 41.999999999999886 163 M 41.999999999999886 163 M 39.999999999999886 163 L 37.999999999999886 163 M 37.999999999999886 163 M 35.999999999999886 163 L 33.999999999999886 163 M 33.999999999999886 163 M 31.999999999999886 163 L 29.999999999999886 163 M 29.999999999999886 163 M 27.999999999999886 163 L 25.999999999999886 163 M 25.999999999999886 163 M 23.999999999999886 163 L 21.999999999999886 163 M 21.999999999999886 163 M 19.999999999999886 163 L 17.999999999999886 163 M 17.999999999999886 163 M 15.999999999999886 163 L 13.999999999999886 163 M 13.999999999999886 163 M 11.999999999999886 163 L 9.999999999999886 163 M 9.999999999999886 163 M 7.999999999999886 163 L 5.999999999999886 163 M 5.999999999999886 163 M 3.9999999999998863 163 L 1.9999999999998863 163 M 1.9999999999998863 163 M 0 162.9999999999999 L 0 160.9999999999999 M 0 160.9999999999999 M 0 158.9999999999999 L 0 156.9999999999999 M 0 156.9999999999999 M 0 154.9999999999999 L 0 152.9999999999999 M 0 152.9999999999999 M 0 150.9999999999999 L 0 148.9999999999999 M 0 148.9999999999999 M 0 146.9999999999999 L 0 144.9999999999999 M 0 144.9999999999999 M 0 142.9999999999999 L 0 140.9999999999999 M 0 140.9999999999999 M 0 138.9999999999999 L 0 136.9999999999999 M 0 136.9999999999999 M 0 134.9999999999999 L 0 132.9999999999999 M 0 132.9999999999999 M 0 130.9999999999999 L 0 128.9999999999999 M 0 128.9999999999999 M 0 126.99999999999989 L 0 124.99999999999989 M 0 124.99999999999989 M 0 122.99999999999989 L 0 120.99999999999989 M 0 120.99999999999989 M 0 118.99999999999989 L 0 116.99999999999989 M 0 116.99999999999989 M 0 114.99999999999989 L 0 112.99999999999989 M 0 112.99999999999989 M 0 110.99999999999989 L 0 108.99999999999989 M 0 108.99999999999989 M 0 106.99999999999989 L 0 104.99999999999989 M 0 104.99999999999989 M 0 102.99999999999989 L 0 100.99999999999989 M 0 100.99999999999989 M 0 98.99999999999989 L 0 96.99999999999989 M 0 96.99999999999989 M 0 94.99999999999989 L 0 92.99999999999989 M 0 92.99999999999989 M 0 90.99999999999989 L 0 88.99999999999989 M 0 88.99999999999989 M 0 86.99999999999989 L 0 84.99999999999989 M 0 84.99999999999989 M 0 82.99999999999989 L 0 80.99999999999989 M 0 80.99999999999989 M 0 78.99999999999989 L 0 76.99999999999989 M 0 76.99999999999989 M 0 74.99999999999989 L 0 72.99999999999989 M 0 72.99999999999989 M 0 70.99999999999989 L 0 68.99999999999989 M 0 68.99999999999989 M 0 66.99999999999989 L 0 64.99999999999989 M 0 64.99999999999989 M 0 62.999999999999886 L 0 60.999999999999886 M 0 60.999999999999886 M 0 58.999999999999886 L 0 56.999999999999886 M 0 56.999999999999886 M 0 54.999999999999886 L 0 52.999999999999886 M 0 52.999999999999886 M 0 50.999999999999886 L 0 48.999999999999886 M 0 48.999999999999886 M 0 46.999999999999886 L 0 44.999999999999886 M 0 44.999999999999886 M 0 42.999999999999886 L 0 40.999999999999886 M 0 40.999999999999886 M 0 38.999999999999886 L 0 36.999999999999886 M 0 36.999999999999886 M 0 34.999999999999886 L 0 32.999999999999886 M 0 32.999999999999886 M 0 30.999999999999886 L 0 28.999999999999886 M 0 28.999999999999886 M 0 26.999999999999886 L 0 24.999999999999886 M 0 24.999999999999886 M 0 22.999999999999886 L 0 20.999999999999886 M 0 20.999999999999886 M 0 18.999999999999886 L 0 16.999999999999886 M 0 16.999999999999886 M 0 14.999999999999886 L 0 12.999999999999886 M 0 12.999999999999886 M 0 10.999999999999886 L 0 8.999999999999886 M 0 8.999999999999886 M 0 6.999999999999886 L 0 4.999999999999886 M 0 4.999999999999886 M 0 2.9999999999998863 L 0 0.9999999999998863 M 0 0.9999999999998863 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,444,213)"><g transform="translate(0,0)"><g transform="translate(-29.5,-90.5) translate(-414.5,-122.5) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#cccccc" d="M 448.5 217.5 L 460.5 298" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g><g transform="matrix(1,0,0,1,464.71067811865476,213)"><g transform="translate(0,0)"><g transform="translate(-68.5,-86.5) translate(-396.21067811865476,-126.5) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#cccccc" d="M 469.21067811865476 217.5 L 628.5 298" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g><g transform="matrix(1,0,0,1,378.71067811865476,75.5)"><g transform="translate(0,0)"><g transform="translate(-231.28932188134524,-95) translate(-147.4213562373095,19.5) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#cccccc" d="M 427.78932188134524 142.5 L 383.21067811865476 80" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g><g transform="matrix(1,0,0,1,290.21067811865476,75.49999999999999)"><g transform="translate(0,0)"><g transform="translate(-237,-54) translate(-53.210678118654755,-21.499999999999986) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#cccccc" d="M 341.78932188134524 79.99999999999999 L 294.71067811865476 142.5" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g><g transform="matrix(1,0,0,1,251.5,213)"><g transform="translate(0,0)"><g transform="translate(-174,-217.5) translate(-77.5,4.5) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#cccccc" d="M 274 217.5 L 256 298" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g><g transform="matrix(1,0,0,1,90.5,213)"><g transform="translate(0,0)"><g transform="translate(-187,-206.5) translate(96.5,-6.5) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#cccccc" d="M 253.28932188134524 217.5 L 95 298" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g><g transform="translate(0,0) matrix(1,0,0,1,312.5,5)"><g transform="translate(4,4) scale(1.01,1.0133333333333334)"><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="#000000" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" opacity="0.294117647"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="rgb(0,0,0)" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-opacity="0" stroke-miterlimit="10" stroke-width="2" opacity="0.294117647"/></g></g></g></g></g><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="url(#WMQTRvrWqxuI)" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="url(#WMQTRvrWqxuI)" stroke="#333333" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="scale(1,1) matrix(1,0,0,1,314.5,5) translate(8,30.5)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="1.3134765625" y="11">Level 2 Switch</text></g><g transform="translate(0,0) matrix(1,0,0,1,224,142.5)"><g transform="translate(4,4) scale(1.01,1.0133333333333334)"><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="#000000" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" opacity="0.294117647"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="rgb(0,0,0)" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-opacity="0" stroke-miterlimit="10" stroke-width="2" opacity="0.294117647"/></g></g></g></g></g><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="url(#HyUeTUFmfnXX)" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="url(#HyUeTUFmfnXX)" stroke="#333333" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="scale(1,1) matrix(1,0,0,1,226,142.5) translate(8,30.5)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="24.326171875" y="11">Host1</text></g><g transform="translate(0,0) matrix(1,0,0,1,398.5,142.5)"><g transform="translate(4,4) scale(1.01,1.0133333333333334)"><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="#000000" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" opacity="0.294117647"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="rgb(0,0,0)" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-opacity="0" stroke-miterlimit="10" stroke-width="2" opacity="0.294117647"/></g></g></g></g></g><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="url(#VJTRlcfnETOd)" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="url(#VJTRlcfnETOd)" stroke="#333333" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="scale(1,1) matrix(1,0,0,1,400.5,142.5) translate(8,30.5)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="24.326171875" y="11">Host2</text></g><g transform="scale(1,1) matrix(1,0,0,1,229,126) translate(2,0)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="0" y="11">eth0 2000::1/64</text></g><g transform="scale(1,1) matrix(1,0,0,1,403.5,126) translate(2,0)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="0" y="11">eth0 2000::2/64</text></g><g transform="scale(1,1) matrix(1,0,0,1,373.5,223) translate(2,0)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="23.2978515625" y="11">docker0 fe80::1/64</text></g><g transform="scale(1,1) matrix(1,0,0,1,199,224) translate(2,0)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="23.2978515625" y="11">docker0 fe80::1/64</text></g><g transform="translate(0,0) matrix(1,0,0,1,45,298)"><g transform="translate(4,4) scale(1.01,1.01)"><g><g transform="translate(0,0) scale(1,1)"><g><path fill="#000000" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" opacity="0.294117647"/><g transform="scale(1,1)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="rgb(0,0,0)" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" stroke-opacity="0" stroke-miterlimit="10" stroke-width="2" opacity="0.294117647"/></g></g></g></g></g><g><g transform="translate(0,0) scale(1,1)"><g><path fill="url(#yJIaTyLVTinm)" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><path fill="url(#yJIaTyLVTinm)" stroke="#333333" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="scale(1,1) matrix(1,0,0,1,47,298) translate(8,43)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="5.3125" y="11">Container1-1</text></g><g transform="translate(0,0) matrix(1,0,0,1,206,298)"><g transform="translate(4,4) scale(1.01,1.01)"><g><g transform="translate(0,0) scale(1,1)"><g><path fill="#000000" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" opacity="0.294117647"/><g transform="scale(1,1)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="rgb(0,0,0)" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" stroke-opacity="0" stroke-miterlimit="10" stroke-width="2" opacity="0.294117647"/></g></g></g></g></g><g><g transform="translate(0,0) scale(1,1)"><g><path fill="url(#aIVvGxASoFVL)" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><path fill="url(#aIVvGxASoFVL)" stroke="#333333" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="scale(1,1) matrix(1,0,0,1,208,298) translate(8,43)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="5.3125" y="11">Container1-2</text></g><g transform="scale(1,1) matrix(1,0,0,1,20.000000000000014,281) translate(2,0)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="31.295898437499986" y="11">eth0 2001::1/64</text></g><g transform="translate(0,0) matrix(1,0,0,1,410.5,298)"><g transform="translate(4,4) scale(1.01,1.01)"><g><g transform="translate(0,0) scale(1,1)"><g><path fill="#000000" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" opacity="0.294117647"/><g transform="scale(1,1)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="rgb(0,0,0)" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" stroke-opacity="0" stroke-miterlimit="10" stroke-width="2" opacity="0.294117647"/></g></g></g></g></g><g><g transform="translate(0,0) scale(1,1)"><g><path fill="url(#BOdfyPCXaAKX)" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><path fill="url(#BOdfyPCXaAKX)" stroke="#333333" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="scale(1,1) matrix(1,0,0,1,412.5,298) translate(8,43)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="5.3125" y="11">Container2-1</text></g><g transform="translate(0,0) matrix(1,0,0,1,578.5,298)"><g transform="translate(4,4) scale(1.01,1.01)"><g><g transform="translate(0,0) scale(1,1)"><g><path fill="#000000" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" opacity="0.294117647"/><g transform="scale(1,1)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="rgb(0,0,0)" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" stroke-opacity="0" stroke-miterlimit="10" stroke-width="2" opacity="0.294117647"/></g></g></g></g></g><g><g transform="translate(0,0) scale(1,1)"><g><path fill="url(#oXtAQOaNMCTL)" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><path fill="url(#oXtAQOaNMCTL)" stroke="#333333" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="scale(1,1) matrix(1,0,0,1,580.5,298) translate(8,43)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="5.3125" y="11">Container2-2</text></g><g transform="scale(1,1) matrix(1,0,0,1,17.5,143.5) translate(2,0)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="0" y="11">route -A inet6 2000::/64 dev eth0</text><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="0" y="25">route -A inet6 2002::/64 gw 2000::2</text></g><g transform="scale(1,1) matrix(1,0,0,1,376.75,407) translate(2,0)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="58.134765625" y="11">route -A inet6 default gw fe80::1 dev eth0</text></g><g transform="scale(1,1) matrix(1,0,0,1,3.5000000000000284,408) translate(2,0)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="61.50976562499997" y="11">route -A inet6 default gw fe80::1 dev eth0</text></g><g transform="matrix(1,0,0,1,-17.000680271168676,190.75)"><g transform="translate(0,0)"><g transform="translate(-785,-195) translate(802.0006802711687,4.25) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#000000" d="M 715.75 194.75 M 715.75 194.75 L 707.750000470741 194.75274442266257 M 707.750000470741 194.75274442266257 M 699.7500009414821 194.75548884532515 L 691.7500014122231 194.75823326798775 M 691.7500014122231 194.75823326798775 M 683.7500018829642 194.76097769065032 L 675.7500023537052 194.76372211331292 M 675.7500023537052 194.76372211331292 M 667.7500028244463 194.7664665359755 L 659.7500032951873 194.7692109586381 M 659.7500032951873 194.7692109586381 M 651.7500037659283 194.77195538130067 L 643.7500042366694 194.77469980396327 M 643.7500042366694 194.77469980396327 M 635.7500047074104 194.77744422662585 L 627.7500051781515 194.78018864928845 M 627.7500051781515 194.78018864928845 M 619.7500056488925 194.78293307195102 L 611.7500061196336 194.78567749461362 M 611.7500061196336 194.78567749461362 M 603.7500065903746 194.7884219172762 L 595.7500070611156 194.7911663399388 M 595.7500070611156 194.7911663399388 M 587.7500075318567 194.79391076260137 L 579.7500080025977 194.79665518526397 M 579.7500080025977 194.79665518526397 M 571.7500084733388 194.79939960792655 L 563.7500089440798 194.80214403058915 M 563.7500089440798 194.80214403058915 M 555.7500094148209 194.80488845325172 L 547.7500098855619 194.80763287591432 M 547.7500098855619 194.80763287591432 M 539.7500103563029 194.8103772985769 L 531.750010827044 194.8131217212395 M 531.750010827044 194.8131217212395 M 523.750011297785 194.81586614390207 L 515.7500117685261 194.81861056656467 M 515.7500117685261 194.81861056656467 M 507.75001223926705 194.82135498922725 L 499.75001271000804 194.82409941188985 M 499.75001271000804 194.82409941188985 M 491.750013180749 194.82684383455242 L 483.75001365149 194.82958825721502 M 483.75001365149 194.82958825721502 M 475.750014122231 194.8323326798776 L 467.750014592972 194.8350771025402 M 467.750014592972 194.8350771025402 M 459.75001506371297 194.83782152520277 L 451.75001553445395 194.84056594786537 M 451.75001553445395 194.84056594786537 M 443.75001600519494 194.84331037052794 L 435.7500164759359 194.84605479319055 M 435.7500164759359 194.84605479319055 M 427.7500169466769 194.84879921585312 L 419.7500174174179 194.85154363851572 M 419.7500174174179 194.85154363851572 M 411.7500178881589 194.8542880611783 L 403.75001835889987 194.8570324838409 M 403.75001835889987 194.8570324838409 M 395.75001882964085 194.85977690650347 L 387.75001930038184 194.86252132916607 M 387.75001930038184 194.86252132916607 M 379.7500197711228 194.86526575182864 L 371.7500202418638 194.86801017449125 M 371.7500202418638 194.86801017449125 M 363.7500207126048 194.87075459715382 L 355.7500211833458 194.87349901981642 M 355.7500211833458 194.87349901981642 M 347.75002165408677 194.876243442479 L 339.75002212482775 194.8789878651416 M 339.75002212482775 194.8789878651416 M 331.75002259556874 194.88173228780417 L 323.7500230663097 194.88447671046677 M 323.7500230663097 194.88447671046677 M 315.7500235370507 194.88722113312934 L 307.7500240077917 194.88996555579195 M 307.7500240077917 194.88996555579195 M 299.7500244785327 194.89270997845452 L 291.75002494927367 194.89545440111712 M 291.75002494927367 194.89545440111712 M 283.75002542001465 194.8981988237797 L 275.75002589075564 194.9009432464423 M 275.75002589075564 194.9009432464423 M 267.7500263614966 194.90368766910487 L 259.7500268322376 194.90643209176747 M 259.7500268322376 194.90643209176747 M 251.7500273029786 194.90917651443004 L 243.75002777371958 194.91192093709265 M 243.75002777371958 194.91192093709265 M 235.75002824446057 194.91466535975522 L 227.75002871520155 194.91740978241782 M 227.75002871520155 194.91740978241782 M 219.75002918594254 194.9201542050804 L 211.75002965668352 194.922898627743 M 211.75002965668352 194.922898627743 M 203.7500301274245 194.92564305040557 L 195.7500305981655 194.92838747306817 M 195.7500305981655 194.92838747306817 M 187.75003106890648 194.93113189573074 L 179.75003153964747 194.93387631839335 M 179.75003153964747 194.93387631839335 M 171.75003201038845 194.93662074105592 L 163.75003248112944 194.93936516371852 M 163.75003248112944 194.93936516371852 M 155.75003295187042 194.9421095863811 L 147.7500334226114 194.9448540090437 M 147.7500334226114 194.9448540090437 M 139.7500338933524 194.94759843170627 L 131.75003436409338 194.95034285436887 M 131.75003436409338 194.95034285436887 M 123.75003483483438 194.95308727703144 L 115.75003530557538 194.95583169969404 M 115.75003530557538 194.95583169969404 M 107.75003577631638 194.95857612235662 L 99.75003624705738 194.96132054501922 M 99.75003624705738 194.96132054501922 M 91.75003671779838 194.9640649676818 L 83.75003718853938 194.9668093903444 M 83.75003718853938 194.9668093903444 M 75.75003765928038 194.96955381300697 L 67.75003813002138 194.97229823566957 M 67.75003813002138 194.97229823566957 M 59.75003860076238 194.97504265833214 L 51.75003907150338 194.97778708099474 M 51.75003907150338 194.97778708099474 M 43.75003954224438 194.98053150365732 L 35.75004001298538 194.98327592631992 M 35.75004001298538 194.98327592631992 M 27.75004048372638 194.9860203489825 L 19.75004095446738 194.9887647716451 M 19.75004095446738 194.9887647716451 M 11.75004142520838 194.99150919430767 L 3.750041895949378 194.99425361697027 M 3.750041895949378 194.99425361697027 M -4.249957633309624 194.99699803963284 L -12.249957162568625 194.99974246229544 M -12.249957162568625 194.99974246229544" stroke-miterlimit="10"/></g></g></g></g><g transform="scale(1,1) matrix(1,0,0,1,507.5,144) translate(2,0)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="0" y="11">route -A inet6 2000::/64 dev eth0</text><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="0" y="25">route -A inet6 2001::/64 gw 2000::1</text><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="187.46484375" y="25">&#160;</text></g><g transform="scale(1,1) matrix(1,0,0,1,181,281) translate(2,0)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="31.2958984375" y="11">eth0 2001::2/64</text></g><g transform="scale(1,1) matrix(1,0,0,1,387,281) translate(2,0)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="31.2958984375" y="11">eth0 2002::1/64</text></g><g transform="scale(1,1) matrix(1,0,0,1,555,281) translate(2,0)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="31.2958984375" y="11">eth0 2002::2/64</text></g><g transform="scale(1,1) matrix(1,0,0,1,251,436.5) translate(2,0)"><text fill="#000000" stroke="none" font-family="Arial" font-size="10px" font-style="italic" font-weight="normal" text-decoration="none" x="0.7084960937500142" y="9">containers' link-local addresses are not displayed</text></g><g transform="scale(1,1) matrix(1,0,0,1,17.5,202) translate(2,0)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="0" y="11">route -A inet6 2001::/64&#160;dev docker0</text></g><g transform="scale(1,1) matrix(1,0,0,1,508,195) translate(2,0)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="0" y="11">route -A inet6 2002::/64&#160;dev docker0</text></g><g transform="matrix(1,0,0,1,718.7500000000001,176)"><image width="40" height="275" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAETCAYAAABENES3AAAC+klEQVR4Xu3a/00CQRCGYShApQOwAzuAUqAStRIoBTuwA7ED1AJwxuyZ84Q/Pr4xIea9ZMMPb5fJs8MwuXM8uvBjfOHxjQjQ3SEEEXQF3PnkIIKugDufHETQFXDnk4MIugLu/OocXLaANm5g3fzqAHex8CHG7SUGmHrrFtgqHksUKwVTb9oCzOclilUBPkRA94NtfYzX+b51VAQ4iQhS7DpGt17m4XuMWYy9E2FFgMf0uphsRTfA1HuJkY/HjtTLXDxb0Q1wER+eozvmbZu3vffyef+1tONugMMPyy9KrpnbXnIQoMuIIIKiAN9iEezX6QgiqApQqFWx4fkIIigKUKhFMH7qyu8Xk4PkoCrAT50qRrPAtRkzZyjUJuDXhXSuDzqKCDp6ORdBBFUB2i1VjHaLnzozZyjUJiA/dS4gggjKAjQLMtlgAoIIigI0CyIYN3K4keOmDIIIqgIUalVseD6CCKoCdNSqGBcwuYBp5gyF2gTk8psLiCCCsgDNgkzGBUz+scdLGpoFz49/7HH9EERQF6BZ0M1+zkAQQVGAZkEE424n9+rclEEQQVWAQq2KcbeTftDNGQQRFAUo1CIYHTX9oJsyCCKoClCoVTE6avpBN2cQRFAUoFCLYHTU9INuyiCIoCpAoVbF6KjpB92cQRBBUYBCLYLRUdMPuimDIIKqAIVaFaOjph90cwZBBEUBCrUIRkdNP+imDIIIqgIUalWMjpp+0M0ZBBEUBSjUIhgdNf2gmzIIIqgKUKhVMTpq+kE3ZxBEUBSgUItgdNT/vx9cxCbPexudz7O2bnvvPQ1eS2nkFupJfNouxs2JT32L92cx9lJUvZPdAHOphxhZXo4dj+3v58ZXkoOp+Brjqm1vBnOI8RFj6ujlQhWCpxRtvcoAU/G5ieW6KXrn6lUGmGstY6xbsq3icXN24vUmVm1xt+SuPZlVBFct2CnmY4neXwRYBfe9TvUWE2C5gLsgW4ygK+DOJwcRdAXc+eQggq6AO58cRNAVcOd/AkIABCN/o+CNAAAAAElFTkSuQmCC" transform="translate(0,0)"/></g><g transform="scale(1,1) matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,722.7500000000001,389.5) translate(2,0)"><text fill="#000000" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="none" x="19.3046875" y="11">managed by Docker</text></g><g transform="matrix(1,0,0,1,712.5000000000001,428)"><g transform="translate(0,0)"><g transform="translate(-757.7500000000001,-432) translate(45.25,4) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#000000" d="M 743.7683424505416 432 L 716.5000000000001 432" stroke-miterlimit="10"/></g></g></g></g><g transform="matrix(1,0,0,1,711.5000000000001,191)"><g transform="translate(0,0)"><g transform="translate(-756.7500000000001,-195) translate(45.25,4) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#000000" d="M 743.767693574114 195 L 715.5000000000001 195" stroke-miterlimit="10"/></g></g></g></g></g></svg> \ No newline at end of file
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="912.767693574114" height="467.5"><style xmlns="http://www.w3.org/1999/xhtml"></style><defs><linearGradient id="tTmKplTTMsiu" x1="0px" x2="0px" y1="100px" y2="-50px" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#e2e2e2"/><stop offset="1" stop-color="#FFFFFF"/></linearGradient><linearGradient id="oLPowxNiyzWp" x1="0px" x2="0px" y1="100px" y2="-50px" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#a4c2f4"/><stop offset="1" stop-color="#FFFFFF"/></linearGradient><linearGradient id="pXOyUAUnGLnv" x1="0px" x2="0px" y1="100px" y2="-50px" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#a4c2f4"/><stop offset="1" stop-color="#FFFFFF"/></linearGradient><linearGradient id="UNWdxKXMRvQE" x1="0px" x2="0px" y1="100px" y2="-50px" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ead1dc"/><stop offset="1" stop-color="#FFFFFF"/></linearGradient><linearGradient id="yUmhFNndNCTB" x1="0px" x2="0px" y1="100px" y2="-50px" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ead1dc"/><stop offset="1" stop-color="#FFFFFF"/></linearGradient><linearGradient id="KUGWbORyJeGF" x1="0px" x2="0px" y1="100px" y2="-50px" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ead1dc"/><stop offset="1" stop-color="#FFFFFF"/></linearGradient><linearGradient id="emTEOWhvfKgI" x1="0px" x2="0px" y1="100px" y2="-50px" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ead1dc"/><stop offset="1" stop-color="#FFFFFF"/></linearGradient></defs><g transform="translate(0,0)"><g><rect fill="#FFFFFF" stroke="none" x="0" y="0" width="912.767693574114" height="467.5"/></g><g transform="translate(0,0) matrix(1,0,0,1,447.75,107.5)"><g><g transform="translate(0,0) scale(4.160000000000001,1.41)"><g><path fill="#FFFFFF" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(0.24038461538461534,0.7092198581560284)"><path fill="none" stroke="none" d="M 0 0 L 416.0000000000001 0 Q 416.0000000000001 0 416.0000000000001 0 L 416.0000000000001 141 Q 416.0000000000001 141 416.0000000000001 141 L 0 141 Q 0 141 0 141 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" d="M 0 0 M 0 0 L 2 0 M 2 0 M 4 0 L 6 0 M 6 0 M 8 0 L 10 0 M 10 0 M 12 0 L 14 0 M 14 0 M 16 0 L 18 0 M 18 0 M 20 0 L 22 0 M 22 0 M 24 0 L 26 0 M 26 0 M 28 0 L 30 0 M 30 0 M 32 0 L 34 0 M 34 0 M 36 0 L 38 0 M 38 0 M 40 0 L 42 0 M 42 0 M 44 0 L 46 0 M 46 0 M 48 0 L 50 0 M 50 0 M 52 0 L 54 0 M 54 0 M 56 0 L 58 0 M 58 0 M 60 0 L 62 0 M 62 0 M 64 0 L 66 0 M 66 0 M 68 0 L 70 0 M 70 0 M 72 0 L 74 0 M 74 0 M 76 0 L 78 0 M 78 0 M 80 0 L 82 0 M 82 0 M 84 0 L 86 0 M 86 0 M 88 0 L 90 0 M 90 0 M 92 0 L 94 0 M 94 0 M 96 0 L 98 0 M 98 0 M 100 0 L 102 0 M 102 0 M 104 0 L 106 0 M 106 0 M 108 0 L 110 0 M 110 0 M 112 0 L 114 0 M 114 0 M 116 0 L 118 0 M 118 0 M 120 0 L 122 0 M 122 0 M 124 0 L 126 0 M 126 0 M 128 0 L 130 0 M 130 0 M 132 0 L 134 0 M 134 0 M 136 0 L 138 0 M 138 0 M 140 0 L 142 0 M 142 0 M 144 0 L 146 0 M 146 0 M 148 0 L 150 0 M 150 0 M 152 0 L 154 0 M 154 0 M 156 0 L 158 0 M 158 0 M 160 0 L 162 0 M 162 0 M 164 0 L 166 0 M 166 0 M 168 0 L 170 0 M 170 0 M 172 0 L 174 0 M 174 0 M 176 0 L 178 0 M 178 0 M 180 0 L 182 0 M 182 0 M 184 0 L 186 0 M 186 0 M 188 0 L 190 0 M 190 0 M 192 0 L 194 0 M 194 0 M 196 0 L 198 0 M 198 0 M 200 0 L 202 0 M 202 0 M 204 0 L 206 0 M 206 0 M 208 0 L 210 0 M 210 0 M 212 0 L 214 0 M 214 0 M 216 0 L 218 0 M 218 0 M 220 0 L 222 0 M 222 0 M 224 0 L 226 0 M 226 0 M 228 0 L 230 0 M 230 0 M 232 0 L 234 0 M 234 0 M 236 0 L 238 0 M 238 0 M 240 0 L 242 0 M 242 0 M 244 0 L 246 0 M 246 0 M 248 0 L 250 0 M 250 0 M 252 0 L 254 0 M 254 0 M 256 0 L 258 0 M 258 0 M 260 0 L 262 0 M 262 0 M 264 0 L 266 0 M 266 0 M 268 0 L 270 0 M 270 0 M 272 0 L 274 0 M 274 0 M 276 0 L 278 0 M 278 0 M 280 0 L 282 0 M 282 0 M 284 0 L 286 0 M 286 0 M 288 0 L 290 0 M 290 0 M 292 0 L 294 0 M 294 0 M 296 0 L 298 0 M 298 0 M 300 0 L 302 0 M 302 0 M 304 0 L 306 0 M 306 0 M 308 0 L 310 0 M 310 0 M 312 0 L 314 0 M 314 0 M 316 0 L 318 0 M 318 0 M 320 0 L 322 0 M 322 0 M 324 0 L 326 0 M 326 0 M 328 0 L 330 0 M 330 0 M 332 0 L 334 0 M 334 0 M 336 0 L 338 0 M 338 0 M 340 0 L 342 0 M 342 0 M 344 0 L 346 0 M 346 0 M 348 0 L 350 0 M 350 0 M 352 0 L 354 0 M 354 0 M 356 0 L 358 0 M 358 0 M 360 0 L 362 0 M 362 0 M 364 0 L 366 0 M 366 0 M 368 0 L 370 0 M 370 0 M 372 0 L 374 0 M 374 0 M 376 0 L 378 0 M 378 0 M 380 0 L 382 0 M 382 0 M 384 0 L 386 0 M 386 0 M 388 0 L 390 0 M 390 0 M 392 0 L 394 0 M 394 0 M 396 0 L 398 0 M 398 0 M 400 0 L 402 0 M 402 0 M 404 0 L 406 0 M 406 0 M 408 0 L 410 0 M 410 0 M 412 0 L 414 0 M 414 0 M 416 0 L 416.0000000000001 0 Q 416.0000000000001 0 416.0000000000001 0 L 416.0000000000001 1.9999999999998863 M 416.0000000000001 1.9999999999998863 M 416.0000000000001 3.9999999999998863 L 416.0000000000001 5.999999999999886 M 416.0000000000001 5.999999999999886 M 416.0000000000001 7.999999999999886 L 416.0000000000001 9.999999999999886 M 416.0000000000001 9.999999999999886 M 416.0000000000001 11.999999999999886 L 416.0000000000001 13.999999999999886 M 416.0000000000001 13.999999999999886 M 416.0000000000001 15.999999999999886 L 416.0000000000001 17.999999999999886 M 416.0000000000001 17.999999999999886 M 416.0000000000001 19.999999999999886 L 416.0000000000001 21.999999999999886 M 416.0000000000001 21.999999999999886 M 416.0000000000001 23.999999999999886 L 416.0000000000001 25.999999999999886 M 416.0000000000001 25.999999999999886 M 416.0000000000001 27.999999999999886 L 416.0000000000001 29.999999999999886 M 416.0000000000001 29.999999999999886 M 416.0000000000001 31.999999999999886 L 416.0000000000001 33.999999999999886 M 416.0000000000001 33.999999999999886 M 416.0000000000001 35.999999999999886 L 416.0000000000001 37.999999999999886 M 416.0000000000001 37.999999999999886 M 416.0000000000001 39.999999999999886 L 416.0000000000001 41.999999999999886 M 416.0000000000001 41.999999999999886 M 416.0000000000001 43.999999999999886 L 416.0000000000001 45.999999999999886 M 416.0000000000001 45.999999999999886 M 416.0000000000001 47.999999999999886 L 416.0000000000001 49.999999999999886 M 416.0000000000001 49.999999999999886 M 416.0000000000001 51.999999999999886 L 416.0000000000001 53.999999999999886 M 416.0000000000001 53.999999999999886 M 416.0000000000001 55.999999999999886 L 416.0000000000001 57.999999999999886 M 416.0000000000001 57.999999999999886 M 416.0000000000001 59.999999999999886 L 416.0000000000001 61.999999999999886 M 416.0000000000001 61.999999999999886 M 416.0000000000001 63.999999999999886 L 416.0000000000001 65.99999999999989 M 416.0000000000001 65.99999999999989 M 416.0000000000001 67.99999999999989 L 416.0000000000001 69.99999999999989 M 416.0000000000001 69.99999999999989 M 416.0000000000001 71.99999999999989 L 416.0000000000001 73.99999999999989 M 416.0000000000001 73.99999999999989 M 416.0000000000001 75.99999999999989 L 416.0000000000001 77.99999999999989 M 416.0000000000001 77.99999999999989 M 416.0000000000001 79.99999999999989 L 416.0000000000001 81.99999999999989 M 416.0000000000001 81.99999999999989 M 416.0000000000001 83.99999999999989 L 416.0000000000001 85.99999999999989 M 416.0000000000001 85.99999999999989 M 416.0000000000001 87.99999999999989 L 416.0000000000001 89.99999999999989 M 416.0000000000001 89.99999999999989 M 416.0000000000001 91.99999999999989 L 416.0000000000001 93.99999999999989 M 416.0000000000001 93.99999999999989 M 416.0000000000001 95.99999999999989 L 416.0000000000001 97.99999999999989 M 416.0000000000001 97.99999999999989 M 416.0000000000001 99.99999999999989 L 416.0000000000001 101.99999999999989 M 416.0000000000001 101.99999999999989 M 416.0000000000001 103.99999999999989 L 416.0000000000001 105.99999999999989 M 416.0000000000001 105.99999999999989 M 416.0000000000001 107.99999999999989 L 416.0000000000001 109.99999999999989 M 416.0000000000001 109.99999999999989 M 416.0000000000001 111.99999999999989 L 416.0000000000001 113.99999999999989 M 416.0000000000001 113.99999999999989 M 416.0000000000001 115.99999999999989 L 416.0000000000001 117.99999999999989 M 416.0000000000001 117.99999999999989 M 416.0000000000001 119.99999999999989 L 416.0000000000001 121.99999999999989 M 416.0000000000001 121.99999999999989 M 416.0000000000001 123.99999999999989 L 416.0000000000001 125.99999999999989 M 416.0000000000001 125.99999999999989 M 416.0000000000001 127.99999999999989 L 416.0000000000001 129.9999999999999 M 416.0000000000001 129.9999999999999 M 416.0000000000001 131.9999999999999 L 416.0000000000001 133.9999999999999 M 416.0000000000001 133.9999999999999 M 416.0000000000001 135.9999999999999 L 416.0000000000001 137.9999999999999 M 416.0000000000001 137.9999999999999 M 416.0000000000001 139.9999999999999 L 416.0000000000001 141 Q 416.0000000000001 141 416.0000000000001 141 L 415.0000000000002 141 M 415.0000000000002 141 M 413.0000000000002 141 L 411.0000000000002 141 M 411.0000000000002 141 M 409.0000000000002 141 L 407.0000000000002 141 M 407.0000000000002 141 M 405.0000000000002 141 L 403.0000000000002 141 M 403.0000000000002 141 M 401.0000000000002 141 L 399.0000000000002 141 M 399.0000000000002 141 M 397.0000000000002 141 L 395.0000000000002 141 M 395.0000000000002 141 M 393.0000000000002 141 L 391.0000000000002 141 M 391.0000000000002 141 M 389.0000000000002 141 L 387.0000000000002 141 M 387.0000000000002 141 M 385.0000000000002 141 L 383.0000000000002 141 M 383.0000000000002 141 M 381.0000000000002 141 L 379.0000000000002 141 M 379.0000000000002 141 M 377.0000000000002 141 L 375.0000000000002 141 M 375.0000000000002 141 M 373.0000000000002 141 L 371.0000000000002 141 M 371.0000000000002 141 M 369.0000000000002 141 L 367.0000000000002 141 M 367.0000000000002 141 M 365.0000000000002 141 L 363.0000000000002 141 M 363.0000000000002 141 M 361.0000000000002 141 L 359.0000000000002 141 M 359.0000000000002 141 M 357.0000000000002 141 L 355.0000000000002 141 M 355.0000000000002 141 M 353.0000000000002 141 L 351.0000000000002 141 M 351.0000000000002 141 M 349.0000000000002 141 L 347.0000000000002 141 M 347.0000000000002 141 M 345.0000000000002 141 L 343.0000000000002 141 M 343.0000000000002 141 M 341.0000000000002 141 L 339.0000000000002 141 M 339.0000000000002 141 M 337.0000000000002 141 L 335.0000000000002 141 M 335.0000000000002 141 M 333.0000000000002 141 L 331.0000000000002 141 M 331.0000000000002 141 M 329.0000000000002 141 L 327.0000000000002 141 M 327.0000000000002 141 M 325.0000000000002 141 L 323.0000000000002 141 M 323.0000000000002 141 M 321.0000000000002 141 L 319.0000000000002 141 M 319.0000000000002 141 M 317.0000000000002 141 L 315.0000000000002 141 M 315.0000000000002 141 M 313.0000000000002 141 L 311.0000000000002 141 M 311.0000000000002 141 M 309.0000000000002 141 L 307.0000000000002 141 M 307.0000000000002 141 M 305.0000000000002 141 L 303.0000000000002 141 M 303.0000000000002 141 M 301.0000000000002 141 L 299.0000000000002 141 M 299.0000000000002 141 M 297.0000000000002 141 L 295.0000000000002 141 M 295.0000000000002 141 M 293.0000000000002 141 L 291.0000000000002 141 M 291.0000000000002 141 M 289.0000000000002 141 L 287.0000000000002 141 M 287.0000000000002 141 M 285.0000000000002 141 L 283.0000000000002 141 M 283.0000000000002 141 M 281.0000000000002 141 L 279.0000000000002 141 M 279.0000000000002 141 M 277.0000000000002 141 L 275.0000000000002 141 M 275.0000000000002 141 M 273.0000000000002 141 L 271.0000000000002 141 M 271.0000000000002 141 M 269.0000000000002 141 L 267.0000000000002 141 M 267.0000000000002 141 M 265.0000000000002 141 L 263.0000000000002 141 M 263.0000000000002 141 M 261.0000000000002 141 L 259.0000000000002 141 M 259.0000000000002 141 M 257.0000000000002 141 L 255.00000000000023 141 M 255.00000000000023 141 M 253.00000000000023 141 L 251.00000000000023 141 M 251.00000000000023 141 M 249.00000000000023 141 L 247.00000000000023 141 M 247.00000000000023 141 M 245.00000000000023 141 L 243.00000000000023 141 M 243.00000000000023 141 M 241.00000000000023 141 L 239.00000000000023 141 M 239.00000000000023 141 M 237.00000000000023 141 L 235.00000000000023 141 M 235.00000000000023 141 M 233.00000000000023 141 L 231.00000000000023 141 M 231.00000000000023 141 M 229.00000000000023 141 L 227.00000000000023 141 M 227.00000000000023 141 M 225.00000000000023 141 L 223.00000000000023 141 M 223.00000000000023 141 M 221.00000000000023 141 L 219.00000000000023 141 M 219.00000000000023 141 M 217.00000000000023 141 L 215.00000000000023 141 M 215.00000000000023 141 M 213.00000000000023 141 L 211.00000000000023 141 M 211.00000000000023 141 M 209.00000000000023 141 L 207.00000000000023 141 M 207.00000000000023 141 M 205.00000000000023 141 L 203.00000000000023 141 M 203.00000000000023 141 M 201.00000000000023 141 L 199.00000000000023 141 M 199.00000000000023 141 M 197.00000000000023 141 L 195.00000000000023 141 M 195.00000000000023 141 M 193.00000000000023 141 L 191.00000000000023 141 M 191.00000000000023 141 M 189.00000000000023 141 L 187.00000000000023 141 M 187.00000000000023 141 M 185.00000000000023 141 L 183.00000000000023 141 M 183.00000000000023 141 M 181.00000000000023 141 L 179.00000000000023 141 M 179.00000000000023 141 M 177.00000000000023 141 L 175.00000000000023 141 M 175.00000000000023 141 M 173.00000000000023 141 L 171.00000000000023 141 M 171.00000000000023 141 M 169.00000000000023 141 L 167.00000000000023 141 M 167.00000000000023 141 M 165.00000000000023 141 L 163.00000000000023 141 M 163.00000000000023 141 M 161.00000000000023 141 L 159.00000000000023 141 M 159.00000000000023 141 M 157.00000000000023 141 L 155.00000000000023 141 M 155.00000000000023 141 M 153.00000000000023 141 L 151.00000000000023 141 M 151.00000000000023 141 M 149.00000000000023 141 L 147.00000000000023 141 M 147.00000000000023 141 M 145.00000000000023 141 L 143.00000000000023 141 M 143.00000000000023 141 M 141.00000000000023 141 L 139.00000000000023 141 M 139.00000000000023 141 M 137.00000000000023 141 L 135.00000000000023 141 M 135.00000000000023 141 M 133.00000000000023 141 L 131.00000000000023 141 M 131.00000000000023 141 M 129.00000000000023 141 L 127.00000000000023 141 M 127.00000000000023 141 M 125.00000000000023 141 L 123.00000000000023 141 M 123.00000000000023 141 M 121.00000000000023 141 L 119.00000000000023 141 M 119.00000000000023 141 M 117.00000000000023 141 L 115.00000000000023 141 M 115.00000000000023 141 M 113.00000000000023 141 L 111.00000000000023 141 M 111.00000000000023 141 M 109.00000000000023 141 L 107.00000000000023 141 M 107.00000000000023 141 M 105.00000000000023 141 L 103.00000000000023 141 M 103.00000000000023 141 M 101.00000000000023 141 L 99.00000000000023 141 M 99.00000000000023 141 M 97.00000000000023 141 L 95.00000000000023 141 M 95.00000000000023 141 M 93.00000000000023 141 L 91.00000000000023 141 M 91.00000000000023 141 M 89.00000000000023 141 L 87.00000000000023 141 M 87.00000000000023 141 M 85.00000000000023 141 L 83.00000000000023 141 M 83.00000000000023 141 M 81.00000000000023 141 L 79.00000000000023 141 M 79.00000000000023 141 M 77.00000000000023 141 L 75.00000000000023 141 M 75.00000000000023 141 M 73.00000000000023 141 L 71.00000000000023 141 M 71.00000000000023 141 M 69.00000000000023 141 L 67.00000000000023 141 M 67.00000000000023 141 M 65.00000000000023 141 L 63.00000000000023 141 M 63.00000000000023 141 M 61.00000000000023 141 L 59.00000000000023 141 M 59.00000000000023 141 M 57.00000000000023 141 L 55.00000000000023 141 M 55.00000000000023 141 M 53.00000000000023 141 L 51.00000000000023 141 M 51.00000000000023 141 M 49.00000000000023 141 L 47.00000000000023 141 M 47.00000000000023 141 M 45.00000000000023 141 L 43.00000000000023 141 M 43.00000000000023 141 M 41.00000000000023 141 L 39.00000000000023 141 M 39.00000000000023 141 M 37.00000000000023 141 L 35.00000000000023 141 M 35.00000000000023 141 M 33.00000000000023 141 L 31.000000000000227 141 M 31.000000000000227 141 M 29.000000000000227 141 L 27.000000000000227 141 M 27.000000000000227 141 M 25.000000000000227 141 L 23.000000000000227 141 M 23.000000000000227 141 M 21.000000000000227 141 L 19.000000000000227 141 M 19.000000000000227 141 M 17.000000000000227 141 L 15.000000000000227 141 M 15.000000000000227 141 M 13.000000000000227 141 L 11.000000000000227 141 M 11.000000000000227 141 M 9.000000000000227 141 L 7.000000000000227 141 M 7.000000000000227 141 M 5.000000000000227 141 L 3.0000000000002274 141 M 3.0000000000002274 141 M 1.0000000000002274 141 L 0 141 Q 0 141 0 141 L 0 140.00000000000023 M 0 140.00000000000023 M 0 138.00000000000023 L 0 136.00000000000023 M 0 136.00000000000023 M 0 134.00000000000023 L 0 132.00000000000023 M 0 132.00000000000023 M 0 130.00000000000023 L 0 128.00000000000023 M 0 128.00000000000023 M 0 126.00000000000023 L 0 124.00000000000023 M 0 124.00000000000023 M 0 122.00000000000023 L 0 120.00000000000023 M 0 120.00000000000023 M 0 118.00000000000023 L 0 116.00000000000023 M 0 116.00000000000023 M 0 114.00000000000023 L 0 112.00000000000023 M 0 112.00000000000023 M 0 110.00000000000023 L 0 108.00000000000023 M 0 108.00000000000023 M 0 106.00000000000023 L 0 104.00000000000023 M 0 104.00000000000023 M 0 102.00000000000023 L 0 100.00000000000023 M 0 100.00000000000023 M 0 98.00000000000023 L 0 96.00000000000023 M 0 96.00000000000023 M 0 94.00000000000023 L 0 92.00000000000023 M 0 92.00000000000023 M 0 90.00000000000023 L 0 88.00000000000023 M 0 88.00000000000023 M 0 86.00000000000023 L 0 84.00000000000023 M 0 84.00000000000023 M 0 82.00000000000023 L 0 80.00000000000023 M 0 80.00000000000023 M 0 78.00000000000023 L 0 76.00000000000023 M 0 76.00000000000023 M 0 74.00000000000023 L 0 72.00000000000023 M 0 72.00000000000023 M 0 70.00000000000023 L 0 68.00000000000023 M 0 68.00000000000023 M 0 66.00000000000023 L 0 64.00000000000023 M 0 64.00000000000023 M 0 62.00000000000023 L 0 60.00000000000023 M 0 60.00000000000023 M 0 58.00000000000023 L 0 56.00000000000023 M 0 56.00000000000023 M 0 54.00000000000023 L 0 52.00000000000023 M 0 52.00000000000023 M 0 50.00000000000023 L 0 48.00000000000023 M 0 48.00000000000023 M 0 46.00000000000023 L 0 44.00000000000023 M 0 44.00000000000023 M 0 42.00000000000023 L 0 40.00000000000023 M 0 40.00000000000023 M 0 38.00000000000023 L 0 36.00000000000023 M 0 36.00000000000023 M 0 34.00000000000023 L 0 32.00000000000023 M 0 32.00000000000023 M 0 30.000000000000227 L 0 28.000000000000227 M 0 28.000000000000227 M 0 26.000000000000227 L 0 24.000000000000227 M 0 24.000000000000227 M 0 22.000000000000227 L 0 20.000000000000227 M 0 20.000000000000227 M 0 18.000000000000227 L 0 16.000000000000227 M 0 16.000000000000227 M 0 14.000000000000227 L 0 12.000000000000227 M 0 12.000000000000227 M 0 10.000000000000227 L 0 8.000000000000227 M 0 8.000000000000227 M 0 6.000000000000227 L 0 4.000000000000227 M 0 4.000000000000227 M 0 2.0000000000002274 L 0 2.2737367544323206e-13 M 0 2.2737367544323206e-13 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="translate(0,0) matrix(1,0,0,1,3.4999999999999716,107.5)"><g><g transform="translate(0,0) scale(4.11,1.41)"><g><path fill="#FFFFFF" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(0.24330900243309,0.7092198581560284)"><path fill="none" stroke="none" d="M 0 0 L 411.00000000000006 0 Q 411.00000000000006 0 411.00000000000006 0 L 411.00000000000006 141 Q 411.00000000000006 141 411.00000000000006 141 L 0 141 Q 0 141 0 141 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" d="M 0 0 M 0 0 L 2 0 M 2 0 M 4 0 L 6 0 M 6 0 M 8 0 L 10 0 M 10 0 M 12 0 L 14 0 M 14 0 M 16 0 L 18 0 M 18 0 M 20 0 L 22 0 M 22 0 M 24 0 L 26 0 M 26 0 M 28 0 L 30 0 M 30 0 M 32 0 L 34 0 M 34 0 M 36 0 L 38 0 M 38 0 M 40 0 L 42 0 M 42 0 M 44 0 L 46 0 M 46 0 M 48 0 L 50 0 M 50 0 M 52 0 L 54 0 M 54 0 M 56 0 L 58 0 M 58 0 M 60 0 L 62 0 M 62 0 M 64 0 L 66 0 M 66 0 M 68 0 L 70 0 M 70 0 M 72 0 L 74 0 M 74 0 M 76 0 L 78 0 M 78 0 M 80 0 L 82 0 M 82 0 M 84 0 L 86 0 M 86 0 M 88 0 L 90 0 M 90 0 M 92 0 L 94 0 M 94 0 M 96 0 L 98 0 M 98 0 M 100 0 L 102 0 M 102 0 M 104 0 L 106 0 M 106 0 M 108 0 L 110 0 M 110 0 M 112 0 L 114 0 M 114 0 M 116 0 L 118 0 M 118 0 M 120 0 L 122 0 M 122 0 M 124 0 L 126 0 M 126 0 M 128 0 L 130 0 M 130 0 M 132 0 L 134 0 M 134 0 M 136 0 L 138 0 M 138 0 M 140 0 L 142 0 M 142 0 M 144 0 L 146 0 M 146 0 M 148 0 L 150 0 M 150 0 M 152 0 L 154 0 M 154 0 M 156 0 L 158 0 M 158 0 M 160 0 L 162 0 M 162 0 M 164 0 L 166 0 M 166 0 M 168 0 L 170 0 M 170 0 M 172 0 L 174 0 M 174 0 M 176 0 L 178 0 M 178 0 M 180 0 L 182 0 M 182 0 M 184 0 L 186 0 M 186 0 M 188 0 L 190 0 M 190 0 M 192 0 L 194 0 M 194 0 M 196 0 L 198 0 M 198 0 M 200 0 L 202 0 M 202 0 M 204 0 L 206 0 M 206 0 M 208 0 L 210 0 M 210 0 M 212 0 L 214 0 M 214 0 M 216 0 L 218 0 M 218 0 M 220 0 L 222 0 M 222 0 M 224 0 L 226 0 M 226 0 M 228 0 L 230 0 M 230 0 M 232 0 L 234 0 M 234 0 M 236 0 L 238 0 M 238 0 M 240 0 L 242 0 M 242 0 M 244 0 L 246 0 M 246 0 M 248 0 L 250 0 M 250 0 M 252 0 L 254 0 M 254 0 M 256 0 L 258 0 M 258 0 M 260 0 L 262 0 M 262 0 M 264 0 L 266 0 M 266 0 M 268 0 L 270 0 M 270 0 M 272 0 L 274 0 M 274 0 M 276 0 L 278 0 M 278 0 M 280 0 L 282 0 M 282 0 M 284 0 L 286 0 M 286 0 M 288 0 L 290 0 M 290 0 M 292 0 L 294 0 M 294 0 M 296 0 L 298 0 M 298 0 M 300 0 L 302 0 M 302 0 M 304 0 L 306 0 M 306 0 M 308 0 L 310 0 M 310 0 M 312 0 L 314 0 M 314 0 M 316 0 L 318 0 M 318 0 M 320 0 L 322 0 M 322 0 M 324 0 L 326 0 M 326 0 M 328 0 L 330 0 M 330 0 M 332 0 L 334 0 M 334 0 M 336 0 L 338 0 M 338 0 M 340 0 L 342 0 M 342 0 M 344 0 L 346 0 M 346 0 M 348 0 L 350 0 M 350 0 M 352 0 L 354 0 M 354 0 M 356 0 L 358 0 M 358 0 M 360 0 L 362 0 M 362 0 M 364 0 L 366 0 M 366 0 M 368 0 L 370 0 M 370 0 M 372 0 L 374 0 M 374 0 M 376 0 L 378 0 M 378 0 M 380 0 L 382 0 M 382 0 M 384 0 L 386 0 M 386 0 M 388 0 L 390 0 M 390 0 M 392 0 L 394 0 M 394 0 M 396 0 L 398 0 M 398 0 M 400 0 L 402 0 M 402 0 M 404 0 L 406 0 M 406 0 M 408 0 L 410 0 M 410 0 M 411.00000000000006 0.9999999999999432 L 411.00000000000006 2.999999999999943 M 411.00000000000006 2.999999999999943 M 411.00000000000006 4.999999999999943 L 411.00000000000006 6.999999999999943 M 411.00000000000006 6.999999999999943 M 411.00000000000006 8.999999999999943 L 411.00000000000006 10.999999999999943 M 411.00000000000006 10.999999999999943 M 411.00000000000006 12.999999999999943 L 411.00000000000006 14.999999999999943 M 411.00000000000006 14.999999999999943 M 411.00000000000006 16.999999999999943 L 411.00000000000006 18.999999999999943 M 411.00000000000006 18.999999999999943 M 411.00000000000006 20.999999999999943 L 411.00000000000006 22.999999999999943 M 411.00000000000006 22.999999999999943 M 411.00000000000006 24.999999999999943 L 411.00000000000006 26.999999999999943 M 411.00000000000006 26.999999999999943 M 411.00000000000006 28.999999999999943 L 411.00000000000006 30.999999999999943 M 411.00000000000006 30.999999999999943 M 411.00000000000006 32.99999999999994 L 411.00000000000006 34.99999999999994 M 411.00000000000006 34.99999999999994 M 411.00000000000006 36.99999999999994 L 411.00000000000006 38.99999999999994 M 411.00000000000006 38.99999999999994 M 411.00000000000006 40.99999999999994 L 411.00000000000006 42.99999999999994 M 411.00000000000006 42.99999999999994 M 411.00000000000006 44.99999999999994 L 411.00000000000006 46.99999999999994 M 411.00000000000006 46.99999999999994 M 411.00000000000006 48.99999999999994 L 411.00000000000006 50.99999999999994 M 411.00000000000006 50.99999999999994 M 411.00000000000006 52.99999999999994 L 411.00000000000006 54.99999999999994 M 411.00000000000006 54.99999999999994 M 411.00000000000006 56.99999999999994 L 411.00000000000006 58.99999999999994 M 411.00000000000006 58.99999999999994 M 411.00000000000006 60.99999999999994 L 411.00000000000006 62.99999999999994 M 411.00000000000006 62.99999999999994 M 411.00000000000006 64.99999999999994 L 411.00000000000006 66.99999999999994 M 411.00000000000006 66.99999999999994 M 411.00000000000006 68.99999999999994 L 411.00000000000006 70.99999999999994 M 411.00000000000006 70.99999999999994 M 411.00000000000006 72.99999999999994 L 411.00000000000006 74.99999999999994 M 411.00000000000006 74.99999999999994 M 411.00000000000006 76.99999999999994 L 411.00000000000006 78.99999999999994 M 411.00000000000006 78.99999999999994 M 411.00000000000006 80.99999999999994 L 411.00000000000006 82.99999999999994 M 411.00000000000006 82.99999999999994 M 411.00000000000006 84.99999999999994 L 411.00000000000006 86.99999999999994 M 411.00000000000006 86.99999999999994 M 411.00000000000006 88.99999999999994 L 411.00000000000006 90.99999999999994 M 411.00000000000006 90.99999999999994 M 411.00000000000006 92.99999999999994 L 411.00000000000006 94.99999999999994 M 411.00000000000006 94.99999999999994 M 411.00000000000006 96.99999999999994 L 411.00000000000006 98.99999999999994 M 411.00000000000006 98.99999999999994 M 411.00000000000006 100.99999999999994 L 411.00000000000006 102.99999999999994 M 411.00000000000006 102.99999999999994 M 411.00000000000006 104.99999999999994 L 411.00000000000006 106.99999999999994 M 411.00000000000006 106.99999999999994 M 411.00000000000006 108.99999999999994 L 411.00000000000006 110.99999999999994 M 411.00000000000006 110.99999999999994 M 411.00000000000006 112.99999999999994 L 411.00000000000006 114.99999999999994 M 411.00000000000006 114.99999999999994 M 411.00000000000006 116.99999999999994 L 411.00000000000006 118.99999999999994 M 411.00000000000006 118.99999999999994 M 411.00000000000006 120.99999999999994 L 411.00000000000006 122.99999999999994 M 411.00000000000006 122.99999999999994 M 411.00000000000006 124.99999999999994 L 411.00000000000006 126.99999999999994 M 411.00000000000006 126.99999999999994 M 411.00000000000006 128.99999999999994 L 411.00000000000006 130.99999999999994 M 411.00000000000006 130.99999999999994 M 411.00000000000006 132.99999999999994 L 411.00000000000006 134.99999999999994 M 411.00000000000006 134.99999999999994 M 411.00000000000006 136.99999999999994 L 411.00000000000006 138.99999999999994 M 411.00000000000006 138.99999999999994 M 411.00000000000006 140.99999999999994 L 411.00000000000006 141 Q 411.00000000000006 141 411.00000000000006 141 L 409.0000000000001 141 M 409.0000000000001 141 M 407.0000000000001 141 L 405.0000000000001 141 M 405.0000000000001 141 M 403.0000000000001 141 L 401.0000000000001 141 M 401.0000000000001 141 M 399.0000000000001 141 L 397.0000000000001 141 M 397.0000000000001 141 M 395.0000000000001 141 L 393.0000000000001 141 M 393.0000000000001 141 M 391.0000000000001 141 L 389.0000000000001 141 M 389.0000000000001 141 M 387.0000000000001 141 L 385.0000000000001 141 M 385.0000000000001 141 M 383.0000000000001 141 L 381.0000000000001 141 M 381.0000000000001 141 M 379.0000000000001 141 L 377.0000000000001 141 M 377.0000000000001 141 M 375.0000000000001 141 L 373.0000000000001 141 M 373.0000000000001 141 M 371.0000000000001 141 L 369.0000000000001 141 M 369.0000000000001 141 M 367.0000000000001 141 L 365.0000000000001 141 M 365.0000000000001 141 M 363.0000000000001 141 L 361.0000000000001 141 M 361.0000000000001 141 M 359.0000000000001 141 L 357.0000000000001 141 M 357.0000000000001 141 M 355.0000000000001 141 L 353.0000000000001 141 M 353.0000000000001 141 M 351.0000000000001 141 L 349.0000000000001 141 M 349.0000000000001 141 M 347.0000000000001 141 L 345.0000000000001 141 M 345.0000000000001 141 M 343.0000000000001 141 L 341.0000000000001 141 M 341.0000000000001 141 M 339.0000000000001 141 L 337.0000000000001 141 M 337.0000000000001 141 M 335.0000000000001 141 L 333.0000000000001 141 M 333.0000000000001 141 M 331.0000000000001 141 L 329.0000000000001 141 M 329.0000000000001 141 M 327.0000000000001 141 L 325.0000000000001 141 M 325.0000000000001 141 M 323.0000000000001 141 L 321.0000000000001 141 M 321.0000000000001 141 M 319.0000000000001 141 L 317.0000000000001 141 M 317.0000000000001 141 M 315.0000000000001 141 L 313.0000000000001 141 M 313.0000000000001 141 M 311.0000000000001 141 L 309.0000000000001 141 M 309.0000000000001 141 M 307.0000000000001 141 L 305.0000000000001 141 M 305.0000000000001 141 M 303.0000000000001 141 L 301.0000000000001 141 M 301.0000000000001 141 M 299.0000000000001 141 L 297.0000000000001 141 M 297.0000000000001 141 M 295.0000000000001 141 L 293.0000000000001 141 M 293.0000000000001 141 M 291.0000000000001 141 L 289.0000000000001 141 M 289.0000000000001 141 M 287.0000000000001 141 L 285.0000000000001 141 M 285.0000000000001 141 M 283.0000000000001 141 L 281.0000000000001 141 M 281.0000000000001 141 M 279.0000000000001 141 L 277.0000000000001 141 M 277.0000000000001 141 M 275.0000000000001 141 L 273.0000000000001 141 M 273.0000000000001 141 M 271.0000000000001 141 L 269.0000000000001 141 M 269.0000000000001 141 M 267.0000000000001 141 L 265.0000000000001 141 M 265.0000000000001 141 M 263.0000000000001 141 L 261.0000000000001 141 M 261.0000000000001 141 M 259.0000000000001 141 L 257.0000000000001 141 M 257.0000000000001 141 M 255.0000000000001 141 L 253.0000000000001 141 M 253.0000000000001 141 M 251.0000000000001 141 L 249.0000000000001 141 M 249.0000000000001 141 M 247.0000000000001 141 L 245.0000000000001 141 M 245.0000000000001 141 M 243.0000000000001 141 L 241.0000000000001 141 M 241.0000000000001 141 M 239.0000000000001 141 L 237.0000000000001 141 M 237.0000000000001 141 M 235.0000000000001 141 L 233.0000000000001 141 M 233.0000000000001 141 M 231.0000000000001 141 L 229.0000000000001 141 M 229.0000000000001 141 M 227.0000000000001 141 L 225.0000000000001 141 M 225.0000000000001 141 M 223.0000000000001 141 L 221.0000000000001 141 M 221.0000000000001 141 M 219.0000000000001 141 L 217.0000000000001 141 M 217.0000000000001 141 M 215.0000000000001 141 L 213.0000000000001 141 M 213.0000000000001 141 M 211.0000000000001 141 L 209.0000000000001 141 M 209.0000000000001 141 M 207.0000000000001 141 L 205.0000000000001 141 M 205.0000000000001 141 M 203.0000000000001 141 L 201.0000000000001 141 M 201.0000000000001 141 M 199.0000000000001 141 L 197.0000000000001 141 M 197.0000000000001 141 M 195.0000000000001 141 L 193.0000000000001 141 M 193.0000000000001 141 M 191.0000000000001 141 L 189.0000000000001 141 M 189.0000000000001 141 M 187.0000000000001 141 L 185.0000000000001 141 M 185.0000000000001 141 M 183.0000000000001 141 L 181.0000000000001 141 M 181.0000000000001 141 M 179.0000000000001 141 L 177.0000000000001 141 M 177.0000000000001 141 M 175.0000000000001 141 L 173.0000000000001 141 M 173.0000000000001 141 M 171.0000000000001 141 L 169.0000000000001 141 M 169.0000000000001 141 M 167.0000000000001 141 L 165.0000000000001 141 M 165.0000000000001 141 M 163.0000000000001 141 L 161.0000000000001 141 M 161.0000000000001 141 M 159.0000000000001 141 L 157.0000000000001 141 M 157.0000000000001 141 M 155.0000000000001 141 L 153.0000000000001 141 M 153.0000000000001 141 M 151.0000000000001 141 L 149.0000000000001 141 M 149.0000000000001 141 M 147.0000000000001 141 L 145.0000000000001 141 M 145.0000000000001 141 M 143.0000000000001 141 L 141.0000000000001 141 M 141.0000000000001 141 M 139.0000000000001 141 L 137.0000000000001 141 M 137.0000000000001 141 M 135.0000000000001 141 L 133.0000000000001 141 M 133.0000000000001 141 M 131.0000000000001 141 L 129.0000000000001 141 M 129.0000000000001 141 M 127.00000000000011 141 L 125.00000000000011 141 M 125.00000000000011 141 M 123.00000000000011 141 L 121.00000000000011 141 M 121.00000000000011 141 M 119.00000000000011 141 L 117.00000000000011 141 M 117.00000000000011 141 M 115.00000000000011 141 L 113.00000000000011 141 M 113.00000000000011 141 M 111.00000000000011 141 L 109.00000000000011 141 M 109.00000000000011 141 M 107.00000000000011 141 L 105.00000000000011 141 M 105.00000000000011 141 M 103.00000000000011 141 L 101.00000000000011 141 M 101.00000000000011 141 M 99.00000000000011 141 L 97.00000000000011 141 M 97.00000000000011 141 M 95.00000000000011 141 L 93.00000000000011 141 M 93.00000000000011 141 M 91.00000000000011 141 L 89.00000000000011 141 M 89.00000000000011 141 M 87.00000000000011 141 L 85.00000000000011 141 M 85.00000000000011 141 M 83.00000000000011 141 L 81.00000000000011 141 M 81.00000000000011 141 M 79.00000000000011 141 L 77.00000000000011 141 M 77.00000000000011 141 M 75.00000000000011 141 L 73.00000000000011 141 M 73.00000000000011 141 M 71.00000000000011 141 L 69.00000000000011 141 M 69.00000000000011 141 M 67.00000000000011 141 L 65.00000000000011 141 M 65.00000000000011 141 M 63.000000000000114 141 L 61.000000000000114 141 M 61.000000000000114 141 M 59.000000000000114 141 L 57.000000000000114 141 M 57.000000000000114 141 M 55.000000000000114 141 L 53.000000000000114 141 M 53.000000000000114 141 M 51.000000000000114 141 L 49.000000000000114 141 M 49.000000000000114 141 M 47.000000000000114 141 L 45.000000000000114 141 M 45.000000000000114 141 M 43.000000000000114 141 L 41.000000000000114 141 M 41.000000000000114 141 M 39.000000000000114 141 L 37.000000000000114 141 M 37.000000000000114 141 M 35.000000000000114 141 L 33.000000000000114 141 M 33.000000000000114 141 M 31.000000000000114 141 L 29.000000000000114 141 M 29.000000000000114 141 M 27.000000000000114 141 L 25.000000000000114 141 M 25.000000000000114 141 M 23.000000000000114 141 L 21.000000000000114 141 M 21.000000000000114 141 M 19.000000000000114 141 L 17.000000000000114 141 M 17.000000000000114 141 M 15.000000000000114 141 L 13.000000000000114 141 M 13.000000000000114 141 M 11.000000000000114 141 L 9.000000000000114 141 M 9.000000000000114 141 M 7.000000000000114 141 L 5.000000000000114 141 M 5.000000000000114 141 M 3.0000000000001137 141 L 1.0000000000001137 141 M 1.0000000000001137 141 M 0 140.0000000000001 L 0 138.0000000000001 M 0 138.0000000000001 M 0 136.0000000000001 L 0 134.0000000000001 M 0 134.0000000000001 M 0 132.0000000000001 L 0 130.0000000000001 M 0 130.0000000000001 M 0 128.0000000000001 L 0 126.00000000000011 M 0 126.00000000000011 M 0 124.00000000000011 L 0 122.00000000000011 M 0 122.00000000000011 M 0 120.00000000000011 L 0 118.00000000000011 M 0 118.00000000000011 M 0 116.00000000000011 L 0 114.00000000000011 M 0 114.00000000000011 M 0 112.00000000000011 L 0 110.00000000000011 M 0 110.00000000000011 M 0 108.00000000000011 L 0 106.00000000000011 M 0 106.00000000000011 M 0 104.00000000000011 L 0 102.00000000000011 M 0 102.00000000000011 M 0 100.00000000000011 L 0 98.00000000000011 M 0 98.00000000000011 M 0 96.00000000000011 L 0 94.00000000000011 M 0 94.00000000000011 M 0 92.00000000000011 L 0 90.00000000000011 M 0 90.00000000000011 M 0 88.00000000000011 L 0 86.00000000000011 M 0 86.00000000000011 M 0 84.00000000000011 L 0 82.00000000000011 M 0 82.00000000000011 M 0 80.00000000000011 L 0 78.00000000000011 M 0 78.00000000000011 M 0 76.00000000000011 L 0 74.00000000000011 M 0 74.00000000000011 M 0 72.00000000000011 L 0 70.00000000000011 M 0 70.00000000000011 M 0 68.00000000000011 L 0 66.00000000000011 M 0 66.00000000000011 M 0 64.00000000000011 L 0 62.000000000000114 M 0 62.000000000000114 M 0 60.000000000000114 L 0 58.000000000000114 M 0 58.000000000000114 M 0 56.000000000000114 L 0 54.000000000000114 M 0 54.000000000000114 M 0 52.000000000000114 L 0 50.000000000000114 M 0 50.000000000000114 M 0 48.000000000000114 L 0 46.000000000000114 M 0 46.000000000000114 M 0 44.000000000000114 L 0 42.000000000000114 M 0 42.000000000000114 M 0 40.000000000000114 L 0 38.000000000000114 M 0 38.000000000000114 M 0 36.000000000000114 L 0 34.000000000000114 M 0 34.000000000000114 M 0 32.000000000000114 L 0 30.000000000000114 M 0 30.000000000000114 M 0 28.000000000000114 L 0 26.000000000000114 M 0 26.000000000000114 M 0 24.000000000000114 L 0 22.000000000000114 M 0 22.000000000000114 M 0 20.000000000000114 L 0 18.000000000000114 M 0 18.000000000000114 M 0 16.000000000000114 L 0 14.000000000000114 M 0 14.000000000000114 M 0 12.000000000000114 L 0 10.000000000000114 M 0 10.000000000000114 M 0 8.000000000000114 L 0 6.000000000000114 M 0 6.000000000000114 M 0 4.000000000000114 L 0 2.0000000000001137 M 0 2.0000000000001137 M 0 1.1368683772161603e-13 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="translate(0,0) matrix(1,0,0,1,447.75,268.5)"><g><g transform="translate(0,0) scale(4.160000000000001,1.63)"><g><path fill="#FFFFFF" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(0.24038461538461534,0.6134969325153374)"><path fill="none" stroke="none" d="M 0 0 L 416.0000000000001 0 Q 416.0000000000001 0 416.0000000000001 0 L 416.0000000000001 163 Q 416.0000000000001 163 416.0000000000001 163 L 0 163 Q 0 163 0 163 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" d="M 0 0 M 0 0 L 2 0 M 2 0 M 4 0 L 6 0 M 6 0 M 8 0 L 10 0 M 10 0 M 12 0 L 14 0 M 14 0 M 16 0 L 18 0 M 18 0 M 20 0 L 22 0 M 22 0 M 24 0 L 26 0 M 26 0 M 28 0 L 30 0 M 30 0 M 32 0 L 34 0 M 34 0 M 36 0 L 38 0 M 38 0 M 40 0 L 42 0 M 42 0 M 44 0 L 46 0 M 46 0 M 48 0 L 50 0 M 50 0 M 52 0 L 54 0 M 54 0 M 56 0 L 58 0 M 58 0 M 60 0 L 62 0 M 62 0 M 64 0 L 66 0 M 66 0 M 68 0 L 70 0 M 70 0 M 72 0 L 74 0 M 74 0 M 76 0 L 78 0 M 78 0 M 80 0 L 82 0 M 82 0 M 84 0 L 86 0 M 86 0 M 88 0 L 90 0 M 90 0 M 92 0 L 94 0 M 94 0 M 96 0 L 98 0 M 98 0 M 100 0 L 102 0 M 102 0 M 104 0 L 106 0 M 106 0 M 108 0 L 110 0 M 110 0 M 112 0 L 114 0 M 114 0 M 116 0 L 118 0 M 118 0 M 120 0 L 122 0 M 122 0 M 124 0 L 126 0 M 126 0 M 128 0 L 130 0 M 130 0 M 132 0 L 134 0 M 134 0 M 136 0 L 138 0 M 138 0 M 140 0 L 142 0 M 142 0 M 144 0 L 146 0 M 146 0 M 148 0 L 150 0 M 150 0 M 152 0 L 154 0 M 154 0 M 156 0 L 158 0 M 158 0 M 160 0 L 162 0 M 162 0 M 164 0 L 166 0 M 166 0 M 168 0 L 170 0 M 170 0 M 172 0 L 174 0 M 174 0 M 176 0 L 178 0 M 178 0 M 180 0 L 182 0 M 182 0 M 184 0 L 186 0 M 186 0 M 188 0 L 190 0 M 190 0 M 192 0 L 194 0 M 194 0 M 196 0 L 198 0 M 198 0 M 200 0 L 202 0 M 202 0 M 204 0 L 206 0 M 206 0 M 208 0 L 210 0 M 210 0 M 212 0 L 214 0 M 214 0 M 216 0 L 218 0 M 218 0 M 220 0 L 222 0 M 222 0 M 224 0 L 226 0 M 226 0 M 228 0 L 230 0 M 230 0 M 232 0 L 234 0 M 234 0 M 236 0 L 238 0 M 238 0 M 240 0 L 242 0 M 242 0 M 244 0 L 246 0 M 246 0 M 248 0 L 250 0 M 250 0 M 252 0 L 254 0 M 254 0 M 256 0 L 258 0 M 258 0 M 260 0 L 262 0 M 262 0 M 264 0 L 266 0 M 266 0 M 268 0 L 270 0 M 270 0 M 272 0 L 274 0 M 274 0 M 276 0 L 278 0 M 278 0 M 280 0 L 282 0 M 282 0 M 284 0 L 286 0 M 286 0 M 288 0 L 290 0 M 290 0 M 292 0 L 294 0 M 294 0 M 296 0 L 298 0 M 298 0 M 300 0 L 302 0 M 302 0 M 304 0 L 306 0 M 306 0 M 308 0 L 310 0 M 310 0 M 312 0 L 314 0 M 314 0 M 316 0 L 318 0 M 318 0 M 320 0 L 322 0 M 322 0 M 324 0 L 326 0 M 326 0 M 328 0 L 330 0 M 330 0 M 332 0 L 334 0 M 334 0 M 336 0 L 338 0 M 338 0 M 340 0 L 342 0 M 342 0 M 344 0 L 346 0 M 346 0 M 348 0 L 350 0 M 350 0 M 352 0 L 354 0 M 354 0 M 356 0 L 358 0 M 358 0 M 360 0 L 362 0 M 362 0 M 364 0 L 366 0 M 366 0 M 368 0 L 370 0 M 370 0 M 372 0 L 374 0 M 374 0 M 376 0 L 378 0 M 378 0 M 380 0 L 382 0 M 382 0 M 384 0 L 386 0 M 386 0 M 388 0 L 390 0 M 390 0 M 392 0 L 394 0 M 394 0 M 396 0 L 398 0 M 398 0 M 400 0 L 402 0 M 402 0 M 404 0 L 406 0 M 406 0 M 408 0 L 410 0 M 410 0 M 412 0 L 414 0 M 414 0 M 416 0 L 416.0000000000001 0 Q 416.0000000000001 0 416.0000000000001 0 L 416.0000000000001 1.9999999999998863 M 416.0000000000001 1.9999999999998863 M 416.0000000000001 3.9999999999998863 L 416.0000000000001 5.999999999999886 M 416.0000000000001 5.999999999999886 M 416.0000000000001 7.999999999999886 L 416.0000000000001 9.999999999999886 M 416.0000000000001 9.999999999999886 M 416.0000000000001 11.999999999999886 L 416.0000000000001 13.999999999999886 M 416.0000000000001 13.999999999999886 M 416.0000000000001 15.999999999999886 L 416.0000000000001 17.999999999999886 M 416.0000000000001 17.999999999999886 M 416.0000000000001 19.999999999999886 L 416.0000000000001 21.999999999999886 M 416.0000000000001 21.999999999999886 M 416.0000000000001 23.999999999999886 L 416.0000000000001 25.999999999999886 M 416.0000000000001 25.999999999999886 M 416.0000000000001 27.999999999999886 L 416.0000000000001 29.999999999999886 M 416.0000000000001 29.999999999999886 M 416.0000000000001 31.999999999999886 L 416.0000000000001 33.999999999999886 M 416.0000000000001 33.999999999999886 M 416.0000000000001 35.999999999999886 L 416.0000000000001 37.999999999999886 M 416.0000000000001 37.999999999999886 M 416.0000000000001 39.999999999999886 L 416.0000000000001 41.999999999999886 M 416.0000000000001 41.999999999999886 M 416.0000000000001 43.999999999999886 L 416.0000000000001 45.999999999999886 M 416.0000000000001 45.999999999999886 M 416.0000000000001 47.999999999999886 L 416.0000000000001 49.999999999999886 M 416.0000000000001 49.999999999999886 M 416.0000000000001 51.999999999999886 L 416.0000000000001 53.999999999999886 M 416.0000000000001 53.999999999999886 M 416.0000000000001 55.999999999999886 L 416.0000000000001 57.999999999999886 M 416.0000000000001 57.999999999999886 M 416.0000000000001 59.999999999999886 L 416.0000000000001 61.999999999999886 M 416.0000000000001 61.999999999999886 M 416.0000000000001 63.999999999999886 L 416.0000000000001 65.99999999999989 M 416.0000000000001 65.99999999999989 M 416.0000000000001 67.99999999999989 L 416.0000000000001 69.99999999999989 M 416.0000000000001 69.99999999999989 M 416.0000000000001 71.99999999999989 L 416.0000000000001 73.99999999999989 M 416.0000000000001 73.99999999999989 M 416.0000000000001 75.99999999999989 L 416.0000000000001 77.99999999999989 M 416.0000000000001 77.99999999999989 M 416.0000000000001 79.99999999999989 L 416.0000000000001 81.99999999999989 M 416.0000000000001 81.99999999999989 M 416.0000000000001 83.99999999999989 L 416.0000000000001 85.99999999999989 M 416.0000000000001 85.99999999999989 M 416.0000000000001 87.99999999999989 L 416.0000000000001 89.99999999999989 M 416.0000000000001 89.99999999999989 M 416.0000000000001 91.99999999999989 L 416.0000000000001 93.99999999999989 M 416.0000000000001 93.99999999999989 M 416.0000000000001 95.99999999999989 L 416.0000000000001 97.99999999999989 M 416.0000000000001 97.99999999999989 M 416.0000000000001 99.99999999999989 L 416.0000000000001 101.99999999999989 M 416.0000000000001 101.99999999999989 M 416.0000000000001 103.99999999999989 L 416.0000000000001 105.99999999999989 M 416.0000000000001 105.99999999999989 M 416.0000000000001 107.99999999999989 L 416.0000000000001 109.99999999999989 M 416.0000000000001 109.99999999999989 M 416.0000000000001 111.99999999999989 L 416.0000000000001 113.99999999999989 M 416.0000000000001 113.99999999999989 M 416.0000000000001 115.99999999999989 L 416.0000000000001 117.99999999999989 M 416.0000000000001 117.99999999999989 M 416.0000000000001 119.99999999999989 L 416.0000000000001 121.99999999999989 M 416.0000000000001 121.99999999999989 M 416.0000000000001 123.99999999999989 L 416.0000000000001 125.99999999999989 M 416.0000000000001 125.99999999999989 M 416.0000000000001 127.99999999999989 L 416.0000000000001 129.9999999999999 M 416.0000000000001 129.9999999999999 M 416.0000000000001 131.9999999999999 L 416.0000000000001 133.9999999999999 M 416.0000000000001 133.9999999999999 M 416.0000000000001 135.9999999999999 L 416.0000000000001 137.9999999999999 M 416.0000000000001 137.9999999999999 M 416.0000000000001 139.9999999999999 L 416.0000000000001 141.9999999999999 M 416.0000000000001 141.9999999999999 M 416.0000000000001 143.9999999999999 L 416.0000000000001 145.9999999999999 M 416.0000000000001 145.9999999999999 M 416.0000000000001 147.9999999999999 L 416.0000000000001 149.9999999999999 M 416.0000000000001 149.9999999999999 M 416.0000000000001 151.9999999999999 L 416.0000000000001 153.9999999999999 M 416.0000000000001 153.9999999999999 M 416.0000000000001 155.9999999999999 L 416.0000000000001 157.9999999999999 M 416.0000000000001 157.9999999999999 M 416.0000000000001 159.9999999999999 L 416.0000000000001 161.9999999999999 M 416.0000000000001 161.9999999999999 M 415.0000000000002 163 L 413.0000000000002 163 M 413.0000000000002 163 M 411.0000000000002 163 L 409.0000000000002 163 M 409.0000000000002 163 M 407.0000000000002 163 L 405.0000000000002 163 M 405.0000000000002 163 M 403.0000000000002 163 L 401.0000000000002 163 M 401.0000000000002 163 M 399.0000000000002 163 L 397.0000000000002 163 M 397.0000000000002 163 M 395.0000000000002 163 L 393.0000000000002 163 M 393.0000000000002 163 M 391.0000000000002 163 L 389.0000000000002 163 M 389.0000000000002 163 M 387.0000000000002 163 L 385.0000000000002 163 M 385.0000000000002 163 M 383.0000000000002 163 L 381.0000000000002 163 M 381.0000000000002 163 M 379.0000000000002 163 L 377.0000000000002 163 M 377.0000000000002 163 M 375.0000000000002 163 L 373.0000000000002 163 M 373.0000000000002 163 M 371.0000000000002 163 L 369.0000000000002 163 M 369.0000000000002 163 M 367.0000000000002 163 L 365.0000000000002 163 M 365.0000000000002 163 M 363.0000000000002 163 L 361.0000000000002 163 M 361.0000000000002 163 M 359.0000000000002 163 L 357.0000000000002 163 M 357.0000000000002 163 M 355.0000000000002 163 L 353.0000000000002 163 M 353.0000000000002 163 M 351.0000000000002 163 L 349.0000000000002 163 M 349.0000000000002 163 M 347.0000000000002 163 L 345.0000000000002 163 M 345.0000000000002 163 M 343.0000000000002 163 L 341.0000000000002 163 M 341.0000000000002 163 M 339.0000000000002 163 L 337.0000000000002 163 M 337.0000000000002 163 M 335.0000000000002 163 L 333.0000000000002 163 M 333.0000000000002 163 M 331.0000000000002 163 L 329.0000000000002 163 M 329.0000000000002 163 M 327.0000000000002 163 L 325.0000000000002 163 M 325.0000000000002 163 M 323.0000000000002 163 L 321.0000000000002 163 M 321.0000000000002 163 M 319.0000000000002 163 L 317.0000000000002 163 M 317.0000000000002 163 M 315.0000000000002 163 L 313.0000000000002 163 M 313.0000000000002 163 M 311.0000000000002 163 L 309.0000000000002 163 M 309.0000000000002 163 M 307.0000000000002 163 L 305.0000000000002 163 M 305.0000000000002 163 M 303.0000000000002 163 L 301.0000000000002 163 M 301.0000000000002 163 M 299.0000000000002 163 L 297.0000000000002 163 M 297.0000000000002 163 M 295.0000000000002 163 L 293.0000000000002 163 M 293.0000000000002 163 M 291.0000000000002 163 L 289.0000000000002 163 M 289.0000000000002 163 M 287.0000000000002 163 L 285.0000000000002 163 M 285.0000000000002 163 M 283.0000000000002 163 L 281.0000000000002 163 M 281.0000000000002 163 M 279.0000000000002 163 L 277.0000000000002 163 M 277.0000000000002 163 M 275.0000000000002 163 L 273.0000000000002 163 M 273.0000000000002 163 M 271.0000000000002 163 L 269.0000000000002 163 M 269.0000000000002 163 M 267.0000000000002 163 L 265.0000000000002 163 M 265.0000000000002 163 M 263.0000000000002 163 L 261.0000000000002 163 M 261.0000000000002 163 M 259.0000000000002 163 L 257.0000000000002 163 M 257.0000000000002 163 M 255.00000000000023 163 L 253.00000000000023 163 M 253.00000000000023 163 M 251.00000000000023 163 L 249.00000000000023 163 M 249.00000000000023 163 M 247.00000000000023 163 L 245.00000000000023 163 M 245.00000000000023 163 M 243.00000000000023 163 L 241.00000000000023 163 M 241.00000000000023 163 M 239.00000000000023 163 L 237.00000000000023 163 M 237.00000000000023 163 M 235.00000000000023 163 L 233.00000000000023 163 M 233.00000000000023 163 M 231.00000000000023 163 L 229.00000000000023 163 M 229.00000000000023 163 M 227.00000000000023 163 L 225.00000000000023 163 M 225.00000000000023 163 M 223.00000000000023 163 L 221.00000000000023 163 M 221.00000000000023 163 M 219.00000000000023 163 L 217.00000000000023 163 M 217.00000000000023 163 M 215.00000000000023 163 L 213.00000000000023 163 M 213.00000000000023 163 M 211.00000000000023 163 L 209.00000000000023 163 M 209.00000000000023 163 M 207.00000000000023 163 L 205.00000000000023 163 M 205.00000000000023 163 M 203.00000000000023 163 L 201.00000000000023 163 M 201.00000000000023 163 M 199.00000000000023 163 L 197.00000000000023 163 M 197.00000000000023 163 M 195.00000000000023 163 L 193.00000000000023 163 M 193.00000000000023 163 M 191.00000000000023 163 L 189.00000000000023 163 M 189.00000000000023 163 M 187.00000000000023 163 L 185.00000000000023 163 M 185.00000000000023 163 M 183.00000000000023 163 L 181.00000000000023 163 M 181.00000000000023 163 M 179.00000000000023 163 L 177.00000000000023 163 M 177.00000000000023 163 M 175.00000000000023 163 L 173.00000000000023 163 M 173.00000000000023 163 M 171.00000000000023 163 L 169.00000000000023 163 M 169.00000000000023 163 M 167.00000000000023 163 L 165.00000000000023 163 M 165.00000000000023 163 M 163.00000000000023 163 L 161.00000000000023 163 M 161.00000000000023 163 M 159.00000000000023 163 L 157.00000000000023 163 M 157.00000000000023 163 M 155.00000000000023 163 L 153.00000000000023 163 M 153.00000000000023 163 M 151.00000000000023 163 L 149.00000000000023 163 M 149.00000000000023 163 M 147.00000000000023 163 L 145.00000000000023 163 M 145.00000000000023 163 M 143.00000000000023 163 L 141.00000000000023 163 M 141.00000000000023 163 M 139.00000000000023 163 L 137.00000000000023 163 M 137.00000000000023 163 M 135.00000000000023 163 L 133.00000000000023 163 M 133.00000000000023 163 M 131.00000000000023 163 L 129.00000000000023 163 M 129.00000000000023 163 M 127.00000000000023 163 L 125.00000000000023 163 M 125.00000000000023 163 M 123.00000000000023 163 L 121.00000000000023 163 M 121.00000000000023 163 M 119.00000000000023 163 L 117.00000000000023 163 M 117.00000000000023 163 M 115.00000000000023 163 L 113.00000000000023 163 M 113.00000000000023 163 M 111.00000000000023 163 L 109.00000000000023 163 M 109.00000000000023 163 M 107.00000000000023 163 L 105.00000000000023 163 M 105.00000000000023 163 M 103.00000000000023 163 L 101.00000000000023 163 M 101.00000000000023 163 M 99.00000000000023 163 L 97.00000000000023 163 M 97.00000000000023 163 M 95.00000000000023 163 L 93.00000000000023 163 M 93.00000000000023 163 M 91.00000000000023 163 L 89.00000000000023 163 M 89.00000000000023 163 M 87.00000000000023 163 L 85.00000000000023 163 M 85.00000000000023 163 M 83.00000000000023 163 L 81.00000000000023 163 M 81.00000000000023 163 M 79.00000000000023 163 L 77.00000000000023 163 M 77.00000000000023 163 M 75.00000000000023 163 L 73.00000000000023 163 M 73.00000000000023 163 M 71.00000000000023 163 L 69.00000000000023 163 M 69.00000000000023 163 M 67.00000000000023 163 L 65.00000000000023 163 M 65.00000000000023 163 M 63.00000000000023 163 L 61.00000000000023 163 M 61.00000000000023 163 M 59.00000000000023 163 L 57.00000000000023 163 M 57.00000000000023 163 M 55.00000000000023 163 L 53.00000000000023 163 M 53.00000000000023 163 M 51.00000000000023 163 L 49.00000000000023 163 M 49.00000000000023 163 M 47.00000000000023 163 L 45.00000000000023 163 M 45.00000000000023 163 M 43.00000000000023 163 L 41.00000000000023 163 M 41.00000000000023 163 M 39.00000000000023 163 L 37.00000000000023 163 M 37.00000000000023 163 M 35.00000000000023 163 L 33.00000000000023 163 M 33.00000000000023 163 M 31.000000000000227 163 L 29.000000000000227 163 M 29.000000000000227 163 M 27.000000000000227 163 L 25.000000000000227 163 M 25.000000000000227 163 M 23.000000000000227 163 L 21.000000000000227 163 M 21.000000000000227 163 M 19.000000000000227 163 L 17.000000000000227 163 M 17.000000000000227 163 M 15.000000000000227 163 L 13.000000000000227 163 M 13.000000000000227 163 M 11.000000000000227 163 L 9.000000000000227 163 M 9.000000000000227 163 M 7.000000000000227 163 L 5.000000000000227 163 M 5.000000000000227 163 M 3.0000000000002274 163 L 1.0000000000002274 163 M 1.0000000000002274 163 M 0 162.00000000000023 L 0 160.00000000000023 M 0 160.00000000000023 M 0 158.00000000000023 L 0 156.00000000000023 M 0 156.00000000000023 M 0 154.00000000000023 L 0 152.00000000000023 M 0 152.00000000000023 M 0 150.00000000000023 L 0 148.00000000000023 M 0 148.00000000000023 M 0 146.00000000000023 L 0 144.00000000000023 M 0 144.00000000000023 M 0 142.00000000000023 L 0 140.00000000000023 M 0 140.00000000000023 M 0 138.00000000000023 L 0 136.00000000000023 M 0 136.00000000000023 M 0 134.00000000000023 L 0 132.00000000000023 M 0 132.00000000000023 M 0 130.00000000000023 L 0 128.00000000000023 M 0 128.00000000000023 M 0 126.00000000000023 L 0 124.00000000000023 M 0 124.00000000000023 M 0 122.00000000000023 L 0 120.00000000000023 M 0 120.00000000000023 M 0 118.00000000000023 L 0 116.00000000000023 M 0 116.00000000000023 M 0 114.00000000000023 L 0 112.00000000000023 M 0 112.00000000000023 M 0 110.00000000000023 L 0 108.00000000000023 M 0 108.00000000000023 M 0 106.00000000000023 L 0 104.00000000000023 M 0 104.00000000000023 M 0 102.00000000000023 L 0 100.00000000000023 M 0 100.00000000000023 M 0 98.00000000000023 L 0 96.00000000000023 M 0 96.00000000000023 M 0 94.00000000000023 L 0 92.00000000000023 M 0 92.00000000000023 M 0 90.00000000000023 L 0 88.00000000000023 M 0 88.00000000000023 M 0 86.00000000000023 L 0 84.00000000000023 M 0 84.00000000000023 M 0 82.00000000000023 L 0 80.00000000000023 M 0 80.00000000000023 M 0 78.00000000000023 L 0 76.00000000000023 M 0 76.00000000000023 M 0 74.00000000000023 L 0 72.00000000000023 M 0 72.00000000000023 M 0 70.00000000000023 L 0 68.00000000000023 M 0 68.00000000000023 M 0 66.00000000000023 L 0 64.00000000000023 M 0 64.00000000000023 M 0 62.00000000000023 L 0 60.00000000000023 M 0 60.00000000000023 M 0 58.00000000000023 L 0 56.00000000000023 M 0 56.00000000000023 M 0 54.00000000000023 L 0 52.00000000000023 M 0 52.00000000000023 M 0 50.00000000000023 L 0 48.00000000000023 M 0 48.00000000000023 M 0 46.00000000000023 L 0 44.00000000000023 M 0 44.00000000000023 M 0 42.00000000000023 L 0 40.00000000000023 M 0 40.00000000000023 M 0 38.00000000000023 L 0 36.00000000000023 M 0 36.00000000000023 M 0 34.00000000000023 L 0 32.00000000000023 M 0 32.00000000000023 M 0 30.000000000000227 L 0 28.000000000000227 M 0 28.000000000000227 M 0 26.000000000000227 L 0 24.000000000000227 M 0 24.000000000000227 M 0 22.000000000000227 L 0 20.000000000000227 M 0 20.000000000000227 M 0 18.000000000000227 L 0 16.000000000000227 M 0 16.000000000000227 M 0 14.000000000000227 L 0 12.000000000000227 M 0 12.000000000000227 M 0 10.000000000000227 L 0 8.000000000000227 M 0 8.000000000000227 M 0 6.000000000000227 L 0 4.000000000000227 M 0 4.000000000000227 M 0 2.0000000000002274 L 0 2.2737367544323206e-13 M 0 2.2737367544323206e-13 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="translate(0,0) matrix(1,0,0,1,3.5000000000000284,268.5)"><g><g transform="translate(0,0) scale(4.11,1.63)"><g><path fill="#FFFFFF" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(0.24330900243309,0.6134969325153374)"><path fill="none" stroke="none" d="M 0 0 L 411.00000000000006 0 Q 411.00000000000006 0 411.00000000000006 0 L 411.00000000000006 163 Q 411.00000000000006 163 411.00000000000006 163 L 0 163 Q 0 163 0 163 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" d="M 0 0 M 0 0 L 2 0 M 2 0 M 4 0 L 6 0 M 6 0 M 8 0 L 10 0 M 10 0 M 12 0 L 14 0 M 14 0 M 16 0 L 18 0 M 18 0 M 20 0 L 22 0 M 22 0 M 24 0 L 26 0 M 26 0 M 28 0 L 30 0 M 30 0 M 32 0 L 34 0 M 34 0 M 36 0 L 38 0 M 38 0 M 40 0 L 42 0 M 42 0 M 44 0 L 46 0 M 46 0 M 48 0 L 50 0 M 50 0 M 52 0 L 54 0 M 54 0 M 56 0 L 58 0 M 58 0 M 60 0 L 62 0 M 62 0 M 64 0 L 66 0 M 66 0 M 68 0 L 70 0 M 70 0 M 72 0 L 74 0 M 74 0 M 76 0 L 78 0 M 78 0 M 80 0 L 82 0 M 82 0 M 84 0 L 86 0 M 86 0 M 88 0 L 90 0 M 90 0 M 92 0 L 94 0 M 94 0 M 96 0 L 98 0 M 98 0 M 100 0 L 102 0 M 102 0 M 104 0 L 106 0 M 106 0 M 108 0 L 110 0 M 110 0 M 112 0 L 114 0 M 114 0 M 116 0 L 118 0 M 118 0 M 120 0 L 122 0 M 122 0 M 124 0 L 126 0 M 126 0 M 128 0 L 130 0 M 130 0 M 132 0 L 134 0 M 134 0 M 136 0 L 138 0 M 138 0 M 140 0 L 142 0 M 142 0 M 144 0 L 146 0 M 146 0 M 148 0 L 150 0 M 150 0 M 152 0 L 154 0 M 154 0 M 156 0 L 158 0 M 158 0 M 160 0 L 162 0 M 162 0 M 164 0 L 166 0 M 166 0 M 168 0 L 170 0 M 170 0 M 172 0 L 174 0 M 174 0 M 176 0 L 178 0 M 178 0 M 180 0 L 182 0 M 182 0 M 184 0 L 186 0 M 186 0 M 188 0 L 190 0 M 190 0 M 192 0 L 194 0 M 194 0 M 196 0 L 198 0 M 198 0 M 200 0 L 202 0 M 202 0 M 204 0 L 206 0 M 206 0 M 208 0 L 210 0 M 210 0 M 212 0 L 214 0 M 214 0 M 216 0 L 218 0 M 218 0 M 220 0 L 222 0 M 222 0 M 224 0 L 226 0 M 226 0 M 228 0 L 230 0 M 230 0 M 232 0 L 234 0 M 234 0 M 236 0 L 238 0 M 238 0 M 240 0 L 242 0 M 242 0 M 244 0 L 246 0 M 246 0 M 248 0 L 250 0 M 250 0 M 252 0 L 254 0 M 254 0 M 256 0 L 258 0 M 258 0 M 260 0 L 262 0 M 262 0 M 264 0 L 266 0 M 266 0 M 268 0 L 270 0 M 270 0 M 272 0 L 274 0 M 274 0 M 276 0 L 278 0 M 278 0 M 280 0 L 282 0 M 282 0 M 284 0 L 286 0 M 286 0 M 288 0 L 290 0 M 290 0 M 292 0 L 294 0 M 294 0 M 296 0 L 298 0 M 298 0 M 300 0 L 302 0 M 302 0 M 304 0 L 306 0 M 306 0 M 308 0 L 310 0 M 310 0 M 312 0 L 314 0 M 314 0 M 316 0 L 318 0 M 318 0 M 320 0 L 322 0 M 322 0 M 324 0 L 326 0 M 326 0 M 328 0 L 330 0 M 330 0 M 332 0 L 334 0 M 334 0 M 336 0 L 338 0 M 338 0 M 340 0 L 342 0 M 342 0 M 344 0 L 346 0 M 346 0 M 348 0 L 350 0 M 350 0 M 352 0 L 354 0 M 354 0 M 356 0 L 358 0 M 358 0 M 360 0 L 362 0 M 362 0 M 364 0 L 366 0 M 366 0 M 368 0 L 370 0 M 370 0 M 372 0 L 374 0 M 374 0 M 376 0 L 378 0 M 378 0 M 380 0 L 382 0 M 382 0 M 384 0 L 386 0 M 386 0 M 388 0 L 390 0 M 390 0 M 392 0 L 394 0 M 394 0 M 396 0 L 398 0 M 398 0 M 400 0 L 402 0 M 402 0 M 404 0 L 406 0 M 406 0 M 408 0 L 410 0 M 410 0 M 411.00000000000006 0.9999999999999432 L 411.00000000000006 2.999999999999943 M 411.00000000000006 2.999999999999943 M 411.00000000000006 4.999999999999943 L 411.00000000000006 6.999999999999943 M 411.00000000000006 6.999999999999943 M 411.00000000000006 8.999999999999943 L 411.00000000000006 10.999999999999943 M 411.00000000000006 10.999999999999943 M 411.00000000000006 12.999999999999943 L 411.00000000000006 14.999999999999943 M 411.00000000000006 14.999999999999943 M 411.00000000000006 16.999999999999943 L 411.00000000000006 18.999999999999943 M 411.00000000000006 18.999999999999943 M 411.00000000000006 20.999999999999943 L 411.00000000000006 22.999999999999943 M 411.00000000000006 22.999999999999943 M 411.00000000000006 24.999999999999943 L 411.00000000000006 26.999999999999943 M 411.00000000000006 26.999999999999943 M 411.00000000000006 28.999999999999943 L 411.00000000000006 30.999999999999943 M 411.00000000000006 30.999999999999943 M 411.00000000000006 32.99999999999994 L 411.00000000000006 34.99999999999994 M 411.00000000000006 34.99999999999994 M 411.00000000000006 36.99999999999994 L 411.00000000000006 38.99999999999994 M 411.00000000000006 38.99999999999994 M 411.00000000000006 40.99999999999994 L 411.00000000000006 42.99999999999994 M 411.00000000000006 42.99999999999994 M 411.00000000000006 44.99999999999994 L 411.00000000000006 46.99999999999994 M 411.00000000000006 46.99999999999994 M 411.00000000000006 48.99999999999994 L 411.00000000000006 50.99999999999994 M 411.00000000000006 50.99999999999994 M 411.00000000000006 52.99999999999994 L 411.00000000000006 54.99999999999994 M 411.00000000000006 54.99999999999994 M 411.00000000000006 56.99999999999994 L 411.00000000000006 58.99999999999994 M 411.00000000000006 58.99999999999994 M 411.00000000000006 60.99999999999994 L 411.00000000000006 62.99999999999994 M 411.00000000000006 62.99999999999994 M 411.00000000000006 64.99999999999994 L 411.00000000000006 66.99999999999994 M 411.00000000000006 66.99999999999994 M 411.00000000000006 68.99999999999994 L 411.00000000000006 70.99999999999994 M 411.00000000000006 70.99999999999994 M 411.00000000000006 72.99999999999994 L 411.00000000000006 74.99999999999994 M 411.00000000000006 74.99999999999994 M 411.00000000000006 76.99999999999994 L 411.00000000000006 78.99999999999994 M 411.00000000000006 78.99999999999994 M 411.00000000000006 80.99999999999994 L 411.00000000000006 82.99999999999994 M 411.00000000000006 82.99999999999994 M 411.00000000000006 84.99999999999994 L 411.00000000000006 86.99999999999994 M 411.00000000000006 86.99999999999994 M 411.00000000000006 88.99999999999994 L 411.00000000000006 90.99999999999994 M 411.00000000000006 90.99999999999994 M 411.00000000000006 92.99999999999994 L 411.00000000000006 94.99999999999994 M 411.00000000000006 94.99999999999994 M 411.00000000000006 96.99999999999994 L 411.00000000000006 98.99999999999994 M 411.00000000000006 98.99999999999994 M 411.00000000000006 100.99999999999994 L 411.00000000000006 102.99999999999994 M 411.00000000000006 102.99999999999994 M 411.00000000000006 104.99999999999994 L 411.00000000000006 106.99999999999994 M 411.00000000000006 106.99999999999994 M 411.00000000000006 108.99999999999994 L 411.00000000000006 110.99999999999994 M 411.00000000000006 110.99999999999994 M 411.00000000000006 112.99999999999994 L 411.00000000000006 114.99999999999994 M 411.00000000000006 114.99999999999994 M 411.00000000000006 116.99999999999994 L 411.00000000000006 118.99999999999994 M 411.00000000000006 118.99999999999994 M 411.00000000000006 120.99999999999994 L 411.00000000000006 122.99999999999994 M 411.00000000000006 122.99999999999994 M 411.00000000000006 124.99999999999994 L 411.00000000000006 126.99999999999994 M 411.00000000000006 126.99999999999994 M 411.00000000000006 128.99999999999994 L 411.00000000000006 130.99999999999994 M 411.00000000000006 130.99999999999994 M 411.00000000000006 132.99999999999994 L 411.00000000000006 134.99999999999994 M 411.00000000000006 134.99999999999994 M 411.00000000000006 136.99999999999994 L 411.00000000000006 138.99999999999994 M 411.00000000000006 138.99999999999994 M 411.00000000000006 140.99999999999994 L 411.00000000000006 142.99999999999994 M 411.00000000000006 142.99999999999994 M 411.00000000000006 144.99999999999994 L 411.00000000000006 146.99999999999994 M 411.00000000000006 146.99999999999994 M 411.00000000000006 148.99999999999994 L 411.00000000000006 150.99999999999994 M 411.00000000000006 150.99999999999994 M 411.00000000000006 152.99999999999994 L 411.00000000000006 154.99999999999994 M 411.00000000000006 154.99999999999994 M 411.00000000000006 156.99999999999994 L 411.00000000000006 158.99999999999994 M 411.00000000000006 158.99999999999994 M 411.00000000000006 160.99999999999994 L 411.00000000000006 162.99999999999994 M 411.00000000000006 162.99999999999994 M 409.0000000000001 163 L 407.0000000000001 163 M 407.0000000000001 163 M 405.0000000000001 163 L 403.0000000000001 163 M 403.0000000000001 163 M 401.0000000000001 163 L 399.0000000000001 163 M 399.0000000000001 163 M 397.0000000000001 163 L 395.0000000000001 163 M 395.0000000000001 163 M 393.0000000000001 163 L 391.0000000000001 163 M 391.0000000000001 163 M 389.0000000000001 163 L 387.0000000000001 163 M 387.0000000000001 163 M 385.0000000000001 163 L 383.0000000000001 163 M 383.0000000000001 163 M 381.0000000000001 163 L 379.0000000000001 163 M 379.0000000000001 163 M 377.0000000000001 163 L 375.0000000000001 163 M 375.0000000000001 163 M 373.0000000000001 163 L 371.0000000000001 163 M 371.0000000000001 163 M 369.0000000000001 163 L 367.0000000000001 163 M 367.0000000000001 163 M 365.0000000000001 163 L 363.0000000000001 163 M 363.0000000000001 163 M 361.0000000000001 163 L 359.0000000000001 163 M 359.0000000000001 163 M 357.0000000000001 163 L 355.0000000000001 163 M 355.0000000000001 163 M 353.0000000000001 163 L 351.0000000000001 163 M 351.0000000000001 163 M 349.0000000000001 163 L 347.0000000000001 163 M 347.0000000000001 163 M 345.0000000000001 163 L 343.0000000000001 163 M 343.0000000000001 163 M 341.0000000000001 163 L 339.0000000000001 163 M 339.0000000000001 163 M 337.0000000000001 163 L 335.0000000000001 163 M 335.0000000000001 163 M 333.0000000000001 163 L 331.0000000000001 163 M 331.0000000000001 163 M 329.0000000000001 163 L 327.0000000000001 163 M 327.0000000000001 163 M 325.0000000000001 163 L 323.0000000000001 163 M 323.0000000000001 163 M 321.0000000000001 163 L 319.0000000000001 163 M 319.0000000000001 163 M 317.0000000000001 163 L 315.0000000000001 163 M 315.0000000000001 163 M 313.0000000000001 163 L 311.0000000000001 163 M 311.0000000000001 163 M 309.0000000000001 163 L 307.0000000000001 163 M 307.0000000000001 163 M 305.0000000000001 163 L 303.0000000000001 163 M 303.0000000000001 163 M 301.0000000000001 163 L 299.0000000000001 163 M 299.0000000000001 163 M 297.0000000000001 163 L 295.0000000000001 163 M 295.0000000000001 163 M 293.0000000000001 163 L 291.0000000000001 163 M 291.0000000000001 163 M 289.0000000000001 163 L 287.0000000000001 163 M 287.0000000000001 163 M 285.0000000000001 163 L 283.0000000000001 163 M 283.0000000000001 163 M 281.0000000000001 163 L 279.0000000000001 163 M 279.0000000000001 163 M 277.0000000000001 163 L 275.0000000000001 163 M 275.0000000000001 163 M 273.0000000000001 163 L 271.0000000000001 163 M 271.0000000000001 163 M 269.0000000000001 163 L 267.0000000000001 163 M 267.0000000000001 163 M 265.0000000000001 163 L 263.0000000000001 163 M 263.0000000000001 163 M 261.0000000000001 163 L 259.0000000000001 163 M 259.0000000000001 163 M 257.0000000000001 163 L 255.0000000000001 163 M 255.0000000000001 163 M 253.0000000000001 163 L 251.0000000000001 163 M 251.0000000000001 163 M 249.0000000000001 163 L 247.0000000000001 163 M 247.0000000000001 163 M 245.0000000000001 163 L 243.0000000000001 163 M 243.0000000000001 163 M 241.0000000000001 163 L 239.0000000000001 163 M 239.0000000000001 163 M 237.0000000000001 163 L 235.0000000000001 163 M 235.0000000000001 163 M 233.0000000000001 163 L 231.0000000000001 163 M 231.0000000000001 163 M 229.0000000000001 163 L 227.0000000000001 163 M 227.0000000000001 163 M 225.0000000000001 163 L 223.0000000000001 163 M 223.0000000000001 163 M 221.0000000000001 163 L 219.0000000000001 163 M 219.0000000000001 163 M 217.0000000000001 163 L 215.0000000000001 163 M 215.0000000000001 163 M 213.0000000000001 163 L 211.0000000000001 163 M 211.0000000000001 163 M 209.0000000000001 163 L 207.0000000000001 163 M 207.0000000000001 163 M 205.0000000000001 163 L 203.0000000000001 163 M 203.0000000000001 163 M 201.0000000000001 163 L 199.0000000000001 163 M 199.0000000000001 163 M 197.0000000000001 163 L 195.0000000000001 163 M 195.0000000000001 163 M 193.0000000000001 163 L 191.0000000000001 163 M 191.0000000000001 163 M 189.0000000000001 163 L 187.0000000000001 163 M 187.0000000000001 163 M 185.0000000000001 163 L 183.0000000000001 163 M 183.0000000000001 163 M 181.0000000000001 163 L 179.0000000000001 163 M 179.0000000000001 163 M 177.0000000000001 163 L 175.0000000000001 163 M 175.0000000000001 163 M 173.0000000000001 163 L 171.0000000000001 163 M 171.0000000000001 163 M 169.0000000000001 163 L 167.0000000000001 163 M 167.0000000000001 163 M 165.0000000000001 163 L 163.0000000000001 163 M 163.0000000000001 163 M 161.0000000000001 163 L 159.0000000000001 163 M 159.0000000000001 163 M 157.0000000000001 163 L 155.0000000000001 163 M 155.0000000000001 163 M 153.0000000000001 163 L 151.0000000000001 163 M 151.0000000000001 163 M 149.0000000000001 163 L 147.0000000000001 163 M 147.0000000000001 163 M 145.0000000000001 163 L 143.0000000000001 163 M 143.0000000000001 163 M 141.0000000000001 163 L 139.0000000000001 163 M 139.0000000000001 163 M 137.0000000000001 163 L 135.0000000000001 163 M 135.0000000000001 163 M 133.0000000000001 163 L 131.0000000000001 163 M 131.0000000000001 163 M 129.0000000000001 163 L 127.00000000000011 163 M 127.00000000000011 163 M 125.00000000000011 163 L 123.00000000000011 163 M 123.00000000000011 163 M 121.00000000000011 163 L 119.00000000000011 163 M 119.00000000000011 163 M 117.00000000000011 163 L 115.00000000000011 163 M 115.00000000000011 163 M 113.00000000000011 163 L 111.00000000000011 163 M 111.00000000000011 163 M 109.00000000000011 163 L 107.00000000000011 163 M 107.00000000000011 163 M 105.00000000000011 163 L 103.00000000000011 163 M 103.00000000000011 163 M 101.00000000000011 163 L 99.00000000000011 163 M 99.00000000000011 163 M 97.00000000000011 163 L 95.00000000000011 163 M 95.00000000000011 163 M 93.00000000000011 163 L 91.00000000000011 163 M 91.00000000000011 163 M 89.00000000000011 163 L 87.00000000000011 163 M 87.00000000000011 163 M 85.00000000000011 163 L 83.00000000000011 163 M 83.00000000000011 163 M 81.00000000000011 163 L 79.00000000000011 163 M 79.00000000000011 163 M 77.00000000000011 163 L 75.00000000000011 163 M 75.00000000000011 163 M 73.00000000000011 163 L 71.00000000000011 163 M 71.00000000000011 163 M 69.00000000000011 163 L 67.00000000000011 163 M 67.00000000000011 163 M 65.00000000000011 163 L 63.000000000000114 163 M 63.000000000000114 163 M 61.000000000000114 163 L 59.000000000000114 163 M 59.000000000000114 163 M 57.000000000000114 163 L 55.000000000000114 163 M 55.000000000000114 163 M 53.000000000000114 163 L 51.000000000000114 163 M 51.000000000000114 163 M 49.000000000000114 163 L 47.000000000000114 163 M 47.000000000000114 163 M 45.000000000000114 163 L 43.000000000000114 163 M 43.000000000000114 163 M 41.000000000000114 163 L 39.000000000000114 163 M 39.000000000000114 163 M 37.000000000000114 163 L 35.000000000000114 163 M 35.000000000000114 163 M 33.000000000000114 163 L 31.000000000000114 163 M 31.000000000000114 163 M 29.000000000000114 163 L 27.000000000000114 163 M 27.000000000000114 163 M 25.000000000000114 163 L 23.000000000000114 163 M 23.000000000000114 163 M 21.000000000000114 163 L 19.000000000000114 163 M 19.000000000000114 163 M 17.000000000000114 163 L 15.000000000000114 163 M 15.000000000000114 163 M 13.000000000000114 163 L 11.000000000000114 163 M 11.000000000000114 163 M 9.000000000000114 163 L 7.000000000000114 163 M 7.000000000000114 163 M 5.000000000000114 163 L 3.0000000000001137 163 M 3.0000000000001137 163 M 1.0000000000001137 163 L 0 163 Q 0 163 0 163 L 0 162.0000000000001 M 0 162.0000000000001 M 0 160.0000000000001 L 0 158.0000000000001 M 0 158.0000000000001 M 0 156.0000000000001 L 0 154.0000000000001 M 0 154.0000000000001 M 0 152.0000000000001 L 0 150.0000000000001 M 0 150.0000000000001 M 0 148.0000000000001 L 0 146.0000000000001 M 0 146.0000000000001 M 0 144.0000000000001 L 0 142.0000000000001 M 0 142.0000000000001 M 0 140.0000000000001 L 0 138.0000000000001 M 0 138.0000000000001 M 0 136.0000000000001 L 0 134.0000000000001 M 0 134.0000000000001 M 0 132.0000000000001 L 0 130.0000000000001 M 0 130.0000000000001 M 0 128.0000000000001 L 0 126.00000000000011 M 0 126.00000000000011 M 0 124.00000000000011 L 0 122.00000000000011 M 0 122.00000000000011 M 0 120.00000000000011 L 0 118.00000000000011 M 0 118.00000000000011 M 0 116.00000000000011 L 0 114.00000000000011 M 0 114.00000000000011 M 0 112.00000000000011 L 0 110.00000000000011 M 0 110.00000000000011 M 0 108.00000000000011 L 0 106.00000000000011 M 0 106.00000000000011 M 0 104.00000000000011 L 0 102.00000000000011 M 0 102.00000000000011 M 0 100.00000000000011 L 0 98.00000000000011 M 0 98.00000000000011 M 0 96.00000000000011 L 0 94.00000000000011 M 0 94.00000000000011 M 0 92.00000000000011 L 0 90.00000000000011 M 0 90.00000000000011 M 0 88.00000000000011 L 0 86.00000000000011 M 0 86.00000000000011 M 0 84.00000000000011 L 0 82.00000000000011 M 0 82.00000000000011 M 0 80.00000000000011 L 0 78.00000000000011 M 0 78.00000000000011 M 0 76.00000000000011 L 0 74.00000000000011 M 0 74.00000000000011 M 0 72.00000000000011 L 0 70.00000000000011 M 0 70.00000000000011 M 0 68.00000000000011 L 0 66.00000000000011 M 0 66.00000000000011 M 0 64.00000000000011 L 0 62.000000000000114 M 0 62.000000000000114 M 0 60.000000000000114 L 0 58.000000000000114 M 0 58.000000000000114 M 0 56.000000000000114 L 0 54.000000000000114 M 0 54.000000000000114 M 0 52.000000000000114 L 0 50.000000000000114 M 0 50.000000000000114 M 0 48.000000000000114 L 0 46.000000000000114 M 0 46.000000000000114 M 0 44.000000000000114 L 0 42.000000000000114 M 0 42.000000000000114 M 0 40.000000000000114 L 0 38.000000000000114 M 0 38.000000000000114 M 0 36.000000000000114 L 0 34.000000000000114 M 0 34.000000000000114 M 0 32.000000000000114 L 0 30.000000000000114 M 0 30.000000000000114 M 0 28.000000000000114 L 0 26.000000000000114 M 0 26.000000000000114 M 0 24.000000000000114 L 0 22.000000000000114 M 0 22.000000000000114 M 0 20.000000000000114 L 0 18.000000000000114 M 0 18.000000000000114 M 0 16.000000000000114 L 0 14.000000000000114 M 0 14.000000000000114 M 0 12.000000000000114 L 0 10.000000000000114 M 0 10.000000000000114 M 0 8.000000000000114 L 0 6.000000000000114 M 0 6.000000000000114 M 0 4.000000000000114 L 0 2.0000000000001137 M 0 2.0000000000001137 M 0 1.1368683772161603e-13 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,515,213)"><g transform="translate(0,0)"><g transform="translate(-100.5,-90.5) translate(-414.5,-122.5) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#cccccc" d="M 519.5 217.5 L 551.5 298" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g><g transform="matrix(1,0,0,1,535.7106781186548,213)"><g transform="translate(0,0)"><g transform="translate(-139.5,-86.5) translate(-396.21067811865476,-126.5) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#cccccc" d="M 540.2106781186548 217.5 L 744.5 298" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g><g transform="matrix(1,0,0,1,444.71067811865476,77.5)"><g transform="translate(0,0)"><g transform="translate(-231.28932188134524,-95) translate(-213.4213562373095,17.5) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#cccccc" d="M 498.78932188134524 142.5 L 449.21067811865476 82" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g><g transform="matrix(1,0,0,1,354.21067811865476,77.49999999999999)"><g transform="translate(0,0)"><g transform="translate(-237,-54) translate(-117.21067811865476,-23.499999999999986) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#cccccc" d="M 407.78932188134524 81.99999999999999 L 358.71067811865476 142.5" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g><g transform="matrix(1,0,0,1,289.5,213)"><g transform="translate(0,0)"><g transform="translate(-174,-217.5) translate(-115.5,4.5) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#cccccc" d="M 338 217.5 L 294 299" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g><g transform="matrix(1,0,0,1,103.5,213)"><g transform="translate(0,0)"><g transform="translate(-187,-206.5) translate(83.5,-6.5) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#cccccc" d="M 317.28932188134524 217.5 L 108 298" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g><g transform="translate(0,0) matrix(1,0,0,1,378.5,7)"><g transform="translate(4,4) scale(1.01,1.0133333333333334)"><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="#000000" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" opacity="0.294117647"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="rgb(0,0,0)" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-opacity="0" stroke-miterlimit="10" stroke-width="2" opacity="0.294117647"/></g></g></g></g></g><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="url(#tTmKplTTMsiu)" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="url(#tTmKplTTMsiu)" stroke="#333333" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,389,38)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="80" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="80" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="1.3134765625" y="0" width="78" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="1.3134765625" y="0" width="78" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="1" y="11">L</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="8" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="15" y="11">v</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="21" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="27" y="11">l</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="33" y="11">2</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="43" y="11">S</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="51" y="11">w</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="60" y="11">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="63" y="11">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="66" y="11">c</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="72" y="11">h</text></g></g><g transform="translate(0,0) matrix(1,0,0,1,288,142.5)"><g transform="translate(4,4) scale(1.01,1.0133333333333334)"><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="#000000" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" opacity="0.294117647"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="rgb(0,0,0)" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-opacity="0" stroke-miterlimit="10" stroke-width="2" opacity="0.294117647"/></g></g></g></g></g><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="url(#oLPowxNiyzWp)" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="url(#oLPowxNiyzWp)" stroke="#333333" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,298,173)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="80" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="80" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="24.326171875" y="0" width="32" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="24.326171875" y="0" width="32" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="24" y="11">H</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="33" y="11">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="40" y="11">s</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="46" y="11">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="49" y="11">1</text></g></g><g transform="translate(0,0) matrix(1,0,0,1,469.5,142.5)"><g transform="translate(4,4) scale(1.01,1.0133333333333334)"><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="#000000" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" opacity="0.294117647"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="rgb(0,0,0)" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-opacity="0" stroke-miterlimit="10" stroke-width="2" opacity="0.294117647"/></g></g></g></g></g><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="url(#pXOyUAUnGLnv)" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="url(#pXOyUAUnGLnv)" stroke="#333333" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,480,173)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="80" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="80" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="24.326171875" y="0" width="32" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="24.326171875" y="0" width="32" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="24" y="11">H</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="33" y="11">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="40" y="11">s</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="46" y="11">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="49" y="11">2</text></g></g><g transform="matrix(1,0,0,1,280,126)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="146" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="146" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="117" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="117" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="0" y="11">eth0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="27" y="11">2001</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="53" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="57" y="11">db8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="77" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="80" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="87" y="11">::</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="93" y="11">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="100" y="11">/</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="103" y="11">64</text></g></g><g transform="matrix(1,0,0,1,463,128)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="146" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="146" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="117" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="0" y="11">eth0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="27" y="11">2001</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="53" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="57" y="11">db8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="77" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="80" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="87" y="11">::</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="93" y="11">2</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="100" y="11">/</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="103" y="11">64</text></g></g><g transform="matrix(1,0,0,1,447,223)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="146" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="146" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="23.2978515625" y="0" width="100" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="23.2978515625" y="0" width="100" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="23" y="11">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="30" y="11">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="37" y="11">c</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="43" y="11">k</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="49" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="55" y="11">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="59" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="69" y="11">f</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="73" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="79" y="11">8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="86" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="93" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="96" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="99" y="11">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="106" y="11">/</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="109" y="11">6</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="116" y="11">4</text></g></g><g transform="matrix(1,0,0,1,264,224)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="146" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="146" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="23.2978515625" y="0" width="100" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="23.2978515625" y="0" width="100" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="23" y="11">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="30" y="11">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="37" y="11">c</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="43" y="11">k</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="49" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="55" y="11">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="59" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="69" y="11">f</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="73" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="79" y="11">8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="86" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="93" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="96" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="99" y="11">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="106" y="11">/</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="109" y="11">6</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="116" y="11">4</text></g></g><g transform="translate(0,0) matrix(1,0,0,1,58,298)"><g transform="translate(4,4) scale(1.01,1.01)"><g><g transform="translate(0,0) scale(1,1)"><g><path fill="#000000" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" opacity="0.294117647"/><g transform="scale(1,1)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="rgb(0,0,0)" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" stroke-opacity="0" stroke-miterlimit="10" stroke-width="2" opacity="0.294117647"/></g></g></g></g></g><g><g transform="translate(0,0) scale(1,1)"><g><path fill="url(#UNWdxKXMRvQE)" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><path fill="url(#UNWdxKXMRvQE)" stroke="#333333" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,68,341)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="80" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="80" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="5.3125" y="0" width="70" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="5.3125" y="0" width="70" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="5" y="11">C</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="14" y="11">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="21" y="11">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="27" y="11">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="31" y="11">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="37" y="11">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="40" y="11">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="47" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="53" y="11">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="57" y="11">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="64" y="11">-</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="68" y="11">1</text></g></g><g transform="translate(0,0) matrix(1,0,0,1,244,299)"><g transform="translate(4,4) scale(1.01,1.01)"><g><g transform="translate(0,0) scale(1,1)"><g><path fill="#000000" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" opacity="0.294117647"/><g transform="scale(1,1)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="rgb(0,0,0)" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" stroke-opacity="0" stroke-miterlimit="10" stroke-width="2" opacity="0.294117647"/></g></g></g></g></g><g><g transform="translate(0,0) scale(1,1)"><g><path fill="url(#yUmhFNndNCTB)" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><path fill="url(#yUmhFNndNCTB)" stroke="#333333" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,254,342)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="80" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="80" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="5.3125" y="0" width="70" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="5.3125" y="0" width="70" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="5" y="11">C</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="14" y="11">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="21" y="11">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="27" y="11">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="31" y="11">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="37" y="11">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="40" y="11">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="47" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="53" y="11">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="57" y="11">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="64" y="11">-</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="68" y="11">2</text></g></g><g transform="matrix(1,0,0,1,36,283)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="146" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="146" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="14.6142578125" y="0" width="118" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="15" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="21" y="11">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="25" y="11">h</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="31" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="41" y="11">2</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="48" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="55" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="61" y="11">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="68" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="71" y="11">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="78" y="11">b</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="85" y="11">8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="91" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="95" y="11">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="101" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="105" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="108" y="11">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="115" y="11">/</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="118" y="11">6</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="125" y="11">4</text></g></g><g transform="translate(0,0) matrix(1,0,0,1,501.5,298)"><g transform="translate(4,4) scale(1.01,1.01)"><g><g transform="translate(0,0) scale(1,1)"><g><path fill="#000000" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" opacity="0.294117647"/><g transform="scale(1,1)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="rgb(0,0,0)" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" stroke-opacity="0" stroke-miterlimit="10" stroke-width="2" opacity="0.294117647"/></g></g></g></g></g><g><g transform="translate(0,0) scale(1,1)"><g><path fill="url(#KUGWbORyJeGF)" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><path fill="url(#KUGWbORyJeGF)" stroke="#333333" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,512,341)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="80" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="80" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="5.3125" y="0" width="70" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="5.3125" y="0" width="70" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="5" y="11">C</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="14" y="11">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="21" y="11">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="27" y="11">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="31" y="11">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="37" y="11">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="40" y="11">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="47" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="53" y="11">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="57" y="11">2</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="64" y="11">-</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="68" y="11">1</text></g></g><g transform="translate(0,0) matrix(1,0,0,1,694.5,298)"><g transform="translate(4,4) scale(1.01,1.01)"><g><g transform="translate(0,0) scale(1,1)"><g><path fill="#000000" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" opacity="0.294117647"/><g transform="scale(1,1)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="rgb(0,0,0)" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" stroke-opacity="0" stroke-miterlimit="10" stroke-width="2" opacity="0.294117647"/></g></g></g></g></g><g><g transform="translate(0,0) scale(1,1)"><g><path fill="url(#emTEOWhvfKgI)" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><path fill="url(#emTEOWhvfKgI)" stroke="#333333" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,705,341)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="80" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="80" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="5.3125" y="0" width="70" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="5.3125" y="0" width="70" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="5" y="11">C</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="14" y="11">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="21" y="11">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="27" y="11">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="31" y="11">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="37" y="11">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="40" y="11">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="47" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="53" y="11">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="57" y="11">2</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="64" y="11">-</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="68" y="11">2</text></g></g><g transform="matrix(1,0,0,1,20,148)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="287" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="287" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="214" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="0" y="11">ip</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="9" y="11"> -</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="17" y="11">6</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="27" y="11">route</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="57" y="11">add</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="81" y="11">2001</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="107" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="111" y="11">db8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="131" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="134" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="141" y="11">::/</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="151" y="11">64</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="167" y="11">dev</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="190" y="11">eth0</text></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="14" width="287" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="14" width="260" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="0" y="25">ip</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="9" y="25"> -</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="17" y="25">6</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="27" y="25">route</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="57" y="25">add</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="81" y="25">2001</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="107" y="25">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="111" y="25">db8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="131" y="25">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="134" y="25">2</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="141" y="25">::/</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="151" y="25">64</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="167" y="25">via</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="186" y="25">2001</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="213" y="25">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="216" y="25">db8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="236" y="25">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="240" y="25">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="246" y="25">::</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="253" y="25">2</text></g></g><g transform="matrix(1,0,0,1,491,409)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="336" height="16" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="336" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="55.462890625" y="0" width="226" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="55" y="11">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="58" y="11">p</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="68" y="11">-</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="72" y="11">6</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="82" y="11">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="86" y="11">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="93" y="11">u</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="99" y="11">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="103" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="113" y="11">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="120" y="11">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="126" y="11">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="136" y="11">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="143" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="150" y="11">f</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="153" y="11">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="160" y="11">u</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="166" y="11">l</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="169" y="11">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="176" y="11">v</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="182" y="11">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="184" y="11">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="194" y="11">f</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="198" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="204" y="11">8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="211" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="218" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="221" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="224" y="11">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="234" y="11">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="241" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="248" y="11">v</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="257" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="264" y="11">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="267" y="11">h</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="274" y="11">0</text></g></g><g transform="matrix(1,0,0,1,36,410)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="343" height="16" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="343" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="58.837890625" y="0" width="226" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="59" y="11">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="62" y="11">p</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="72" y="11">-</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="76" y="11">6</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="86" y="11">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="90" y="11">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="96" y="11">u</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="103" y="11">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="106" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="116" y="11">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="123" y="11">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="130" y="11">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="140" y="11">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="146" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="153" y="11">f</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="156" y="11">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="163" y="11">u</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="170" y="11">l</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="172" y="11">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="179" y="11">v</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="185" y="11">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="188" y="11">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="198" y="11">f</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="201" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="208" y="11">8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="214" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="221" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="224" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="228" y="11">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="238" y="11">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="244" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="251" y="11">v</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="260" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="267" y="11">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="270" y="11">h</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="277" y="11">0</text></g></g><g transform="matrix(1,0,0,1,-17.000680271168676,190.75)"><g transform="translate(0,0)"><g transform="translate(-785,-195) translate(802.0006802711687,4.25) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#000000" d="M 863.7500000000001 194.75 M 863.7500000000001 194.75 L 855.750000325228 194.75228115011907 M 855.750000325228 194.75228115011907 M 847.750000650456 194.75456230023815 L 839.7500009756839 194.75684345035722 M 839.7500009756839 194.75684345035722 M 831.7500013009118 194.7591246004763 L 823.7500016261397 194.76140575059537 M 823.7500016261397 194.76140575059537 M 815.7500019513676 194.76368690071445 L 807.7500022765955 194.76596805083352 M 807.7500022765955 194.76596805083352 M 799.7500026018234 194.7682492009526 L 791.7500029270514 194.77053035107167 M 791.7500029270514 194.77053035107167 M 783.7500032522793 194.77281150119074 L 775.7500035775072 194.77509265130982 M 775.7500035775072 194.77509265130982 M 767.7500039027351 194.7773738014289 L 759.750004227963 194.77965495154797 M 759.750004227963 194.77965495154797 M 751.7500045531909 194.78193610166704 L 743.7500048784188 194.78421725178612 M 743.7500048784188 194.78421725178612 M 735.7500052036468 194.7864984019052 L 727.7500055288747 194.78877955202427 M 727.7500055288747 194.78877955202427 M 719.7500058541026 194.79106070214334 L 711.7500061793305 194.79334185226242 M 711.7500061793305 194.79334185226242 M 703.7500065045584 194.7956230023815 L 695.7500068297863 194.79790415250056 M 695.7500068297863 194.79790415250056 M 687.7500071550143 194.80018530261964 L 679.7500074802422 194.8024664527387 M 679.7500074802422 194.8024664527387 M 671.7500078054701 194.8047476028578 L 663.750008130698 194.80702875297686 M 663.750008130698 194.80702875297686 M 655.7500084559259 194.80930990309594 L 647.7500087811538 194.811591053215 M 647.7500087811538 194.811591053215 M 639.7500091063818 194.81387220333409 L 631.7500094316097 194.81615335345316 M 631.7500094316097 194.81615335345316 M 623.7500097568376 194.81843450357223 L 615.7500100820655 194.8207156536913 M 615.7500100820655 194.8207156536913 M 607.7500104072934 194.82299680381038 L 599.7500107325213 194.82527795392943 M 599.7500107325213 194.82527795392943 M 591.7500110577492 194.8275591040485 L 583.7500113829772 194.82984025416755 M 583.7500113829772 194.82984025416755 M 575.7500117082051 194.83212140428662 L 567.750012033433 194.83440255440567 M 567.750012033433 194.83440255440567 M 559.7500123586609 194.83668370452475 L 551.7500126838888 194.8389648546438 M 551.7500126838888 194.8389648546438 M 543.7500130091167 194.84124600476287 L 535.7500133343447 194.8435271548819 M 535.7500133343447 194.8435271548819 M 527.7500136595726 194.845808305001 L 519.7500139848005 194.84808945512003 M 519.7500139848005 194.84808945512003 M 511.75001431002835 194.8503706052391 L 503.7500146352562 194.85265175535815 M 503.7500146352562 194.85265175535815 M 495.75001496048407 194.85493290547723 L 487.7500152857119 194.85721405559627 M 487.7500152857119 194.85721405559627 M 479.7500156109398 194.85949520571535 L 471.75001593616764 194.8617763558344 M 471.75001593616764 194.8617763558344 M 463.7500162613955 194.86405750595347 L 455.75001658662336 194.86633865607251 M 455.75001658662336 194.86633865607251 M 447.7500169118512 194.8686198061916 L 439.7500172370791 194.87090095631063 M 439.7500172370791 194.87090095631063 M 431.75001756230694 194.8731821064297 L 423.7500178875348 194.87546325654876 M 423.7500178875348 194.87546325654876 M 415.75001821276265 194.87774440666783 L 407.7500185379905 194.88002555678688 M 407.7500185379905 194.88002555678688 M 399.7500188632184 194.88230670690595 L 391.75001918844623 194.884587857025 M 391.75001918844623 194.884587857025 M 383.7500195136741 194.88686900714407 L 375.75001983890195 194.88915015726312 M 375.75001983890195 194.88915015726312 M 367.7500201641298 194.8914313073822 L 359.75002048935767 194.89371245750124 M 359.75002048935767 194.89371245750124 M 351.7500208145855 194.8959936076203 L 343.7500211398134 194.89827475773936 M 343.7500211398134 194.89827475773936 M 335.75002146504124 194.90055590785843 L 327.7500217902691 194.90283705797748 M 327.7500217902691 194.90283705797748 M 319.75002211549696 194.90511820809655 L 311.7500224407248 194.9073993582156 M 311.7500224407248 194.9073993582156 M 303.7500227659527 194.90968050833467 L 295.75002309118054 194.91196165845372 M 295.75002309118054 194.91196165845372 M 287.7500234164084 194.9142428085728 L 279.75002374163626 194.91652395869184 M 279.75002374163626 194.91652395869184 M 271.7500240668641 194.91880510881091 L 263.750024392092 194.92108625892996 M 263.750024392092 194.92108625892996 M 255.75002471731983 194.92336740904904 L 247.75002504254772 194.92564855916808 M 247.75002504254772 194.92564855916808 M 239.75002536777558 194.92792970928716 L 231.75002569300347 194.9302108594062 M 231.75002569300347 194.9302108594062 M 223.75002601823135 194.93249200952528 L 215.7500263434592 194.93477315964432 M 215.7500263434592 194.93477315964432 M 207.7500266686871 194.9370543097634 L 199.75002699391496 194.93933545988244 M 199.75002699391496 194.93933545988244 M 191.75002731914284 194.94161661000152 L 183.75002764437073 194.94389776012056 M 183.75002764437073 194.94389776012056 M 175.75002796959862 194.94617891023964 L 167.75002829482648 194.94846006035868 M 167.75002829482648 194.94846006035868 M 159.75002862005437 194.95074121047776 L 151.75002894528222 194.9530223605968 M 151.75002894528222 194.9530223605968 M 143.7500292705101 194.95530351071588 L 135.750029595738 194.95758466083493 M 135.750029595738 194.95758466083493 M 127.75002992096587 194.959865810954 L 119.75003024619375 194.96214696107305 M 119.75003024619375 194.96214696107305 M 111.75003057142162 194.96442811119212 L 103.75003089664949 194.96670926131117 M 103.75003089664949 194.96670926131117 M 95.75003122187736 194.96899041143024 L 87.75003154710524 194.9712715615493 M 87.75003154710524 194.9712715615493 M 79.75003187233311 194.97355271166836 L 71.75003219756098 194.9758338617874 M 71.75003219756098 194.9758338617874 M 63.75003252278886 194.97811501190648 L 55.75003284801673 194.98039616202553 M 55.75003284801673 194.98039616202553 M 47.7500331732446 194.9826773121446 L 39.750033498472476 194.98495846226365 M 39.750033498472476 194.98495846226365 M 31.75003382370035 194.98723961238272 L 23.750034148928222 194.98952076250177 M 23.750034148928222 194.98952076250177 M 15.750034474156095 194.99180191262084 L 7.750034799383968 194.9940830627399 M 7.750034799383968 194.9940830627399 M -0.2499648753881587 194.99636421285896 L -8.249964550160286 194.998645362978 M -8.249964550160286 194.998645362978" stroke-miterlimit="10"/></g></g></g></g><g transform="matrix(1,0,0,1,585,151)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="281" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="281" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="214" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="0" y="11">ip</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="9" y="11"> -</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="17" y="11">6</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="27" y="11">route</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="57" y="11">add</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="81" y="11">2001</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="107" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="111" y="11">db8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="131" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="134" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="141" y="11">::/</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="151" y="11">64</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="167" y="11">dev</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="190" y="11">eth0</text></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="14" width="281" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="14" width="260" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="0" y="25">ip</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="9" y="25"> -</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="17" y="25">6</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="27" y="25">route</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="57" y="25">add</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="81" y="25">2001</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="107" y="25">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="111" y="25">db8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="131" y="25">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="134" y="25">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="141" y="25">::/</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="151" y="25">64</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="167" y="25">via</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="186" y="25">2001</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="213" y="25">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="216" y="25">db8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="236" y="25">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="240" y="25">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="246" y="25">::</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="253" y="25">1</text></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="259.53515625" y="14" width="4" height="14" fill-opacity="0"/></g></g></g><g transform="matrix(1,0,0,1,223,283)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="146" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="146" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="14.6142578125" y="0" width="118" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="15" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="21" y="11">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="25" y="11">h</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="31" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="41" y="11">2</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="48" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="55" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="61" y="11">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="68" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="71" y="11">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="78" y="11">b</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="85" y="11">8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="91" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="95" y="11">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="101" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="105" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="108" y="11">2</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="115" y="11">/</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="118" y="11">6</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="125" y="11">4</text></g></g><g transform="matrix(1,0,0,1,481,284)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="146" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="146" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="14.6142578125" y="0" width="118" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="15" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="21" y="11">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="25" y="11">h</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="31" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="41" y="11">2</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="48" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="55" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="61" y="11">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="68" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="71" y="11">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="78" y="11">b</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="85" y="11">8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="91" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="95" y="11">2</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="101" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="105" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="108" y="11">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="115" y="11">/</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="118" y="11">6</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="125" y="11">4</text></g></g><g transform="matrix(1,0,0,1,672,284)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="146" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="146" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="14.6142578125" y="0" width="118" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="15" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="21" y="11">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="25" y="11">h</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="31" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="41" y="11">2</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="48" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="55" y="11">0</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="61" y="11">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="68" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="71" y="11">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="78" y="11">b</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="85" y="11">8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="91" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="95" y="11">2</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="101" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="105" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="108" y="11">2</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="115" y="11">/</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="118" y="11">6</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="125" y="11">4</text></g></g><g transform="matrix(1,0,0,1,319,437)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="219" height="11" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="219" height="11" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0.70849609375" y="0" width="219" height="11" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="1" y="9">c</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="6" y="9">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="11" y="9">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="17" y="9">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="20" y="9">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="25" y="9">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="27" y="9">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="33" y="9">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="39" y="9">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="42" y="9">s</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="47" y="9">'</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="52" y="9">l</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="54" y="9">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="56" y="9">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="62" y="9">k</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="67" y="9">-</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="70" y="9">l</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="72" y="9">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="78" y="9">c</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="83" y="9">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="88" y="9">l</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="93" y="9">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="99" y="9">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="104" y="9">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="110" y="9">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="113" y="9">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="119" y="9">s</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="124" y="9">s</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="129" y="9">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="134" y="9">s</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="142" y="9">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="148" y="9">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="151" y="9">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="159" y="9">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="165" y="9">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="170" y="9">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="176" y="9">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="182" y="9">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="184" y="9">s</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="189" y="9">p</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="194" y="9">l</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="197" y="9">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="202" y="9">y</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="207" y="9">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="10px" font-style="italic" font-weight="normal" text-decoration="" line-height="11px" x="213" y="9">d</text></g></g><g transform="matrix(1,0,0,1,20,206)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="235" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="235" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="233" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="0" y="11">ip</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="9" y="11"> -</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="17" y="11">6</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="27" y="11">route</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="57" y="11">add</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="81" y="11">2001</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="107" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="111" y="11">db8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="131" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="134" y="11">1</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="141" y="11">::/</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="151" y="11">64</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="167" y="11">dev</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="190" y="11">docker0</text></g></g><g transform="matrix(1,0,0,1,585,204)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="268" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="268" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="233" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="0" y="11">ip</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="9" y="11"> -</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="17" y="11">6</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="27" y="11">route</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="57" y="11">add</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="81" y="11">2001</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="107" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="111" y="11">db8</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="131" y="11">:</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="134" y="11">2</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="141" y="11">::/</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="151" y="11">64</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="167" y="11">dev</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="190" y="11">docker0</text></g></g><g transform="matrix(1,0,0,1,859.7500000000001,176)"><image width="40" height="275" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAETCAYAAABENES3AAAC9klEQVR4Xu3a8U3CUBDHcRhAZQNxEhgFJhEmgVFwAzcQN0AdAO/Ma1Iq/PHjdybEfJu8ALWvvXzecVxax6Mb38Y3Ht+IAN0VQhBBV8CdTw4i6Aq488lBBF0Bdz45iKAr4M6vzsFFC2jrBtbNrw5wHyc+xni6xQBTb9MCW8ZriWKlYOo9tgDzfYliVYCrCOh5sKzr+Jz7ra0iwElEkGL3MbrzZR5+xpjGODgRVgR4Tq+LyVZ0A0y9txj5em5LvczFqxXdAOdx8RzdNmvLvOvty/f9z9KKuwEOL5ZflDxnLnvJRoAuI4IIigJ8i0WwX4cjiKAqQKFWxYbHI4igKEChFsH4qSt/XkwOkoOqAD91qhjNAvdmzJyhUJuAPzfSuT/oKCLo6OVcBBFUBWi3VDHaLX7qzJyhUJuA/NS5gAgiKAvQLMhkgwkIIigK0CyIYDzI4UGOmzIIIqgKUKhVseHxCCKoCtBRq2LcwOQGppkzFGoTkNtvLiCCCMoCNAsyGTcw+cceL2loFjw//rHH9UMQQV2AZkE3O52BIIKiAM2CCMbTTp7VuSmDIIKqAIVaFeNpJ/2gmzMIIigKUKhFMDpq+kE3ZRBEUBWgUKtidNT0g27OIIigKEChFsHoqOkH3ZRBEEFVgEKtitFR0w+6OYMggqIAhVoEo6OmH3RTBkEEVQEKtSpGR00/6OYMggiKAhRqEYyOmn7QTRkEEVQFKNSqGB01/aCbMwgiKApQqEUwOmr6QTdlEERQFaBQq2J01PSDbs4giKAoQKEWweio/38/OI9FnvUWOt9nbd319r0MPktp5BbqSVxtH+PhwlU/Yv80xkGKqnewG2CeahUjy8u5bd3+fm18JTmYiu8x7tryZjDHGF8xHh29PFGF4CVFW68ywFR8bWJ53hTN3LO3KsEMZBFj0yJaxuvWjq5wibtY9u1NiV7lEncBpmJuJXp/EWDFqp6cozIHy4NDsIKUJXYVEUTQFXDnk4MIugLufHIQQVfAnU8OuoLfiN8DI5XXmA0AAAAASUVORK5CYII=" transform="translate(0,0)"/></g><g transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,864,388)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="146" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="146" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="19.3046875" y="0" width="108" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="19.3046875" y="0" width="108" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="19" y="11">m</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="29" y="11">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="36" y="11">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="43" y="11">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="49" y="11">g</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="56" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="63" y="11">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="73" y="11">b</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="79" y="11">y</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="89" y="11">D</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="97" y="11">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="104" y="11">c</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="110" y="11">k</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="116" y="11">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="123" y="11">r</text></g></g><g transform="matrix(1,0,0,1,853.5000000000001,428)"><g transform="translate(0,0)"><g transform="translate(-898.7500000000001,-432) translate(45.25,4) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#000000" d="M 884.7683424505416 432 L 857.5000000000001 432" stroke-miterlimit="10"/></g></g></g></g><g transform="matrix(1,0,0,1,856.5000000000001,191)"><g transform="translate(0,0)"><g transform="translate(-901.7500000000001,-195) translate(45.25,4) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#000000" d="M 888.767693574114 195 L 860.5000000000001 195" stroke-miterlimit="10"/></g></g></g></g></g></svg> \ No newline at end of file
diff --git a/docs/sources/articles/dockerfile_best-practices.md b/docs/sources/articles/dockerfile_best-practices.md
index 21334c16e4..2ea796582d 100644
--- a/docs/sources/articles/dockerfile_best-practices.md
+++ b/docs/sources/articles/dockerfile_best-practices.md
@@ -65,7 +65,7 @@ uses. Be strategic and cautious about the number of layers you use.
Whenever possible, ease later changes by sorting multi-line arguments
alphanumerically. This will help you avoid duplication of packages and make the
list much easier to update. This also makes PRs a lot easier to read and
-review. Adding a space before a backslash (`\`) helps as well.
+review. Adding a space before a backslash (`\`) helps as well.
Here’s an example from the [`buildpack-deps` image](https://github.com/docker-library/buildpack-deps):
@@ -291,32 +291,32 @@ auto-extraction capability, you should always use `COPY`.
### [`ENTRYPOINT`](https://docs.docker.com/reference/builder/#entrypoint)
-The best use for `ENTRYPOINT` is as a helper script. Using `ENTRYPOINT` for
-other tasks can make your code harder to understand. For example,
+The best use for `ENTRYPOINT` is to set the image's main command, allowing that
+image to be run as though it was that command (and then use `CMD` as the
+default flags).
-....docker run -it official-image bash
+Let's start with an example of an image for the command line tool `s3cmd`:
-is much easier to understand than
+ ENTRYPOINT ["s3cmd"]
+ CMD ["--help"]
-....docker run -it --entrypoint bash official-image -i
+Now the image can be run like this to show the command's help:
-This is especially true for new Docker users, who might naturally assume the
-above command will work fine. In cases where an image uses `ENTRYPOINT` for
-anything other than just a wrapper script, the command will fail and the
-beginning user will then be forced to learn about `ENTRYPOINT` and
-`--entrypoint`.
+ $ docker run s3cmd
-In order to avoid a situation where commands are run without clear visibility
-to the user, make sure your script ends with something like `exec "$@"` (see
-[the exec builtin command](http://wiki.bash-hackers.org/commands/builtin/exec)).
-After the entrypoint completes, the script will transparently bootstrap the command
-invoked by the user, making what has been run clear to the user (for example,
-`docker run -it mysql mysqld --some --flags` will transparently run
-`mysqld --some --flags` after `ENTRYPOINT` runs `initdb`).
+Or using the right parameters to execute a command:
-For example, let’s look at the `Dockerfile` for the
-[Postgres Official Image](https://github.com/docker-library/postgres).
-It refers to the following script:
+ $ docker run s3cmd ls s3://mybucket
+
+This is useful because the image name can double as a reference to the binary as
+shown in the command above.
+
+The `ENTRYPOINT` instruction can also be used in combination with a helper
+script, allowing it to function in a similar way to the command above, even
+when starting the tool may require more than one step.
+
+For example, the [Postgres Official Image](https://registry.hub.docker.com/_/postgres/)
+uses the following script as its `ENTRYPOINT`:
```bash
#!/bin/bash
@@ -335,12 +335,34 @@ fi
exec "$@"
```
-That script then gets copied into the container and run via `ENTRYPOINT` on
-container startup:
+> **Note**:
+> This script uses [the `exec` Bash command](http://wiki.bash-hackers.org/commands/builtin/exec)
+> so that the final running application becomes the container's PID 1. This allows
+> the application to receive any Unix signals sent to the container.
+> See the [`ENTRYPOINT`](https://docs.docker.com/reference/builder/#ENTRYPOINT)
+> help for more details.
+
+
+The helper script is copied into the container and run via `ENTRYPOINT` on
+container start:
COPY ./docker-entrypoint.sh /
ENTRYPOINT ["/docker-entrypoint.sh"]
+This script allows the user to interact with Postgres in several ways.
+
+It can simply start Postgres:
+
+ $ docker run postgres
+
+Or, it can be used to run Postgres and pass parameters to the server:
+
+ $ docker run postgres postgres --help
+
+Lastly, it could also be used to start a totally different tool, such Bash:
+
+ $ docker run --rm -it postgres bash
+
### [`VOLUME`](https://docs.docker.com/reference/builder/#volume)
The `VOLUME` instruction should be used to expose any database storage area,
diff --git a/docs/sources/articles/dsc.md b/docs/sources/articles/dsc.md
index 8d75b8f816..18cbc0a8e9 100644
--- a/docs/sources/articles/dsc.md
+++ b/docs/sources/articles/dsc.md
@@ -43,7 +43,7 @@ More detailed usage information can be found at
The Docker installation configuration is equivalent to running:
```
-apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys\
+apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys\
36A1D7869245C8950F966E92D8576A8BA88D21E9
sh -c "echo deb https://get.docker.com/ubuntu docker main\
> /etc/apt/sources.list.d/docker.list"
diff --git a/docs/sources/articles/host_integration.md b/docs/sources/articles/host_integration.md
index 89fd2a1f7a..cbcb21a357 100644
--- a/docs/sources/articles/host_integration.md
+++ b/docs/sources/articles/host_integration.md
@@ -59,12 +59,11 @@ a new service that will be started after the docker daemon service has started.
/usr/bin/docker start -a redis_server
end script
-
### systemd
[Unit]
Description=Redis container
- Author=Me
+ Requires=docker.service
After=docker.service
[Service]
@@ -74,3 +73,14 @@ a new service that will be started after the docker daemon service has started.
[Install]
WantedBy=local.target
+
+If you need to pass options to the redis container (such as `--env`),
+then you'll need to use `docker run` rather than `docker start`. This will
+create a new container every time the service is started, which will be stopped
+and removed when the service is stopped.
+
+ [Service]
+ ...
+ ExecStart=/usr/bin/docker run --env foo=bar --name redis_server redis
+ ExecStop=/usr/bin/docker stop -t 2 redis_server ; /usr/bin/docker rm -f redis_server
+ ...
diff --git a/docs/sources/articles/https.md b/docs/sources/articles/https.md
index b65ec667a1..94d9ca3f22 100644
--- a/docs/sources/articles/https.md
+++ b/docs/sources/articles/https.md
@@ -71,8 +71,14 @@ name) matches the hostname you will use to connect to Docker:
Next, we're going to sign the public key with our CA:
+Since TLS connections can be made via IP address as well as DNS name, they need
+to be specified when creating the certificate. For example, to allow connections
+using `10.10.10.20` and `127.0.0.1`:
+
+ $ echo subjectAltName = IP:10.10.10.20,IP:127.0.0.1 > extfile.cnf
+
$ openssl x509 -req -days 365 -in server.csr -CA ca.pem -CAkey ca-key.pem \
- -CAcreateserial -out server-cert.pem
+ -CAcreateserial -out server-cert.pem -extfile extfile.cnf
Signature ok
subject=/CN=your.host.com
Getting CA Private Key
diff --git a/docs/sources/articles/https/Dockerfile b/docs/sources/articles/https/Dockerfile
index 494aa30305..a3cc132c51 100644
--- a/docs/sources/articles/https/Dockerfile
+++ b/docs/sources/articles/https/Dockerfile
@@ -6,5 +6,5 @@ ADD make_certs.sh /
WORKDIR /data
-VOLUMES ["/data"]
+VOLUME ["/data"]
CMD /make_certs.sh
diff --git a/docs/sources/articles/https/Makefile b/docs/sources/articles/https/Makefile
index b751c1e43f..f06e0d256e 100644
--- a/docs/sources/articles/https/Makefile
+++ b/docs/sources/articles/https/Makefile
@@ -4,11 +4,11 @@ HOST:=boot2docker
makescript:
./parsedocs.sh > make_certs.sh
-build: makescript
+build: clean makescript
docker build -t makecerts .
cert: build
- docker run --rm -it -v $(CURDIR):/data -e HOST=$(HOST) makecerts
+ docker run --rm -it -v $(CURDIR):/data -e HOST=$(HOST) -e YOUR_PUBLIC_IP=$(shell ip a | grep "inet " | sed "s/.*inet \([0-9.]*\)\/.*/\1/" | xargs echo | sed "s/ /,IP:/g") makecerts
certs: cert
@@ -18,7 +18,7 @@ run:
client:
sudo docker --tls --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H=$(HOST):6666 version
sudo docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H=$(HOST):6666 info
- sudo curl https://$(HOST):6666/images/json --cert cert.pem --key key.pem --cacert ca.pem
+ sudo curl https://$(HOST):6666/images/json --cert ./cert.pem --key ./key.pem --cacert ./ca.pem
clean:
- rm ca-key.pem ca.pem ca.srl cert.pem client.csr extfile.cnf key.pem server-cert.pem server-key.pem server.csr
+ rm -f ca-key.pem ca.pem ca.srl cert.pem client.csr extfile.cnf key.pem server-cert.pem server-key.pem server.csr extfile.cnf
diff --git a/docs/sources/articles/https/make_certs.sh b/docs/sources/articles/https/make_certs.sh
index 85b7ae153c..39001fdb50 100755
--- a/docs/sources/articles/https/make_certs.sh
+++ b/docs/sources/articles/https/make_certs.sh
@@ -1,23 +1,23 @@
-#!/bin/bash
-
+#!/bin/sh
openssl genrsa -aes256 -out ca-key.pem 2048
-
-echo "enter your Docker daemon's hostname as the 'Common Name'= ($HOST)"
-
-#TODO add this as an ENV to docker run?
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
-
-
-# server cert
openssl genrsa -out server-key.pem 2048
openssl req -subj "/CN=$HOST" -new -key server-key.pem -out server.csr
-openssl x509 -req -days 365 -in server.csr -CA ca.pem -CAkey ca-key.pem \
- -CAcreateserial -out server-cert.pem
-
-#client cert
+echo subjectAltName = IP:$YOUR_PUBLIC_IP > extfile.cnf
+openssl x509 -req -days 365 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf
openssl genrsa -out key.pem 2048
openssl req -subj '/CN=client' -new -key key.pem -out client.csr
-
echo extendedKeyUsage = clientAuth > extfile.cnf
-openssl x509 -req -days 365 -in client.csr -CA ca.pem -CAkey ca-key.pem \
- -CAcreateserial -out cert.pem -extfile extfile.cnf
+openssl x509 -req -days 365 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf
+rm -v client.csr server.csr
+chmod -v 0400 ca-key.pem key.pem server-key.pem
+chmod -v 0444 ca.pem server-cert.pem cert.pem
+# docker -d --tlsverify --tlscacert=ca.pem --tlscert=server-cert.pem --tlskey=server-key.pem -H=0.0.0.0:7778
+# docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H=$HOST:7778 version
+mkdir -pv ~/.docker
+cp -v {ca,cert,key}.pem ~/.docker
+export DOCKER_HOST=tcp://$HOST:7778 DOCKER_TLS_VERIFY=1
+# docker ps
+export DOCKER_CERT_PATH=~/.docker/zone1/
+# docker --tlsverify ps
+# curl https://$HOST:7778/images/json --cert ~/.docker/cert.pem --key ~/.docker/key.pem --cacert ~/.docker/ca.pem
diff --git a/docs/sources/articles/networking.md b/docs/sources/articles/networking.md
index 03693eb4d8..7247d298d8 100644
--- a/docs/sources/articles/networking.md
+++ b/docs/sources/articles/networking.md
@@ -183,12 +183,36 @@ Four different options affect container domain name services.
only look up `host` but also `host.example.com`.
Use `--dns-search=.` if you don't wish to set the search domain.
-Note that Docker, in the absence of either of the last two options
-above, will make `/etc/resolv.conf` inside of each container look like
-the `/etc/resolv.conf` of the host machine where the `docker` daemon is
-running. You might wonder what happens when the host machine's
+Regarding DNS settings, in the absence of either the `--dns=IP_ADDRESS...`
+or the `--dns-search=DOMAIN...` option, Docker makes each container's
+`/etc/resolv.conf` look like the `/etc/resolv.conf` of the host machine (where
+the `docker` daemon runs). When creating the container's `/etc/resolv.conf`,
+the daemon filters out all localhost IP address `nameserver` entries from
+the host's original file.
+
+Filtering is necessary because all localhost addresses on the host are
+unreachable from the container's network. After this filtering, if there
+are no more `nameserver` entries left in the container's `/etc/resolv.conf`
+file, the daemon adds public Google DNS nameservers
+(8.8.8.8 and 8.8.4.4) to the container's DNS configuration. If IPv6 is
+enabled on the daemon, the public IPv6 Google DNS nameservers will also
+be added (2001:4860:4860::8888 and 2001:4860:4860::8844).
+
+> **Note**:
+> If you need access to a host's localhost resolver, you must modify your
+> DNS service on the host to listen on a non-localhost address that is
+> reachable from within the container.
+
+You might wonder what happens when the host machine's
`/etc/resolv.conf` file changes. The `docker` daemon has a file change
notifier active which will watch for changes to the host DNS configuration.
+
+> **Note**:
+> The file change notifier relies on the Linux kernel's inotify feature.
+> Because this feature is currently incompatible with the overlay filesystem
+> driver, a Docker daemon using "overlay" will not be able to take advantage
+> of the `/etc/resolv.conf` auto-update feature.
+
When the host file changes, all stopped containers which have a matching
`resolv.conf` to the host will be updated immediately to this newest host
configuration. Containers which are running when the host configuration
@@ -221,13 +245,11 @@ Whether a container can talk to the world is governed by two factors.
Docker will go set `ip_forward` to `1` for you when the server
starts up. To check the setting or turn it on manually:
- ```
- $ cat /proc/sys/net/ipv4/ip_forward
- 0
- $ echo 1 > /proc/sys/net/ipv4/ip_forward
- $ cat /proc/sys/net/ipv4/ip_forward
- 1
- ```
+ $ sysctl net.ipv4.conf.all.forwarding
+ net.ipv4.conf.all.forwarding = 0
+ $ sysctl net.ipv4.conf.all.forwarding=1
+ $ sysctl net.ipv4.conf.all.forwarding
+ net.ipv4.conf.all.forwarding = 1
Many using Docker will want `ip_forward` to be on, to at
least make communication *possible* between containers and
@@ -363,17 +385,18 @@ to provide special options when invoking `docker run`. These options
are covered in more detail in the [Docker User Guide](/userguide/dockerlinks)
page. There are two approaches.
-First, you can supply `-P` or `--publish-all=true|false` to `docker run`
-which is a blanket operation that identifies every port with an `EXPOSE`
-line in the image's `Dockerfile` and maps it to a host port somewhere in
-the range 49153–65535. This tends to be a bit inconvenient, since you
-then have to run other `docker` sub-commands to learn which external
-port a given service was mapped to.
+First, you can supply `-P` or `--publish-all=true|false` to `docker run` which
+is a blanket operation that identifies every port with an `EXPOSE` line in the
+image's `Dockerfile` or `--expose <port>` commandline flag and maps it to a
+host port somewhere within an *ephemeral port range*. The `docker port` command
+then needs to be used to inspect created mapping. The *ephemeral port range* is
+configured by `/proc/sys/net/ipv4/ip_local_port_range` kernel parameter,
+typically ranging from 32768 to 61000.
-More convenient is the `-p SPEC` or `--publish=SPEC` option which lets
-you be explicit about exactly which external port on the Docker server —
-which can be any port at all, not just those in the 49153-65535 block —
-you want mapped to which port in the container.
+Mapping can be specified explicitly using `-p SPEC` or `--publish=SPEC` option.
+It allows you to particularize which port on docker server - which can be any
+port at all, not just one within the *ephemeral port range* — you want mapped
+to which port in the container.
Either way, you should be able to peek at what Docker has accomplished
in your network stack by examining your NAT tables.
@@ -433,7 +456,7 @@ To assign globally routable IPv6 addresses to your containers you have to
specify an IPv6 subnet to pick the addresses from. Set the IPv6 subnet via the
`--fixed-cidr-v6` parameter when starting Docker daemon:
- docker -d --ipv6 --fixed-cidr-v6="2001:db8:0:2::/64"
+ docker -d --ipv6 --fixed-cidr-v6="2001:db8:1::/64"
The subnet for Docker containers should at least have a size of `/80`. This way
an IPv6 address can end with the container's MAC address and you prevent NDP
@@ -443,11 +466,11 @@ With the `--fixed-cidr-v6` parameter set Docker will add a new route to the
routing table. Further IPv6 routing will be enabled (you may prevent this by
starting Docker daemon with `--ip-forward=false`):
- $ route -A inet6 add 2001:db8:0:2::/64 dev docker0
- $ echo 1 > /proc/sys/net/ipv6/conf/default/forwarding
- $ echo 1 > /proc/sys/net/ipv6/conf/all/forwarding
+ $ ip -6 route add 2001:db8:1::/64 dev docker0
+ $ sysctl net.ipv6.conf.default.forwarding=1
+ $ sysctl net.ipv6.conf.all.forwarding=1
-All traffic to the subnet `2001:db8:0:2::/64` will now be routed
+All traffic to the subnet `2001:db8:1::/64` will now be routed
via the `docker0` interface.
Be aware that IPv6 forwarding may interfere with your existing IPv6
@@ -456,54 +479,104 @@ your host's interfaces you should set `accept_ra` to `2`. Otherwise IPv6
enabled forwarding will result in rejecting Router Advertisements. E.g., if you
want to configure `eth0` via Router Advertisements you should set:
- ```
- $ echo 2 > /proc/sys/net/ipv6/conf/eth0/accept_ra
- ```
+ $ sysctl net.ipv6.conf.eth0.accept_ra=2
![](/article-img/ipv6_basic_host_config.svg)
Every new container will get an IPv6 address from the defined subnet. Further
a default route will be added via the gateway `fe80::1` on `eth0`:
- docker run -it ubuntu bash -c "ifconfig eth0; route -A inet6"
-
- eth0 Link encap:Ethernet HWaddr 02:42:ac:11:00:02
- inet addr:172.17.0.2 Bcast:0.0.0.0 Mask:255.255.0.0
- inet6 addr: 2001:db8:0:2::1/64 Scope:Global
- inet6 addr: fe80::42:acff:fe11:2/64 Scope:Link
- UP BROADCAST MTU:1500 Metric:1
- RX packets:1 errors:0 dropped:0 overruns:0 frame:0
- TX packets:1 errors:0 dropped:0 overruns:0 carrier:0
- collisions:0 txqueuelen:0
- RX bytes:110 (110.0 B) TX bytes:110 (110.0 B)
-
- Kernel IPv6 routing table
- Destination Next Hop Flag Met Ref Use If
- 2001:db8:0:2::/64 :: U 256 0 0 eth0
- fe80::/64 :: U 256 0 0 eth0
- ::/0 fe80::1 UG 1024 0 0 eth0
- ::/0 :: !n -1 1 1 lo
- ::1/128 :: Un 0 1 0 lo
- ff00::/8 :: U 256 1 0 eth0
- ::/0 :: !n -1 1 1 lo
+ docker run -it ubuntu bash -c "ip -6 addr show dev eth0; ip -6 route show"
+
+ 15: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500
+ inet6 2001:db8:1:0:0:242:ac11:3/64 scope global
+ valid_lft forever preferred_lft forever
+ inet6 fe80::42:acff:fe11:3/64 scope link
+ valid_lft forever preferred_lft forever
+
+ 2001:db8:1::/64 dev eth0 proto kernel metric 256
+ fe80::/64 dev eth0 proto kernel metric 256
+ default via fe80::1 dev eth0 metric 1024
In this example the Docker container is assigned a link-local address with the
-network suffix `/64` (here: `fe80::42:acff:fe11:2/64`) and a globally routable
-IPv6 address (here: `2001:db8:0:2::1/64`). The container will create connections
-to addresses outside of the `2001:db8:0:2::/64` network via the link-local
-gateway at `fe80::1` on `eth0`.
+network suffix `/64` (here: `fe80::42:acff:fe11:3/64`) and a globally routable
+IPv6 address (here: `2001:db8:1:0:0:242:ac11:3/64`). The container will create
+connections to addresses outside of the `2001:db8:1::/64` network via the
+link-local gateway at `fe80::1` on `eth0`.
-Often servers or virtual machines get a `/64` IPv6 subnet assigned. In this case
-you can split it up further and provide Docker a `/80` subnet while using a
-separate `/80` subnet for other applications on the host:
+Often servers or virtual machines get a `/64` IPv6 subnet assigned (e.g.
+`2001:db8:23:42::/64`). In this case you can split it up further and provide
+Docker a `/80` subnet while using a separate `/80` subnet for other
+applications on the host:
![](/article-img/ipv6_slash64_subnet_config.svg)
-In this setup the subnet `2001:db8::/80` with a range from `2001:db8::0:0:0:0`
-to `2001:db8::0:ffff:ffff:ffff` is attached to `eth0`, with the host listening
-at `2001:db8::1`. The subnet `2001:db8:0:0:0:1::/80` with an address range from
-`2001:db8::1:0:0:0` to `2001:db8::1:ffff:ffff:ffff` is attached to `docker0` and
-will be used by containers.
+In this setup the subnet `2001:db8:23:42::/80` with a range from `2001:db8:23:42:0:0:0:0`
+to `2001:db8:23:42:0:ffff:ffff:ffff` is attached to `eth0`, with the host listening
+at `2001:db8:23:42::1`. The subnet `2001:db8:23:42:1::/80` with an address range from
+`2001:db8:23:42:1:0:0:0` to `2001:db8:23:42:1:ffff:ffff:ffff` is attached to
+`docker0` and will be used by containers.
+
+#### Using NDP proxying
+
+If your Docker host is only part of an IPv6 subnet but has not got an IPv6
+subnet assigned you can use NDP proxying to connect your containers via IPv6 to
+the internet.
+For example your host has the IPv6 address `2001:db8::c001`, is part of the
+subnet `2001:db8::/64` and your IaaS provider allows you to configure the IPv6
+addresses `2001:db8::c000` to `2001:db8::c00f`:
+
+ $ ip -6 addr show
+ 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536
+ inet6 ::1/128 scope host
+ valid_lft forever preferred_lft forever
+ 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
+ inet6 2001:db8::c001/64 scope global
+ valid_lft forever preferred_lft forever
+ inet6 fe80::601:3fff:fea1:9c01/64 scope link
+ valid_lft forever preferred_lft forever
+
+Let's split up the configurable address range into two subnets
+`2001:db8::c000/125` and `2001:db8::c008/125`. The first one can be used by the
+host itself, the latter by Docker:
+
+ docker -d --ipv6 --fixed-cidr-v6 2001:db8::c008/125
+
+You notice the Docker subnet is within the subnet managed by your router that
+is connected to `eth0`. This means all devices (containers) with the addresses
+from the Docker subnet are expected to be found within the router subnet.
+Therefore the router thinks it can talk to these containers directly.
+
+![](/article-img/ipv6_ndp_proxying.svg)
+
+As soon as the router wants to send an IPv6 packet to the first container it
+will transmit a neighbor solicitation request, asking, who has
+`2001:db8::c009`? But it will get no answer because noone on this subnet has
+this address. The container with this address is hidden behind the Docker host.
+The Docker host has to listen to neighbor solication requests for the container
+address and send a response that itself is the device that is responsible for
+the address. This is done by a Kernel feature called `NDP Proxy`. You can
+enable it by executing
+
+ $ sysctl net.ipv6.conf.eth0.proxy_ndp=1
+
+Now you can add the container's IPv6 address to the NDP proxy table:
+
+ $ ip -6 neigh add proxy 2001:db8::c009 dev eth0
+
+This command tells the Kernel to answer to incoming neighbor solicitation requests
+regarding the IPv6 address `2001:db8::c009` on the device `eth0`. As a
+consequence of this all traffic to this IPv6 address will go into the Docker
+host and it will forward it according to its routing table via the `docker0`
+device to the container network:
+
+ $ ip -6 route show
+ 2001:db8::c008/125 dev docker0 metric 1
+ 2001:db8::/64 dev eth0 proto kernel metric 256
+
+You have to execute the `ip -6 neigh add proxy ...` command for every IPv6
+address in your Docker subnet. Unfortunately there is no functionality for
+adding a whole subnet by executing one command.
### Docker IPv6 Cluster
@@ -514,29 +587,29 @@ example:
![](/article-img/ipv6_switched_network_example.svg)
-The Docker hosts are in the `2000::/64` subnet. Host1 is configured
-to provide addresses from the `2001::/64` subnet to its containers. It has three
-routes configured:
+The Docker hosts are in the `2001:db8:0::/64` subnet. Host1 is configured
+to provide addresses from the `2001:db8:1::/64` subnet to its containers. It
+has three routes configured:
-- Route all traffic to `2000::/64` via `eth0`
-- Route all traffic to `2001::/64` via `docker0`
-- Route all traffic to `2002::/64` via Host2 with IP `2000::2`
+- Route all traffic to `2001:db8:0::/64` via `eth0`
+- Route all traffic to `2001:db8:1::/64` via `docker0`
+- Route all traffic to `2001:db8:2::/64` via Host2 with IP `2001:db8::2`
Host1 also acts as a router on OSI layer 3. When one of the network clients
tries to contact a target that is specified in Host1's routing table Host1 will
forward the traffic accordingly. It acts as a router for all networks it knows:
-`2000:/64`, `2001:/64` and `2002::/64`.
+`2001:db8::/64`, `2001:db8:1::/64` and `2001:db8:2::/64`.
-On Host2 we have nearly the same configuration. Host2's containers will get IPv6
-addresses from `2002::/64`. Host2 has three routes configured:
+On Host2 we have nearly the same configuration. Host2's containers will get
+IPv6 addresses from `2001:db8:2::/64`. Host2 has three routes configured:
-- Route all traffic to `2000::/64` via `eth0`
-- Route all traffic to `2002::/64` via `docker0`
-- Route all traffic to `2001::/64` via Host1 with IP `2000::1`
+- Route all traffic to `2001:db8:0::/64` via `eth0`
+- Route all traffic to `2001:db8:2::/64` via `docker0`
+- Route all traffic to `2001:db8:1::/64` via Host1 with IP `2001:db8:0::1`
-The difference to Host1 is that the network `2002::/64` is directly attached to
-the host via its `docker0` interface whereas it reaches `2001::/64` via Host1's
-IPv6 address `2000::1`.
+The difference to Host1 is that the network `2001:db8:2::/64` is directly
+attached to the host via its `docker0` interface whereas it reaches
+`2001:db8:1::/64` via Host1's IPv6 address `2001:db8::1`.
This way every container is able to contact every other container. The
containers `Container1-*` share the same subnet and contact each other directly.
@@ -781,10 +854,11 @@ The steps with which Docker configures a container are:
5. Give the container's `eth0` a new IP address from within the
bridge's range of network addresses, and set its default route to
- the IP address that the Docker host owns on the bridge. If available
- the IP address is generated from the MAC address. This prevents ARP
- cache invalidation problems, when a new container comes up with an
- IP used in the past by another container with another MAC.
+ the IP address that the Docker host owns on the bridge. The MAC
+ address is generated from the IP address unless otherwise specified.
+ This prevents ARP cache invalidation problems, when a new container
+ comes up with an IP used in the past by another container with another
+ MAC.
With these steps complete, the container now possesses an `eth0`
(virtual) network card and will find itself able to communicate with
diff --git a/docs/sources/articles/registry_mirror.md b/docs/sources/articles/registry_mirror.md
index a7493e9aec..adc470d713 100644
--- a/docs/sources/articles/registry_mirror.md
+++ b/docs/sources/articles/registry_mirror.md
@@ -50,7 +50,8 @@ port `5000` and mirrors the content at `registry-1.docker.io`:
sudo docker run -p 5000:5000 \
-e STANDALONE=false \
-e MIRROR_SOURCE=https://registry-1.docker.io \
- -e MIRROR_SOURCE_INDEX=https://index.docker.io registry
+ -e MIRROR_SOURCE_INDEX=https://index.docker.io \
+ registry
## Test it out
diff --git a/docs/sources/contributing.md b/docs/sources/contributing.md
deleted file mode 100644
index 0a1e4fd282..0000000000
--- a/docs/sources/contributing.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# Contributing
-
-## Contents:
-
- - [Contributing to Docker](contributing/)
- - [Setting Up a Dev Environment](devenvironment/)
-
diff --git a/docs/sources/contributing/contributing.md b/docs/sources/contributing/contributing.md
deleted file mode 100644
index 850b01ce12..0000000000
--- a/docs/sources/contributing/contributing.md
+++ /dev/null
@@ -1,24 +0,0 @@
-page_title: Contribution Guidelines
-page_description: Contribution guidelines: create issues, conventions, pull requests
-page_keywords: contributing, docker, documentation, help, guideline
-
-# Contributing to Docker
-
-Want to hack on Docker? Awesome!
-
-The repository includes [all the instructions you need to get started](
-https://github.com/docker/docker/blob/master/CONTRIBUTING.md).
-
-The [developer environment Dockerfile](
-https://github.com/docker/docker/blob/master/Dockerfile)
-specifies the tools and versions used to test and build Docker.
-
-If you're making changes to the documentation, see the [README.md](
-https://github.com/docker/docker/blob/master/docs/README.md).
-
-The [documentation environment Dockerfile](
-https://github.com/docker/docker/blob/master/docs/Dockerfile)
-specifies the tools and versions used to build the Documentation.
-
-Further interesting details can be found in the [Packaging hints](
-https://github.com/docker/docker/blob/master/project/PACKAGERS.md).
diff --git a/docs/sources/contributing/devenvironment.md b/docs/sources/contributing/devenvironment.md
deleted file mode 100644
index 607ed4d9ed..0000000000
--- a/docs/sources/contributing/devenvironment.md
+++ /dev/null
@@ -1,167 +0,0 @@
-page_title: Setting Up a Dev Environment
-page_description: Guides on how to contribute to docker
-page_keywords: Docker, documentation, developers, contributing, dev environment
-
-# Setting Up a Dev Environment
-
-To make it easier to contribute to Docker, we provide a standard
-development environment. It is important that the same environment be
-used for all tests, builds and releases. The standard development
-environment defines all build dependencies: system libraries and
-binaries, go environment, go dependencies, etc.
-
-**Things you need:**
-
- * Docker
- * git
- * make
-
-## Install Docker
-
-Docker's build environment itself is a Docker container, so the first
-step is to install Docker on your system.
-
-You can follow the [install instructions most relevant to your
-system](https://docs.docker.com/installation/). Make sure you
-have a working, up-to-date docker installation, then continue to the
-next step.
-
-## Install tools used for this tutorial
-
-Install `git`; honest, it's very good. You can use
-other ways to get the Docker source, but they're not anywhere near as
-easy.
-
-Install `make`. This tutorial uses our base Makefile
-to kick off the docker containers in a repeatable and consistent way.
-Again, you can do it in other ways but you need to do more work.
-
-## Check out the Source
-
- $ git clone https://git@github.com/docker/docker
- $ cd docker
-
-To checkout a different revision just use `git checkout`
-with the name of branch or revision number.
-
-## Build the Environment
-
-This following command builds a development environment using the
-`Dockerfile` in the current directory. Essentially, it installs all
-the build and runtime dependencies necessary to build and test Docker.
-Your first build will take some time to complete. On Linux systems and on Mac
-OS X from within the `boot2docker` shell:
-
- $ make build
-
-> **Note**:
-> On Mac OS X, the Docker make targets such as `build`, `binary`, and `test`
-> should **not** be built by the 'root' user. Therefore, you shouldn't use `sudo` when
-> running these commands on OS X.
-> On Linux, we suggest you add your current user to the `docker` group via
-> [these
-> instructions](http://docs.docker.com/installation/ubuntulinux/#giving-non-root-access).
-
-If the build is successful, congratulations! You have produced a clean
-build of docker, neatly encapsulated in a standard build environment.
-
-
-## Build the Docker Binary
-
-To create the Docker binary, run this command:
-
- $ make binary
-
-This will create the Docker binary in `./bundles/<version>-dev/binary/`. If you
-do not see files in the `./bundles` directory in your host, your `BINDDIR`
-setting is not set quite right. You want to run the following command:
-
- $ make BINDDIR=. binary
-
-If you are on a non-Linux platform, e.g., OSX, you'll want to run `make cross`
-or `make BINDDIR=. cross`.
-
-### Using your built Docker binary
-
-The binary is available outside the container in the directory
-`./bundles/<version>-dev/binary/`. You can swap your
-host docker executable with this binary for live testing - for example,
-on ubuntu:
-
- $ sudo service docker stop ; sudo cp $(which docker) $(which docker)_ ; sudo cp ./bundles/<version>-dev/binary/docker-<version>-dev $(which docker);sudo service docker start
-
-> **Note**:
-> Its safer to run the tests below before swapping your hosts docker binary.
-
-## Run the Tests
-
-To execute the test cases, run this command:
-
- $ make test
-
-If the test are successful then the tail of the output should look
-something like this
-
- --- PASS: TestWriteBroadcaster (0.00 seconds)
- === RUN TestRaceWriteBroadcaster
- --- PASS: TestRaceWriteBroadcaster (0.00 seconds)
- === RUN TestTruncIndex
- --- PASS: TestTruncIndex (0.00 seconds)
- === RUN TestCompareKernelVersion
- --- PASS: TestCompareKernelVersion (0.00 seconds)
- === RUN TestHumanSize
- --- PASS: TestHumanSize (0.00 seconds)
- === RUN TestParseHost
- --- PASS: TestParseHost (0.00 seconds)
- === RUN TestParseRepositoryTag
- --- PASS: TestParseRepositoryTag (0.00 seconds)
- === RUN TestGetResolvConf
- --- PASS: TestGetResolvConf (0.00 seconds)
- === RUN TestParseRelease
- --- PASS: TestParseRelease (0.00 seconds)
- === RUN TestDependencyGraphCircular
- --- PASS: TestDependencyGraphCircular (0.00 seconds)
- === RUN TestDependencyGraph
- --- PASS: TestDependencyGraph (0.00 seconds)
- PASS
- ok github.com/docker/docker/utils 0.017s
-
-If $TESTFLAGS is set in the environment, it is passed as extra arguments
-to `go test`. You can use this to select certain tests to run, e.g.,
-
- $ TESTFLAGS='-test.run \^TestBuild\$' make test
-
-If the output indicates "FAIL" and you see errors like this:
-
- server.go:1302 Error: Insertion failed because database is full: database or disk is full
-
- utils_test.go:179: Error copy: exit status 1 (cp: writing '/tmp/docker-testd5c9-[...]': No space left on device
-
-Then you likely don't have enough memory available the test suite. 2GB
-is recommended.
-
-## Use Docker
-
-You can run an interactive session in the newly built container:
-
- $ make shell
-
- # type 'exit' or Ctrl-D to exit
-
-## Build And View The Documentation
-
-If you want to read the documentation from a local website, or are
-making changes to it, you can build the documentation and then serve it
-by:
-
- $ make docs
-
- # when its done, you can point your browser to http://yourdockerhost:8000
- # type Ctrl-C to exit
-
-**Need More Help?**
-
-If you need more help then hop on to the [#docker-dev IRC
-channel](irc://chat.freenode.net#docker-dev) or post a message on the
-[Docker developer mailing
-list](https://groups.google.com/d/forum/docker-dev).
diff --git a/docs/sources/docker-hub/accounts.md b/docs/sources/docker-hub/accounts.md
index be3212005e..e4623f9980 100644
--- a/docs/sources/docker-hub/accounts.md
+++ b/docs/sources/docker-hub/accounts.md
@@ -40,15 +40,15 @@ organizations [you belong to and add new organizations](
https://hub.docker.com/account/organizations/) from the Account Settings
tab. They are also listed below your user name on your repositories page and in your account profile.
-![organizations](/docker-hub/orgs.png)
+![organizations](/docker-hub/hub-images/orgs.png)
From within your organizations you can create groups that allow you to
further manage who can interact with your repositories.
-![groups](/docker-hub/groups.png)
+![groups](/docker-hub/hub-images/groups.png)
You can add or invite users to join groups by clicking on the organization and then clicking the edit button for the group to which you want to add members. Enter a user-name (for current Hub users) or email address (if they are not yet Hub users) for the person you want to invite. They will receive an email invitation to join the group.
-![invite members](/docker-hub/invite.png)
+![invite members](/docker-hub/hub-images/invite.png)
diff --git a/docs/sources/docker-hub/builds.md b/docs/sources/docker-hub/builds.md
index 164018e827..1613ad1d4b 100644
--- a/docs/sources/docker-hub/builds.md
+++ b/docs/sources/docker-hub/builds.md
@@ -63,13 +63,15 @@ public or private GitHub repositories with a `Dockerfile`.
### GitHub Submodules
-If your GitHub repository contains links to private submodules, you'll
-need to add a deploy key from your Docker Hub repository.
+If your GitHub repository contains links to private submodules, you'll get an
+error message in your build.
-Your Docker Hub deploy key is located under the "Build Details"
-menu on the Automated Build's main page in the Hub. Add this key
-to your GitHub submodule by visiting the Settings page for the
-repository on GitHub and selecting "Deploy keys".
+Normally, the Docker Hub sets up a deploy key in your GitHub repository.
+Unfortunately, GitHub only allows a repository deploy key to access a single repository.
+
+To work around this, you need to create a dedicated user account in GitHub and attach
+the automated build's deploy key that account. This dedicated build account
+can be limited to read-only access to just the repositories required to build.
<table class="table table-bordered">
<thead>
@@ -82,15 +84,33 @@ repository on GitHub and selecting "Deploy keys".
<tbody>
<tr>
<td>1.</td>
- <td><img src="/docker-hub/hub-images/deploy_key.png"></td>
- <td>Your automated build's deploy key is in the "Build Details" menu
-under "Deploy keys".</td>
+ <td><img src="/docker-hub/hub-images/gh_org_members.png"></td>
+ <td>First, create the new account in GitHub. It should be given read-only
+ access to the main repository and all submodules that are needed.</td>
</tr>
<tr>
<td>2.</td>
- <td><img src="/docker-hub/hub-images/github_deploy_key.png"></td>
- <td>In your GitHub submodule's repository Settings page, add the
-deploy key from your Docker Hub Automated Build.</td>
+ <td><img src="/docker-hub/hub-images/gh_team_members.png"></td>
+ <td>This can be accomplished by adding the account to a read-only team in
+ the organization(s) where the main GitHub repository and all submodule
+ repositories are kept.</td>
+ </tr>
+ <tr>
+ <td>3.</td>
+ <td><img src="/docker-hub/hub-images/gh_repo_deploy_key.png"></td>
+ <td>Next, remove the deploy key from the main GitHub repository. This can be done in the GitHub repository's "Deploy keys" Settings section.</td>
+ </tr>
+ <tr>
+ <td>4.</td>
+ <td><img src="/docker-hub/hub-images/deploy_key.png"></td>
+ <td>Your automated build's deploy key is in the "Build Details" menu
+ under "Deploy keys".</td>
+ </tr>
+ <tr>
+ <td>5.</td>
+ <td><img src="/docker-hub/hub-images/gh_add_ssh_user_key.png"></td>
+ <td>In your dedicated GitHub User account, add the deploy key from your
+ Docker Hub Automated Build.</td>
</tr>
</tbody>
</table>
diff --git a/docs/sources/docker-hub/hub-images/build-trigger.png b/docs/sources/docker-hub/hub-images/build-trigger.png
index 25597a27bd..ea4e99b453 100644
--- a/docs/sources/docker-hub/hub-images/build-trigger.png
+++ b/docs/sources/docker-hub/hub-images/build-trigger.png
Binary files differ
diff --git a/docs/sources/docker-hub/hub-images/gh_add_ssh_user_key.png b/docs/sources/docker-hub/hub-images/gh_add_ssh_user_key.png
new file mode 100644
index 0000000000..7d0092170f
--- /dev/null
+++ b/docs/sources/docker-hub/hub-images/gh_add_ssh_user_key.png
Binary files differ
diff --git a/docs/sources/docker-hub/hub-images/gh_org_members.png b/docs/sources/docker-hub/hub-images/gh_org_members.png
new file mode 100644
index 0000000000..465f5da565
--- /dev/null
+++ b/docs/sources/docker-hub/hub-images/gh_org_members.png
Binary files differ
diff --git a/docs/sources/docker-hub/hub-images/gh_repo_deploy_key.png b/docs/sources/docker-hub/hub-images/gh_repo_deploy_key.png
new file mode 100644
index 0000000000..983b5eec77
--- /dev/null
+++ b/docs/sources/docker-hub/hub-images/gh_repo_deploy_key.png
Binary files differ
diff --git a/docs/sources/docker-hub/hub-images/gh_team_members.png b/docs/sources/docker-hub/hub-images/gh_team_members.png
new file mode 100644
index 0000000000..3bdf4abd95
--- /dev/null
+++ b/docs/sources/docker-hub/hub-images/gh_team_members.png
Binary files differ
diff --git a/docs/sources/docker-hub/hub-images/github_deploy_key.png b/docs/sources/docker-hub/hub-images/github_deploy_key.png
deleted file mode 100644
index a0ec6a918f..0000000000
--- a/docs/sources/docker-hub/hub-images/github_deploy_key.png
+++ /dev/null
Binary files differ
diff --git a/docs/sources/docker-hub/groups.png b/docs/sources/docker-hub/hub-images/groups.png
index 0c6430efab..0c6430efab 100644
--- a/docs/sources/docker-hub/groups.png
+++ b/docs/sources/docker-hub/hub-images/groups.png
Binary files differ
diff --git a/docs/sources/docker-hub/hub.png b/docs/sources/docker-hub/hub-images/hub.png
index 16840e0547..16840e0547 100644
--- a/docs/sources/docker-hub/hub.png
+++ b/docs/sources/docker-hub/hub-images/hub.png
Binary files differ
diff --git a/docs/sources/docker-hub/hub-images/invite.png b/docs/sources/docker-hub/hub-images/invite.png
index e6b74d0617..0a157ffbf0 100644
--- a/docs/sources/docker-hub/hub-images/invite.png
+++ b/docs/sources/docker-hub/hub-images/invite.png
Binary files differ
diff --git a/docs/sources/docker-hub/hub-images/orgs.png b/docs/sources/docker-hub/hub-images/orgs.png
new file mode 100644
index 0000000000..604ed95a09
--- /dev/null
+++ b/docs/sources/docker-hub/hub-images/orgs.png
Binary files differ
diff --git a/docs/sources/docker-hub/repos.png b/docs/sources/docker-hub/hub-images/repos.png
index f25bb3a48d..f25bb3a48d 100644
--- a/docs/sources/docker-hub/repos.png
+++ b/docs/sources/docker-hub/hub-images/repos.png
Binary files differ
diff --git a/docs/sources/docker-hub/index.md b/docs/sources/docker-hub/index.md
index 92d0ee063b..c29a5f7873 100644
--- a/docs/sources/docker-hub/index.md
+++ b/docs/sources/docker-hub/index.md
@@ -4,7 +4,7 @@ page_keywords: Docker, docker, registry, accounts, plans, Dockerfile, Docker Hub
# Docker Hub
-![DockerHub](/docker-hub/hub.png)
+![DockerHub](/docker-hub/hub-images/hub.png)
## [Accounts](accounts/)
diff --git a/docs/sources/docker-hub/invite.png b/docs/sources/docker-hub/invite.png
deleted file mode 100644
index 5534d2b888..0000000000
--- a/docs/sources/docker-hub/invite.png
+++ /dev/null
Binary files differ
diff --git a/docs/sources/docker-hub/orgs.png b/docs/sources/docker-hub/orgs.png
deleted file mode 100644
index 6a49cc65dd..0000000000
--- a/docs/sources/docker-hub/orgs.png
+++ /dev/null
Binary files differ
diff --git a/docs/sources/docker-hub/repos.md b/docs/sources/docker-hub/repos.md
index 042cb572f5..576583584f 100644
--- a/docs/sources/docker-hub/repos.md
+++ b/docs/sources/docker-hub/repos.md
@@ -4,7 +4,7 @@ page_keywords: Docker, docker, registry, accounts, plans, Dockerfile, Docker Hub
# Repositories and Images on Docker Hub
-![repositories](/docker-hub/repos.png)
+![repositories](/docker-hub/hub-images/repos.png)
## Searching for repositories and images
diff --git a/docs/sources/examples/mongodb.md b/docs/sources/examples/mongodb.md
index 28f7824594..c4fbf57681 100644
--- a/docs/sources/examples/mongodb.md
+++ b/docs/sources/examples/mongodb.md
@@ -59,7 +59,7 @@ a MongoDB repository file for the package manager.
# Installation:
# Import MongoDB public GPG key AND create a MongoDB list file
- RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
+ RUN apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv 7F0CEB10
RUN echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | tee /etc/apt/sources.list.d/10gen.list
After this initial preparation we can update our packages and install MongoDB.
diff --git a/docs/sources/examples/mongodb/Dockerfile b/docs/sources/examples/mongodb/Dockerfile
index 9333eb5811..c17a6360e5 100644
--- a/docs/sources/examples/mongodb/Dockerfile
+++ b/docs/sources/examples/mongodb/Dockerfile
@@ -7,7 +7,7 @@ MAINTAINER Docker
# Installation:
# Import MongoDB public GPG key AND create a MongoDB list file
-RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
+RUN apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv 7F0CEB10
RUN echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | tee /etc/apt/sources.list.d/10gen.list
# Update apt-get sources AND install MongoDB
diff --git a/docs/sources/examples/nodejs_web_app.md b/docs/sources/examples/nodejs_web_app.md
index 7358a3f50f..56f7687cd2 100644
--- a/docs/sources/examples/nodejs_web_app.md
+++ b/docs/sources/examples/nodejs_web_app.md
@@ -157,7 +157,7 @@ Print the output of your app:
## Test
-To test your app, get the the port of your app that Docker mapped:
+To test your app, get the port of your app that Docker mapped:
$ sudo docker ps
diff --git a/docs/sources/examples/postgresql_service.Dockerfile b/docs/sources/examples/postgresql_service.Dockerfile
index d0f37669d1..9c0c0d4fc7 100644
--- a/docs/sources/examples/postgresql_service.Dockerfile
+++ b/docs/sources/examples/postgresql_service.Dockerfile
@@ -7,7 +7,7 @@ MAINTAINER SvenDowideit@docker.com
# Add the PostgreSQL PGP key to verify their Debian packages.
# It should be the same key as https://www.postgresql.org/media/keys/ACCC4CF8.asc
-RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys B97B0AFCAA1A47F044F244A07FCC7D46ACCC4CF8
+RUN apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys B97B0AFCAA1A47F044F244A07FCC7D46ACCC4CF8
# Add PostgreSQL's repository. It contains the most recent stable release
# of PostgreSQL, ``9.3``.
diff --git a/docs/sources/examples/postgresql_service.md b/docs/sources/examples/postgresql_service.md
index 21044d369a..87960098ff 100644
--- a/docs/sources/examples/postgresql_service.md
+++ b/docs/sources/examples/postgresql_service.md
@@ -29,7 +29,7 @@ Start by creating a new `Dockerfile`:
# Add the PostgreSQL PGP key to verify their Debian packages.
# It should be the same key as https://www.postgresql.org/media/keys/ACCC4CF8.asc
- RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys B97B0AFCAA1A47F044F244A07FCC7D46ACCC4CF8
+ RUN apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys B97B0AFCAA1A47F044F244A07FCC7D46ACCC4CF8
# Add PostgreSQL's repository. It contains the most recent stable release
# of PostgreSQL, ``9.3``.
diff --git a/docs/sources/faq.md b/docs/sources/faq.md
index f517db73a4..0f64ff9b93 100644
--- a/docs/sources/faq.md
+++ b/docs/sources/faq.md
@@ -1,15 +1,17 @@
-page_title: FAQ
-page_description: Most frequently asked questions.
+page_title: FAQ page_description: Most frequently asked questions.
page_keywords: faq, questions, documentation, docker
-# FAQ
+# Frequently Asked Questions (FAQ)
+
+If you don't see your question here, feel free to submit new ones to
+<docs@docker.com>. Or, you can fork [the
+repo](https://github.com/docker/docker) and contribute them yourself by editing
+the documentation sources.
-## Most frequently asked questions
### How much does Docker cost?
-Docker is 100% free. It is open source, so you can use it without
-paying.
+Docker is 100% free. It is open source, so you can use it without paying.
### What open source license are you using?
@@ -19,107 +21,90 @@ https://github.com/docker/docker/blob/master/LICENSE)
### Does Docker run on Mac OS X or Windows?
-Docker currently runs only on Linux, but you can use VirtualBox to run
-Docker in a virtual machine on your box, and get the best of both worlds.
-Check out the [*Mac OS X*](../installation/mac/#macosx) and [*Microsoft
-Windows*](../installation/windows/#windows) installation guides. The small
-Linux distribution boot2docker can be run inside virtual machines on these
-two operating systems.
+Docker currently runs only on Linux, but you can use VirtualBox to run Docker in
+a virtual machine on your box, and get the best of both worlds. Check out the
+[*Mac OS X*](../installation/mac/#macosx) and [*Microsoft
+Windows*](../installation/windows/#windows) installation guides. The small Linux
+distribution boot2docker can be run inside virtual machines on these two
+operating systems.
{{ include "no-remote-sudo.md" }}
### How do containers compare to virtual machines?
-They are complementary. VMs are best used to allocate chunks of
-hardware resources. Containers operate at the process level, which
-makes them very lightweight and perfect as a unit of software
-delivery.
+They are complementary. VMs are best used to allocate chunks of hardware
+resources. Containers operate at the process level, which makes them very
+lightweight and perfect as a unit of software delivery.
### What does Docker add to just plain LXC?
-Docker is not a replacement for LXC. "LXC" refers to capabilities of
-the Linux kernel (specifically namespaces and control groups) which
-allow sandboxing processes from one another, and controlling their
-resource allocations. On top of this low-level foundation of kernel
-features, Docker offers a high-level tool with several powerful
-functionalities:
-
- - *Portable deployment across machines.*
- Docker defines a format for bundling an application and all
- its dependencies into a single object which can be transferred
- to any Docker-enabled machine, and executed there with the
- guarantee that the execution environment exposed to the
- application will be the same. LXC implements process
- sandboxing, which is an important pre-requisite for portable
- deployment, but that alone is not enough for portable
- deployment. If you sent me a copy of your application
- installed in a custom LXC configuration, it would almost
- certainly not run on my machine the way it does on yours,
- because it is tied to your machine's specific configuration:
- networking, storage, logging, distro, etc. Docker defines an
- abstraction for these machine-specific settings, so that the
- exact same Docker container can run - unchanged - on many
- different machines, with many different configurations.
-
- - *Application-centric.*
- Docker is optimized for the deployment of applications, as
- opposed to machines. This is reflected in its API, user
- interface, design philosophy and documentation. By contrast,
- the `lxc` helper scripts focus on
- containers as lightweight machines - basically servers that
- boot faster and need less RAM. We think there's more to
- containers than just that.
-
- - *Automatic build.*
- Docker includes [*a tool for developers to automatically
- assemble a container from their source
- code*](../reference/builder/#dockerbuilder), with full control
- over application dependencies, build tools, packaging etc.
- They are free to use `make`, `maven`, `chef`, `puppet`, `salt,`
- Debian packages, RPMs, source tarballs, or any combination of the
- above, regardless of the configuration of the machines.
-
- - *Versioning.*
- Docker includes git-like capabilities for tracking successive
- versions of a container, inspecting the diff between versions,
- committing new versions, rolling back etc. The history also
- includes how a container was assembled and by whom, so you get
- full traceability from the production server all the way back
- to the upstream developer. Docker also implements incremental
- uploads and downloads, similar to `git pull`, so new versions
- of a container can be transferred by only sending diffs.
-
- - *Component re-use.*
- Any container can be used as a [*"base image"*](
- ../terms/image/#base-image-def) to create more specialized components.
- This can be done manually or as part of an automated build. For example
- you can prepare the ideal Python environment, and use it as a base for
- 10 different applications. Your ideal Postgresql setup can be re-used for
- all your future projects. And so on.
-
- - *Sharing.*
- Docker has access to a [public registry](https://hub.docker.com) where
- thousands of people have uploaded useful containers: anything from Redis,
- CouchDB, Postgres to IRC bouncers to Rails app servers to Hadoop to
- base images for various Linux distros. The
- [*registry*](../reference/api/registry_index_spec/#registryindexspec)
- also includes an official "standard library" of useful
- containers maintained by the Docker team. The registry itself
- is open-source, so anyone can deploy their own registry to
- store and transfer private containers, for internal server
- deployments for example.
-
- - *Tool ecosystem.*
- Docker defines an API for automating and customizing the
- creation and deployment of containers. There are a huge number
- of tools integrating with Docker to extend its capabilities.
- PaaS-like deployment (Dokku, Deis, Flynn), multi-node
- orchestration (Maestro, Salt, Mesos, Openstack Nova),
- management dashboards (docker-ui, Openstack Horizon,
- Shipyard), configuration management (Chef, Puppet), continuous
- integration (Jenkins, Strider, Travis), etc. Docker is rapidly
- establishing itself as the standard for container-based
- tooling.
+Docker is not a replacement for LXC. "LXC" refers to capabilities of the Linux
+kernel (specifically namespaces and control groups) which allow sandboxing
+processes from one another, and controlling their resource allocations. On top
+of this low-level foundation of kernel features, Docker offers a high-level tool
+with several powerful functionalities:
+
+ - *Portable deployment across machines.* Docker defines a format for bundling
+ an application and all its dependencies into a single object which can be
+ transferred to any Docker-enabled machine, and executed there with the
+ guarantee that the execution environment exposed to the application will be the
+ same. LXC implements process sandboxing, which is an important pre-requisite
+ for portable deployment, but that alone is not enough for portable deployment.
+ If you sent me a copy of your application installed in a custom LXC
+ configuration, it would almost certainly not run on my machine the way it does
+ on yours, because it is tied to your machine's specific configuration:
+ networking, storage, logging, distro, etc. Docker defines an abstraction for
+ these machine-specific settings, so that the exact same Docker container can
+ run - unchanged - on many different machines, with many different
+ configurations.
+
+ - *Application-centric.* Docker is optimized for the deployment of
+ applications, as opposed to machines. This is reflected in its API, user
+ interface, design philosophy and documentation. By contrast, the `lxc` helper
+ scripts focus on containers as lightweight machines - basically servers that
+ boot faster and need less RAM. We think there's more to containers than just
+ that.
+
+ - *Automatic build.* Docker includes [*a tool for developers to automatically
+ assemble a container from their source
+ code*](../reference/builder/#dockerbuilder), with full control over application
+ dependencies, build tools, packaging etc. They are free to use `make`, `maven`,
+ `chef`, `puppet`, `salt,` Debian packages, RPMs, source tarballs, or any
+ combination of the above, regardless of the configuration of the machines.
+
+ - *Versioning.* Docker includes git-like capabilities for tracking successive
+ versions of a container, inspecting the diff between versions, committing new
+ versions, rolling back etc. The history also includes how a container was
+ assembled and by whom, so you get full traceability from the production server
+ all the way back to the upstream developer. Docker also implements incremental
+ uploads and downloads, similar to `git pull`, so new versions of a container
+ can be transferred by only sending diffs.
+
+ - *Component re-use.* Any container can be used as a [*"base image"*](
+ ../terms/image/#base-image-def) to create more specialized components. This can
+ be done manually or as part of an automated build. For example you can prepare
+ the ideal Python environment, and use it as a base for 10 different
+ applications. Your ideal Postgresql setup can be re-used for all your future
+ projects. And so on.
+
+ - *Sharing.* Docker has access to a [public registry](https://hub.docker.com)
+ where thousands of people have uploaded useful containers: anything from Redis,
+ CouchDB, Postgres to IRC bouncers to Rails app servers to Hadoop to base images
+ for various Linux distros. The
+ [*registry*](../reference/api/registry_index_spec/#registryindexspec) also
+ includes an official "standard library" of useful containers maintained by the
+ Docker team. The registry itself is open-source, so anyone can deploy their own
+ registry to store and transfer private containers, for internal server
+ deployments for example.
+
+ - *Tool ecosystem.* Docker defines an API for automating and customizing the
+ creation and deployment of containers. There are a huge number of tools
+ integrating with Docker to extend its capabilities. PaaS-like deployment
+ (Dokku, Deis, Flynn), multi-node orchestration (Maestro, Salt, Mesos, Openstack
+ Nova), management dashboards (docker-ui, Openstack Horizon, Shipyard),
+ configuration management (Chef, Puppet), continuous integration (Jenkins,
+ Strider, Travis), etc. Docker is rapidly establishing itself as the standard
+ for container-based tooling.
### What is different between a Docker container and a VM?
@@ -128,104 +113,100 @@ http://stackoverflow.com/questions/16047306/how-is-docker-io-different-from-a-no
### Do I lose my data when the container exits?
-Not at all! Any data that your application writes to disk gets preserved
-in its container until you explicitly delete the container. The file
-system for the container persists even after the container halts.
+Not at all! Any data that your application writes to disk gets preserved in its
+container until you explicitly delete the container. The file system for the
+container persists even after the container halts.
### How far do Docker containers scale?
-Some of the largest server farms in the world today are based on
-containers. Large web deployments like Google and Twitter, and platform
-providers such as Heroku and dotCloud all run on container technology,
-at a scale of hundreds of thousands or even millions of containers
-running in parallel.
+Some of the largest server farms in the world today are based on containers.
+Large web deployments like Google and Twitter, and platform providers such as
+Heroku and dotCloud all run on container technology, at a scale of hundreds of
+thousands or even millions of containers running in parallel.
### How do I connect Docker containers?
-Currently the recommended way to link containers is via the link
-primitive. You can see details of how to [work with links
-here](/userguide/dockerlinks).
+Currently the recommended way to link containers is via the link primitive. You
+can see details of how to [work with links here](/userguide/dockerlinks).
-Also useful for more flexible service portability is the
-[Ambassador linking pattern](/articles/ambassador_pattern_linking/).
+Also useful for more flexible service portability is the [Ambassador linking
+pattern](/articles/ambassador_pattern_linking/).
### How do I run more than one process in a Docker container?
Any capable process supervisor such as [http://supervisord.org/](
-http://supervisord.org/), runit, s6, or daemontools can do the trick.
-Docker will start up the process management daemon which will then fork
-to run additional processes. As long as the processor manager daemon continues
-to run, the container will continue to as well. You can see a more substantial
-example [that uses supervisord here](/articles/using_supervisord/).
+http://supervisord.org/), runit, s6, or daemontools can do the trick. Docker
+will start up the process management daemon which will then fork to run
+additional processes. As long as the processor manager daemon continues to run,
+the container will continue to as well. You can see a more substantial example
+[that uses supervisord here](/articles/using_supervisord/).
### What platforms does Docker run on?
Linux:
- - Ubuntu 12.04, 13.04 et al
- - Fedora 19/20+
- - RHEL 6.5+
- - Centos 6+
- - Gentoo
- - ArchLinux
- - openSUSE 12.3+
+ - Ubuntu 12.04, 13.04 et al
+ - Fedora 19/20+
+ - RHEL 6.5+
+ - CentOS 6+
+ - Gentoo
+ - ArchLinux
+ - openSUSE 12.3+
- CRUX 3.0+
Cloud:
- - Amazon EC2
- - Google Compute Engine
+ - Amazon EC2
+ - Google Compute Engine
- Rackspace
### How do I report a security issue with Docker?
You can learn about the project's security policy
-[here](https://www.docker.com/security/) and report security issues to
-this [mailbox](mailto:security@docker.com).
+[here](https://www.docker.com/security/) and report security issues to this
+[mailbox](mailto:security@docker.com).
### Why do I need to sign my commits to Docker with the DCO?
Please read [our blog post](
-http://blog.docker.com/2014/01/docker-code-contributions-require-developer-certificate-of-origin/)
-on the introduction of the DCO.
+http://blog.docker.com/2014/01/docker-code-contributions-require-developer-certificate-of-origin/) on the introduction of the DCO.
### When building an image, should I prefer system libraries or bundled ones?
*This is a summary of a discussion on the [docker-dev mailing list](
https://groups.google.com/forum/#!topic/docker-dev/L2RBSPDu1L0).*
-Virtually all programs depend on third-party libraries. Most frequently,
-they will use dynamic linking and some kind of package dependency, so
-that when multiple programs need the same library, it is installed only once.
-
-Some programs, however, will bundle their third-party libraries, because
-they rely on very specific versions of those libraries. For instance,
-Node.js bundles OpenSSL; MongoDB bundles V8 and Boost (among others).
-
-When creating a Docker image, is it better to use the bundled libraries,
-or should you build those programs so that they use the default system
-libraries instead?
-
-The key point about system libraries is not about saving disk or memory
-space. It is about security. All major distributions handle security
-seriously, by having dedicated security teams, following up closely
-with published vulnerabilities, and disclosing advisories themselves.
-(Look at the [Debian Security Information](https://www.debian.org/security/)
-for an example of those procedures.) Upstream developers, however,
-do not always implement similar practices.
-
-Before setting up a Docker image to compile a program from source,
-if you want to use bundled libraries, you should check if the upstream
-authors provide a convenient way to announce security vulnerabilities,
-and if they update their bundled libraries in a timely manner. If they
-don't, you are exposing yourself (and the users of your image) to
-security vulnerabilities.
+Virtually all programs depend on third-party libraries. Most frequently, they
+will use dynamic linking and some kind of package dependency, so that when
+multiple programs need the same library, it is installed only once.
+
+Some programs, however, will bundle their third-party libraries, because they
+rely on very specific versions of those libraries. For instance, Node.js bundles
+OpenSSL; MongoDB bundles V8 and Boost (among others).
+
+When creating a Docker image, is it better to use the bundled libraries, or
+should you build those programs so that they use the default system libraries
+instead?
+
+The key point about system libraries is not about saving disk or memory space.
+It is about security. All major distributions handle security seriously, by
+having dedicated security teams, following up closely with published
+vulnerabilities, and disclosing advisories themselves. (Look at the [Debian
+Security Information](https://www.debian.org/security/) for an example of those
+procedures.) Upstream developers, however, do not always implement similar
+practices.
+
+Before setting up a Docker image to compile a program from source, if you want
+to use bundled libraries, you should check if the upstream authors provide a
+convenient way to announce security vulnerabilities, and if they update their
+bundled libraries in a timely manner. If they don't, you are exposing yourself
+(and the users of your image) to security vulnerabilities.
Likewise, before using packages built by others, you should check if the
channels providing those packages implement similar security best practices.
Downloading and installing an "all-in-one" .deb or .rpm sounds great at first,
-except if you have no way to figure out that it contains a copy of the
-OpenSSL library vulnerable to the [Heartbleed](http://heartbleed.com/) bug.
+except if you have no way to figure out that it contains a copy of the OpenSSL
+library vulnerable to the [Heartbleed](http://heartbleed.com/) bug.
### Why is `DEBIAN_FRONTEND=noninteractive` discouraged in Dockerfiles?
@@ -234,46 +215,49 @@ When building Docker images on Debian and Ubuntu you may have seen errors like:
unable to initialize frontend: Dialog
These errors don't stop the image from being built but inform you that the
-installation process tried to open a dialog box, but was unable to.
-Generally, these errors are safe to ignore.
+installation process tried to open a dialog box, but was unable to. Generally,
+these errors are safe to ignore.
-Some people circumvent these errors by changing the `DEBIAN_FRONTEND`
+Some people circumvent these errors by changing the `DEBIAN_FRONTEND`
environment variable inside the Dockerfile using:
ENV DEBIAN_FRONTEND=noninteractive
-This prevents the installer from opening dialog boxes during installation
-which stops the errors.
+This prevents the installer from opening dialog boxes during installation which
+stops the errors.
-While this may sound like a good idea, it *may* have side effects.
-The `DEBIAN_FRONTEND` environment variable will be inherited by all
-images and containers built from your image, effectively changing
-their behavior. People using those images will run into problems when
-installing software interactively, because installers will not show
-any dialog boxes.
+While this may sound like a good idea, it *may* have side effects. The
+`DEBIAN_FRONTEND` environment variable will be inherited by all images and
+containers built from your image, effectively changing their behavior. People
+using those images will run into problems when installing software
+interactively, because installers will not show any dialog boxes.
Because of this, and because setting `DEBIAN_FRONTEND` to `noninteractive` is
mainly a 'cosmetic' change, we *discourage* changing it.
-If you *really* need to change its setting, make sure to change it
-back to its [default value](https://www.debian.org/releases/stable/i386/ch05s03.html.en)
+If you *really* need to change its setting, make sure to change it back to its
+[default value](https://www.debian.org/releases/stable/i386/ch05s03.html.en)
afterwards.
-### Can I help by adding some questions and answers?
+### Why do I get `Connection reset by peer` when making a request to a service running in a container?
+
+Typically, this message is returned if the service is already bound to your
+localhost. As a result, requests coming to the container from outside are
+dropped. To correct this problem, change the service's configuration on your
+localhost so that the service accepts requests from all IPs. If you aren't sure
+how to do this, check the documentation for your OS.
-Definitely! You can fork [the repo](https://github.com/docker/docker) and
-edit the documentation sources.
### Where can I find more answers?
You can find more answers on:
-- [Docker user mailinglist](https://groups.google.com/d/forum/docker-user)
-- [Docker developer mailinglist](https://groups.google.com/d/forum/docker-dev)
-- [IRC, docker on freenode](irc://chat.freenode.net#docker)
-- [GitHub](https://github.com/docker/docker)
-- [Ask questions on Stackoverflow](http://stackoverflow.com/search?q=docker)
+
+- [Docker user mailinglist](https://groups.google.com/d/forum/docker-user)
+- [Docker developer mailinglist](https://groups.google.com/d/forum/docker-dev)
+- [IRC, docker on freenode](irc://chat.freenode.net#docker)
+- [GitHub](https://github.com/docker/docker)
+- [Ask questions on Stackoverflow](http://stackoverflow.com/search?q=docker)
- [Join the conversation on Twitter](http://twitter.com/docker)
-Looking for something else to read? Checkout the [User
-Guide](/userguide/).
+Looking for something else to read? Checkout the [User Guide](/userguide/).
diff --git a/docs/sources/installation.md b/docs/sources/installation.md
index 7eaabeeefe..5fa52fa978 100644
--- a/docs/sources/installation.md
+++ b/docs/sources/installation.md
@@ -23,4 +23,5 @@ techniques for installing Docker all the time.
- [Amazon EC2](amazon/)
- [Rackspace Cloud](rackspace/)
- [Google Cloud Platform](google/)
+ - [Joyent Compute Service](joyent/)
- [Binaries](binaries/)
diff --git a/docs/sources/installation/MAINTAINERS b/docs/sources/installation/MAINTAINERS
deleted file mode 100644
index aca13975fd..0000000000
--- a/docs/sources/installation/MAINTAINERS
+++ /dev/null
@@ -1,2 +0,0 @@
-google.md: Johan Euphrosine <proppy@google.com> (@proppy)
-softlayer.md: Phil Jackson <underscorephil@gmail.com> (@underscorephil)
diff --git a/docs/sources/installation/azure.md b/docs/sources/installation/azure.md
new file mode 100644
index 0000000000..a8e700fead
--- /dev/null
+++ b/docs/sources/installation/azure.md
@@ -0,0 +1,27 @@
+page_title: Installation on Microsoft Azure Platform
+page_description: Instructions for creating a Docker-ready virtual machine on Microsoft Azure cloud platform.
+page_keywords: Docker, Docker documentation, installation, azure, microsoft
+
+# Microsoft Azure
+
+
+## Creating a Docker host machine on Azure
+
+Please check out to the following detailed tutorials on [Microsoft Azure][0]
+website to find out different ways to create a Docker-ready Linux virtual
+machines on Azure:
+
+* [Docker Virtual Machine Extensions on Azure][1]
+ * [How to use the Docker VM Extension from Azure Cross-Platform Interface][2]
+ * [How to use the Docker VM Extension with the Azure Portal][3]
+* [Using Docker Machine with Azure][4]
+
+## What next?
+
+Continue with the [User Guide](/userguide/).
+
+[0]: http://azure.microsoft.com/
+[1]: http://azure.microsoft.com/en-us/documentation/articles/virtual-machines-docker-vm-extension/
+[2]: http://azure.microsoft.com/documentation/articles/virtual-machines-docker-with-xplat-cli/
+[3]: http://azure.microsoft.com/documentation/articles/virtual-machines-docker-with-portal/
+[4]: http://azure.microsoft.com/en-us/documentation/articles/virtual-machines-docker-machine/ \ No newline at end of file
diff --git a/docs/sources/installation/centos.md b/docs/sources/installation/centos.md
index 06dc8bfee8..862d508988 100644
--- a/docs/sources/installation/centos.md
+++ b/docs/sources/installation/centos.md
@@ -6,8 +6,8 @@ page_keywords: Docker, Docker documentation, requirements, linux, centos, epel,
Docker is supported on the following versions of CentOS:
-- [*CentOS 7 (64-bit)*](#installing-docker---centos-7)
-- [*CentOS 6.5 (64-bit)*](#installing-docker---centos-6.5) or later
+- [*CentOS 7 (64-bit)*](#installing-docker-centos-7)
+- [*CentOS 6.5 (64-bit)*](#installing-docker-centos-6.5) or later
These instructions are likely work for other binary compatible EL6/EL7 distributions
such as Scientific Linux, but they haven't been tested.
@@ -46,7 +46,7 @@ start or restart `firewalld` after Docker, you will have to restart the Docker d
## Installing Docker - CentOS-6.5
-For Centos-6.5, the Docker package is part of [Extra Packages
+For CentOS-6.5, the Docker package is part of [Extra Packages
for Enterprise Linux (EPEL)](https://fedoraproject.org/wiki/EPEL) repository,
a community effort to create and maintain additional packages for the RHEL distribution.
diff --git a/docs/sources/installation/debian.md b/docs/sources/installation/debian.md
index 74acd1d42b..4644a2440d 100644
--- a/docs/sources/installation/debian.md
+++ b/docs/sources/installation/debian.md
@@ -31,7 +31,7 @@ To verify that everything has worked as expected:
Which should download the `ubuntu` image, and then start `bash` in a container.
-> **Note**:
+> **Note**:
> If you want to enable memory and swap accounting see
> [this](/installation/ubuntulinux/#memory-and-swap-accounting).
@@ -48,18 +48,20 @@ which is officially supported by Docker.
### Installation
1. Install Kernel from wheezy-backports
-
+
Add the following line to your `/etc/apt/sources.list`
`deb http://http.debian.net/debian wheezy-backports main`
then install the `linux-image-amd64` package (note the use of
`-t wheezy-backports`)
-
+
$ sudo apt-get update
$ sudo apt-get install -t wheezy-backports linux-image-amd64
-2. Install Docker using the get.docker.com script:
+2. Restart your system. This is necessary for Debian to use your new kernel.
+
+3. Install Docker using the get.docker.com script:
`curl -sSL https://get.docker.com/ | sh`
@@ -78,7 +80,7 @@ run the `docker` client as a user in the `docker` group then you don't
need to add `sudo` to all the client commands. From Docker 0.9.0 you can
use the `-G` flag to specify an alternative group.
-> **Warning**:
+> **Warning**:
> The `docker` group (or the group specified with the `-G` flag) is
> `root`-equivalent; see [*Docker Daemon Attack Surface*](
> /articles/security/#docker-daemon-attack-surface) details.
diff --git a/docs/sources/installation/images/bad_host.png b/docs/sources/installation/images/bad_host.png
new file mode 100644
index 0000000000..cdc78defc5
--- /dev/null
+++ b/docs/sources/installation/images/bad_host.png
Binary files differ
diff --git a/docs/sources/installation/images/cool_view.png b/docs/sources/installation/images/cool_view.png
new file mode 100644
index 0000000000..8eebf21658
--- /dev/null
+++ b/docs/sources/installation/images/cool_view.png
Binary files differ
diff --git a/docs/sources/installation/images/good_host.png b/docs/sources/installation/images/good_host.png
new file mode 100644
index 0000000000..58b9783d3a
--- /dev/null
+++ b/docs/sources/installation/images/good_host.png
Binary files differ
diff --git a/docs/sources/installation/images/kitematic.png b/docs/sources/installation/images/kitematic.png
new file mode 100644
index 0000000000..5bb221ccf7
--- /dev/null
+++ b/docs/sources/installation/images/kitematic.png
Binary files differ
diff --git a/docs/sources/installation/images/linux_docker_host.png b/docs/sources/installation/images/linux_docker_host.png
new file mode 100644
index 0000000000..42895c2f76
--- /dev/null
+++ b/docs/sources/installation/images/linux_docker_host.png
Binary files differ
diff --git a/docs/sources/installation/images/mac_docker_host.png b/docs/sources/installation/images/mac_docker_host.png
new file mode 100644
index 0000000000..9aa71a4ebc
--- /dev/null
+++ b/docs/sources/installation/images/mac_docker_host.png
Binary files differ
diff --git a/docs/sources/installation/images/newsite_view.png b/docs/sources/installation/images/newsite_view.png
new file mode 100644
index 0000000000..27b6b1a4dd
--- /dev/null
+++ b/docs/sources/installation/images/newsite_view.png
Binary files differ
diff --git a/docs/sources/installation/images/win/_01.gif b/docs/sources/installation/images/win/_01.gif
deleted file mode 100644
index fbfc0a3028..0000000000
--- a/docs/sources/installation/images/win/_01.gif
+++ /dev/null
Binary files differ
diff --git a/docs/sources/installation/images/win/_02.gif b/docs/sources/installation/images/win/_02.gif
deleted file mode 100644
index 16d8a688ff..0000000000
--- a/docs/sources/installation/images/win/_02.gif
+++ /dev/null
Binary files differ
diff --git a/docs/sources/installation/images/win/_06.gif b/docs/sources/installation/images/win/_06.gif
deleted file mode 100644
index d935c02ae9..0000000000
--- a/docs/sources/installation/images/win/_06.gif
+++ /dev/null
Binary files differ
diff --git a/docs/sources/installation/images/win/cygwin.gif b/docs/sources/installation/images/win/cygwin.gif
deleted file mode 100644
index d00445486e..0000000000
--- a/docs/sources/installation/images/win/cygwin.gif
+++ /dev/null
Binary files differ
diff --git a/docs/sources/installation/images/win/hp_bios_vm.JPG b/docs/sources/installation/images/win/hp_bios_vm.JPG
deleted file mode 100644
index b44cabeac1..0000000000
--- a/docs/sources/installation/images/win/hp_bios_vm.JPG
+++ /dev/null
Binary files differ
diff --git a/docs/sources/installation/images/win/putty.gif b/docs/sources/installation/images/win/putty.gif
deleted file mode 100644
index e7d418d2de..0000000000
--- a/docs/sources/installation/images/win/putty.gif
+++ /dev/null
Binary files differ
diff --git a/docs/sources/installation/images/win/putty_2.gif b/docs/sources/installation/images/win/putty_2.gif
deleted file mode 100644
index 053ad231fc..0000000000
--- a/docs/sources/installation/images/win/putty_2.gif
+++ /dev/null
Binary files differ
diff --git a/docs/sources/installation/images/win/run_02_.gif b/docs/sources/installation/images/win/run_02_.gif
deleted file mode 100644
index 4243bf6186..0000000000
--- a/docs/sources/installation/images/win/run_02_.gif
+++ /dev/null
Binary files differ
diff --git a/docs/sources/installation/images/win/run_03.gif b/docs/sources/installation/images/win/run_03.gif
deleted file mode 100644
index c1f620a3c3..0000000000
--- a/docs/sources/installation/images/win/run_03.gif
+++ /dev/null
Binary files differ
diff --git a/docs/sources/installation/images/win/run_04.gif b/docs/sources/installation/images/win/run_04.gif
deleted file mode 100644
index a89f2a917b..0000000000
--- a/docs/sources/installation/images/win/run_04.gif
+++ /dev/null
Binary files differ
diff --git a/docs/sources/installation/images/win/ssh-config.gif b/docs/sources/installation/images/win/ssh-config.gif
deleted file mode 100644
index 4fd3b2b333..0000000000
--- a/docs/sources/installation/images/win/ssh-config.gif
+++ /dev/null
Binary files differ
diff --git a/docs/sources/installation/images/win/ts_go_bios.JPG b/docs/sources/installation/images/win/ts_go_bios.JPG
deleted file mode 100644
index 05f2310ad3..0000000000
--- a/docs/sources/installation/images/win/ts_go_bios.JPG
+++ /dev/null
Binary files differ
diff --git a/docs/sources/installation/images/win/ts_no_docker.JPG b/docs/sources/installation/images/win/ts_no_docker.JPG
deleted file mode 100644
index 51fa766711..0000000000
--- a/docs/sources/installation/images/win/ts_no_docker.JPG
+++ /dev/null
Binary files differ
diff --git a/docs/sources/installation/images/windows-boot2docker-cmd.png b/docs/sources/installation/images/windows-boot2docker-cmd.png
new file mode 100644
index 0000000000..09e3206ef9
--- /dev/null
+++ b/docs/sources/installation/images/windows-boot2docker-cmd.png
Binary files differ
diff --git a/docs/sources/installation/images/windows-boot2docker-powershell.png b/docs/sources/installation/images/windows-boot2docker-powershell.png
new file mode 100644
index 0000000000..b1ef896726
--- /dev/null
+++ b/docs/sources/installation/images/windows-boot2docker-powershell.png
Binary files differ
diff --git a/docs/sources/installation/images/windows-boot2docker-start.png b/docs/sources/installation/images/windows-boot2docker-start.png
index 9d598d56bf..5e3563b7d5 100644
--- a/docs/sources/installation/images/windows-boot2docker-start.png
+++ b/docs/sources/installation/images/windows-boot2docker-start.png
Binary files differ
diff --git a/docs/sources/installation/images/windows-installer.png b/docs/sources/installation/images/windows-installer.png
index ea1d3d2326..7580ed6226 100644
--- a/docs/sources/installation/images/windows-installer.png
+++ b/docs/sources/installation/images/windows-installer.png
Binary files differ
diff --git a/docs/sources/installation/joyent.md b/docs/sources/installation/joyent.md
new file mode 100644
index 0000000000..daa33b7996
--- /dev/null
+++ b/docs/sources/installation/joyent.md
@@ -0,0 +1,23 @@
+page_title: Install on Joyent Public Cloud
+page_description: Installation instructions for Docker on the Joyent Compute Service.
+page_keywords: Docker, Docker documentation, installation, joyent, Joyent Public Cloud, Joyent Compute Service, Joyent Container Service
+
+## Install on Joyent Public Cloud
+
+1. Sign in to the [Joyent customer portal](https://my.joyent.com/)
+
+2. [Create a Docker host](https://docs.joyent.com/jpc/managing-docker-containers/creating-a-docker-host).
+
+## Start and manage containers
+
+1. [Start containers in the web UI](https://docs.joyent.com/jpc/managing-docker-containers/starting-a-container)
+
+2. [Configure the Docker CLI on your laptop](https://docs.joyent.com/jpc/managing-docker-containers/access-your-jpc-docker-hosts-from-the-docker-cli) to connect to the remote host to launch and manage containers.
+
+3. SSH into the Docker host.
+
+4. Launch containers using the Docker CLI.
+
+## Where to go next
+
+Continue with the [Docker user guide](/userguide/), read Joyent's [getting started blog post](https://www.joyent.com/blog/first-steps-with-joyents-container-service), and [full documentation](https://docs.joyent.com/jpc/managing-docker-containers). \ No newline at end of file
diff --git a/docs/sources/installation/mac.md b/docs/sources/installation/mac.md
index d31cd697b6..9bf7632680 100644
--- a/docs/sources/installation/mac.md
+++ b/docs/sources/installation/mac.md
@@ -2,115 +2,326 @@ page_title: Installation on Mac OS X
page_description: Instructions for installing Docker on OS X using boot2docker.
page_keywords: Docker, Docker documentation, requirements, boot2docker, VirtualBox, SSH, Linux, OSX, OS X, Mac
-# Installing Docker on Mac OS X
+# Install Docker on Mac OS X
-> **Note:**
-> Docker is supported on Mac OS X 10.6 "Snow Leopard" or newer.
+You can install Docker using Boot2Docker to run `docker` commands at your command-line.
+Choose this installation if you are familiar with the command-line or plan to
+contribute to the Docker project on GitHub.
-Because the Docker Engine uses Linux-specific kernel features, you'll need to use a
-lightweight virtual machine (VM) to run it on OS X. You use the OS X Docker client to
-control the virtualized Docker Engine to build, run, and manage Docker containers.
+Alternatively, you may want to try <a id="inlinelink" href="https://kitematic.com/"
+target="_blank">Kitematic</a>, an application that lets you set up Docker and
+run containers using a graphical user interface (GUI).
-To make this process easier, we've built a helper application called
-[Boot2Docker](https://github.com/boot2docker/boot2docker) that installs a
-virtual machine (using VirtualBox) that's all set up to run the Docker daemon.
+<a id="graphic" href="https://kitematic.com/" target="_blank"><img
+src="/installation/images/kitematic.png" alt="Download Kitematic"></a>
-## Demonstration
-<iframe width="640" height="360" src="//www.youtube.com/embed/wQsrKX4588U?rel=0" frameborder="0" allowfullscreen></iframe>
+## Command-line Docker with Boot2Docker
-## Installation
+Because the Docker daemon uses Linux-specific kernel features, you can't run
+Docker natively in OS X. Instead, you must install the Boot2Docker application.
+The application includes a VirtualBox Virtual Machine (VM), Docker itself, and the
+Boot2Docker management tool.
-1. Download the latest release of the [Docker for OS X Installer](
- https://github.com/boot2docker/osx-installer/releases/latest) (Look for the
- green Boot2Docker-x.x.x.pkg button near the bottom of the page.)
+The Boot2Docker management tool is a lightweight Linux virtual machine made
+specifically to run the Docker daemon on Mac OS X. The VirtualBox VM runs
+completely from RAM, is a small ~24MB download, and boots in approximately 5s.
-2. Run the installer by double-clicking the downloaded package, which will install a
-VirtualBox VM, Docker itself, and the Boot2Docker management tool.
- ![](/installation/images/osx-installer.png)
+**Requirements**
-3. Locate the `Boot2Docker` app in your `Applications` folder and run it.
- Or, you can initialize Boot2Docker from the command line by running:
+Your Mac must be running OS X 10.6 "Snow Leopard" or newer to run Boot2Docker.
- $ boot2docker init
- $ boot2docker start
- $ $(boot2docker shellinit)
+### Learn the key concepts before installing
-A terminal window will open and you'll see the virtual machine starting up.
-Once you have an initialized virtual machine, you can control it with `boot2docker stop`
-and `boot2docker start`.
+In a Docker installation on Linux, your machine is both the localhost and the
+Docker host. In networking, localhost means your computer. The Docker host is
+the machine on which the containers run.
-> **Note:**
-> If you see a message in the terminal that looks something like this:
->
-> `To connect the Docker client to the Docker daemon, please set: export
-DOCKER_HOST=tcp://192.168.59.103:2375`
->
-you can safely set the environment variable as instructed.
+On a typical Linux installation, the Docker client, the Docker daemon, and any
+containers run directly on your localhost. This means you can address ports on a
+Docker container using standard localhost addressing such as `localhost:8000` or
+`0.0.0.0:8376`.
-View the
-[Boot2Docker ReadMe](https://github.com/boot2docker/boot2docker/blob/master/README.md)
-for more information.
+![Linux Architecture Diagram](/installation/images/linux_docker_host.png)
-## Upgrading
+In an OS X installation, the `docker` daemon is running inside a Linux virtual
+machine provided by Boot2Docker.
-1. Download the latest release of the [Docker for OS X Installer](
- https://github.com/boot2docker/osx-installer/releases/latest)
+![OSX Architecture Diagram](/installation/images/mac_docker_host.png)
-2. If Boot2Docker is currently running, stop it with `boot2docker stop`. Then, run
-the installer package, which will update Docker and the Boot2Docker management tool.
+In OS X, the Docker host address is the address of the Linux VM.
+When you start the `boot2docker` process, the VM is assigned an IP address. Under
+`boot2docker` ports on a container map to ports on the VM. To see this in
+practice, work through the exercises on this page.
-3. To complete the upgrade, you also need to update your existing virtual machine. Open a
-terminal window and run:
- $ boot2docker stop
- $ boot2docker download
- $ boot2docker start
+### Install Boot2Docker
-This will download an .iso image containing a fresh VM and start it up. Your upgrade is
-complete. You can test it by following the directions below.
+1. Go to the [boot2docker/osx-installer ](
+https://github.com/boot2docker/osx-installer/releases/latest) release page.
-## Running Docker
+4. Download Boot2Docker by clicking `Boot2Docker-x.x.x.pkg` in the "Downloads"
+section.
-{{ include "no-remote-sudo.md" }}
+3. Install Boot2Docker by double-clicking the package.
-From your terminal, you can test that Docker is running with our small `hello-world`
-example image:
-Start the vm (`boot2docker start`) and then run:
+ The installer places Boot2Docker in your "Applications" folder.
- $ docker run hello-world
+The installation places the `docker` and `boot2docker` binaries in your
+`/usr/local/bin` directory.
-This should download the `hello-world` image, which then creates a small
-container with an executable that prints a brief `Hello from Docker.` message.
-## Container port redirection
+## Start the Boot2Docker Application
-The latest version of `boot2docker` sets up a host-only network adaptor which provides
-access to the container's ports.
+To run a Docker container, you first start the `boot2docker` VM and then issue
+`docker` commands to create, load, and manage containers. You can launch
+`boot2docker` from your Applications folder or from the command line.
-If you run a container with an exposed port,
+> **NOTE**: Boot2Docker is designed as a development tool. You should not use
+> it in production environments.
- $ docker run --rm -i -t -p 80:80 nginx
+### From the Applications folder
-then you should be able to access that Nginx server using the IP address reported by:
+When you launch the "Boot2Docker" application from your "Applications" folder, the
+application:
- $ boot2docker ip
+* opens a terminal window
-Typically, it is 192.168.59.103:2375, but VirtualBox's DHCP implementation might change
-this address in the future.
+* creates a $HOME/.boot2docker directory
-# Further details
+* creates a VirtualBox ISO and certs
-If you are curious, the username for the boot2docker default user is `docker` and the
-password is `tcuser`.
+* starts a VirtualBox VM running the `docker` daemon
-The Boot2Docker management tool provides several additional commands for working with the
-VM and Docker:
+Once the launch completes, you can run `docker` commands. A good way to verify
+your setup succeeded is to run the `hello-world` container.
- $ ./boot2docker
- Usage: ./boot2docker [<options>]
- {help|init|up|ssh|save|down|poweroff|reset|restart|config|status|info|ip|delete|download|version} [<args>]
+ $ docker run hello-world
+ Unable to find image 'hello-world:latest' locally
+ 511136ea3c5a: Pull complete
+ 31cbccb51277: Pull complete
+ e45a5af57b00: Pull complete
+ hello-world:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security.
+ Status: Downloaded newer image for hello-world:latest
+ Hello from Docker.
+ This message shows that your installation appears to be working correctly.
-Continue with the [User Guide](/userguide/).
+ To generate this message, Docker took the following steps:
+ 1. The Docker client contacted the Docker daemon.
+ 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
+ (Assuming it was not already locally available.)
+ 3. The Docker daemon created a new container from that image which runs the
+ executable that produces the output you are currently reading.
+ 4. The Docker daemon streamed that output to the Docker client, which sent it
+ to your terminal.
-For further information or to report issues, please visit the [Boot2Docker site](http://boot2docker.io).
+ To try something more ambitious, you can run an Ubuntu container with:
+ $ docker run -it ubuntu bash
+
+ For more examples and ideas, visit:
+ http://docs.docker.com/userguide/
+
+
+A more typical way to start and stop `boot2docker` is using the command line.
+
+### From your command line
+
+Initialize and run `boot2docker` from the command line, do the following:
+
+1. Create a new Boot2Docker VM.
+
+ $ boot2docker init
+
+ This creates a new virtual machine. You only need to run this command once.
+
+2. Start the `boot2docker` VM.
+
+ $ boot2docker start
+
+3. Display the environment variables for the Docker client.
+
+ $ boot2docker shellinit
+ Writing /Users/mary/.boot2docker/certs/boot2docker-vm/ca.pem
+ Writing /Users/mary/.boot2docker/certs/boot2docker-vm/cert.pem
+ Writing /Users/mary/.boot2docker/certs/boot2docker-vm/key.pem
+ export DOCKER_HOST=tcp://192.168.59.103:2376
+ export DOCKER_CERT_PATH=/Users/mary/.boot2docker/certs/boot2docker-vm
+ export DOCKER_TLS_VERIFY=1
+
+ The specific paths and address on your machine will be different.
+
+4. To set the environment variables in your shell do the following:
+
+ $ eval "$(boot2docker shellinit)"
+
+ You can also set them manually by using the `export` commands `boot2docker`
+ returns.
+
+5. Run the `hello-world` container to verify your setup.
+
+ $ docker run hello-world
+
+
+## Basic Boot2Docker Exercises
+
+At this point, you should have `boot2docker` running and the `docker` client
+environment initialized. To verify this, run the following commands:
+
+ $ boot2docker status
+ $ docker version
+
+Work through this section to try some practical container tasks using `boot2docker` VM.
+
+### Access container ports
+
+1. Start an NGINX container on the DOCKER_HOST.
+
+ $ docker run -d -P --name web nginx
+
+ Normally, the `docker run` commands starts a container, runs it, and then
+ exits. The `-d` flag keeps the container running in the background
+ after the `docker run` command completes. The `-P` flag publishes exposed ports from the
+ container to your local host; this lets you access them from your Mac.
+
+2. Display your running container with `docker ps` command
+
+ CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
+ 5fb65ff765e9 nginx:latest "nginx -g 'daemon of 3 minutes ago Up 3 minutes 0.0.0.0:49156->443/tcp, 0.0.0.0:49157->80/tcp web
+
+ At this point, you can see `nginx` is running as a daemon.
+
+3. View just the container's ports.
+
+ $ docker port web
+ 443/tcp -> 0.0.0.0:49156
+ 80/tcp -> 0.0.0.0:49157
+
+ This tells you that the `web` container's port `80` is mapped to port
+ `49157` on your Docker host.
+
+4. Enter the `http://localhost:49157` address (`localhost` is `0.0.0.0`) in your browser:
+
+ ![Bad Address](/installation/images/bad_host.png)
+
+ This didn't work. The reason it doesn't work is your `DOCKER_HOST` address is
+ not the localhost address (0.0.0.0) but is instead the address of the
+ `boot2docker` VM.
+
+5. Get the address of the `boot2docker` VM.
+
+ $ boot2docker ip
+ 192.168.59.103
+
+6. Enter the `http://192.168.59.103:49157` address in your browser:
+
+ ![Correct Addressing](/installation/images/good_host.png)
+
+ Success!
+
+7. To stop and then remove your running `nginx` container, do the following:
+
+ $ docker stop web
+ $ docker rm web
+
+### Mount a volume on the container
+
+When you start `boot2docker`, it automatically shares your `/Users` directory
+with the VM. You can use this share point to mount directories onto your container.
+The next exercise demonstrates how to do this.
+
+1. Change to your user `$HOME` directory.
+
+ $ cd $HOME
+
+2. Make a new `site` directory.
+
+ $ mkdir site
+
+3. Change into the `site` directory.
+
+ $ cd site
+
+4. Create a new `index.html` file.
+
+ $ echo "my new site" > index.html
+
+5. Start a new `nginx` container and replace the `html` folder with your `site` directory.
+
+ $ docker run -d -P -v $HOME/site:/usr/share/nginx/html --name mysite nginx
+
+6. Get the `mysite` container's port.
+
+ $ docker port mysite
+ 80/tcp -> 0.0.0.0:49166
+ 443/tcp -> 0.0.0.0:49165
+
+7. Open the site in a browser:
+
+ ![My site page](/installation/images/newsite_view.png)
+
+8. Try adding a page to your `$HOME/site` in real time.
+
+ $ echo "This is cool" > cool.html
+
+9. Open the new page in the browser.
+
+ ![Cool page](/installation/images/cool_view.png)
+
+9. Stop and then remove your running `mysite` container.
+
+ $ docker stop mysite
+ $ docker rm mysite
+
+## Upgrade Boot2Docker
+
+If you running Boot2Docker 1.4.1 or greater, you can upgrade Boot2Docker from
+the command line. If you are running an older version, you should use the
+package provided by the `boot2docker` repository.
+
+### From the command line
+
+To upgrade from 1.4.1 or greater, you can do this:
+
+1. Open a terminal on your local machine.
+
+2. Stop the `boot2docker` application.
+
+ $ boot2docker stop
+
+3. Run the upgrade command.
+
+ $ boot2docker upgrade
+
+
+### Use the installer
+
+To upgrade any version of Boot2Docker, do this:
+
+1. Open a terminal on your local machine.
+
+2. Stop the `boot2docker` application.
+
+ $ boot2docker stop
+
+3. Go to the [boot2docker/osx-installer ](
+ https://github.com/boot2docker/osx-installer/releases/latest) release page.
+
+4. Download Boot2Docker by clicking `Boot2Docker-x.x.x.pkg` in the "Downloads"
+section.
+
+2. Install Boot2Docker by double-clicking the package.
+
+ The installer places Boot2Docker in your "Applications" folder.
+
+
+## Learning more and Acknowledgement
+
+
+Use `boot2docker help` to list the full command line reference. For more
+information about using SSH or SCP to access the Boot2Docker VM, see the README
+at [Boot2Docker repository](https://github.com/boot2docker/boot2docker).
+
+Thanks to Chris Jones whose [blog](http://goo.gl/Be6cCk) inspired me to redo
+this page.
+
+Continue with the [Docker User Guide](/userguide/). \ No newline at end of file
diff --git a/docs/sources/installation/ubuntulinux.md b/docs/sources/installation/ubuntulinux.md
index 5f36b2a587..85a37d768d 100644
--- a/docs/sources/installation/ubuntulinux.md
+++ b/docs/sources/installation/ubuntulinux.md
@@ -1,395 +1,305 @@
-page_title: Installation on Ubuntu
-page_description: Instructions for installing Docker on Ubuntu.
+page_title: Installation on Ubuntu
+page_description: Instructions for installing Docker on Ubuntu.
page_keywords: Docker, Docker documentation, requirements, virtualbox, installation, ubuntu
-# Ubuntu
+#Ubuntu
-Docker is supported on the following versions of Ubuntu:
+Docker is supported on these Ubuntu operating systems:
- - [*Ubuntu Trusty 14.04 (LTS) (64-bit)*](#ubuntu-trusty-1404-lts-64-bit)
- - [*Ubuntu Precise 12.04 (LTS) (64-bit)*](#ubuntu-precise-1204-lts-64-bit)
- - [*Ubuntu Raring 13.04 and Saucy 13.10 (64
- bit)*](#ubuntu-raring-1304-and-saucy-1310-64-bit)
+- Ubuntu Trusty 14.04 (LTS)
+- Ubuntu Precise 12.04 (LTS)
+- Ubuntu Saucy 13.10
-Please read [*Docker and UFW*](#docker-and-ufw), if you plan to use [UFW
-(Uncomplicated Firewall)](https://help.ubuntu.com/community/UFW)
+This page instructs you to install using Docker-managed release packages and
+installation mechanisms. Using these packages ensures you get the latest release
+of Docker. If you wish to install using Ubuntu-managed packages, consult your
+Ubuntu documentation.
-## Ubuntu Trusty 14.04 (LTS) (64-bit)
+##Prerequisites
-Ubuntu Trusty comes with a 3.13.0 Linux kernel, and a `docker.io` package which
-installs Docker 1.0.1 and all its prerequisites from Ubuntu's repository.
+Docker requires a 64-bit installation regardless of your Ubuntu version.
+Additionally, your kernel must be 3.10 at minimum. The latest 3.10 minor version
+or a newer maintained version are also acceptable.
-> **Note**:
-> Ubuntu (and Debian) contain a much older KDE3/GNOME2 package called ``docker``, so the
-> Ubuntu-maintained package and executable are named ``docker.io``.
+Kernels older than 3.10 lack some of the features required to run Docker
+containers. These older versions are known to have bugs which cause data loss
+and frequently panic under certain conditions.
-### Ubuntu-maintained Package Installation
+To check your current kernel version, open a terminal and use `uname -r` to display
+your kernel version:
-To install the latest Ubuntu package (this is **not** the most recent Docker release):
+ $ uname -r
+ 3.11.0-15-generic
- $ sudo apt-get update
- $ sudo apt-get install docker.io
+>**Caution** Some Ubuntu OS versions **require a version higher than 3.10** to
+>run Docker, see the prerequisites on this page that apply to your Ubuntu
+>version.
-Then, to enable tab-completion of Docker commands in BASH, either restart BASH or:
+###For Trusty 14.04
- $ source /etc/bash_completion.d/docker.io
+There are no prerequisites for this version.
-> **Note**:
-> Since the Ubuntu package is quite dated at this point, you may want to use
-> the following section to install the most recent release of Docker.
-> If you install the Docker version, you do not need to install ``docker.io`` from Ubuntu.
+###For Precise 12.04 (LTS)
-### Docker-maintained Package Installation
+For Ubuntu Precise, Docker requires the 3.13 kernel version. If your kernel
+version is older than 3.13, you must upgrade it. Refer to this table to see
+which packages are required for your environment:
-If you'd like to try the latest version of Docker:
+<style type="text/css"> .tg {border-collapse:collapse;border-spacing:0;} .tg
+td{font-size:14px;padding:10px
+5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;}
+.tg-031{width:275px;font-family:monospace} </style> <table class="tg"> <tr> <td
+class="tg-031">linux-image-generic-lts-trusty</td> <td class="tg-031e">Generic
+Linux kernel image. This kernel has AUFS built in. This is required to run
+Docker.</td> </tr> <tr> <td class="tg-031">linux-headers-generic-lts-trusty</td>
+<td class="tg-031e">Allows packages such as ZFS and VirtualBox guest additions
+which depend on them. If you didn't install the headers for your existing
+kernel, then you can skip these headers for the"trusty" kernel. If you're
+unsure, you should include this package for safety.</td> </tr> <tr> <td
+class="tg-031">xserver-xorg-lts-trusty</td> <td class="tg-031e"
+rowspan="2">Optional in non-graphical environments without Unity/Xorg.
+<i>Required</i> when running Docker on machine with a graphical environment.
-First, check that your APT system can deal with `https`
-URLs: the file `/usr/lib/apt/methods/https`
-should exist. If it doesn't, you need to install the package
-`apt-transport-https`.
+<p>To learn more about the reasons for these packages, read the installation
+instructions for backported kernels, specifically the <a
+href="https://wiki.ubuntu.com/Kernel/LTSEnablementStack" target="_blank">LTS
+Enablement Stack</a> &mdash; refer to note 5 under each version.</p></td> </tr>
+<tr> <td class="tg-031">libgl1-mesa-glx-lts-trusty</td> </tr> </table> &nbsp;
- [ -e /usr/lib/apt/methods/https ] || {
- apt-get update
- apt-get install apt-transport-https
- }
+To upgrade your kernel and install the additional packages, do the following:
-Then, add the Docker repository key to your local keychain.
+1. Open a terminal on your Ubuntu host.
- $ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
+2. Update your package manager.
-Add the Docker repository to your apt sources list, update and install
-the `lxc-docker` package.
+ $ sudo apt-get update
-*You may receive a warning that the package isn't trusted. Answer yes to
-continue installation.*
+3. Install both the required and optional packages.
- $ sudo sh -c "echo deb https://get.docker.com/ubuntu docker main\
- > /etc/apt/sources.list.d/docker.list"
- $ sudo apt-get update
- $ sudo apt-get install lxc-docker
+ $ sudo apt-get install linux-image-generic-lts-trusty
-> **Note**:
->
-> There is also a simple `curl` script available to help with this process.
->
-> $ curl -sSL https://get.docker.com/ubuntu/ | sudo sh
+ Depending on your environment, you may install more as described in the preceding table.
-To verify that everything has worked as expected:
+4. Reboot your host.
- $ sudo docker run -i -t ubuntu /bin/bash
+ $ sudo reboot
-Which should download the `ubuntu` image, and then start `bash` in a container.
+5. After your system reboots, go ahead and [install Docker](#installing-docker-on-ubuntu).
-Type `exit` to exit
-**Done!**, continue with the [User Guide](/userguide/).
+###For Saucy 13.10 (64 bit)
+Docker uses AUFS as the default storage backend. If you don't have this
+prerequisite installed, Docker's installation process adds it.
-## Ubuntu Precise 12.04 (LTS) (64-bit)
+##Installing Docker on Ubuntu
-This installation path should work at all times.
+Make sure you have intalled the prerequisites for your Ubuntu version. Then,
+install Docker using the following:
-### Dependencies
+1. Log into your Ubuntu installation as a user with `sudo` privileges.
-**Linux kernel 3.13**
+2. Verify that you have `wget` installed.
-For Ubuntu Precise, the currently recommended kernel version is 3.13.
-Ubuntu Precise installations with older kernels must be upgraded. The
-kernel you'll install when following these steps has AUFS built in.
-We also include the generic headers to enable packages that depend on them,
-like ZFS and the VirtualBox guest additions. If you didn't install the
-headers for your "precise" kernel, then you can skip these headers for the
-"trusty" kernel. If you're unsure, you should include the headers for safety.
+ $ which wget
-> **Warning**:
-> Kernels 3.8 and 3.11 are no longer supported by Canonical. Systems
-> running these kernels need to be updated using the instructions below.
-> Running Docker on these unsupported systems isn't supported either.
-> These old kernels are no longer patched for security vulnerabilities
-> and severe bugs which lead to data loss.
+ If `wget` isn't installed, install it after updating your manager:
-Please read the installation instructions for backported kernels at
-Ubuntu.org to understand why you also need to install the Xorg packages
-when running Docker on a machine with a graphical environment like Unity.
-[LTS Enablement Stack](https://wiki.ubuntu.com/Kernel/LTSEnablementStack) refer to note 5 under
-each version.
+ $ sudo apt-get update $ sudo apt-get install wget
- # install the backported kernel
- $ sudo apt-get update
- $ sudo apt-get install linux-image-generic-lts-trusty linux-headers-generic-lts-trusty
-
- # install the backported kernel and xorg if using Unity/Xorg
- $ sudo apt-get install --install-recommends linux-generic-lts-trusty xserver-xorg-lts-trusty libgl1-mesa-glx-lts-trusty
+3. Get the latest Docker package.
- # reboot
- $ sudo reboot
+ $ wget -qO- https://get.docker.com/ | sh
-### Installation
+ The system prompts you for your `sudo` password. Then, it downloads and
+ installs Docker and its dependencies.
-> **Warning**:
-> These instructions have changed for 0.6. If you are upgrading from an
-> earlier version, you will need to follow them again.
+4. Verify `docker` is installed correctly.
-Docker is available as a Debian package, which makes installation easy.
-**See the** [*Mirrors*](#mirrors) **section below if you are not
-in the United States.** Other sources of the Debian packages may be
-faster for you to install.
+ $ sudo docker run hello-world
-First, check that your APT system can deal with `https`
-URLs: the file `/usr/lib/apt/methods/https`
-should exist. If it doesn't, you need to install the package
-`apt-transport-https`.
+ This command downloads a test image and runs it in a container.
- [ -e /usr/lib/apt/methods/https ] || {
- apt-get update
- apt-get install apt-transport-https
- }
+## Optional Configurations for Docker on Ubuntu
-Then, add the Docker repository key to your local keychain.
+This section contains optional procedures for configuring your Ubuntu to work
+better with Docker.
- $ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
+* [Create a docker group](#create-a-docker-group)
+* [Adjust memory and swap accounting](#adjust-memory-and-swap-accounting)
+* [Enable UFW forwarding](#enable-ufw-forwarding)
+* [Configure a DNS server for use by Docker](#configure-a-dns-server-for-docker)
-Add the Docker repository to your apt sources list, update and install
-the `lxc-docker` package.
+### Create a docker group
-*You may receive a warning that the package isn't trusted. Answer yes to
-continue installation.*
+The `docker` daemon binds to a Unix socket instead of a TCP port. By default
+that Unix socket is owned by the user `root` and other users can access it with
+`sudo`. For this reason, `docker` daemon always runs as the `root` user.
- $ sudo sh -c "echo deb https://get.docker.com/ubuntu docker main\
- > /etc/apt/sources.list.d/docker.list"
- $ sudo apt-get update
- $ sudo apt-get install lxc-docker
+To avoid having to use `sudo` when you use the `docker` command, create a Unix
+group called `docker` and add users to it. When the `docker` daemon starts, it
+makes the ownership of the Unix socket read/writable by the `docker` group.
-> **Note**:
->
-> There is also a simple `curl` script available to help with this process.
->
-> $ curl -sSL https://get.docker.com/ubuntu/ | sudo sh
+>**Warning**: The `docker` group is equivalent to the `root` user; For details
+>on how this impacts security in your system, see [*Docker Daemon Attack
+>Surface*](/articles/security/#docker-daemon-attack-surface) for details.
-Now verify that the installation has worked by downloading the
-`ubuntu` image and launching a container.
+To create the `docker` group and add your user:
- $ sudo docker run -i -t ubuntu /bin/bash
+1. Log into Ubuntu as a user with `sudo` privileges.
-Type `exit` to exit
+ This procedure assumes you log in as the `ubuntu` user.
-**Done!**, continue with the [User Guide](/userguide/).
+3. Create the `docker` group and add your user.
-## Ubuntu Raring 13.04 and Saucy 13.10 (64 bit)
+ $ sudo usermod -aG docker ubuntu
-These instructions cover both Ubuntu Raring 13.04 and Saucy 13.10.
+3. Log out and log back in.
-### Dependencies
+ This ensures your user is running with the correct permissions.
-**Optional AUFS filesystem support**
+4. Verify your work by running `docker` without `sudo`.
-Ubuntu Raring already comes with the 3.8 kernel, so we don't need to
-install it. However, not all systems have AUFS filesystem support
-enabled. AUFS support is optional as of version 0.7, but it's still
-available as a driver and we recommend using it if you can.
+ $ docker run hello-world
-To make sure AUFS is installed, run the following commands:
- $ sudo apt-get update
- $ sudo apt-get install linux-image-extra-`uname -r`
+### Adjust memory and swap accounting
-### Installation
+When users run Docker, they may see these messages when working with an image:
-Docker is available as a Debian package, which makes installation easy.
+ WARNING: Your kernel does not support cgroup swap limit. WARNING: Your
+ kernel does not support swap limit capabilities. Limitation discarded.
-> **Warning**:
-> Please note that these instructions have changed for 0.6. If you are
-> upgrading from an earlier version, you will need to follow them again.
+To prevent these messages, enable memory and swap accounting on your system. To
+enable these on system using GNU GRUB (GNU GRand Unified Bootloader), do the
+following.
-First add the Docker repository key to your local keychain.
+1. Log into Ubuntu as a user with `sudo` privileges.
- $ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
+2. Edit the `/etc/default/grub` file.
-Add the Docker repository to your apt sources list, update and install
-the `lxc-docker` package.
+3. Set the `GRUB_CMDLINE_LINUX` value as follows:
- $ sudo sh -c "echo deb http://get.docker.com/ubuntu docker main\
- > /etc/apt/sources.list.d/docker.list"
- $ sudo apt-get update
- $ sudo apt-get install lxc-docker
+ GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
-Now verify that the installation has worked by downloading the
-`ubuntu` image and launching a container.
+4. Save and close the file.
- $ sudo docker run -i -t ubuntu /bin/bash
+5. Update GRUB.
-Type `exit` to exit
+ $ sudo update-grub
-**Done!**, now continue with the [User Guide](/userguide/).
+6. Reboot your system.
-### Upgrade
-To install the latest version of Docker, use the standard
-`apt-get` method:
+### Enable UFW forwarding
- # update your sources list
- $ sudo apt-get update
+If you use [UFW (Uncomplicated Firewall)](https://help.ubuntu.com/community/UFW)
+on the same host as you run Docker, you'll need to do additional configuration.
+Docker uses a bridge to manage container networking. By default, UFW drops all
+forwarding traffic. As a result, for Docker to run when UFW is
+enabled, you must set UFW's forwarding policy appropriately.
- # install the latest
- $ sudo apt-get install lxc-docker
+Also, UFW's default set of rules denies all incoming traffic. If you want to be able
+to reach your containers from another host then you should also allow incoming
+connections on the Docker port (default `2375`).
-## Giving non-root access
+To configure UFW and allow incoming connections on the Docker port:
-The `docker` daemon always runs as the `root` user, and since Docker
-version 0.5.2, the `docker` daemon binds to a Unix socket instead of a
-TCP port. By default that Unix socket is owned by the user `root`, and
-so, by default, you can access it with `sudo`.
+1. Log into Ubuntu as a user with `sudo` privileges.
-Starting in version 0.5.3, if you (or your Docker installer) create a
-Unix group called `docker` and add users to it, then the `docker` daemon
-will make the ownership of the Unix socket read/writable by the `docker`
-group when the daemon starts. The `docker` daemon must always run as the
-`root` user, but if you run the `docker` client as a user in the
-`docker` group then you don't need to add `sudo` to all the client
-commands. From Docker 0.9.0 you can use the `-G` flag to specify an
-alternative group.
+2. Verify that UFW is installed and enabled.
-> **Warning**:
-> The `docker` group (or the group specified with the `-G` flag) is
-> `root`-equivalent; see [*Docker Daemon Attack Surface*](
-> /articles/security/#docker-daemon-attack-surface) for details.
+ $ sudo ufw status
-**Example:**
+3. Open the `/etc/default/ufw` file for editing.
- # Add the docker group if it doesn't already exist.
- $ sudo groupadd docker
+ $ sudo nano /etc/default/ufw
- # Add the connected user "${USER}" to the docker group.
- # Change the user name to match your preferred user.
- # You may have to logout and log back in again for
- # this to take effect.
- $ sudo gpasswd -a ${USER} docker
+4. Set the `DEFAULT_FORWARD_POLICY` policy to:
- # Restart the Docker daemon.
- # If you are in Ubuntu 14.04, use docker.io instead of docker
- $ sudo service docker restart
+ DEFAULT_FORWARD_POLICY="ACCEPT"
-## Memory and Swap Accounting
+5. Save and close the file.
-If you want to enable memory and swap accounting, you must add the
-following command-line parameters to your kernel:
+6. Reload UFW to use the new setting.
- cgroup_enable=memory swapaccount=1
+ $ sudo ufw reload
-On systems using GRUB (which is the default for Ubuntu), you can add
-those parameters by editing `/etc/default/grub` and
-extending `GRUB_CMDLINE_LINUX`. Look for the
-following line:
+7. Allow incoming connections on the Docker port.
- GRUB_CMDLINE_LINUX=""
+ $ sudo ufw allow 2375/tcp
-And replace it by the following one:
+### Configure a DNS server for use by Docker
- GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
+Systems that run Ubuntu or an Ubuntu derivative on the desktop typically use
+`127.0.0.1` as the default `nameserver` in `/etc/resolv.conf` file. The
+NetworkManager also sets up `dnsmasq` to use the real DNS servers of the
+connection and sets up `nameserver 127.0.0.1` in /`etc/resolv.conf`.
-Then run `sudo update-grub`, and reboot.
+When starting containers on desktop machines with these configurations, Docker
+users see this warning:
-These parameters will help you get rid of the following warnings:
+ WARNING: Local (127.0.0.1) DNS resolver found in resolv.conf and containers
+ can't use it. Using default external servers : [8.8.8.8 8.8.4.4]
- WARNING: Your kernel does not support cgroup swap limit.
- WARNING: Your kernel does not support swap limit capabilities. Limitation discarded.
+The warning occurs because Docker containers can't use the local DNS nameserver.
+Instead, Docker defaults to using an external nameserver.
-## Troubleshooting
+To avoid this warning, you can specify a DNS server for use by Docker
+containers. Or, you can disable `dnsmasq` in NetworkManager. Though, disabiling
+`dnsmasq` might make DNS resolution slower on some networks.
-On Linux Mint, the `cgroup-lite` and `apparmor` packages are not
-installed by default. Before Docker will work correctly, you will need
-to install this via:
+To specify a DNS server for use by Docker:
- $ sudo apt-get update && sudo apt-get install cgroup-lite apparmor
+1. Log into Ubuntu as a user with `sudo` privileges.
-## Docker and UFW
+2. Open the `/etc/default/docker` file for editing.
-Docker uses a bridge to manage container networking. By default, UFW
-drops all forwarding traffic. As a result you will need to enable UFW
-forwarding:
+ $ sudo nano /etc/default/docker
- $ sudo nano /etc/default/ufw
+3. Add a setting for Docker.
- # Change:
- # DEFAULT_FORWARD_POLICY="DROP"
- # to
- DEFAULT_FORWARD_POLICY="ACCEPT"
+ DOCKER_OPTS="--dns 8.8.8.8"
-Then reload UFW:
+ Replace `8.8.8.8` with a local DNS server such as `192.168.1.1`. You can also
+ specify multiple DNS servers. Separated them with spaces, for example:
- $ sudo ufw reload
+ --dns 8.8.8.8 --dns 192.168.1.1
-UFW's default set of rules denies all incoming traffic. If you want to
-be able to reach your containers from another host then you should allow
-incoming connections on the Docker port (default 2375):
+ >**Warning**: If you're doing this on a laptop which connects to various
+ >networks, make sure to choose a public DNS server.
- $ sudo ufw allow 2375/tcp
+4. Save and close the file.
-## Docker and local DNS server warnings
+5. Restart the Docker daemon.
-Systems which are running Ubuntu or an Ubuntu derivative on the desktop
-will use 127.0.0.1 as the default nameserver in /etc/resolv.conf.
-NetworkManager sets up dnsmasq to use the real DNS servers of the
-connection and sets up nameserver 127.0.0.1 in /etc/resolv.conf.
+ $ sudo restart docker
-When starting containers on these desktop machines, users will see a
-warning:
- WARNING: Local (127.0.0.1) DNS resolver found in resolv.conf and containers can't use it. Using default external servers : [8.8.8.8 8.8.4.4]
+&nbsp;
+&nbsp;
-This warning is shown because the containers can't use the local DNS
-nameserver and Docker will default to using an external nameserver.
+**Or, as an alternative to the previous procedure,** disable `dnsmasq` in
+NetworkManager (this might slow your network).
-This can be worked around by specifying a DNS server to be used by the
-Docker daemon for the containers:
+1. Open the `/etc/default/docker` file for editing.
- $ sudo nano /etc/default/docker
- ---
- # Add:
- DOCKER_OPTS="--dns 8.8.8.8"
- # 8.8.8.8 could be replaced with a local DNS server, such as 192.168.1.1
- # multiple DNS servers can be specified: --dns 8.8.8.8 --dns 192.168.1.1
+ $ sudo nano /etc/NetworkManager/NetworkManager.conf
-The Docker daemon has to be restarted:
+2. Comment out the `dns=dsnmasq` line:
- $ sudo restart docker
+ dns=dnsmasq
-> **Warning**:
-> If you're doing this on a laptop which connects to various networks,
-> make sure to choose a public DNS server.
+3. Save and close the file.
-An alternative solution involves disabling dnsmasq in NetworkManager by
-following these steps:
+4. Restart both the NetworkManager and Docker.
- $ sudo nano /etc/NetworkManager/NetworkManager.conf
- ----
- # Change:
- dns=dnsmasq
- # to
- #dns=dnsmasq
+ $ sudo restart network-manager $ sudo restart docker
-NetworkManager and Docker need to be restarted afterwards:
- $ sudo restart network-manager
- $ sudo restart docker
+## Upgrade Docker
-> **Warning**: This might make DNS resolution slower on some networks.
+To install the latest version of Docker, use the standard `-N` flag with `wget`:
-## Mirrors
+ $ wget -N https://get.docker.com/ | sh
-You should `ping get.docker.com` and compare the
-latency to the following mirrors, and pick whichever one is best for
-you.
-
-### Yandex
-
-[Yandex](http://yandex.ru/) in Russia is mirroring the Docker Debian
-packages, updating every 6 hours.
-Substitute `http://mirror.yandex.ru/mirrors/docker/` for
-`http://get.docker.com/ubuntu` in the instructions above.
-For example:
-
- $ sudo sh -c "echo deb http://mirror.yandex.ru/mirrors/docker/ docker main\
- > /etc/apt/sources.list.d/docker.list"
- $ sudo apt-get update
- $ sudo apt-get install lxc-docker
diff --git a/docs/sources/installation/windows.md b/docs/sources/installation/windows.md
index 26b2a42a45..95f55afebd 100644
--- a/docs/sources/installation/windows.md
+++ b/docs/sources/installation/windows.md
@@ -8,85 +8,116 @@ page_keywords: Docker, Docker documentation, Windows, requirements, virtualbox,
> Your processor needs to support hardware virtualization.
The Docker Engine uses Linux-specific kernel features, so to run it on Windows
-we need to use a lightweight virtual machine (vm). You use the Windows Docker client to
-control the virtualized Docker Engine to build, run, and manage Docker containers.
+we need to use a lightweight virtual machine (VM). You use the **Windows Docker
+Client** to control the virtualized Docker Engine to build, run, and manage
+Docker containers.
To make this process easier, we've designed a helper application called
-[Boot2Docker](https://github.com/boot2docker/boot2docker) that installs the
-virtual machine and runs the Docker daemon.
+[Boot2Docker](https://github.com/boot2docker/boot2docker) creates a Linux virtual
+machine on Windows to run Docker on a Linux operating system.
+
+Although you will be using Windows Docker client, the docker engine hosting the
+containers will still be running on Linux. Until the Docker engine for Windows
+is developed, you can launch only Linux containers from your Windows machine.
## Demonstration
-<iframe width="640" height="480" src="//www.youtube.com/embed/oSHN8_uiZd4?rel=0" frameborder="0" allowfullscreen></iframe>
+<iframe width="640" height="480" src="//www.youtube.com/embed/TjMU3bDX4vo?rel=0" frameborder="0" allowfullscreen></iframe>
## Installation
-1. Download the latest release of the [Docker for Windows Installer](https://github.com/boot2docker/windows-installer/releases/latest)
-2. Run the installer, which will install VirtualBox, MSYS-git, the boot2docker Linux ISO,
-and the Boot2Docker management tool.
+1. Download the latest release of the
+ [Docker for Windows Installer](https://github.com/boot2docker/windows-installer/releases/latest).
+2. Run the installer, which will install Docker Client or Windows, VirtualBox,
+ Git for Windows (MSYS-git), the boot2docker Linux ISO, and the Boot2Docker
+ management tool.
![](/installation/images/windows-installer.png)
-3. Run the `Boot2Docker Start` shell script from your Desktop or Program Files > Boot2Docker for Windows.
+3. Run the **Boot2Docker Start** shortcut from your Desktop or “Program Files →
+ Boot2Docker for Windowsâ€.
The Start script will ask you to enter an ssh key passphrase - the simplest
(but least secure) is to just hit [Enter].
- ![](/installation/images/windows-boot2docker-start.png)
+4. The **Boot2Docker Start** will start a unix shell already configured to manage
+ Docker running inside the virtual machine. Run `docker version` to see
+ if it is working correctly:
- The `Boot2Docker Start` script will connect you to a shell session in the virtual
- machine. If needed, it will initialize a new VM and start it.
+![](/installation/images/windows-boot2docker-start.png)
-## Upgrading
+## Running Docker
-1. Download the latest release of the [Docker for Windows Installer](
- https://github.com/boot2docker/windows-installer/releases/latest)
+{{ include "no-remote-sudo.md" }}
-2. Run the installer, which will update the Boot2Docker management tool.
+**Boot2Docker Start** will automatically start a shell with environment variables
+correctly set so you can start using Docker right away:
-3. To upgrade your existing virtual machine, open a terminal and run:
+Let's try the `hello-world` example image. Run
- boot2docker stop
- boot2docker download
- boot2docker start
+ $ docker run hello-world
-## Running Docker
+This should download the very small `hello-world` image and print a
+`Hello from Docker.` message.
-{{ include "no-remote-sudo.md" }}
+## Using docker from Windows Command Line Prompt (cmd.exe)
-Boot2Docker will log you in automatically so you can start using Docker right away.
+Launch a Windows Command Line Prompt (cmd.exe).
-Let's try the `hello-world` example image. Run
+Boot2Docker command requires `ssh.exe` to be in the PATH, therefore we need to
+include `bin` folder of the Git installation (which has ssh.exe) to the `%PATH%`
+environment variable by running:
- $ docker run hello-world
+ set PATH=%PATH%;"c:\Program Files (x86)\Git\bin"
-This should download the very small `hello-world` image and print a `Hello from Docker.` message.
+and then we can run the `boot2docker start` command to start the Boot2Docker VM.
+(Run `boot2docker init` command if you get an error saying machine does not
+exist.) Then copy the instructions for cmd.exe to set the environment variables
+to your console window and you are ready to run docker commands such as
+`docker ps`:
-## Login with PUTTY instead of using the CMD
+![](/installation/images/windows-boot2docker-cmd.png)
-Boot2Docker generates and uses the public/private key pair in your `%HOMEPATH%\.ssh`
-directory so to log in you need to use the private key from this same directory.
+## Using docker from PowerShell
-The private key needs to be converted into the format PuTTY uses.
+Launch a PowerShell window, then you need to add `ssh.exe` to your PATH:
-You can do this with
-[puttygen](http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html):
+ $Env:Path = "${Env:Path};c:\Program Files (x86)\Git\bin"
-- Open `puttygen.exe` and load ("File"->"Load" menu) the private key from
- `%HOMEPATH%\.ssh\id_boot2docker`
-- then click: "Save Private Key".
-- Then use the saved file to login with PuTTY using `docker@127.0.0.1:2022`.
+and after running `boot2docker start` command it will print PowerShell commands
+to set the environment variables to connect Docker running inside VM. Run these
+commands and you are ready to run docker commands such as `docker ps`:
+
+![](/installation/images/windows-boot2docker-powershell.png)
+
+> NOTE: You can alternatively run `boot2docker shellinit | Invoke-Expression`
+> command to set the environment variables instead of copying and pasting on
+> PowerShell.
# Further Details
The Boot2Docker management tool provides several commands:
- $ ./boot2docker
- Usage: ./boot2docker [<options>] {help|init|up|ssh|save|down|poweroff|reset|restart|config|status|info|ip|delete|download|version} [<args>]
+ $ boot2docker
+ Usage: boot2docker.exe [<options>] {help|init|up|ssh|save|down|poweroff|reset|restart|config|status|info|ip|shellinit|delete|download|upgrade|version} [<args>]
+## Upgrading
+
+1. Download the latest release of the [Docker for Windows Installer](
+ https://github.com/boot2docker/windows-installer/releases/latest)
+
+2. Run the installer, which will update the Boot2Docker management tool.
+
+3. To upgrade your existing virtual machine, open a terminal and run:
+
+ boot2docker stop
+ boot2docker download
+ boot2docker start
## Container port redirection
-If you are curious, the username for the boot2docker default user is `docker` and the password is `tcuser`.
+If you are curious, the username for the boot2docker default user is `docker`
+and the password is `tcuser`.
-The latest version of `boot2docker` sets up a host only network adaptor which provides access to the container's ports.
+The latest version of `boot2docker` sets up a host only network adaptor which
+provides access to the container's ports.
If you run a container with an exposed port:
@@ -101,3 +132,25 @@ Typically, it is 192.168.59.103, but it could get changed by Virtualbox's DHCP
implementation.
For further information or to report issues, please see the [Boot2Docker site](http://boot2docker.io)
+
+## Login with PUTTY instead of using the CMD
+
+Boot2Docker generates and uses the public/private key pair in your `%USERPROFILE%\.ssh`
+directory so to log in you need to use the private key from this same directory.
+
+The private key needs to be converted into the format PuTTY uses.
+
+You can do this with
+[puttygen](http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html):
+
+- Open `puttygen.exe` and load ("File"->"Load" menu) the private key from
+ `%USERPROFILE%\.ssh\id_boot2docker`
+- then click: "Save Private Key".
+- Then use the saved file to login with PuTTY using `docker@127.0.0.1:2022`.
+
+## References
+
+If you have Docker hosts running and if you don't wish to do a
+Boot2Docker installation, you can install the docker.exe using
+unofficial Windows package manager Chocolately. For information
+on how to do this, see [Docker package on Chocolatey](http://chocolatey.org/packages/docker).
diff --git a/docs/sources/introduction/understanding-docker.md b/docs/sources/introduction/understanding-docker.md
index c561459e67..9c9995972f 100644
--- a/docs/sources/introduction/understanding-docker.md
+++ b/docs/sources/introduction/understanding-docker.md
@@ -72,7 +72,7 @@ Docker has two major components:
platform for sharing and managing Docker containers.
-**Note:** Docker is licensed under the open source Apache 2.0 license.
+> **Note:** Docker is licensed under the open source Apache 2.0 license.
## What is Docker's architecture?
Docker uses a client-server architecture. The Docker *client* talks to the
diff --git a/docs/sources/project.md b/docs/sources/project.md
new file mode 100644
index 0000000000..fc1fe18ed3
--- /dev/null
+++ b/docs/sources/project.md
@@ -0,0 +1,19 @@
+# Project
+
+## Contents:
+
+-[README first](who-written-for.md)
+-[Get the required software](software-required.md)
+-[Configure Git for contributing](set-up-git.md)
+-[Work with a development container](set-up-dev-env.md)
+-[Run tests and test documentation](test-and-docs.md)
+-[Understand contribution workflow](make-a-contribution.md)
+-[Find an issue](find-an-issue.md)
+-[Work on an issue](work-issue.md)
+-[Create a pull request](create-pr.md)
+-[Participate in the PR Review](review-pr.md)
+-[Advanced contributing](advanced-contributing.md)
+-[Where to get help](get-help.md)
+-[Coding style guide](coding-style.md)
+-[Documentation style guide](doc-style.md)
+
diff --git a/docs/sources/project/advanced-contributing.md b/docs/sources/project/advanced-contributing.md
new file mode 100644
index 0000000000..df5756d9d7
--- /dev/null
+++ b/docs/sources/project/advanced-contributing.md
@@ -0,0 +1,139 @@
+page_title: Advanced contributing
+page_description: Explains workflows for refactor and design proposals
+page_keywords: contribute, project, design, refactor, proposal
+
+# Advanced contributing
+
+In this section, you learn about the more advanced contributions you can make.
+They are advanced because they have a more involved workflow or require greater
+programming experience. Don't be scared off though, if you like to stretch and
+challenge yourself, this is the place for you.
+
+This section gives generalized instructions for advanced contributions. You'll
+read about the workflow but there are not specific descriptions of commands.
+Your goal should be to understand the processes described.
+
+At this point, you should have read and worked through the earlier parts of
+the project contributor guide. You should also have
+<a href="../make-a-contribution/" target="_blank"> made at least one project contribution</a>.
+
+## Refactor or cleanup proposal
+
+A refactor or cleanup proposal changes Docker's internal structure without
+altering the external behavior. To make this type of proposal:
+
+1. Fork `docker/docker`.
+
+2. Make your changes in a feature branch.
+
+3. Sync and rebase with `master` as you work.
+
+3. Run the full test suite.
+
+4. Submit your code through a pull request (PR).
+
+ The PR's title should have the format:
+
+ **Cleanup:** _short title_
+
+ If your changes required logic changes, note that in your request.
+
+5. Work through Docker's review process until merge.
+
+
+## Design proposal
+
+A design proposal solves a problem or adds a feature to the Docker software.
+The process for submitting design proposals requires two pull requests, one
+for the design and one for the implementation.
+
+![Simple process](/project/images/proposal.png)
+
+The important thing to notice is that both the design pull request and the
+implementation pull request go through a review. In other words, there is
+considerable time commitment in a design proposal; so, you might want to pair
+with someone on design work.
+
+The following provides greater detail on the process:
+
+1. Come up with an idea.
+
+ Ideas usually come from limitations users feel working with a product. So,
+ take some time to really use Docker. Try it on different platforms; explore
+ how it works with different web applications. Go to some community events
+ and find out what other users want.
+
+2. Review existing issues and proposals to make sure no other user is proposing a similar idea.
+
+ The design proposals are <a
+ href="https://github.com/docker/docker/pulls?q=is%3Aopen+is%3Apr+label%
+ 3AProposal" target="_blank">all online in our GitHub pull requests</a>.
+
+3. Talk to the community about your idea.
+
+ We have lots of <a href="../get-help/" target="_blank">community forums</a>
+ where you can get feedback on your idea. Float your idea in a forum or two
+ to get some commentary going on it.
+
+4. Fork `docker/docker` and clone the repo to your local host.
+
+5. Create a new Markdown file in the area you wish to change.
+
+ For example, if you want to redesign our daemon create a new file under the
+ `daemon/` folder.
+
+6. Name the file descriptively, for example `redesign-daemon-proposal.md`.
+
+7. Write a proposal for your change into the file.
+
+ This is a Markdown file that describes your idea. Your proposal
+ should include information like:
+
+ * Why is this changed needed or what are the use cases?
+ * What are the requirements this change should meet?
+ * What are some ways to design/implement this feature?
+ * Which design/implementation do you think is best and why?
+ * What are the risks or limitations of your proposal?
+
+ This is your chance to convince people your idea is sound.
+
+8. Submit your proposal in a pull request to `docker/docker`.
+
+ The title should have the format:
+
+ **Proposal:** _short title_
+
+ The body of the pull request should include a brief summary of your change
+ and then say something like "_See the file for a complete description_".
+
+9. Refine your proposal through review.
+
+ The maintainers and the community review your proposal. You'll need to
+ answer questions and sometimes explain or defend your approach. This is
+ chance for everyone to both teach and learn.
+
+10. Pull request accepted.
+
+ Your request may also be rejected. Not every idea is a good fit for Docker.
+ Let's assume though your proposal succeeded.
+
+11. Implement your idea.
+
+ Implementation uses all the standard practices of any contribution.
+
+ * fork `docker/docker`
+ * create a feature branch
+ * sync frequently back to master
+ * test as you go and full test before a PR
+
+ If you run into issues, the community is there to help.
+
+12. When you have a complete implementation, submit a pull request back to `docker/docker`.
+
+13. Review and iterate on your code.
+
+ If you are making a large code change, you can expect greater scrutiny
+ during this phase.
+
+14. Acceptance and merge!
+
diff --git a/docs/sources/project/coding-style.md b/docs/sources/project/coding-style.md
new file mode 100644
index 0000000000..e5b6f5fe9c
--- /dev/null
+++ b/docs/sources/project/coding-style.md
@@ -0,0 +1,93 @@
+page_title: Coding Style Checklist
+page_description: List of guidelines for coding Docker contributions
+page_keywords: change, commit, squash, request, pull request, test, unit test, integration tests, Go, gofmt, LGTM
+
+# Coding Style Checklist
+
+This checklist summarizes the material you experienced working through [make a
+code contribution](/project/make-a-contribution) and [advanced
+contributing](/project/advanced-contributing). The checklist applies to code
+that is program code or code that is documentation code.
+
+## Change and commit code
+
+* Fork the `docker/docker` repository.
+
+* Make changes on your fork in a feature branch. Name your branch `XXXX-something`
+ where `XXXX` is the issue number you are working on.
+
+* Run `gofmt -s -w file.go` on each changed file before
+ committing your changes. Most editors have plug-ins that do this automatically.
+
+* Update the documentation when creating or modifying features.
+
+* Commits that fix or close an issue should reference them in the commit message
+ `Closes #XXXX` or `Fixes #XXXX`. Mentions help by automatically closing the
+ issue on a merge.
+
+* After every commit, run the test suite and ensure it is passing.
+
+* Sync and rebase frequently as you code to keep up with `docker` master.
+
+* Set your `git` signature and make sure you sign each commit.
+
+* Do not add yourself to the `AUTHORS` file. This file is autogenerated from the
+ Git history.
+
+## Tests and testing
+
+* Submit unit tests for your changes.
+
+* Make use of the builtin Go test framework built.
+
+* Use existing Docker test files (`name_test.go`) for inspiration.
+
+* Run <a href="../test-and-docs" target="_blank">the full test suite</a> on your
+ branch before submitting a pull request.
+
+* Run `make docs` to build the documentation and then check it locally.
+
+* Use an <a href="http://www.hemingwayapp.com" target="_blank">online grammar
+ checker</a> or similar to test you documentation changes for clarity,
+ concision, and correctness.
+
+## Pull requests
+
+* Sync and cleanly rebase on top of Docker's `master` without multiple branches
+ mixed into the PR.
+
+* Before the pull request, squash your commits into logical units of work using
+ `git rebase -i` and `git push -f`.
+
+* Include documentation changes in the same commit so that a revert would
+ remove all traces of the feature or fix.
+
+* Reference each issue in your pull request description (`#XXXX`)
+
+## Respond to pull requests reviews
+
+* Docker maintainers use LGTM (**l**ooks-**g**ood-**t**o-**m**e) in PR comments
+ to indicate acceptance.
+
+* Code review comments may be added to your pull request. Discuss, then make
+ the suggested modifications and push additional commits to your feature
+ branch.
+
+* Incorporate changes on your feature branch and push to your fork. This
+ automatically updates your open pull request.
+
+* Post a comment after pushing to alert reviewers to PR changes; pushing a
+ change does not send notifications.
+
+* A change requires LGTMs from an absolute majority maintainers of an
+ affected component. For example, if you change `docs/` and `registry/` code,
+ an absolute majority of the `docs/` and the `registry/` maintainers must
+ approve your PR.
+
+## Merges after pull requests
+
+* After a merge, [a master build](https://master.dockerproject.com/) is
+ available almost immediately.
+
+* If you made a documentation change, you can see it at
+ [docs.master.dockerproject.com](http://docs.master.dockerproject.com/).
diff --git a/docs/sources/project/create-pr.md b/docs/sources/project/create-pr.md
new file mode 100644
index 0000000000..197aee849d
--- /dev/null
+++ b/docs/sources/project/create-pr.md
@@ -0,0 +1,127 @@
+page_title: Create a pull request (PR)
+page_description: Basic workflow for Docker contributions
+page_keywords: contribute, pull request, review, workflow, beginner, squash, commit
+
+# Create a pull request (PR)
+
+A pull request (PR) sends your changes to the Docker maintainers for review. You
+create a pull request on GitHub. A pull request "pulls" changes from your forked
+repository into the `docker/docker` repository.
+
+You can see <a href="https://github.com/docker/docker/pulls" target="_blank">the
+list of active pull requests to Docker</a> on GitHub.
+
+## Check Your Work
+
+Before you create a pull request, check your work.
+
+1. In a terminal window, go to the root of your `docker-fork` repository.
+
+ $ cd ~/repos/docker-fork
+
+2. Checkout your feature branch.
+
+ $ git checkout 11038-fix-rhel-link
+ Already on '11038-fix-rhel-link'
+
+3. Run the full test suite on your branch.
+
+ $ make test
+
+ All the tests should pass. If they don't, find out why and correct the
+ situation.
+
+4. Optionally, if modified the documentation, build the documentation:
+
+ $ make docs
+
+5. Commit and push any changes that result from your checks.
+
+## Rebase your branch
+
+Always rebase and squash your commits before making a pull request.
+
+1. Fetch any of the last minute changes from `docker/docker`.
+
+ $ git fetch upstream master
+ From github.com:docker/docker
+ * branch master -> FETCH_HEAD
+
+3. Start an interactive rebase.
+
+ $ git rebase -i upstream/master
+
+4. Rebase opens an editor with a list of commits.
+
+ pick 1a79f55 Tweak some of the other text for grammar
+ pick 53e4983 Fix a link
+ pick 3ce07bb Add a new line about RHEL
+
+ If you run into trouble, `git --rebase abort` removes any changes and gets
+ you back to where you started.
+
+4. Squash the `pick` keyword with `squash` on all but the first commit.
+
+ pick 1a79f55 Tweak some of the other text for grammar
+ squash 53e4983 Fix a link
+ squash 3ce07bb Add a new line about RHEL
+
+ After closing the file, `git` opens your editor again to edit the commit
+ message.
+
+5. Edit and save your commit message.
+
+ `git commit -s`
+
+ Make sure your message includes <a href="./set-up-git" target="_blank>your signature</a>.
+
+8. Push any changes to your fork on GitHub.
+
+ $ git push origin 11038-fix-rhel-link
+
+## Create a PR on GitHub
+
+You create and manage PRs on GitHub:
+
+1. Open your browser to your fork on GitHub.
+
+ You should see the latest activity from your branch.
+
+ ![Latest commits](/project/images/latest_commits.png)
+
+
+2. Click "Compare & pull request."
+
+ The system displays the pull request dialog.
+
+ ![PR dialog](/project/images/to_from_pr.png)
+
+ The pull request compares your changes to the `master` branch on the
+ `docker/docker` repository.
+
+3. Edit the dialog's description and add a reference to the issue you are fixing.
+
+ GitHub helps you out by searching for the issue as you type.
+
+ ![Fixes issue](/project/images/fixes_num.png)
+
+4. Scroll down and verify the PR contains the commits and changes you expect.
+
+ For example, is the file count correct? Are the changes in the files what
+ you expect.
+
+ ![Commits](/project/images/commits_expected.png)
+
+5. Press "Create pull request".
+
+ The system creates the request and opens it for you in the `docker/docker`
+ repository.
+
+ ![Pull request made](/project/images/pull_request_made.png)
+
+
+## Where to go next
+
+Congratulations, you've created your first pull request to Docker. The next
+step is for you learn how to [participate in your PR's
+review](/project/review-pr/). \ No newline at end of file
diff --git a/docs/sources/contributing/docs_style-guide.md b/docs/sources/project/doc-style.md
index 6ff3dfd1cf..20e4a9f10c 100644
--- a/docs/sources/contributing/docs_style-guide.md
+++ b/docs/sources/project/doc-style.md
@@ -214,7 +214,7 @@ exactly what they see in their shell:
* Indent shell examples by 4 spaces so they get rendered as code blocks.
* Start typed commands with `$ ` (dollar space), so that they are easily
-differentiated from program output.
+ differentiated from program output.
* Program output has no prefix.
* Comments begin with # (hash space).
* In-container shell commands, begin with `$$ ` (dollar dollar space).
@@ -232,7 +232,7 @@ following:
* Point out potential issues or questions
* Ask for help from experts in the company or the community
* Encourage feedback from core developers and others involved in creating the
-software being documented.
+ software being documented.
Writing a PR that is singular in focus and has clear objectives will encourage
all of the above. Done correctly, the process allows reviewers (maintainers and
diff --git a/docs/sources/project/find-an-issue.md b/docs/sources/project/find-an-issue.md
new file mode 100644
index 0000000000..0a36c8833a
--- /dev/null
+++ b/docs/sources/project/find-an-issue.md
@@ -0,0 +1,240 @@
+page_title: Make a project contribution
+page_description: Basic workflow for Docker contributions
+page_keywords: contribute, pull request, review, workflow, beginner, expert, squash, commit
+
+<style type="text/css">
+
+/* GitHub label styles */
+.gh-label {
+ display: inline-block;
+ padding: 3px 4px;
+ font-size: 12px;
+ font-weight: bold;
+ line-height: 1;
+ color: #fff;
+ border-radius: 2px;
+ box-shadow: inset 0 -1px 0 rgba(0,0,0,0.12);
+}
+
+/* Experience */
+.gh-label.beginner { background-color: #B5E0B5; color: #333333; }
+.gh-label.expert { background-color: #599898; color: #ffffff; }
+.gh-label.master { background-color: #306481; color: #ffffff; }
+.gh-label.novice { background-color: #D6F2AC; color: #333333; }
+.gh-label.proficient { background-color: #8DC7A9; color: #333333; }
+
+/* Kind */
+.gh-label.bug { background-color: #FF9DA4; color: #333333; }
+.gh-label.cleanup { background-color: #FFB7B3; color: #333333; }
+.gh-label.content { background-color: #CDD3C2; color: #333333; }
+.gh-label.feature { background-color: #B7BEB7; color: #333333; }
+.gh-label.graphics { background-color: #E1EFCB; color: #333333; }
+.gh-label.improvement { background-color: #EBD2BB; color: #333333; }
+.gh-label.proposal { background-color: #FFD9C0; color: #333333; }
+.gh-label.question { background-color: #EEF1D1; color: #333333; }
+.gh-label.usecase { background-color: #F0E4C2; color: #333333; }
+.gh-label.writing { background-color: #B5E9D5; color: #333333; }
+
+
+</style>
+
+
+# Find and claim an issue
+
+On this page, you choose what you want to work on. As a contributor you can work
+on whatever you want. If you are new to contributing, you should start by
+working with our known issues.
+
+## Understand the issue types
+
+An existing issue is something reported by a Docker user. As issues come in,
+our maintainers triage them. Triage is its own topic. For now, it is important
+for you to know that triage includes ranking issues according to difficulty.
+
+Triaged issues have one of these labels:
+
+<table class="tg">
+ <tr>
+ <td class="tg-031e">Level</td>
+ <td class="tg-031e">Experience level guideline</td>
+ </tr>
+ <tr>
+ <td class="tg-031e"><strong class="gh-label beginner">exp/beginner</strong></td>
+ <td class="tg-031e">You have made less than 10 contributions in your life time to any open source project.</td>
+ </tr>
+ <tr>
+ <td class="tg-031e"><strong class="gh-label novice">exp/novice</strong></td>
+ <td class="tg-031e">You have made more than 10 contributions to an open source project or at least 5 contributions to Docker. </td>
+ </tr>
+ <tr>
+ <td class="tg-031e"><strong class="gh-label proficient">exp/proficient</strong></td>
+ <td class="tg-031e">You have made more than 5 contributions to Docker which amount to at least 200 code lines or 1000 documentation lines. </td>
+ </tr>
+ <tr>
+ <td class="tg-031e"><strong class="gh-label expert">exp/expert</strong></td>
+ <td class="tg-031e">You have made less than 20 commits to Docker which amount to 500-1000 code lines or 1000-3000 documentation lines. </td>
+ </tr>
+ <tr>
+ <td class="tg-031e"><strong class="gh-label master">exp/master</strong></td>
+ <td class="tg-031e">You have made more than 20 commits to Docker and greater than 1000 code lines or 3000 documentation lines.</td>
+ </tr>
+</table>
+
+As the table states, these labels are meant as guidelines. You might have
+written a whole plugin for Docker in a personal project and never contributed to
+Docker. With that kind of experience, you could take on an <strong
+class="gh-label expert">exp/expert</strong> or <strong class="gh-label
+master">exp/master</strong> level task.
+
+## Claim a beginner or novice issue
+
+In this section, you find and claim an open documentation lines issue.
+
+
+1. Go to the `docker/docker` <a
+ href="https://github.com/docker/docker" target="_blank">repository</a>.
+
+2. Click on the "Issues" link.
+
+ A list of the open issues appears.
+
+ ![Open issues](/project/images/issue_list.png)
+
+3. Look for the <strong class="gh-label beginner">exp/beginner</strong> items on the list.
+
+4. Click on the "labels" dropdown and select <strong class="gh-label beginner">exp/beginner</strong>.
+
+ The system filters to show only open <strong class="gh-label beginner">exp/beginner</strong> issues.
+
+5. Open an issue that interests you.
+
+ The comments on the issues can tell you both the problem and the potential
+ solution.
+
+6. Make sure that no other user has chosen to work on the issue.
+
+ We don't allow external contributors to assign issues to themselves. So, you
+ need to read the comments to find if a user claimed the issue by leaving a
+ `#dibs` comment on the issue.
+
+7. When you find an open issue that both interests you and is unclaimed, add a
+`#dibs` comment.
+
+ ![Easy issue](/project/images/easy_issue.png)
+
+ This example uses issue 11038. Your issue # will be different depending on
+ what you claimed. After a moment, Gordon the Docker bot, changes the issue
+ status to claimed.
+
+8. Make a note of the issue number; you'll need it later.
+
+## Sync your fork and create a new branch
+
+If you have followed along in this guide, you forked the `docker/docker`
+repository. Maybe that was an hour ago or a few days ago. In any case, before
+you start working on your issue, sync your repository with the upstream
+`docker/docker` master. Syncing ensures your repository has the latest
+changes.
+
+To sync your repository:
+
+1. Open a terminal on your local host.
+
+2. Change directory to the `docker-fork` root.
+
+ $ cd ~/repos/docker-fork
+
+3. Checkout the master branch.
+
+ $ git checkout master
+ Switched to branch 'master'
+ Your branch is up-to-date with 'origin/master'.
+
+ Recall that `origin/master` is a branch on your remote GitHub repository.
+
+4. Make sure you have the upstream remote `docker/docker` by listing them.
+
+ $ git remote -v
+ origin https://github.com/moxiegirl/docker.git (fetch)
+ origin https://github.com/moxiegirl/docker.git (push)
+ upstream https://github.com/docker/docker.git (fetch)
+ upstream https://github.com/docker/docker.git (
+
+ If the `upstream` is missing, add it.
+
+ $ git remote add upstream https://github.com/docker/docker.git
+
+5. Fetch all the changes from the `upstream/master` branch.
+
+ $ git fetch upstream/master
+ remote: Counting objects: 141, done.
+ remote: Compressing objects: 100% (29/29), done.
+ remote: Total 141 (delta 52), reused 46 (delta 46), pack-reused 66
+ Receiving objects: 100% (141/141), 112.43 KiB | 0 bytes/s, done.
+ Resolving deltas: 100% (79/79), done.
+ From github.com:docker/docker
+ 9ffdf1e..01d09e4 docs -> upstream/docs
+ 05ba127..ac2521b master -> upstream/master
+
+ This command says get all the changes from the `master` branch belonging to
+ the `upstream` remote.
+
+7. Rebase your local master with the `upstream/master`.
+
+ $ git rebase upstream/master
+ First, rewinding head to replay your work on top of it...
+ Fast-forwarded master to upstream/master.
+
+ This command writes all the commits from the upstream branch into your local
+ branch.
+
+8. Check the status of your local branch.
+
+ $ git status
+ On branch master
+ Your branch is ahead of 'origin/master' by 38 commits.
+ (use "git push" to publish your local commits)
+ nothing to commit, working directory clean
+
+ Your local repository now has any changes from the `upstream` remote. You
+ need to push the changes to your own remote fork which is `origin/master`.
+
+9. Push the rebased master to `origin/master`.
+
+ $ git push origin
+ Username for 'https://github.com': moxiegirl
+ Password for 'https://moxiegirl@github.com':
+ Counting objects: 223, done.
+ Compressing objects: 100% (38/38), done.
+ Writing objects: 100% (69/69), 8.76 KiB | 0 bytes/s, done.
+ Total 69 (delta 53), reused 47 (delta 31)
+ To https://github.com/moxiegirl/docker.git
+ 8e107a9..5035fa1 master -> master
+
+9. Create a new feature branch to work on your issue.
+
+ Your branch name should have the format `XXXX-descriptive` where `XXXX` is
+ the issue number you are working on. For example:
+
+ $ git checkout -b 11038-fix-rhel-link
+ Switched to a new branch '11038-fix-rhel-link'
+
+ Your branch should be up-to-date with the upstream/master. Why? Because you
+ branched off a freshly synced master. Let's check this anyway in the next
+ step.
+
+9. Rebase your branch from upstream/master.
+
+ $ git rebase upstream/master
+ Current branch 11038-fix-rhel-link is up to date.
+
+ At this point, your local branch, your remote repository, and the Docker
+ repository all have identical code. You are ready to make changesfor your
+ issues.
+
+
+## Where to go next
+
+At this point, you know what you want to work on and you have a branch to do
+your work in. Go onto the next section to learn [how to work on your
+changes](/project/work-issue/).
diff --git a/docs/sources/project/get-help.md b/docs/sources/project/get-help.md
new file mode 100644
index 0000000000..9c98549c9d
--- /dev/null
+++ b/docs/sources/project/get-help.md
@@ -0,0 +1,147 @@
+page_title: Where to chat or get help
+page_description: Describes Docker's communication channels
+page_keywords: IRC, Google group, Twitter, blog, Stackoverflow
+
+<style type="text/css">
+/* @TODO add 'no-zebra' table-style to the docs-base stylesheet */
+/* Table without "zebra" striping */
+.content-body table.no-zebra tr {
+ background-color: transparent;
+}
+</style>
+
+# Where to chat or get help
+
+There are several communications channels you can use to chat with Docker
+community members and developers.
+
+<table>
+ <col width="25%">
+ <col width="75%">
+ <tr>
+ <td>Internet Relay Chat (IRC)</th>
+ <td>
+ <p>
+ IRC a direct line to our most knowledgeable Docker users.
+ The <code>#docker</code> and <code>#docker-dev</code> group on
+ <strong>irc.freenode.net</strong>. IRC was first created in 1988.
+ So, it is a rich chat protocol but it can overwhelm new users. You can search
+ <a href="https://botbot.me/freenode/docker/#" target="_blank">our chat archives</a>.
+ </p>
+ Read our IRC quickstart guide below for an easy way to get started.
+ </td>
+ </tr>
+ <tr>
+ <td>Google Groups</td>
+ <td>
+ There are two groups.
+ <a href="https://groups.google.com/forum/#!forum/docker-user" target="_blank">Docker-user</a>
+ is for people using Docker containers.
+ The <a href="https://groups.google.com/forum/#!forum/docker-dev" target="_blank">docker-dev</a>
+ group is for contributors and other people contributing to the Docker
+ project.
+ </td>
+ </tr>
+ <tr>
+ <td>Twitter</td>
+ <td>
+ You can follow <a href="https://twitter.com/docker/" target="_blank">Docker's twitter</a>
+ to get updates on our products. You can also tweet us questions or just
+ share blogs or stories.
+ </td>
+ </tr>
+ <tr>
+ <td>Stack Overflow</td>
+ <td>
+ Stack Overflow has over 7000K Docker questions listed. We regularly
+ monitor <a href="http://stackoverflow.com/search?tab=newest&q=docker" target="_blank">Docker questions</a>
+ and so do many other knowledgeable Docker users.
+ </td>
+ </tr>
+</table>
+
+
+## IRC Quickstart
+
+IRC can also be overwhelming for new users. This quickstart shows you
+the easiest way to connect to IRC.
+
+1. In your browser open <a href="http://webchat.freenode.net" target="_blank">http://webchat.freenode.net</a>
+
+ ![Login screen](/project/images/irc_connect.png)
+
+
+2. Fill out the form.
+
+ <table class="no-zebra" style="width: auto">
+ <tr>
+ <td><b>Nickname</b></td>
+ <td>The short name you want to be known as in IRC.</td>
+ </tr>
+ <tr>
+ <td><b>Channels</b></td>
+ <td><code>#docker</code></td>
+ </tr>
+ <tr>
+ <td><b>reCAPTCHA</b></td>
+ <td>Use the value provided.</td>
+ </tr>
+ </table>
+
+3. Click "Connect".
+
+ The system connects you to chat. You'll see a lot of text. At the bottom of
+ the display is a command line. Just above the command line the system asks
+ you to register.
+
+ ![Login screen](/project/images/irc_after_login.png)
+
+
+4. In the command line, register your nickname.
+
+ /msg NickServ REGISTER password youremail@example.com
+
+ ![Login screen](/project/images/register_nic.png)
+
+ The IRC system sends an email to the address you
+ enter. The email contains instructions for completing your registration.
+
+5. Open your mail client and look for the email.
+
+ ![Login screen](/project/images/register_email.png)
+
+6. Back in the browser, complete the registration according to the email.
+
+ /msg NickServ VERIFY REGISTER moxiegirl_ acljtppywjnr
+
+7. Join the `#docker` group using the following command.
+
+ /j #docker
+
+ You can also join the `#docker-dev` group.
+
+ /j #docker-dev
+
+8. To ask questions to the channel just type messages in the command line.
+
+ ![Login screen](/project/images/irc_chat.png)
+
+9. To quit, close the browser window.
+
+
+### Tips and learning more about IRC
+
+Next time you return to log into chat, you'll need to re-enter your password
+on the command line using this command:
+
+ /msg NickServ identify <password>
+
+If you forget or lose your password see <a
+href="https://freenode.net/faq.shtml#sendpass" target="_blank">the FAQ on
+freenode.net</a> to learn how to recover it.
+
+This quickstart was meant to get you up and into IRC very quickly. If you find
+IRC useful there is a lot more to learn. Drupal, another open source project,
+actually has <a href="https://www.drupal.org/irc/setting-up" target="_blank">
+written a lot of good documentation about using IRC</a> for their project
+(thanks Drupal!).
diff --git a/docs/sources/project/glossary.md b/docs/sources/project/glossary.md
new file mode 100644
index 0000000000..5324cda153
--- /dev/null
+++ b/docs/sources/project/glossary.md
@@ -0,0 +1,7 @@
+page_title: Glossary
+page_description: tbd
+page_keywords: tbd
+
+## Glossary
+
+TBD \ No newline at end of file
diff --git a/docs/sources/project/images/box.png b/docs/sources/project/images/box.png
new file mode 100755
index 0000000000..642385ae68
--- /dev/null
+++ b/docs/sources/project/images/box.png
Binary files differ
diff --git a/docs/sources/project/images/branch-sig.png b/docs/sources/project/images/branch-sig.png
new file mode 100644
index 0000000000..88be6b1a8b
--- /dev/null
+++ b/docs/sources/project/images/branch-sig.png
Binary files differ
diff --git a/docs/sources/project/images/checked.png b/docs/sources/project/images/checked.png
new file mode 100755
index 0000000000..93ab2be9b3
--- /dev/null
+++ b/docs/sources/project/images/checked.png
Binary files differ
diff --git a/docs/sources/project/images/commits_expected.png b/docs/sources/project/images/commits_expected.png
new file mode 100644
index 0000000000..d3d8b1e3cf
--- /dev/null
+++ b/docs/sources/project/images/commits_expected.png
Binary files differ
diff --git a/docs/sources/project/images/contributor-edit.png b/docs/sources/project/images/contributor-edit.png
new file mode 100644
index 0000000000..52737d7b46
--- /dev/null
+++ b/docs/sources/project/images/contributor-edit.png
Binary files differ
diff --git a/docs/sources/project/images/copy_url.png b/docs/sources/project/images/copy_url.png
new file mode 100644
index 0000000000..a715019ed8
--- /dev/null
+++ b/docs/sources/project/images/copy_url.png
Binary files differ
diff --git a/docs/sources/project/images/easy_issue.png b/docs/sources/project/images/easy_issue.png
new file mode 100644
index 0000000000..de44b7826d
--- /dev/null
+++ b/docs/sources/project/images/easy_issue.png
Binary files differ
diff --git a/docs/sources/project/images/existing_issue.png b/docs/sources/project/images/existing_issue.png
new file mode 100644
index 0000000000..6757e60bb7
--- /dev/null
+++ b/docs/sources/project/images/existing_issue.png
Binary files differ
diff --git a/docs/sources/project/images/existing_issue.snagproj b/docs/sources/project/images/existing_issue.snagproj
new file mode 100644
index 0000000000..05ae2b0ccf
--- /dev/null
+++ b/docs/sources/project/images/existing_issue.snagproj
Binary files differ
diff --git a/docs/sources/project/images/fixes_num.png b/docs/sources/project/images/fixes_num.png
new file mode 100644
index 0000000000..df52f27fd9
--- /dev/null
+++ b/docs/sources/project/images/fixes_num.png
Binary files differ
diff --git a/docs/sources/project/images/fork_docker.png b/docs/sources/project/images/fork_docker.png
new file mode 100644
index 0000000000..f7c557cd4f
--- /dev/null
+++ b/docs/sources/project/images/fork_docker.png
Binary files differ
diff --git a/docs/sources/project/images/fresh_container.png b/docs/sources/project/images/fresh_container.png
new file mode 100644
index 0000000000..7f69f2d3a5
--- /dev/null
+++ b/docs/sources/project/images/fresh_container.png
Binary files differ
diff --git a/docs/sources/project/images/give_try.png b/docs/sources/project/images/give_try.png
new file mode 100644
index 0000000000..c049527616
--- /dev/null
+++ b/docs/sources/project/images/give_try.png
Binary files differ
diff --git a/docs/sources/project/images/gordon.jpeg b/docs/sources/project/images/gordon.jpeg
new file mode 100644
index 0000000000..8a0df7d463
--- /dev/null
+++ b/docs/sources/project/images/gordon.jpeg
Binary files differ
diff --git a/docs/sources/project/images/in_room.png b/docs/sources/project/images/in_room.png
new file mode 100644
index 0000000000..4fdec81b9c
--- /dev/null
+++ b/docs/sources/project/images/in_room.png
Binary files differ
diff --git a/docs/sources/project/images/irc_after_login.png b/docs/sources/project/images/irc_after_login.png
new file mode 100644
index 0000000000..79496c806d
--- /dev/null
+++ b/docs/sources/project/images/irc_after_login.png
Binary files differ
diff --git a/docs/sources/project/images/irc_chat.png b/docs/sources/project/images/irc_chat.png
new file mode 100644
index 0000000000..1ab9548067
--- /dev/null
+++ b/docs/sources/project/images/irc_chat.png
Binary files differ
diff --git a/docs/sources/project/images/irc_connect.png b/docs/sources/project/images/irc_connect.png
new file mode 100644
index 0000000000..f411aabcac
--- /dev/null
+++ b/docs/sources/project/images/irc_connect.png
Binary files differ
diff --git a/docs/sources/project/images/irc_login.png b/docs/sources/project/images/irc_login.png
new file mode 100644
index 0000000000..a7a1dc7eb4
--- /dev/null
+++ b/docs/sources/project/images/irc_login.png
Binary files differ
diff --git a/docs/sources/project/images/issue_list.png b/docs/sources/project/images/issue_list.png
new file mode 100644
index 0000000000..c0aefdb422
--- /dev/null
+++ b/docs/sources/project/images/issue_list.png
Binary files differ
diff --git a/docs/sources/project/images/latest_commits.png b/docs/sources/project/images/latest_commits.png
new file mode 100644
index 0000000000..791683a5c5
--- /dev/null
+++ b/docs/sources/project/images/latest_commits.png
Binary files differ
diff --git a/docs/sources/project/images/list_example.png b/docs/sources/project/images/list_example.png
new file mode 100644
index 0000000000..a306e6e7dd
--- /dev/null
+++ b/docs/sources/project/images/list_example.png
Binary files differ
diff --git a/docs/sources/project/images/locate_branch.png b/docs/sources/project/images/locate_branch.png
new file mode 100644
index 0000000000..8fa02ec454
--- /dev/null
+++ b/docs/sources/project/images/locate_branch.png
Binary files differ
diff --git a/docs/sources/project/images/proposal.png b/docs/sources/project/images/proposal.png
new file mode 100644
index 0000000000..250781a70d
--- /dev/null
+++ b/docs/sources/project/images/proposal.png
Binary files differ
diff --git a/docs/sources/project/images/proposal.snagproj b/docs/sources/project/images/proposal.snagproj
new file mode 100644
index 0000000000..c9ad49d0e7
--- /dev/null
+++ b/docs/sources/project/images/proposal.snagproj
Binary files differ
diff --git a/docs/sources/project/images/pull_request_made.png b/docs/sources/project/images/pull_request_made.png
new file mode 100644
index 0000000000..a00535bed1
--- /dev/null
+++ b/docs/sources/project/images/pull_request_made.png
Binary files differ
diff --git a/docs/sources/project/images/red_notice.png b/docs/sources/project/images/red_notice.png
new file mode 100644
index 0000000000..8839723a37
--- /dev/null
+++ b/docs/sources/project/images/red_notice.png
Binary files differ
diff --git a/docs/sources/project/images/register_email.png b/docs/sources/project/images/register_email.png
new file mode 100644
index 0000000000..8873411e80
--- /dev/null
+++ b/docs/sources/project/images/register_email.png
Binary files differ
diff --git a/docs/sources/project/images/register_nic.png b/docs/sources/project/images/register_nic.png
new file mode 100644
index 0000000000..16cf05a396
--- /dev/null
+++ b/docs/sources/project/images/register_nic.png
Binary files differ
diff --git a/docs/sources/project/images/three_running.png b/docs/sources/project/images/three_running.png
new file mode 100644
index 0000000000..a85dc7471e
--- /dev/null
+++ b/docs/sources/project/images/three_running.png
Binary files differ
diff --git a/docs/sources/project/images/three_terms.png b/docs/sources/project/images/three_terms.png
new file mode 100644
index 0000000000..7caa6ac6e3
--- /dev/null
+++ b/docs/sources/project/images/three_terms.png
Binary files differ
diff --git a/docs/sources/project/images/to_from_pr.png b/docs/sources/project/images/to_from_pr.png
new file mode 100644
index 0000000000..8dd6638e1b
--- /dev/null
+++ b/docs/sources/project/images/to_from_pr.png
Binary files differ
diff --git a/docs/sources/project/make-a-contribution.md b/docs/sources/project/make-a-contribution.md
new file mode 100644
index 0000000000..e0b4e89720
--- /dev/null
+++ b/docs/sources/project/make-a-contribution.md
@@ -0,0 +1,35 @@
+page_title: Understand how to contribute
+page_description: Explains basic workflow for Docker contributions
+page_keywords: contribute, maintainers, review, workflow, process
+
+# Understand how to contribute
+
+Contributing is a process where you work with Docker maintainers and the
+community to improve Docker. The maintainers are experienced contributors
+who specialize in one or more Docker components. Maintainers play a big role
+in reviewing contributions.
+
+There is a formal process for contributing. We try to keep our contribution
+process simple so you'll want to contribute frequently.
+
+
+## The basic contribution workflow
+
+In this guide, you work through Docker's basic contribution workflow by fixing a
+single *beginner* issue in the `docker/docker` repository. The workflow
+for fixing simple issues looks like this:
+
+![Simple process](/project/images/existing_issue.png)
+
+All Docker repositories have code and documentation. You use this same workflow
+for either content type. For example, you can find and fix doc or code issues.
+Also, you can propose a new Docker feature or propose a new Docker tutorial.
+
+Some workflow stages do have slight differences for code or documentation
+contributions. When you reach that point in the flow, we make sure to tell you.
+
+
+## Where to go next
+
+Now that you know a little about the contribution process, go to the next section
+to [find an issue you want to work on](/project/find-an-issue/).
diff --git a/docs/sources/project/review-pr.md b/docs/sources/project/review-pr.md
new file mode 100644
index 0000000000..e8cb6c7c04
--- /dev/null
+++ b/docs/sources/project/review-pr.md
@@ -0,0 +1,124 @@
+page_title: Participate in the PR Review
+page_description: Basic workflow for Docker contributions
+page_keywords: contribute, pull request, review, workflow, beginner, squash, commit
+
+
+# Participate in the PR Review
+
+Creating a pull request is nearly the end of the contribution process. At this
+point, your code is reviewed both by our continuous integration (CI) systems and
+by our maintainers.
+
+The CI system is an automated system. The maintainers are human beings that also
+work on Docker. You need to understand and work with both the "bots" and the
+"beings" to review your contribution.
+
+
+## How we proces your review
+
+First to review your pull request is Gordon. Gordon is fast. He checks your
+pull request (PR) for common problems like a missing signature. If Gordon finds a
+problem, he'll send an email through your GitHub user account:
+
+![Gordon](/project/images/gordon.jpeg)
+
+Our build bot system starts building your changes while Gordon sends any emails.
+
+The build system double-checks your work by compiling your code with Docker's master
+code. Building includes running the same tests you ran locally. If you forgot
+to run tests or missed something in fixing problems, the automated build is our
+safety check.
+
+After Gordon and the bots, the "beings" review your work. Docker maintainers look
+at your pull request and comment on it. The shortest comment you might see is
+`LGTM` which means **l**ooks-**g**ood-**t**o-**m**e. If you get an `LGTM`, that
+is a good thing, you passed that review.
+
+For complex changes, maintainers may ask you questions or ask you to change
+something about your submission. All maintainer comments on a PR go to the
+email address associated with your GitHub account. Any GitHub user who
+"participates" in a PR receives an email to. Participating means creating or
+commenting on a PR.
+
+Our maintainers are very experienced Docker users and open source contributors.
+So, they value your time and will try to work efficiently with you by keeping
+their comments specific and brief. If they ask you to make a change, you'll
+need to update your pull request with additional changes.
+
+## Update an Existing Pull Request
+
+To update your existing pull request:
+
+1. Change one or more files in your local `docker-fork` repository.
+
+2. Commit the change with the `git commit --amend` command.
+
+ $ git commit --amend
+
+ Git opens an editor containing your last commit message.
+
+3. Adjust your last comment to reflect this new change.
+
+ Added a new sentence per Anaud's suggestion
+
+ Signed-off-by: Mary Anthony <mary@docker.com>
+
+ # Please enter the commit message for your changes. Lines starting
+ # with '#' will be ignored, and an empty message aborts the commit.
+ # On branch 11038-fix-rhel-link
+ # Your branch is up-to-date with 'origin/11038-fix-rhel-link'.
+ #
+ # Changes to be committed:
+ # modified: docs/sources/installation/mac.md
+ # modified: docs/sources/installation/rhel.md
+
+4. Push to your origin.
+
+ $ git push origin
+
+5. Open your browser to your pull request on GitHub.
+
+ You should see your pull request now contains your newly pushed code.
+
+6. Add a comment to your pull request.
+
+ GitHub only notifies PR participants when you comment. For example, you can
+ mention that you updated your PR. Your comment alerts the maintainers that
+ you made an update.
+
+A change requires LGTMs from an absolute majority of an affected component's
+maintainers. For example, if you change `docs/` and `registry/` code, an
+absolute majority of the `docs/` and the `registry/` maintainers must approve
+your PR. Once you get approval, we merge your pull request into Docker's
+`master` code branch.
+
+## After the merge
+
+It can take time to see a merged pull request in Docker's official release.
+A master build is available almost immediately though. Docker builds and
+updates its development binaries after each merge to `master`.
+
+1. Browse to <a href="https://master.dockerproject.com/" target="_blank">https://master.dockerproject.com/</a>.
+
+2. Look for the binary appropriate to your system.
+
+3. Download and run the binary.
+
+ You might want to run the binary in a container though. This
+ will keep your local host environment clean.
+
+4. View any documentation changes at <a href="http://docs.master.dockerproject.com/" target="_blank">docs.master.dockerproject.com</a>.
+
+Once you've verified everything merged, feel free to delete your feature branch
+from your fork. For information on how to do this,
+<a href="https://help.github.com/articles/deleting-unused-branches/" target="_blank">
+see the GitHub help on deleting branches</a>.
+
+## Where to go next
+
+At this point, you have completed all the basic tasks in our contributors guide.
+If you enjoyed contributing, let us know by completing another beginner
+issue or two. We really appreciate the help.
+
+If you are very experienced and want to make a major change, go on to
+[learn about advanced contributing](/project/advanced-contributing).
diff --git a/docs/sources/project/set-up-dev-env.md b/docs/sources/project/set-up-dev-env.md
new file mode 100644
index 0000000000..637eef6f58
--- /dev/null
+++ b/docs/sources/project/set-up-dev-env.md
@@ -0,0 +1,411 @@
+page_title: Work with a development container
+page_description: How to use Docker's development environment
+page_keywords: development, inception, container, image Dockerfile, dependencies, Go, artifacts
+
+# Work with a development container
+
+In this section, you learn to develop like a member of Docker's core team.
+The `docker` repository includes a `Dockerfile` at its root. This file defines
+Docker's development environment. The `Dockerfile` lists the environment's
+dependencies: system libraries and binaries, go environment, go dependencies,
+etc.
+
+Docker's development environment is itself, ultimately a Docker container.
+You use the `docker` repository and its `Dockerfile` to create a Docker image,
+run a Docker container, and develop code in the container. Docker itself builds,
+tests, and releases new Docker versions using this container.
+
+If you followed the procedures that <a href="./set-up-prereqs" target="_blank">
+set up the prerequisites</a>, you should have a fork of the `docker/docker`
+repository. You also created a branch called `dry-run-test`. In this section,
+you continue working with your fork on this branch.
+
+## Clean your host of Docker artifacts
+
+Docker developers run the latest stable release of the Docker software; Or
+Boot2docker and Docker if their machine is Mac OS X. They clean their local
+hosts of unnecessary Docker artifacts such as stopped containers or unused
+images. Cleaning unnecessary artifacts isn't strictly necessary but it is
+good practice, so it is included here.
+
+To remove unnecessary artifacts.
+
+1. Verify that you have no unnecessary containers running on your host.
+
+ $ docker ps
+
+ You should see something similar to the following:
+
+ <table class="code">
+ <tr>
+ <th>CONTAINER ID</th>
+ <th>IMAGE</th>
+ <th>COMMAND</th>
+ <th>CREATED</th>
+ <th>STATUS</th>
+ <th>PORTS</th>
+ <th>NAMES</th>
+ </tr>
+ </table>
+
+ There are no running containers on this host. If you have running but unused
+ containers, stop and then remove them with the `docker stop` and `docker rm`
+ commands.
+
+2. Verify that your host has no dangling images.
+
+ $ docker images
+
+ You should see something similar to the following:
+
+ <table class="code">
+ <tr>
+ <th>REPOSITORY</th>
+ <th>TAG</th>
+ <th>IMAGE ID</th>
+ <th>CREATED</th>
+ <th>VIRTUAL SIZE</th>
+ </tr>
+ </table>
+
+ This host has no images. You may have one or more _dangling_ images. A
+ dangling image is not used by a running container and is not an ancestor of
+ another image on your system. A fast way to remove dangling containers is
+ the following:
+
+ $ docker rmi -f $(docker images -q -a -f dangling=true)
+
+ This command uses `docker images` to lists all images (`-a` flag) by numeric
+ IDs (`-q` flag) and filter them to find dangling images (`-f
+ dangling=true`). Then, the `docker rmi` command forcibly (`-f` flag) removes
+ the resulting list. To remove just one image, use the `docker rmi ID`
+ command.
+
+
+## Build an image
+
+If you followed the last procedure, your host is clean of unnecessary images
+and containers. In this section, you build an image from the Docker development
+environment.
+
+1. Open a terminal.
+
+ Mac users, use `boot2docker status` to make sure Boot2Docker is running. You
+ may need to run `eval "$(boot2docker shellinit)"` to initialize your shell
+ environment.
+
+3. Change into the root of your forked repository.
+
+ $ cd ~/repos/docker-fork
+
+4. Ensure you are on your `dry-run-test` branch.
+
+ $ git checkout dry-run-test
+
+5. Compile your development environment container into an image.
+
+ $ docker build -t dry-run-test .
+
+ The `docker build` command returns informational message as it runs. The
+ first build may take a few minutes to create an image. Using the
+ instructions in the `Dockerfile`, the build may need to download source and
+ other images. A successful build returns a final status message similar to
+ the following:
+
+ Successfully built 676815d59283
+
+6. List your Docker images again.
+
+ $ docker images
+
+ You should see something similar to this:
+
+ <table class="code">
+ <tr>
+ <th>REPOSTITORY</th>
+ <th>TAG</th>
+ <th>IMAGE ID</th>
+ <th>CREATED</th>
+ <th>VIRTUAL SIZE</th>
+ </tr>
+ <tr>
+ <td>dry-run-test</td>
+ <td>latest</td>
+ <td>663fbee70028</td>
+ <td>About a minute ago</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>ubuntu</td>
+ <td>trusty</td>
+ <td>2d24f826cb16</td>
+ <td>2 days ago</td>
+ <td>188.3 MB</td>
+ </tr>
+ <tr>
+ <td>ubuntu</td>
+ <td>trusty-20150218.1</td>
+ <td>2d24f826cb16</td>
+ <td>2 days ago</td>
+ <td>188.3 MB</td>
+ </tr>
+ <tr>
+ <td>ubuntu</td>
+ <td>14.04</td>
+ <td>2d24f826cb16</td>
+ <td>2 days ago</td>
+ <td>188.3 MB</td>
+ </tr>
+ <tr>
+ <td>ubuntu</td>
+ <td>14.04.2</td>
+ <td>2d24f826cb16</td>
+ <td>2 days ago</td>
+ <td>188.3 MB</td>
+ </tr>
+ <tr>
+ <td>ubuntu</td>
+ <td>latest</td>
+ <td>2d24f826cb16</td>
+ <td>2 days ago</td>
+ <td>188.3 MB</td>
+ </tr>
+ </table>
+
+ Locate your new `dry-run-test` image in the list. You should also see a
+ number of `ubuntu` images. The build process creates these. They are the
+ ancestors of your new Docker development image. When you next rebuild your
+ image, the build process reuses these ancestors images if they exist.
+
+ Keeping the ancestor images improves the build performance. When you rebuild
+ the child image, the build process uses the local ancestors rather than
+ retrieving them from the Hub. The build process gets new ancestors only if
+ DockerHub has updated versions.
+
+## Start a container and run a test
+
+At this point, you have created a new Docker development environment image. Now,
+you'll use this image to create a Docker container to develop in. Then, you'll
+build and run a `docker` binary in your container.
+
+1. Open two additional terminals on your host.
+
+ At this point, you'll have about three terminals open.
+
+ ![Multiple terminals](/project/images/three_terms.png)
+
+ Mac OSX users, make sure you run `eval "$(boot2docker shellinit)"` in any new
+ terminals.
+
+2. In a terminal, create a new container from your `dry-run-test` image.
+
+ $ docker run --privileged --rm -ti dry-run-test /bin/bash
+ root@5f8630b873fe:/go/src/github.com/docker/docker#
+
+ The command creates a container from your `dry-run-test` image. It opens an
+ interactive terminal (`-ti`) running a `/bin/bash shell`. The
+ `--privileged` flag gives the container access to kernel features and device
+ access. It is this flag that allows you to run a container in a container.
+ Finally, the `-rm` flag instructs Docker to remove the container when you
+ exit the `/bin/bash` shell.
+
+ The container includes the source of your image repository in the
+ `/go/src/github.com/docker/docker` directory. Try listing the contents to
+ verify they are the same as that of your `docker-fork` repo.
+
+ ![List example](/project/images/list_example.png)
+
+
+3. Investigate your container bit.
+
+ If you do a `go version` you'll find the `go` language is part of the
+ container.
+
+ root@31ed86e9ddcf:/go/src/github.com/docker/docker# go version
+ go version go1.4.2 linux/amd64
+
+ Similarly, if you do a `docker version` you find the container
+ has no `docker` binary.
+
+ root@31ed86e9ddcf:/go/src/github.com/docker/docker# docker version
+ bash: docker: command not found
+
+ You will create one in the next steps.
+
+4. From the `/go/src/github.com/docker/docker` directory make a `docker` binary with the `make.sh` script.
+
+ root@5f8630b873fe:/go/src/github.com/docker/docker# hack/make.sh binary
+
+ You only call `hack/make.sh` to build a binary _inside_ a Docker
+ development container as you are now. On your host, you'll use `make`
+ commands (more about this later).
+
+ As it makes the binary, the `make.sh` script reports the build's progress.
+ When the command completes successfully, you should see the following
+ output:
+
+ ---> Making bundle: ubuntu (in bundles/1.5.0-dev/ubuntu)
+ Created package {:path=>"lxc-docker-1.5.0-dev_1.5.0~dev~git20150223.181106.0.1ab0d23_amd64.deb"}
+ Created package {:path=>"lxc-docker_1.5.0~dev~git20150223.181106.0.1ab0d23_amd64.deb"}
+
+5. List all the contents of the `binary` directory.
+
+ root@5f8630b873fe:/go/src/github.com/docker/docker# ls bundles/1.5.0-dev/binary/
+ docker docker-1.5.0-dev docker-1.5.0-dev.md5 docker-1.5.0-dev.sha256
+
+ You should see that `binary` directory, just as it sounds, contains the
+ made binaries.
+
+
+6. Copy the `docker` binary to the `/usr/bin` of your container.
+
+ root@5f8630b873fe:/go/src/github.com/docker/docker# cp bundles/1.5.0-dev/binary/docker /usr/bin
+
+7. Inside your container, check your Docker version.
+
+ root@5f8630b873fe:/go/src/github.com/docker/docker# docker --version
+ Docker version 1.5.0-dev, build 6e728fb
+
+ Inside the container you are running a development version. This is version
+ on the current branch it reflects the value of the `VERSION` file at the
+ root of your `docker-fork` repository.
+
+8. Start a `docker` daemon running inside your container.
+
+ root@5f8630b873fe:/go/src/github.com/docker/docker# docker -dD
+
+ The `-dD` flag starts the daemon in debug mode; You'll find this useful
+ when debugging your code.
+
+9. Bring up one of the terminals on your local host.
+
+
+10. List your containers and look for the container running the `dry-run-test` image.
+
+ $ docker ps
+
+ <table class="code">
+ <tr>
+ <th>CONTAINER ID</th>
+ <th>IMAGE</th>
+ <th>COMMAND</th>
+ <th>CREATED</th>
+ <th>STATUS</th>
+ <th>PORTS</th>
+ <th>NAMES</th>
+ </tr>
+ <tr>
+ <td>474f07652525</td>
+ <td>dry-run-test:latest</td>
+ <td>"hack/dind /bin/bash</td>
+ <td>14 minutes ago</td>
+ <td>Up 14 minutes</td>
+ <td></td>
+ <td>tender_shockley</td>
+ </tr>
+ </table>
+
+ In this example, the container's name is `tender_shockley`; yours will be
+ different.
+
+11. From the terminal, start another shell on your Docker development container.
+
+ $ docker exec -it tender_shockley bash
+
+ At this point, you have two terminals both with a shell open into your
+ development container. One terminal is running a debug session. The other
+ terminal is displaying a `bash` prompt.
+
+12. At the prompt, test the Docker client by running the `hello-world` container.
+
+ root@9337c96e017a:/go/src/github.com/docker/docker# docker run hello-world
+
+ You should see the image load and return. Meanwhile, you
+ can see the calls made via the debug session in your other terminal.
+
+ ![List example](/project/images/three_running.png)
+
+
+## Restart a container with your source
+
+At this point, you have experienced the "Docker inception" technique. That is,
+you have:
+
+* built a Docker image from the Docker repository
+* created and started a Docker development container from that image
+* built a Docker binary inside of your Docker development container
+* launched a `docker` daemon using your newly compiled binary
+* called the `docker` client to run a `hello-world` container inside
+ your development container
+
+When you really get to developing code though, you'll want to iterate code
+changes and builds inside the container. For that you need to mount your local
+Docker repository source into your Docker container. Try that now.
+
+1. If you haven't already, exit out of BASH shells in your running Docker
+container.
+
+ If you have followed this guide exactly, exiting out your BASH shells stops
+ the running container. You can use the `docker ps` command to verify the
+ development container is stopped. All of your terminals should be at the
+ local host prompt.
+
+2. Choose a terminal and make sure you are in your `docker-fork` repository.
+
+ $ pwd
+ /Users/mary/go/src/github.com/moxiegirl/docker-fork
+
+ Your location will be different because it reflects your environment.
+
+3. Create a container using `dry-run-test` but this time mount your repository onto the `/go` directory inside the container.
+
+ $ docker run --privileged --rm -ti -v `pwd`:/go/src/github.com/docker/docker dry-run-test /bin/bash
+
+ When you pass `pwd`, `docker` resolves it to your current directory.
+
+4. From inside the container, list your `binary` directory.
+
+ root@074626fc4b43:/go/src/github.com/docker/docker# ls bundles/1.5.0-dev/binary
+ ls: cannot access binary: No such file or directory
+
+ Your `dry-run-test` image does not retain any of the changes you made inside
+ the container. This is the expected behavior for a container.
+
+5. In a fresh terminal on your local host, change to the `docker-fork` root.
+
+ $ cd ~/repos/docker-fork/
+
+6. Create a fresh binary but this time use the `make` command.
+
+ $ make BINDDIR=. binary
+
+ The `BINDDIR` flag is only necessary on Mac OS X but it won't hurt to pass
+ it on Linux command line. The `make` command, like the `make.sh` script
+ inside the container, reports its progress. When the make succeeds, it
+ returns the location of the new binary.
+
+
+7. Back in the terminal running the container, list your `binary` directory.
+
+ root@074626fc4b43:/go/src/github.com/docker/docker# ls bundles/1.5.0-dev/binary
+ docker docker-1.5.0-dev docker-1.5.0-dev.md5 docker-1.5.0-dev.sha256
+
+ The compiled binaries created from your repository on your local host are
+ now available inside your running Docker development container.
+
+8. Repeat the steps you ran in the previous procedure.
+
+ * copy the binary inside the development container using
+ `cp bundles/1.5.0-dev/binary/docker /usr/bin`
+ * start `docker -dD` to launch the Docker daemon inside the container
+ * run `docker ps` on local host to get the development container's name
+ * connect to your running container `docker exec -it container_name bash`
+ * use the `docker run hello-world` command to create and run a container
+ inside your development container
+
+## Where to go next
+
+Congratulations, you have successfully achieved Docker inception. At this point,
+you've set up your development environment and verified almost all the essential
+processes you need to contribute. Of course, before you start contributing,
+[you'll need to learn one more piece of the development environment, the test framework](/project/test-and-docs/).
diff --git a/docs/sources/project/set-up-git.md b/docs/sources/project/set-up-git.md
new file mode 100644
index 0000000000..2292d93b3c
--- /dev/null
+++ b/docs/sources/project/set-up-git.md
@@ -0,0 +1,238 @@
+page_title: Configure Git for contributing
+page_description: Describes how to set up your local machine and repository
+page_keywords: GitHub account, repository, clone, fork, branch, upstream, Git, Go, make,
+
+# Configure Git for contributing
+
+Work through this page to configure Git and a repository you'll use throughout
+the Contributor Guide. The work you do further in the guide, depends on the work
+you do here.
+
+## Fork and clone the Docker code
+
+Before contributing, you first fork the Docker code repository. A fork copies
+a repository at a particular point in time. GitHub tracks for you where a fork
+originates.
+
+As you make contributions, you change your fork's code. When you are ready,
+you make a pull request back to the original Docker repository. If you aren't
+familiar with this workflow, don't worry, this guide walks you through all the
+steps.
+
+To fork and clone Docker:
+
+1. Open a browser and log into GitHub with your account.
+
+2. Go to the <a href="https://github.com/docker/docker"
+target="_blank">docker/docker repository</a>.
+
+3. Click the "Fork" button in the upper right corner of the GitHub interface.
+
+ ![Branch Signature](/project/images/fork_docker.png)
+
+ GitHub forks the repository to your GitHub account. The original
+ `docker/docker` repository becomes a new fork `YOUR_ACCOUNT/docker` under
+ your account.
+
+4. Copy your fork's clone URL from GitHub.
+
+ GitHub allows you to use HTTPS or SSH protocols for clones. You can use the
+ `git` command line or clients like Subversion to clone a repository.
+
+ ![Copy clone URL](/project/images/copy_url.png)
+
+ This guide assume you are using the HTTPS protocol and the `git` command
+ line. If you are comfortable with SSH and some other tool, feel free to use
+ that instead. You'll need to convert what you see in the guide to what is
+ appropriate to your tool.
+
+5. Open a terminal window on your local host and change to your home directory.
+
+ $ cd ~
+
+6. Create a `repos` directory.
+
+ $ mkdir repos
+
+7. Change into your `repos` directory.
+
+ $ cd repos
+
+5. Clone the fork to your local host into a repository called `docker-fork`.
+
+ $ git clone https://github.com/moxiegirl/docker.git docker-fork
+
+ Naming your local repo `docker-fork` should help make these instructions
+ easier to follow; experienced coders don't typically change the name.
+
+6. Change directory into your new `docker-fork` directory.
+
+ $ cd docker-fork
+
+ Take a moment to familiarize yourself with the repository's contents. List
+ the contents.
+
+## Set your signature and an upstream remote
+
+When you contribute to Docker, you must certify you agree with the
+<a href="http://developercertificate.org/" target="_blank">Developer Certificate of Origin</a>.
+You indicate your agreement by signing your `git` commits like this:
+
+ Signed-off-by: Pat Smith <pat.smith@email.com>
+
+To create a signature, you configure your username and email address in Git.
+You can set these globally or locally on just your `docker-fork` repository.
+You must sign with your real name. We don't accept anonymous contributions or
+contributions through pseudonyms.
+
+As you change code in your fork, you'll want to keep it in sync with the changes
+others make in the `docker/docker` repository. To make syncing easier, you'll
+also add a _remote_ called `upstream` that points to `docker/docker`. A remote
+is just another a project version hosted on the internet or network.
+
+To configure your username, email, and add a remote:
+
+1. Change to the root of your `docker-fork` repository.
+
+ $ cd docker-fork
+
+2. Set your `user.name` for the repository.
+
+ $ git config --local user.name "FirstName LastName"
+
+3. Set your `user.email` for the repository.
+
+ $ git config --local user.email "emailname@mycompany.com"
+
+4. Set your local repo to track changes upstream, on the `docker` repository.
+
+ $ git remote add upstream https://github.com/docker/docker.git
+
+7. Check the result in your `git` configuration.
+
+ $ git config --local -l
+ core.repositoryformatversion=0
+ core.filemode=true
+ core.bare=false
+ core.logallrefupdates=true
+ remote.origin.url=https://github.com/moxiegirl/docker.git
+ remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
+ branch.master.remote=origin
+ branch.master.merge=refs/heads/master
+ user.name=Mary Anthony
+ user.email=mary@docker.com
+ remote.upstream.url=https://github.com/docker/docker.git
+ remote.upstream.fetch=+refs/heads/*:refs/remotes/upstream/*
+
+ To list just the remotes use:
+
+ $ git remote -v
+ origin https://github.com/moxiegirl/docker.git (fetch)
+ origin https://github.com/moxiegirl/docker.git (push)
+ upstream https://github.com/docker/docker.git (fetch)
+ upstream https://github.com/docker/docker.git (push)
+
+## Create and push a branch
+
+As you change code in your fork, you make your changes on a repository branch.
+The branch name should reflect what you are working on. In this section, you
+create a branch, make a change, and push it up to your fork.
+
+This branch is just for testing your config for this guide. The changes are part
+of a dry run so the branch name is going to be dry-run-test. To create an push
+the branch to your fork on GitHub:
+
+1. Open a terminal and go to the root of your `docker-fork`.
+
+ $ cd docker-fork
+
+2. Create a `dry-run-test` branch.
+
+ $ git checkout -b dry-run-test
+
+ This command creates the branch and switches the repository to it.
+
+3. Verify you are in your new branch.
+
+ $ git branch
+ * dry-run-test
+ master
+
+ The current branch has an * (asterisk) marker. So, these results shows you
+ are on the right branch.
+
+4. Create a `TEST.md` file in the repository's root.
+
+ $ touch TEST.md
+
+5. Edit the file and add your email and location.
+
+ ![Add your information](/project/images/contributor-edit.png)
+
+ You can use any text editor you are comfortable with.
+
+6. Close and save the file.
+
+7. Check the status of your branch.
+
+ $ git status
+ On branch dry-run-test
+ Untracked files:
+ (use "git add <file>..." to include in what will be committed)
+
+ TEST.md
+
+ nothing added to commit but untracked files present (use "git add" to track)
+
+ You've only changed the one file. It is untracked so far by git.
+
+8. Add your file.
+
+ $ git add TEST.md
+
+ That is the only _staged_ file. Stage is fancy word for work that Git is
+ tracking.
+
+9. Sign and commit your change.
+
+ $ git commit -s -m "Making a dry run test."
+ [dry-run-test 6e728fb] Making a dry run test
+ 1 file changed, 1 insertion(+)
+ create mode 100644 TEST.md
+
+ Commit messages should have a short summary sentence of no more than 50
+ characters. Optionally, you can also include a more detailed explanation
+ after the summary. Separate the summary from any explanation with an empty
+ line.
+
+8. Push your changes to GitHub.
+
+ $ git push --set-upstream origin dry-run-test
+ Username for 'https://github.com': moxiegirl
+ Password for 'https://moxiegirl@github.com':
+
+ Git prompts you for your GitHub username and password. Then, the command
+ returns a result.
+
+ Counting objects: 13, done.
+ Compressing objects: 100% (2/2), done.
+ Writing objects: 100% (3/3), 320 bytes | 0 bytes/s, done.
+ Total 3 (delta 1), reused 0 (delta 0)
+ To https://github.com/moxiegirl/docker.git
+ * [new branch] dry-run-test -> dry-run-test
+ Branch dry-run-test set up to track remote branch dry-run-test from origin.
+
+9. Open your browser to Github.
+
+10. Navigate to your Docker fork.
+
+11. Make sure the `dry-run-test` branch exists, that it has your commit, and the
+commit is signed.
+
+ ![Branch Signature](/project/images/branch-sig.png)
+
+## Where to go next
+
+Congratulations, you have finished configuring both your local host environment
+and Git for contributing. In the next section you'll [learn how to set up and
+work in a Docker development container](/project/set-up-dev-env/).
diff --git a/docs/sources/project/software-required.md b/docs/sources/project/software-required.md
new file mode 100644
index 0000000000..476cbbc2ca
--- /dev/null
+++ b/docs/sources/project/software-required.md
@@ -0,0 +1,91 @@
+page_title: Get the required software
+page_description: Describes the software required to contribute to Docker
+page_keywords: GitHub account, repository, Docker, Git, Go, make,
+
+# Get the required software
+
+Before you begin contributing you must have:
+
+* a GitHub account
+* `git`
+* `make`
+* `docker`
+
+You'll notice that `go`, the language that Docker is written in, is not listed.
+That's because you don't need it installed; Docker's development environment
+provides it for you. You'll learn more about the development environment later.
+
+### Get a GitHub account
+
+To contribute to the Docker project, you will need a <a
+href="https://github.com" target="_blank">GitHub account</a>. A free account is
+fine. All the Docker project repositories are public and visible to everyone.
+
+You should also have some experience using both the GitHub application and `git`
+on the command line.
+
+### Install git
+
+Install `git` on your local system. You can check if `git` is on already on your
+system and properly installed with the following command:
+
+ $ git --version
+
+
+This documentation is written using `git` version 2.2.2. Your version may be
+different depending on your OS.
+
+### Install make
+
+Install `make`. You can check if `make` is on your system with the following
+command:
+
+ $ make -v
+
+This documentation is written using GNU Make 3.81. Your version may be different
+depending on your OS.
+
+### Install or upgrade Docker
+
+If you haven't already, install the Docker software using the
+<a href="/installation" target="_blank">instructions for your operating system</a>.
+If you have an existing installation, check your version and make sure you have
+the latest Docker.
+
+To check if `docker` is already installed on Linux:
+
+ $ docker --version
+ Docker version 1.5.0, build a8a31ef
+
+On Mac OS X or Windows, you should have installed Boot2Docker which includes
+Docker. You'll need to verify both Boot2Docker and then Docker. This
+documentation was written on OS X using the following versions.
+
+ $ boot2docker version
+ Boot2Docker-cli version: v1.5.0
+ Git commit: ccd9032
+
+ $ docker --version
+ Docker version 1.5.0, build a8a31ef
+
+## Linux users and sudo
+
+This guide assumes you have added your user to the `docker` group on your system.
+To check, list the group's contents:
+
+ $ getent group docker
+ docker:x:999:ubuntu
+
+If the command returns no matches, you have two choices. You can preface this
+guide's `docker` commands with `sudo` as you work. Alternatively, you can add
+your user to the `docker` group as follows:
+
+ $ sudo usermod -aG docker ubuntu
+
+You must log out and back in for this modification to take effect.
+
+
+## Where to go next
+
+In the next section, you'll [learn how to set up and configure Git for
+contributing to Docker](/project/set-up-git/).
diff --git a/docs/sources/project/test-and-docs.md b/docs/sources/project/test-and-docs.md
new file mode 100644
index 0000000000..d586ea2c3c
--- /dev/null
+++ b/docs/sources/project/test-and-docs.md
@@ -0,0 +1,296 @@
+page_title: Run tests and test documentation
+page_description: Describes Docker's testing infrastructure
+page_keywords: make test, make docs, Go tests, gofmt, contributing, running tests
+
+# Run tests and test documentation
+
+Contributing includes testing your changes. If you change the Docker code, you
+may need to add a new test or modify an existing one. Your contribution could
+even be adding tests to Docker. For this reason, you need to know a little
+about Docker's test infrastructure.
+
+Many contributors contribute documentation only. Or, a contributor makes a code
+contribution that changes how Docker behaves and that change needs
+documentation. For these reasons, you also need to know how to build, view, and
+test the Docker documentation.
+
+In this section, you run tests in the `dry-run-test` branch of your Docker
+fork. If you have followed along in this guide, you already have this branch.
+If you don't have this branch, you can create it or simply use another of your
+branches.
+
+## Understand testing at Docker
+
+Docker tests use the Go language's test framework. In this framework, files
+whose names end in `_test.go` contain test code; you'll find test files like
+this throughout the Docker repo. Use these files for inspiration when writing
+your own tests. For information on Go's test framework, see <a
+href="http://golang.org/pkg/testing/" target="_blank">Go's testing package
+documentation</a> and the <a href="http://golang.org/cmd/go/#hdr-Test_packages"
+target="_blank">go test help</a>.
+
+You are responsible for _unit testing_ your contribution when you add new or
+change existing Docker code. A unit test is a piece of code that invokes a
+single, small piece of code ( _unit of work_ ) to verify the unit works as
+expected.
+
+Depending on your contribution, you may need to add _integration tests_. These
+are tests that combine two or more work units into one component. These work
+units each have unit tests and then, together, integration tests that test the
+interface between the components. The `integration` and `integration-cli`
+directories in the Docker repository contain integration test code.
+
+Testing is its own speciality. If you aren't familiar with testing techniques,
+there is a lot of information available to you on the Web. For now, you should
+understand that, the Docker maintainers may ask you to write a new test or
+change an existing one.
+
+### Run tests on your local host
+
+Before submitting any code change, you should run the entire Docker test suite.
+The `Makefile` contains a target for the entire test suite. The target's name
+is simply `test`. The make file contains several targets for testing:
+
+<style type="text/css">
+.monospaced {font-family: Monaco, Consolas, "Lucida Console", monospace !important;}
+</style>
+<table>
+ <tr>
+ <th>Target</th>
+ <th>What this target does</th>
+ </tr>
+ <tr>
+ <td class="monospaced">test</td>
+ <td>Run all the tests.</td>
+ </tr>
+ <tr>
+ <td class="monospaced">test-unit</td>
+ <td>Run just the unit tests.</td>
+ </tr>
+ <tr>
+ <td class="monospaced">test-integration</td>
+ <td>Run just integration tests.</td>
+ </tr>
+ <tr>
+ <td class="monospaced">test-integration-cli</td>
+ <td>Run the test for the integration command line interface.</td>
+ </tr>
+ <tr>
+ <td class="monospaced">test-docker-py</td>
+ <td>Run the tests for Docker API client.</td>
+ </tr>
+ <tr>
+ <td class="monospaced">docs-test</td>
+ <td>Runs the documentation test build.</td>
+ </tr>
+</table>
+
+Run the entire test suite on your current repository:
+
+1. Open a terminal on your local host.
+
+2. Change to the root your Docker repository.
+
+ $ cd docker-fork
+
+3. Make sure you are in your development branch.
+
+ $ git checkout dry-run-test
+
+4. Run the `make test` command.
+
+ $ make test
+
+ This command does several things, it creates a container temporarily for
+ testing. Inside that container, the `make`:
+
+ * creates a new binary
+ * cross-compiles all the binaries for the various operating systems
+ * runs the all the tests in the system
+
+ It can take several minutes to run all the tests. When they complete
+ successfully, you see the output concludes with something like this:
+
+
+ [PASSED]: top - sleep process should be listed in privileged mode
+ [PASSED]: version - verify that it works and that the output is properly formatted
+ PASS
+ coverage: 70.8% of statements
+ ---> Making bundle: test-docker-py (in bundles/1.5.0-dev/test-docker-py)
+ +++ exec docker --daemon --debug --host unix:///go/src/github.com/docker/docker/bundles/1.5.0-dev/test-docker-py/docker.sock --storage-driver vfs --exec-driver native --pidfile /go/src/github.com/docker/docker/bundles/1.5.0-dev/test-docker-py/docker.pid
+ .................................................................
+ ----------------------------------------------------------------------
+ Ran 65 tests in 89.266s
+
+
+### Run test targets inside the development container
+
+If you are working inside a Docker development container, you use the
+`hack/make.sh` script to run tests. The `hack/make.sh` script doesn't
+have a single target that runs all the tests. Instead, you provide a single
+commmand line with multiple targets that does the same thing.
+
+Try this now.
+
+1. Open a terminal and change to the `docker-fork` root.
+
+2. Start a Docker development image.
+
+ If you are following along with this guide, you should have a
+ `dry-run-test` image.
+
+ $ docker run --privileged --rm -ti -v `pwd`:/go/src/github.com/docker/docker dry-run-test /bin/bash
+
+3. Run the tests using the `hack/make.sh` script.
+
+ root@5f8630b873fe:/go/src/github.com/docker/docker# hack/make.sh dynbinary binary cross test-unit test-integration test-integration-cli test-docker-py
+
+ The tests run just as they did within your local host.
+
+
+Of course, you can also run a subset of these targets too. For example, to run
+just the unit tests:
+
+ root@5f8630b873fe:/go/src/github.com/docker/docker# hack/make.sh dynbinary binary cross test-unit
+
+Most test targets require that you build these precursor targets first:
+`dynbinary binary cross`
+
+
+## Running individual or multiple named tests
+
+You can use the `TESTFLAGS` environment variable to run a single test. The
+flag's value is passed as arguments to the `go test` command. For example, from
+your local host you can run the `TestBuild` test with this command:
+
+ $ TESTFLAGS='-test.run ^TestBuild$' make test
+
+To run the same test inside your Docker development container, you do this:
+
+ root@5f8630b873fe:/go/src/github.com/docker/docker# TESTFLAGS='-run ^TestBuild$' hack/make.sh
+
+## If test under Boot2Docker fail do to space errors
+
+Running the tests requires about 2GB of memory. If you are running your
+container on bare metal, that is you are not running with Boot2Docker, your
+Docker development container is able to take the memory it requires directly
+from your local host.
+
+If you are running Docker using Boot2Docker, the VM uses 2048MB by default.
+This means you can exceed the memory of your VM running tests in a Boot2Docker
+environment. When the test suite runs out of memory, it returns errors similar
+to the following:
+
+ server.go:1302 Error: Insertion failed because database is full: database or
+ disk is full
+
+ utils_test.go:179: Error copy: exit status 1 (cp: writing
+ '/tmp/docker-testd5c9-[...]': No space left on device
+
+To increase the memory on your VM, you need to reinitialize the Boot2Docker VM
+with new memory settings.
+
+1. Stop all running containers.
+
+2. View the current memory setting.
+
+ $ boot2docker info
+ {
+ "Name": "boot2docker-vm",
+ "UUID": "491736fd-4075-4be7-a6f5-1d4cdcf2cc74",
+ "Iso": "/Users/mary/.boot2docker/boot2docker.iso",
+ "State": "running",
+ "CPUs": 8,
+ "Memory": 2048,
+ "VRAM": 8,
+ "CfgFile": "/Users/mary/VirtualBox VMs/boot2docker-vm/boot2docker-vm.vbox",
+ "BaseFolder": "/Users/mary/VirtualBox VMs/boot2docker-vm",
+ "OSType": "",
+ "Flag": 0,
+ "BootOrder": null,
+ "DockerPort": 0,
+ "SSHPort": 2022,
+ "SerialFile": "/Users/mary/.boot2docker/boot2docker-vm.sock"
+ }
+
+
+3. Delete your existing `boot2docker` profile.
+
+ $ boot2docker delete
+
+4. Reinitialize `boot2docker` and specify a higher memory.
+
+ $ boot2docker init -m 5555
+
+5. Verify the memory was reset.
+
+ $ boot2docker info
+
+6. Restart your container and try your test again.
+
+
+## Build and test the documentation
+
+The Docker documentation source files are under `docs/sources`. The content is
+written using extended Markdown. We use the static generator <a
+href="http://www.mkdocs.org/" target="_blank">MkDocs</a> to build Docker's
+documentation. Of course, you don't need to install this generator
+to build the documentation, it is included with container.
+
+You should always check your documentation for grammar and spelling. The best
+way to do this is with <a href="http://www.hemingwayapp.com/"
+target="_blank">an online grammar checker</a>.
+
+When you change a documentation source file, you should test your change
+locally to make sure your content is there and any links work correctly. You
+can build the documentation from the local host. The build starts a container
+and loads the documentation into a server. As long as this container runs, you
+can browse the docs.
+
+1. In a terminal, change to the root of your `docker-fork` repository.
+
+ $ cd ~/repos/dry-run-test
+
+2. Make sure you are in your feature branch.
+
+ $ git status
+ On branch dry-run-test
+ Your branch is up-to-date with 'origin/dry-run-test'.
+ nothing to commit, working directory clean
+
+3. Build the documentation.
+
+ $ make docs
+
+ When the build completes, you'll see a final output message similar to the
+ following:
+
+ Successfully built ee7fe7553123
+ docker run --rm -it -e AWS_S3_BUCKET -e NOCACHE -p 8000:8000 "docker-docs:dry-run-test" mkdocs serve
+ Running at: http://0.0.0.0:8000/
+ Live reload enabled.
+ Hold ctrl+c to quit.
+
+4. Enter the URL in your browser.
+
+ If you are running Boot2Docker, replace the default localhost address
+ (0.0.0.0) with your DOCKERHOST value. You can get this value at any time by
+ entering `boot2docker ip` at the command line.
+
+5. Once in the documentation, look for the red notice to verify you are seeing the correct build.
+
+ ![Beta documentation](/project/images/red_notice.png)
+
+6. Navigate to your new or changed document.
+
+7. Review both the content and the links.
+
+8. Return to your terminal and exit out of the running documentation container.
+
+
+## Where to go next
+
+Congratulations, you have successfully completed the basics you need to
+understand the Docker test framework. In the next steps, you use what you have
+learned so far to [contribute to Docker by working on an
+issue](/project/make-a-contribution/).
diff --git a/docs/sources/project/who-written-for.md b/docs/sources/project/who-written-for.md
new file mode 100644
index 0000000000..e3b761a460
--- /dev/null
+++ b/docs/sources/project/who-written-for.md
@@ -0,0 +1,57 @@
+page_title: README first
+page_description: Introduction to project contribution at Docker
+page_keywords: Gordon, introduction, turtle, machine, libcontainer, how to
+
+# README first
+
+This section of the documentation contains a guide for Docker users who want to
+contribute code or documentation to the Docker project. As a community, we
+share rules of behavior and interaction. Make sure you are familiar with the <a
+href="https://github.com/docker/docker/blob/master/CONTRIBUTING.md#docker-community-guidelines"
+target="_blank">community guidelines</a> before continuing.
+
+## Where and what you can contribute
+
+The Docker project consists of not just one but several repositories on GitHub.
+So, in addition to the `docker/docker` repository, there is the
+`docker/libcontainer` repo, the `docker/machine` repo, and several more.
+Contribute to any of these and you contribute to the Docker project.
+
+Not all Docker repositories use the Go language. Also, each repository has its
+own focus area. So, if you are an experienced contributor, think about
+contributing to a Docker repository that has a language or a focus area you are
+familiar with.
+
+If you are new to the open source community, to Docker, or to formal
+programming, you should start out contributing to the `docker/docker`
+repository. Why? Because this guide is written for that repository specifically.
+
+Finally, code or documentation isn't the only way to contribute. You can report
+an issue, add to discussions in our community channel, write a blog post, or
+take a usability test. You can even propose your own type of contribution.
+Right now we don't have a lot written about this yet, so just email
+<mailto:feedback@docker.com> if this type of contributing interests you.
+
+## A turtle is involved
+
+![Gordon](/project/images/gordon.jpeg)
+
+Enough said.
+
+## How to use this guide
+
+This is written for the distracted, the overworked, the sloppy reader with fair
+`git` skills and a failing memory for the GitHub GUI. The guide attempts to
+explain how to use the Docker environment as precisely, predictably, and
+procedurally as possible.
+
+Users who are new to the Docker development environment should start by setting
+up their environment. Then, they should try a simple code change. After that,
+you should find something to work on or propose at totally new change.
+
+If you are a programming prodigy, you still may find this documentation useful.
+Please feel free to skim past information you find obvious or boring.
+
+## How to get started
+
+Start by [getting the software you need to contribute](/project/software-required/).
diff --git a/docs/sources/project/work-issue.md b/docs/sources/project/work-issue.md
new file mode 100644
index 0000000000..190cec0557
--- /dev/null
+++ b/docs/sources/project/work-issue.md
@@ -0,0 +1,203 @@
+page_title: Work on your issue
+page_description: Basic workflow for Docker contributions
+page_keywords: contribute, pull request, review, workflow, beginner, squash, commit
+
+
+# Work on your issue
+
+The work you do for your issue depends on the specific issue you picked.
+This section gives you a step-by-step workflow. Where appropriate, it provides
+command examples.
+
+However, this is a generalized workflow, depending on your issue you may repeat
+steps or even skip some. How much time the work takes depends on you --- you
+could spend days or 30 minutes of your time.
+
+## How to work on your local branch
+
+Follow this workflow as you work:
+
+1. Review the appropriate style guide.
+
+ If you are changing code, review the <a href="../coding-style"
+ target="_blank">coding style guide</a>. Changing documentation? Review the
+ <a href="../doc-style" target="_blank">documentation style guide</a>.
+
+2. Make changes in your feature branch.
+
+ Your feature branch you created in the last section. Here you use the
+ development container. If you are making a code change, you can mount your
+ source into a development container and iterate that way. For documentation
+ alone, you can work on your local host.
+
+ Review <a href="../set-up-dev-env" target="_blank">if you forgot the details
+ of working with a container</a>.
+
+
+3. Test your changes as you work.
+
+ If you have followed along with the guide, you know the `make test` target
+ runs the entire test suite and `make docs` builds the documentation. If you
+ forgot the other test targets, see the documentation for <a
+ href="../test-and-docs" target="_blank">testing both code and
+ documentation</a>.
+
+4. For code changes, add unit tests if appropriate.
+
+ If you add new functionality or change existing functionality, you should
+ add a unit test also. Use the existing test files for inspiration. Aren't
+ sure if you need tests? Skip this step; you can add them later in the
+ process if necessary.
+
+5. Format your source files correctly.
+
+ <table>
+ <thead>
+ <tr>
+ <th>File type</th>
+ <th>How to format</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td><code>.go</code></td>
+ <td>
+ <p>
+ Format <code>.go</code> files using the <code>gofmt</code> command.
+ For example, if you edited the `docker.go` file you would format the file
+ like this:
+ </p>
+ <p><code>$ gofmt -s -w file.go</code></p>
+ <p>
+ Most file editors have a plugin to format for you. Check your editor's
+ documentation.
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td style="white-space: nowrap"><code>.md</code> and non-<code>.go</code> files</td>
+ <td>Wrap lines to 80 characters.</td>
+ </tr>
+ </tbody>
+ </table>
+
+6. List your changes.
+
+ $ git status
+ On branch 11038-fix-rhel-link
+ Changes not staged for commit:
+ (use "git add <file>..." to update what will be committed)
+ (use "git checkout -- <file>..." to discard changes in working directory)
+
+ modified: docs/sources/installation/mac.md
+ modified: docs/sources/installation/rhel.md
+
+ The `status` command lists what changed in the repository. Make sure you see
+ the changes you expect.
+
+7. Add your change to Git.
+
+ $ git add docs/sources/installation/mac.md
+ $ git add docs/sources/installation/rhel.md
+
+
+8. Commit your changes making sure you use the `-s` flag to sign your work.
+
+ $ git commit -s -m "Fixing RHEL link"
+
+9. Push your change to your repository.
+
+ $ git push origin
+ Username for 'https://github.com': moxiegirl
+ Password for 'https://moxiegirl@github.com':
+ Counting objects: 60, done.
+ Compressing objects: 100% (7/7), done.
+ Writing objects: 100% (7/7), 582 bytes | 0 bytes/s, done.
+ Total 7 (delta 6), reused 0 (delta 0)
+ To https://github.com/moxiegirl/docker.git
+ * [new branch] 11038-fix-rhel-link -> 11038-fix-rhel-link
+ Branch 11038-fix-rhel-link set up to track remote branch 11038-fix-rhel-link from origin.
+
+ The first time you push a change, you must specify the branch. Later, you can just do this:
+
+ git push origin
+
+## Review your branch on GitHub
+
+After you push a new branch, you should verify it on GitHub:
+
+1. Open your browser to <a href="https://github.com" target="_blank">GitHub</a>.
+
+2. Go to your Docker fork.
+
+3. Select your branch from the dropdown.
+
+ ![Find branch](/project/images/locate_branch.png)
+
+4. Use the "Compare" button to compare the differences between your branch and master.
+
+ Depending how long you've been working on your branch, your branch maybe
+ behind Docker's upstream repository.
+
+5. Review the commits.
+
+ Make sure your branch only shows the work you've done.
+
+## Pull and rebase frequently
+
+You should pull and rebase frequently as you work.
+
+1. Return to the terminal on your local machine.
+
+2. Make sure you are in your branch.
+
+ $ git branch 11038-fix-rhel-link
+
+3. Fetch all the changes from the `upstream/master` branch.
+
+ $ git fetch upstream/master
+
+ This command says get all the changes from the `master` branch belonging to
+ the `upstream` remote.
+
+4. Rebase your local master with Docker's `upstream/master` branch.
+
+ $ git rebase -i upstream/master
+
+ This command starts an interactive rebase to merge code from Docker's
+ `upstream/master` branch into your local branch. If you aren't familiar or
+ comfortable with rebase, you can <a
+ href="http://nathanleclaire.com/blog/2014/09/14/dont-be-scared-of-git-
+ rebase" target="_blank">learn more about rebasing</a> on the web.
+
+5. Rebase opens an editor with a list of commits.
+
+ pick 1a79f55 Tweak some of the other text for grammar
+ pick 53e4983 Fix a link
+ pick 3ce07bb Add a new line about RHEL
+
+ If you run into trouble, `git --rebase abort` removes any changes and gets
+ you back to where you started.
+
+6. Squash the `pick` keyword with `squash` on all but the first commit.
+
+ pick 1a79f55 Tweak some of the other text for grammar
+ squash 53e4983 Fix a link
+ squash 3ce07bb Add a new line about RHEL
+
+ After closing the file, `git` opens your editor again to edit the commit
+ message.
+
+7. Edit and save your commit message.
+
+ Make sure you include your signature.
+
+8. Push any changes to your fork on GitHub.
+
+ $ git push origin 11038-fix-rhel-link
+
+
+## Where to go next
+
+At this point, you should understand how to work on an issue. In the next
+section, you [learn how to make a pull request](/project/create-pr/).
diff --git a/docs/sources/reference/api/docker_remote_api.md b/docs/sources/reference/api/docker_remote_api.md
index 30448b040d..3da4cc82d5 100644
--- a/docs/sources/reference/api/docker_remote_api.md
+++ b/docs/sources/reference/api/docker_remote_api.md
@@ -30,13 +30,56 @@ page_keywords: API, Docker, rcli, REST, documentation
Client applications need to take this into account to ensure
they will not break when talking to newer Docker daemons.
-The current version of the API is v1.17
+The current version of the API is v1.18
Calling `/info` is the same as calling
-`/v1.17/info`.
+`/v1.18/info`.
You can still call an old version of the API using
-`/v1.16/info`.
+`/v1.17/info`.
+
+## v1.18
+
+### Full Documentation
+
+[*Docker Remote API v1.18*](/reference/api/docker_remote_api_v1.18/)
+
+### What's new
+
+`GET /version`
+
+**New!**
+This endpoint now returns `Os`, `Arch` and `KernelVersion`.
+
+`POST /containers/create`
+`POST /containers/(id)/start`
+
+**New!**
+You can set ulimit settings to be used within the container.
+
+`GET /info`
+
+**New!**
+This endpoint now returns `SystemTime`, `HttpProxy`,`HttpsProxy` and `NoProxy`.
+
+`GET /images/json`
+
+**New!**
+Added a `RepoDigests` field to include image digest information.
+
+`POST /build`
+
+**New!**
+Builds can now set resource constraints for all containers created for the build.
+
+**New!**
+(`CgroupParent`) can be passed in the host config to setup container cgroups under a specific cgroup.
+
+
+`POST /build`
+
+**New!**
+Closing the HTTP request will now cause the build to be canceled.
## v1.17
@@ -46,15 +89,32 @@ You can still call an old version of the API using
### What's new
+The build supports `LABEL` command. Use this to add metadata
+to an image. For example you could add data describing the content of an image.
+
+`LABEL "com.example.vendor"="ACME Incorporated"`
+
+**New!**
`POST /containers/(id)/attach` and `POST /exec/(id)/start`
**New!**
Docker client now hints potential proxies about connection hijacking using HTTP Upgrade headers.
+`POST /containers/create`
+
+**New!**
+You can set labels on container create describing the container.
+
+`GET /containers/json`
+
+**New!**
+The endpoint returns the labels associated with the containers (`Labels`).
+
`GET /containers/(id)/json`
**New!**
This endpoint now returns the list current execs associated with the container (`ExecIDs`).
+This endpoint now returns the container labels (`Config.Labels`).
`POST /containers/(id)/rename`
@@ -73,7 +133,10 @@ root filesystem as read only.
**New!**
This endpoint returns a live stream of a container's resource usage statistics.
-> **Note**: this functionality currently only works when using the *libcontainer* exec-driver.
+`GET /images/json`
+
+**New!**
+This endpoint now returns the labels associated with each image (`Labels`).
## v1.16
diff --git a/docs/sources/reference/api/docker_remote_api_v1.17.md b/docs/sources/reference/api/docker_remote_api_v1.17.md
index 955ae8fb54..96887559c2 100644
--- a/docs/sources/reference/api/docker_remote_api_v1.17.md
+++ b/docs/sources/reference/api/docker_remote_api_v1.17.md
@@ -177,7 +177,8 @@ Json Parameters:
for the container.
- **User** - A string value containg the user to use inside the container.
- **Memory** - Memory limit in bytes.
-- **MemorySwap**- Total memory usage (memory + swap); set `-1` to disable swap.
+- **MemorySwap**- Total memory limit (memory + swap); set `-1` to disable swap,
+ always use this with `memory`, and make the value larger than `memory`.
- **CpuShares** - An integer value containing the CPU Shares for container
(ie. the relative weight vs othercontainers).
**CpuSet** - String value containg the cgroups Cpuset to use.
@@ -523,8 +524,6 @@ Status Codes:
This endpoint returns a live stream of a container's resource usage statistics.
-> **Note**: this functionality currently only works when using the *libcontainer* exec-driver.
-
**Example request**:
GET /containers/redis1/stats HTTP/1.1
@@ -1969,7 +1968,7 @@ This might change in the future.
## 3.3 CORS Requests
-To enable cross origin requests to the remote api add the flag
-"--api-enable-cors" when running docker in daemon mode.
+To set cross origin requests to the remote api, please add flag "--api-enable-cors"
+when running docker in daemon mode.
- $ docker -d -H="192.168.1.9:2375" --api-enable-cors
+ $ docker -d -H="192.168.1.9:2375" --api-enable-cors
diff --git a/docs/sources/reference/api/docker_remote_api_v1.18.md b/docs/sources/reference/api/docker_remote_api_v1.18.md
new file mode 100644
index 0000000000..ee89ccb025
--- /dev/null
+++ b/docs/sources/reference/api/docker_remote_api_v1.18.md
@@ -0,0 +1,2067 @@
+page_title: Remote API v1.18
+page_description: API Documentation for Docker
+page_keywords: API, Docker, rcli, REST, documentation
+
+# Docker Remote API v1.18
+
+## 1. Brief introduction
+
+ - The Remote API has replaced `rcli`.
+ - The daemon listens on `unix:///var/run/docker.sock` but you can
+ [Bind Docker to another host/port or a Unix socket](
+ /articles/basics/#bind-docker-to-another-hostport-or-a-unix-socket).
+ - The API tends to be REST, but for some complex commands, like `attach`
+ or `pull`, the HTTP connection is hijacked to transport `STDOUT`,
+ `STDIN` and `STDERR`.
+
+# 2. Endpoints
+
+## 2.1 Containers
+
+### List containers
+
+`GET /containers/json`
+
+List containers
+
+**Example request**:
+
+ GET /containers/json?all=1&before=8dfafdbc3a40&size=1 HTTP/1.1
+
+**Example response**:
+
+ HTTP/1.1 200 OK
+ Content-Type: application/json
+
+ [
+ {
+ "Id": "8dfafdbc3a40",
+ "Image": "ubuntu:latest",
+ "Command": "echo 1",
+ "Created": 1367854155,
+ "Status": "Exit 0",
+ "Ports": [{"PrivatePort": 2222, "PublicPort": 3333, "Type": "tcp"}],
+ "SizeRw": 12288,
+ "SizeRootFs": 0
+ },
+ {
+ "Id": "9cd87474be90",
+ "Image": "ubuntu:latest",
+ "Command": "echo 222222",
+ "Created": 1367854155,
+ "Status": "Exit 0",
+ "Ports": [],
+ "SizeRw": 12288,
+ "SizeRootFs": 0
+ },
+ {
+ "Id": "3176a2479c92",
+ "Image": "ubuntu:latest",
+ "Command": "echo 3333333333333333",
+ "Created": 1367854154,
+ "Status": "Exit 0",
+ "Ports":[],
+ "SizeRw":12288,
+ "SizeRootFs":0
+ },
+ {
+ "Id": "4cb07b47f9fb",
+ "Image": "ubuntu:latest",
+ "Command": "echo 444444444444444444444444444444444",
+ "Created": 1367854152,
+ "Status": "Exit 0",
+ "Ports": [],
+ "SizeRw": 12288,
+ "SizeRootFs": 0
+ }
+ ]
+
+Query Parameters:
+
+- **all** – 1/True/true or 0/False/false, Show all containers.
+ Only running containers are shown by default (i.e., this defaults to false)
+- **limit** – Show `limit` last created
+ containers, include non-running ones.
+- **since** – Show only containers created since Id, include
+ non-running ones.
+- **before** – Show only containers created before Id, include
+ non-running ones.
+- **size** – 1/True/true or 0/False/false, Show the containers
+ sizes
+- **filters** - a json encoded value of the filters (a map[string][]string) to process on the containers list. Available filters:
+ - exited=&lt;int&gt; -- containers with exit code of &lt;int&gt;
+ - status=(restarting|running|paused|exited)
+
+Status Codes:
+
+- **200** – no error
+- **400** – bad parameter
+- **500** – server error
+
+### Create a container
+
+`POST /containers/create`
+
+Create a container
+
+**Example request**:
+
+ POST /containers/create HTTP/1.1
+ Content-Type: application/json
+
+ {
+ "Hostname": "",
+ "Domainname": "",
+ "User": "",
+ "AttachStdin": false,
+ "AttachStdout": true,
+ "AttachStderr": true,
+ "Tty": false,
+ "OpenStdin": false,
+ "StdinOnce": false,
+ "Env": null,
+ "Cmd": [
+ "date"
+ ],
+ "Entrypoint": "",
+ "Image": "ubuntu",
+ "Labels": {
+ "com.example.vendor": "Acme",
+ "com.example.license": "GPL",
+ "com.example.version": "1.0"
+ },
+ "Volumes": {
+ "/tmp": {}
+ },
+ "WorkingDir": "",
+ "NetworkDisabled": false,
+ "MacAddress": "12:34:56:78:9a:bc",
+ "ExposedPorts": {
+ "22/tcp": {}
+ },
+ "SecurityOpts": [""],
+ "HostConfig": {
+ "Binds": ["/tmp:/tmp"],
+ "Links": ["redis3:redis"],
+ "LxcConf": {"lxc.utsname":"docker"},
+ "Memory": 0,
+ "MemorySwap": 0,
+ "CpuShares": 512,
+ "CpusetCpus": "0,1",
+ "PortBindings": { "22/tcp": [{ "HostPort": "11022" }] },
+ "PublishAllPorts": false,
+ "Privileged": false,
+ "ReadonlyRootfs": false,
+ "Dns": ["8.8.8.8"],
+ "DnsSearch": [""],
+ "ExtraHosts": null,
+ "VolumesFrom": ["parent", "other:ro"],
+ "CapAdd": ["NET_ADMIN"],
+ "CapDrop": ["MKNOD"],
+ "RestartPolicy": { "Name": "", "MaximumRetryCount": 0 },
+ "NetworkMode": "bridge",
+ "Devices": [],
+ "Ulimits": [{}],
+ "LogConfig": { "Type": "json-file", Config: {} },
+ "CgroupParent": ""
+ }
+ }
+
+**Example response**:
+
+ HTTP/1.1 201 Created
+ Content-Type: application/json
+
+ {
+ "Id":"e90e34656806"
+ "Warnings":[]
+ }
+
+Json Parameters:
+
+- **Hostname** - A string value containing the desired hostname to use for the
+ container.
+- **Domainname** - A string value containing the desired domain name to use
+ for the container.
+- **User** - A string value containg the user to use inside the container.
+- **Memory** - Memory limit in bytes.
+- **MemorySwap**- Total memory limit (memory + swap); set `-1` to disable swap,
+ always use this with `memory`, and make the value larger than `memory`.
+- **CpuShares** - An integer value containing the CPU Shares for container
+ (ie. the relative weight vs othercontainers).
+- **Cpuset** - The same as CpusetCpus, but deprecated, please don't use.
+- **CpusetCpus** - String value containg the cgroups CpusetCpus to use.
+- **AttachStdin** - Boolean value, attaches to stdin.
+- **AttachStdout** - Boolean value, attaches to stdout.
+- **AttachStderr** - Boolean value, attaches to stderr.
+- **Tty** - Boolean value, Attach standard streams to a tty, including stdin if it is not closed.
+- **OpenStdin** - Boolean value, opens stdin,
+- **StdinOnce** - Boolean value, close stdin after the 1 attached client disconnects.
+- **Env** - A list of environment variables in the form of `VAR=value`
+- **Labels** - Adds a map of labels that to a container. To specify a map: `{"key":"value"[,"key2":"value2"]}`
+- **Cmd** - Command to run specified as a string or an array of strings.
+- **Entrypoint** - Set the entrypoint for the container a a string or an array
+ of strings
+- **Image** - String value containing the image name to use for the container
+- **Volumes** – An object mapping mountpoint paths (strings) inside the
+ container to empty objects.
+- **WorkingDir** - A string value containing the working dir for commands to
+ run in.
+- **NetworkDisabled** - Boolean value, when true disables neworking for the
+ container
+- **ExposedPorts** - An object mapping ports to an empty object in the form of:
+ `"ExposedPorts": { "<port>/<tcp|udp>: {}" }`
+- **SecurityOpts**: A list of string values to customize labels for MLS
+ systems, such as SELinux.
+- **HostConfig**
+ - **Binds** – A list of volume bindings for this container. Each volume
+ binding is a string of the form `container_path` (to create a new
+ volume for the container), `host_path:container_path` (to bind-mount
+ a host path into the container), or `host_path:container_path:ro`
+ (to make the bind-mount read-only inside the container).
+ - **Links** - A list of links for the container. Each link entry should be of
+ of the form "container_name:alias".
+ - **LxcConf** - LXC specific configurations. These configurations will only
+ work when using the `lxc` execution driver.
+ - **PortBindings** - A map of exposed container ports and the host port they
+ should map to. It should be specified in the form
+ `{ <port>/<protocol>: [{ "HostPort": "<port>" }] }`
+ Take note that `port` is specified as a string and not an integer value.
+ - **PublishAllPorts** - Allocates a random host port for all of a container's
+ exposed ports. Specified as a boolean value.
+ - **Privileged** - Gives the container full access to the host. Specified as
+ a boolean value.
+ - **ReadonlyRootfs** - Mount the container's root filesystem as read only.
+ Specified as a boolean value.
+ - **Dns** - A list of dns servers for the container to use.
+ - **DnsSearch** - A list of DNS search domains
+ - **ExtraHosts** - A list of hostnames/IP mappings to be added to the
+ container's `/etc/hosts` file. Specified in the form `["hostname:IP"]`.
+ - **VolumesFrom** - A list of volumes to inherit from another container.
+ Specified in the form `<container name>[:<ro|rw>]`
+ - **CapAdd** - A list of kernel capabilties to add to the container.
+ - **Capdrop** - A list of kernel capabilties to drop from the container.
+ - **RestartPolicy** – The behavior to apply when the container exits. The
+ value is an object with a `Name` property of either `"always"` to
+ always restart or `"on-failure"` to restart only when the container
+ exit code is non-zero. If `on-failure` is used, `MaximumRetryCount`
+ controls the number of times to retry before giving up.
+ The default is not to restart. (optional)
+ An ever increasing delay (double the previous delay, starting at 100mS)
+ is added before each restart to prevent flooding the server.
+ - **NetworkMode** - Sets the networking mode for the container. Supported
+ values are: `bridge`, `host`, and `container:<name|id>`
+ - **Devices** - A list of devices to add to the container specified in the
+ form
+ `{ "PathOnHost": "/dev/deviceName", "PathInContainer": "/dev/deviceName", "CgroupPermissions": "mrw"}`
+ - **Ulimits** - A list of ulimits to be set in the container, specified as
+ `{ "Name": <name>, "Soft": <soft limit>, "Hard": <hard limit> }`, for example:
+ `Ulimits: { "Name": "nofile", "Soft": 1024, "Hard", 2048 }}`
+ - **LogConfig** - Logging configuration to container, format
+ `{ "Type": "<driver_name>", "Config": {"key1": "val1"}}
+ Available types: `json-file`, `syslog`, `none`.
+ `json-file` logging driver.
+ - **CgroupParent** - Path to cgroups under which the cgroup for the container will be created. If the path is not absolute, the path is considered to be relative to the cgroups path of the init process. Cgroups will be created if they do not already exist.
+
+Query Parameters:
+
+- **name** – Assign the specified name to the container. Must
+ match `/?[a-zA-Z0-9_-]+`.
+
+Status Codes:
+
+- **201** – no error
+- **404** – no such container
+- **406** – impossible to attach (container not running)
+- **500** – server error
+
+### Inspect a container
+
+`GET /containers/(id)/json`
+
+Return low-level information on the container `id`
+
+
+**Example request**:
+
+ GET /containers/4fa6e0f0c678/json HTTP/1.1
+
+**Example response**:
+
+ HTTP/1.1 200 OK
+ Content-Type: application/json
+
+ {
+ "AppArmorProfile": "",
+ "Args": [
+ "-c",
+ "exit 9"
+ ],
+ "Config": {
+ "AttachStderr": true,
+ "AttachStdin": false,
+ "AttachStdout": true,
+ "Cmd": [
+ "/bin/sh",
+ "-c",
+ "exit 9"
+ ],
+ "Domainname": "",
+ "Entrypoint": null,
+ "Env": [
+ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
+ ],
+ "ExposedPorts": null,
+ "Hostname": "ba033ac44011",
+ "Image": "ubuntu",
+ "Labels": {
+ "com.example.vendor": "Acme",
+ "com.example.license": "GPL",
+ "com.example.version": "1.0"
+ },
+ "MacAddress": "",
+ "NetworkDisabled": false,
+ "OnBuild": null,
+ "OpenStdin": false,
+ "PortSpecs": null,
+ "StdinOnce": false,
+ "Tty": false,
+ "User": "",
+ "Volumes": null,
+ "WorkingDir": ""
+ },
+ "Created": "2015-01-06T15:47:31.485331387Z",
+ "Driver": "devicemapper",
+ "ExecDriver": "native-0.2",
+ "ExecIDs": null,
+ "HostConfig": {
+ "Binds": null,
+ "CapAdd": null,
+ "CapDrop": null,
+ "ContainerIDFile": "",
+ "CpusetCpus": "",
+ "CpuShares": 0,
+ "Devices": [],
+ "Dns": null,
+ "DnsSearch": null,
+ "ExtraHosts": null,
+ "IpcMode": "",
+ "Links": null,
+ "LxcConf": [],
+ "Memory": 0,
+ "MemorySwap": 0,
+ "NetworkMode": "bridge",
+ "PortBindings": {},
+ "Privileged": false,
+ "ReadonlyRootfs": false,
+ "PublishAllPorts": false,
+ "RestartPolicy": {
+ "MaximumRetryCount": 2,
+ "Name": "on-failure"
+ },
+ "LogConfig": {
+ "Config": null,
+ "Type": "json-file"
+ },
+ "SecurityOpt": null,
+ "VolumesFrom": null,
+ "Ulimits": [{}]
+ },
+ "HostnamePath": "/var/lib/docker/containers/ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39/hostname",
+ "HostsPath": "/var/lib/docker/containers/ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39/hosts",
+ "LogPath": "/var/lib/docker/containers/1eb5fabf5a03807136561b3c00adcd2992b535d624d5e18b6cdc6a6844d9767b/1eb5fabf5a03807136561b3c00adcd2992b535d624d5e18b6cdc6a6844d9767b-json.log",
+ "Id": "ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39",
+ "Image": "04c5d3b7b0656168630d3ba35d8889bd0e9caafcaeb3004d2bfbc47e7c5d35d2",
+ "MountLabel": "",
+ "Name": "/boring_euclid",
+ "NetworkSettings": {
+ "Bridge": "",
+ "Gateway": "",
+ "IPAddress": "",
+ "IPPrefixLen": 0,
+ "MacAddress": "",
+ "PortMapping": null,
+ "Ports": null
+ },
+ "Path": "/bin/sh",
+ "ProcessLabel": "",
+ "ResolvConfPath": "/var/lib/docker/containers/ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39/resolv.conf",
+ "RestartCount": 1,
+ "State": {
+ "Error": "",
+ "ExitCode": 9,
+ "FinishedAt": "2015-01-06T15:47:32.080254511Z",
+ "OOMKilled": false,
+ "Paused": false,
+ "Pid": 0,
+ "Restarting": false,
+ "Running": false,
+ "StartedAt": "2015-01-06T15:47:32.072697474Z"
+ },
+ "Volumes": {},
+ "VolumesRW": {}
+ }
+
+Status Codes:
+
+- **200** – no error
+- **404** – no such container
+- **500** – server error
+
+### List processes running inside a container
+
+`GET /containers/(id)/top`
+
+List processes running inside the container `id`
+
+**Example request**:
+
+ GET /containers/4fa6e0f0c678/top HTTP/1.1
+
+**Example response**:
+
+ HTTP/1.1 200 OK
+ Content-Type: application/json
+
+ {
+ "Titles": [
+ "USER",
+ "PID",
+ "%CPU",
+ "%MEM",
+ "VSZ",
+ "RSS",
+ "TTY",
+ "STAT",
+ "START",
+ "TIME",
+ "COMMAND"
+ ],
+ "Processes": [
+ ["root","20147","0.0","0.1","18060","1864","pts/4","S","10:06","0:00","bash"],
+ ["root","20271","0.0","0.0","4312","352","pts/4","S+","10:07","0:00","sleep","10"]
+ ]
+ }
+
+Query Parameters:
+
+- **ps_args** – ps arguments to use (e.g., aux)
+
+Status Codes:
+
+- **200** – no error
+- **404** – no such container
+- **500** – server error
+
+### Get container logs
+
+`GET /containers/(id)/logs`
+
+Get stdout and stderr logs from the container ``id``
+
+> **Note**:
+> This endpoint works only for containers with `json-file` logging driver.
+
+**Example request**:
+
+ GET /containers/4fa6e0f0c678/logs?stderr=1&stdout=1&timestamps=1&follow=1&tail=10 HTTP/1.1
+
+**Example response**:
+
+ HTTP/1.1 101 UPGRADED
+ Content-Type: application/vnd.docker.raw-stream
+ Connection: Upgrade
+ Upgrade: tcp
+
+ {{ STREAM }}
+
+Query Parameters:
+
+- **follow** – 1/True/true or 0/False/false, return stream. Default false
+- **stdout** – 1/True/true or 0/False/false, show stdout log. Default false
+- **stderr** – 1/True/true or 0/False/false, show stderr log. Default false
+- **timestamps** – 1/True/true or 0/False/false, print timestamps for
+ every log line. Default false
+- **tail** – Output specified number of lines at the end of logs: `all` or `<number>`. Default all
+
+Status Codes:
+
+- **101** – no error, hints proxy about hijacking
+- **200** – no error, no upgrade header found
+- **404** – no such container
+- **500** – server error
+
+### Inspect changes on a container's filesystem
+
+`GET /containers/(id)/changes`
+
+Inspect changes on container `id`'s filesystem
+
+**Example request**:
+
+ GET /containers/4fa6e0f0c678/changes HTTP/1.1
+
+**Example response**:
+
+ HTTP/1.1 200 OK
+ Content-Type: application/json
+
+ [
+ {
+ "Path": "/dev",
+ "Kind": 0
+ },
+ {
+ "Path": "/dev/kmsg",
+ "Kind": 1
+ },
+ {
+ "Path": "/test",
+ "Kind": 1
+ }
+ ]
+
+Values for `Kind`:
+
+- `0`: Modify
+- `1`: Add
+- `2`: Delete
+
+Status Codes:
+
+- **200** – no error
+- **404** – no such container
+- **500** – server error
+
+### Export a container
+
+`GET /containers/(id)/export`
+
+Export the contents of container `id`
+
+**Example request**:
+
+ GET /containers/4fa6e0f0c678/export HTTP/1.1
+
+**Example response**:
+
+ HTTP/1.1 200 OK
+ Content-Type: application/octet-stream
+
+ {{ TAR STREAM }}
+
+Status Codes:
+
+- **200** – no error
+- **404** – no such container
+- **500** – server error
+
+### Get container stats based on resource usage
+
+`GET /containers/(id)/stats`
+
+This endpoint returns a live stream of a container's resource usage statistics.
+
+> **Note**: this functionality currently only works when using the *libcontainer* exec-driver.
+
+**Example request**:
+
+ GET /containers/redis1/stats HTTP/1.1
+
+**Example response**:
+
+ HTTP/1.1 200 OK
+ Content-Type: application/json
+
+ {
+ "read" : "2015-01-08T22:57:31.547920715Z",
+ "network" : {
+ "rx_dropped" : 0,
+ "rx_bytes" : 648,
+ "rx_errors" : 0,
+ "tx_packets" : 8,
+ "tx_dropped" : 0,
+ "rx_packets" : 8,
+ "tx_errors" : 0,
+ "tx_bytes" : 648
+ },
+ "memory_stats" : {
+ "stats" : {
+ "total_pgmajfault" : 0,
+ "cache" : 0,
+ "mapped_file" : 0,
+ "total_inactive_file" : 0,
+ "pgpgout" : 414,
+ "rss" : 6537216,
+ "total_mapped_file" : 0,
+ "writeback" : 0,
+ "unevictable" : 0,
+ "pgpgin" : 477,
+ "total_unevictable" : 0,
+ "pgmajfault" : 0,
+ "total_rss" : 6537216,
+ "total_rss_huge" : 6291456,
+ "total_writeback" : 0,
+ "total_inactive_anon" : 0,
+ "rss_huge" : 6291456,
+ "hierarchical_memory_limit" : 67108864,
+ "total_pgfault" : 964,
+ "total_active_file" : 0,
+ "active_anon" : 6537216,
+ "total_active_anon" : 6537216,
+ "total_pgpgout" : 414,
+ "total_cache" : 0,
+ "inactive_anon" : 0,
+ "active_file" : 0,
+ "pgfault" : 964,
+ "inactive_file" : 0,
+ "total_pgpgin" : 477
+ },
+ "max_usage" : 6651904,
+ "usage" : 6537216,
+ "failcnt" : 0,
+ "limit" : 67108864
+ },
+ "blkio_stats" : {},
+ "cpu_stats" : {
+ "cpu_usage" : {
+ "percpu_usage" : [
+ 16970827,
+ 1839451,
+ 7107380,
+ 10571290
+ ],
+ "usage_in_usermode" : 10000000,
+ "total_usage" : 36488948,
+ "usage_in_kernelmode" : 20000000
+ },
+ "system_cpu_usage" : 20091722000000000,
+ "throttling_data" : {}
+ }
+ }
+
+Status Codes:
+
+- **200** – no error
+- **404** – no such container
+- **500** – server error
+
+### Resize a container TTY
+
+`POST /containers/(id)/resize?h=<height>&w=<width>`
+
+Resize the TTY for container with `id`. The container must be restarted for the resize to take effect.
+
+**Example request**:
+
+ POST /containers/4fa6e0f0c678/resize?h=40&w=80 HTTP/1.1
+
+**Example response**:
+
+ HTTP/1.1 200 OK
+ Content-Length: 0
+ Content-Type: text/plain; charset=utf-8
+
+Status Codes:
+
+- **200** – no error
+- **404** – No such container
+- **500** – Cannot resize container
+
+### Start a container
+
+`POST /containers/(id)/start`
+
+Start the container `id`
+
+**Example request**:
+
+ POST /containers/(id)/start HTTP/1.1
+ Content-Type: application/json
+
+**Example response**:
+
+ HTTP/1.1 204 No Content
+
+Json Parameters:
+
+Status Codes:
+
+- **204** – no error
+- **304** – container already started
+- **404** – no such container
+- **500** – server error
+
+### Stop a container
+
+`POST /containers/(id)/stop`
+
+Stop the container `id`
+
+**Example request**:
+
+ POST /containers/e90e34656806/stop?t=5 HTTP/1.1
+
+**Example response**:
+
+ HTTP/1.1 204 No Content
+
+Query Parameters:
+
+- **t** – number of seconds to wait before killing the container
+
+Status Codes:
+
+- **204** – no error
+- **304** – container already stopped
+- **404** – no such container
+- **500** – server error
+
+### Restart a container
+
+`POST /containers/(id)/restart`
+
+Restart the container `id`
+
+**Example request**:
+
+ POST /containers/e90e34656806/restart?t=5 HTTP/1.1
+
+**Example response**:
+
+ HTTP/1.1 204 No Content
+
+Query Parameters:
+
+- **t** – number of seconds to wait before killing the container
+
+Status Codes:
+
+- **204** – no error
+- **404** – no such container
+- **500** – server error
+
+### Kill a container
+
+`POST /containers/(id)/kill`
+
+Kill the container `id`
+
+**Example request**:
+
+ POST /containers/e90e34656806/kill HTTP/1.1
+
+**Example response**:
+
+ HTTP/1.1 204 No Content
+
+Query Parameters
+
+- **signal** - Signal to send to the container: integer or string like "SIGINT".
+ When not set, SIGKILL is assumed and the call will waits for the container to exit.
+
+Status Codes:
+
+- **204** – no error
+- **404** – no such container
+- **500** – server error
+
+### Rename a container
+
+`POST /containers/(id)/rename`
+
+Rename the container `id` to a `new_name`
+
+**Example request**:
+
+ POST /containers/e90e34656806/rename?name=new_name HTTP/1.1
+
+**Example response**:
+
+ HTTP/1.1 204 No Content
+
+Query Parameters:
+
+- **name** – new name for the container
+
+Status Codes:
+
+- **204** – no error
+- **404** – no such container
+- **409** - conflict name already assigned
+- **500** – server error
+
+### Pause a container
+
+`POST /containers/(id)/pause`
+
+Pause the container `id`
+
+**Example request**:
+
+ POST /containers/e90e34656806/pause HTTP/1.1
+
+**Example response**:
+
+ HTTP/1.1 204 No Content
+
+Status Codes:
+
+- **204** – no error
+- **404** – no such container
+- **500** – server error
+
+### Unpause a container
+
+`POST /containers/(id)/unpause`
+
+Unpause the container `id`
+
+**Example request**:
+
+ POST /containers/e90e34656806/unpause HTTP/1.1
+
+**Example response**:
+
+ HTTP/1.1 204 No Content
+
+Status Codes:
+
+- **204** – no error
+- **404** – no such container
+- **500** – server error
+
+### Attach to a container
+
+`POST /containers/(id)/attach`
+
+Attach to the container `id`
+
+**Example request**:
+
+ POST /containers/16253994b7c4/attach?logs=1&stream=0&stdout=1 HTTP/1.1
+
+**Example response**:
+
+ HTTP/1.1 101 UPGRADED
+ Content-Type: application/vnd.docker.raw-stream
+ Connection: Upgrade
+ Upgrade: tcp
+
+ {{ STREAM }}
+
+Query Parameters:
+
+- **logs** – 1/True/true or 0/False/false, return logs. Default false
+- **stream** – 1/True/true or 0/False/false, return stream.
+ Default false
+- **stdin** – 1/True/true or 0/False/false, if stream=true, attach
+ to stdin. Default false
+- **stdout** – 1/True/true or 0/False/false, if logs=true, return
+ stdout log, if stream=true, attach to stdout. Default false
+- **stderr** – 1/True/true or 0/False/false, if logs=true, return
+ stderr log, if stream=true, attach to stderr. Default false
+
+Status Codes:
+
+- **101** – no error, hints proxy about hijacking
+- **200** – no error, no upgrade header found
+- **400** – bad parameter
+- **404** – no such container
+- **500** – server error
+
+ **Stream details**:
+
+ When using the TTY setting is enabled in
+ [`POST /containers/create`
+ ](/reference/api/docker_remote_api_v1.9/#create-a-container "POST /containers/create"),
+ the stream is the raw data from the process PTY and client's stdin.
+ When the TTY is disabled, then the stream is multiplexed to separate
+ stdout and stderr.
+
+ The format is a **Header** and a **Payload** (frame).
+
+ **HEADER**
+
+ The header will contain the information on which stream write the
+ stream (stdout or stderr). It also contain the size of the
+ associated frame encoded on the last 4 bytes (uint32).
+
+ It is encoded on the first 8 bytes like this:
+
+ header := [8]byte{STREAM_TYPE, 0, 0, 0, SIZE1, SIZE2, SIZE3, SIZE4}
+
+ `STREAM_TYPE` can be:
+
+- 0: stdin (will be written on stdout)
+- 1: stdout
+- 2: stderr
+
+ `SIZE1, SIZE2, SIZE3, SIZE4` are the 4 bytes of
+ the uint32 size encoded as big endian.
+
+ **PAYLOAD**
+
+ The payload is the raw stream.
+
+ **IMPLEMENTATION**
+
+ The simplest way to implement the Attach protocol is the following:
+
+ 1. Read 8 bytes
+ 2. chose stdout or stderr depending on the first byte
+ 3. Extract the frame size from the last 4 byets
+ 4. Read the extracted size and output it on the correct output
+ 5. Goto 1
+
+### Attach to a container (websocket)
+
+`GET /containers/(id)/attach/ws`
+
+Attach to the container `id` via websocket
+
+Implements websocket protocol handshake according to [RFC 6455](http://tools.ietf.org/html/rfc6455)
+
+**Example request**
+
+ GET /containers/e90e34656806/attach/ws?logs=0&stream=1&stdin=1&stdout=1&stderr=1 HTTP/1.1
+
+**Example response**
+
+ {{ STREAM }}
+
+Query Parameters:
+
+- **logs** – 1/True/true or 0/False/false, return logs. Default false
+- **stream** – 1/True/true or 0/False/false, return stream.
+ Default false
+- **stdin** – 1/True/true or 0/False/false, if stream=true, attach
+ to stdin. Default false
+- **stdout** – 1/True/true or 0/False/false, if logs=true, return
+ stdout log, if stream=true, attach to stdout. Default false
+- **stderr** – 1/True/true or 0/False/false, if logs=true, return
+ stderr log, if stream=true, attach to stderr. Default false
+
+Status Codes:
+
+- **200** – no error
+- **400** – bad parameter
+- **404** – no such container
+- **500** – server error
+
+### Wait a container
+
+`POST /containers/(id)/wait`
+
+Block until container `id` stops, then returns the exit code
+
+**Example request**:
+
+ POST /containers/16253994b7c4/wait HTTP/1.1
+
+**Example response**:
+
+ HTTP/1.1 200 OK
+ Content-Type: application/json
+
+ {"StatusCode": 0}
+
+Status Codes:
+
+- **200** – no error
+- **404** – no such container
+- **500** – server error
+
+### Remove a container
+
+`DELETE /containers/(id)`
+
+Remove the container `id` from the filesystem
+
+**Example request**:
+
+ DELETE /containers/16253994b7c4?v=1 HTTP/1.1
+
+**Example response**:
+
+ HTTP/1.1 204 No Content
+
+Query Parameters:
+
+- **v** – 1/True/true or 0/False/false, Remove the volumes
+ associated to the container. Default false
+- **force** - 1/True/true or 0/False/false, Kill then remove the container.
+ Default false
+
+Status Codes:
+
+- **204** – no error
+- **400** – bad parameter
+- **404** – no such container
+- **500** – server error
+
+### Copy files or folders from a container
+
+`POST /containers/(id)/copy`
+
+Copy files or folders of container `id`
+
+**Example request**:
+
+ POST /containers/4fa6e0f0c678/copy HTTP/1.1
+ Content-Type: application/json
+
+ {
+ "Resource": "test.txt"
+ }
+
+**Example response**:
+
+ HTTP/1.1 200 OK
+ Content-Type: application/x-tar
+
+ {{ TAR STREAM }}
+
+Status Codes:
+
+- **200** – no error
+- **404** – no such container
+- **500** – server error
+
+## 2.2 Images
+
+### List Images
+
+`GET /images/json`
+
+**Example request**:
+
+ GET /images/json?all=0 HTTP/1.1
+
+**Example response**:
+
+ HTTP/1.1 200 OK
+ Content-Type: application/json
+
+ [
+ {
+ "RepoTags": [
+ "ubuntu:12.04",
+ "ubuntu:precise",
+ "ubuntu:latest"
+ ],
+ "Id": "8dbd9e392a964056420e5d58ca5cc376ef18e2de93b5cc90e868a1bbc8318c1c",
+ "Created": 1365714795,
+ "Size": 131506275,
+ "VirtualSize": 131506275
+ },
+ {
+ "RepoTags": [
+ "ubuntu:12.10",
+ "ubuntu:quantal"
+ ],
+ "ParentId": "27cf784147099545",
+ "Id": "b750fe79269d2ec9a3c593ef05b4332b1d1a02a62b4accb2c21d589ff2f5f2dc",
+ "Created": 1364102658,
+ "Size": 24653,
+ "VirtualSize": 180116135
+ }
+ ]
+
+**Example request, with digest information**:
+
+ GET /images/json?digests=1 HTTP/1.1
+
+**Example response, with digest information**:
+
+ HTTP/1.1 200 OK
+ Content-Type: application/json
+
+ [
+ {
+ "Created": 1420064636,
+ "Id": "4986bf8c15363d1c5d15512d5266f8777bfba4974ac56e3270e7760f6f0a8125",
+ "ParentId": "ea13149945cb6b1e746bf28032f02e9b5a793523481a0a18645fc77ad53c4ea2",
+ "RepoDigests": [
+ "localhost:5000/test/busybox@sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf"
+ ],
+ "RepoTags": [
+ "localhost:5000/test/busybox:latest",
+ "playdate:latest"
+ ],
+ "Size": 0,
+ "VirtualSize": 2429728
+ }
+ ]
+
+The response shows a single image `Id` associated with two repositories
+(`RepoTags`): `localhost:5000/test/busybox`: and `playdate`. A caller can use
+either of the `RepoTags` values `localhost:5000/test/busybox:latest` or
+`playdate:latest` to reference the image.
+
+You can also use `RepoDigests` values to reference an image. In this response,
+the array has only one reference and that is to the
+`localhost:5000/test/busybox` repository; the `playdate` repository has no
+digest. You can reference this digest using the value:
+`localhost:5000/test/busybox@sha256:cbbf2f9a99b47fc460d...`
+
+See the `docker run` and `docker build` commands for examples of digest and tag
+references on the command line.
+
+Query Parameters:
+
+- **all** – 1/True/true or 0/False/false, default false
+- **filters** – a json encoded value of the filters (a map[string][]string) to process on the images list. Available filters:
+ - dangling=true
+
+### Build image from a Dockerfile
+
+`POST /build`
+
+Build an image from a Dockerfile
+
+**Example request**:
+
+ POST /build HTTP/1.1
+
+ {{ TAR STREAM }}
+
+**Example response**:
+
+ HTTP/1.1 200 OK
+ Content-Type: application/json
+
+ {"stream": "Step 1..."}
+ {"stream": "..."}
+ {"error": "Error...", "errorDetail": {"code": 123, "message": "Error..."}}
+
+The input stream must be a tar archive compressed with one of the
+following algorithms: identity (no compression), gzip, bzip2, xz.
+
+The archive must include a build instructions file, typically called
+`Dockerfile` at the root of the archive. The `dockerfile` parameter may be
+used to specify a different build instructions file by having its value be
+the path to the alternate build instructions file to use.
+
+The archive may include any number of other files,
+which will be accessible in the build context (See the [*ADD build
+command*](/reference/builder/#dockerbuilder)).
+
+The build will also be canceled if the client drops the connection by quitting
+or being killed.
+
+Query Parameters:
+
+- **dockerfile** - path within the build context to the Dockerfile. This is
+ ignored if `remote` is specified and points to an individual filename.
+- **t** – repository name (and optionally a tag) to be applied to
+ the resulting image in case of success
+- **remote** – A Git repository URI or HTTP/HTTPS URI build source. If the
+ URI specifies a filename, the file's contents are placed into a file
+ called `Dockerfile`.
+- **q** – suppress verbose build output
+- **nocache** – do not use the cache when building the image
+- **pull** - attempt to pull the image even if an older image exists locally
+- **rm** - remove intermediate containers after a successful build (default behavior)
+- **forcerm** - always remove intermediate containers (includes rm)
+- **memory** - set memory limit for build
+- **memswap** - Total memory (memory + swap), `-1` to disable swap
+- **cpushares** - CPU shares (relative weight)
+- **cpusetcpus** - CPUs in which to allow exection, e.g., `0-3`, `0,1`
+
+ Request Headers:
+
+- **Content-type** – should be set to `"application/tar"`.
+- **X-Registry-Config** – base64-encoded ConfigFile objec
+
+Status Codes:
+
+- **200** – no error
+- **500** – server error
+
+### Create an image
+
+`POST /images/create`
+
+Create an image, either by pulling it from the registry or by importing it
+
+**Example request**:
+
+ POST /images/create?fromImage=ubuntu HTTP/1.1
+
+**Example response**:
+
+ HTTP/1.1 200 OK
+ Content-Type: application/json
+
+ {"status": "Pulling..."}
+ {"status": "Pulling", "progress": "1 B/ 100 B", "progressDetail": {"current": 1, "total": 100}}
+ {"error": "Invalid..."}
+ ...
+
+ When using this endpoint to pull an image from the registry, the
+ `X-Registry-Auth` header can be used to include
+ a base64-encoded AuthConfig object.
+
+Query Parameters:
+
+- **fromImage** – name of the image to pull
+- **fromSrc** – source to import. The value may be a URL from which the image
+ can be retrieved or `-` to read the image from the request body.
+- **repo** – repository
+- **tag** – tag
+- **registry** – the registry to pull from
+
+ Request Headers:
+
+- **X-Registry-Auth** – base64-encoded AuthConfig object
+
+Status Codes:
+
+- **200** – no error
+- **500** – server error
+
+
+
+### Inspect an image
+
+`GET /images/(name)/json`
+
+Return low-level information on the image `name`
+
+**Example request**:
+
+ GET /images/ubuntu/json HTTP/1.1
+
+**Example response**:
+
+ HTTP/1.1 200 OK
+ Content-Type: application/json
+
+ {
+ "Created": "2013-03-23T22:24:18.818426-07:00",
+ "Container": "3d67245a8d72ecf13f33dffac9f79dcdf70f75acb84d308770391510e0c23ad0",
+ "ContainerConfig":
+ {
+ "Hostname": "",
+ "User": "",
+ "AttachStdin": false,
+ "AttachStdout": false,
+ "AttachStderr": false,
+ "PortSpecs": null,
+ "Tty": true,
+ "OpenStdin": true,
+ "StdinOnce": false,
+ "Env": null,
+ "Cmd": ["/bin/bash"],
+ "Dns": null,
+ "Image": "ubuntu",
+ "Labels": {
+ "com.example.vendor": "Acme",
+ "com.example.license": "GPL",
+ "com.example.version": "1.0"
+ },
+ "Volumes": null,
+ "VolumesFrom": "",
+ "WorkingDir": ""
+ },
+ "Id": "b750fe79269d2ec9a3c593ef05b4332b1d1a02a62b4accb2c21d589ff2f5f2dc",
+ "Parent": "27cf784147099545",
+ "Size": 6824592
+ }
+
+Status Codes:
+
+- **200** – no error
+- **404** – no such image
+- **500** – server error
+
+### Get the history of an image
+
+`GET /images/(name)/history`
+
+Return the history of the image `name`
+
+**Example request**:
+
+ GET /images/ubuntu/history HTTP/1.1
+
+**Example response**:
+
+ HTTP/1.1 200 OK
+ Content-Type: application/json
+
+ [
+ {
+ "Id": "b750fe79269d",
+ "Created": 1364102658,
+ "CreatedBy": "/bin/bash"
+ },
+ {
+ "Id": "27cf78414709",
+ "Created": 1364068391,
+ "CreatedBy": ""
+ }
+ ]
+
+Status Codes:
+
+- **200** – no error
+- **404** – no such image
+- **500** – server error
+
+### Push an image on the registry
+
+`POST /images/(name)/push`
+
+Push the image `name` on the registry
+
+**Example request**:
+
+ POST /images/test/push HTTP/1.1
+
+**Example response**:
+
+ HTTP/1.1 200 OK
+ Content-Type: application/json
+
+ {"status": "Pushing..."}
+ {"status": "Pushing", "progress": "1/? (n/a)", "progressDetail": {"current": 1}}}
+ {"error": "Invalid..."}
+ ...
+
+ If you wish to push an image on to a private registry, that image must already have been tagged
+ into a repository which references that registry host name and port. This repository name should
+ then be used in the URL. This mirrors the flow of the CLI.
+
+**Example request**:
+
+ POST /images/registry.acme.com:5000/test/push HTTP/1.1
+
+
+Query Parameters:
+
+- **tag** – the tag to associate with the image on the registry, optional
+
+Request Headers:
+
+- **X-Registry-Auth** – include a base64-encoded AuthConfig
+ object.
+
+Status Codes:
+
+- **200** – no error
+- **404** – no such image
+- **500** – server error
+
+### Tag an image into a repository
+
+`POST /images/(name)/tag`
+
+Tag the image `name` into a repository
+
+**Example request**:
+
+ POST /images/test/tag?repo=myrepo&force=0&tag=v42 HTTP/1.1
+
+**Example response**:
+
+ HTTP/1.1 201 OK
+
+Query Parameters:
+
+- **repo** – The repository to tag in
+- **force** – 1/True/true or 0/False/false, default false
+- **tag** - The new tag name
+
+Status Codes:
+
+- **201** – no error
+- **400** – bad parameter
+- **404** – no such image
+- **409** – conflict
+- **500** – server error
+
+### Remove an image
+
+`DELETE /images/(name)`
+
+Remove the image `name` from the filesystem
+
+**Example request**:
+
+ DELETE /images/test HTTP/1.1
+
+**Example response**:
+
+ HTTP/1.1 200 OK
+ Content-type: application/json
+
+ [
+ {"Untagged": "3e2f21a89f"},
+ {"Deleted": "3e2f21a89f"},
+ {"Deleted": "53b4f83ac9"}
+ ]
+
+Query Parameters:
+
+- **force** – 1/True/true or 0/False/false, default false
+- **noprune** – 1/True/true or 0/False/false, default false
+
+Status Codes:
+
+- **200** – no error
+- **404** – no such image
+- **409** – conflict
+- **500** – server error
+
+### Search images
+
+`GET /images/search`
+
+Search for an image on [Docker Hub](https://hub.docker.com).
+
+> **Note**:
+> The response keys have changed from API v1.6 to reflect the JSON
+> sent by the registry server to the docker daemon's request.
+
+**Example request**:
+
+ GET /images/search?term=sshd HTTP/1.1
+
+**Example response**:
+
+ HTTP/1.1 200 OK
+ Content-Type: application/json
+
+ [
+ {
+ "description": "",
+ "is_official": false,
+ "is_automated": false,
+ "name": "wma55/u1210sshd",
+ "star_count": 0
+ },
+ {
+ "description": "",
+ "is_official": false,
+ "is_automated": false,
+ "name": "jdswinbank/sshd",
+ "star_count": 0
+ },
+ {
+ "description": "",
+ "is_official": false,
+ "is_automated": false,
+ "name": "vgauthier/sshd",
+ "star_count": 0
+ }
+ ...
+ ]
+
+Query Parameters:
+
+- **term** – term to search
+
+Status Codes:
+
+- **200** – no error
+- **500** – server error
+
+## 2.3 Misc
+
+### Check auth configuration
+
+`POST /auth`
+
+Get the default username and email
+
+**Example request**:
+
+ POST /auth HTTP/1.1
+ Content-Type: application/json
+
+ {
+ "username":" hannibal",
+ "password: "xxxx",
+ "email": "hannibal@a-team.com",
+ "serveraddress": "https://index.docker.io/v1/"
+ }
+
+**Example response**:
+
+ HTTP/1.1 200 OK
+
+Status Codes:
+
+- **200** – no error
+- **204** – no error
+- **500** – server error
+
+### Display system-wide information
+
+`GET /info`
+
+Display system-wide information
+
+**Example request**:
+
+ GET /info HTTP/1.1
+
+**Example response**:
+
+ HTTP/1.1 200 OK
+ Content-Type: application/json
+
+ {
+ "Containers":11,
+ "Images":16,
+ "Driver":"btrfs",
+ "DriverStatus": [[""]],
+ "ExecutionDriver":"native-0.1",
+ "KernelVersion":"3.12.0-1-amd64"
+ "NCPU":1,
+ "MemTotal":2099236864,
+ "Name":"prod-server-42",
+ "ID":"7TRN:IPZB:QYBB:VPBQ:UMPP:KARE:6ZNR:XE6T:7EWV:PKF4:ZOJD:TPYS",
+ "Debug":false,
+ "NFd": 11,
+ "NGoroutines":21,
+ "SystemTime": "2015-03-10T11:11:23.730591467-07:00"
+ "NEventsListener":0,
+ "InitPath":"/usr/bin/docker",
+ "InitSha1":"",
+ "IndexServerAddress":["https://index.docker.io/v1/"],
+ "MemoryLimit":true,
+ "SwapLimit":false,
+ "IPv4Forwarding":true,
+ "Labels":["storage=ssd"],
+ "DockerRootDir": "/var/lib/docker",
+ "HttpProxy": "http://test:test@localhost:8080"
+ "HttpsProxy": "https://test:test@localhost:8080"
+ "NoProxy": "9.81.1.160"
+ "OperatingSystem": "Boot2Docker",
+ }
+
+Status Codes:
+
+- **200** – no error
+- **500** – server error
+
+### Show the docker version information
+
+`GET /version`
+
+Show the docker version information
+
+**Example request**:
+
+ GET /version HTTP/1.1
+
+**Example response**:
+
+ HTTP/1.1 200 OK
+ Content-Type: application/json
+
+ {
+ "Version": "1.5.0",
+ "Os": "linux",
+ "KernelVersion": "3.18.5-tinycore64",
+ "GoVersion": "go1.4.1",
+ "GitCommit": "a8a31ef",
+ "Arch": "amd64",
+ "ApiVersion": "1.18"
+ }
+
+Status Codes:
+
+- **200** – no error
+- **500** – server error
+
+### Ping the docker server
+
+`GET /_ping`
+
+Ping the docker server
+
+**Example request**:
+
+ GET /_ping HTTP/1.1
+
+**Example response**:
+
+ HTTP/1.1 200 OK
+ Content-Type: text/plain
+
+ OK
+
+Status Codes:
+
+- **200** - no error
+- **500** - server error
+
+### Create a new image from a container's changes
+
+`POST /commit`
+
+Create a new image from a container's changes
+
+**Example request**:
+
+ POST /commit?container=44c004db4b17&comment=message&repo=myrepo HTTP/1.1
+ Content-Type: application/json
+
+ {
+ "Hostname": "",
+ "Domainname": "",
+ "User": "",
+ "AttachStdin": false,
+ "AttachStdout": true,
+ "AttachStderr": true,
+ "PortSpecs": null,
+ "Tty": false,
+ "OpenStdin": false,
+ "StdinOnce": false,
+ "Env": null,
+ "Cmd": [
+ "date"
+ ],
+ "Volumes": {
+ "/tmp": {}
+ },
+ "WorkingDir": "",
+ "NetworkDisabled": false,
+ "ExposedPorts": {
+ "22/tcp": {}
+ }
+ }
+
+**Example response**:
+
+ HTTP/1.1 201 Created
+ Content-Type: application/vnd.docker.raw-stream
+
+ {"Id": "596069db4bf5"}
+
+Json Parameters:
+
+- **config** - the container's configuration
+
+Query Parameters:
+
+- **container** – source container
+- **repo** – repository
+- **tag** – tag
+- **comment** – commit message
+- **author** – author (e.g., "John Hannibal Smith
+ <[hannibal@a-team.com](mailto:hannibal%40a-team.com)>")
+
+Status Codes:
+
+- **201** – no error
+- **404** – no such container
+- **500** – server error
+
+### Monitor Docker's events
+
+`GET /events`
+
+Get container events from docker, either in real time via streaming, or via
+polling (using since).
+
+Docker containers will report the following events:
+
+ create, destroy, die, exec_create, exec_start, export, kill, oom, pause, restart, start, stop, unpause
+
+and Docker images will report:
+
+ untag, delete
+
+**Example request**:
+
+ GET /events?since=1374067924
+
+**Example response**:
+
+ HTTP/1.1 200 OK
+ Content-Type: application/json
+
+ {"status": "create", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067924}
+ {"status": "start", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067924}
+ {"status": "stop", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067966}
+ {"status": "destroy", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067970}
+
+Query Parameters:
+
+- **since** – timestamp used for polling
+- **until** – timestamp used for polling
+- **filters** – a json encoded value of the filters (a map[string][]string) to process on the event list. Available filters:
+ - event=&lt;string&gt; -- event to filter
+ - image=&lt;string&gt; -- image to filter
+ - container=&lt;string&gt; -- container to filter
+
+Status Codes:
+
+- **200** – no error
+- **500** – server error
+
+### Get a tarball containing all images in a repository
+
+`GET /images/(name)/get`
+
+Get a tarball containing all images and metadata for the repository specified
+by `name`.
+
+If `name` is a specific name and tag (e.g. ubuntu:latest), then only that image
+(and its parents) are returned. If `name` is an image ID, similarly only tha
+image (and its parents) are returned, but with the exclusion of the
+'repositories' file in the tarball, as there were no image names referenced.
+
+See the [image tarball format](#image-tarball-format) for more details.
+
+**Example request**
+
+ GET /images/ubuntu/get
+
+**Example response**:
+
+ HTTP/1.1 200 OK
+ Content-Type: application/x-tar
+
+ Binary data stream
+
+Status Codes:
+
+- **200** – no error
+- **500** – server error
+
+### Get a tarball containing all images.
+
+`GET /images/get`
+
+Get a tarball containing all images and metadata for one or more repositories.
+
+For each value of the `names` parameter: if it is a specific name and tag (e.g.
+ubuntu:latest), then only that image (and its parents) are returned; if it is
+an image ID, similarly only that image (and its parents) are returned and there
+would be no names referenced in the 'repositories' file for this image ID.
+
+See the [image tarball format](#image-tarball-format) for more details.
+
+**Example request**
+
+ GET /images/get?names=myname%2Fmyapp%3Alatest&names=busybox
+
+**Example response**:
+
+ HTTP/1.1 200 OK
+ Content-Type: application/x-tar
+
+ Binary data stream
+
+Status Codes:
+
+- **200** – no error
+- **500** – server error
+
+### Load a tarball with a set of images and tags into docker
+
+`POST /images/load`
+
+Load a set of images and tags into the docker repository.
+See the [image tarball format](#image-tarball-format) for more details.
+
+**Example request**
+
+ POST /images/load
+
+ Tarball in body
+
+**Example response**:
+
+ HTTP/1.1 200 OK
+
+Status Codes:
+
+- **200** – no error
+- **500** – server error
+
+### Image tarball format
+
+An image tarball contains one directory per image layer (named using its long ID),
+each containing three files:
+
+1. `VERSION`: currently `1.0` - the file format version
+2. `json`: detailed layer information, similar to `docker inspect layer_id`
+3. `layer.tar`: A tarfile containing the filesystem changes in this layer
+
+The `layer.tar` file will contain `aufs` style `.wh..wh.aufs` files and directories
+for storing attribute changes and deletions.
+
+If the tarball defines a repository, there will also be a `repositories` file at
+the root that contains a list of repository and tag names mapped to layer IDs.
+
+```
+{"hello-world":
+ {"latest": "565a9d68a73f6706862bfe8409a7f659776d4d60a8d096eb4a3cbce6999cc2a1"}
+}
+```
+
+### Exec Create
+
+`POST /containers/(id)/exec`
+
+Sets up an exec instance in a running container `id`
+
+**Example request**:
+
+ POST /containers/e90e34656806/exec HTTP/1.1
+ Content-Type: application/json
+
+ {
+ "AttachStdin": false,
+ "AttachStdout": true,
+ "AttachStderr": true,
+ "Tty": false,
+ "Cmd": [
+ "date"
+ ],
+ }
+
+**Example response**:
+
+ HTTP/1.1 201 OK
+ Content-Type: application/json
+
+ {
+ "Id": "f90e34656806"
+ }
+
+Json Parameters:
+
+- **AttachStdin** - Boolean value, attaches to stdin of the exec command.
+- **AttachStdout** - Boolean value, attaches to stdout of the exec command.
+- **AttachStderr** - Boolean value, attaches to stderr of the exec command.
+- **Tty** - Boolean value to allocate a pseudo-TTY
+- **Cmd** - Command to run specified as a string or an array of strings.
+
+
+Status Codes:
+
+- **201** – no error
+- **404** – no such container
+
+### Exec Start
+
+`POST /exec/(id)/start`
+
+Starts a previously set up exec instance `id`. If `detach` is true, this API
+returns after starting the `exec` command. Otherwise, this API sets up an
+interactive session with the `exec` command.
+
+**Example request**:
+
+ POST /exec/e90e34656806/start HTTP/1.1
+ Content-Type: application/json
+
+ {
+ "Detach": false,
+ "Tty": false,
+ }
+
+**Example response**:
+
+ HTTP/1.1 201 OK
+ Content-Type: application/json
+
+ {{ STREAM }}
+
+Json Parameters:
+
+- **Detach** - Detach from the exec command
+- **Tty** - Boolean value to allocate a pseudo-TTY
+
+Status Codes:
+
+- **201** – no error
+- **404** – no such exec instance
+
+ **Stream details**:
+ Similar to the stream behavior of `POST /container/(id)/attach` API
+
+### Exec Resize
+
+`POST /exec/(id)/resize`
+
+Resizes the tty session used by the exec command `id`.
+This API is valid only if `tty` was specified as part of creating and starting the exec command.
+
+**Example request**:
+
+ POST /exec/e90e34656806/resize HTTP/1.1
+ Content-Type: text/plain
+
+**Example response**:
+
+ HTTP/1.1 201 OK
+ Content-Type: text/plain
+
+Query Parameters:
+
+- **h** – height of tty session
+- **w** – width
+
+Status Codes:
+
+- **201** – no error
+- **404** – no such exec instance
+
+### Exec Inspect
+
+`GET /exec/(id)/json`
+
+Return low-level information about the exec command `id`.
+
+**Example request**:
+
+ GET /exec/11fb006128e8ceb3942e7c58d77750f24210e35f879dd204ac975c184b820b39/json HTTP/1.1
+
+**Example response**:
+
+ HTTP/1.1 200 OK
+ Content-Type: plain/text
+
+ {
+ "ID" : "11fb006128e8ceb3942e7c58d77750f24210e35f879dd204ac975c184b820b39",
+ "Running" : false,
+ "ExitCode" : 2,
+ "ProcessConfig" : {
+ "privileged" : false,
+ "user" : "",
+ "tty" : false,
+ "entrypoint" : "sh",
+ "arguments" : [
+ "-c",
+ "exit 2"
+ ]
+ },
+ "OpenStdin" : false,
+ "OpenStderr" : false,
+ "OpenStdout" : false,
+ "Container" : {
+ "State" : {
+ "Running" : true,
+ "Paused" : false,
+ "Restarting" : false,
+ "OOMKilled" : false,
+ "Pid" : 3650,
+ "ExitCode" : 0,
+ "Error" : "",
+ "StartedAt" : "2014-11-17T22:26:03.717657531Z",
+ "FinishedAt" : "0001-01-01T00:00:00Z"
+ },
+ "ID" : "8f177a186b977fb451136e0fdf182abff5599a08b3c7f6ef0d36a55aaf89634c",
+ "Created" : "2014-11-17T22:26:03.626304998Z",
+ "Path" : "date",
+ "Args" : [],
+ "Config" : {
+ "Hostname" : "8f177a186b97",
+ "Domainname" : "",
+ "User" : "",
+ "AttachStdin" : false,
+ "AttachStdout" : false,
+ "AttachStderr" : false,
+ "PortSpecs" : null,
+ "ExposedPorts" : null,
+ "Tty" : false,
+ "OpenStdin" : false,
+ "StdinOnce" : false,
+ "Env" : [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ],
+ "Cmd" : [
+ "date"
+ ],
+ "Image" : "ubuntu",
+ "Volumes" : null,
+ "WorkingDir" : "",
+ "Entrypoint" : null,
+ "NetworkDisabled" : false,
+ "MacAddress" : "",
+ "OnBuild" : null,
+ "SecurityOpt" : null
+ },
+ "Image" : "5506de2b643be1e6febbf3b8a240760c6843244c41e12aa2f60ccbb7153d17f5",
+ "NetworkSettings" : {
+ "IPAddress" : "172.17.0.2",
+ "IPPrefixLen" : 16,
+ "MacAddress" : "02:42:ac:11:00:02",
+ "Gateway" : "172.17.42.1",
+ "Bridge" : "docker0",
+ "PortMapping" : null,
+ "Ports" : {}
+ },
+ "ResolvConfPath" : "/var/lib/docker/containers/8f177a186b977fb451136e0fdf182abff5599a08b3c7f6ef0d36a55aaf89634c/resolv.conf",
+ "HostnamePath" : "/var/lib/docker/containers/8f177a186b977fb451136e0fdf182abff5599a08b3c7f6ef0d36a55aaf89634c/hostname",
+ "HostsPath" : "/var/lib/docker/containers/8f177a186b977fb451136e0fdf182abff5599a08b3c7f6ef0d36a55aaf89634c/hosts",
+ "LogPath": "/var/lib/docker/containers/1eb5fabf5a03807136561b3c00adcd2992b535d624d5e18b6cdc6a6844d9767b/1eb5fabf5a03807136561b3c00adcd2992b535d624d5e18b6cdc6a6844d9767b-json.log",
+ "Name" : "/test",
+ "Driver" : "aufs",
+ "ExecDriver" : "native-0.2",
+ "MountLabel" : "",
+ "ProcessLabel" : "",
+ "AppArmorProfile" : "",
+ "RestartCount" : 0,
+ "Volumes" : {},
+ "VolumesRW" : {}
+ }
+ }
+
+Status Codes:
+
+- **200** – no error
+- **404** – no such exec instance
+- **500** - server error
+
+# 3. Going further
+
+## 3.1 Inside `docker run`
+
+As an example, the `docker run` command line makes the following API calls:
+
+- Create the container
+
+- If the status code is 404, it means the image doesn't exist:
+ - Try to pull it
+ - Then retry to create the container
+
+- Start the container
+
+- If you are not in detached mode:
+- Attach to the container, using logs=1 (to have stdout and
+ stderr from the container's start) and stream=1
+
+- If in detached mode or only stdin is attached:
+- Display the container's id
+
+## 3.2 Hijacking
+
+In this version of the API, /attach, uses hijacking to transport stdin,
+stdout and stderr on the same socket.
+
+To hint potential proxies about connection hijacking, Docker client sends
+connection upgrade headers similarly to websocket.
+
+ Upgrade: tcp
+ Connection: Upgrade
+
+When Docker daemon detects the `Upgrade` header, it will switch its status code
+from **200 OK** to **101 UPGRADED** and resend the same headers.
+
+This might change in the future.
+
+## 3.3 CORS Requests
+
+To set cross origin requests to the remote api please give values to
+"--api-cors-header" when running docker in daemon mode. Set * will allow all,
+default or blank means CORS disabled
+
+ $ docker -d -H="192.168.1.9:2375" --api-cors-header="http://foo.bar"
diff --git a/docs/sources/reference/api/hub_registry_spec.md b/docs/sources/reference/api/hub_registry_spec.md
index 26d4ffca30..0e39784b84 100644
--- a/docs/sources/reference/api/hub_registry_spec.md
+++ b/docs/sources/reference/api/hub_registry_spec.md
@@ -2,7 +2,7 @@ page_title: Registry Documentation
page_description: Documentation for docker Registry and Registry API
page_keywords: docker, registry, api, hub
-# The Docker Hub and the Registry spec
+# The Docker Hub and the Registry 1.0 spec
## The three roles
@@ -28,9 +28,9 @@ The Docker Hub is authoritative for that information.
There is only one instance of the Docker Hub, run and
managed by Docker Inc.
-### Registry
+### Docker Registry 1.0
-The registry has the following characteristics:
+The 1.0 registry has the following characteristics:
- It stores the images and the graph for a set of repositories
- It does not have user accounts data
diff --git a/docs/sources/reference/api/registry_api.md b/docs/sources/reference/api/registry_api.md
index 54a158934a..13a51356f0 100644
--- a/docs/sources/reference/api/registry_api.md
+++ b/docs/sources/reference/api/registry_api.md
@@ -2,11 +2,11 @@ page_title: Registry API
page_description: API Documentation for Docker Registry
page_keywords: API, Docker, index, registry, REST, documentation
-# Docker Registry API
+# Docker Registry API v1
## Introduction
- - This is the REST API for the Docker Registry
+ - This is the REST API for the Docker Registry 1.0
- It stores the images and the graph for a set of repositories
- It does not have user accounts data
- It has no notion of user accounts or authorization
diff --git a/docs/sources/reference/api/registry_api_client_libraries.md b/docs/sources/reference/api/registry_api_client_libraries.md
index 7fe986204a..811ac859e4 100644
--- a/docs/sources/reference/api/registry_api_client_libraries.md
+++ b/docs/sources/reference/api/registry_api_client_libraries.md
@@ -2,12 +2,13 @@ page_title: Registry API Client Libraries
page_description: Various client libraries available to use with the Docker registry API
page_keywords: API, Docker, index, registry, REST, documentation, clients, C#, Erlang, Go, Groovy, Java, JavaScript, Perl, PHP, Python, Ruby, Rust, Scala
-# Docker Registry API Client Libraries
+# Docker Registry 1.0 API Client Libraries
These libraries have not been tested by the Docker maintainers for
compatibility. Please file issues with the library owners. If you find
-more library implementations, please list them in Docker doc bugs and we
-will add the libraries here.
+more library implementations, please submit a PR with an update to this page
+or open an issue in the [Docker](https://github.com/docker/docker/issues)
+project and we will add the libraries here.
<table border="1" class="docutils">
@@ -31,5 +32,11 @@ will add the libraries here.
<td><a class="reference external" href="https://github.com/kwk/docker-registry-frontend">https://github.com/kwk/docker-registry-frontend</a></td>
<td>Active</td>
</tr>
+ <tr class="row-odd">
+ <td>Go</td>
+ <td>docker-reg-client</td>
+ <td><a class="reference external" href="https://github.com/CenturyLinkLabs/docker-reg-client">https://github.com/CenturyLinkLabs/docker-reg-client</a></td>
+ <td>Active</td>
+ </tr>
</tbody>
</table>
diff --git a/docs/sources/reference/builder.md b/docs/sources/reference/builder.md
index d0c928188d..025b253b02 100644
--- a/docs/sources/reference/builder.md
+++ b/docs/sources/reference/builder.md
@@ -107,11 +107,11 @@ images.
### Environment Replacement
-**Note:** prior to 1.3, `Dockerfile` environment variables were handled
-similarly, in that they would be replaced as described below. However, there
-was no formal definition on as to which instructions handled environment
-replacement at the time. After 1.3 this behavior will be preserved and
-canonical.
+> **Note**: prior to 1.3, `Dockerfile` environment variables were handled
+> similarly, in that they would be replaced as described below. However, there
+> was no formal definition on as to which instructions handled environment
+> replacement at the time. After 1.3 this behavior will be preserved and
+> canonical.
Environment variables (declared with [the `ENV` statement](#env)) can also be used in
certain instructions as variables to be interpreted by the `Dockerfile`. Escapes
@@ -146,6 +146,17 @@ The instructions that handle environment variables in the `Dockerfile` are:
`ONBUILD` instructions are **NOT** supported for environment replacement, even
the instructions above.
+Environment variable subtitution will use the same value for each variable
+throughout the entire command. In other words, in this example:
+
+ ENV abc=hello
+ ENV abc=bye def=$abc
+ ENV ghi=$abc
+
+will result in `def` having a value of `hello`, not `bye`. However,
+`ghi` will have a value of `bye` because it is not part of the same command
+that set `abc` to `bye`.
+
## The `.dockerignore` file
If a file named `.dockerignore` exists in the source repository, then it
@@ -192,6 +203,10 @@ Or
FROM <image>:<tag>
+Or
+
+ FROM <image>@<digest>
+
The `FROM` instruction sets the [*Base Image*](/terms/image/#base-image)
for subsequent instructions. As such, a valid `Dockerfile` must have `FROM` as
its first instruction. The image can be any valid image – it is especially easy
@@ -204,8 +219,9 @@ to start by **pulling an image** from the [*Public Repositories*](
multiple images. Simply make a note of the last image ID output by the commit
before each new `FROM` command.
-If no `tag` is given to the `FROM` instruction, `latest` is assumed. If the
-used tag does not exist, an error will be returned.
+The `tag` or `digest` values are optional. If you omit either of them, the builder
+assumes a `latest` by default. The builder returns an error if it cannot match
+the `tag` value.
## MAINTAINER
@@ -264,8 +280,14 @@ The cache for `RUN` instructions can be invalidated by `ADD` instructions. See
- [Issue 783](https://github.com/docker/docker/issues/783) is about file
permissions problems that can occur when using the AUFS file system. You
- might notice it during an attempt to `rm` a file, for example. The issue
- describes a workaround.
+ might notice it during an attempt to `rm` a file, for example.
+
+ For systems that have recent aufs version (i.e., `dirperm1` mount option can
+ be set), docker will attempt to fix the issue automatically by mounting
+ the layers with `dirperm1` option. More details on `dirperm1` option can be
+ found at [`aufs` man page](http://aufs.sourceforge.net/aufs3/man.html)
+
+ If your system doesnt have support for `dirperm1`, the issue describes a workaround.
## CMD
@@ -328,6 +350,36 @@ default specified in `CMD`.
> the result; `CMD` does not execute anything at build time, but specifies
> the intended command for the image.
+## LABEL
+
+ LABEL <key>=<value> <key>=<value> <key>=<value> ...
+
+The `LABEL` instruction adds metadata to an image. A `LABEL` is a
+key-value pair. To include spaces within a `LABEL` value, use quotes and
+blackslashes as you would in command-line parsing.
+
+ LABEL "com.example.vendor"="ACME Incorporated"
+
+An image can have more than one label. To specify multiple labels, separate each
+key-value pair by an EOL.
+
+ LABEL com.example.label-without-value
+ LABEL com.example.label-with-value="foo"
+ LABEL version="1.0"
+ LABEL description="This text illustrates \
+ that label-values can span multiple lines."
+
+Docker recommends combining labels in a single `LABEL` instruction where
+possible. Each `LABEL` instruction produces a new layer which can result in an
+inefficient image if you use many labels. This example results in four image
+layers.
+
+Labels are additive including `LABEL`s in `FROM` images. As the system
+encounters and then applies a new label, new `key`s override any previous labels
+with identical keys.
+
+To view an image's labels, use the `docker inspect` command.
+
## EXPOSE
EXPOSE <port> [<port>...]
@@ -337,11 +389,12 @@ specified network ports at runtime. Docker uses this information to interconnect
containers using links (see the [Docker User
Guide](/userguide/dockerlinks)) and to determine which ports to expose to the
host when [using the -P flag](/reference/run/#expose-incoming-ports).
-**Note:**
-`EXPOSE` doesn't define which ports can be exposed to the host or make ports
-accessible from the host by default. To expose ports to the host, at runtime,
-[use the `-p` flag](/userguide/dockerlinks) or
-[the -P flag](/reference/run/#expose-incoming-ports).
+
+> **Note**:
+> `EXPOSE` doesn't define which ports can be exposed to the host or make ports
+> accessible from the host by default. To expose ports to the host, at runtime,
+> [use the `-p` flag](/userguide/dockerlinks) or
+> [the -P flag](/reference/run/#expose-incoming-ports).
## ENV
@@ -626,8 +679,7 @@ ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]
If you need to write a starter script for a single executable, you can ensure that
the final executable receives the Unix signals by using `exec` and `gosu`
-(see [the Dockerfile best practices](/articles/dockerfile_best-practices/#entrypoint)
-for more details):
+commands:
```bash
#!/bin/bash
@@ -777,14 +829,28 @@ If you then run `docker stop test`, the container will not exit cleanly - the
VOLUME ["/data"]
-The `VOLUME` instruction will create a mount point with the specified name
-and mark it as holding externally mounted volumes from native host or other
+The `VOLUME` instruction creates a mount point with the specified name
+and marks it as holding externally mounted volumes from native host or other
containers. The value can be a JSON array, `VOLUME ["/var/log/"]`, or a plain
string with multiple arguments, such as `VOLUME /var/log` or `VOLUME /var/log
/var/db`. For more information/examples and mounting instructions via the
-Docker client, refer to [*Share Directories via Volumes*](/userguide/dockervolumes/#volume)
+Docker client, refer to
+[*Share Directories via Volumes*](/userguide/dockervolumes/#volume)
documentation.
+The `docker run` command initializes the newly created volume with any data
+that exists at the specified location within the base image. For example,
+consider the following Dockerfile snippet:
+
+ FROM ubuntu
+ RUN mkdir /myvol
+ RUN echo "hello world" > /myvol/greating
+ VOLUME /myvol
+
+This Dockerfile results in an image that causes `docker run`, to
+create a new mount point at `/myvol` and copy the `greating` file
+into the newly created volume.
+
> **Note**:
> The list is parsed as a JSON array, which means that
> you must use double-quotes (") around words not single-quotes (').
@@ -893,6 +959,7 @@ For example you might add something like this:
FROM ubuntu
MAINTAINER Victor Vieux <victor@docker.com>
+ LABEL Description="This image is used to start the foobar executable" Vendor="ACME Products" Version="1.0"
RUN apt-get update && apt-get install -y inotify-tools nginx apache2 openssh-server
# Firefox over VNC
diff --git a/docs/sources/reference/commandline/cli.md b/docs/sources/reference/commandline/cli.md
index 9c9bd1d3c7..6c3eb1c8dd 100644
--- a/docs/sources/reference/commandline/cli.md
+++ b/docs/sources/reference/commandline/cli.md
@@ -2,7 +2,7 @@ page_title: Command Line Interface
page_description: Docker's CLI command description and usage
page_keywords: Docker, Docker documentation, CLI, command line
-# Command Line
+# Docker Command Line
{{ include "no-remote-sudo.md" }}
@@ -26,15 +26,15 @@ To list the help on any command just execute the command, followed by the `--hel
Run a command in a new container
- -a, --attach=[] Attach to STDIN, STDOUT or STDERR.
+ -a, --attach=[] Attach to STDIN, STDOUT or STDERR
-c, --cpu-shares=0 CPU shares (relative weight)
...
## Option types
Single character command line options can be combined, so rather than
-typing `docker run -t -i --name test busybox sh`,
-you can write `docker run -ti --name test busybox sh`.
+typing `docker run -i -t --name test busybox sh`,
+you can write `docker run -it --name test busybox sh`.
### Boolean
@@ -74,44 +74,43 @@ expect an integer, and they can only be specified once.
A self-sufficient runtime for linux containers.
Options:
- --api-enable-cors=false Enable CORS headers in the remote API
- -b, --bridge="" Attach containers to a pre-existing network bridge
- use 'none' to disable container networking
- --bip="" Use this CIDR notation address for the network bridge's IP, not compatible with -b
- -D, --debug=false Enable debug mode
- -d, --daemon=false Enable daemon mode
- --dns=[] Force Docker to use specific DNS servers
- --dns-search=[] Force Docker to use specific DNS search domains
- -e, --exec-driver="native" Force the Docker runtime to use a specific exec driver
- --fixed-cidr="" IPv4 subnet for fixed IPs (e.g.: 10.20.0.0/16)
- this subnet must be nested in the bridge subnet (which is defined by -b or --bip)
- --fixed-cidr-v6="" IPv6 subnet for global IPs (e.g.: 2a00:1450::/64)
- -G, --group="docker" Group to assign the unix socket specified by -H when running in daemon mode
- use '' (the empty string) to disable setting of a group
- -g, --graph="/var/lib/docker" Path to use as the root of the Docker runtime
- -H, --host=[] The socket(s) to bind to in daemon mode or connect to in client mode, specified using one or more tcp://host:port, unix:///path/to/socket, fd://* or fd://socketfd.
- --icc=true Allow unrestricted inter-container and Docker daemon host communication
- --insecure-registry=[] Enable insecure communication with specified registries (disables certificate verification for HTTPS and enables HTTP fallback) (e.g., localhost:5000 or 10.20.0.0/16)
- --ip=0.0.0.0 Default IP address to use when binding container ports
- --ip-forward=true Enable net.ipv4.ip_forward and IPv6 forwarding if --fixed-cidr-v6 is defined. IPv6 forwarding may interfere with your existing IPv6 configuration when using Router Advertisement.
- --ip-masq=true Enable IP masquerading for bridge's IP range
- --iptables=true Enable Docker's addition of iptables rules
- --ipv6=false Enable Docker IPv6 support
- -l, --log-level="info" Set the logging level (debug, info, warn, error, fatal)
- --label=[] Set key=value labels to the daemon (displayed in `docker info`)
- --mtu=0 Set the containers network MTU
- if no value is provided: default to the default route MTU or 1500 if no default route is available
- -p, --pidfile="/var/run/docker.pid" Path to use for daemon PID file
- --registry-mirror=[] Specify a preferred Docker registry mirror
- -s, --storage-driver="" Force the Docker runtime to use a specific storage driver
- --selinux-enabled=false Enable selinux support. SELinux does not presently support the BTRFS storage driver
- --storage-opt=[] Set storage driver options
- --tls=false Use TLS; implied by --tlsverify flag
- --tlscacert="/home/sven/.docker/ca.pem" Trust only remotes providing a certificate signed by the CA given here
- --tlscert="/home/sven/.docker/cert.pem" Path to TLS certificate file
- --tlskey="/home/sven/.docker/key.pem" Path to TLS key file
- --tlsverify=false Use TLS and verify the remote (daemon: verify client, client: verify daemon)
- -v, --version=false Print version information and quit
+ --api-cors-header="" Set CORS headers in the remote API
+ -b, --bridge="" Attach containers to a network bridge
+ --bip="" Specify network bridge IP
+ -D, --debug=false Enable debug mode
+ -d, --daemon=false Enable daemon mode
+ --dns=[] DNS server to use
+ --dns-search=[] DNS search domains to use
+ -e, --exec-driver="native" Exec driver to use
+ --fixed-cidr="" IPv4 subnet for fixed IPs
+ --fixed-cidr-v6="" IPv6 subnet for fixed IPs
+ -G, --group="docker" Group for the unix socket
+ -g, --graph="/var/lib/docker" Root of the Docker runtime
+ -H, --host=[] Daemon socket(s) to connect to
+ -h, --help=false Print usage
+ --icc=true Enable inter-container communication
+ --insecure-registry=[] Enable insecure registry communication
+ --ip=0.0.0.0 Default IP when binding container ports
+ --ip-forward=true Enable net.ipv4.ip_forward
+ --ip-masq=true Enable IP masquerading
+ --iptables=true Enable addition of iptables rules
+ --ipv6=false Enable IPv6 networking
+ -l, --log-level="info" Set the logging level
+ --label=[] Set key=value labels to the daemon
+ --log-driver="json-file" Container's logging driver (json-file/none)
+ --mtu=0 Set the containers network MTU
+ -p, --pidfile="/var/run/docker.pid" Path to use for daemon PID file
+ --registry-mirror=[] Preferred Docker registry mirror
+ -s, --storage-driver="" Storage driver to use
+ --selinux-enabled=false Enable selinux support
+ --storage-opt=[] Set storage driver options
+ --tls=false Use TLS; implied by --tlsverify
+ --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
+ --tlsverify=false Use TLS and verify the remote
+ -v, --version=false Print version information and quit
+ --default-ulimit=[] Set default ulimit settings for containers.
Options with [] may be specified multiple times.
@@ -177,11 +176,7 @@ string is equivalent to setting the `--tlsverify` flag. The following are equiva
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`. If you happen to have a proxy configured with the
-`HTTP_PROXY` or `HTTPS_PROXY` environment variables but still want to
-communicate with the Docker daemon over its default `unix` domain socket,
-setting the `NO_PROXY` environment variable to the path of the socket
-(`/var/run/docker.sock`) is required.
+precedence over `HTTP_PROXY`.
### Daemon storage-driver option
@@ -210,8 +205,8 @@ share executable memory between devices. Use `docker -d -s btrfs -g /mnt/btrfs_p
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).
-Call `docker -d -s overlay` to use it.
-> **Note:**
+Call `docker -d -s overlay` to use it.
+> **Note:**
> It is currently unsupported on `btrfs` or any Copy on Write filesystem
> and should only be used over `ext4` partitions.
@@ -230,11 +225,11 @@ Currently supported options are:
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.
-
+
**Warning**: 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 will require additional steps to take effect:
-
+
$ sudo service docker stop
$ sudo rm -rf /var/lib/docker
$ sudo service docker start
@@ -379,7 +374,7 @@ 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:
+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
@@ -411,6 +406,14 @@ 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 inheritted, if not set on
+`docker run`, from the Docker daemon. Any `--ulimit` options passed to
+`docker run` will overwrite these defaults.
+
### Miscellaneous options
IP masquerading uses address translation to allow containers without a public IP to talk
@@ -433,7 +436,7 @@ Docker supports softlinks for the Docker data directory
Attach to a running container
--no-stdin=false Do not attach STDIN
- --sig-proxy=true Proxy all received signals to the process (non-TTY mode only). SIGCHLD, SIGKILL, and SIGSTOP are not proxied.
+ --sig-proxy=true Proxy all received signals to the process
The `docker attach` command allows you to attach to a running container using
the container's ID or name, either to view its ongoing output or to control it
@@ -484,7 +487,7 @@ attaching to a tty-enabled container (i.e.: launched with `-t`).
$ echo $?
0
$ docker ps -a | grep topdemo
- 7998ac8581f9 ubuntu:14.04 "/usr/bin/top -b" 38 seconds ago Exited (0) 21 seconds ago topdemo
+ 7998ac8581f9 ubuntu:14.04 "/usr/bin/top -b" 38 seconds ago Exited (0) 21 seconds ago topdemo
And in this second example, you can see the exit code returned by the `bash` process
is returned by the `docker attach` command to its caller too:
@@ -505,28 +508,62 @@ is returned by the `docker attach` command to its caller too:
Build a new image from the source code at PATH
- --force-rm=false Always remove intermediate containers, even after unsuccessful builds
+ -f, --file="" Name of the Dockerfile (Default is 'PATH/Dockerfile')
+ --force-rm=false Always remove intermediate containers
--no-cache=false Do not use cache when building the image
--pull=false Always attempt to pull a newer version of the image
-q, --quiet=false Suppress the verbose output generated by the containers
--rm=true Remove intermediate containers after a successful build
- -t, --tag="" Repository name (and optionally a tag) to be applied to the resulting image in case of success
+ -t, --tag="" Repository name (and optionally a tag) for the image
+ -m, --memory="" Memory limit for all build containers
+ --memory-swap="" Total memory (memory + swap), `-1` to disable swap
+ -c, --cpu-shares CPU Shares (relative weight)
+ --cpuset-cpus="" CPUs in which to allow exection, e.g. `0-3`, `0,1`
+
+Builds Docker images from a Dockerfile and a "context". A build's context is
+the files located in the specified `PATH` or `URL`. The build process can
+refer to any of the files in the context. For example, your build can use
+an [*ADD*](/reference/builder/#add) instruction to reference a file in the
+context.
+
+The `URL` parameter can specify the location of a Git repository; in this
+case, the repository is the context. The Git repository is recursively
+cloned with its submodules. The system does a fresh `git clone -recursive`
+in a temporary directory on your local host. Then, this clone is sent to
+the Docker daemon as the context. Local clones give you the ability to
+access private repositories using local user credentials, VPN's, and so forth.
+
+Instead of specifying a context, you can pass a single Dockerfile in the
+`URL` or pipe the file in via `STDIN`. To pipe a Dockerfile from `STDIN`:
-Use this command to build Docker images from a Dockerfile and a
-"context".
+ docker build - < Dockerfile
-The files at `PATH` or `URL` are called the "context" of the build. The
-build process may refer to any of the files in the context, for example
-when using an [*ADD*](/reference/builder/#add) instruction.
-When a single Dockerfile is given as `URL` or is piped through `STDIN`
-(`docker build - < Dockerfile`), then no context is set.
+If you use STDIN or specify a `URL`, the system places the contents into a
+file called `Dockerfile`, and any `-f`, `--file` option is ignored. In this
+scenario, there is no context.
-When a Git repository is set as `URL`, then the repository is used as
-the context. The Git repository is cloned with its submodules
-(`git clone -recursive`). A fresh `git clone` occurs in a temporary directory
-on your local host, and then this is sent to the Docker daemon as the
-context. This way, your local user credentials and VPN's etc can be
-used to access private repositories.
+### Return code
+
+On a successful build, a return code of success `0` will be returned.
+When the build fails, a non-zero failure code will be returned.
+
+There should be informational output of the reason for failure output
+to `STDERR`:
+
+```
+$ docker build -t fail .
+Sending build context to Docker daemon 2.048 kB
+Sending build context to Docker daemon
+Step 0 : FROM busybox
+ ---> 4986bf8c1536
+Step 1 : RUN exit 13
+ ---> Running in e26670ec7a0a
+INFO[0000] The command [/bin/sh -c exit 13] returned a non-zero code: 13
+$ echo $?
+1
+```
+
+### .dockerignore file
If a file named `.dockerignore` exists in the root of `PATH` then it
is interpreted as a newline-separated list of exclusion patterns.
@@ -535,7 +572,7 @@ will be excluded from the context. Globbing is done using Go's
[filepath.Match](http://golang.org/pkg/path/filepath#Match) rules.
Please note that `.dockerignore` files in other subdirectories are
-considered as normal files. Filepaths in .dockerignore are absolute with
+considered as normal files. Filepaths in `.dockerignore` are absolute with
the current directory as the root. Wildcards are allowed but the search
is not recursive.
@@ -562,6 +599,12 @@ in cases where the same set of files are used for multiple builds. The path
must be to a file within the build context. If a relative path is specified
then it must to be relative to the current directory.
+If the Docker client loses connection to the daemon, the build is canceled.
+This happens if you interrupt the Docker client with `ctrl-c` or if the Docker
+client is killed for any reason.
+
+> **Note:** Currently only the "run" phase of the build can be canceled until
+> pull cancelation is implemented).
See also:
@@ -672,8 +715,8 @@ instructions instead of `Dockerfile`.
$ sudo docker build -f dockerfiles/Dockerfile.debug -t myapp_debug .
$ sudo docker build -f dockerfiles/Dockerfile.prod -t myapp_prod .
-The above commands will build the current build context (as specified by
-the `.`) twice, once using a debug version of a `Dockerfile` and once using
+The above commands will build the current build context (as specified by
+the `.`) twice, once using a debug version of a `Dockerfile` and once using
a production version.
$ cd /home/me/myapp/some/dir/really/deep
@@ -681,9 +724,9 @@ a production version.
$ sudo docker build -f ../../../../dockerfiles/debug /home/me/myapp
These two `docker build` commands do the exact same thing. They both
-use the contents of the `debug` file instead of looking for a `Dockerfile`
-and will use `/home/me/myapp` as the root of the build context. Note that
-`debug` is in the directory structure of the build context, regardless of how
+use the contents of the `debug` file instead of looking for a `Dockerfile`
+and will use `/home/me/myapp` as the root of the build context. Note that
+`debug` is in the directory structure of the build context, regardless of how
you refer to it on the command line.
> **Note:** `docker build` will return a `no such file or directory` error
@@ -700,6 +743,7 @@ you refer to it on the command line.
Create a new image from a container's changes
-a, --author="" Author (e.g., "John Hannibal Smith <hannibal@a-team.com>")
+ -c, --change=[] Apply specified Dockerfile instructions while committing the image
-m, --message="" Commit message
-p, --pause=true Pause container during commit
@@ -714,7 +758,11 @@ while the image is committed. This reduces the likelihood of
encountering data corruption during the process of creating the commit.
If this behavior is undesired, set the 'p' option to false.
-#### Commit an existing container
+The `--change` option will apply `Dockerfile` instructions to the image
+that is created.
+Supported `Dockerfile` instructions: `ADD`|`CMD`|`ENTRYPOINT`|`ENV`|`EXPOSE`|`FROM`|`MAINTAINER`|`RUN`|`USER`|`LABEL`|`VOLUME`|`WORKDIR`|`COPY`
+
+#### Commit a container
$ sudo docker ps
ID IMAGE COMMAND CREATED STATUS PORTS
@@ -726,14 +774,29 @@ If this behavior is undesired, set the 'p' option to false.
REPOSITORY TAG ID CREATED VIRTUAL SIZE
SvenDowideit/testimage version3 f5283438590d 16 seconds ago 335.7 MB
+#### Commit a container with new configurations
+
+ $ sudo docker ps
+ ID IMAGE COMMAND CREATED STATUS PORTS
+ c3f279d17e0a ubuntu:12.04 /bin/bash 7 days ago Up 25 hours
+ 197387f1b436 ubuntu:12.04 /bin/bash 7 days ago Up 25 hours
+ $ sudo docker inspect -f "{{ .Config.Env }}" c3f279d17e0a
+ [HOME=/ PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin]
+ $ sudo docker commit --change "ENV DEBUG true" c3f279d17e0a SvenDowideit/testimage:version3
+ f5283438590d
+ $ sudo docker inspect -f "{{ .Config.Env }}" f5283438590d
+ [HOME=/ PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin DEBUG=true]
+
## cp
-Copy files/folders from a container's filesystem to the host
-path. Paths are relative to the root of the filesystem.
+Copy files or folders from a container's filesystem to the directory on the
+host. Use '-' to write the data as a tar file to `STDOUT`. `CONTAINER:PATH` is
+relative to the root of the container's filesystem.
+
+ Usage: docker cp CONTAINER:PATH HOSTDIR|-
- Usage: docker cp CONTAINER:PATH HOSTPATH
+ Copy files/folders from the PATH to the HOSTDIR.
- Copy files/folders from the PATH to the HOSTPATH
## create
@@ -743,48 +806,42 @@ Creates a new container.
Create a new container
- -a, --attach=[] Attach to STDIN, STDOUT or STDERR.
+ -a, --attach=[] Attach to STDIN, STDOUT or STDERR
--add-host=[] Add a custom host-to-IP mapping (host:ip)
-c, --cpu-shares=0 CPU shares (relative weight)
--cap-add=[] Add Linux capabilities
--cap-drop=[] Drop Linux capabilities
+ --cgroup-parent="" Optional parent cgroup for the container
--cidfile="" Write the container ID to the file
- --cpuset="" CPUs in which to allow execution (0-3, 0,1)
- --device=[] Add a host device to the container (e.g. --device=/dev/sdc:/dev/xvdc:rwm)
+ --cpuset-cpus="" CPUs in which to allow execution (0-3, 0,1)
+ --device=[] Add a host device to the container
--dns=[] Set custom DNS servers
- --dns-search=[] Set custom DNS search domains (Use --dns-search=. if you don't wish to set the search domain)
+ --dns-search=[] Set custom DNS search domains
-e, --env=[] Set environment variables
--entrypoint="" Overwrite the default ENTRYPOINT of the image
- --env-file=[] Read in a line delimited file of environment variables
- --expose=[] Expose a port or a range of ports (e.g. --expose=3300-3310) from the container without publishing it to your host
+ --env-file=[] Read in a file of environment variables
+ --expose=[] Expose a port or a range of ports
-h, --hostname="" Container host name
-i, --interactive=false Keep STDIN open even if not attached
- --ipc="" Default is to create a private IPC namespace (POSIX SysV IPC) for the container
- 'container:<name|id>': reuses another container shared memory, semaphores and message queues
- 'host': use the host shared memory,semaphores and message queues inside the container. Note: the host mode gives the container full access to local shared memory and is therefore considered insecure.
- --link=[] Add link to another container in the form of <name or id>:alias
- --lxc-conf=[] (lxc exec-driver only) Add custom lxc options --lxc-conf="lxc.cgroup.cpuset.cpus = 0,1"
- -m, --memory="" Memory limit (format: <number><optional unit>, where unit = b, k, m or g)
+ --ipc="" IPC namespace to use
+ -l, --label=[] Set metadata on the container (e.g., --label=com.example.key=value)
+ --label-file=[] Read in a line delimited file of labels
+ --link=[] Add link to another container
+ --log-driver="" Logging driver for container
+ --lxc-conf=[] Add custom lxc options
+ -m, --memory="" Memory limit
--mac-address="" Container MAC address (e.g. 92:d0:c6:0a:29:33)
--name="" Assign a name to the container
--net="bridge" Set the Network mode for the container
- 'bridge': creates a new network stack for the container on the docker bridge
- 'none': no networking for this container
- 'container:<name|id>': reuses another container network stack
- 'host': use the host network stack inside the container. Note: the host mode gives the container full access to local system services such as D-bus and is therefore considered insecure.
- -P, --publish-all=false Publish all exposed ports to random ports on the host interfaces
- -p, --publish=[] Publish a container's port, or a range of ports (e.g., `-p 3300-3310`), to the host
- format: ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort | containerPort
- Both hostPort and containerPort can be specified as a range of ports.
- When specifying ranges for both, the number of container ports in the range must match the number of host ports in the range. (e.g., `-p 1234-1236:1234-1236/tcp`)
- (use 'docker port' to see the actual mapping)
+ -P, --publish-all=false Publish all exposed ports to random ports
+ -p, --publish=[] Publish a container's port(s) to the host
--privileged=false Give extended privileges to this container
- --read-only=false Mount the container's root filesystem as read only
- --restart="" Restart policy to apply when a container exits (no, on-failure[:max-retry], always)
- --security-opt=[] Security Options
+ --read-only=false Mount the container's root filesystem as read only
+ --restart="no" Restart policy (no, on-failure[:max-retry], always)
+ --security-opt=[] Security options
-t, --tty=false Allocate a pseudo-TTY
-u, --user="" Username or UID
- -v, --volume=[] Bind mount a volume (e.g., from the host: -v /host:/container, from Docker: -v /container)
+ -v, --volume=[] Bind mount a volume
--volumes-from=[] Mount volumes from the specified container(s)
-w, --workdir="" Working directory inside the container
@@ -798,10 +855,8 @@ container at any point.
This is useful when you want to set up a container configuration ahead
of time so that it is ready to start when you need it.
-Note that volumes set by `create` may be over-ridden by options set with
-`start`.
-
-Please see the [run command](#run) section for more details.
+Please see the [run command](#run) section and the [Docker run reference](
+/reference/run/) for more details.
#### Examples
@@ -875,7 +930,7 @@ For example:
Get real time events from the server
- -f, --filter=[] Provide filter values (i.e., 'event=stop')
+ -f, --filter=[] Filter output based on conditions provided
--since="" Show all events created since timestamp
--until="" Stream events until this timestamp
@@ -901,9 +956,10 @@ Using multiple filters will be handled as a *AND*; for example
container 588a23dac085 *AND* the event type is *start*
Current filters:
- * event
- * image
- * container
+
+* container
+* event
+* image
#### Examples
@@ -972,6 +1028,12 @@ You'll need two shells for this example.
$ sudo docker events --filter 'container=7805c1d35632' --filter 'event=stop'
2014-09-03T15:49:29.999999999Z07:00 7805c1d35632: (from redis:2.8) stop
+ $ sudo docker events --filter 'container=container_1' --filter 'container=container_2'
+ 2014-09-03T15:49:29.999999999Z07:00 4386fb97867d: (from ubuntu-1:14.04) die
+ 2014-05-10T17:42:14.999999999Z07:00 4386fb97867d: (from ubuntu-1:14.04) stop
+ 2014-05-10T17:42:14.999999999Z07:00 7805c1d35632: (from redis:2.8) die
+ 2014-09-03T15:49:29.999999999Z07:00 7805c1d35632: (from redis:2.8) stop
+
## exec
Usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
@@ -984,8 +1046,8 @@ You'll need two shells for this example.
The `docker exec` command runs a new command in a running container.
-The command started using `docker exec` will only run while the container's primary
-process (`PID 1`) is running, and will not be restarted if the container is restarted.
+The command started using `docker exec` only runs while the container's primary
+process (`PID 1`) is running, and it is not restarted if the container is restarted.
If the container is paused, then the `docker exec` command will fail with an error:
@@ -1016,18 +1078,26 @@ This will create a new Bash session in the container `ubuntu_bash`.
## export
- Usage: docker export CONTAINER
+ Usage: docker export [OPTIONS] CONTAINER
- Export the contents of a filesystem as a tar archive to STDOUT
+ Export the contents of a filesystem to a tar archive (streamed to STDOUT by default)
-For example:
+ -o, --output="" Write to a file, instead of STDOUT
+
+ Produces a tarred repository to the standard output stream.
+
+ For example:
$ sudo docker export red_panda > latest.tar
+ Or
+
+ $ sudo docker export --output="latest.tar" red_panda
+
> **Note:**
> `docker export` does not export the contents of volumes associated with the
-> container. If a volume is mounted on top of an existing directory in the
-> container, `docker export` will export the contents of the *underlying*
+> container. If a volume is mounted on top of an existing directory in the
+> container, `docker export` will export the contents of the *underlying*
> directory, not the contents of the volume.
>
> Refer to [Backup, restore, or migrate data volumes](/userguide/dockervolumes/#backup-restore-or-migrate-data-volumes)
@@ -1059,8 +1129,10 @@ To see how the `docker:latest` image was built:
List images
- -a, --all=false Show all images (by default filter out the intermediate image layers)
- -f, --filter=[] Provide filter values (i.e., 'dangling=true')
+ -a, --all=false Show all images (default hides intermediate images)
+ --digests=false Show digests
+ -f, --filter=[] Filter output based on conditions provided
+ --help=false Print usage
--no-trunc=false Don't truncate output
-q, --quiet=false Only show numeric IDs
@@ -1109,6 +1181,22 @@ uses up the `VIRTUAL SIZE` listed only once.
tryout latest 2629d1fa0b81b222fca63371ca16cbf6a0772d07759ff80e8d1369b926940074 23 hours ago 131.5 MB
<none> <none> 5ed6274db6ceb2397844896966ea239290555e74ef307030ebb01ff91b1914df 24 hours ago 1.089 GB
+#### Listing image digests
+
+Images that use the v2 or later format have a content-addressable identifier
+called a `digest`. As long as the input used to generate the image is
+unchanged, the digest value is predictable. To list image digest values, use
+the `--digests` flag:
+
+ $ sudo docker images --digests | head
+ REPOSITORY TAG DIGEST IMAGE ID CREATED VIRTUAL SIZE
+ localhost:5000/test/busybox <none> sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf 4986bf8c1536 9 weeks ago 2.43 MB
+
+When pushing or pulling to a 2.0 registry, the `push` or `pull` command
+output includes the image digest. You can `pull` using a digest value. You can
+also reference by digest in `create`, `run`, and `rmi` commands, as well as the
+`FROM` image reference in a Dockerfile.
+
#### Filtering
The filtering flag (`-f` or `--filter`) format is of "key=value". If there is more
@@ -1116,6 +1204,7 @@ than one filter, then pass multiple flags (e.g., `--filter "foo=bar" --filter "b
Current filters:
* dangling (boolean - true or false)
+ * label (`label=<key>` or `label=<key>=<value>`)
##### Untagged images
@@ -1152,13 +1241,22 @@ NOTE: Docker will warn you if any containers exist that are using these untagged
Usage: docker import URL|- [REPOSITORY[:TAG]]
- Create an empty filesystem image and import the contents of the tarball (.tar, .tar.gz, .tgz, .bzip, .tar.xz, .txz) into it, then optionally tag it.
+ Create an empty filesystem image and import the contents of the
+ tarball (.tar, .tar.gz, .tgz, .bzip, .tar.xz, .txz) into it, then
+ optionally tag it.
+
+ -c, --change=[] Apply specified Dockerfile instructions while importing the image
URLs must start with `http` and point to a single file archive (.tar,
.tar.gz, .tgz, .bzip, .tar.xz, or .txz) containing a root filesystem. If
you would like to import from a local directory or archive, you can use
the `-` parameter to take the data from `STDIN`.
+The `--change` option will apply `Dockerfile` instructions to the image
+that is created.
+Supported `Dockerfile` instructions: `CMD`, `ENTRYPOINT`, `ENV`, `EXPOSE`,
+`ONBUILD`, `USER`, `VOLUME`, `WORKDIR`
+
#### Examples
**Import from a remote location:**
@@ -1177,6 +1275,10 @@ Import to docker via pipe and `STDIN`.
$ sudo tar -c . | sudo docker import - exampleimagedir
+**Import from a local directory with new configurations:**
+
+ $ sudo tar -c . | sudo docker import --change "ENV DEBUG true" - exampleimagedir
+
Note the `sudo` in this example – you must preserve
the ownership of the files (especially root ownership) during the
archiving with tar. If you are not root (or the sudo command) when you
@@ -1209,9 +1311,13 @@ For example:
Debug mode (client): true
Fds: 10
Goroutines: 9
+ System Time: Tue Mar 10 18:38:57 UTC 2015
EventsListeners: 0
Init Path: /usr/bin/docker
Docker Root Dir: /var/lib/docker
+ Http Proxy: http://test:test@localhost:8080
+ Https Proxy: https://test:test@localhost:8080
+ No Proxy: 9.81.1.160
Username: svendowideit
Registry: [https://index.docker.io/v1/]
Labels:
@@ -1228,7 +1334,7 @@ ensure we know how your setup is configured.
Return low-level information on a container or image
- -f, --format="" Format the output using the given go template.
+ -f, --format="" Format the output using the given go template
By default, this will render all results in a JSON array. If a format is
specified, the given template will be executed for each result.
@@ -1252,6 +1358,10 @@ straightforward manner.
$ sudo docker inspect --format='{{.NetworkSettings.MacAddress}}' $INSTANCE_ID
+**Get an instance's log path:**
+
+ $ sudo docker inspect --format='{{.LogPath}}' $INSTANCE_ID
+
**List All Port Bindings:**
One can loop over arrays and maps in the results to produce simple text
@@ -1321,7 +1431,8 @@ Restores both images and tags.
Usage: docker login [OPTIONS] [SERVER]
- Register or log in to a Docker registry server, if no server is specified "https://index.docker.io/v1/" is the default.
+ Register or log in to a Docker registry server, if no server is
+ specified "https://index.docker.io/v1/" is the default.
-e, --email="" Email
-p, --password="" Password
@@ -1337,7 +1448,8 @@ adding the server name.
Usage: docker logout [SERVER]
- Log out from a Docker registry, if no server is specified "https://index.docker.io/v1/" is the default.
+ Log out from a Docker registry, if no server is
+ specified "https://index.docker.io/v1/" is the default.
For example:
@@ -1351,7 +1463,10 @@ For example:
-f, --follow=false Follow log output
-t, --timestamps=false Show timestamps
- --tail="all" Output the specified number of lines at the end of logs (defaults to all logs)
+ --tail="all" Number of lines to show from the end of the logs
+
+NOTE: this command is available only for containers with `json-file` logging
+driver.
The `docker logs` command batch-retrieves logs present at the time of execution.
@@ -1368,7 +1483,7 @@ nano-second part of the timestamp will be padded with zero when necessary.
## pause
- Usage: docker pause CONTAINER
+ Usage: docker pause CONTAINER [CONTAINER...]
Pause all processes within a container
@@ -1386,7 +1501,8 @@ for further details.
Usage: docker port CONTAINER [PRIVATE_PORT[/PROTO]]
- List port mappings for the CONTAINER, or lookup the public-facing port that is NAT-ed to the PRIVATE_PORT
+ List port mappings for the CONTAINER, or lookup the public-facing port that is
+ NAT-ed to the PRIVATE_PORT
You can find out all the ports mapped by not specifying a `PRIVATE_PORT`, or
just a specific mapping:
@@ -1404,58 +1520,34 @@ just a specific mapping:
$ sudo docker port test 7890
0.0.0.0:4321
-## pause
-
- Usage: docker pause CONTAINER
-
- Pause all processes within a container
-
-The `docker pause` command uses the cgroups freezer to suspend all processes in
-a container. Traditionally when suspending a process the `SIGSTOP` signal is
-used, which is observable by the process being suspended. With the cgroups freezer
-the process is unaware, and unable to capture, that it is being suspended,
-and subsequently resumed.
-
-See the
-[cgroups freezer documentation](https://www.kernel.org/doc/Documentation/cgroups/freezer-subsystem.txt)
-for further details.
-
-## rename
-
- Usage: docker rename OLD_NAME NEW_NAME
-
- rename a existing container to a NEW_NAME
-
-The `docker rename` command allows the container to be renamed to a different name.
-
## ps
Usage: docker ps [OPTIONS]
List containers
- -a, --all=false Show all containers. Only running containers are shown by default.
- --before="" Show only container created before Id or Name, include non-running ones.
- -f, --filter=[] Provide filter values. Valid filters:
- exited=<int> - containers with exit code of <int>
- status=(restarting|running|paused|exited)
- -l, --latest=false Show only the latest created container, include non-running ones.
- -n=-1 Show n last created containers, include non-running ones.
+ -a, --all=false Show all containers (default shows just running)
+ --before="" Show only container created before Id or Name
+ -f, --filter=[] Filter output based on conditions provided
+ -l, --latest=false Show the latest created container, include non-running
+ -n=-1 Show n last created containers, include non-running
--no-trunc=false Don't truncate output
-q, --quiet=false Only display numeric IDs
-s, --size=false Display total file sizes
- --since="" Show only containers created since Id or Name, include non-running ones.
+ --since="" Show created since Id or Name, include non-running
Running `docker ps --no-trunc` showing 2 linked containers.
$ sudo docker ps
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- f7ee772232194fcc088c6bdec6ea09f7b3f6c54d53934658164b8602d7cd4744 ubuntu:12.04 bash 17 seconds ago Up 16 seconds webapp
- d0963715a061c7c7b7cc80b2646da913a959fbf13e80a971d4a60f6997a2f595 crosbymichael/redis:latest /redis-server --dir 33 minutes ago Up 33 minutes 6379/tcp redis,webapp/db
+ CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
+ 4c01db0b339c ubuntu:12.04 bash 17 seconds ago Up 16 seconds 3300-3310/tcp webapp
+ d7886598dbe2 crosbymichael/redis:latest /redis-server --dir 33 minutes ago Up 33 minutes 6379/tcp redis,webapp/db
`docker ps` will show only running containers by default. To see all containers:
`docker ps -a`
+`docker ps` will group exposed ports into a single range if possible. E.g., a container that exposes TCP ports `100, 101, 102` will display `100-102/tcp` in the `PORTS` column.
+
#### Filtering
The filtering flag (`-f` or `--filter)` format is a `key=value` pair. If there is more
@@ -1498,11 +1590,14 @@ To download a particular image, or set of images (i.e., a repository),
use `docker pull`:
$ sudo docker pull debian
- # will pull the debian:latest image, its intermediate layers
- # and any aliases of the same id
+ # will pull the debian:latest image and its intermediate layers
$ sudo docker pull debian:testing
# will pull the image named debian:testing and any intermediate
# layers it is based on.
+ $ sudo docker pull debian@sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf
+ # will pull the image from the debian repository with the digest
+ # sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf
+ # and any intermediate layers it is based on.
# (Typically the empty `scratch` image, a MAINTAINER layer,
# and the un-tarred base).
$ sudo docker pull --all-tags centos
@@ -1520,13 +1615,21 @@ use `docker pull`:
Use `docker push` to share your images to the [Docker Hub](https://hub.docker.com)
registry or to a self-hosted one.
+## rename
+
+ Usage: docker rename OLD_NAME NEW_NAME
+
+ rename a existing container to a NEW_NAME
+
+The `docker rename` command allows the container to be renamed to a different name.
+
## restart
Usage: docker restart [OPTIONS] CONTAINER [CONTAINER...]
Restart a running container
- -t, --time=10 Number of seconds to try to stop for before killing the container. Once killed it will then be restarted. Default is 10 seconds.
+ -t, --time=10 Seconds to wait for stop before killing the container
## rm
@@ -1535,7 +1638,7 @@ registry or to a self-hosted one.
Remove one or more containers
-f, --force=false Force the removal of a running container (uses SIGKILL)
- -l, --link=false Remove the specified link and not the underlying container
+ -l, --link=false Remove the specified link
-v, --volumes=false Remove the volumes associated with the container
#### Examples
@@ -1574,9 +1677,9 @@ deleted.
#### Removing tagged images
-Images can be removed either by their short or long IDs, or their image
-names. If an image has more than one name, each of them needs to be
-removed before the image is removed.
+You can remove an image using its short or long ID, its tag, or its digest. If
+an image has one or more tag or digest reference, you must remove all of them
+before the image is removed.
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
@@ -1585,74 +1688,82 @@ removed before the image is removed.
test2 latest fd484f19954f 23 seconds ago 7 B (virtual 4.964 MB)
$ sudo docker rmi fd484f19954f
- Error: Conflict, cannot delete image fd484f19954f because it is tagged in multiple repositories
+ Error: Conflict, cannot delete image fd484f19954f because it is tagged in multiple repositories, use -f to force
2013/12/11 05:47:16 Error: failed to remove one or more images
$ sudo docker rmi test1
- Untagged: fd484f19954f4920da7ff372b5067f5b7ddb2fd3830cecd17b96ea9e286ba5b8
+ Untagged: test1:latest
$ sudo docker rmi test2
- Untagged: fd484f19954f4920da7ff372b5067f5b7ddb2fd3830cecd17b96ea9e286ba5b8
+ Untagged: test2:latest
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test latest fd484f19954f 23 seconds ago 7 B (virtual 4.964 MB)
$ sudo docker rmi test
- Untagged: fd484f19954f4920da7ff372b5067f5b7ddb2fd3830cecd17b96ea9e286ba5b8
+ Untagged: test:latest
Deleted: fd484f19954f4920da7ff372b5067f5b7ddb2fd3830cecd17b96ea9e286ba5b8
+An image pulled by digest has no tag associated with it:
+
+ $ sudo docker images --digests
+ REPOSITORY TAG DIGEST IMAGE ID CREATED VIRTUAL SIZE
+ localhost:5000/test/busybox <none> sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf 4986bf8c1536 9 weeks ago 2.43 MB
+
+To remove an image using its digest:
+
+ $ sudo docker rmi localhost:5000/test/busybox@sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf
+ Untagged: localhost:5000/test/busybox@sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf
+ Deleted: 4986bf8c15363d1c5d15512d5266f8777bfba4974ac56e3270e7760f6f0a8125
+ Deleted: ea13149945cb6b1e746bf28032f02e9b5a793523481a0a18645fc77ad53c4ea2
+ Deleted: df7546f9f060a2268024c8a230d8639878585defcc1bc6f79d2728a13957871b
+
## run
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
Run a command in a new container
- -a, --attach=[] Attach to STDIN, STDOUT or STDERR.
+ -a, --attach=[] Attach to STDIN, STDOUT or STDERR
--add-host=[] Add a custom host-to-IP mapping (host:ip)
-c, --cpu-shares=0 CPU shares (relative weight)
--cap-add=[] Add Linux capabilities
--cap-drop=[] Drop Linux capabilities
--cidfile="" Write the container ID to the file
- --cpuset="" CPUs in which to allow execution (0-3, 0,1)
- -d, --detach=false Detached mode: run the container in the background and print the new container ID
- --device=[] Add a host device to the container (e.g. --device=/dev/sdc:/dev/xvdc:rwm)
+ --cpuset-cpus="" CPUs in which to allow execution (0-3, 0,1)
+ -d, --detach=false Run container in background and print container ID
+ --device=[] Add a host device to the container
--dns=[] Set custom DNS servers
- --dns-search=[] Set custom DNS search domains (Use --dns-search=. if you don't wish to set the search domain)
+ --dns-search=[] Set custom DNS search domains
-e, --env=[] Set environment variables
--entrypoint="" Overwrite the default ENTRYPOINT of the image
- --env-file=[] Read in a line delimited file of environment variables
- --expose=[] Expose a port or a range of ports (e.g. --expose=3300-3310) from the container without publishing it to your host
+ --env-file=[] Read in a file of environment variables
+ --expose=[] Expose a port or a range of ports
-h, --hostname="" Container host name
+ --help=false Print usage
-i, --interactive=false Keep STDIN open even if not attached
- --ipc="" Default is to create a private IPC namespace (POSIX SysV IPC) for the container
- 'container:<name|id>': reuses another container shared memory, semaphores and message queues
- 'host': use the host shared memory,semaphores and message queues inside the container. Note: the host mode gives the container full access to local shared memory and is therefore considered insecure.
- --link=[] Add link to another container in the form of name:alias
- --lxc-conf=[] (lxc exec-driver only) Add custom lxc options --lxc-conf="lxc.cgroup.cpuset.cpus = 0,1"
- -m, --memory="" Memory limit (format: <number><optional unit>, where unit = b, k, m or g)
- -memory-swap="" Total memory usage (memory + swap), set '-1' to disable swap (format: <number><optional unit>, where unit = b, k, m or g)
+ --ipc="" IPC namespace to use
+ --link=[] Add link to another container
+ --log-driver="" Logging driver for container
+ --lxc-conf=[] Add custom lxc options
+ -m, --memory="" Memory limit
+ -l, --label=[] Set metadata on the container (e.g., --label=com.example.key=value)
+ --label-file=[] Read in a file of labels (EOL delimited)
--mac-address="" Container MAC address (e.g. 92:d0:c6:0a:29:33)
+ --memory-swap="" Total memory (memory + swap), '-1' to disable swap
--name="" Assign a name to the container
--net="bridge" Set the Network mode for the container
- 'bridge': creates a new network stack for the container on the docker bridge
- 'none': no networking for this container
- 'container:<name|id>': reuses another container network stack
- 'host': use the host network stack inside the container. Note: the host mode gives the container full access to local system services such as D-bus and is therefore considered insecure.
- -P, --publish-all=false Publish all exposed ports to random ports on the host interfaces
- -p, --publish=[] Publish a container's port to the host
- format: ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort | containerPort
- Both hostPort and containerPort can be specified as a range of ports.
- When specifying ranges for both, the number of container ports in the range must match the number of host ports in the range. (e.g., `-p 1234-1236:1234-1236/tcp`)
- (use 'docker port' to see the actual mapping)
- --pid=host 'host': use the host PID namespace inside the container. Note: the host mode gives the container full access to local system services such as D-bus and is therefore considered insecure.
+ -P, --publish-all=false Publish all exposed ports to random ports
+ -p, --publish=[] Publish a container's port(s) to the host
+ --pid="" PID namespace to use
--privileged=false Give extended privileges to this container
- --read-only=false Mount the container's root filesystem as read only
- --restart="" Restart policy to apply when a container exits (no, on-failure[:max-retry], always)
- --rm=false Automatically remove the container when it exits (incompatible with -d)
+ --read-only=false Mount the container's root filesystem as read only
+ --restart="no" Restart policy (no, on-failure[:max-retry], always)
+ --rm=false Automatically remove the container when it exits
--security-opt=[] Security Options
- --sig-proxy=true Proxy received signals to the process (non-TTY mode only). SIGCHLD, SIGSTOP, and SIGKILL are not proxied.
+ --sig-proxy=true Proxy received signals to the process
-t, --tty=false Allocate a pseudo-TTY
- -u, --user="" Username or UID
- -v, --volume=[] Bind mount a volume (e.g., from the host: -v /host:/container, from Docker: -v /container)
+ -u, --user="" Username or UID (format: <name|uid>[:<group|gid>])
+ -v, --volume=[] Bind mount a volume
--volumes-from=[] Mount volumes from the specified container(s)
-w, --workdir="" Working directory inside the container
@@ -1736,7 +1847,7 @@ folder before starting your container.
$ sudo docker run --read-only -v /icanwrite busybox touch /icanwrite here
-Volumes can be used in combination with `--read-only` to control where
+Volumes can be used in combination with `--read-only` to control where
a container writes files. The `--read-only` flag mounts the container's root
filesystem as read only prohibiting writes to locations other than the
specified volumes for the container.
@@ -1766,7 +1877,7 @@ ports in Docker.
This sets environmental variables in the container. For illustration all three
flags are shown here. Where `-e`, `--env` take an environment variable and
value, or if no `=` is provided, then that variable's current value is passed
-through (i.e. `$MYVAR1` from the host is set to `$MYVAR1` in the container).
+through (i.e. `$MYVAR1` from the host is set to `$MYVAR1` in the container).
When no `=` is provided and that variable is not defined in the client's
environment then that variable will be removed from the container's list of
environment variables.
@@ -1807,8 +1918,39 @@ An example of a file passed with `--env-file`
$ sudo docker run --name console -t -i ubuntu bash
-This will create and run a new container with the container name being
-`console`.
+A label is a a `key=value` pair that applies metadata to a container. To label a container with two labels:
+
+ $ sudo docker run -l my-label --label com.example.foo=bar ubuntu bash
+
+The `my-label` key doesn't specify a value so the label defaults to an empty
+string(`""`). To add multiple labels, repeat the label flag (`-l` or `--label`).
+
+The `key=value` must be unique to avoid overwriting the label value. If you
+specify labels with identical keys but different values, each subsequent value
+overwrites the previous. Docker uses the last `key=value` you supply.
+
+Use the `--label-file` flag to load multiple labels from a file. Delimit each
+label in the file with an EOL mark. The example below loads labels from a
+labels file in the current directory:
+
+ $ sudo docker run --label-file ./labels ubuntu bash
+
+The label-file format is similar to the format for loading environment
+variables. (Unlike environment variables, labels are not visislbe to processes
+running inside a container.) The following example illustrates a label-file
+format:
+
+ com.example.label1="a label"
+
+ # this is a comment
+ com.example.label2=another\ label
+ com.example.label3
+
+You can load multiple label-files by supplying multiple `--label-file` flags.
+
+For additional information on working with labels, see [*Labels - custom
+metadata in Docker*](/userguide/labels-custom-metadata/) in the Docker User
+Guide.
$ sudo docker run --link /redis:redis --name console ubuntu bash
@@ -1881,7 +2023,7 @@ flag:
fdisk: unable to open /dev/xvdc: Operation not permitted
```
-**Note:**
+> **Note:**
> `--device` cannot be safely used with ephemeral devices. Block devices that
> may be removed should not be added to untrusted containers with `--device`.
@@ -1918,41 +2060,56 @@ application change:
#### Restart Policies
-Using the `--restart` flag on Docker run you can specify a restart policy for
-how a container should or should not be restarted on exit.
-
-An ever increasing delay (double the previous delay, starting at 100 milliseconds)
-is added before each restart to prevent flooding the server. This means the daemaon
-will wait for 100 mS, then 200 mS, 400, 800, 1600, and so on until either the
-`on-failure` limit is hit, or when you `docker stop` or even `docker rm -f`
-the container.
-
-When a restart policy is active on a container, it will be shown in `docker ps`
-as either `Up` or `Restarting` in `docker ps`. It can also be useful to use
-`docker events` to see the restart policy in effect.
-
-** no ** - Do not restart the container when it exits.
-
-** on-failure ** - Restart the container only if it exits with a non zero exit status.
-
-** always ** - Always restart the container regardless of the exit status.
-
-You can also specify the maximum amount of times Docker will try to
-restart the container when using the ** on-failure ** policy. The
-default is that Docker will try forever to restart the container.
+Use Docker's `--restart` to specify a container's *restart policy*. A restart
+policy controls whether the Docker daemon restarts a container after exit.
+Docker supports the following restart policies:
+
+<table>
+ <thead>
+ <tr>
+ <th>Policy</th>
+ <th>Result</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td><strong>no</strong></td>
+ <td>
+ Do not automatically restart the container when it exits. This is the
+ default.
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <span style="white-space: nowrap">
+ <strong>on-failure</strong>[:max-retries]
+ </span>
+ </td>
+ <td>
+ Restart only if the container exits with a non-zero exit status.
+ Optionally, limit the number of restart retries the Docker
+ daemon attempts.
+ </td>
+ </tr>
+ <tr>
+ <td><strong>always</strong></td>
+ <td>
+ Always restart the container regardless of the exit status.
+ When you specify always, the Docker daemon will try to restart
+ the container indefinitely.
+ </td>
+ </tr>
+ </tbody>
+</table>
$ sudo docker run --restart=always redis
-This will run the `redis` container with a restart policy of ** always ** so that if
-the container exits, Docker will restart it.
-
- $ sudo docker run --restart=on-failure:10 redis
+This will run the `redis` container with a restart policy of **always**
+so that if the container exits, Docker will restart it.
-This will run the `redis` container with a restart policy of **
-on-failure ** and a maximum restart count of 10. If the `redis`
-container exits with a non-zero exit status more than 10 times in a row
-Docker will abort trying to restart the container. Providing a maximum
-restart limit is only valid for the ** on-failure ** policy.
+More detailed information on restart policies can be found in the
+[Restart Policies (--restart)](/reference/run/#restart-policies-restart) section
+of the Docker run reference page.
### Adding entries to a container hosts file
@@ -1970,13 +2127,38 @@ You can add other hosts into a container's `/etc/hosts` file by using one or mor
round-trip min/avg/max/stddev = 7.600/19.152/30.705/11.553 ms
```
-> **Note:**
-> Sometimes you need to connect to the Docker host, which means getting the IP
-> address of the host. You can use the following shell commands to simplify this
-> process:
->
-> $ alias hostip="ip route show 0.0.0.0/0 | grep -Eo 'via \S+' | awk '{ print \$2 }'"
-> $ docker run --add-host=docker:$(hostip) --rm -it debian
+Sometimes you need to connect to the Docker host from within your
+container. To enable this, pass the Docker host's IP address to
+the container using the `--add-host` flag. To find the host's address,
+use the `ip addr show` command.
+
+The flags you pass to `ip addr show` depend on whether you are
+using IPv4 or IPv6 networking in your containers. Use the following
+flags for IPv4 address retrieval for a network device named `eth0`:
+
+ $ HOSTIP=`ip -4 addr show scope global dev eth0 | grep inet | awk '{print \$2}' | cut -d / -f 1`
+ $ docker run --add-host=docker:${HOSTIP} --rm -it debian
+
+For IPv6 use the `-6` flag instead of the `-4` flag. For other network
+devices, replace `eth0` with the correct device name (for example `docker0`
+for the bridge device).
+
+### Setting ulimits in a container
+
+Since setting `ulimit` settings in a container requires extra privileges not
+available in the default container, you can set these using the `--ulimit` flag.
+`--ulimit` is specified with a soft and hard limit as such:
+`<type>=<soft limit>[:<hard limit>]`, for example:
+
+```
+ $ docker run --ulimit nofile=1024:1024 --rm debian ulimit -n
+ 1024
+```
+
+>**Note:**
+> If you do not provide a `hard limit`, the `soft limit` will be used for both
+values. If no `ulimits` are set, they will be inherited from the default `ulimits`
+set on the daemon.
## save
@@ -2021,28 +2203,26 @@ See [*Find Public Images on Docker Hub*](
/userguide/dockerrepos/#searching-for-images) for
more details on finding shared images from the command line.
-> **Note:**
-> Search queries will only return up to 25 results
+> **Note:**
+> Search queries will only return up to 25 results
## start
Usage: docker start [OPTIONS] CONTAINER [CONTAINER...]
- Restart a stopped container
+ Start one or more stopped containers
- -a, --attach=false Attach container's STDOUT and STDERR and forward all signals to the process
+ -a, --attach=false Attach STDOUT/STDERR and forward signals
-i, --interactive=false Attach container's STDIN
## stats
- Usage: docker stats [CONTAINERS]
+ Usage: docker stats CONTAINER [CONTAINER...]
Display a live stream of one or more containers' resource usage statistics
--help=false Print usage
-> **Note**: this functionality currently only works when using the *libcontainer* exec-driver.
-
Running `docker stats` on multiple containers
$ sudo docker stats redis1 redis2
@@ -2051,7 +2231,7 @@ Running `docker stats` on multiple containers
redis2 0.07% 2.746 MiB/64 MiB 4.29% 1.266 KiB/648 B
-The `docker stats` command will only return a live stream of data for running
+The `docker stats` command will only return a live stream of data for running
containers. Stopped containers will not return any data.
> **Note:**
@@ -2061,9 +2241,10 @@ containers. Stopped containers will not return any data.
Usage: docker stop [OPTIONS] CONTAINER [CONTAINER...]
- Stop a running container by sending SIGTERM and then SIGKILL after a grace period
+ Stop a running container by sending SIGTERM and then SIGKILL after a
+ grace period
- -t, --time=10 Number of seconds to wait for the container to stop before killing it. Default is 10 seconds.
+ -t, --time=10 Seconds to wait for stop before killing it
The main process inside the container will receive `SIGTERM`, and after a
grace period, `SIGKILL`.
@@ -2088,7 +2269,7 @@ them to [*Share Images via Repositories*](
## unpause
- Usage: docker unpause CONTAINER
+ Usage: docker unpause CONTAINER [CONTAINER...]
Unpause all processes within a container
@@ -2105,8 +2286,21 @@ for further details.
Show the Docker version information.
-Show the Docker version, API version, Git commit, and Go version of
-both Docker client and daemon.
+Show the Docker version, API version, Git commit, Go version and OS/architecture
+of both Docker client and daemon. Example use:
+
+ $ sudo docker version
+ Client version: 1.5.0
+ Client API version: 1.17
+ Go version (client): go1.4.1
+ Git commit (client): a8a31ef
+ OS/Arch (client): darwin/amd64
+ Server version: 1.5.0
+ Server API version: 1.17
+ Go version (server): go1.4.1
+ Git commit (server): a8a31ef
+ OS/Arch (server): linux/amd64
+
## wait
diff --git a/docs/sources/reference/run.md b/docs/sources/reference/run.md
index ca7480beb8..5a466461e6 100644
--- a/docs/sources/reference/run.md
+++ b/docs/sources/reference/run.md
@@ -2,6 +2,12 @@ page_title: Docker run reference
page_description: Configure containers at runtime
page_keywords: docker, run, configure, runtime
+<!-- TODO (@thaJeztah) define more flexible table/td classes -->
+<style>
+.content-body table .no-wrap {
+ white-space: nowrap;
+}
+</style>
# Docker run reference
**Docker runs processes in isolated containers**. When an operator
@@ -18,7 +24,7 @@ other `docker` command.
The basic `docker run` command takes this form:
- $ sudo docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARG...]
+ $ sudo docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
To learn how to interpret the types of `[OPTIONS]`,
see [*Option types*](/reference/commandline/cli/#option-types).
@@ -50,8 +56,9 @@ following options.
- [Container Identification](#container-identification)
- [Name (--name)](#name-name)
- [PID Equivalent](#pid-equivalent)
- - [IPC Settings](#ipc-settings)
+ - [IPC Settings (--ipc)](#ipc-settings-ipc)
- [Network Settings](#network-settings)
+ - [Restart Policies (--restart)](#restart-policies-restart)
- [Clean Up (--rm)](#clean-up-rm)
- [Runtime Constraints on CPU and Memory](#runtime-constraints-on-cpu-and-memory)
- [Runtime Privilege, Linux Capabilities, and LXC Configuration](#runtime-privilege-linux-capabilities-and-lxc-configuration)
@@ -95,9 +102,10 @@ specify to which of the three standard streams (`STDIN`, `STDOUT`,
$ sudo docker run -a stdin -a stdout -i -t ubuntu /bin/bash
For interactive processes (like a shell), you must use `-i -t` together in
-order to allocate a tty for the container process. Specifying `-t` is however
-forbidden when the client standard output is redirected or pipe, such as in:
-`echo test | docker run -i busybox cat`.
+order to allocate a tty for the container process. `-i -t` is often written `-it`
+as you'll see in later examples. Specifying `-t` is forbidden when the client
+standard output is redirected or piped, such as in:
+`echo test | sudo docker run -i busybox cat`.
## Container identification
@@ -126,16 +134,23 @@ programs might write out their process ID to a file (you've seen them as
PID files):
--cidfile="": Write the container ID to the file
-
+
### Image[:tag]
While not strictly a means of identifying a container, you can specify a version of an
image you'd like to run the container with by adding `image[:tag]` to the command. For
example, `docker run ubuntu:14.04`.
-## PID Settings
+### Image[@digest]
+
+Images using the v2 or later image format have a content-addressable identifier
+called a digest. As long as the input used to generate the image is unchanged,
+the digest value is predictable and referenceable.
+
+## PID Settings (--pid)
--pid="" : Set the PID (Process) Namespace mode for the container,
'host': use the host's PID namespace inside the container
+
By default, all containers have the PID namespace enabled.
PID namespace provides separation of processes. The PID Namespace removes the
@@ -153,13 +168,16 @@ within the container.
This command would allow you to use `strace` inside the container on pid 1234 on
the host.
-## IPC Settings
+## IPC Settings (--ipc)
+
--ipc="" : Set the IPC mode for the container,
- 'container:<name|id>': reuses another container's IPC namespace
- 'host': use the host's IPC namespace inside the container
+ 'container:<name|id>': reuses another container's IPC namespace
+ 'host': use the host's IPC namespace inside the container
+
By default, all containers have the IPC namespace enabled.
-IPC (POSIX/SysV IPC) namespace provides separation of named shared memory segments, semaphores and message queues.
+IPC (POSIX/SysV IPC) namespace provides separation of named shared memory
+segments, semaphores and message queues.
Shared memory segments are used to accelerate inter-process communication at
memory speed, rather than through pipes or through the network stack. Shared
@@ -173,10 +191,10 @@ of the containers.
--dns=[] : Set custom dns servers for the container
--net="bridge" : Set the Network mode for the container
- 'bridge': creates a new network stack for the container on the docker bridge
- 'none': no networking for this container
- 'container:<name|id>': reuses another container network stack
- 'host': use the host network stack inside the container
+ 'bridge': creates a new network stack for the container on the docker bridge
+ 'none': no networking for this container
+ 'container:<name|id>': reuses another container network stack
+ 'host': use the host network stack inside the container
--add-host="" : Add a line to /etc/hosts (host:IP)
--mac-address="" : Sets the container's Ethernet device's MAC address
@@ -195,10 +213,41 @@ explicitly by providing a MAC via the `--mac-address` parameter (format:
Supported networking modes are:
-* none - no networking in the container
-* bridge - (default) connect the container to the bridge via veth interfaces
-* host - use the host's network stack inside the container. Note: This gives the container full access to local system services such as D-bus and is therefore considered insecure.
-* container - use another container's network stack
+<table>
+ <thead>
+ <tr>
+ <th class="no-wrap">Mode</th>
+ <th>Description</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td class="no-wrap"><strong>none</strong></td>
+ <td>
+ No networking in the container.
+ </td>
+ </tr>
+ <tr>
+ <td class="no-wrap"><strong>bridge</strong> (default)</td>
+ <td>
+ Connect the container to the bridge via veth interfaces.
+ </td>
+ </tr>
+ <tr>
+ <td class="no-wrap"><strong>host</strong></td>
+ <td>
+ Use the host's network stack inside the container.
+ </td>
+ </tr>
+ <tr>
+ <td class="no-wrap"><strong>container</strong>:&lt;name|id&gt;</td>
+ <td>
+ Use the network stack of another container, specified via
+ its *name* or *id*.
+ </td>
+ </tr>
+ </tbody>
+</table>
#### Mode: none
@@ -226,6 +275,9 @@ container. The container's hostname will match the hostname on the host
system. Publishing ports and linking to other containers will not work
when sharing the host's network stack.
+> **Note**: `--net="host"` gives the container full access to local system
+> services such as D-bus and is therefore considered insecure.
+
#### Mode: container
With the networking mode set to `container` a container will share the
@@ -238,7 +290,7 @@ running the `redis-cli` command and connecting to the Redis server over the
$ sudo docker run -d --name redis example/redis --bind 127.0.0.1
$ # use the redis container's network stack to access localhost
- $ sudo docker run --rm -ti --net container:redis example/redis-cli -h 127.0.0.1
+ $ sudo docker run --rm -it --net container:redis example/redis-cli -h 127.0.0.1
### Managing /etc/hosts
@@ -246,7 +298,7 @@ Your container will have lines in `/etc/hosts` which define the hostname of the
container itself as well as `localhost` and a few other common things. The
`--add-host` flag can be used to add additional lines to `/etc/hosts`.
- $ /docker run -ti --add-host db-static:86.75.30.9 ubuntu cat /etc/hosts
+ $ sudo docker run -it --add-host db-static:86.75.30.9 ubuntu cat /etc/hosts
172.17.0.22 09d03f76bf2c
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
@@ -256,6 +308,99 @@ container itself as well as `localhost` and a few other common things. The
::1 localhost ip6-localhost ip6-loopback
86.75.30.9 db-static
+## Restart policies (--restart)
+
+Using the `--restart` flag on Docker run you can specify a restart policy for
+how a container should or should not be restarted on exit.
+
+When a restart policy is active on a container, it will be shown as either `Up`
+or `Restarting` in [`docker ps`](/reference/commandline/cli/#ps). It can also be
+useful to use [`docker events`](/reference/commandline/cli/#events) to see the
+restart policy in effect.
+
+Docker supports the following restart policies:
+
+<table>
+ <thead>
+ <tr>
+ <th>Policy</th>
+ <th>Result</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td><strong>no</strong></td>
+ <td>
+ Do not automatically restart the container when it exits. This is the
+ default.
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <span style="white-space: nowrap">
+ <strong>on-failure</strong>[:max-retries]
+ </span>
+ </td>
+ <td>
+ Restart only if the container exits with a non-zero exit status.
+ Optionally, limit the number of restart retries the Docker
+ daemon attempts.
+ </td>
+ </tr>
+ <tr>
+ <td><strong>always</strong></td>
+ <td>
+ Always restart the container regardless of the exit status.
+ When you specify always, the Docker daemon will try to restart
+ the container indefinitely.
+ </td>
+ </tr>
+ </tbody>
+</table>
+
+An ever increasing delay (double the previous delay, starting at 100
+milliseconds) is added before each restart to prevent flooding the server.
+This means the daemon will wait for 100 ms, then 200 ms, 400, 800, 1600,
+and so on until either the `on-failure` limit is hit, or when you `docker stop`
+or `docker rm -f` the container.
+
+If a container is succesfully restarted (the container is started and runs
+for at least 10 seconds), the delay is reset to its default value of 100 ms.
+
+You can specify the maximum amount of times Docker will try to restart the
+container when using the **on-failure** policy. The default is that Docker
+will try forever to restart the container. The number of (attempted) restarts
+for a container can be obtained via [`docker inspect`](
+/reference/commandline/cli/#inspect). For example, to get the number of restarts
+for container "my-container";
+
+ $ sudo docker inspect -f "{{ .RestartCount }}" my-container
+ # 2
+
+Or, to get the last time the container was (re)started;
+
+ $ docker inspect -f "{{ .State.StartedAt }}" my-container
+ # 2015-03-04T23:47:07.691840179Z
+
+You cannot set any restart policy in combination with
+["clean up (--rm)"](#clean-up-rm). Setting both `--restart` and `--rm`
+results in an error.
+
+###Examples
+
+ $ sudo docker run --restart=always redis
+
+This will run the `redis` container with a restart policy of **always**
+so that if the container exits, Docker will restart it.
+
+ $ sudo docker run --restart=on-failure:10 redis
+
+This will run the `redis` container with a restart policy of **on-failure**
+and a maximum restart count of 10. If the `redis` container exits with a
+non-zero exit status more than 10 times in a row Docker will abort trying to
+restart the container. Providing a maximum restart limit is only valid for the
+**on-failure** policy.
+
## Clean up (--rm)
By default a container's file system persists even after the container
@@ -310,30 +455,93 @@ The operator can also adjust the performance parameters of the
container:
-m="": Memory limit (format: <number><optional unit>, where unit = b, k, m or g)
- -c=0 : CPU shares (relative weight)
-
-The operator can constrain the memory available to a container easily
-with `docker run -m`. If the host supports swap memory, then the `-m`
-memory setting can be larger than physical RAM.
-
-Similarly the operator can increase the priority of this container with
-the `-c` option. By default, all containers run at the same priority and
-get the same proportion of CPU cycles, but you can tell the kernel to
-give more shares of CPU time to one or more containers when you start
-them via Docker.
-
-The flag `-c` or `--cpu-shares` with value 0 indicates that the running
-container has access to all 1024 (default) CPU shares. However, this value
-can be modified to run a container with a different priority or different
-proportion of CPU cycles.
-
-E.g., If we start three {C0, C1, C2} containers with default values
-(`-c` OR `--cpu-shares` = 0) and one {C3} with (`-c` or `--cpu-shares`=512)
-then C0, C1, and C2 would have access to 100% CPU shares (1024) and C3 would
-only have access to 50% CPU shares (512). In the context of a time-sliced OS
-with time quantum set as 100 milliseconds, containers C0, C1, and C2 will run
-for full-time quantum, and container C3 will run for half-time quantum i.e 50
-milliseconds.
+ -memory-swap="": Total memory limit (memory + swap, format: <number><optional unit>, where unit = b, k, m or g)
+ -c, --cpu-shares=0 CPU shares (relative weight)
+
+### Memory constraints
+
+We have four ways to set memory usage:
+
+<table>
+ <thead>
+ <tr>
+ <th>Option</th>
+ <th>Result</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td class="no-wrap">
+ <strong>memory=inf, memory-swap=inf</strong> (default)
+ </td>
+ <td>
+ There is no memory limit for the container. The container can use
+ as much memory as needed.
+ </td>
+ </tr>
+ <tr>
+ <td class="no-wrap"><strong>memory=L&lt;inf, memory-swap=inf</strong></td>
+ <td>
+ (specify memory and set memory-swap as <code>-1</code>) The container is
+ not allowed to use more than L bytes of memory, but can use as much swap
+ as is needed (if the host supports swap memory).
+ </td>
+ </tr>
+ <tr>
+ <td class="no-wrap"><strong>memory=L&lt;inf, memory-swap=2*L</strong></td>
+ <td>
+ (specify memory without memory-swap) The container is not allowed to
+ use more than L bytes of memory, swap *plus* memory usage is double
+ of that.
+ </td>
+ </tr>
+ <tr>
+ <td class="no-wrap">
+ <strong>memory=L&lt;inf, memory-swap=S&lt;inf, L&lt;=S</strong>
+ </td>
+ <td>
+ (specify both memory and memory-swap) The container is not allowed to
+ use more than L bytes of memory, swap *plus* memory usage is limited
+ by S.
+ </td>
+ </tr>
+ </tbody>
+</table>
+
+### CPU share constraint
+
+By default, all containers get the same proportion of CPU cycles. This proportion
+can be modified by changing the container's CPU share weighting relative
+to the weighting of all other running containers.
+
+To modify the proportion from the default of 1024, use the `-c` or `--cpu-shares`
+flag to set the weighting to 2 or higher.
+
+The proportion will only apply when CPU-intensive processes are running.
+When tasks in one container are idle, other containers can use the
+left-over CPU time. The actual amount of CPU time will vary depending on
+the number of containers running on the system.
+
+For example, consider three containers, one has a cpu-share of 1024 and
+two others have a cpu-share setting of 512. When processes in all three
+containers attempt to use 100% of CPU, the first container would receive
+50% of the total CPU time. If you add a fouth container with a cpu-share
+of 1024, the first container only gets 33% of the CPU. The remaining containers
+receive 16.5%, 16.5% and 33% of the CPU.
+
+On a multi-core system, the shares of CPU time are distributed over all CPU
+cores. Even if a container is limited to less than 100% of CPU time, it can
+use 100% of each individual CPU core.
+
+For example, consider a system with more than three cores. If you start one
+container `{C0}` with `-c=512` running one process, and another container
+`{C1}` with `-c=1024` running two processes, this can result in the following
+division of CPU shares:
+
+ PID container CPU CPU share
+ 100 {C0} 0 100% of CPU0
+ 101 {C1} 1 100% of CPU1
+ 102 {C1} 2 100% of CPU2
## Runtime privilege, Linux capabilities, and LXC configuration
@@ -341,7 +549,7 @@ milliseconds.
--cap-drop: Drop Linux capabilities
--privileged=false: Give extended privileges to this container
--device=[]: Allows you to run devices inside the container without the --privileged flag.
- --lxc-conf=[]: (lxc exec-driver only) Add custom lxc options --lxc-conf="lxc.cgroup.cpuset.cpus = 0,1"
+ --lxc-conf=[]: Add custom lxc options
By default, Docker containers are "unprivileged" and cannot, for
example, run a Docker daemon inside a Docker container. This is because
@@ -367,22 +575,19 @@ will be accessible within the container.
By default, the container will be able to `read`, `write`, and `mknod` these devices.
This can be overridden using a third `:rwm` set of options to each `--device` flag:
+ $ sudo docker run --device=/dev/sda:/dev/xvdc --rm -it ubuntu fdisk /dev/xvdc
-```
- $ sudo docker run --device=/dev/sda:/dev/xvdc --rm -it ubuntu fdisk /dev/xvdc
+ Command (m for help): q
+ $ sudo docker run --device=/dev/sda:/dev/xvdc:r --rm -it ubuntu fdisk /dev/xvdc
+ You will not be able to write the partition table.
- Command (m for help): q
- $ sudo docker run --device=/dev/sda:/dev/xvdc:r --rm -it ubuntu fdisk /dev/xvdc
- You will not be able to write the partition table.
+ Command (m for help): q
- Command (m for help): q
-
- $ sudo docker run --device=/dev/sda:/dev/xvdc:w --rm -it ubuntu fdisk /dev/xvdc
+ $ sudo docker run --device=/dev/sda:/dev/xvdc:w --rm -it ubuntu fdisk /dev/xvdc
crash....
- $ sudo docker run --device=/dev/sda:/dev/xvdc:m --rm -it ubuntu fdisk /dev/xvdc
- fdisk: unable to open /dev/xvdc: Operation not permitted
-```
+ $ sudo docker run --device=/dev/sda:/dev/xvdc:m --rm -it ubuntu fdisk /dev/xvdc
+ fdisk: unable to open /dev/xvdc: Operation not permitted
In addition to `--privileged`, the operator can have fine grain control over the
capabilities using `--cap-add` and `--cap-drop`. By default, Docker has a default
@@ -438,6 +643,25 @@ familiar with using LXC directly.
> you can use `--lxc-conf` to set a container's IP address, but this will not be
> reflected in the `/etc/hosts` file.
+## Logging drivers (--log-driver)
+
+You can specify a different logging driver for the container than for the daemon.
+
+### Logging driver: none
+
+Disables any logging for the container. `docker logs` won't be available with
+this driver.
+
+### Log driver: json-file
+
+Default logging driver for Docker. Writes JSON messages to file. `docker logs`
+command is available only for this logging driver
+
+## Logging driver: syslog
+
+Syslog logging driver for Docker. Writes log messages to syslog. `docker logs`
+command is not available for this logging driver
+
## Overriding Dockerfile image defaults
When a developer builds an image from a [*Dockerfile*](/reference/builder)
@@ -463,7 +687,7 @@ Dockerfile instruction and how the operator can override that setting.
Recall the optional `COMMAND` in the Docker
commandline:
- $ sudo docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARG...]
+ $ sudo docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
This command is optional because the person who created the `IMAGE` may
have already provided a default `COMMAND` using the Dockerfile `CMD`
@@ -528,10 +752,11 @@ developer, the operator has three choices: start the server container
with `-P` or `-p,` or start the client container with `--link`.
If the operator uses `-P` or `-p` then Docker will make the exposed port
-accessible on the host and the ports will be available to any client
-that can reach the host. When using `-P`, Docker will bind the exposed
-ports to a random port on the host between 49153 and 65535. To find the
-mapping between the host ports and the exposed ports, use `docker port`.
+accessible on the host and the ports will be available to any client that can
+reach the host. When using `-P`, Docker will bind the exposed port to a random
+port on the host within an *ephemeral port range* defined by
+`/proc/sys/net/ipv4/ip_local_port_range`. To find the mapping between the host
+ports and the exposed ports, use `docker port`.
If the operator uses `--link` when starting the new client container,
then the client container can access the exposed port via a private
@@ -543,34 +768,32 @@ client container to help indicate which interface and port to use.
When a new container is created, Docker will set the following environment
variables automatically:
-<table width=100%>
- <tr style="background-color:#C0C0C0">
- <td> <b>Variable</b> </td>
- <td style="padding-left:10px"> <b>Value</b> </td>
+<table>
+ <tr>
+ <th>Variable</th>
+ <th>Value</th>
</tr>
<tr>
- <td> <code>HOME</code> </td>
- <td style="padding-left:10px">
+ <td><code>HOME</code></td>
+ <td>
Set based on the value of <code>USER</code>
</td>
</tr>
- <tr style="background-color:#E8E8E8">
- <td valign=top> <code>HOSTNAME</code> </td>
- <td style="padding-left:10px">
+ <tr>
+ <td><code>HOSTNAME</code></td>
+ <td>
The hostname associated with the container
</td>
</tr>
<tr>
- <td valign=top> <code>PATH</code> </td>
- <td style="padding-left:10px">
+ <td><code>PATH</code></td>
+ <td>
Includes popular directories, such as :<br>
<code>/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin</code>
</td>
- <tr style="background-color:#E8E8E8">
- <td valign=top> <code>TERM</code> </td>
- <td style="padding-left:10px">
- <code>xterm</code> if the container is allocated a psuedo-TTY
- </td>
+ <tr>
+ <td><code>TERM</code></td>
+ <td><code>xterm</code> if the container is allocated a psuedo-TTY</td>
</tr>
</table>
@@ -606,7 +829,7 @@ container running Redis:
# The redis-name container exposed port 6379
$ sudo docker ps
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
+ CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4241164edf6f $ dockerfiles/redis:latest /redis-stable/src/re 5 seconds ago Up 4 seconds 6379/tcp redis-name
# Note that there are no public ports exposed since we didn᾿t use -p or -P
@@ -648,7 +871,7 @@ If you restart the source container (`servicename` in this case), the recipient
container's `/etc/hosts` entry will be automatically updated.
> **Note**:
-> Unlike host entries in the `/ets/hosts` file, IP addresses stored in the
+> Unlike host entries in the `/etc/hosts` file, IP addresses stored in the
> environment variables are not automatically updated if the source container is
> restarted. We recommend using the host entries in `/etc/hosts` to resolve the
> IP address of linked containers.
diff --git a/docs/sources/release-notes.md b/docs/sources/release-notes.md
index e6c0ec5d49..fe79d881dc 100644
--- a/docs/sources/release-notes.md
+++ b/docs/sources/release-notes.md
@@ -15,6 +15,9 @@ For a complete list of patches, fixes, and other improvements, see the
*New Features*
+* [1.6] The Docker daemon will no longer ignore unknown commands
+ while processing a `Dockerfile`. Instead it will generate an error and halt
+ processing.
* The Docker daemon has now supports for IPv6 networking between containers
and on the `docker0` bridge. For more information see the
[IPv6 networking reference](/articles/networking/#ipv6).
@@ -22,7 +25,7 @@ For a complete list of patches, fixes, and other improvements, see the
container to writing to volumes [PR# 10093](https://github.com/docker/docker/pull/10093).
* A new `docker stats CONTAINERID` command has been added to allow users to view a
continuously updating stream of container resource usage statistics. See the
- [`stats` command line reference](/reference/commandline/cli/#stats) and the
+ [`stats` command line reference](/reference/commandline/cli/#stats) and the
[container `stats` API reference](/reference/api/docker_remote_api_v1.17/#get-container-stats-based-on-resource-usage).
**Note**: this feature is only enabled for the `libcontainer` exec-driver at this point.
* Users can now specify the file to use as the `Dockerfile` by running
@@ -54,7 +57,14 @@ impact on users. This list will be updated as issues are resolved.
* **Unexpected File Permissions in Containers**
An idiosyncrasy in AUFS prevents permissions from propagating predictably
between upper and lower layers. This can cause issues with accessing private
-keys, database instances, etc. For complete information and workarounds see
+keys, database instances, etc.
+
+For systems that have recent aufs version (i.e., `dirperm1` mount option can
+be set), docker will attempt to fix the issue automatically by mounting
+the layers with `dirperm1` option. More details on `dirperm1` option can be
+found at [`aufs` man page](http://aufs.sourceforge.net/aufs3/man.html)
+
+For complete information and workarounds see
[Github Issue 783](https://github.com/docker/docker/issues/783).
* **Docker Hub incompatible with Safari 8**
diff --git a/docs/sources/static_files/contributors.png b/docs/sources/static_files/contributors.png
new file mode 100644
index 0000000000..63c0a0c09b
--- /dev/null
+++ b/docs/sources/static_files/contributors.png
Binary files differ
diff --git a/docs/theme/mkdocs/images/docker-logo-compressed.png b/docs/sources/static_files/docker-logo-compressed.png
index 717d09d773..717d09d773 100644
--- a/docs/theme/mkdocs/images/docker-logo-compressed.png
+++ b/docs/sources/static_files/docker-logo-compressed.png
Binary files differ
diff --git a/docs/sources/userguide/dockerizing.md b/docs/sources/userguide/dockerizing.md
index 6f56a56955..cc7bc8e1c1 100644
--- a/docs/sources/userguide/dockerizing.md
+++ b/docs/sources/userguide/dockerizing.md
@@ -101,7 +101,7 @@ Again we can do this with the `docker run` command:
$ sudo docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
1e5535038e285177d5214659a068137486f96ee5c2e85a4ac52dc83f2ebe4147
-Wait what? Where's our "Hello world" Let's look at what we've run here.
+Wait, what? Where's our "hello world" output? Let's look at what we've run here.
It should look pretty familiar. We ran `docker run` but this time we
specified a flag: `-d`. The `-d` flag tells Docker to run the container
and put it in the background, to daemonize it.
@@ -187,7 +187,7 @@ Excellent. Our container has been stopped.
# Next steps
-Now we've seen how simple it is to get started with Docker let's learn how to
+Now we've seen how simple it is to get started with Docker. Let's learn how to
do some more advanced tasks.
Go to [Working With Containers](/userguide/usingdocker).
diff --git a/docs/sources/userguide/dockerlinks.md b/docs/sources/userguide/dockerlinks.md
index f35f61ecfc..79ba17900e 100644
--- a/docs/sources/userguide/dockerlinks.md
+++ b/docs/sources/userguide/dockerlinks.md
@@ -11,7 +11,7 @@ applications running inside Docker containers. In this section, we'll briefly re
connecting via a network port and then we'll introduce you to another method of access:
container linking.
-## Network port mapping refresher
+## Connect using Network port mapping
In [the Using Docker section](/userguide/usingdocker), you created a
container that ran a Python Flask application:
@@ -25,10 +25,10 @@ container that ran a Python Flask application:
> Docker can have a variety of network configurations. You can see more
> information on Docker networking [here](/articles/networking/).
-When that container was created, the `-P` flag was used to automatically map any
-network ports inside it to a random high port from the range 49153
-to 65535 on our Docker host. Next, when `docker ps` was run, you saw that
-port 5000 in the container was bound to port 49155 on the host.
+When that container was created, the `-P` flag was used to automatically map
+any network port inside it to a random high port within an *ephemeral port
+range* on your Docker host. Next, when `docker ps` was run, you saw that port
+5000 in the container was bound to port 49155 on the host.
$ sudo docker ps nostalgic_morse
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
@@ -72,7 +72,7 @@ configurations. For example, if you've bound the container port to the
> **Note:**
> The `-p` flag can be used multiple times to configure multiple ports.
-## Docker Container Linking
+## Connect with the linking system
Network port mappings are not the only way Docker containers can connect
to one another. Docker also has a linking system that allows you to link
@@ -81,7 +81,7 @@ When containers are linked, information about a source container can be sent to
recipient container. This allows the recipient to see selected data describing
aspects of the source container.
-## Container naming
+### The importance of naming
To establish links, Docker relies on the names of your containers.
You've already seen that each container you create has an automatically
@@ -121,7 +121,7 @@ You can also use `docker inspect` to return the container's name.
> flag with the `docker run` command. This will delete the container
> immediately after it is stopped.
-## Container Linking
+## Communication across links
Links allow containers to discover each other and securely transfer information about one
container to another container. When you set up a link, you create a conduit between a
@@ -176,41 +176,64 @@ recipient container in two ways:
### Environment Variables
-When two containers are linked, Docker will set some environment variables
-in the target container to enable programmatic discovery of information
-related to the source container.
-
-First, Docker will set an `<alias>_NAME` environment variable specifying the
-alias of each target container that was given in a `--link` parameter. So,
-for example, if a new container called `web` is being linked to a database
-container called `db` via `--link db:webdb` then in the `web` container
-would be `WEBDB_NAME=/web/webdb`.
-
-Docker will then also define a set of environment variables for each
-port that is exposed by the source container. The pattern followed is:
-
-* `<name>_PORT_<port>_<protocol>` will contain a URL reference to the
-port. Where `<name>` is the alias name specified in the `--link` parameter
-(e.g. `webdb`), `<port>` is the port number being exposed, and `<protocol>`
-is either `TCP` or `UDP`. The format of the URL will be:
-`<protocol>://<container_ip_address>:<port>`
-(e.g. `tcp://172.17.0.82:8080`). This URL will then be
-split into the following 3 environment variables for convenience:
-* `<name>_PORT_<port>_<protocol>_ADDR` will contain just the IP address
-from the URL (e.g. `WEBDB_PORT_8080_TCP_ADDR=172.17.0.82`).
-* `<name>_PORT_<port>_<protocol>_PORT` will contain just the port number
-from the URL (e.g. `WEBDB_PORT_8080_TCP_PORT=8080`).
-* `<name>_PORT_<port>_<protocol>_PROTO` will contain just the protocol
-from the URL (e.g. `WEBDB_PORT_8080_TCP_PROTO=tcp`).
-
-If there are multiple ports exposed then the above set of environment
-variables will be defined for each one.
-
-Finally, there will be an environment variable called `<alias>_PORT` that will
-contain the URL of the first exposed port of the source container.
-For example, `WEBDB_PORT=tcp://172.17.0.82:8080`. In this case, 'first'
-is defined as the lowest numbered port that is exposed. If that port is
-used for both tcp and udp, then the tcp one will be specified.
+Docker creates several environment variables when you link containers. Docker
+automatically creates environment variables in the target container based on
+the `--link` parameters. It will also expose all environment variables
+originating from Docker from the source container. These include variables from:
+
+* the `ENV` commands in the source container's Dockerfile
+* the `-e`, `--env` and `--env-file` options on the `docker run`
+command when the source container is started
+
+These environment variables enable programmatic discovery from within the
+target container of information related to the source container.
+
+> **Warning**:
+> It is important to understand that *all* environment variables originating
+> from Docker within a container are made available to *any* container
+> that links to it. This could have serious security implications if sensitive
+> data is stored in them.
+
+Docker sets an `<alias>_NAME` environment variable for each target container
+listed in the `--link` parameter. For example, if a new container called
+`web` is linked to a database container called `db` via `--link db:webdb`,
+then Docker creates a `WEBDB_NAME=/web/webdb` variable in the `web` container.
+
+Docker also defines a set of environment variables for each port exposed by the
+source container. Each variable has a unique prefix in the form:
+
+`<name>_PORT_<port>_<protocol>`
+
+The components in this prefix are:
+
+* the alias `<name>` specified in the `--link` parameter (for example, `webdb`)
+* the `<port>` number exposed
+* a `<protocol>` which is either TCP or UDP
+
+Docker uses this prefix format to define three distinct environment variables:
+
+* The `prefix_ADDR` variable contains the IP Address from the URL, for
+example `WEBDB_PORT_8080_TCP_ADDR=172.17.0.82`.
+* The `prefix_PORT` variable contains just the port number from the URL for
+example `WEBDB_PORT_8080_TCP_PORT=8080`.
+* The `prefix_PROTO` variable contains just the protocol from the URL for
+example `WEBDB_PORT_8080_TCP_PROTO=tcp`.
+
+If the container exposes multiple ports, an environment variable set is
+defined for each one. This means, for example, if a container exposes 4 ports
+that Docker creates 12 environment variables, 3 for each port.
+
+Additionally, Docker creates an environment variable called `<alias>_PORT`.
+This variable contains the URL of the source container's first exposed port.
+The 'first' port is defined as the exposed port with the lowest number.
+For example, consider the `WEBDB_PORT=tcp://172.17.0.82:8080` variable. If
+that port is used for both tcp and udp, then the tcp one is specified.
+
+Finally, Docker also exposes each Docker originated environment variable
+from the source container as an environment variable in the target. For each
+variable Docker creates an `<alias>_ENV_<name>` variable in the target
+container. The variable's value is set to the value Docker used when it
+started the source container.
Returning back to our database example, you can run the `env`
command to list the specified container's environment variables.
@@ -227,45 +250,49 @@ command to list the specified container's environment variables.
. . .
```
-> **Note**:
-> These Environment variables are only set for the first process in the
-> container. Similarly, some daemons (such as `sshd`)
-> will scrub them when spawning shells for connection.
-
-> **Note**:
-> Unlike host entries in the [`/etc/hosts` file](#updating-the-etchosts-file),
-> IP addresses stored in the environment variables are not automatically updated
-> if the source container is restarted. We recommend using the host entries in
-> `/etc/hosts` to resolve the IP address of linked containers.
-
You can see that Docker has created a series of environment variables with
-useful information about the source `db` container. Each variable is prefixed with
+useful information about the source `db` container. Each variable is prefixed
+with
`DB_`, which is populated from the `alias` you specified above. If the `alias`
were `db1`, the variables would be prefixed with `DB1_`. You can use these
environment variables to configure your applications to connect to the database
on the `db` container. The connection will be secure and private; only the
linked `web` container will be able to talk to the `db` container.
+### Important notes on Docker environment variables
+
+Unlike host entries in the [`/etc/hosts` file](#updating-the-etchosts-file),
+IP addresses stored in the environment variables are not automatically updated
+if the source container is restarted. We recommend using the host entries in
+`/etc/hosts` to resolve the IP address of linked containers.
+
+These environment variables are only set for the first process in the
+container. Some daemons, such as `sshd`, will scrub them when spawning shells
+for connection.
+
### Updating the `/etc/hosts` file
In addition to the environment variables, Docker adds a host entry for the
source container to the `/etc/hosts` file. Here's an entry for the `web`
container:
- $ sudo docker run -t -i --rm --link db:db training/webapp /bin/bash
+ $ sudo docker run -t -i --rm --link db:webdb training/webapp /bin/bash
root@aed84ee21bde:/opt/webapp# cat /etc/hosts
172.17.0.7 aed84ee21bde
. . .
- 172.17.0.5 db
+ 172.17.0.5 webdb 6e5cdeb2d300 db
You can see two relevant host entries. The first is an entry for the `web`
container that uses the Container ID as a host name. The second entry uses the
-link alias to reference the IP address of the `db` container. You can ping
-that host now via this host name.
+link alias to reference the IP address of the `db` container. In addition to
+the alias you provide, the linked container's name--if unique from the alias
+provided to the `--link` parameter--and the linked container's hostname will
+also be added in `/etc/hosts` for the linked container's IP address. You can ping
+that host now via any of these entries:
root@aed84ee21bde:/opt/webapp# apt-get install -yqq inetutils-ping
- root@aed84ee21bde:/opt/webapp# ping db
- PING db (172.17.0.5): 48 data bytes
+ root@aed84ee21bde:/opt/webapp# ping webdb
+ PING webdb (172.17.0.5): 48 data bytes
56 bytes from 172.17.0.5: icmp_seq=0 ttl=64 time=0.267 ms
56 bytes from 172.17.0.5: icmp_seq=1 ttl=64 time=0.250 ms
56 bytes from 172.17.0.5: icmp_seq=2 ttl=64 time=0.256 ms
diff --git a/docs/sources/userguide/dockervolumes.md b/docs/sources/userguide/dockervolumes.md
index 4d5bd7247d..d533224656 100644
--- a/docs/sources/userguide/dockervolumes.md
+++ b/docs/sources/userguide/dockervolumes.md
@@ -21,14 +21,21 @@ Docker.
A *data volume* is a specially-designated directory within one or more
containers that bypasses the [*Union File
-System*](/terms/layer/#union-file-system) to provide several useful features for
-persistent or shared data:
-
-- Volumes are initialized when a container is created
-- Data volumes can be shared and reused between containers
-- Changes to a data volume are made directly
-- Changes to a data volume will not be included when you update an image
-- Volumes persist until no containers use them
+System*](/terms/layer/#union-file-system). Data volumes provide several
+useful features for persistent or shared data:
+
+- Volumes are initialized when a container is created. If the container's
+ base image contains data at the specified mount point, that data is
+ copied into the new volume.
+- Data volumes can be shared and reused among containers.
+- Changes to a data volume are made directly.
+- Changes to a data volume will not be included when you update an image.
+- Data volumes persist even if the container itself is deleted.
+
+Data volumes are designed to persist data, independent of the container's life
+cycle. Docker therefore *never* automatically delete volumes when you remove
+a container, nor will it "garbage collect" volumes that are no longer
+referenced by a container.
### Adding a data volume
@@ -117,7 +124,7 @@ Let's create a new named container with a volume to share.
While this container doesn't run an application, it reuses the `training/postgres`
image so that all containers are using layers in common, saving disk space.
- $ sudo docker create -v /dbdata --name dbdata training/postgres
+ $ sudo docker create -v /dbdata --name dbdata training/postgres /bin/true
You can then use the `--volumes-from` flag to mount the `/dbdata` volume in another container.
@@ -127,6 +134,11 @@ And another:
$ sudo docker run -d --volumes-from dbdata --name db2 training/postgres
+In this case, if the `postgres` image contained a directory called `/dbdata`
+then mounting the volumes from the `dbdata` container hides the
+`/dbdata` files from the `postgres` image. The result is only the files
+from the `dbdata` container are visible.
+
You can use multiple `--volumes-from` parameters to bring together multiple data
volumes from multiple containers.
@@ -141,6 +153,14 @@ be deleted. To delete the volume from disk, you must explicitly call
`docker rm -v` against the last container with a reference to the volume. This
allows you to upgrade, or effectively migrate data volumes between containers.
+> **Note:** Docker will not warn you when removing a container *without*
+> providing the `-v` option to delete its volumes. If you remove containers
+> without using the `-v` option, you may end up with "dangling" volumes;
+> volumes that are no longer referenced by a container.
+> Dangling volumes are difficult to get rid of and can take up a large amount
+> of disk space. We're working on improving volume management and you can check
+> progress on this in [pull request #8484](https://github.com/docker/docker/pull/8484)
+
## Backup, restore, or migrate data volumes
Another useful function we can perform with volumes is use them for
diff --git a/docs/sources/userguide/index.md b/docs/sources/userguide/index.md
index 64bd3d16f3..d0dbdb84ee 100644
--- a/docs/sources/userguide/index.md
+++ b/docs/sources/userguide/index.md
@@ -80,6 +80,31 @@ Trusted Builds and private repositories.
Go to [Working with Docker Hub](/userguide/dockerrepos).
+## Docker Compose
+
+Docker Compose allows you to define a application's components -- their containers,
+configuration, links and volumes -- in a single file. Then a single command
+will set everything up and start your application running.
+
+Go to [Docker Compose user guide](/compose/).
+
+## Docker Machine
+
+Docker Machine helps you get Docker Engines up and running quickly. Machine
+can set up hosts for Docker Engines on your computer, on cloud providers,
+and/or in your data center, and then configure your Docker client to securely
+talk to them.
+
+Go to [Docker Machine user guide](/machine/).
+
+## Docker Swarm
+
+Docker Swarm pools several Docker Engines together and exposes them as a single
+virtual Docker Engine. It serves the standard Docker API, so any tool that already
+works with Docker can now transparently scale up to multiple hosts.
+
+Go to [Docker Swarm user guide](/swarm/).
+
## Getting help
* [Docker homepage](http://www.docker.com/)
diff --git a/docs/sources/userguide/labels-custom-metadata.md b/docs/sources/userguide/labels-custom-metadata.md
new file mode 100644
index 0000000000..7cf25c0609
--- /dev/null
+++ b/docs/sources/userguide/labels-custom-metadata.md
@@ -0,0 +1,190 @@
+page_title: Apply custom metadata
+page_description: Learn how to work with custom metadata in Docker, using labels.
+page_keywords: Usage, user guide, labels, metadata, docker, documentation, examples, annotating
+
+# Apply custom metadata
+
+You can apply metadata to your images, containers, or daemons via
+labels. Metadata can serve a wide range of uses. Use labels to add notes or
+licensing information to an image or to identify a host.
+
+A label is a `<key>` / `<value>` pair. Docker stores the label values as
+*strings*. You can specify multiple labels but each `<key>` / `<value>` must be
+unique to avoid overwriting. If you specify the same `key` several times but with
+different values, newer labels overwrite previous labels. Docker uses
+the last `key=value` you supply.
+
+>**Note:** Support for daemon-labels was added in Docker 1.4.1. Labels on
+>containers and images are new in Docker 1.6.0
+
+## Label keys (namespaces)
+
+Docker puts no hard restrictions on the label `key` you. However, labels with
+simple keys can conflict. For example, you can categorize your images by using a
+chip "architecture" label:
+
+ LABEL architecture="amd64"
+
+ LABEL architecture="ARMv7"
+
+But a user can label images by building architectural style:
+
+ LABEL architecture="Art Nouveau"
+
+To prevent naming conflicts, Docker namespaces label keys using a reverse domain
+notation. Use the following guidelines to name your keys:
+
+- All (third-party) tools should prefix their keys with the
+ reverse DNS notation of a domain controlled by the author. For
+ example, `com.example.some-label`.
+
+- The `com.docker.*`, `io.docker.*` and `com.dockerproject.*` namespaces are
+ reserved for Docker's internal use.
+
+- Keys should only consist of lower-cased alphanumeric characters,
+ dots and dashes (for example, `[a-z0-9-.]`)
+
+- Keys should start *and* end with an alpha numeric character
+
+- Keys may not contain consecutive dots or dashes.
+
+- Keys *without* namespace (dots) are reserved for CLI use. This allows end-
+ users to add metadata to their containers and images without having to type
+ cumbersome namespaces on the command-line.
+
+
+These are guidelines and Docker does not *enforce* them. Failing following these
+guidelines can result in conflicting labels. If you're building a tool that uses
+labels, you *should* use namespaces for your label keys.
+
+
+## Store structured data in labels
+
+Label values can contain any data type that can be stored as a string. For
+example, consider this JSON:
+
+
+ {
+ "Description": "A containerized foobar",
+ "Usage": "docker run --rm example/foobar [args]",
+ "License": "GPL",
+ "Version": "0.0.1-beta",
+ "aBoolean": true,
+ "aNumber" : 0.01234,
+ "aNestedArray": ["a", "b", "c"]
+ }
+
+You can store this struct in a label by serializing it to a string first:
+
+ LABEL com.example.image-specs="{\"Description\":\"A containerized foobar\",\"Usage\":\"docker run --rm example\\/foobar [args]\",\"License\":\"GPL\",\"Version\":\"0.0.1-beta\",\"aBoolean\":true,\"aNumber\":0.01234,\"aNestedArray\":[\"a\",\"b\",\"c\"]}"
+
+While it is *possible* to store structured data in label values, Docker treats
+this data as a 'regular' string. This means that Docker doesn't offer ways to
+query (filter) based on nested properties. If your tool needs to filter on
+nested properties, the tool itself should implement this.
+
+
+## Add labels to images; the `LABEL` instruction
+
+Adding labels to an image:
+
+
+ LABEL [<namespace>.]<key>[=<value>] ...
+
+The `LABEL` instruction adds a label to your image, optionally setting its value.
+Use surrounding quotes or backslashes for labels that contain
+white space character:
+
+ LABEL vendor=ACME\ Incorporated
+ LABEL com.example.version.is-beta
+ LABEL com.example.version="0.0.1-beta"
+ LABEL com.example.release-date="2015-02-12"
+
+The `LABEL` instruction supports setting multiple labels in a single instruction
+using this notation:
+
+ LABEL com.example.version="0.0.1-beta" com.example.release-date="2015-02-12"
+
+Wrapping is allowed by using a backslash (`\`) as continuation marker:
+
+ LABEL vendor=ACME\ Incorporated \
+ com.example.is-beta \
+ com.example.version="0.0.1-beta" \
+ com.example.release-date="2015-02-12"
+
+Docker recommends you add multiple labels in a single `LABEL` instruction. Using
+individual instructions for each label can result in an inefficient image. This
+is because each `LABEL` instruction in a Dockerfile produces a new IMAGE layer.
+
+You can view the labels via the `docker inspect` command:
+
+ $ docker inspect 4fa6e0f0c678
+
+ ...
+ "Labels": {
+ "vendor": "ACME Incorporated",
+ "com.example.is-beta": "",
+ "com.example.version": "0.0.1-beta",
+ "com.example.release-date": "2015-02-12"
+ }
+ ...
+
+ $ docker inspect -f "{{json .Labels }}" 4fa6e0f0c678
+
+ {"Vendor":"ACME Incorporated","com.example.is-beta":"","com.example.version":"0.0.1-beta","com.example.release-date":"2015-02-12"}
+
+
+## Query labels
+
+Besides storing metadata, you can filter images and containers by label. To list all
+running containers that the `com.example.is-beta` label:
+
+ # List all running containers that have a `com.example.is-beta` label
+ $ docker ps --filter "label=com.example.is-beta"
+
+List all running containers with a `color` label of `blue`:
+
+ $ docker ps --filter "label=color=blue"
+
+List all images with `vendor` `ACME`:
+
+ $ docker images --filter "label=vendor=ACME"
+
+
+## Daemon labels
+
+
+ docker -d \
+ --dns 8.8.8.8 \
+ --dns 8.8.4.4 \
+ -H unix:///var/run/docker.sock \
+ --label com.example.environment="production" \
+ --label com.example.storage="ssd"
+
+These labels appear as part of the `docker info` output for the daemon:
+
+ docker -D info
+ Containers: 12
+ Images: 672
+ Storage Driver: aufs
+ Root Dir: /var/lib/docker/aufs
+ Backing Filesystem: extfs
+ Dirs: 697
+ Execution Driver: native-0.2
+ Kernel Version: 3.13.0-32-generic
+ Operating System: Ubuntu 14.04.1 LTS
+ CPUs: 1
+ Total Memory: 994.1 MiB
+ Name: docker.example.com
+ ID: RC3P:JTCT:32YS:XYSB:YUBG:VFED:AAJZ:W3YW:76XO:D7NN:TEVU:UCRW
+ Debug mode (server): false
+ Debug mode (client): true
+ Fds: 11
+ Goroutines: 14
+ EventsListeners: 0
+ Init Path: /usr/bin/docker
+ Docker Root Dir: /var/lib/docker
+ WARNING: No swap limit support
+ Labels:
+ com.example.environment=production
+ com.example.storage=ssd
diff --git a/docs/sources/userguide/usingdocker.md b/docs/sources/userguide/usingdocker.md
index 12a6b6fb2f..8d57def4ed 100644
--- a/docs/sources/userguide/usingdocker.md
+++ b/docs/sources/userguide/usingdocker.md
@@ -154,11 +154,11 @@ ports exposed in our image to our host.
In this case Docker has exposed port 5000 (the default Python Flask
port) on port 49155.
-Network port bindings are very configurable in Docker. In our last
-example the `-P` flag is a shortcut for `-p 5000` that maps port 5000
-inside the container to a high port (from the range 49153 to 65535) on
-the local Docker host. We can also bind Docker containers to specific
-ports using the `-p` flag, for example:
+Network port bindings are very configurable in Docker. In our last example the
+`-P` flag is a shortcut for `-p 5000` that maps port 5000 inside the container
+to a high port (from *ephemeral port range* which typically ranges from 32768
+to 61000) on the local Docker host. We can also bind Docker containers to
+specific ports using the `-p` flag, for example:
$ sudo docker run -d -p 5000:5000 training/webapp python app.py
diff --git a/docs/theme/MAINTAINERS b/docs/theme/MAINTAINERS
deleted file mode 100644
index 081aa684d4..0000000000
--- a/docs/theme/MAINTAINERS
+++ /dev/null
@@ -1,2 +0,0 @@
-O.S. Tezer <ostezer@gmail.com> (@OSTezer)
-Thatcher Peskens <thatcher@dotcloud.com> (@dhrp)
diff --git a/docs/theme/mkdocs/autoindex.html b/docs/theme/mkdocs/autoindex.html
deleted file mode 100644
index df1cc3eb09..0000000000
--- a/docs/theme/mkdocs/autoindex.html
+++ /dev/null
@@ -1,15 +0,0 @@
-no_edit: true
-auto_scroll_to_path: true
-
-# Table of Contents
-
-{% for nav_item in nav %}
- {% if nav_item.children %}
-## {{ nav_item.title }} {{ nav_item.url }}
-
- {% for nav_item in nav_item.children %}
-- [{{ nav_item.title }}]({{ nav_item.url }})
- {% endfor %}
-
- {% endif %}
-{% endfor %}
diff --git a/docs/theme/mkdocs/base.html b/docs/theme/mkdocs/base.html
deleted file mode 100644
index 4f669677b0..0000000000
--- a/docs/theme/mkdocs/base.html
+++ /dev/null
@@ -1,164 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta charset="utf-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
- {% set docker_version = "$VERSION" %}{% set major_minor = "$MAJOR_MINOR" %}{% set docker_commit = "$GITCOMMIT" %}{% set docker_branch = "$GIT_BRANCH" %}{% set aws_bucket = "$AWS_S3_BUCKET" %}{% set build_date = "$BUILD_DATE" %}
- <meta name="docker_version" content="{{ docker_version }}">
- <meta name="docker_git_branch" content="{{ docker_branch }}">
- <meta name="docker_git_commit" content="{{ docker_commit }}">
- <meta name="docker_build_date" content="{{ build_date }}">
-
- {% if meta.page_description %}<meta name="description" content="{{ meta.page_description[0] }}">{% endif %}
- {% if meta.page_keywords %}<meta name="keywords" content="{{ meta.page_keywords[0] }}">{% endif %}
- {% if site_author %}<meta name="author" content="{{ site_author }}">{% endif %}
- {% if canonical_url %}<link rel="canonical" href="{{ canonical_url }}">{% endif %}
- <link href="/css/bootstrap-custom.css" rel="stylesheet">
- <link href="/css/main.css" rel="stylesheet">
- <link href="/css/prettify-1.0.css" rel="stylesheet">
- <link rel="stylesheet" type="text/css" href="/css/dockerfile_tutorial.css">
- <link href="/tipuesearch/tipuesearch.css" rel="stylesheet">
- <link href="/css/docs.css" rel="stylesheet">
- <link rel="shortcut icon" href="{{ site_favicon }}">
- <title>{% if page_title != '**HIDDEN** - '+site_name %}{{ page_title }}{% else %}{{ site_name }}{% endif %}</title>
- <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
- <!--[if lt IE 9]>
- <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
- <script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script>
- <![endif]-->
- {% if config.google_analytics %}
- <script type="text/javascript">
- (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
- (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
- m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
- })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
- ga('create', '{{ config.google_analytics[0] }}', 'docker.com');
- ga('require', 'linkid', 'linkid.js');
- ga('send', 'pageview', {
- 'page': location.pathname + location.search + location.hash,
- });
- </script>
- {% endif %}
-</head>
-<body>
-
-{% include "header.html" %}
-
-<div id="wrap">
- {% include "nav.html" %}
- <div id="content" class="container">
- <div class="row">
-{% if not meta.no_toc %}
- <div class="span3" id="leftnav">
- <div id="toc_table">
- <ul class="nav nav-tabs nav-stacked">
- {% include "toc.html" %}
- </ul>
- </div>
- </div>
- <div class="span9 content-body">
-{% else %}
- <div class="span12 content-body">
-{% endif %}
- {% include "beta_warning.html" %}
-{% if not meta.no_version_dropdown %}
- <div id="versionnav" class="span3 pull-right">
- <ul class="nav version pull-right">
- <li class="dropdown">
- <a id="document-version-number" class="dropdown-toggle" data-toggle="dropdown" href="#">
- Version {{ major_minor }}
- </a>
- <ul id="documentation-version-list" class="dropdown-menu pull-right">
-{% if not meta.no_edit %}
- <li role="presentation" class="divider"></li>
- <li> <a class="home-link3 tertiary-nav" href="https://github.com/docker/docker/blob/master/docs/sources/{{ current_page.input_path }}" >Edit on GitHub</a></li>
-{% endif %}
- </ul>
- </li>
- </ul>
- </div>
-{% endif %}
- {{ content }}
- </div>
- </div>
- </div>
-
- <div id="push-footer"></div>
-
-</div>
-
-{# need to find an unobtrusive way to add this back
-{% include "prev_next.html" %}
-#}
-
-{% include "footer.html" %}
-
-<script src="/js/jquery-1.10.2.min.js"></script>
-<script src="/js/jquery.cookie.js" ></script>
-<script src="/js/jquery-scrolltofixed-min.js"></script>
-<script src="/js/bootstrap-3.0.3.min.js"></script>
-<script src="/js/prettify-1.0.min.js"></script>
-<script src="/js/dockerfile_tutorial.js"></script>
-<script src="/js/dockerfile_tutorial_level.js"></script>
-<script src="/js/base.js"></script>
-<script src="/tipuesearch/tipuesearch_set.js"></script>
-<script src="/tipuesearch/tipuesearch.min.js"></script>
-<script type="text/javascript">
-piAId = '45082';
-piCId = '1482';
-
-(function() {
- function async_load(){
- var s = document.createElement('script'); s.type = 'text/javascript';
- s.src = ('https:' == document.location.protocol ? 'https://pi' : 'http://cdn') + '.pardot.com/pd.js';
- var c = document.getElementsByTagName('script')[0]; c.parentNode.insertBefore(s, c);
- }
- if(window.attachEvent) { window.attachEvent('onload', async_load); }
- else { window.addEventListener('load', async_load, false); }
-})();
-</script>
-<script type="text/javascript">
- $(document).ready(function() {
- $('#content').css("min-height", $(window).height() - 553 );
- // if the URL contains a version string, update the version picker to reflect that
- version = document.location.pathname.match(/^\/(v\d\.\d)\/.*/)
- if (version && version[1]) {
- $('#document-version-number')[0].text = 'Version '+version[1];
- } else {
- $('#document-version-number')[0].text = $('#document-version-number')[0].text + " (Latest)"
- }
- // load the complete versions list
- $.get("/versions.html_fragment", function( data ) {
- $('#documentation-version-list').prepend(data);
- //remove any "/v1.1/" bits from front, so we can add the path to the version selection dropdown.
- path = document.location.pathname.replace(/^\/v\d\.\d/, "");
- $('#documentation-version-list a.version').each(function(i, e) {
- e.href = e.href+path;
- $(e).removeClass()
- });
- });
-{% if meta.auto_scroll_to_path %}
- // scroll to the right location in the generated index page
- m=location.pathname.match(/^\/(.*?)\//)
- if (m && m[1]) {
- anchor = m[1].toLowerCase().replace(/ /, "-").replace(/\//, "-")
- anchor_point = $('#'+anchor)
- if (anchor_point && anchor_point[0]) {
- $(window).scrollTop(anchor_point.offset().top);
- }
- }
-{% endif %}
- })
- var userName = getCookie('docker_sso_username');
- if (userName) {
- $('.topmostnav_loggedout').hide();
- $('.topmostnav_loggedin').show();
- $('#logged-in-header-username').text(userName);
- } else {
- $('.topmostnav_loggedout').show();
- $('.topmostnav_loggedin').hide();
- }
-</script>
-</body>
-</html>
diff --git a/docs/theme/mkdocs/beta_warning.html b/docs/theme/mkdocs/beta_warning.html
deleted file mode 100644
index 036b882bca..0000000000
--- a/docs/theme/mkdocs/beta_warning.html
+++ /dev/null
@@ -1,8 +0,0 @@
-{% if aws_bucket != "docs.docker.com" %}
-<div class="box alert-red-body alert-red-block">
- This is the
- <span>{% if docker_version != docker_version|replace("-dev", "bingo") %}{{ docker_branch }} development branch{% else %}beta{% endif %}</span>
- documentation for Docker version {{ docker_version }}.
- Please go to <a class="alert-red-link" href="http://docs.docker.com">http://docs.docker.com</a> for the current Docker release documentation.
-</div>
-{% endif %}
diff --git a/docs/theme/mkdocs/breadcrumbs.html b/docs/theme/mkdocs/breadcrumbs.html
deleted file mode 100644
index c99e10f3aa..0000000000
--- a/docs/theme/mkdocs/breadcrumbs.html
+++ /dev/null
@@ -1,12 +0,0 @@
-<ol class="breadcrumb">
- <li><a href="{{ homepage_url }}"><span class="glyphicon glyphicon-home"></span></a></li>
- {% for section in nav %}
- {% if section.active %}
- <li><a href="../">{{ section.title }}</a></li>
- {% if section.children %}
- <li class="active"><a href="{{ current_page.url }}">{{ current_page.title }}</a></li>
- {% endif %}
- {% endif %}
- {% endfor %}
- <li class="pull-right edit-on-github"><a href="https://github.com/docker/docker/blob/master/docs/sources/{{ current_page.input_path }}"><span class="glyphicon glyphicon-edit"></span>Edit on GitHub</a></li>
-</ol> \ No newline at end of file
diff --git a/docs/theme/mkdocs/css/animate-custom.css b/docs/theme/mkdocs/css/animate-custom.css
deleted file mode 100644
index b100e5f18a..0000000000
--- a/docs/theme/mkdocs/css/animate-custom.css
+++ /dev/null
@@ -1,283 +0,0 @@
-/* Some awesome custom aninations, taken from https://daneden.me/animate/build/ */
-
-
-.animated{-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:1s;-moz-animation-duration:1s;-ms-animation-duration:1s;-o-animation-duration:1s;animation-duration:1s;}.animated.hinge{-webkit-animation-duration:1s;-moz-animation-duration:1s;-ms-animation-duration:1s;-o-animation-duration:1s;animation-duration:1s;}@-webkit-keyframes flash {
- 0%, 50%, 100% {opacity: 1;} 25%, 75% {opacity: 0;}
-}
-
-@-moz-keyframes flash {
- 0%, 50%, 100% {opacity: 1;}
- 25%, 75% {opacity: 0;}
-}
-
-@-o-keyframes flash {
- 0%, 50%, 100% {opacity: 1;}
- 25%, 75% {opacity: 0;}
-}
-
-@keyframes flash {
- 0%, 50%, 100% {opacity: 1;}
- 25%, 75% {opacity: 0;}
-}
-
-.flash {
- -webkit-animation-name: flash;
- -moz-animation-name: flash;
- -o-animation-name: flash;
- animation-name: flash;
-}
-@-webkit-keyframes shake {
- 0%, 100% {-webkit-transform: translateX(0);}
- 10%, 30%, 50%, 70%, 90% {-webkit-transform: translateX(-10px);}
- 20%, 40%, 60%, 80% {-webkit-transform: translateX(10px);}
-}
-
-@-moz-keyframes shake {
- 0%, 100% {-moz-transform: translateX(0);}
- 10%, 30%, 50%, 70%, 90% {-moz-transform: translateX(-10px);}
- 20%, 40%, 60%, 80% {-moz-transform: translateX(10px);}
-}
-
-@-o-keyframes shake {
- 0%, 100% {-o-transform: translateX(0);}
- 10%, 30%, 50%, 70%, 90% {-o-transform: translateX(-10px);}
- 20%, 40%, 60%, 80% {-o-transform: translateX(10px);}
-}
-
-@keyframes shake {
- 0%, 100% {transform: translateX(0);}
- 10%, 30%, 50%, 70%, 90% {transform: translateX(-10px);}
- 20%, 40%, 60%, 80% {transform: translateX(10px);}
-}
-
-.shake {
- -webkit-animation-name: shake;
- -moz-animation-name: shake;
- -o-animation-name: shake;
- animation-name: shake;
-}
-@-webkit-keyframes bounce {
- 0%, 20%, 50%, 80%, 100% {-webkit-transform: translateY(0);}
- 40% {-webkit-transform: translateY(-30px);}
- 60% {-webkit-transform: translateY(-15px);}
-}
-
-@-moz-keyframes bounce {
- 0%, 20%, 50%, 80%, 100% {-moz-transform: translateY(0);}
- 40% {-moz-transform: translateY(-30px);}
- 60% {-moz-transform: translateY(-15px);}
-}
-
-@-o-keyframes bounce {
- 0%, 20%, 50%, 80%, 100% {-o-transform: translateY(0);}
- 40% {-o-transform: translateY(-30px);}
- 60% {-o-transform: translateY(-15px);}
-}
-@keyframes bounce {
- 0%, 20%, 50%, 80%, 100% {transform: translateY(0);}
- 40% {transform: translateY(-30px);}
- 60% {transform: translateY(-15px);}
-}
-
-.bounce {
- -webkit-animation-name: bounce;
- -moz-animation-name: bounce;
- -o-animation-name: bounce;
- animation-name: bounce;
-}
-@-webkit-keyframes tada {
- 0% {-webkit-transform: scale(1);}
- 10%, 20% {-webkit-transform: scale(0.9) rotate(-3deg);}
- 30%, 50%, 70%, 90% {-webkit-transform: scale(1.1) rotate(3deg);}
- 40%, 60%, 80% {-webkit-transform: scale(1.1) rotate(-3deg);}
- 100% {-webkit-transform: scale(1) rotate(0);}
-}
-
-@-moz-keyframes tada {
- 0% {-moz-transform: scale(1);}
- 10%, 20% {-moz-transform: scale(0.9) rotate(-3deg);}
- 30%, 50%, 70%, 90% {-moz-transform: scale(1.1) rotate(3deg);}
- 40%, 60%, 80% {-moz-transform: scale(1.1) rotate(-3deg);}
- 100% {-moz-transform: scale(1) rotate(0);}
-}
-
-@-o-keyframes tada {
- 0% {-o-transform: scale(1);}
- 10%, 20% {-o-transform: scale(0.9) rotate(-3deg);}
- 30%, 50%, 70%, 90% {-o-transform: scale(1.1) rotate(3deg);}
- 40%, 60%, 80% {-o-transform: scale(1.1) rotate(-3deg);}
- 100% {-o-transform: scale(1) rotate(0);}
-}
-
-@keyframes tada {
- 0% {transform: scale(1);}
- 10%, 20% {transform: scale(0.9) rotate(-3deg);}
- 30%, 50%, 70%, 90% {transform: scale(1.1) rotate(3deg);}
- 40%, 60%, 80% {transform: scale(1.1) rotate(-3deg);}
- 100% {transform: scale(1) rotate(0);}
-}
-
-.tada {
- -webkit-animation-name: tada;
- -moz-animation-name: tada;
- -o-animation-name: tada;
- animation-name: tada;
-}
-@-webkit-keyframes swing {
- 20%, 40%, 60%, 80%, 100% { -webkit-transform-origin: top center; }
- 20% { -webkit-transform: rotate(15deg); }
- 40% { -webkit-transform: rotate(-10deg); }
- 60% { -webkit-transform: rotate(5deg); }
- 80% { -webkit-transform: rotate(-5deg); }
- 100% { -webkit-transform: rotate(0deg); }
-}
-
-@-moz-keyframes swing {
- 20% { -moz-transform: rotate(15deg); }
- 40% { -moz-transform: rotate(-10deg); }
- 60% { -moz-transform: rotate(5deg); }
- 80% { -moz-transform: rotate(-5deg); }
- 100% { -moz-transform: rotate(0deg); }
-}
-
-@-o-keyframes swing {
- 20% { -o-transform: rotate(15deg); }
- 40% { -o-transform: rotate(-10deg); }
- 60% { -o-transform: rotate(5deg); }
- 80% { -o-transform: rotate(-5deg); }
- 100% { -o-transform: rotate(0deg); }
-}
-
-@keyframes swing {
- 20% { transform: rotate(15deg); }
- 40% { transform: rotate(-10deg); }
- 60% { transform: rotate(5deg); }
- 80% { transform: rotate(-5deg); }
- 100% { transform: rotate(0deg); }
-}
-
-.swing {
- -webkit-transform-origin: top center;
- -moz-transform-origin: top center;
- -o-transform-origin: top center;
- transform-origin: top center;
- -webkit-animation-name: swing;
- -moz-animation-name: swing;
- -o-animation-name: swing;
- animation-name: swing;
-}
-/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */
-
-@-webkit-keyframes wobble {
- 0% { -webkit-transform: translateX(0%); }
- 15% { -webkit-transform: translateX(-25%) rotate(-5deg); }
- 30% { -webkit-transform: translateX(20%) rotate(3deg); }
- 45% { -webkit-transform: translateX(-15%) rotate(-3deg); }
- 60% { -webkit-transform: translateX(10%) rotate(2deg); }
- 75% { -webkit-transform: translateX(-5%) rotate(-1deg); }
- 100% { -webkit-transform: translateX(0%); }
-}
-
-@-moz-keyframes wobble {
- 0% { -moz-transform: translateX(0%); }
- 15% { -moz-transform: translateX(-25%) rotate(-5deg); }
- 30% { -moz-transform: translateX(20%) rotate(3deg); }
- 45% { -moz-transform: translateX(-15%) rotate(-3deg); }
- 60% { -moz-transform: translateX(10%) rotate(2deg); }
- 75% { -moz-transform: translateX(-5%) rotate(-1deg); }
- 100% { -moz-transform: translateX(0%); }
-}
-
-@-o-keyframes wobble {
- 0% { -o-transform: translateX(0%); }
- 15% { -o-transform: translateX(-25%) rotate(-5deg); }
- 30% { -o-transform: translateX(20%) rotate(3deg); }
- 45% { -o-transform: translateX(-15%) rotate(-3deg); }
- 60% { -o-transform: translateX(10%) rotate(2deg); }
- 75% { -o-transform: translateX(-5%) rotate(-1deg); }
- 100% { -o-transform: translateX(0%); }
-}
-
-@keyframes wobble {
- 0% { transform: translateX(0%); }
- 15% { transform: translateX(-25%) rotate(-5deg); }
- 30% { transform: translateX(20%) rotate(3deg); }
- 45% { transform: translateX(-15%) rotate(-3deg); }
- 60% { transform: translateX(10%) rotate(2deg); }
- 75% { transform: translateX(-5%) rotate(-1deg); }
- 100% { transform: translateX(0%); }
-}
-
-.wobble {
- -webkit-animation-name: wobble;
- -moz-animation-name: wobble;
- -o-animation-name: wobble;
- animation-name: wobble;
-}
-/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */
-
-@-webkit-keyframes pulse {
- 0% { -webkit-transform: scale(1); }
- 50% { -webkit-transform: scale(1.1); }
- 100% { -webkit-transform: scale(1); }
-}
-@-moz-keyframes pulse {
- 0% { -moz-transform: scale(1); }
- 50% { -moz-transform: scale(1.1); }
- 100% { -moz-transform: scale(1); }
-}
-@-o-keyframes pulse {
- 0% { -o-transform: scale(1); }
- 50% { -o-transform: scale(1.1); }
- 100% { -o-transform: scale(1); }
-}
-@keyframes pulse {
- 0% { transform: scale(1); }
- 50% { transform: scale(1.1); }
- 100% { transform: scale(1); }
-}
-
-.pulse {
- -webkit-animation-name: pulse;
- -moz-animation-name: pulse;
- -o-animation-name: pulse;
- animation-name: pulse;
-}
-@-webkit-keyframes hinge {
- 0% { -webkit-transform: rotate(0); -webkit-transform-origin: top left; -webkit-animation-timing-function: ease-in-out; }
- 20%, 60% { -webkit-transform: rotate(80deg); -webkit-transform-origin: top left; -webkit-animation-timing-function: ease-in-out; }
- 40% { -webkit-transform: rotate(60deg); -webkit-transform-origin: top left; -webkit-animation-timing-function: ease-in-out; }
- 80% { -webkit-transform: rotate(60deg) translateY(0); opacity: 1; -webkit-transform-origin: top left; -webkit-animation-timing-function: ease-in-out; }
- 100% { -webkit-transform: translateY(700px); opacity: 0; }
-}
-
-@-moz-keyframes hinge {
- 0% { -moz-transform: rotate(0); -moz-transform-origin: top left; -moz-animation-timing-function: ease-in-out; }
- 20%, 60% { -moz-transform: rotate(80deg); -moz-transform-origin: top left; -moz-animation-timing-function: ease-in-out; }
- 40% { -moz-transform: rotate(60deg); -moz-transform-origin: top left; -moz-animation-timing-function: ease-in-out; }
- 80% { -moz-transform: rotate(60deg) translateY(0); opacity: 1; -moz-transform-origin: top left; -moz-animation-timing-function: ease-in-out; }
- 100% { -moz-transform: translateY(700px); opacity: 0; }
-}
-
-@-o-keyframes hinge {
- 0% { -o-transform: rotate(0); -o-transform-origin: top left; -o-animation-timing-function: ease-in-out; }
- 20%, 60% { -o-transform: rotate(80deg); -o-transform-origin: top left; -o-animation-timing-function: ease-in-out; }
- 40% { -o-transform: rotate(60deg); -o-transform-origin: top left; -o-animation-timing-function: ease-in-out; }
- 80% { -o-transform: rotate(60deg) translateY(0); opacity: 1; -o-transform-origin: top left; -o-animation-timing-function: ease-in-out; }
- 100% { -o-transform: translateY(700px); opacity: 0; }
-}
-
-@keyframes hinge {
- 0% { transform: rotate(0); transform-origin: top left; animation-timing-function: ease-in-out; }
- 20%, 60% { transform: rotate(80deg); transform-origin: top left; animation-timing-function: ease-in-out; }
- 40% { transform: rotate(60deg); transform-origin: top left; animation-timing-function: ease-in-out; }
- 80% { transform: rotate(60deg) translateY(0); opacity: 1; transform-origin: top left; animation-timing-function: ease-in-out; }
- 100% { transform: translateY(700px); opacity: 0; }
-}
-
-.hinge {
- -webkit-animation-name: hinge;
- -moz-animation-name: hinge;
- -o-animation-name: hinge;
- animation-name: hinge;
-} \ No newline at end of file
diff --git a/docs/theme/mkdocs/css/bootstrap-custom.css b/docs/theme/mkdocs/css/bootstrap-custom.css
deleted file mode 100644
index 825a858f34..0000000000
--- a/docs/theme/mkdocs/css/bootstrap-custom.css
+++ /dev/null
@@ -1,6784 +0,0 @@
-/*!
- * Bootstrap v2.3.2
- *
- * Copyright 2012 Twitter, Inc
- * Licensed under the Apache License v2.0
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Designed and built with all the love in the world @twitter by @mdo and @fat.
- */
-.clearfix {
- *zoom: 1;
-}
-.clearfix:before,
-.clearfix:after {
- display: table;
- content: "";
- line-height: 0;
-}
-.clearfix:after {
- clear: both;
-}
-.hide-text {
- font: 0/0 a;
- color: transparent;
- background-color: transparent;
- border: 0;
-}
-.input-block-level {
- display: block;
- width: 100%;
- min-height: 11.7px;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
-}
-article,
-aside,
-details,
-figcaption,
-figure,
-footer,
-header,
-hgroup,
-nav,
-section {
- display: block;
-}
-audio,
-canvas,
-video {
- display: inline-block;
- *display: inline;
- *zoom: 1;
-}
-audio:not([controls]) {
- display: none;
-}
-html {
- font-size: 100%;
- -webkit-text-size-adjust: 100%;
- -ms-text-size-adjust: 100%;
-}
-a:focus {
- outline: thin dotted #333;
- outline: 5px auto -webkit-focus-ring-color;
- outline-offset: -2px;
-}
-a:hover,
-a:active {
- outline: 0;
-}
-sub,
-sup {
- position: relative;
- font-size: 75%;
- line-height: 0;
- vertical-align: baseline;
-}
-sup {
- top: -0.5em;
-}
-sub {
- bottom: -0.25em;
-}
-img {
- /* Responsive images (ensure images don't scale beyond their parents) */
- max-width: 100%;
- /* Part 1: Set a maxium relative to the parent */
- width: auto\9;
- /* IE7-8 need help adjusting responsive images */
- height: auto;
- /* Part 2: Scale the height according to the width, otherwise you get stretching */
- vertical-align: middle;
- border: 0;
- -ms-interpolation-mode: bicubic;
-}
-#map_canvas img,
-.google-maps img {
- max-width: none;
-}
-button,
-input,
-select,
-textarea {
- margin: 0;
- font-size: 100%;
- vertical-align: middle;
-}
-button,
-input {
- *overflow: visible;
- line-height: normal;
-}
-button::-moz-focus-inner,
-input::-moz-focus-inner {
- padding: 0;
- border: 0;
-}
-button,
-html input[type="button"],
-input[type="reset"],
-input[type="submit"] {
- -webkit-appearance: button;
- cursor: pointer;
-}
-label,
-select,
-button,
-input[type="button"],
-input[type="reset"],
-input[type="submit"],
-input[type="radio"],
-input[type="checkbox"] {
- cursor: pointer;
-}
-input[type="search"] {
- -webkit-box-sizing: content-box;
- -moz-box-sizing: content-box;
- box-sizing: content-box;
- -webkit-appearance: textfield;
-}
-input[type="search"]::-webkit-search-decoration,
-input[type="search"]::-webkit-search-cancel-button {
- -webkit-appearance: none;
-}
-textarea {
- overflow: auto;
- vertical-align: top;
-}
-@media print {
- * {
- text-shadow: none !important;
- color: #000 !important;
- background: transparent !important;
- box-shadow: none !important;
- }
- a,
- a:visited {
- text-decoration: underline;
- }
- a[href]:after {
- content: " (" attr(href) ")";
- }
- abbr[title]:after {
- content: " (" attr(title) ")";
- }
- .ir a:after,
- a[href^="javascript:"]:after,
- a[href^="#"]:after {
- content: "";
- }
- pre,
- blockquote {
- border: 1px solid #999;
- page-break-inside: avoid;
- }
- thead {
- display: table-header-group;
- }
- tr,
- img {
- page-break-inside: avoid;
- }
- img {
- max-width: 100% !important;
- }
- @page {
- margin: 0.5cm;
- }
- p,
- h2,
- h3 {
- orphans: 3;
- widows: 3;
- }
- h2,
- h3 {
- page-break-after: avoid;
- }
-}
-body {
- margin: 0;
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
- font-size: 14px;
- line-height: 1.7;
- color: #333333;
- background-color: #f2f2f2;
-}
-a {
- color: #213b8f;
- text-decoration: none;
-}
-a:hover,
-a:focus {
- color: #2f55cd;
- text-decoration: underline;
-}
-.img-polaroid {
- padding: 4px;
- background-color: #fff;
- border: 1px solid #ccc;
- border: 1px solid rgba(0, 0, 0, 0.2);
-}
-.row {
- margin-left: -20px;
- *zoom: 1;
-}
-.row:before,
-.row:after {
- display: table;
- content: "";
- line-height: 0;
-}
-.row:after {
- clear: both;
-}
-[class*="span"] {
- float: left;
- min-height: 1px;
- margin-left: 20px;
-}
-.container,
-.navbar-static-top .container,
-.navbar-fixed-top .container,
-.navbar-fixed-bottom .container {
- width: 940px;
-}
-.span12 {
- width: 940px;
-}
-.span11 {
- width: 860px;
-}
-.span10 {
- width: 780px;
-}
-.span9 {
- width: 700px;
-}
-.span8 {
- width: 620px;
-}
-.span7 {
- width: 540px;
-}
-.span6 {
- width: 460px;
-}
-.span5 {
- width: 380px;
-}
-.span4 {
- width: 300px;
-}
-.span3 {
- width: 220px;
-}
-.span2 {
- width: 140px;
-}
-.span1 {
- width: 60px;
-}
-.offset12 {
- margin-left: 980px;
-}
-.offset11 {
- margin-left: 900px;
-}
-.offset10 {
- margin-left: 820px;
-}
-.offset9 {
- margin-left: 740px;
-}
-.offset8 {
- margin-left: 660px;
-}
-.offset7 {
- margin-left: 580px;
-}
-.offset6 {
- margin-left: 500px;
-}
-.offset5 {
- margin-left: 420px;
-}
-.offset4 {
- margin-left: 340px;
-}
-.offset3 {
- margin-left: 260px;
-}
-.offset2 {
- margin-left: 180px;
-}
-.offset1 {
- margin-left: 100px;
-}
-.row-fluid {
- width: 100%;
- *zoom: 1;
-}
-.row-fluid:before,
-.row-fluid:after {
- display: table;
- content: "";
- line-height: 0;
-}
-.row-fluid:after {
- clear: both;
-}
-.row-fluid [class*="span"] {
- display: block;
- width: 100%;
- min-height: 11.7px;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- float: left;
- margin-left: 2.127659574468085%;
- *margin-left: 2.074468085106383%;
-}
-.row-fluid [class*="span"]:first-child {
- margin-left: 0;
-}
-.row-fluid .controls-row [class*="span"] + [class*="span"] {
- margin-left: 2.127659574468085%;
-}
-.row-fluid .span12 {
- width: 100%;
- *width: 99.94680851063829%;
-}
-.row-fluid .span11 {
- width: 91.48936170212765%;
- *width: 91.43617021276594%;
-}
-.row-fluid .span10 {
- width: 82.97872340425532%;
- *width: 82.92553191489361%;
-}
-.row-fluid .span9 {
- width: 74.46808510638297%;
- *width: 74.41489361702126%;
-}
-.row-fluid .span8 {
- width: 65.95744680851064%;
- *width: 65.90425531914893%;
-}
-.row-fluid .span7 {
- width: 57.44680851063829%;
- *width: 57.39361702127659%;
-}
-.row-fluid .span6 {
- width: 48.93617021276595%;
- *width: 48.88297872340425%;
-}
-.row-fluid .span5 {
- width: 40.42553191489362%;
- *width: 40.37234042553192%;
-}
-.row-fluid .span4 {
- width: 31.914893617021278%;
- *width: 31.861702127659576%;
-}
-.row-fluid .span3 {
- width: 23.404255319148934%;
- *width: 23.351063829787233%;
-}
-.row-fluid .span2 {
- width: 14.893617021276595%;
- *width: 14.840425531914894%;
-}
-.row-fluid .span1 {
- width: 6.382978723404255%;
- *width: 6.329787234042553%;
-}
-.row-fluid .offset12 {
- margin-left: 104.25531914893617%;
- *margin-left: 104.14893617021275%;
-}
-.row-fluid .offset12:first-child {
- margin-left: 102.12765957446808%;
- *margin-left: 102.02127659574467%;
-}
-.row-fluid .offset11 {
- margin-left: 95.74468085106382%;
- *margin-left: 95.6382978723404%;
-}
-.row-fluid .offset11:first-child {
- margin-left: 93.61702127659574%;
- *margin-left: 93.51063829787232%;
-}
-.row-fluid .offset10 {
- margin-left: 87.23404255319149%;
- *margin-left: 87.12765957446807%;
-}
-.row-fluid .offset10:first-child {
- margin-left: 85.1063829787234%;
- *margin-left: 84.99999999999999%;
-}
-.row-fluid .offset9 {
- margin-left: 78.72340425531914%;
- *margin-left: 78.61702127659572%;
-}
-.row-fluid .offset9:first-child {
- margin-left: 76.59574468085106%;
- *margin-left: 76.48936170212764%;
-}
-.row-fluid .offset8 {
- margin-left: 70.2127659574468%;
- *margin-left: 70.10638297872339%;
-}
-.row-fluid .offset8:first-child {
- margin-left: 68.08510638297872%;
- *margin-left: 67.9787234042553%;
-}
-.row-fluid .offset7 {
- margin-left: 61.70212765957446%;
- *margin-left: 61.59574468085106%;
-}
-.row-fluid .offset7:first-child {
- margin-left: 59.574468085106375%;
- *margin-left: 59.46808510638297%;
-}
-.row-fluid .offset6 {
- margin-left: 53.191489361702125%;
- *margin-left: 53.085106382978715%;
-}
-.row-fluid .offset6:first-child {
- margin-left: 51.063829787234035%;
- *margin-left: 50.95744680851063%;
-}
-.row-fluid .offset5 {
- margin-left: 44.68085106382979%;
- *margin-left: 44.57446808510638%;
-}
-.row-fluid .offset5:first-child {
- margin-left: 42.5531914893617%;
- *margin-left: 42.4468085106383%;
-}
-.row-fluid .offset4 {
- margin-left: 36.170212765957444%;
- *margin-left: 36.06382978723405%;
-}
-.row-fluid .offset4:first-child {
- margin-left: 34.04255319148936%;
- *margin-left: 33.93617021276596%;
-}
-.row-fluid .offset3 {
- margin-left: 27.659574468085104%;
- *margin-left: 27.5531914893617%;
-}
-.row-fluid .offset3:first-child {
- margin-left: 25.53191489361702%;
- *margin-left: 25.425531914893618%;
-}
-.row-fluid .offset2 {
- margin-left: 19.148936170212764%;
- *margin-left: 19.04255319148936%;
-}
-.row-fluid .offset2:first-child {
- margin-left: 17.02127659574468%;
- *margin-left: 16.914893617021278%;
-}
-.row-fluid .offset1 {
- margin-left: 10.638297872340425%;
- *margin-left: 10.53191489361702%;
-}
-.row-fluid .offset1:first-child {
- margin-left: 8.51063829787234%;
- *margin-left: 8.404255319148938%;
-}
-[class*="span"].hide,
-.row-fluid [class*="span"].hide {
- display: none;
-}
-[class*="span"].pull-right,
-.row-fluid [class*="span"].pull-right {
- float: right;
-}
-.container {
- margin-right: auto;
- margin-left: auto;
- *zoom: 1;
-}
-.container:before,
-.container:after {
- display: table;
- content: "";
- line-height: 0;
-}
-.container:after {
- clear: both;
-}
-.container-fluid {
- padding-right: 20px;
- padding-left: 20px;
- *zoom: 1;
-}
-.container-fluid:before,
-.container-fluid:after {
- display: table;
- content: "";
- line-height: 0;
-}
-.container-fluid:after {
- clear: both;
-}
-[class^="icon-"],
-[class*=" icon-"] {
- display: inline-block;
- width: 14px;
- height: 14px;
- *margin-right: .3em;
- line-height: 14px;
- vertical-align: text-top;
- background-image: url("img/glyphicons-halflings.png");
- background-position: 14px 14px;
- background-repeat: no-repeat;
- margin-top: 1px;
-}
-/* White icons with optional class, or on hover/focus/active states of certain elements */
-.icon-white,
-.nav-pills > .active > a > [class^="icon-"],
-.nav-pills > .active > a > [class*=" icon-"],
-.nav-list > .active > a > [class^="icon-"],
-.nav-list > .active > a > [class*=" icon-"],
-.navbar-inverse .nav > .active > a > [class^="icon-"],
-.navbar-inverse .nav > .active > a > [class*=" icon-"],
-.dropdown-menu > li > a:hover > [class^="icon-"],
-.dropdown-menu > li > a:focus > [class^="icon-"],
-.dropdown-menu > li > a:hover > [class*=" icon-"],
-.dropdown-menu > li > a:focus > [class*=" icon-"],
-.dropdown-menu > .active > a > [class^="icon-"],
-.dropdown-menu > .active > a > [class*=" icon-"],
-.dropdown-submenu:hover > a > [class^="icon-"],
-.dropdown-submenu:focus > a > [class^="icon-"],
-.dropdown-submenu:hover > a > [class*=" icon-"],
-.dropdown-submenu:focus > a > [class*=" icon-"] {
- background-image: url("img/glyphicons-halflings-white.png");
-}
-.icon-glass {
- background-position: 0 0;
-}
-.icon-music {
- background-position: -24px 0;
-}
-.icon-search {
- background-position: -48px 0;
-}
-.icon-envelope {
- background-position: -72px 0;
-}
-.icon-heart {
- background-position: -96px 0;
-}
-.icon-star {
- background-position: -120px 0;
-}
-.icon-star-empty {
- background-position: -144px 0;
-}
-.icon-user {
- background-position: -168px 0;
-}
-.icon-film {
- background-position: -192px 0;
-}
-.icon-th-large {
- background-position: -216px 0;
-}
-.icon-th {
- background-position: -240px 0;
-}
-.icon-th-list {
- background-position: -264px 0;
-}
-.icon-ok {
- background-position: -288px 0;
-}
-.icon-remove {
- background-position: -312px 0;
-}
-.icon-zoom-in {
- background-position: -336px 0;
-}
-.icon-zoom-out {
- background-position: -360px 0;
-}
-.icon-off {
- background-position: -384px 0;
-}
-.icon-signal {
- background-position: -408px 0;
-}
-.icon-cog {
- background-position: -432px 0;
-}
-.icon-trash {
- background-position: -456px 0;
-}
-.icon-home {
- background-position: 0 -24px;
-}
-.icon-file {
- background-position: -24px -24px;
-}
-.icon-time {
- background-position: -48px -24px;
-}
-.icon-road {
- background-position: -72px -24px;
-}
-.icon-download-alt {
- background-position: -96px -24px;
-}
-.icon-download {
- background-position: -120px -24px;
-}
-.icon-upload {
- background-position: -144px -24px;
-}
-.icon-inbox {
- background-position: -168px -24px;
-}
-.icon-play-circle {
- background-position: -192px -24px;
-}
-.icon-repeat {
- background-position: -216px -24px;
-}
-.icon-refresh {
- background-position: -240px -24px;
-}
-.icon-list-alt {
- background-position: -264px -24px;
-}
-.icon-lock {
- background-position: -287px -24px;
-}
-.icon-flag {
- background-position: -312px -24px;
-}
-.icon-headphones {
- background-position: -336px -24px;
-}
-.icon-volume-off {
- background-position: -360px -24px;
-}
-.icon-volume-down {
- background-position: -384px -24px;
-}
-.icon-volume-up {
- background-position: -408px -24px;
-}
-.icon-qrcode {
- background-position: -432px -24px;
-}
-.icon-barcode {
- background-position: -456px -24px;
-}
-.icon-tag {
- background-position: 0 -48px;
-}
-.icon-tags {
- background-position: -25px -48px;
-}
-.icon-book {
- background-position: -48px -48px;
-}
-.icon-bookmark {
- background-position: -72px -48px;
-}
-.icon-print {
- background-position: -96px -48px;
-}
-.icon-camera {
- background-position: -120px -48px;
-}
-.icon-font {
- background-position: -144px -48px;
-}
-.icon-bold {
- background-position: -167px -48px;
-}
-.icon-italic {
- background-position: -192px -48px;
-}
-.icon-text-height {
- background-position: -216px -48px;
-}
-.icon-text-width {
- background-position: -240px -48px;
-}
-.icon-align-left {
- background-position: -264px -48px;
-}
-.icon-align-center {
- background-position: -288px -48px;
-}
-.icon-align-right {
- background-position: -312px -48px;
-}
-.icon-align-justify {
- background-position: -336px -48px;
-}
-.icon-list {
- background-position: -360px -48px;
-}
-.icon-indent-left {
- background-position: -384px -48px;
-}
-.icon-indent-right {
- background-position: -408px -48px;
-}
-.icon-facetime-video {
- background-position: -432px -48px;
-}
-.icon-picture {
- background-position: -456px -48px;
-}
-.icon-pencil {
- background-position: 0 -72px;
-}
-.icon-map-marker {
- background-position: -24px -72px;
-}
-.icon-adjust {
- background-position: -48px -72px;
-}
-.icon-tint {
- background-position: -72px -72px;
-}
-.icon-edit {
- background-position: -96px -72px;
-}
-.icon-share {
- background-position: -120px -72px;
-}
-.icon-check {
- background-position: -144px -72px;
-}
-.icon-move {
- background-position: -168px -72px;
-}
-.icon-step-backward {
- background-position: -192px -72px;
-}
-.icon-fast-backward {
- background-position: -216px -72px;
-}
-.icon-backward {
- background-position: -240px -72px;
-}
-.icon-play {
- background-position: -264px -72px;
-}
-.icon-pause {
- background-position: -288px -72px;
-}
-.icon-stop {
- background-position: -312px -72px;
-}
-.icon-forward {
- background-position: -336px -72px;
-}
-.icon-fast-forward {
- background-position: -360px -72px;
-}
-.icon-step-forward {
- background-position: -384px -72px;
-}
-.icon-eject {
- background-position: -408px -72px;
-}
-.icon-chevron-left {
- background-position: -432px -72px;
-}
-.icon-chevron-right {
- background-position: -456px -72px;
-}
-.icon-plus-sign {
- background-position: 0 -96px;
-}
-.icon-minus-sign {
- background-position: -24px -96px;
-}
-.icon-remove-sign {
- background-position: -48px -96px;
-}
-.icon-ok-sign {
- background-position: -72px -96px;
-}
-.icon-question-sign {
- background-position: -96px -96px;
-}
-.icon-info-sign {
- background-position: -120px -96px;
-}
-.icon-screenshot {
- background-position: -144px -96px;
-}
-.icon-remove-circle {
- background-position: -168px -96px;
-}
-.icon-ok-circle {
- background-position: -192px -96px;
-}
-.icon-ban-circle {
- background-position: -216px -96px;
-}
-.icon-arrow-left {
- background-position: -240px -96px;
-}
-.icon-arrow-right {
- background-position: -264px -96px;
-}
-.icon-arrow-up {
- background-position: -289px -96px;
-}
-.icon-arrow-down {
- background-position: -312px -96px;
-}
-.icon-share-alt {
- background-position: -336px -96px;
-}
-.icon-resize-full {
- background-position: -360px -96px;
-}
-.icon-resize-small {
- background-position: -384px -96px;
-}
-.icon-plus {
- background-position: -408px -96px;
-}
-.icon-minus {
- background-position: -433px -96px;
-}
-.icon-asterisk {
- background-position: -456px -96px;
-}
-.icon-exclamation-sign {
- background-position: 0 -120px;
-}
-.icon-gift {
- background-position: -24px -120px;
-}
-.icon-leaf {
- background-position: -48px -120px;
-}
-.icon-fire {
- background-position: -72px -120px;
-}
-.icon-eye-open {
- background-position: -96px -120px;
-}
-.icon-eye-close {
- background-position: -120px -120px;
-}
-.icon-warning-sign {
- background-position: -144px -120px;
-}
-.icon-plane {
- background-position: -168px -120px;
-}
-.icon-calendar {
- background-position: -192px -120px;
-}
-.icon-random {
- background-position: -216px -120px;
- width: 16px;
-}
-.icon-comment {
- background-position: -240px -120px;
-}
-.icon-magnet {
- background-position: -264px -120px;
-}
-.icon-chevron-up {
- background-position: -288px -120px;
-}
-.icon-chevron-down {
- background-position: -313px -119px;
-}
-.icon-retweet {
- background-position: -336px -120px;
-}
-.icon-shopping-cart {
- background-position: -360px -120px;
-}
-.icon-folder-close {
- background-position: -384px -120px;
- width: 16px;
-}
-.icon-folder-open {
- background-position: -408px -120px;
- width: 16px;
-}
-.icon-resize-vertical {
- background-position: -432px -119px;
-}
-.icon-resize-horizontal {
- background-position: -456px -118px;
-}
-.icon-hdd {
- background-position: 0 -144px;
-}
-.icon-bullhorn {
- background-position: -24px -144px;
-}
-.icon-bell {
- background-position: -48px -144px;
-}
-.icon-certificate {
- background-position: -72px -144px;
-}
-.icon-thumbs-up {
- background-position: -96px -144px;
-}
-.icon-thumbs-down {
- background-position: -120px -144px;
-}
-.icon-hand-right {
- background-position: -144px -144px;
-}
-.icon-hand-left {
- background-position: -168px -144px;
-}
-.icon-hand-up {
- background-position: -192px -144px;
-}
-.icon-hand-down {
- background-position: -216px -144px;
-}
-.icon-circle-arrow-right {
- background-position: -240px -144px;
-}
-.icon-circle-arrow-left {
- background-position: -264px -144px;
-}
-.icon-circle-arrow-up {
- background-position: -288px -144px;
-}
-.icon-circle-arrow-down {
- background-position: -312px -144px;
-}
-.icon-globe {
- background-position: -336px -144px;
-}
-.icon-wrench {
- background-position: -360px -144px;
-}
-.icon-tasks {
- background-position: -384px -144px;
-}
-.icon-filter {
- background-position: -408px -144px;
-}
-.icon-briefcase {
- background-position: -432px -144px;
-}
-.icon-fullscreen {
- background-position: -456px -144px;
-}
-p {
- margin: 0 0 0.85;
-}
-.lead {
- margin-bottom: 1.7;
- font-size: 21px;
- font-weight: 200;
- line-height: 2.55;
-}
-small {
- font-size: 85%;
-}
-strong {
- font-weight: bold;
-}
-em {
- font-style: italic;
-}
-cite {
- font-style: normal;
-}
-.muted {
- color: #999999;
-}
-a.muted:hover,
-a.muted:focus {
- color: #808080;
-}
-.text-warning {
- color: #c09853;
-}
-a.text-warning:hover,
-a.text-warning:focus {
- color: #a47e3c;
-}
-.text-error {
- color: #b94a48;
-}
-a.text-error:hover,
-a.text-error:focus {
- color: #953b39;
-}
-.text-info {
- color: #3a87ad;
-}
-a.text-info:hover,
-a.text-info:focus {
- color: #2d6987;
-}
-.text-success {
- color: #468847;
-}
-a.text-success:hover,
-a.text-success:focus {
- color: #356635;
-}
-.text-left {
- text-align: left;
-}
-.text-right {
- text-align: right;
-}
-.text-center {
- text-align: center;
-}
-h1,
-h2,
-h3,
-h4,
-h5,
-h6 {
- margin: 0.85 0;
- font-family: inherit;
- font-weight: 400;
- line-height: 1.7;
- color: #394d54;
- text-rendering: optimizelegibility;
-}
-h1 small,
-h2 small,
-h3 small,
-h4 small,
-h5 small,
-h6 small {
- font-weight: normal;
- line-height: 1;
- color: #999999;
-}
-h1,
-h2,
-h3 {
- line-height: 3.4;
-}
-h1 {
- font-size: 38.5px;
-}
-h2 {
- font-size: 31.5px;
-}
-h3 {
- font-size: 24.5px;
-}
-h4 {
- font-size: 17.5px;
-}
-h5 {
- font-size: 14px;
-}
-h6 {
- font-size: 11.9px;
-}
-h1 small {
- font-size: 24.5px;
-}
-h2 small {
- font-size: 17.5px;
-}
-h3 small {
- font-size: 14px;
-}
-h4 small {
- font-size: 14px;
-}
-.page-header {
- padding-bottom: -0.15000000000000002;
- margin: 1.7 0 2.55;
- border-bottom: 1px solid #eeeeee;
-}
-ul,
-ol {
- padding: 0;
- margin: 0 0 0.85 25px;
-}
-ul ul,
-ul ol,
-ol ol,
-ol ul {
- margin-bottom: 0;
-}
-li {
- line-height: 1.7;
-}
-ul.unstyled,
-ol.unstyled {
- margin-left: 0;
- list-style: none;
-}
-ul.inline,
-ol.inline {
- margin-left: 0;
- list-style: none;
-}
-ul.inline > li,
-ol.inline > li {
- display: inline-block;
- *display: inline;
- /* IE7 inline-block hack */
- *zoom: 1;
- padding-left: 5px;
- padding-right: 5px;
-}
-dl {
- margin-bottom: 1.7;
-}
-dt,
-dd {
- line-height: 1.7;
-}
-dt {
- font-weight: bold;
-}
-dd {
- margin-left: 0.85;
-}
-.dl-horizontal {
- *zoom: 1;
-}
-.dl-horizontal:before,
-.dl-horizontal:after {
- display: table;
- content: "";
- line-height: 0;
-}
-.dl-horizontal:after {
- clear: both;
-}
-.dl-horizontal dt {
- float: left;
- width: 160px;
- clear: left;
- text-align: right;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
-.dl-horizontal dd {
- margin-left: 180px;
-}
-hr {
- margin: 1.7 0;
- border: 0;
- border-top: 1px solid #eeeeee;
- border-bottom: 1px solid #ffffff;
-}
-abbr[title],
-abbr[data-original-title] {
- cursor: help;
- border-bottom: 1px dotted #999999;
-}
-abbr.initialism {
- font-size: 90%;
- text-transform: uppercase;
-}
-blockquote {
- padding: 0 0 0 15px;
- margin: 0 0 1.7;
- border-left: 5px solid #eeeeee;
-}
-blockquote p {
- margin-bottom: 0;
- font-size: 17.5px;
- font-weight: 300;
- line-height: 1.25;
-}
-blockquote small {
- display: block;
- line-height: 1.7;
- color: #999999;
-}
-blockquote small:before {
- content: '\2014 \00A0';
-}
-blockquote.pull-right {
- float: right;
- padding-right: 15px;
- padding-left: 0;
- border-right: 5px solid #eeeeee;
- border-left: 0;
-}
-blockquote.pull-right p,
-blockquote.pull-right small {
- text-align: right;
-}
-blockquote.pull-right small:before {
- content: '';
-}
-blockquote.pull-right small:after {
- content: '\00A0 \2014';
-}
-q:before,
-q:after,
-blockquote:before,
-blockquote:after {
- content: "";
-}
-address {
- display: block;
- margin-bottom: 1.7;
- font-style: normal;
- line-height: 1.7;
-}
-code,
-pre {
- padding: 0 3px 2px;
- font-family: Monaco, Menlo, Consolas, "Courier New", monospace;
- font-size: 12px;
- color: #333333;
-}
-code {
- padding: 2px 4px;
- color: #d14;
- background-color: #f7f7f9;
- border: 1px solid #e1e1e8;
- white-space: nowrap;
-}
-pre {
- display: block;
- padding: 0.35;
- margin: 0 0 0.85;
- font-size: 13px;
- line-height: 1.7;
- word-break: break-all;
- word-wrap: break-word;
- white-space: pre;
- white-space: pre-wrap;
- background-color: #f5f5f5;
- border: 1px solid #ccc;
- border: 1px solid rgba(0, 0, 0, 0.15);
-}
-pre.prettyprint {
- margin-bottom: 1.7;
-}
-pre code {
- padding: 0;
- color: inherit;
- white-space: pre;
- white-space: pre-wrap;
- background-color: transparent;
- border: 0;
-}
-.pre-scrollable {
- max-height: 340px;
- overflow-y: scroll;
-}
-form {
- margin: 0 0 1.7;
-}
-fieldset {
- padding: 0;
- margin: 0;
- border: 0;
-}
-legend {
- display: block;
- width: 100%;
- padding: 0;
- margin-bottom: 1.7;
- font-size: 21px;
- line-height: 3.4;
- color: #333333;
- border: 0;
- border-bottom: 1px solid #e5e5e5;
-}
-legend small {
- font-size: 1.275;
- color: #999999;
-}
-label,
-input,
-button,
-select,
-textarea {
- font-size: 14px;
- font-weight: normal;
- line-height: 1.7;
-}
-input,
-button,
-select,
-textarea {
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
-}
-label {
- display: block;
- margin-bottom: 5px;
-}
-select,
-textarea,
-input[type="text"],
-input[type="password"],
-input[type="datetime"],
-input[type="datetime-local"],
-input[type="date"],
-input[type="month"],
-input[type="time"],
-input[type="week"],
-input[type="number"],
-input[type="email"],
-input[type="url"],
-input[type="search"],
-input[type="tel"],
-input[type="color"],
-.uneditable-input {
- display: inline-block;
- height: 1.7;
- padding: 4px 6px;
- margin-bottom: 0.85;
- font-size: 14px;
- line-height: 1.7;
- color: #555555;
- vertical-align: middle;
-}
-input,
-textarea,
-.uneditable-input {
- width: 206px;
-}
-textarea {
- height: auto;
-}
-textarea,
-input[type="text"],
-input[type="password"],
-input[type="datetime"],
-input[type="datetime-local"],
-input[type="date"],
-input[type="month"],
-input[type="time"],
-input[type="week"],
-input[type="number"],
-input[type="email"],
-input[type="url"],
-input[type="search"],
-input[type="tel"],
-input[type="color"],
-.uneditable-input {
- background-color: #ffffff;
- border: 1px solid #cccccc;
- -webkit-transition: border linear .2s, box-shadow linear .2s;
- -moz-transition: border linear .2s, box-shadow linear .2s;
- -o-transition: border linear .2s, box-shadow linear .2s;
- transition: border linear .2s, box-shadow linear .2s;
-}
-textarea:focus,
-input[type="text"]:focus,
-input[type="password"]:focus,
-input[type="datetime"]:focus,
-input[type="datetime-local"]:focus,
-input[type="date"]:focus,
-input[type="month"]:focus,
-input[type="time"]:focus,
-input[type="week"]:focus,
-input[type="number"]:focus,
-input[type="email"]:focus,
-input[type="url"]:focus,
-input[type="search"]:focus,
-input[type="tel"]:focus,
-input[type="color"]:focus,
-.uneditable-input:focus {
- border-color: rgba(82, 168, 236, 0.8);
- outline: 0;
- outline: thin dotted \9;
- /* IE6-9 */
-}
-input[type="radio"],
-input[type="checkbox"] {
- margin: 4px 0 0;
- *margin-top: 0;
- /* IE7 */
- margin-top: 1px \9;
- /* IE8-9 */
- line-height: normal;
-}
-input[type="file"],
-input[type="image"],
-input[type="submit"],
-input[type="reset"],
-input[type="button"],
-input[type="radio"],
-input[type="checkbox"] {
- width: auto;
-}
-select,
-input[type="file"] {
- height: 11.7px;
- /* In IE7, the height of the select element cannot be changed by height, only font-size */
- *margin-top: 4px;
- /* For IE7, add top margin to align select with labels */
- line-height: 11.7px;
-}
-select {
- width: 220px;
- border: 1px solid #cccccc;
- background-color: #ffffff;
-}
-select[multiple],
-select[size] {
- height: auto;
-}
-select:focus,
-input[type="file"]:focus,
-input[type="radio"]:focus,
-input[type="checkbox"]:focus {
- outline: thin dotted #333;
- outline: 5px auto -webkit-focus-ring-color;
- outline-offset: -2px;
-}
-.uneditable-input,
-.uneditable-textarea {
- color: #999999;
- background-color: #fcfcfc;
- border-color: #cccccc;
- cursor: not-allowed;
-}
-.uneditable-input {
- overflow: hidden;
- white-space: nowrap;
-}
-.uneditable-textarea {
- width: auto;
- height: auto;
-}
-input:-moz-placeholder,
-textarea:-moz-placeholder {
- color: #999999;
-}
-input:-ms-input-placeholder,
-textarea:-ms-input-placeholder {
- color: #999999;
-}
-input::-webkit-input-placeholder,
-textarea::-webkit-input-placeholder {
- color: #999999;
-}
-.radio,
-.checkbox {
- min-height: 1.7;
- padding-left: 20px;
-}
-.radio input[type="radio"],
-.checkbox input[type="checkbox"] {
- float: left;
- margin-left: -20px;
-}
-.controls > .radio:first-child,
-.controls > .checkbox:first-child {
- padding-top: 5px;
-}
-.radio.inline,
-.checkbox.inline {
- display: inline-block;
- padding-top: 5px;
- margin-bottom: 0;
- vertical-align: middle;
-}
-.radio.inline + .radio.inline,
-.checkbox.inline + .checkbox.inline {
- margin-left: 10px;
-}
-.input-mini {
- width: 60px;
-}
-.input-small {
- width: 90px;
-}
-.input-medium {
- width: 150px;
-}
-.input-large {
- width: 210px;
-}
-.input-xlarge {
- width: 270px;
-}
-.input-xxlarge {
- width: 530px;
-}
-input[class*="span"],
-select[class*="span"],
-textarea[class*="span"],
-.uneditable-input[class*="span"],
-.row-fluid input[class*="span"],
-.row-fluid select[class*="span"],
-.row-fluid textarea[class*="span"],
-.row-fluid .uneditable-input[class*="span"] {
- float: none;
- margin-left: 0;
-}
-.input-append input[class*="span"],
-.input-append .uneditable-input[class*="span"],
-.input-prepend input[class*="span"],
-.input-prepend .uneditable-input[class*="span"],
-.row-fluid input[class*="span"],
-.row-fluid select[class*="span"],
-.row-fluid textarea[class*="span"],
-.row-fluid .uneditable-input[class*="span"],
-.row-fluid .input-prepend [class*="span"],
-.row-fluid .input-append [class*="span"] {
- display: inline-block;
-}
-input,
-textarea,
-.uneditable-input {
- margin-left: 0;
-}
-.controls-row [class*="span"] + [class*="span"] {
- margin-left: 20px;
-}
-input.span12,
-textarea.span12,
-.uneditable-input.span12 {
- width: 926px;
-}
-input.span11,
-textarea.span11,
-.uneditable-input.span11 {
- width: 846px;
-}
-input.span10,
-textarea.span10,
-.uneditable-input.span10 {
- width: 766px;
-}
-input.span9,
-textarea.span9,
-.uneditable-input.span9 {
- width: 686px;
-}
-input.span8,
-textarea.span8,
-.uneditable-input.span8 {
- width: 606px;
-}
-input.span7,
-textarea.span7,
-.uneditable-input.span7 {
- width: 526px;
-}
-input.span6,
-textarea.span6,
-.uneditable-input.span6 {
- width: 446px;
-}
-input.span5,
-textarea.span5,
-.uneditable-input.span5 {
- width: 366px;
-}
-input.span4,
-textarea.span4,
-.uneditable-input.span4 {
- width: 286px;
-}
-input.span3,
-textarea.span3,
-.uneditable-input.span3 {
- width: 206px;
-}
-input.span2,
-textarea.span2,
-.uneditable-input.span2 {
- width: 126px;
-}
-input.span1,
-textarea.span1,
-.uneditable-input.span1 {
- width: 46px;
-}
-.controls-row {
- *zoom: 1;
-}
-.controls-row:before,
-.controls-row:after {
- display: table;
- content: "";
- line-height: 0;
-}
-.controls-row:after {
- clear: both;
-}
-.controls-row [class*="span"],
-.row-fluid .controls-row [class*="span"] {
- float: left;
-}
-.controls-row .checkbox[class*="span"],
-.controls-row .radio[class*="span"] {
- padding-top: 5px;
-}
-input[disabled],
-select[disabled],
-textarea[disabled],
-input[readonly],
-select[readonly],
-textarea[readonly] {
- cursor: not-allowed;
- background-color: #eeeeee;
-}
-input[type="radio"][disabled],
-input[type="checkbox"][disabled],
-input[type="radio"][readonly],
-input[type="checkbox"][readonly] {
- background-color: transparent;
-}
-.control-group.warning .control-label,
-.control-group.warning .help-block,
-.control-group.warning .help-inline {
- color: #c09853;
-}
-.control-group.warning .checkbox,
-.control-group.warning .radio,
-.control-group.warning input,
-.control-group.warning select,
-.control-group.warning textarea {
- color: #c09853;
-}
-.control-group.warning input,
-.control-group.warning select,
-.control-group.warning textarea {
- border-color: #c09853;
-}
-.control-group.warning input:focus,
-.control-group.warning select:focus,
-.control-group.warning textarea:focus {
- border-color: #a47e3c;
-}
-.control-group.warning .input-prepend .add-on,
-.control-group.warning .input-append .add-on {
- color: #c09853;
- background-color: #fcf8e3;
- border-color: #c09853;
-}
-.control-group.error .control-label,
-.control-group.error .help-block,
-.control-group.error .help-inline {
- color: #b94a48;
-}
-.control-group.error .checkbox,
-.control-group.error .radio,
-.control-group.error input,
-.control-group.error select,
-.control-group.error textarea {
- color: #b94a48;
-}
-.control-group.error input,
-.control-group.error select,
-.control-group.error textarea {
- border-color: #b94a48;
-}
-.control-group.error input:focus,
-.control-group.error select:focus,
-.control-group.error textarea:focus {
- border-color: #953b39;
-}
-.control-group.error .input-prepend .add-on,
-.control-group.error .input-append .add-on {
- color: #b94a48;
- background-color: #f2dede;
- border-color: #b94a48;
-}
-.control-group.success .control-label,
-.control-group.success .help-block,
-.control-group.success .help-inline {
- color: #468847;
-}
-.control-group.success .checkbox,
-.control-group.success .radio,
-.control-group.success input,
-.control-group.success select,
-.control-group.success textarea {
- color: #468847;
-}
-.control-group.success input,
-.control-group.success select,
-.control-group.success textarea {
- border-color: #468847;
-}
-.control-group.success input:focus,
-.control-group.success select:focus,
-.control-group.success textarea:focus {
- border-color: #356635;
-}
-.control-group.success .input-prepend .add-on,
-.control-group.success .input-append .add-on {
- color: #468847;
- background-color: #dff0d8;
- border-color: #468847;
-}
-.control-group.info .control-label,
-.control-group.info .help-block,
-.control-group.info .help-inline {
- color: #3a87ad;
-}
-.control-group.info .checkbox,
-.control-group.info .radio,
-.control-group.info input,
-.control-group.info select,
-.control-group.info textarea {
- color: #3a87ad;
-}
-.control-group.info input,
-.control-group.info select,
-.control-group.info textarea {
- border-color: #3a87ad;
-}
-.control-group.info input:focus,
-.control-group.info select:focus,
-.control-group.info textarea:focus {
- border-color: #2d6987;
-}
-.control-group.info .input-prepend .add-on,
-.control-group.info .input-append .add-on {
- color: #3a87ad;
- background-color: #d9edf7;
- border-color: #3a87ad;
-}
-input:focus:invalid,
-textarea:focus:invalid,
-select:focus:invalid {
- color: #b94a48;
- border-color: #ee5f5b;
-}
-input:focus:invalid:focus,
-textarea:focus:invalid:focus,
-select:focus:invalid:focus {
- border-color: #e9322d;
-}
-.form-actions {
- padding: 0.7 20px 1.7;
- margin-top: 1.7;
- margin-bottom: 1.7;
- background-color: #f5f5f5;
- border-top: 1px solid #e5e5e5;
- *zoom: 1;
-}
-.form-actions:before,
-.form-actions:after {
- display: table;
- content: "";
- line-height: 0;
-}
-.form-actions:after {
- clear: both;
-}
-.help-block,
-.help-inline {
- color: #595959;
-}
-.help-block {
- display: block;
- margin-bottom: 0.85;
-}
-.help-inline {
- display: inline-block;
- *display: inline;
- /* IE7 inline-block hack */
- *zoom: 1;
- vertical-align: middle;
- padding-left: 5px;
-}
-.input-append,
-.input-prepend {
- display: inline-block;
- margin-bottom: 0.85;
- vertical-align: middle;
- font-size: 0;
- white-space: nowrap;
-}
-.input-append input,
-.input-prepend input,
-.input-append select,
-.input-prepend select,
-.input-append .uneditable-input,
-.input-prepend .uneditable-input,
-.input-append .dropdown-menu,
-.input-prepend .dropdown-menu,
-.input-append .popover,
-.input-prepend .popover {
- font-size: 14px;
-}
-.input-append input,
-.input-prepend input,
-.input-append select,
-.input-prepend select,
-.input-append .uneditable-input,
-.input-prepend .uneditable-input {
- position: relative;
- margin-bottom: 0;
- *margin-left: 0;
- vertical-align: top;
-}
-.input-append input:focus,
-.input-prepend input:focus,
-.input-append select:focus,
-.input-prepend select:focus,
-.input-append .uneditable-input:focus,
-.input-prepend .uneditable-input:focus {
- z-index: 2;
-}
-.input-append .add-on,
-.input-prepend .add-on {
- display: inline-block;
- width: auto;
- height: 1.7;
- min-width: 16px;
- padding: 4px 5px;
- font-size: 14px;
- font-weight: normal;
- line-height: 1.7;
- text-align: center;
- background-color: #eeeeee;
- border: 1px solid #ccc;
-}
-.input-append .add-on,
-.input-prepend .add-on,
-.input-append .btn,
-.input-prepend .btn,
-.input-append .btn-group > .dropdown-toggle,
-.input-prepend .btn-group > .dropdown-toggle {
- vertical-align: top;
-}
-.input-append .active,
-.input-prepend .active {
- background-color: #a9dba9;
- border-color: #46a546;
-}
-.input-prepend .add-on,
-.input-prepend .btn {
- margin-right: -1px;
-}
-.input-append input,
-.input-append select,
-.input-append .add-on,
-.input-append .btn,
-.input-append .btn-group {
- margin-left: -1px;
-}
-.input-prepend.input-append input,
-.input-prepend.input-append select,
-.input-prepend.input-append .add-on:first-child,
-.input-prepend.input-append .btn:first-child {
- margin-right: -1px;
-}
-.input-prepend.input-append .add-on:last-child,
-.input-prepend.input-append .btn:last-child {
- margin-left: -1px;
-}
-.input-prepend.input-append .btn-group:first-child {
- margin-left: 0;
-}
-input.search-query {
- padding-right: 14px;
- padding-right: 4px \9;
- padding-left: 14px;
- padding-left: 4px \9;
- /* IE7-8 doesn't have border-radius, so don't indent the padding */
- margin-bottom: 0;
-}
-/* Allow for input prepend/append in search forms */
-.form-search input,
-.form-inline input,
-.form-horizontal input,
-.form-search textarea,
-.form-inline textarea,
-.form-horizontal textarea,
-.form-search select,
-.form-inline select,
-.form-horizontal select,
-.form-search .help-inline,
-.form-inline .help-inline,
-.form-horizontal .help-inline,
-.form-search .uneditable-input,
-.form-inline .uneditable-input,
-.form-horizontal .uneditable-input,
-.form-search .input-prepend,
-.form-inline .input-prepend,
-.form-horizontal .input-prepend,
-.form-search .input-append,
-.form-inline .input-append,
-.form-horizontal .input-append {
- display: inline-block;
- *display: inline;
- /* IE7 inline-block hack */
- *zoom: 1;
- margin-bottom: 0;
- vertical-align: middle;
-}
-.form-search .hide,
-.form-inline .hide,
-.form-horizontal .hide {
- display: none;
-}
-.form-search label,
-.form-inline label,
-.form-search .btn-group,
-.form-inline .btn-group {
- display: inline-block;
-}
-.form-search .input-append,
-.form-inline .input-append,
-.form-search .input-prepend,
-.form-inline .input-prepend {
- margin-bottom: 0;
-}
-.form-search .radio,
-.form-search .checkbox,
-.form-inline .radio,
-.form-inline .checkbox {
- padding-left: 0;
- margin-bottom: 0;
- vertical-align: middle;
-}
-.form-search .radio input[type="radio"],
-.form-search .checkbox input[type="checkbox"],
-.form-inline .radio input[type="radio"],
-.form-inline .checkbox input[type="checkbox"] {
- float: left;
- margin-right: 3px;
- margin-left: 0;
-}
-.control-group {
- margin-bottom: 0.85;
-}
-legend + .control-group {
- margin-top: 1.7;
- -webkit-margin-top-collapse: separate;
-}
-.form-horizontal .control-group {
- margin-bottom: 1.7;
- *zoom: 1;
-}
-.form-horizontal .control-group:before,
-.form-horizontal .control-group:after {
- display: table;
- content: "";
- line-height: 0;
-}
-.form-horizontal .control-group:after {
- clear: both;
-}
-.form-horizontal .control-label {
- float: left;
- width: 160px;
- padding-top: 5px;
- text-align: right;
-}
-.form-horizontal .controls {
- *display: inline-block;
- *padding-left: 20px;
- margin-left: 180px;
- *margin-left: 0;
-}
-.form-horizontal .controls:first-child {
- *padding-left: 180px;
-}
-.form-horizontal .help-block {
- margin-bottom: 0;
-}
-.form-horizontal input + .help-block,
-.form-horizontal select + .help-block,
-.form-horizontal textarea + .help-block,
-.form-horizontal .uneditable-input + .help-block,
-.form-horizontal .input-prepend + .help-block,
-.form-horizontal .input-append + .help-block {
- margin-top: 0.85;
-}
-.form-horizontal .form-actions {
- padding-left: 180px;
-}
-table {
- max-width: 100%;
- background-color: transparent;
- border-collapse: collapse;
- border-spacing: 0;
-}
-.table {
- width: 100%;
- margin-bottom: 1.7;
-}
-.table th,
-.table td {
- padding: 8px;
- line-height: 1.7;
- text-align: left;
- vertical-align: top;
- border-top: 1px solid #dddddd;
-}
-.table th {
- font-weight: bold;
-}
-.table thead th {
- vertical-align: bottom;
-}
-.table caption + thead tr:first-child th,
-.table caption + thead tr:first-child td,
-.table colgroup + thead tr:first-child th,
-.table colgroup + thead tr:first-child td,
-.table thead:first-child tr:first-child th,
-.table thead:first-child tr:first-child td {
- border-top: 0;
-}
-.table tbody + tbody {
- border-top: 2px solid #dddddd;
-}
-.table .table {
- background-color: #f2f2f2;
-}
-.table-condensed th,
-.table-condensed td {
- padding: 4px 5px;
-}
-.table-bordered {
- border: 1px solid #dddddd;
- border-collapse: separate;
- *border-collapse: collapse;
- border-left: 0;
-}
-.table-bordered th,
-.table-bordered td {
- border-left: 1px solid #dddddd;
-}
-.table-bordered caption + thead tr:first-child th,
-.table-bordered caption + tbody tr:first-child th,
-.table-bordered caption + tbody tr:first-child td,
-.table-bordered colgroup + thead tr:first-child th,
-.table-bordered colgroup + tbody tr:first-child th,
-.table-bordered colgroup + tbody tr:first-child td,
-.table-bordered thead:first-child tr:first-child th,
-.table-bordered tbody:first-child tr:first-child th,
-.table-bordered tbody:first-child tr:first-child td {
- border-top: 0;
-}
-.table-striped tbody > tr:nth-child(odd) > td,
-.table-striped tbody > tr:nth-child(odd) > th {
- background-color: #f9f9f9;
-}
-.table-hover tbody tr:hover > td,
-.table-hover tbody tr:hover > th {
- background-color: #f5f5f5;
-}
-table td[class*="span"],
-table th[class*="span"],
-.row-fluid table td[class*="span"],
-.row-fluid table th[class*="span"] {
- display: table-cell;
- float: none;
- margin-left: 0;
-}
-.table td.span1,
-.table th.span1 {
- float: none;
- width: 44px;
- margin-left: 0;
-}
-.table td.span2,
-.table th.span2 {
- float: none;
- width: 124px;
- margin-left: 0;
-}
-.table td.span3,
-.table th.span3 {
- float: none;
- width: 204px;
- margin-left: 0;
-}
-.table td.span4,
-.table th.span4 {
- float: none;
- width: 284px;
- margin-left: 0;
-}
-.table td.span5,
-.table th.span5 {
- float: none;
- width: 364px;
- margin-left: 0;
-}
-.table td.span6,
-.table th.span6 {
- float: none;
- width: 444px;
- margin-left: 0;
-}
-.table td.span7,
-.table th.span7 {
- float: none;
- width: 524px;
- margin-left: 0;
-}
-.table td.span8,
-.table th.span8 {
- float: none;
- width: 604px;
- margin-left: 0;
-}
-.table td.span9,
-.table th.span9 {
- float: none;
- width: 684px;
- margin-left: 0;
-}
-.table td.span10,
-.table th.span10 {
- float: none;
- width: 764px;
- margin-left: 0;
-}
-.table td.span11,
-.table th.span11 {
- float: none;
- width: 844px;
- margin-left: 0;
-}
-.table td.span12,
-.table th.span12 {
- float: none;
- width: 924px;
- margin-left: 0;
-}
-.table tbody tr.success > td {
- background-color: #dff0d8;
-}
-.table tbody tr.error > td {
- background-color: #f2dede;
-}
-.table tbody tr.warning > td {
- background-color: #fcf8e3;
-}
-.table tbody tr.info > td {
- background-color: #d9edf7;
-}
-.table-hover tbody tr.success:hover > td {
- background-color: #d0e9c6;
-}
-.table-hover tbody tr.error:hover > td {
- background-color: #ebcccc;
-}
-.table-hover tbody tr.warning:hover > td {
- background-color: #faf2cc;
-}
-.table-hover tbody tr.info:hover > td {
- background-color: #c4e3f3;
-}
-/*!
- * Font Awesome 3.1.0
- * the iconic font designed for Bootstrap
- * -------------------------------------------------------
- * The full suite of pictographic icons, examples, and documentation
- * can be found at: http://fontawesome.io
- *
- * License
- * -------------------------------------------------------
- * - The Font Awesome font is licensed under the SIL Open Font License v1.1 -
- * http://scripts.sil.org/OFL
- * - Font Awesome CSS, LESS, and SASS files are licensed under the MIT License -
- * http://opensource.org/licenses/mit-license.html
- * - Font Awesome documentation licensed under CC BY 3.0 License -
- * http://creativecommons.org/licenses/by/3.0/
- * - Attribution is no longer required in Font Awesome 3.0, but much appreciated:
- * "Font Awesome by Dave Gandy - http://fontawesome.io"
-
- * Contact
- * -------------------------------------------------------
- * Email: dave@fontawesome.io
- * Twitter: http://twitter.com/fortaweso_me
- * Work: Lead Product Designer @ http://kyruus.com
- */
-/* FONT PATH
- * -------------------------- */
-@font-face {
- font-family: 'FontAwesome';
- src: url('font/fontawesome-webfont.eot?v=3.1.0');
- src: url('font/fontawesome-webfont.eot?#iefix&v=3.1.0') format('embedded-opentype'), url('font/fontawesome-webfont.woff?v=3.1.0') format('woff'), url('font/fontawesome-webfont.ttf?v=3.1.0') format('truetype'), url('font/fontawesome-webfont.svg#fontawesomeregular?v=3.1.0') format('svg');
- font-weight: normal;
- font-style: normal;
-}
-/* FONT AWESOME CORE
- * -------------------------- */
-[class^="icon-"],
-[class*=" icon-"] {
- font-family: FontAwesome;
- font-weight: normal;
- font-style: normal;
- text-decoration: inherit;
- -webkit-font-smoothing: antialiased;
- *margin-right: .3em;
-}
-[class^="icon-"]:before,
-[class*=" icon-"]:before {
- text-decoration: inherit;
- display: inline-block;
- speak: none;
-}
-/* makes the font 33% larger relative to the icon container */
-.icon-large:before {
- vertical-align: -10%;
- font-size: 1.3333333333333333em;
-}
-/* makes sure icons active on rollover in links */
-a [class^="icon-"],
-a [class*=" icon-"],
-a [class^="icon-"]:before,
-a [class*=" icon-"]:before {
- display: inline;
-}
-/* increased font size for icon-large */
-[class^="icon-"].icon-fixed-width,
-[class*=" icon-"].icon-fixed-width {
- display: inline-block;
- width: 1.2857142857142858em;
- text-align: center;
-}
-[class^="icon-"].icon-fixed-width.icon-large,
-[class*=" icon-"].icon-fixed-width.icon-large {
- width: 1.5714285714285714em;
-}
-ul.icons-ul {
- list-style-type: none;
- text-indent: -0.7142857142857143em;
- margin-left: 2.142857142857143em;
-}
-ul.icons-ul > li .icon-li {
- width: 0.7142857142857143em;
- display: inline-block;
- text-align: center;
-}
-[class^="icon-"].hide,
-[class*=" icon-"].hide {
- display: none;
-}
-.icon-muted {
- color: #eeeeee;
-}
-.icon-light {
- color: #ffffff;
-}
-.icon-dark {
- color: #333333;
-}
-.icon-border {
- border: solid 1px #eeeeee;
- padding: .2em .25em .15em;
- -webkit-border-radius: 3px;
- -moz-border-radius: 3px;
- border-radius: 3px;
-}
-.icon-2x {
- font-size: 2em;
-}
-.icon-2x.icon-border {
- border-width: 2px;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
-}
-.icon-3x {
- font-size: 3em;
-}
-.icon-3x.icon-border {
- border-width: 3px;
- -webkit-border-radius: 5px;
- -moz-border-radius: 5px;
- border-radius: 5px;
-}
-.icon-4x {
- font-size: 4em;
-}
-.icon-4x.icon-border {
- border-width: 4px;
- -webkit-border-radius: 6px;
- -moz-border-radius: 6px;
- border-radius: 6px;
-}
-.icon-5x {
- font-size: 5em;
-}
-.icon-5x.icon-border {
- border-width: 5px;
- -webkit-border-radius: 7px;
- -moz-border-radius: 7px;
- border-radius: 7px;
-}
-.pull-right {
- float: right;
-}
-.pull-left {
- float: left;
-}
-[class^="icon-"].pull-left,
-[class*=" icon-"].pull-left {
- margin-right: .3em;
-}
-[class^="icon-"].pull-right,
-[class*=" icon-"].pull-right {
- margin-left: .3em;
-}
-/* BOOTSTRAP SPECIFIC CLASSES
- * -------------------------- */
-/* Bootstrap 2.0 sprites.less reset */
-[class^="icon-"],
-[class*=" icon-"] {
- display: inline;
- width: auto;
- height: auto;
- line-height: normal;
- vertical-align: baseline;
- background-image: none;
- background-position: 0% 0%;
- background-repeat: repeat;
- margin-top: 0;
-}
-/* more sprites.less reset */
-.icon-white,
-.nav-pills > .active > a > [class^="icon-"],
-.nav-pills > .active > a > [class*=" icon-"],
-.nav-list > .active > a > [class^="icon-"],
-.nav-list > .active > a > [class*=" icon-"],
-.navbar-inverse .nav > .active > a > [class^="icon-"],
-.navbar-inverse .nav > .active > a > [class*=" icon-"],
-.dropdown-menu > li > a:hover > [class^="icon-"],
-.dropdown-menu > li > a:hover > [class*=" icon-"],
-.dropdown-menu > .active > a > [class^="icon-"],
-.dropdown-menu > .active > a > [class*=" icon-"],
-.dropdown-submenu:hover > a > [class^="icon-"],
-.dropdown-submenu:hover > a > [class*=" icon-"] {
- background-image: none;
-}
-/* keeps Bootstrap styles with and without icons the same */
-.btn [class^="icon-"].icon-large,
-.nav [class^="icon-"].icon-large,
-.btn [class*=" icon-"].icon-large,
-.nav [class*=" icon-"].icon-large {
- line-height: .9em;
-}
-.btn [class^="icon-"].icon-spin,
-.nav [class^="icon-"].icon-spin,
-.btn [class*=" icon-"].icon-spin,
-.nav [class*=" icon-"].icon-spin {
- display: inline-block;
-}
-.nav-tabs [class^="icon-"],
-.nav-pills [class^="icon-"],
-.nav-tabs [class*=" icon-"],
-.nav-pills [class*=" icon-"],
-.nav-tabs [class^="icon-"].icon-large,
-.nav-pills [class^="icon-"].icon-large,
-.nav-tabs [class*=" icon-"].icon-large,
-.nav-pills [class*=" icon-"].icon-large {
- line-height: .9em;
-}
-.btn [class^="icon-"].pull-left.icon-2x,
-.btn [class*=" icon-"].pull-left.icon-2x,
-.btn [class^="icon-"].pull-right.icon-2x,
-.btn [class*=" icon-"].pull-right.icon-2x {
- margin-top: .18em;
-}
-.btn [class^="icon-"].icon-spin.icon-large,
-.btn [class*=" icon-"].icon-spin.icon-large {
- line-height: .8em;
-}
-.btn.btn-small [class^="icon-"].pull-left.icon-2x,
-.btn.btn-small [class*=" icon-"].pull-left.icon-2x,
-.btn.btn-small [class^="icon-"].pull-right.icon-2x,
-.btn.btn-small [class*=" icon-"].pull-right.icon-2x {
- margin-top: .25em;
-}
-.btn.btn-large [class^="icon-"],
-.btn.btn-large [class*=" icon-"] {
- margin-top: 0;
-}
-.btn.btn-large [class^="icon-"].pull-left.icon-2x,
-.btn.btn-large [class*=" icon-"].pull-left.icon-2x,
-.btn.btn-large [class^="icon-"].pull-right.icon-2x,
-.btn.btn-large [class*=" icon-"].pull-right.icon-2x {
- margin-top: .05em;
-}
-.btn.btn-large [class^="icon-"].pull-left.icon-2x,
-.btn.btn-large [class*=" icon-"].pull-left.icon-2x {
- margin-right: .2em;
-}
-.btn.btn-large [class^="icon-"].pull-right.icon-2x,
-.btn.btn-large [class*=" icon-"].pull-right.icon-2x {
- margin-left: .2em;
-}
-/* EXTRAS
- * -------------------------- */
-/* Stacked and layered icon */
-.icon-stack {
- position: relative;
- display: inline-block;
- width: 2em;
- height: 2em;
- line-height: 2em;
- vertical-align: -35%;
-}
-.icon-stack [class^="icon-"],
-.icon-stack [class*=" icon-"] {
- display: block;
- text-align: center;
- position: absolute;
- width: 100%;
- height: 100%;
- font-size: 1em;
- line-height: inherit;
- *line-height: 2em;
-}
-.icon-stack .icon-stack-base {
- font-size: 2em;
- *line-height: 1em;
-}
-/* Animated rotating icon */
-.icon-spin {
- display: inline-block;
- -moz-animation: spin 2s infinite linear;
- -o-animation: spin 2s infinite linear;
- -webkit-animation: spin 2s infinite linear;
- animation: spin 2s infinite linear;
-}
-@-moz-keyframes spin {
- 0% {
- -moz-transform: rotate(0deg);
- }
- 100% {
- -moz-transform: rotate(359deg);
- }
-}
-@-webkit-keyframes spin {
- 0% {
- -webkit-transform: rotate(0deg);
- }
- 100% {
- -webkit-transform: rotate(359deg);
- }
-}
-@-o-keyframes spin {
- 0% {
- -o-transform: rotate(0deg);
- }
- 100% {
- -o-transform: rotate(359deg);
- }
-}
-@-ms-keyframes spin {
- 0% {
- -ms-transform: rotate(0deg);
- }
- 100% {
- -ms-transform: rotate(359deg);
- }
-}
-@keyframes spin {
- 0% {
- transform: rotate(0deg);
- }
- 100% {
- transform: rotate(359deg);
- }
-}
-/* Icon rotations and mirroring */
-.icon-rotate-90:before {
- -webkit-transform: rotate(90deg);
- -moz-transform: rotate(90deg);
- -ms-transform: rotate(90deg);
- -o-transform: rotate(90deg);
- transform: rotate(90deg);
- filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);
-}
-.icon-rotate-180:before {
- -webkit-transform: rotate(180deg);
- -moz-transform: rotate(180deg);
- -ms-transform: rotate(180deg);
- -o-transform: rotate(180deg);
- transform: rotate(180deg);
- filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);
-}
-.icon-rotate-270:before {
- -webkit-transform: rotate(270deg);
- -moz-transform: rotate(270deg);
- -ms-transform: rotate(270deg);
- -o-transform: rotate(270deg);
- transform: rotate(270deg);
- filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);
-}
-.icon-flip-horizontal:before {
- -webkit-transform: scale(-1, 1);
- -moz-transform: scale(-1, 1);
- -ms-transform: scale(-1, 1);
- -o-transform: scale(-1, 1);
- transform: scale(-1, 1);
-}
-.icon-flip-vertical:before {
- -webkit-transform: scale(1, -1);
- -moz-transform: scale(1, -1);
- -ms-transform: scale(1, -1);
- -o-transform: scale(1, -1);
- transform: scale(1, -1);
-}
-/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
- readers do not read off random characters that represent icons */
-.icon-glass:before {
- content: "\f000";
-}
-.icon-music:before {
- content: "\f001";
-}
-.icon-search:before {
- content: "\f002";
-}
-.icon-envelope:before {
- content: "\f003";
-}
-.icon-heart:before {
- content: "\f004";
-}
-.icon-star:before {
- content: "\f005";
-}
-.icon-star-empty:before {
- content: "\f006";
-}
-.icon-user:before {
- content: "\f007";
-}
-.icon-film:before {
- content: "\f008";
-}
-.icon-th-large:before {
- content: "\f009";
-}
-.icon-th:before {
- content: "\f00a";
-}
-.icon-th-list:before {
- content: "\f00b";
-}
-.icon-ok:before {
- content: "\f00c";
-}
-.icon-remove:before {
- content: "\f00d";
-}
-.icon-zoom-in:before {
- content: "\f00e";
-}
-.icon-zoom-out:before {
- content: "\f010";
-}
-.icon-off:before {
- content: "\f011";
-}
-.icon-signal:before {
- content: "\f012";
-}
-.icon-cog:before {
- content: "\f013";
-}
-.icon-trash:before {
- content: "\f014";
-}
-.icon-home:before {
- content: "\f015";
-}
-.icon-file:before {
- content: "\f016";
-}
-.icon-time:before {
- content: "\f017";
-}
-.icon-road:before {
- content: "\f018";
-}
-.icon-download-alt:before {
- content: "\f019";
-}
-.icon-download:before {
- content: "\f01a";
-}
-.icon-upload:before {
- content: "\f01b";
-}
-.icon-inbox:before {
- content: "\f01c";
-}
-.icon-play-circle:before {
- content: "\f01d";
-}
-.icon-repeat:before,
-.icon-rotate-right:before {
- content: "\f01e";
-}
-/* F020 doesn't work in Safari. all shifted one down */
-.icon-refresh:before {
- content: "\f021";
-}
-.icon-list-alt:before {
- content: "\f022";
-}
-.icon-lock:before {
- content: "\f023";
-}
-.icon-flag:before {
- content: "\f024";
-}
-.icon-headphones:before {
- content: "\f025";
-}
-.icon-volume-off:before {
- content: "\f026";
-}
-.icon-volume-down:before {
- content: "\f027";
-}
-.icon-volume-up:before {
- content: "\f028";
-}
-.icon-qrcode:before {
- content: "\f029";
-}
-.icon-barcode:before {
- content: "\f02a";
-}
-.icon-tag:before {
- content: "\f02b";
-}
-.icon-tags:before {
- content: "\f02c";
-}
-.icon-book:before {
- content: "\f02d";
-}
-.icon-bookmark:before {
- content: "\f02e";
-}
-.icon-print:before {
- content: "\f02f";
-}
-.icon-camera:before {
- content: "\f030";
-}
-.icon-font:before {
- content: "\f031";
-}
-.icon-bold:before {
- content: "\f032";
-}
-.icon-italic:before {
- content: "\f033";
-}
-.icon-text-height:before {
- content: "\f034";
-}
-.icon-text-width:before {
- content: "\f035";
-}
-.icon-align-left:before {
- content: "\f036";
-}
-.icon-align-center:before {
- content: "\f037";
-}
-.icon-align-right:before {
- content: "\f038";
-}
-.icon-align-justify:before {
- content: "\f039";
-}
-.icon-list:before {
- content: "\f03a";
-}
-.icon-indent-left:before {
- content: "\f03b";
-}
-.icon-indent-right:before {
- content: "\f03c";
-}
-.icon-facetime-video:before {
- content: "\f03d";
-}
-.icon-picture:before {
- content: "\f03e";
-}
-.icon-pencil:before {
- content: "\f040";
-}
-.icon-map-marker:before {
- content: "\f041";
-}
-.icon-adjust:before {
- content: "\f042";
-}
-.icon-tint:before {
- content: "\f043";
-}
-.icon-edit:before {
- content: "\f044";
-}
-.icon-share:before {
- content: "\f045";
-}
-.icon-check:before {
- content: "\f046";
-}
-.icon-move:before {
- content: "\f047";
-}
-.icon-step-backward:before {
- content: "\f048";
-}
-.icon-fast-backward:before {
- content: "\f049";
-}
-.icon-backward:before {
- content: "\f04a";
-}
-.icon-play:before {
- content: "\f04b";
-}
-.icon-pause:before {
- content: "\f04c";
-}
-.icon-stop:before {
- content: "\f04d";
-}
-.icon-forward:before {
- content: "\f04e";
-}
-.icon-fast-forward:before {
- content: "\f050";
-}
-.icon-step-forward:before {
- content: "\f051";
-}
-.icon-eject:before {
- content: "\f052";
-}
-.icon-chevron-left:before {
- content: "\f053";
-}
-.icon-chevron-right:before {
- content: "\f054";
-}
-.icon-plus-sign:before {
- content: "\f055";
-}
-.icon-minus-sign:before {
- content: "\f056";
-}
-.icon-remove-sign:before {
- content: "\f057";
-}
-.icon-ok-sign:before {
- content: "\f058";
-}
-.icon-question-sign:before {
- content: "\f059";
-}
-.icon-info-sign:before {
- content: "\f05a";
-}
-.icon-screenshot:before {
- content: "\f05b";
-}
-.icon-remove-circle:before {
- content: "\f05c";
-}
-.icon-ok-circle:before {
- content: "\f05d";
-}
-.icon-ban-circle:before {
- content: "\f05e";
-}
-.icon-arrow-left:before {
- content: "\f060";
-}
-.icon-arrow-right:before {
- content: "\f061";
-}
-.icon-arrow-up:before {
- content: "\f062";
-}
-.icon-arrow-down:before {
- content: "\f063";
-}
-.icon-share-alt:before,
-.icon-mail-forward:before {
- content: "\f064";
-}
-.icon-resize-full:before {
- content: "\f065";
-}
-.icon-resize-small:before {
- content: "\f066";
-}
-.icon-plus:before {
- content: "\f067";
-}
-.icon-minus:before {
- content: "\f068";
-}
-.icon-asterisk:before {
- content: "\f069";
-}
-.icon-exclamation-sign:before {
- content: "\f06a";
-}
-.icon-gift:before {
- content: "\f06b";
-}
-.icon-leaf:before {
- content: "\f06c";
-}
-.icon-fire:before {
- content: "\f06d";
-}
-.icon-eye-open:before {
- content: "\f06e";
-}
-.icon-eye-close:before {
- content: "\f070";
-}
-.icon-warning-sign:before {
- content: "\f071";
-}
-.icon-plane:before {
- content: "\f072";
-}
-.icon-calendar:before {
- content: "\f073";
-}
-.icon-random:before {
- content: "\f074";
-}
-.icon-comment:before {
- content: "\f075";
-}
-.icon-magnet:before {
- content: "\f076";
-}
-.icon-chevron-up:before {
- content: "\f077";
-}
-.icon-chevron-down:before {
- content: "\f078";
-}
-.icon-retweet:before {
- content: "\f079";
-}
-.icon-shopping-cart:before {
- content: "\f07a";
-}
-.icon-folder-close:before {
- content: "\f07b";
-}
-.icon-folder-open:before {
- content: "\f07c";
-}
-.icon-resize-vertical:before {
- content: "\f07d";
-}
-.icon-resize-horizontal:before {
- content: "\f07e";
-}
-.icon-bar-chart:before {
- content: "\f080";
-}
-.icon-twitter-sign:before {
- content: "\f081";
-}
-.icon-facebook-sign:before {
- content: "\f082";
-}
-.icon-camera-retro:before {
- content: "\f083";
-}
-.icon-key:before {
- content: "\f084";
-}
-.icon-cogs:before {
- content: "\f085";
-}
-.icon-comments:before {
- content: "\f086";
-}
-.icon-thumbs-up:before {
- content: "\f087";
-}
-.icon-thumbs-down:before {
- content: "\f088";
-}
-.icon-star-half:before {
- content: "\f089";
-}
-.icon-heart-empty:before {
- content: "\f08a";
-}
-.icon-signout:before {
- content: "\f08b";
-}
-.icon-linkedin-sign:before {
- content: "\f08c";
-}
-.icon-pushpin:before {
- content: "\f08d";
-}
-.icon-external-link:before {
- content: "\f08e";
-}
-.icon-signin:before {
- content: "\f090";
-}
-.icon-trophy:before {
- content: "\f091";
-}
-.icon-github-sign:before {
- content: "\f092";
-}
-.icon-upload-alt:before {
- content: "\f093";
-}
-.icon-lemon:before {
- content: "\f094";
-}
-.icon-phone:before {
- content: "\f095";
-}
-.icon-check-empty:before {
- content: "\f096";
-}
-.icon-bookmark-empty:before {
- content: "\f097";
-}
-.icon-phone-sign:before {
- content: "\f098";
-}
-.icon-twitter:before {
- content: "\f099";
-}
-.icon-facebook:before {
- content: "\f09a";
-}
-.icon-github:before {
- content: "\f09b";
-}
-.icon-unlock:before {
- content: "\f09c";
-}
-.icon-credit-card:before {
- content: "\f09d";
-}
-.icon-rss:before {
- content: "\f09e";
-}
-.icon-hdd:before {
- content: "\f0a0";
-}
-.icon-bullhorn:before {
- content: "\f0a1";
-}
-.icon-bell:before {
- content: "\f0a2";
-}
-.icon-certificate:before {
- content: "\f0a3";
-}
-.icon-hand-right:before {
- content: "\f0a4";
-}
-.icon-hand-left:before {
- content: "\f0a5";
-}
-.icon-hand-up:before {
- content: "\f0a6";
-}
-.icon-hand-down:before {
- content: "\f0a7";
-}
-.icon-circle-arrow-left:before {
- content: "\f0a8";
-}
-.icon-circle-arrow-right:before {
- content: "\f0a9";
-}
-.icon-circle-arrow-up:before {
- content: "\f0aa";
-}
-.icon-circle-arrow-down:before {
- content: "\f0ab";
-}
-.icon-globe:before {
- content: "\f0ac";
-}
-.icon-wrench:before {
- content: "\f0ad";
-}
-.icon-tasks:before {
- content: "\f0ae";
-}
-.icon-filter:before {
- content: "\f0b0";
-}
-.icon-briefcase:before {
- content: "\f0b1";
-}
-.icon-fullscreen:before {
- content: "\f0b2";
-}
-.icon-group:before {
- content: "\f0c0";
-}
-.icon-link:before {
- content: "\f0c1";
-}
-.icon-cloud:before {
- content: "\f0c2";
-}
-.icon-beaker:before {
- content: "\f0c3";
-}
-.icon-cut:before {
- content: "\f0c4";
-}
-.icon-copy:before {
- content: "\f0c5";
-}
-.icon-paper-clip:before {
- content: "\f0c6";
-}
-.icon-save:before {
- content: "\f0c7";
-}
-.icon-sign-blank:before {
- content: "\f0c8";
-}
-.icon-reorder:before {
- content: "\f0c9";
-}
-.icon-list-ul:before {
- content: "\f0ca";
-}
-.icon-list-ol:before {
- content: "\f0cb";
-}
-.icon-strikethrough:before {
- content: "\f0cc";
-}
-.icon-underline:before {
- content: "\f0cd";
-}
-.icon-table:before {
- content: "\f0ce";
-}
-.icon-magic:before {
- content: "\f0d0";
-}
-.icon-truck:before {
- content: "\f0d1";
-}
-.icon-pinterest:before {
- content: "\f0d2";
-}
-.icon-pinterest-sign:before {
- content: "\f0d3";
-}
-.icon-google-plus-sign:before {
- content: "\f0d4";
-}
-.icon-google-plus:before {
- content: "\f0d5";
-}
-.icon-money:before {
- content: "\f0d6";
-}
-.icon-caret-down:before {
- content: "\f0d7";
-}
-.icon-caret-up:before {
- content: "\f0d8";
-}
-.icon-caret-left:before {
- content: "\f0d9";
-}
-.icon-caret-right:before {
- content: "\f0da";
-}
-.icon-columns:before {
- content: "\f0db";
-}
-.icon-sort:before {
- content: "\f0dc";
-}
-.icon-sort-down:before {
- content: "\f0dd";
-}
-.icon-sort-up:before {
- content: "\f0de";
-}
-.icon-envelope-alt:before {
- content: "\f0e0";
-}
-.icon-linkedin:before {
- content: "\f0e1";
-}
-.icon-undo:before,
-.icon-rotate-left:before {
- content: "\f0e2";
-}
-.icon-legal:before {
- content: "\f0e3";
-}
-.icon-dashboard:before {
- content: "\f0e4";
-}
-.icon-comment-alt:before {
- content: "\f0e5";
-}
-.icon-comments-alt:before {
- content: "\f0e6";
-}
-.icon-bolt:before {
- content: "\f0e7";
-}
-.icon-sitemap:before {
- content: "\f0e8";
-}
-.icon-umbrella:before {
- content: "\f0e9";
-}
-.icon-paste:before {
- content: "\f0ea";
-}
-.icon-lightbulb:before {
- content: "\f0eb";
-}
-.icon-exchange:before {
- content: "\f0ec";
-}
-.icon-cloud-download:before {
- content: "\f0ed";
-}
-.icon-cloud-upload:before {
- content: "\f0ee";
-}
-.icon-user-md:before {
- content: "\f0f0";
-}
-.icon-stethoscope:before {
- content: "\f0f1";
-}
-.icon-suitcase:before {
- content: "\f0f2";
-}
-.icon-bell-alt:before {
- content: "\f0f3";
-}
-.icon-coffee:before {
- content: "\f0f4";
-}
-.icon-food:before {
- content: "\f0f5";
-}
-.icon-file-alt:before {
- content: "\f0f6";
-}
-.icon-building:before {
- content: "\f0f7";
-}
-.icon-hospital:before {
- content: "\f0f8";
-}
-.icon-ambulance:before {
- content: "\f0f9";
-}
-.icon-medkit:before {
- content: "\f0fa";
-}
-.icon-fighter-jet:before {
- content: "\f0fb";
-}
-.icon-beer:before {
- content: "\f0fc";
-}
-.icon-h-sign:before {
- content: "\f0fd";
-}
-.icon-plus-sign-alt:before {
- content: "\f0fe";
-}
-.icon-double-angle-left:before {
- content: "\f100";
-}
-.icon-double-angle-right:before {
- content: "\f101";
-}
-.icon-double-angle-up:before {
- content: "\f102";
-}
-.icon-double-angle-down:before {
- content: "\f103";
-}
-.icon-angle-left:before {
- content: "\f104";
-}
-.icon-angle-right:before {
- content: "\f105";
-}
-.icon-angle-up:before {
- content: "\f106";
-}
-.icon-angle-down:before {
- content: "\f107";
-}
-.icon-desktop:before {
- content: "\f108";
-}
-.icon-laptop:before {
- content: "\f109";
-}
-.icon-tablet:before {
- content: "\f10a";
-}
-.icon-mobile-phone:before {
- content: "\f10b";
-}
-.icon-circle-blank:before {
- content: "\f10c";
-}
-.icon-quote-left:before {
- content: "\f10d";
-}
-.icon-quote-right:before {
- content: "\f10e";
-}
-.icon-spinner:before {
- content: "\f110";
-}
-.icon-circle:before {
- content: "\f111";
-}
-.icon-reply:before,
-.icon-mail-reply:before {
- content: "\f112";
-}
-.icon-folder-close-alt:before {
- content: "\f114";
-}
-.icon-folder-open-alt:before {
- content: "\f115";
-}
-.icon-expand-alt:before {
- content: "\f116";
-}
-.icon-collapse-alt:before {
- content: "\f117";
-}
-.icon-smile:before {
- content: "\f118";
-}
-.icon-frown:before {
- content: "\f119";
-}
-.icon-meh:before {
- content: "\f11a";
-}
-.icon-gamepad:before {
- content: "\f11b";
-}
-.icon-keyboard:before {
- content: "\f11c";
-}
-.icon-flag-alt:before {
- content: "\f11d";
-}
-.icon-flag-checkered:before {
- content: "\f11e";
-}
-.icon-terminal:before {
- content: "\f120";
-}
-.icon-code:before {
- content: "\f121";
-}
-.icon-reply-all:before {
- content: "\f122";
-}
-.icon-mail-reply-all:before {
- content: "\f122";
-}
-.icon-star-half-full:before,
-.icon-star-half-empty:before {
- content: "\f123";
-}
-.icon-location-arrow:before {
- content: "\f124";
-}
-.icon-crop:before {
- content: "\f125";
-}
-.icon-code-fork:before {
- content: "\f126";
-}
-.icon-unlink:before {
- content: "\f127";
-}
-.icon-question:before {
- content: "\f128";
-}
-.icon-info:before {
- content: "\f129";
-}
-.icon-exclamation:before {
- content: "\f12a";
-}
-.icon-superscript:before {
- content: "\f12b";
-}
-.icon-subscript:before {
- content: "\f12c";
-}
-.icon-eraser:before {
- content: "\f12d";
-}
-.icon-puzzle-piece:before {
- content: "\f12e";
-}
-.icon-microphone:before {
- content: "\f130";
-}
-.icon-microphone-off:before {
- content: "\f131";
-}
-.icon-shield:before {
- content: "\f132";
-}
-.icon-calendar-empty:before {
- content: "\f133";
-}
-.icon-fire-extinguisher:before {
- content: "\f134";
-}
-.icon-rocket:before {
- content: "\f135";
-}
-.icon-maxcdn:before {
- content: "\f136";
-}
-.icon-chevron-sign-left:before {
- content: "\f137";
-}
-.icon-chevron-sign-right:before {
- content: "\f138";
-}
-.icon-chevron-sign-up:before {
- content: "\f139";
-}
-.icon-chevron-sign-down:before {
- content: "\f13a";
-}
-.icon-html5:before {
- content: "\f13b";
-}
-.icon-css3:before {
- content: "\f13c";
-}
-.icon-anchor:before {
- content: "\f13d";
-}
-.icon-unlock-alt:before {
- content: "\f13e";
-}
-.icon-bullseye:before {
- content: "\f140";
-}
-.icon-ellipsis-horizontal:before {
- content: "\f141";
-}
-.icon-ellipsis-vertical:before {
- content: "\f142";
-}
-.icon-rss-sign:before {
- content: "\f143";
-}
-.icon-play-sign:before {
- content: "\f144";
-}
-.icon-ticket:before {
- content: "\f145";
-}
-.icon-minus-sign-alt:before {
- content: "\f146";
-}
-.icon-check-minus:before {
- content: "\f147";
-}
-.icon-level-up:before {
- content: "\f148";
-}
-.icon-level-down:before {
- content: "\f149";
-}
-.icon-check-sign:before {
- content: "\f14a";
-}
-.icon-edit-sign:before {
- content: "\f14b";
-}
-.icon-external-link-sign:before {
- content: "\f14c";
-}
-.icon-share-sign:before {
- content: "\f14d";
-}
-/*!
- * Font Awesome 3.1.0
- * the iconic font designed for Bootstrap
- * -------------------------------------------------------
- * The full suite of pictographic icons, examples, and documentation
- * can be found at: http://fontawesome.io
- *
- * License
- * -------------------------------------------------------
- * - The Font Awesome font is licensed under the SIL Open Font License v1.1 -
- * http://scripts.sil.org/OFL
- * - Font Awesome CSS, LESS, and SASS files are licensed under the MIT License -
- * http://opensource.org/licenses/mit-license.html
- * - Font Awesome documentation licensed under CC BY 3.0 License -
- * http://creativecommons.org/licenses/by/3.0/
- * - Attribution is no longer required in Font Awesome 3.0, but much appreciated:
- * "Font Awesome by Dave Gandy - http://fontawesome.io"
-
- * Contact
- * -------------------------------------------------------
- * Email: dave@fontawesome.io
- * Twitter: http://twitter.com/fortaweso_me
- * Work: Lead Product Designer @ http://kyruus.com
- */
-.icon-large {
- font-size: 1.3333333333333333em;
- margin-top: -4px;
- padding-top: 3px;
- margin-bottom: -4px;
- padding-bottom: 3px;
- vertical-align: middle;
-}
-.nav [class^="icon-"],
-.nav [class*=" icon-"] {
- vertical-align: inherit;
- margin-top: -4px;
- padding-top: 3px;
- margin-bottom: -4px;
- padding-bottom: 3px;
-}
-.nav [class^="icon-"].icon-large,
-.nav [class*=" icon-"].icon-large {
- vertical-align: -25%;
-}
-.nav-pills [class^="icon-"].icon-large,
-.nav-tabs [class^="icon-"].icon-large,
-.nav-pills [class*=" icon-"].icon-large,
-.nav-tabs [class*=" icon-"].icon-large {
- line-height: .75em;
- margin-top: -7px;
- padding-top: 5px;
- margin-bottom: -5px;
- padding-bottom: 4px;
-}
-ul.icons-ul {
- text-indent: -1em;
- margin-left: 2.142857142857143em;
-}
-ul.icons-ul > li .icon-li {
- width: 1em;
- margin-right: 0;
-}
-.btn [class^="icon-"].pull-left,
-.btn [class*=" icon-"].pull-left,
-.btn [class^="icon-"].pull-right,
-.btn [class*=" icon-"].pull-right {
- vertical-align: inherit;
-}
-.btn [class^="icon-"].icon-large,
-.btn [class*=" icon-"].icon-large {
- margin-top: -0.5em;
-}
-a [class^="icon-"],
-a [class*=" icon-"] {
- cursor: pointer;
-}
-.icon-glass {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf000;');
-}
-.icon-music {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf001;');
-}
-.icon-search {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf002;');
-}
-.icon-envelope {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf003;');
-}
-.icon-heart {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf004;');
-}
-.icon-star {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf005;');
-}
-.icon-star-empty {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf006;');
-}
-.icon-user {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf007;');
-}
-.icon-film {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf008;');
-}
-.icon-th-large {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf009;');
-}
-.icon-th {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf00a;');
-}
-.icon-th-list {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf00b;');
-}
-.icon-ok {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf00c;');
-}
-.icon-remove {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf00d;');
-}
-.icon-zoom-in {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf00e;');
-}
-.icon-zoom-out {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf010;');
-}
-.icon-off {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf011;');
-}
-.icon-signal {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf012;');
-}
-.icon-cog {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf013;');
-}
-.icon-trash {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf014;');
-}
-.icon-home {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf015;');
-}
-.icon-file {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf016;');
-}
-.icon-time {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf017;');
-}
-.icon-road {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf018;');
-}
-.icon-download-alt {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf019;');
-}
-.icon-download {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf01a;');
-}
-.icon-upload {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf01b;');
-}
-.icon-inbox {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf01c;');
-}
-.icon-play-circle {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf01d;');
-}
-.icon-repeat {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf01e;');
-}
-.icon-refresh {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf021;');
-}
-.icon-list-alt {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf022;');
-}
-.icon-lock {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf023;');
-}
-.icon-flag {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf024;');
-}
-.icon-headphones {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf025;');
-}
-.icon-volume-off {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf026;');
-}
-.icon-volume-down {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf027;');
-}
-.icon-volume-up {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf028;');
-}
-.icon-qrcode {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf029;');
-}
-.icon-barcode {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf02a;');
-}
-.icon-tag {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf02b;');
-}
-.icon-tags {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf02c;');
-}
-.icon-book {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf02d;');
-}
-.icon-bookmark {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf02e;');
-}
-.icon-print {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf02f;');
-}
-.icon-camera {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf030;');
-}
-.icon-font {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf031;');
-}
-.icon-bold {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf032;');
-}
-.icon-italic {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf033;');
-}
-.icon-text-height {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf034;');
-}
-.icon-text-width {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf035;');
-}
-.icon-align-left {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf036;');
-}
-.icon-align-center {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf037;');
-}
-.icon-align-right {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf038;');
-}
-.icon-align-justify {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf039;');
-}
-.icon-list {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf03a;');
-}
-.icon-indent-left {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf03b;');
-}
-.icon-indent-right {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf03c;');
-}
-.icon-facetime-video {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf03d;');
-}
-.icon-picture {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf03e;');
-}
-.icon-pencil {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf040;');
-}
-.icon-map-marker {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf041;');
-}
-.icon-adjust {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf042;');
-}
-.icon-tint {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf043;');
-}
-.icon-edit {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf044;');
-}
-.icon-share {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf045;');
-}
-.icon-check {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf046;');
-}
-.icon-move {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf047;');
-}
-.icon-step-backward {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf048;');
-}
-.icon-fast-backward {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf049;');
-}
-.icon-backward {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf04a;');
-}
-.icon-play {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf04b;');
-}
-.icon-pause {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf04c;');
-}
-.icon-stop {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf04d;');
-}
-.icon-forward {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf04e;');
-}
-.icon-fast-forward {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf050;');
-}
-.icon-step-forward {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf051;');
-}
-.icon-eject {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf052;');
-}
-.icon-chevron-left {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf053;');
-}
-.icon-chevron-right {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf054;');
-}
-.icon-plus-sign {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf055;');
-}
-.icon-minus-sign {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf056;');
-}
-.icon-remove-sign {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf057;');
-}
-.icon-ok-sign {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf058;');
-}
-.icon-question-sign {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf059;');
-}
-.icon-info-sign {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf05a;');
-}
-.icon-screenshot {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf05b;');
-}
-.icon-remove-circle {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf05c;');
-}
-.icon-ok-circle {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf05d;');
-}
-.icon-ban-circle {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf05e;');
-}
-.icon-arrow-left {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf060;');
-}
-.icon-arrow-right {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf061;');
-}
-.icon-arrow-up {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf062;');
-}
-.icon-arrow-down {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf063;');
-}
-.icon-share-alt {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf064;');
-}
-.icon-resize-full {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf065;');
-}
-.icon-resize-small {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf066;');
-}
-.icon-plus {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf067;');
-}
-.icon-minus {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf068;');
-}
-.icon-asterisk {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf069;');
-}
-.icon-exclamation-sign {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf06a;');
-}
-.icon-gift {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf06b;');
-}
-.icon-leaf {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf06c;');
-}
-.icon-fire {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf06d;');
-}
-.icon-eye-open {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf06e;');
-}
-.icon-eye-close {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf070;');
-}
-.icon-warning-sign {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf071;');
-}
-.icon-plane {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf072;');
-}
-.icon-calendar {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf073;');
-}
-.icon-random {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf074;');
-}
-.icon-comment {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf075;');
-}
-.icon-magnet {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf076;');
-}
-.icon-chevron-up {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf077;');
-}
-.icon-chevron-down {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf078;');
-}
-.icon-retweet {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf079;');
-}
-.icon-shopping-cart {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf07a;');
-}
-.icon-folder-close {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf07b;');
-}
-.icon-folder-open {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf07c;');
-}
-.icon-resize-vertical {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf07d;');
-}
-.icon-resize-horizontal {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf07e;');
-}
-.icon-bar-chart {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf080;');
-}
-.icon-twitter-sign {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf081;');
-}
-.icon-facebook-sign {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf082;');
-}
-.icon-camera-retro {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf083;');
-}
-.icon-key {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf084;');
-}
-.icon-cogs {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf085;');
-}
-.icon-comments {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf086;');
-}
-.icon-thumbs-up {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf087;');
-}
-.icon-thumbs-down {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf088;');
-}
-.icon-star-half {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf089;');
-}
-.icon-heart-empty {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf08a;');
-}
-.icon-signout {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf08b;');
-}
-.icon-linkedin-sign {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf08c;');
-}
-.icon-pushpin {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf08d;');
-}
-.icon-external-link {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf08e;');
-}
-.icon-signin {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf090;');
-}
-.icon-trophy {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf091;');
-}
-.icon-github-sign {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf092;');
-}
-.icon-upload-alt {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf093;');
-}
-.icon-lemon {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf094;');
-}
-.icon-phone {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf095;');
-}
-.icon-check-empty {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf096;');
-}
-.icon-bookmark-empty {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf097;');
-}
-.icon-phone-sign {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf098;');
-}
-.icon-twitter {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf099;');
-}
-.icon-facebook {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf09a;');
-}
-.icon-github {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf09b;');
-}
-.icon-unlock {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf09c;');
-}
-.icon-credit-card {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf09d;');
-}
-.icon-rss {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf09e;');
-}
-.icon-hdd {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a0;');
-}
-.icon-bullhorn {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a1;');
-}
-.icon-bell {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a2;');
-}
-.icon-certificate {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a3;');
-}
-.icon-hand-right {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a4;');
-}
-.icon-hand-left {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a5;');
-}
-.icon-hand-up {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a6;');
-}
-.icon-hand-down {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a7;');
-}
-.icon-circle-arrow-left {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a8;');
-}
-.icon-circle-arrow-right {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a9;');
-}
-.icon-circle-arrow-up {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0aa;');
-}
-.icon-circle-arrow-down {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ab;');
-}
-.icon-globe {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ac;');
-}
-.icon-wrench {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ad;');
-}
-.icon-tasks {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ae;');
-}
-.icon-filter {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0b0;');
-}
-.icon-briefcase {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0b1;');
-}
-.icon-fullscreen {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0b2;');
-}
-.icon-group {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c0;');
-}
-.icon-link {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c1;');
-}
-.icon-cloud {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c2;');
-}
-.icon-beaker {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c3;');
-}
-.icon-cut {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c4;');
-}
-.icon-copy {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c5;');
-}
-.icon-paper-clip {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c6;');
-}
-.icon-save {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c7;');
-}
-.icon-sign-blank {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c8;');
-}
-.icon-reorder {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c9;');
-}
-.icon-list-ul {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ca;');
-}
-.icon-list-ol {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0cb;');
-}
-.icon-strikethrough {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0cc;');
-}
-.icon-underline {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0cd;');
-}
-.icon-table {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ce;');
-}
-.icon-magic {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d0;');
-}
-.icon-truck {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d1;');
-}
-.icon-pinterest {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d2;');
-}
-.icon-pinterest-sign {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d3;');
-}
-.icon-google-plus-sign {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d4;');
-}
-.icon-google-plus {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d5;');
-}
-.icon-money {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d6;');
-}
-.icon-caret-down {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d7;');
-}
-.icon-caret-up {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d8;');
-}
-.icon-caret-left {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d9;');
-}
-.icon-caret-right {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0da;');
-}
-.icon-columns {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0db;');
-}
-.icon-sort {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0dc;');
-}
-.icon-sort-down {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0dd;');
-}
-.icon-sort-up {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0de;');
-}
-.icon-envelope-alt {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e0;');
-}
-.icon-linkedin {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e1;');
-}
-.icon-undo {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e2;');
-}
-.icon-legal {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e3;');
-}
-.icon-dashboard {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e4;');
-}
-.icon-comment-alt {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e5;');
-}
-.icon-comments-alt {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e6;');
-}
-.icon-bolt {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e7;');
-}
-.icon-sitemap {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e8;');
-}
-.icon-umbrella {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e9;');
-}
-.icon-paste {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ea;');
-}
-.icon-lightbulb {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0eb;');
-}
-.icon-exchange {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ec;');
-}
-.icon-cloud-download {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ed;');
-}
-.icon-cloud-upload {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ee;');
-}
-.icon-user-md {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f0;');
-}
-.icon-stethoscope {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f1;');
-}
-.icon-suitcase {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f2;');
-}
-.icon-bell-alt {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f3;');
-}
-.icon-coffee {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f4;');
-}
-.icon-food {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f5;');
-}
-.icon-file-alt {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f6;');
-}
-.icon-building {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f7;');
-}
-.icon-hospital {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f8;');
-}
-.icon-ambulance {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f9;');
-}
-.icon-medkit {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0fa;');
-}
-.icon-fighter-jet {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0fb;');
-}
-.icon-beer {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0fc;');
-}
-.icon-h-sign {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0fd;');
-}
-.icon-plus-sign-alt {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0fe;');
-}
-.icon-double-angle-left {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf100;');
-}
-.icon-double-angle-right {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf101;');
-}
-.icon-double-angle-up {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf102;');
-}
-.icon-double-angle-down {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf103;');
-}
-.icon-angle-left {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf104;');
-}
-.icon-angle-right {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf105;');
-}
-.icon-angle-up {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf106;');
-}
-.icon-angle-down {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf107;');
-}
-.icon-desktop {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf108;');
-}
-.icon-laptop {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf109;');
-}
-.icon-tablet {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf10a;');
-}
-.icon-mobile-phone {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf10b;');
-}
-.icon-circle-blank {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf10c;');
-}
-.icon-quote-left {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf10d;');
-}
-.icon-quote-right {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf10e;');
-}
-.icon-spinner {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf110;');
-}
-.icon-circle {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf111;');
-}
-.icon-reply {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf112;');
-}
-.icon-folder-close-alt {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf114;');
-}
-.icon-folder-open-alt {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf115;');
-}
-.icon-expand-alt {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf116;');
-}
-.icon-collapse-alt {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf117;');
-}
-.icon-smile {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf118;');
-}
-.icon-frown {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf119;');
-}
-.icon-meh {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf11a;');
-}
-.icon-gamepad {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf11b;');
-}
-.icon-keyboard {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf11c;');
-}
-.icon-flag-alt {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf11d;');
-}
-.icon-flag-checkered {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf11e;');
-}
-.icon-terminal {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf120;');
-}
-.icon-code {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf121;');
-}
-.icon-reply-all {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf122;');
-}
-.icon-mail-reply-all {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf122;');
-}
-.icon-star-half-full,
-.icon-star-half-empty {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf123;');
-}
-.icon-location-arrow {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf124;');
-}
-.icon-crop {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf125;');
-}
-.icon-code-fork {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf126;');
-}
-.icon-unlink {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf127;');
-}
-.icon-question {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf128;');
-}
-.icon-info {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf129;');
-}
-.icon-exclamation {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf12a;');
-}
-.icon-superscript {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf12b;');
-}
-.icon-subscript {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf12c;');
-}
-.icon-eraser {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf12d;');
-}
-.icon-puzzle-piece {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf12e;');
-}
-.icon-microphone {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf130;');
-}
-.icon-microphone-off {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf131;');
-}
-.icon-shield {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf132;');
-}
-.icon-calendar-empty {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf133;');
-}
-.icon-fire-extinguisher {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf134;');
-}
-.icon-rocket {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf135;');
-}
-.icon-maxcdn {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf136;');
-}
-.icon-chevron-sign-left {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf137;');
-}
-.icon-chevron-sign-right {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf138;');
-}
-.icon-chevron-sign-up {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf139;');
-}
-.icon-chevron-sign-down {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf13a;');
-}
-.icon-html5 {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf13b;');
-}
-.icon-css3 {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf13c;');
-}
-.icon-anchor {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf13d;');
-}
-.icon-unlock-alt {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf13e;');
-}
-.icon-bullseye {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf140;');
-}
-.icon-ellipsis-horizontal {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf141;');
-}
-.icon-ellipsis-vertical {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf142;');
-}
-.icon-rss-sign {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf143;');
-}
-.icon-play-sign {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf144;');
-}
-.icon-ticket {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf145;');
-}
-.icon-minus-sign-alt {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf146;');
-}
-.icon-check-minus {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf147;');
-}
-.icon-level-up {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf148;');
-}
-.icon-level-down {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf149;');
-}
-.icon-check-sign {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf14a;');
-}
-.icon-edit-sign {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf14b;');
-}
-.icon-external-link-sign {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf14c;');
-}
-.icon-share-sign {
- *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf14d;');
-}
-.dropup,
-.dropdown {
- position: relative;
-}
-.dropdown-toggle {
- *margin-bottom: -3px;
-}
-.dropdown-toggle:active,
-.open .dropdown-toggle {
- outline: 0;
-}
-.caret {
- display: inline-block;
- width: 0;
- height: 0;
- vertical-align: top;
- border-top: 4px solid #000000;
- border-right: 4px solid transparent;
- border-left: 4px solid transparent;
- content: "";
-}
-.dropdown .caret {
- margin-top: 8px;
- margin-left: 2px;
-}
-.dropdown-menu {
- position: absolute;
- top: 100%;
- left: 0;
- z-index: 1000;
- display: none;
- float: left;
- min-width: 160px;
- padding: 5px 0;
- margin: 2px 0 0;
- list-style: none;
- background-color: #ffffff;
- border: 1px solid #ccc;
- border: 1px solid rgba(0, 0, 0, 0.2);
- *border-right-width: 2px;
- *border-bottom-width: 2px;
- -webkit-background-clip: padding-box;
- -moz-background-clip: padding;
- background-clip: padding-box;
-}
-.dropdown-menu.pull-right {
- right: 0;
- left: auto;
-}
-.dropdown-menu .divider {
- *width: 100%;
- height: 1px;
- margin: -0.15000000000000002 1px;
- *margin: -5px 0 5px;
- overflow: hidden;
- background-color: #e5e5e5;
- border-bottom: 1px solid #ffffff;
-}
-.dropdown-menu > li > a {
- display: block;
- padding: 3px 20px;
- clear: both;
- font-weight: normal;
- line-height: 1.7;
- color: #333333;
- white-space: nowrap;
-}
-.dropdown-menu > li > a:hover,
-.dropdown-menu > li > a:focus,
-.dropdown-submenu:hover > a,
-.dropdown-submenu:focus > a {
- text-decoration: none;
- color: #333333;
- background-color: #e9e9e9;
-}
-.dropdown-menu > .active > a,
-.dropdown-menu > .active > a:hover,
-.dropdown-menu > .active > a:focus {
- color: #333333;
- text-decoration: none;
- outline: 0;
- background-color: #e9e9e9;
-}
-.dropdown-menu > .disabled > a,
-.dropdown-menu > .disabled > a:hover,
-.dropdown-menu > .disabled > a:focus {
- color: #999999;
-}
-.dropdown-menu > .disabled > a:hover,
-.dropdown-menu > .disabled > a:focus {
- text-decoration: none;
- background-color: transparent;
- background-image: none;
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
- cursor: default;
-}
-.open {
- *z-index: 1000;
-}
-.open > .dropdown-menu {
- display: block;
-}
-.dropdown-backdrop {
- position: fixed;
- left: 0;
- right: 0;
- bottom: 0;
- top: 0;
- z-index: 990;
-}
-.pull-right > .dropdown-menu {
- right: 0;
- left: auto;
-}
-.dropup .caret,
-.navbar-fixed-bottom .dropdown .caret {
- border-top: 0;
- border-bottom: 4px solid #000000;
- content: "";
-}
-.dropup .dropdown-menu,
-.navbar-fixed-bottom .dropdown .dropdown-menu {
- top: auto;
- bottom: 100%;
- margin-bottom: 1px;
-}
-.dropdown-submenu {
- position: relative;
-}
-.dropdown-submenu > .dropdown-menu {
- top: 0;
- left: 100%;
- margin-top: -6px;
- margin-left: -1px;
-}
-.dropdown-submenu:hover > .dropdown-menu {
- display: block;
-}
-.dropup .dropdown-submenu > .dropdown-menu {
- top: auto;
- bottom: 0;
- margin-top: 0;
- margin-bottom: -2px;
-}
-.dropdown-submenu > a:after {
- display: block;
- content: " ";
- float: right;
- width: 0;
- height: 0;
- border-color: transparent;
- border-style: solid;
- border-width: 5px 0 5px 5px;
- border-left-color: #cccccc;
- margin-top: 5px;
- margin-right: -10px;
-}
-.dropdown-submenu:hover > a:after {
- border-left-color: #333333;
-}
-.dropdown-submenu.pull-left {
- float: none;
-}
-.dropdown-submenu.pull-left > .dropdown-menu {
- left: -100%;
- margin-left: 10px;
-}
-.dropdown .dropdown-menu .nav-header {
- padding-left: 20px;
- padding-right: 20px;
-}
-.typeahead {
- z-index: 1051;
- margin-top: 2px;
-}
-.well {
- min-height: 20px;
- padding: 19px;
- margin-bottom: 20px;
- background-color: #f5f5f5;
- border: 1px solid #e3e3e3;
-}
-.well blockquote {
- border-color: #ddd;
- border-color: rgba(0, 0, 0, 0.15);
-}
-.well-large {
- padding: 24px;
-}
-.well-small {
- padding: 9px;
-}
-.fade {
- opacity: 0;
- -webkit-transition: opacity 0.15s linear;
- -moz-transition: opacity 0.15s linear;
- -o-transition: opacity 0.15s linear;
- transition: opacity 0.15s linear;
-}
-.fade.in {
- opacity: 1;
-}
-.collapse {
- position: relative;
- height: 0;
- overflow: hidden;
- -webkit-transition: height 0.35s ease;
- -moz-transition: height 0.35s ease;
- -o-transition: height 0.35s ease;
- transition: height 0.35s ease;
-}
-.collapse.in {
- height: auto;
-}
-.close {
- float: right;
- font-size: 20px;
- font-weight: bold;
- line-height: 1.7;
- color: #000000;
- opacity: 0.2;
- filter: alpha(opacity=20);
-}
-.close:hover,
-.close:focus {
- color: #000000;
- text-decoration: none;
- cursor: pointer;
- opacity: 0.4;
- filter: alpha(opacity=40);
-}
-button.close {
- padding: 0;
- cursor: pointer;
- background: transparent;
- border: 0;
- -webkit-appearance: none;
-}
-.btn {
- display: inline-block;
- *display: inline;
- /* IE7 inline-block hack */
- *zoom: 1;
- padding: 4px 12px;
- margin-bottom: 0;
- font-size: 14px;
- line-height: 1.7;
- text-align: center;
- vertical-align: middle;
- cursor: pointer;
- color: #333333;
- background-color: #f5f5f5;
- border-color: #e6e6e6 #e6e6e6 #bfbfbf;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
- *background-color: #e6e6e6;
- /* Darken IE7 buttons by default so they stand out more given they won't have borders */
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
- border: 1px solid #cccccc;
- *border: 0;
- border-bottom-color: #b3b3b3;
- *margin-left: .3em;
-}
-.btn:hover,
-.btn:focus,
-.btn:active,
-.btn.active,
-.btn.disabled,
-.btn[disabled] {
- color: #333333;
- background-color: #e6e6e6;
- *background-color: #d9d9d9;
-}
-.btn:active,
-.btn.active {
- background-color: #cccccc \9;
-}
-.btn:first-child {
- *margin-left: 0;
-}
-.btn:hover,
-.btn:focus {
- color: #333333;
- text-decoration: none;
- background-position: 0 -15px;
- -webkit-transition: background-position 0.1s linear;
- -moz-transition: background-position 0.1s linear;
- -o-transition: background-position 0.1s linear;
- transition: background-position 0.1s linear;
-}
-.btn:focus {
- outline: thin dotted #333;
- outline: 5px auto -webkit-focus-ring-color;
- outline-offset: -2px;
-}
-.btn.active,
-.btn:active {
- background-image: none;
- outline: 0;
-}
-.btn.disabled,
-.btn[disabled] {
- cursor: default;
- background-image: none;
- opacity: 0.65;
- filter: alpha(opacity=65);
-}
-.btn-large {
- padding: 11px 19px;
- font-size: 18px;
-}
-.btn-large [class^="icon-"],
-.btn-large [class*=" icon-"] {
- margin-top: 4px;
-}
-.btn-small {
- padding: 2px 10px;
- font-size: 13px;
-}
-.btn-small [class^="icon-"],
-.btn-small [class*=" icon-"] {
- margin-top: 0;
-}
-.btn-mini [class^="icon-"],
-.btn-mini [class*=" icon-"] {
- margin-top: -1px;
-}
-.btn-mini {
- padding: 0 6px;
- font-size: 10.5px;
-}
-.btn-block {
- display: block;
- width: 100%;
- padding-left: 0;
- padding-right: 0;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
-}
-.btn-block + .btn-block {
- margin-top: 5px;
-}
-input[type="submit"].btn-block,
-input[type="reset"].btn-block,
-input[type="button"].btn-block {
- width: 100%;
-}
-.btn-primary.active,
-.btn-warning.active,
-.btn-danger.active,
-.btn-success.active,
-.btn-info.active,
-.btn-inverse.active {
- color: rgba(255, 255, 255, 0.75);
-}
-.btn-primary {
- color: #ffffff;
- background-color: #25318f;
- border-color: #2c218f #2c218f #191351;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
- *background-color: #2c218f;
- /* Darken IE7 buttons by default so they stand out more given they won't have borders */
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-}
-.btn-primary:hover,
-.btn-primary:focus,
-.btn-primary:active,
-.btn-primary.active,
-.btn-primary.disabled,
-.btn-primary[disabled] {
- color: #ffffff;
- background-color: #2c218f;
- *background-color: #251c7a;
-}
-.btn-primary:active,
-.btn-primary.active {
- background-color: #1f1766 \9;
-}
-.btn-warning {
- color: #ffffff;
- background-color: #faa732;
- border-color: #f89406 #f89406 #ad6704;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
- *background-color: #f89406;
- /* Darken IE7 buttons by default so they stand out more given they won't have borders */
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-}
-.btn-warning:hover,
-.btn-warning:focus,
-.btn-warning:active,
-.btn-warning.active,
-.btn-warning.disabled,
-.btn-warning[disabled] {
- color: #ffffff;
- background-color: #f89406;
- *background-color: #df8505;
-}
-.btn-warning:active,
-.btn-warning.active {
- background-color: #c67605 \9;
-}
-.btn-danger {
- color: #ffffff;
- background-color: #b52d2b;
- border-color: #bd362f #bd362f #802420;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
- *background-color: #bd362f;
- /* Darken IE7 buttons by default so they stand out more given they won't have borders */
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-}
-.btn-danger:hover,
-.btn-danger:focus,
-.btn-danger:active,
-.btn-danger.active,
-.btn-danger.disabled,
-.btn-danger[disabled] {
- color: #ffffff;
- background-color: #bd362f;
- *background-color: #a9302a;
-}
-.btn-danger:active,
-.btn-danger.active {
- background-color: #942a25 \9;
-}
-.btn-success {
- color: #ffffff;
- background-color: #5bb75b;
- border-color: #51a351 #51a351 #387038;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
- *background-color: #51a351;
- /* Darken IE7 buttons by default so they stand out more given they won't have borders */
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-}
-.btn-success:hover,
-.btn-success:focus,
-.btn-success:active,
-.btn-success.active,
-.btn-success.disabled,
-.btn-success[disabled] {
- color: #ffffff;
- background-color: #51a351;
- *background-color: #499249;
-}
-.btn-success:active,
-.btn-success.active {
- background-color: #408140 \9;
-}
-.btn-info {
- color: #ffffff;
- background-color: #49afcd;
- border-color: #2f96b4 #2f96b4 #1f6377;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
- *background-color: #2f96b4;
- /* Darken IE7 buttons by default so they stand out more given they won't have borders */
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-}
-.btn-info:hover,
-.btn-info:focus,
-.btn-info:active,
-.btn-info.active,
-.btn-info.disabled,
-.btn-info[disabled] {
- color: #ffffff;
- background-color: #2f96b4;
- *background-color: #2a85a0;
-}
-.btn-info:active,
-.btn-info.active {
- background-color: #24748c \9;
-}
-.btn-inverse {
- color: #ffffff;
- background-color: #363636;
- border-color: #222222 #222222 #000000;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
- *background-color: #222222;
- /* Darken IE7 buttons by default so they stand out more given they won't have borders */
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-}
-.btn-inverse:hover,
-.btn-inverse:focus,
-.btn-inverse:active,
-.btn-inverse.active,
-.btn-inverse.disabled,
-.btn-inverse[disabled] {
- color: #ffffff;
- background-color: #222222;
- *background-color: #151515;
-}
-.btn-inverse:active,
-.btn-inverse.active {
- background-color: #080808 \9;
-}
-button.btn,
-input[type="submit"].btn {
- *padding-top: 3px;
- *padding-bottom: 3px;
-}
-button.btn::-moz-focus-inner,
-input[type="submit"].btn::-moz-focus-inner {
- padding: 0;
- border: 0;
-}
-button.btn.btn-large,
-input[type="submit"].btn.btn-large {
- *padding-top: 7px;
- *padding-bottom: 7px;
-}
-button.btn.btn-small,
-input[type="submit"].btn.btn-small {
- *padding-top: 3px;
- *padding-bottom: 3px;
-}
-button.btn.btn-mini,
-input[type="submit"].btn.btn-mini {
- *padding-top: 1px;
- *padding-bottom: 1px;
-}
-.btn-link,
-.btn-link:active,
-.btn-link[disabled] {
- background-color: transparent;
- background-image: none;
-}
-.btn-link {
- border-color: transparent;
- cursor: pointer;
- color: #213b8f;
-}
-.btn-link:hover,
-.btn-link:focus {
- color: #2f55cd;
- text-decoration: underline;
- background-color: transparent;
-}
-.btn-link[disabled]:hover,
-.btn-link[disabled]:focus {
- color: #333333;
- text-decoration: none;
-}
-.btn-group {
- position: relative;
- display: inline-block;
- *display: inline;
- /* IE7 inline-block hack */
- *zoom: 1;
- font-size: 0;
- vertical-align: middle;
- white-space: nowrap;
- *margin-left: .3em;
-}
-.btn-group:first-child {
- *margin-left: 0;
-}
-.btn-group + .btn-group {
- margin-left: 5px;
-}
-.btn-toolbar {
- font-size: 0;
- margin-top: 0.85;
- margin-bottom: 0.85;
-}
-.btn-toolbar > .btn + .btn,
-.btn-toolbar > .btn-group + .btn,
-.btn-toolbar > .btn + .btn-group {
- margin-left: 5px;
-}
-.btn-group > .btn {
- position: relative;
-}
-.btn-group > .btn + .btn {
- margin-left: -1px;
-}
-.btn-group > .btn,
-.btn-group > .dropdown-menu,
-.btn-group > .popover {
- font-size: 14px;
-}
-.btn-group > .btn-mini {
- font-size: 10.5px;
-}
-.btn-group > .btn-small {
- font-size: 13px;
-}
-.btn-group > .btn-large {
- font-size: 18px;
-}
-.btn-group > .btn:first-child {
- margin-left: 0;
-}
-.btn-group > .btn.large:first-child {
- margin-left: 0;
-}
-.btn-group > .btn:hover,
-.btn-group > .btn:focus,
-.btn-group > .btn:active,
-.btn-group > .btn.active {
- z-index: 2;
-}
-.btn-group .dropdown-toggle:active,
-.btn-group.open .dropdown-toggle {
- outline: 0;
-}
-.btn-group > .btn + .dropdown-toggle {
- padding-left: 8px;
- padding-right: 8px;
- *padding-top: 5px;
- *padding-bottom: 5px;
-}
-.btn-group > .btn-mini + .dropdown-toggle {
- padding-left: 5px;
- padding-right: 5px;
- *padding-top: 2px;
- *padding-bottom: 2px;
-}
-.btn-group > .btn-small + .dropdown-toggle {
- *padding-top: 5px;
- *padding-bottom: 4px;
-}
-.btn-group > .btn-large + .dropdown-toggle {
- padding-left: 12px;
- padding-right: 12px;
- *padding-top: 7px;
- *padding-bottom: 7px;
-}
-.btn-group.open .dropdown-toggle {
- background-image: none;
-}
-.btn-group.open .btn.dropdown-toggle {
- background-color: #e6e6e6;
-}
-.btn-group.open .btn-primary.dropdown-toggle {
- background-color: #2c218f;
-}
-.btn-group.open .btn-warning.dropdown-toggle {
- background-color: #f89406;
-}
-.btn-group.open .btn-danger.dropdown-toggle {
- background-color: #bd362f;
-}
-.btn-group.open .btn-success.dropdown-toggle {
- background-color: #51a351;
-}
-.btn-group.open .btn-info.dropdown-toggle {
- background-color: #2f96b4;
-}
-.btn-group.open .btn-inverse.dropdown-toggle {
- background-color: #222222;
-}
-.btn .caret {
- margin-top: 8px;
- margin-left: 0;
-}
-.btn-large .caret {
- margin-top: 6px;
-}
-.btn-large .caret {
- border-left-width: 5px;
- border-right-width: 5px;
- border-top-width: 5px;
-}
-.btn-mini .caret,
-.btn-small .caret {
- margin-top: 8px;
-}
-.dropup .btn-large .caret {
- border-bottom-width: 5px;
-}
-.btn-primary .caret,
-.btn-warning .caret,
-.btn-danger .caret,
-.btn-info .caret,
-.btn-success .caret,
-.btn-inverse .caret {
- border-top-color: #ffffff;
- border-bottom-color: #ffffff;
-}
-.btn-group-vertical {
- display: inline-block;
- *display: inline;
- /* IE7 inline-block hack */
- *zoom: 1;
-}
-.btn-group-vertical > .btn {
- display: block;
- float: none;
- max-width: 100%;
-}
-.btn-group-vertical > .btn + .btn {
- margin-left: 0;
- margin-top: -1px;
-}
-.alert {
- padding: 8px 35px 8px 14px;
- margin-bottom: 1.7;
- background-color: #fcf8e3;
- border: 1px solid #fbeed5;
-}
-.alert,
-.alert h4 {
- color: #c09853;
-}
-.alert h4 {
- margin: 0;
-}
-.alert .close {
- position: relative;
- top: -2px;
- right: -21px;
- line-height: 1.7;
-}
-.alert-success {
- background-color: #dff0d8;
- border-color: #d6e9c6;
- color: #468847;
-}
-.alert-success h4 {
- color: #468847;
-}
-.alert-danger,
-.alert-error {
- background-color: #f2dede;
- border-color: #eed3d7;
- color: #b94a48;
-}
-.alert-danger h4,
-.alert-error h4 {
- color: #b94a48;
-}
-.alert-info {
- background-color: #d9edf7;
- border-color: #bce8f1;
- color: #3a87ad;
-}
-.alert-info h4 {
- color: #3a87ad;
-}
-.alert-block {
- padding-top: 14px;
- padding-bottom: 14px;
-}
-.alert-block > p,
-.alert-block > ul {
- margin-bottom: 0;
-}
-.alert-block p + p {
- margin-top: 5px;
-}
-.nav {
- margin-left: 0;
- margin-bottom: 1.7;
- list-style: none;
-}
-.nav > li > a {
- display: block;
-}
-.nav > li > a:hover,
-.nav > li > a:focus {
- text-decoration: none;
- background-color: #eeeeee;
-}
-.nav > li > a > img {
- max-width: none;
-}
-.nav > .pull-right {
- float: right;
-}
-.nav-header {
- display: block;
- padding: 3px 15px;
- font-size: 11px;
- font-weight: bold;
- line-height: 1.7;
- color: #999999;
- text-transform: uppercase;
-}
-.nav li + .nav-header {
- margin-top: 9px;
-}
-.nav-list {
- padding-left: 15px;
- padding-right: 15px;
- margin-bottom: 0;
-}
-.nav-list > li > a,
-.nav-list .nav-header {
- margin-left: -15px;
- margin-right: -15px;
-}
-.nav-list > li > a {
- padding: 3px 15px;
-}
-.nav-list > .active > a,
-.nav-list > .active > a:hover,
-.nav-list > .active > a:focus {
- color: #ffffff;
- background-color: #213b8f;
-}
-.nav-list [class^="icon-"],
-.nav-list [class*=" icon-"] {
- margin-right: 2px;
-}
-.nav-list .divider {
- *width: 100%;
- height: 1px;
- margin: -0.15000000000000002 1px;
- *margin: -5px 0 5px;
- overflow: hidden;
- background-color: #e5e5e5;
- border-bottom: 1px solid #ffffff;
-}
-.nav-tabs,
-.nav-pills {
- *zoom: 1;
-}
-.nav-tabs:before,
-.nav-pills:before,
-.nav-tabs:after,
-.nav-pills:after {
- display: table;
- content: "";
- line-height: 0;
-}
-.nav-tabs:after,
-.nav-pills:after {
- clear: both;
-}
-.nav-tabs > li,
-.nav-pills > li {
- float: left;
-}
-.nav-tabs > li > a,
-.nav-pills > li > a {
- padding-right: 12px;
- padding-left: 12px;
- margin-right: 2px;
- line-height: 14px;
-}
-.nav-tabs {
- border-bottom: 1px solid #ddd;
-}
-.nav-tabs > li {
- margin-bottom: -1px;
-}
-.nav-tabs > li > a {
- padding-top: 8px;
- padding-bottom: 8px;
- line-height: 1.7;
- border: 1px solid transparent;
-}
-.nav-tabs > li > a:hover,
-.nav-tabs > li > a:focus {
- border-color: #eeeeee #eeeeee #dddddd;
-}
-.nav-tabs > .active > a,
-.nav-tabs > .active > a:hover,
-.nav-tabs > .active > a:focus {
- color: #555555;
- background-color: #f2f2f2;
- border: 1px solid #ddd;
- border-bottom-color: transparent;
- cursor: default;
-}
-.nav-pills > li > a {
- padding-top: 8px;
- padding-bottom: 8px;
- margin-top: 2px;
- margin-bottom: 2px;
-}
-.nav-pills > .active > a,
-.nav-pills > .active > a:hover,
-.nav-pills > .active > a:focus {
- color: #ffffff;
- background-color: #213b8f;
-}
-.nav-stacked > li {
- float: none;
-}
-.nav-stacked > li > a {
- margin-right: 0;
-}
-.nav-tabs.nav-stacked {
- border-bottom: 0;
-}
-.nav-tabs.nav-stacked > li > a {
- border: 1px solid #ddd;
-}
-.nav-tabs.nav-stacked > li > a:hover,
-.nav-tabs.nav-stacked > li > a:focus {
- border-color: #ddd;
- z-index: 2;
-}
-.nav-pills.nav-stacked > li > a {
- margin-bottom: 3px;
-}
-.nav-pills.nav-stacked > li:last-child > a {
- margin-bottom: 1px;
-}
-.nav .dropdown-toggle .caret {
- border-top-color: #213b8f;
- border-bottom-color: #213b8f;
- margin-top: 6px;
-}
-.nav .dropdown-toggle:hover .caret,
-.nav .dropdown-toggle:focus .caret {
- border-top-color: #2f55cd;
- border-bottom-color: #2f55cd;
-}
-/* move down carets for tabs */
-.nav-tabs .dropdown-toggle .caret {
- margin-top: 8px;
-}
-.nav .active .dropdown-toggle .caret {
- border-top-color: #fff;
- border-bottom-color: #fff;
-}
-.nav-tabs .active .dropdown-toggle .caret {
- border-top-color: #555555;
- border-bottom-color: #555555;
-}
-.nav > .dropdown.active > a:hover,
-.nav > .dropdown.active > a:focus {
- cursor: pointer;
-}
-.nav-tabs .open .dropdown-toggle,
-.nav-pills .open .dropdown-toggle,
-.nav > li.dropdown.open.active > a:hover,
-.nav > li.dropdown.open.active > a:focus {
- color: #ffffff;
- background-color: #999999;
- border-color: #999999;
-}
-.nav li.dropdown.open .caret,
-.nav li.dropdown.open.active .caret,
-.nav li.dropdown.open a:hover .caret,
-.nav li.dropdown.open a:focus .caret {
- border-top-color: #ffffff;
- border-bottom-color: #ffffff;
- opacity: 1;
- filter: alpha(opacity=100);
-}
-.tabs-stacked .open > a:hover,
-.tabs-stacked .open > a:focus {
- border-color: #999999;
-}
-.tabbable {
- *zoom: 1;
-}
-.tabbable:before,
-.tabbable:after {
- display: table;
- content: "";
- line-height: 0;
-}
-.tabbable:after {
- clear: both;
-}
-.tab-content {
- overflow: auto;
-}
-.tabs-below > .nav-tabs,
-.tabs-right > .nav-tabs,
-.tabs-left > .nav-tabs {
- border-bottom: 0;
-}
-.tab-content > .tab-pane,
-.pill-content > .pill-pane {
- display: none;
-}
-.tab-content > .active,
-.pill-content > .active {
- display: block;
-}
-.tabs-below > .nav-tabs {
- border-top: 1px solid #ddd;
-}
-.tabs-below > .nav-tabs > li {
- margin-top: -1px;
- margin-bottom: 0;
-}
-.tabs-below > .nav-tabs > li > a:hover,
-.tabs-below > .nav-tabs > li > a:focus {
- border-bottom-color: transparent;
- border-top-color: #ddd;
-}
-.tabs-below > .nav-tabs > .active > a,
-.tabs-below > .nav-tabs > .active > a:hover,
-.tabs-below > .nav-tabs > .active > a:focus {
- border-color: transparent #ddd #ddd #ddd;
-}
-.tabs-left > .nav-tabs > li,
-.tabs-right > .nav-tabs > li {
- float: none;
-}
-.tabs-left > .nav-tabs > li > a,
-.tabs-right > .nav-tabs > li > a {
- min-width: 74px;
- margin-right: 0;
- margin-bottom: 3px;
-}
-.tabs-left > .nav-tabs {
- float: left;
- margin-right: 19px;
- border-right: 1px solid #ddd;
-}
-.tabs-left > .nav-tabs > li > a {
- margin-right: -1px;
-}
-.tabs-left > .nav-tabs > li > a:hover,
-.tabs-left > .nav-tabs > li > a:focus {
- border-color: #eeeeee #dddddd #eeeeee #eeeeee;
-}
-.tabs-left > .nav-tabs .active > a,
-.tabs-left > .nav-tabs .active > a:hover,
-.tabs-left > .nav-tabs .active > a:focus {
- border-color: #ddd transparent #ddd #ddd;
- *border-right-color: #ffffff;
-}
-.tabs-right > .nav-tabs {
- float: right;
- margin-left: 19px;
- border-left: 1px solid #ddd;
-}
-.tabs-right > .nav-tabs > li > a {
- margin-left: -1px;
-}
-.tabs-right > .nav-tabs > li > a:hover,
-.tabs-right > .nav-tabs > li > a:focus {
- border-color: #eeeeee #eeeeee #eeeeee #dddddd;
-}
-.tabs-right > .nav-tabs .active > a,
-.tabs-right > .nav-tabs .active > a:hover,
-.tabs-right > .nav-tabs .active > a:focus {
- border-color: #ddd #ddd #ddd transparent;
- *border-left-color: #ffffff;
-}
-.nav > .disabled > a {
- color: #999999;
-}
-.nav > .disabled > a:hover,
-.nav > .disabled > a:focus {
- text-decoration: none;
- background-color: transparent;
- cursor: default;
-}
-.navbar {
- overflow: visible;
- margin-bottom: 1.7;
- *position: relative;
- *z-index: 2;
-}
-.navbar-inner {
- min-height: 55px;
- padding-left: 20px;
- padding-right: 20px;
- background-color: #ededed;
- border: 1px solid #c7c7c7;
- *zoom: 1;
-}
-.navbar-inner:before,
-.navbar-inner:after {
- display: table;
- content: "";
- line-height: 0;
-}
-.navbar-inner:after {
- clear: both;
-}
-.navbar .container {
- width: auto;
-}
-.nav-collapse.collapse {
- height: auto;
- overflow: visible;
-}
-.navbar .brand {
- float: left;
- display: block;
- padding: 26.65px 20px 26.65px;
- margin-left: -20px;
- font-size: 20px;
- font-weight: 200;
- color: #ffffff;
-}
-.navbar .brand:hover,
-.navbar .brand:focus {
- text-decoration: none;
-}
-.navbar-text {
- margin-bottom: 0;
- line-height: 55px;
- color: #777777;
-}
-.navbar-link {
- color: #253237;
-}
-.navbar-link:hover,
-.navbar-link:focus {
- color: #333333;
-}
-.navbar .divider-vertical {
- height: 55px;
- margin: 0 9px;
- border-left: 1px solid #e5e5e5;
- border-right: 1px solid #f2f2f2;
-}
-.navbar .btn,
-.navbar .btn-group {
- margin-top: 12.5px;
-}
-.navbar .btn-group .btn,
-.navbar .input-prepend .btn,
-.navbar .input-append .btn,
-.navbar .input-prepend .btn-group,
-.navbar .input-append .btn-group {
- margin-top: 0;
-}
-.navbar-form {
- margin-bottom: 0;
- *zoom: 1;
-}
-.navbar-form:before,
-.navbar-form:after {
- display: table;
- content: "";
- line-height: 0;
-}
-.navbar-form:after {
- clear: both;
-}
-.navbar-form input,
-.navbar-form select,
-.navbar-form .radio,
-.navbar-form .checkbox {
- margin-top: 12.5px;
-}
-.navbar-form input,
-.navbar-form select,
-.navbar-form .btn {
- display: inline-block;
- margin-bottom: 0;
-}
-.navbar-form input[type="image"],
-.navbar-form input[type="checkbox"],
-.navbar-form input[type="radio"] {
- margin-top: 3px;
-}
-.navbar-form .input-append,
-.navbar-form .input-prepend {
- margin-top: 5px;
- white-space: nowrap;
-}
-.navbar-form .input-append input,
-.navbar-form .input-prepend input {
- margin-top: 0;
-}
-.navbar-search {
- position: relative;
- float: left;
- margin-top: 12.5px;
- margin-bottom: 0;
-}
-.navbar-search .search-query {
- margin-bottom: 0;
- padding: 4px 14px;
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
- font-size: 13px;
- font-weight: normal;
- line-height: 1;
-}
-.navbar-static-top {
- position: static;
- margin-bottom: 0;
-}
-.navbar-fixed-top,
-.navbar-fixed-bottom {
- position: fixed;
- right: 0;
- left: 0;
- z-index: 1030;
- margin-bottom: 0;
-}
-.navbar-fixed-top .navbar-inner,
-.navbar-static-top .navbar-inner {
- border-width: 0 0 1px;
-}
-.navbar-fixed-bottom .navbar-inner {
- border-width: 1px 0 0;
-}
-.navbar-fixed-top .navbar-inner,
-.navbar-fixed-bottom .navbar-inner {
- padding-left: 0;
- padding-right: 0;
-}
-.navbar-static-top .container,
-.navbar-fixed-top .container,
-.navbar-fixed-bottom .container {
- width: 940px;
-}
-.navbar-fixed-top {
- top: 0;
-}
-.navbar-fixed-bottom {
- bottom: 0;
-}
-.navbar .nav {
- position: relative;
- left: 0;
- display: block;
- float: left;
- margin: 0 10px 0 0;
-}
-.navbar .nav.pull-right {
- float: right;
- margin-right: 0;
-}
-.navbar .nav > li {
- float: left;
-}
-.navbar .nav > li > a {
- float: none;
- padding: 26.65px 15px 26.65px;
- color: #253237;
- text-decoration: none;
-}
-.navbar .nav .dropdown-toggle .caret {
- margin-top: 8px;
-}
-.navbar .nav > li > a:focus,
-.navbar .nav > li > a:hover {
- background-color: transparent;
- color: #333333;
- text-decoration: none;
-}
-.navbar .nav > .active > a,
-.navbar .nav > .active > a:hover,
-.navbar .nav > .active > a:focus {
- color: #555555;
- text-decoration: none;
- background-color: #d8d8d8;
-}
-.navbar .btn-navbar {
- display: none;
- float: right;
- padding: 7px 10px;
- margin-left: 5px;
- margin-right: 5px;
- color: #ffffff;
- background-color: #e0e0e0;
- border-color: #d8d8d8 #d8d8d8 #b2b2b2;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
- *background-color: #d8d8d8;
- /* Darken IE7 buttons by default so they stand out more given they won't have borders */
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-}
-.navbar .btn-navbar:hover,
-.navbar .btn-navbar:focus,
-.navbar .btn-navbar:active,
-.navbar .btn-navbar.active,
-.navbar .btn-navbar.disabled,
-.navbar .btn-navbar[disabled] {
- color: #ffffff;
- background-color: #d8d8d8;
- *background-color: #cccccc;
-}
-.navbar .btn-navbar:active,
-.navbar .btn-navbar.active {
- background-color: #bfbfbf \9;
-}
-.navbar .btn-navbar .icon-bar {
- display: block;
- width: 18px;
- height: 2px;
- background-color: #f5f5f5;
-}
-.btn-navbar .icon-bar + .icon-bar {
- margin-top: 3px;
-}
-.navbar .nav > li > .dropdown-menu:before {
- content: '';
- display: inline-block;
- border-left: 7px solid transparent;
- border-right: 7px solid transparent;
- border-bottom: 7px solid #ccc;
- border-bottom-color: rgba(0, 0, 0, 0.2);
- position: absolute;
- top: -7px;
- left: 9px;
-}
-.navbar .nav > li > .dropdown-menu:after {
- content: '';
- display: inline-block;
- border-left: 6px solid transparent;
- border-right: 6px solid transparent;
- border-bottom: 6px solid #ffffff;
- position: absolute;
- top: -6px;
- left: 10px;
-}
-.navbar-fixed-bottom .nav > li > .dropdown-menu:before {
- border-top: 7px solid #ccc;
- border-top-color: rgba(0, 0, 0, 0.2);
- border-bottom: 0;
- bottom: -7px;
- top: auto;
-}
-.navbar-fixed-bottom .nav > li > .dropdown-menu:after {
- border-top: 6px solid #ffffff;
- border-bottom: 0;
- bottom: -6px;
- top: auto;
-}
-.navbar .nav li.dropdown > a:hover .caret,
-.navbar .nav li.dropdown > a:focus .caret {
- border-top-color: #333333;
- border-bottom-color: #333333;
-}
-.navbar .nav li.dropdown.open > .dropdown-toggle,
-.navbar .nav li.dropdown.active > .dropdown-toggle,
-.navbar .nav li.dropdown.open.active > .dropdown-toggle {
- background-color: #d8d8d8;
- color: #555555;
-}
-.navbar .nav li.dropdown > .dropdown-toggle .caret {
- border-top-color: #253237;
- border-bottom-color: #253237;
-}
-.navbar .nav li.dropdown.open > .dropdown-toggle .caret,
-.navbar .nav li.dropdown.active > .dropdown-toggle .caret,
-.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {
- border-top-color: #555555;
- border-bottom-color: #555555;
-}
-.navbar .pull-right > li > .dropdown-menu,
-.navbar .nav > li > .dropdown-menu.pull-right {
- left: auto;
- right: 0;
-}
-.navbar .pull-right > li > .dropdown-menu:before,
-.navbar .nav > li > .dropdown-menu.pull-right:before {
- left: auto;
- right: 12px;
-}
-.navbar .pull-right > li > .dropdown-menu:after,
-.navbar .nav > li > .dropdown-menu.pull-right:after {
- left: auto;
- right: 13px;
-}
-.navbar .pull-right > li > .dropdown-menu .dropdown-menu,
-.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu {
- left: auto;
- right: 100%;
- margin-left: 0;
- margin-right: -1px;
-}
-.navbar-inverse .navbar-inner {
- background-color: #1f2129;
- border-color: #252525;
-}
-.navbar-inverse .brand,
-.navbar-inverse .nav > li > a {
- color: #999999;
-}
-.navbar-inverse .brand:hover,
-.navbar-inverse .nav > li > a:hover,
-.navbar-inverse .brand:focus,
-.navbar-inverse .nav > li > a:focus {
- color: #ffffff;
-}
-.navbar-inverse .brand {
- color: #999999;
-}
-.navbar-inverse .navbar-text {
- color: #999999;
-}
-.navbar-inverse .nav > li > a:focus,
-.navbar-inverse .nav > li > a:hover {
- background-color: transparent;
- color: #ffffff;
-}
-.navbar-inverse .nav .active > a,
-.navbar-inverse .nav .active > a:hover,
-.navbar-inverse .nav .active > a:focus {
- color: #ffffff;
- background-color: #1b2033;
-}
-.navbar-inverse .navbar-link {
- color: #999999;
-}
-.navbar-inverse .navbar-link:hover,
-.navbar-inverse .navbar-link:focus {
- color: #ffffff;
-}
-.navbar-inverse .divider-vertical {
- border-left-color: #1b2033;
- border-right-color: #222222;
-}
-.navbar-inverse .nav li.dropdown.open > .dropdown-toggle,
-.navbar-inverse .nav li.dropdown.active > .dropdown-toggle,
-.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle {
- background-color: #1b2033;
- color: #ffffff;
-}
-.navbar-inverse .nav li.dropdown > a:hover .caret,
-.navbar-inverse .nav li.dropdown > a:focus .caret {
- border-top-color: #ffffff;
- border-bottom-color: #ffffff;
-}
-.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret {
- border-top-color: #999999;
- border-bottom-color: #999999;
-}
-.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret,
-.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret,
-.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret {
- border-top-color: #ffffff;
- border-bottom-color: #ffffff;
-}
-.navbar-inverse .navbar-search .search-query {
- color: #ffffff;
- background-color: #475486;
- border-color: #1b2033;
- -webkit-transition: none;
- -moz-transition: none;
- -o-transition: none;
- transition: none;
-}
-.navbar-inverse .navbar-search .search-query:-moz-placeholder {
- color: #cccccc;
-}
-.navbar-inverse .navbar-search .search-query:-ms-input-placeholder {
- color: #cccccc;
-}
-.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder {
- color: #cccccc;
-}
-.navbar-inverse .navbar-search .search-query:focus,
-.navbar-inverse .navbar-search .search-query.focused {
- padding: 5px 15px;
- color: #333333;
- background-color: #ffffff;
- border: 0;
- outline: 0;
-}
-.navbar-inverse .btn-navbar {
- color: #ffffff;
- background-color: #14151a;
- border-color: #121622 #121622 #000000;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
- *background-color: #121622;
- /* Darken IE7 buttons by default so they stand out more given they won't have borders */
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-}
-.navbar-inverse .btn-navbar:hover,
-.navbar-inverse .btn-navbar:focus,
-.navbar-inverse .btn-navbar:active,
-.navbar-inverse .btn-navbar.active,
-.navbar-inverse .btn-navbar.disabled,
-.navbar-inverse .btn-navbar[disabled] {
- color: #ffffff;
- background-color: #121622;
- *background-color: #090b12;
-}
-.navbar-inverse .btn-navbar:active,
-.navbar-inverse .btn-navbar.active {
- background-color: #010101 \9;
-}
-.breadcrumb {
- padding: 8px 15px;
- margin: 0 0 1.7;
- list-style: none;
- background-color: #f5f5f5;
-}
-.breadcrumb > li {
- display: inline-block;
- *display: inline;
- /* IE7 inline-block hack */
- *zoom: 1;
-}
-.breadcrumb > li > .divider {
- padding: 0 5px;
- color: #ccc;
-}
-.breadcrumb > .active {
- color: #999999;
-}
-.pagination {
- margin: 1.7 0;
-}
-.pagination ul {
- display: inline-block;
- *display: inline;
- /* IE7 inline-block hack */
- *zoom: 1;
- margin-left: 0;
- margin-bottom: 0;
-}
-.pagination ul > li {
- display: inline;
-}
-.pagination ul > li > a,
-.pagination ul > li > span {
- float: left;
- padding: 4px 12px;
- line-height: 1.7;
- text-decoration: none;
- background-color: #ffffff;
- border: 1px solid #dddddd;
- border-left-width: 0;
-}
-.pagination ul > li > a:hover,
-.pagination ul > li > a:focus,
-.pagination ul > .active > a,
-.pagination ul > .active > span {
- background-color: #f5f5f5;
-}
-.pagination ul > .active > a,
-.pagination ul > .active > span {
- color: #999999;
- cursor: default;
-}
-.pagination ul > .disabled > span,
-.pagination ul > .disabled > a,
-.pagination ul > .disabled > a:hover,
-.pagination ul > .disabled > a:focus {
- color: #999999;
- background-color: transparent;
- cursor: default;
-}
-.pagination ul > li:first-child > a,
-.pagination ul > li:first-child > span {
- border-left-width: 1px;
-}
-.pagination-centered {
- text-align: center;
-}
-.pagination-right {
- text-align: right;
-}
-.pagination-large ul > li > a,
-.pagination-large ul > li > span {
- padding: 11px 19px;
- font-size: 18px;
-}
-.pagination-small ul > li > a,
-.pagination-small ul > li > span {
- padding: 2px 10px;
- font-size: 13px;
-}
-.pagination-mini ul > li > a,
-.pagination-mini ul > li > span {
- padding: 0 6px;
- font-size: 10.5px;
-}
-.pager {
- margin: 1.7 0;
- list-style: none;
- text-align: center;
- *zoom: 1;
-}
-.pager:before,
-.pager:after {
- display: table;
- content: "";
- line-height: 0;
-}
-.pager:after {
- clear: both;
-}
-.pager li {
- display: inline;
-}
-.pager li > a,
-.pager li > span {
- display: inline-block;
- padding: 5px 14px;
- background-color: #fff;
- border: 1px solid #ddd;
-}
-.pager li > a:hover,
-.pager li > a:focus {
- text-decoration: none;
- background-color: #f5f5f5;
-}
-.pager .next > a,
-.pager .next > span {
- float: right;
-}
-.pager .previous > a,
-.pager .previous > span {
- float: left;
-}
-.pager .disabled > a,
-.pager .disabled > a:hover,
-.pager .disabled > a:focus,
-.pager .disabled > span {
- color: #999999;
- background-color: #fff;
- cursor: default;
-}
-.modal-backdrop {
- position: fixed;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- z-index: 1040;
- background-color: #000000;
-}
-.modal-backdrop.fade {
- opacity: 0;
-}
-.modal-backdrop,
-.modal-backdrop.fade.in {
- opacity: 0.8;
- filter: alpha(opacity=80);
-}
-.modal {
- position: fixed;
- top: 10%;
- left: 50%;
- z-index: 1050;
- width: 560px;
- margin-left: -280px;
- background-color: #ffffff;
- border: 1px solid #999;
- border: 1px solid rgba(0, 0, 0, 0.3);
- *border: 1px solid #999;
- /* IE6-7 */
- -webkit-background-clip: padding-box;
- -moz-background-clip: padding-box;
- background-clip: padding-box;
- outline: none;
-}
-.modal.fade {
- -webkit-transition: opacity .3s linear, top .3s ease-out;
- -moz-transition: opacity .3s linear, top .3s ease-out;
- -o-transition: opacity .3s linear, top .3s ease-out;
- transition: opacity .3s linear, top .3s ease-out;
- top: -25%;
-}
-.modal.fade.in {
- top: 10%;
-}
-.modal-header {
- padding: 9px 15px;
- border-bottom: 1px solid #eee;
-}
-.modal-header .close {
- margin-top: 2px;
-}
-.modal-header h3 {
- margin: 0;
- line-height: 30px;
-}
-.modal-body {
- position: relative;
- overflow-y: auto;
- max-height: 400px;
- padding: 15px;
-}
-.modal-form {
- margin-bottom: 0;
-}
-.modal-footer {
- padding: 14px 15px 15px;
- margin-bottom: 0;
- text-align: right;
- background-color: #f5f5f5;
- border-top: 1px solid #ddd;
- *zoom: 1;
-}
-.modal-footer:before,
-.modal-footer:after {
- display: table;
- content: "";
- line-height: 0;
-}
-.modal-footer:after {
- clear: both;
-}
-.modal-footer .btn + .btn {
- margin-left: 5px;
- margin-bottom: 0;
-}
-.modal-footer .btn-group .btn + .btn {
- margin-left: -1px;
-}
-.modal-footer .btn-block + .btn-block {
- margin-left: 0;
-}
-.tooltip {
- position: absolute;
- z-index: 1030;
- display: block;
- visibility: visible;
- font-size: 11px;
- line-height: 1.4;
- opacity: 0;
- filter: alpha(opacity=0);
-}
-.tooltip.in {
- opacity: 0.8;
- filter: alpha(opacity=80);
-}
-.tooltip.top {
- margin-top: -3px;
- padding: 5px 0;
-}
-.tooltip.right {
- margin-left: 3px;
- padding: 0 5px;
-}
-.tooltip.bottom {
- margin-top: 3px;
- padding: 5px 0;
-}
-.tooltip.left {
- margin-left: -3px;
- padding: 0 5px;
-}
-.tooltip-inner {
- max-width: 200px;
- padding: 8px;
- color: #ffffff;
- text-align: center;
- text-decoration: none;
- background-color: #000000;
-}
-.tooltip-arrow {
- position: absolute;
- width: 0;
- height: 0;
- border-color: transparent;
- border-style: solid;
-}
-.tooltip.top .tooltip-arrow {
- bottom: 0;
- left: 50%;
- margin-left: -5px;
- border-width: 5px 5px 0;
- border-top-color: #000000;
-}
-.tooltip.right .tooltip-arrow {
- top: 50%;
- left: 0;
- margin-top: -5px;
- border-width: 5px 5px 5px 0;
- border-right-color: #000000;
-}
-.tooltip.left .tooltip-arrow {
- top: 50%;
- right: 0;
- margin-top: -5px;
- border-width: 5px 0 5px 5px;
- border-left-color: #000000;
-}
-.tooltip.bottom .tooltip-arrow {
- top: 0;
- left: 50%;
- margin-left: -5px;
- border-width: 0 5px 5px;
- border-bottom-color: #000000;
-}
-.popover {
- position: absolute;
- top: 0;
- left: 0;
- z-index: 1010;
- display: none;
- max-width: 276px;
- padding: 1px;
- text-align: left;
- background-color: #ffffff;
- -webkit-background-clip: padding-box;
- -moz-background-clip: padding;
- background-clip: padding-box;
- border: 1px solid #ccc;
- border: 1px solid rgba(0, 0, 0, 0.2);
- white-space: normal;
-}
-.popover.top {
- margin-top: -10px;
-}
-.popover.right {
- margin-left: 10px;
-}
-.popover.bottom {
- margin-top: 10px;
-}
-.popover.left {
- margin-left: -10px;
-}
-.popover-title {
- margin: 0;
- padding: 8px 14px;
- font-size: 14px;
- font-weight: normal;
- line-height: 18px;
- background-color: #f7f7f7;
- border-bottom: 1px solid #ebebeb;
-}
-.popover-title:empty {
- display: none;
-}
-.popover-content {
- padding: 9px 14px;
-}
-.popover .arrow,
-.popover .arrow:after {
- position: absolute;
- display: block;
- width: 0;
- height: 0;
- border-color: transparent;
- border-style: solid;
-}
-.popover .arrow {
- border-width: 11px;
-}
-.popover .arrow:after {
- border-width: 10px;
- content: "";
-}
-.popover.top .arrow {
- left: 50%;
- margin-left: -11px;
- border-bottom-width: 0;
- border-top-color: #999;
- border-top-color: rgba(0, 0, 0, 0.25);
- bottom: -11px;
-}
-.popover.top .arrow:after {
- bottom: 1px;
- margin-left: -10px;
- border-bottom-width: 0;
- border-top-color: #ffffff;
-}
-.popover.right .arrow {
- top: 50%;
- left: -11px;
- margin-top: -11px;
- border-left-width: 0;
- border-right-color: #999;
- border-right-color: rgba(0, 0, 0, 0.25);
-}
-.popover.right .arrow:after {
- left: 1px;
- bottom: -10px;
- border-left-width: 0;
- border-right-color: #ffffff;
-}
-.popover.bottom .arrow {
- left: 50%;
- margin-left: -11px;
- border-top-width: 0;
- border-bottom-color: #999;
- border-bottom-color: rgba(0, 0, 0, 0.25);
- top: -11px;
-}
-.popover.bottom .arrow:after {
- top: 1px;
- margin-left: -10px;
- border-top-width: 0;
- border-bottom-color: #ffffff;
-}
-.popover.left .arrow {
- top: 50%;
- right: -11px;
- margin-top: -11px;
- border-right-width: 0;
- border-left-color: #999;
- border-left-color: rgba(0, 0, 0, 0.25);
-}
-.popover.left .arrow:after {
- right: 1px;
- border-right-width: 0;
- border-left-color: #ffffff;
- bottom: -10px;
-}
-.thumbnails {
- margin-left: -20px;
- list-style: none;
- *zoom: 1;
-}
-.thumbnails:before,
-.thumbnails:after {
- display: table;
- content: "";
- line-height: 0;
-}
-.thumbnails:after {
- clear: both;
-}
-.row-fluid .thumbnails {
- margin-left: 0;
-}
-.thumbnails > li {
- float: left;
- margin-bottom: 1.7;
- margin-left: 20px;
-}
-.thumbnail {
- display: block;
- padding: 4px;
- line-height: 1.7;
- border: 1px solid #ddd;
- -webkit-transition: all 0.2s ease-in-out;
- -moz-transition: all 0.2s ease-in-out;
- -o-transition: all 0.2s ease-in-out;
- transition: all 0.2s ease-in-out;
-}
-a.thumbnail:hover,
-a.thumbnail:focus {
- border-color: #213b8f;
-}
-.thumbnail > img {
- display: block;
- max-width: 100%;
- margin-left: auto;
- margin-right: auto;
-}
-.thumbnail .caption {
- padding: 9px;
- color: #555555;
-}
-.media,
-.media-body {
- overflow: hidden;
- *overflow: visible;
- zoom: 1;
-}
-.media,
-.media .media {
- margin-top: 15px;
-}
-.media:first-child {
- margin-top: 0;
-}
-.media-object {
- display: block;
-}
-.media-heading {
- margin: 0 0 5px;
-}
-.media > .pull-left {
- margin-right: 10px;
-}
-.media > .pull-right {
- margin-left: 10px;
-}
-.media-list {
- margin-left: 0;
- list-style: none;
-}
-.label,
-.badge {
- display: inline-block;
- padding: 2px 4px;
- font-size: 11.844px;
- font-weight: bold;
- line-height: 14px;
- color: #ffffff;
- vertical-align: baseline;
- white-space: nowrap;
- background-color: #999999;
-}
-.badge {
- padding-left: 9px;
- padding-right: 9px;
-}
-.label:empty,
-.badge:empty {
- display: none;
-}
-a.label:hover,
-a.label:focus,
-a.badge:hover,
-a.badge:focus {
- color: #ffffff;
- text-decoration: none;
- cursor: pointer;
-}
-.label-important,
-.badge-important {
- background-color: #b94a48;
-}
-.label-important[href],
-.badge-important[href] {
- background-color: #953b39;
-}
-.label-warning,
-.badge-warning {
- background-color: #f89406;
-}
-.label-warning[href],
-.badge-warning[href] {
- background-color: #c67605;
-}
-.label-success,
-.badge-success {
- background-color: #468847;
-}
-.label-success[href],
-.badge-success[href] {
- background-color: #356635;
-}
-.label-info,
-.badge-info {
- background-color: #3a87ad;
-}
-.label-info[href],
-.badge-info[href] {
- background-color: #2d6987;
-}
-.label-inverse,
-.badge-inverse {
- background-color: #333333;
-}
-.label-inverse[href],
-.badge-inverse[href] {
- background-color: #1a1a1a;
-}
-.btn .label,
-.btn .badge {
- position: relative;
- top: -1px;
-}
-.btn-mini .label,
-.btn-mini .badge {
- top: 0;
-}
-@-webkit-keyframes progress-bar-stripes {
- from {
- background-position: 40px 0;
- }
- to {
- background-position: 0 0;
- }
-}
-@-moz-keyframes progress-bar-stripes {
- from {
- background-position: 40px 0;
- }
- to {
- background-position: 0 0;
- }
-}
-@-ms-keyframes progress-bar-stripes {
- from {
- background-position: 40px 0;
- }
- to {
- background-position: 0 0;
- }
-}
-@-o-keyframes progress-bar-stripes {
- from {
- background-position: 0 0;
- }
- to {
- background-position: 40px 0;
- }
-}
-@keyframes progress-bar-stripes {
- from {
- background-position: 40px 0;
- }
- to {
- background-position: 0 0;
- }
-}
-.progress {
- overflow: hidden;
- height: 1.7;
- margin-bottom: 1.7;
- background-color: #f7f7f7;
-}
-.progress .bar {
- width: 0%;
- height: 100%;
- color: #ffffff;
- float: left;
- font-size: 12px;
- text-align: center;
- background-color: #0e90d2;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- -webkit-transition: width 0.6s ease;
- -moz-transition: width 0.6s ease;
- -o-transition: width 0.6s ease;
- transition: width 0.6s ease;
-}
-.progress-striped .bar {
- background-color: #149bdf;
- background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
- background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- -webkit-background-size: 40px 40px;
- -moz-background-size: 40px 40px;
- -o-background-size: 40px 40px;
- background-size: 40px 40px;
-}
-.progress.active .bar {
- -webkit-animation: progress-bar-stripes 2s linear infinite;
- -moz-animation: progress-bar-stripes 2s linear infinite;
- -ms-animation: progress-bar-stripes 2s linear infinite;
- -o-animation: progress-bar-stripes 2s linear infinite;
- animation: progress-bar-stripes 2s linear infinite;
-}
-.progress-danger .bar,
-.progress .bar-danger {
- background-color: #dd514c;
-}
-.progress-danger.progress-striped .bar,
-.progress-striped .bar-danger {
- background-color: #ee5f5b;
- background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
- background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-}
-.progress-success .bar,
-.progress .bar-success {
- background-color: #5eb95e;
-}
-.progress-success.progress-striped .bar,
-.progress-striped .bar-success {
- background-color: #62c462;
- background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
- background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-}
-.progress-info .bar,
-.progress .bar-info {
- background-color: #4bb1cf;
-}
-.progress-info.progress-striped .bar,
-.progress-striped .bar-info {
- background-color: #5bc0de;
- background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
- background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-}
-.progress-warning .bar,
-.progress .bar-warning {
- background-color: #faa732;
-}
-.progress-warning.progress-striped .bar,
-.progress-striped .bar-warning {
- background-color: #fbb450;
- background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
- background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-}
-.accordion {
- margin-bottom: 1.7;
-}
-.accordion-group {
- margin-bottom: 2px;
- border: 1px solid #e5e5e5;
-}
-.accordion-heading {
- border-bottom: 0;
-}
-.accordion-heading .accordion-toggle {
- display: block;
- padding: 8px 15px;
-}
-.accordion-toggle {
- cursor: pointer;
-}
-.accordion-inner {
- padding: 9px 15px;
- border-top: 1px solid #e5e5e5;
-}
-.carousel {
- position: relative;
- margin-bottom: 1.7;
- line-height: 1;
-}
-.carousel-inner {
- overflow: hidden;
- width: 100%;
- position: relative;
-}
-.carousel-inner > .item {
- display: none;
- position: relative;
- -webkit-transition: 0.6s ease-in-out left;
- -moz-transition: 0.6s ease-in-out left;
- -o-transition: 0.6s ease-in-out left;
- transition: 0.6s ease-in-out left;
-}
-.carousel-inner > .item > img,
-.carousel-inner > .item > a > img {
- display: block;
- line-height: 1;
-}
-.carousel-inner > .active,
-.carousel-inner > .next,
-.carousel-inner > .prev {
- display: block;
-}
-.carousel-inner > .active {
- left: 0;
-}
-.carousel-inner > .next,
-.carousel-inner > .prev {
- position: absolute;
- top: 0;
- width: 100%;
-}
-.carousel-inner > .next {
- left: 100%;
-}
-.carousel-inner > .prev {
- left: -100%;
-}
-.carousel-inner > .next.left,
-.carousel-inner > .prev.right {
- left: 0;
-}
-.carousel-inner > .active.left {
- left: -100%;
-}
-.carousel-inner > .active.right {
- left: 100%;
-}
-.carousel-control {
- position: absolute;
- top: 40%;
- left: 15px;
- width: 40px;
- height: 40px;
- margin-top: -20px;
- font-size: 60px;
- font-weight: 100;
- line-height: 30px;
- color: #ffffff;
- text-align: center;
- background: #222222;
- border: 3px solid #ffffff;
- opacity: 0.5;
- filter: alpha(opacity=50);
-}
-.carousel-control.right {
- left: auto;
- right: 15px;
-}
-.carousel-control:hover,
-.carousel-control:focus {
- color: #ffffff;
- text-decoration: none;
- opacity: 0.9;
- filter: alpha(opacity=90);
-}
-.carousel-indicators {
- position: absolute;
- top: 15px;
- right: 15px;
- z-index: 5;
- margin: 0;
- list-style: none;
-}
-.carousel-indicators li {
- display: block;
- float: left;
- width: 10px;
- height: 10px;
- margin-left: 5px;
- text-indent: -999px;
- background-color: #ccc;
- background-color: rgba(255, 255, 255, 0.25);
-}
-.carousel-indicators .active {
- background-color: #fff;
-}
-.carousel-caption {
- position: absolute;
- left: 0;
- right: 0;
- bottom: 0;
- padding: 15px;
- background: #333333;
- background: rgba(0, 0, 0, 0.75);
-}
-.carousel-caption h4,
-.carousel-caption p {
- color: #ffffff;
- line-height: 1.7;
-}
-.carousel-caption h4 {
- margin: 0 0 5px;
-}
-.carousel-caption p {
- margin-bottom: 0;
-}
-.hero-unit {
- padding: 60px;
- margin-bottom: 30px;
- font-size: 18px;
- font-weight: 200;
- line-height: 2.55;
- color: inherit;
- background-color: #eeeeee;
-}
-.hero-unit h1 {
- margin-bottom: 0;
- font-size: 60px;
- line-height: 1;
- color: inherit;
- letter-spacing: -1px;
-}
-.hero-unit li {
- line-height: 2.55;
-}
-.pull-right {
- float: right;
-}
-.pull-left {
- float: left;
-}
-.hide {
- display: none;
-}
-.show {
- display: block;
-}
-.invisible {
- visibility: hidden;
-}
-.affix {
- position: fixed;
-} \ No newline at end of file
diff --git a/docs/theme/mkdocs/css/dockerfile_tutorial.css b/docs/theme/mkdocs/css/dockerfile_tutorial.css
deleted file mode 100644
index ac3f538f3e..0000000000
--- a/docs/theme/mkdocs/css/dockerfile_tutorial.css
+++ /dev/null
@@ -1,63 +0,0 @@
-pre {
- background-color: #F5F5F5;
- border: 1px solid rgba(0, 0, 0, 0.15);
- border-radius: 4px 4px 4px 4px;
- display: block;
- font-size: 13px;
- line-height: 20px;
- margin: 0 0 10px;
- padding: 9.5px;
- white-space: pre-wrap;
- word-break: break-all;
- word-wrap: break-word;
-}
-code, pre {
- border-radius: 3px 3px 3px 3px;
- color: #333333;
- font-family: Monaco,Menlo,Consolas,"Courier New",monospace;
- font-size: 12px;
- padding: 0 3px 2px;
-}
-
-.terminal {
- color: #AAAAAA;
- background-color: black;
-}
-
-.terminal span.command {
- color: white;
- font-weight: bold;
-}
-
-.error_input {
- border-color: #B94A48 !important;
- box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075) inset !important;
-}
-
-input.level {
- width: 150px;
- height: 2.5em;
- display: inline-block;
-}
-div.level_error {
- width: 300px;
- display: inline-block;
- padding: 7px 12px;
-}
-.alert {
- text-align:center;
-}
-#check_level_questions {
- margin-top: 10px;
-}
-.form-inline input.l_fill {
- height: 20px;
- border-radius: 0;
- width: 90px;
- margin-right: 0;
- padding: 0 0 2px 0;
-}
-.dockerfile.back {
- display: block;
- margin-top: 5px;
-} \ No newline at end of file
diff --git a/docs/theme/mkdocs/css/docs.css b/docs/theme/mkdocs/css/docs.css
deleted file mode 100644
index 767aa1f8e3..0000000000
--- a/docs/theme/mkdocs/css/docs.css
+++ /dev/null
@@ -1,364 +0,0 @@
-#top-header {
- margin-top: 26px;
- margin-bottom: 10px;
-}
-
-#top-header .header2 {
- font-weight: 400;
-}
-
-#usernav > ul {
- margin-top: 10px;
- z-index: 99999;
-}
-
-.menu-caption {
- padding-bottom: 10px;
-}
-
-#toc_table {
- margin-top: 10px;
-}
-
-#leftnav {
- height: 100%;
- overflow: hidden;
-}
-
-#leftnav .nav ul {
- line-height: 1;
- margin: 10px 10px 0px 16px;
- padding: 0;
- list-style: none;
-}
-#leftnav .nav li ul a,
-#leftnav .nav li ul a:hover {
- margin: 0 !important;
- padding: 0 !important;
- font-size: 13px;
- font-weight: 400;
- color: #394d54;
-}
-#leftnav .nav li ul a:hover {
- color: #24b8eb;
-}
-
-#leftnav .nav.nav-tabs li a,
-#leftnav .nav.nav-tabs li li {
- line-height: 1.1 !important;
-}
-
-#leftnav li {
- margin-top: 20px;
- // text-indent: -16px;
- padding-left: 10px;
-}
-#leftnav .nav-tabs.nav ul li {
- margin-top: 5px;
-}
-
-.content-body {
- padding: 0px 0px 0px 20px;
-}
-
-ol {
- padding-left: 22px;
-}
-
-ol li {
- margin: 8px;
-}
-
-pre {
- font-size: 12px;
- line-height: 1.5;
-}
-
-/* Main Navigation */
-#nav_menu > #docsnav {
- max-width: 940px;
- width: 940px;
- margin: 0 auto;
-}
-#nav_menu > #docsnav > #nav_search {
- margin-top: 10px;
-}
-.search_input:focus {
- background: #fff;
- outline: none;
-}
-#nav_menu > #docsnav > #main-nav {
- height: 50px;
- margin: 0px;
- padding: 0em;
-}
-#nav_menu > #docsnav > #main-nav > li > a {
- color: #253237;
-}
-#nav_menu > #docsnav > #main-nav > li.dd_on_hover {
- background: #d3f1fb;
- color: #253237;
-}
-#nav_menu > #docsnav > #main-nav > li > span > b {
- border-top-color: #b1d5df !important;
-}
-#nav_menu > #docsnav > #main-nav > li.dd_on_hover > span > b {
- border-top-color: #71afc0 !important;
-}
-#nav_menu > #docsnav > #main-nav > li form {
- margin-top: -12px;
-}
-#nav_menu > #docsnav > #main-nav > li.home > a {
- color: #fff;
-}
-#nav_menu > #docsnav > #main-nav > li.home:hover {
- background: #b1d5df;
-}
-#nav_menu > #docsnav > #main-nav > li.home:hover > a {
- color: #5992a3;
-}
-#nav_menu {
- background: #E8E8E8;
- position: relative;
- width: 100%;
- height: 54px;
- z-index: 1000;
- top: auto;
- padding: 0px 15px;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
-}
-#nav_menu #docsnav #main-nav > li {
- font-size: 15px;
- font-weight: 400;
- color: #253237;
- line-height: 2em;
- display: block;
- padding: 0 12px 0 12px;
- line-height: 54px;
- height: 54px;
-}
-#nav_menu #docsnav #main-nav > li.active {
- background: #ade5f9; /* url("../img/nav/caret-down-subnav-icon.svg") no-repeat 87% 50%;*/
-}
-#nav_menu #docsnav #main-nav > li.dd_on_hover {
- /*background: #ade5f9 url("../img/nav/caret-down-subnav-icon.svg") no-repeat 87% 50%;*/
-}
-#nav_search {
- padding-top: 2px;
-}
-#nav_search input[type="text"] {
- width: 220px;
- height: 30px;
- margin: 0;
- background: #ffffff url("../img/nav/search-icon.svg") no-repeat 95% 50%;
-}
-/* Navigation Submenu */
-.dd_menu {
- cursor: pointer;
-}
-.dd_menu .dd_submenu {
- display: none;
- position: absolute;
- top: 54px;
- list-style: none;
- margin: 0px;
- margin-left: -12px;
- overflow: hidden;
- overflow-y: auto;
- background: #fff;
- border: 1px solid #ccc;
- border-top: none;
- border-bottom: 3px solid #ccc;
- -webkit-border-radius: 0px 0px 4px 4px;
- -moz-border-radius: 0px 0px 4px 4px;
- border-radius: 0px 0px 4px 4px;
- padding: 0px;
-}
-.dd_menu.dd_on_hover .dd_submenu {
- display: block;
-}
-.dd_menu.dd_on_hover .dd_submenu > li:first-child {
- border: none;
-}
-.dd_menu.dd_on_hover .dd_submenu > li {
- border-top: 1px solid #ddd;
-}
-.dd_menu.dd_on_hover .dd_submenu > li.active > a {
- border-color: #b1d5df;
- color: #FF8100 !important;
-}
-.dd_menu.dd_on_hover .dd_submenu > li > a {
- padding: 0.6em 0.8em 0.4em 0.8em;
- width: 100%;
- display: block;
-}
-.dd_menu li a {
- font-size: 15px;
- font-weight: 400;
- color: #005976;
-}
-.dd_menu li a:hover {
- text-decoration: none;
- font-size: 15px;
- font-weight: 400;
- color: #24b8eb;
-}
-
-/* Search Page */
-#tipue_search_input {
- height: 30px;
- margin: 0;
- background: #ffffff url("../img/nav/search-icon.svg") no-repeat 95% 50%;
-}
-
-.alert-red-block {
- margin: 10px 0px;
- background: #edd3d7;
- border: none;
- margin-bottom: 20px;
-}
-
-.content-body ul {
- padding: 10px 0px 10px 20px;
- list-style-position: inherit;
- list-style: circle;
-}
-
-.content-body ul li {
- padding-bottom: 5px;
-}
-
-.content-body ul ul {
- padding: 10px 0px 10px 40px;
-}
-
-.content-body h1 {
- display: block !important;
- font-size: 27px;
- font-weight: 400;
- color: #394d54;
- line-height: 1.33;
- margin-bottom: 8px;
- margin-top: 6px;
-}
-
-.content-body h2 {
- font-size: 21px;
- font-weight: 400;
- color: #394d54;
- line-height: 1.7;
- margin-bottom: 4px;
- margin-top: 10px;
-}
-
-.content-body h3 {
- font-size: 18px;
- font-weight: 400;
- color: #394d54;
- line-height: 1.7;
- margin-bottom: 4px;
- margin-top: 10px;
-}
-
-.content-body h4 {
- font-size: 16px;
- font-weight: 400;
- color: #394d54;
- line-height: 1.7;
- margin-bottom: 4px;
- margin-top: 10px;
-}
-
-.content-body p {
- font-size: 14px;
- font-weight: 400;
- color: #394d54;
- line-height: 1.7;
-}
-
-.content-body p code {
- background-color: #FCFCFC;
- border-radius: 4px;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border: 1px solid #dbdde0;
- color: #394d54;
- padding-left: 6px;
- padding-right: 6px;
- margin-bottom: 2px;
-}
-
-.content-body blockquote {
- margin: 0px !important;
- margin-bottom: 20px !important;
- margin-top: 20px !important;
- font-size: 14px;
- font-weight: 400;
- color: #394d54;
- line-height: 1.7;
- font-style: italic;
- border: none;
- border-left: 4px solid #ade5f9;
- padding: 10px;
- padding-left: 15px;
-}
-
-.content-body ul {
- margin-top: 0px !important;
-}
-
-.content-body blockquote a {
- color: #24b8eb;
-}
-
-.content-body blockquote a:hover {
- color: #008bb8;
-}
-
-.content-body ul {
- margin-top: 0px !important;
-}
-
-.content-body pre {
- font-family: Monaco, Consolas, "Lucida Console", monospace;
- background-color: #FCFCFC;
- margin-bottom: 20px;
- border-radius: 4px;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- overflow-x: auto;
-}
-.content-body pre code {
- overflow-wrap: normal;
- white-space: pre;
-}
-
-.content-body strong {
- font-weight: bold;
-}
-
-/* Logged-in/out header */
-.topmostnav_loggedin {
- display: none;
-}
-#topmostnav.public .brand {
- padding-left: 0px !important;
-}
-.navbar #usernav .nav li {
- padding-top: 0px !important;
-}
-table.table tr td img {
- width:100%;
-}
-#versionnav ul {
- list-style: none outside none;
-}
-#versionnav ul ul {
- padding: 0;
-}
-
-/* over-ride the prettyPrint colouring */
-
-.str, .atv { color: #48484C; }
diff --git a/docs/theme/mkdocs/css/font/FontAwesome.otf b/docs/theme/mkdocs/css/font/FontAwesome.otf
deleted file mode 100644
index 4dfe30ac7a..0000000000
--- a/docs/theme/mkdocs/css/font/FontAwesome.otf
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/css/font/fontawesome-webfont.eot b/docs/theme/mkdocs/css/font/fontawesome-webfont.eot
deleted file mode 100755
index e054c93d18..0000000000
--- a/docs/theme/mkdocs/css/font/fontawesome-webfont.eot
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/css/font/fontawesome-webfont.svg b/docs/theme/mkdocs/css/font/fontawesome-webfont.svg
deleted file mode 100755
index 36d43b844a..0000000000
--- a/docs/theme/mkdocs/css/font/fontawesome-webfont.svg
+++ /dev/null
@@ -1,414 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
-<svg xmlns="http://www.w3.org/2000/svg">
-<metadata></metadata>
-<defs>
-<font id="fontawesomeregular" horiz-adv-x="1536" >
-<font-face units-per-em="1792" ascent="1536" descent="-256" />
-<missing-glyph horiz-adv-x="448" />
-<glyph unicode=" " horiz-adv-x="448" />
-<glyph unicode="&#x09;" horiz-adv-x="448" />
-<glyph unicode="&#xa0;" horiz-adv-x="448" />
-<glyph unicode="&#xa8;" horiz-adv-x="1792" />
-<glyph unicode="&#xa9;" horiz-adv-x="1792" />
-<glyph unicode="&#xae;" horiz-adv-x="1792" />
-<glyph unicode="&#xb4;" horiz-adv-x="1792" />
-<glyph unicode="&#xc6;" horiz-adv-x="1792" />
-<glyph unicode="&#x2000;" horiz-adv-x="768" />
-<glyph unicode="&#x2001;" />
-<glyph unicode="&#x2002;" horiz-adv-x="768" />
-<glyph unicode="&#x2003;" />
-<glyph unicode="&#x2004;" horiz-adv-x="512" />
-<glyph unicode="&#x2005;" horiz-adv-x="384" />
-<glyph unicode="&#x2006;" horiz-adv-x="256" />
-<glyph unicode="&#x2007;" horiz-adv-x="256" />
-<glyph unicode="&#x2008;" horiz-adv-x="192" />
-<glyph unicode="&#x2009;" horiz-adv-x="307" />
-<glyph unicode="&#x200a;" horiz-adv-x="85" />
-<glyph unicode="&#x202f;" horiz-adv-x="307" />
-<glyph unicode="&#x205f;" horiz-adv-x="384" />
-<glyph unicode="&#x2122;" horiz-adv-x="1792" />
-<glyph unicode="&#x221e;" horiz-adv-x="1792" />
-<glyph unicode="&#x2260;" horiz-adv-x="1792" />
-<glyph unicode="&#xe000;" horiz-adv-x="500" d="M0 0z" />
-<glyph unicode="&#xf000;" horiz-adv-x="1792" d="M1699 1350q0 -35 -43 -78l-632 -632v-768h320q26 0 45 -19t19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45t45 19h320v768l-632 632q-43 43 -43 78q0 23 18 36.5t38 17.5t43 4h1408q23 0 43 -4t38 -17.5t18 -36.5z" />
-<glyph unicode="&#xf001;" d="M1536 1312v-1120q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v537l-768 -237v-709q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89 t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v967q0 31 19 56.5t49 35.5l832 256q12 4 28 4q40 0 68 -28t28 -68z" />
-<glyph unicode="&#xf002;" horiz-adv-x="1664" d="M1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -52 -38 -90t-90 -38q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5 t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
-<glyph unicode="&#xf003;" horiz-adv-x="1792" d="M1664 32v768q-32 -36 -69 -66q-268 -206 -426 -338q-51 -43 -83 -67t-86.5 -48.5t-102.5 -24.5h-1h-1q-48 0 -102.5 24.5t-86.5 48.5t-83 67q-158 132 -426 338q-37 30 -69 66v-768q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1664 1083v11v13.5t-0.5 13 t-3 12.5t-5.5 9t-9 7.5t-14 2.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5q0 -168 147 -284q193 -152 401 -317q6 -5 35 -29.5t46 -37.5t44.5 -31.5t50.5 -27.5t43 -9h1h1q20 0 43 9t50.5 27.5t44.5 31.5t46 37.5t35 29.5q208 165 401 317q54 43 100.5 115.5t46.5 131.5z M1792 1120v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" />
-<glyph unicode="&#xf004;" horiz-adv-x="1792" d="M896 -128q-26 0 -44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600 q-18 -18 -44 -18z" />
-<glyph unicode="&#xf005;" horiz-adv-x="1664" d="M1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -21 -10.5 -35.5t-30.5 -14.5q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455 l502 -73q56 -9 56 -46z" />
-<glyph unicode="&#xf006;" horiz-adv-x="1664" d="M1137 532l306 297l-422 62l-189 382l-189 -382l-422 -62l306 -297l-73 -421l378 199l377 -199zM1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500 l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46z" />
-<glyph unicode="&#xf007;" horiz-adv-x="1408" d="M1408 131q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q9 0 42 -21.5t74.5 -48t108 -48t133.5 -21.5t133.5 21.5t108 48t74.5 48t42 21.5q61 0 111.5 -20t85.5 -53.5t62 -81 t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" />
-<glyph unicode="&#xf008;" horiz-adv-x="1920" d="M384 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 320v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 704v128q0 26 -19 45t-45 19h-128 q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 -64v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM384 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45 t45 -19h128q26 0 45 19t19 45zM1792 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 704v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1792 320v128 q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 704v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19 t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1920 1248v-1344q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1344q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
-<glyph unicode="&#xf009;" horiz-adv-x="1664" d="M768 512v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM768 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 512v-384q0 -52 -38 -90t-90 -38 h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
-<glyph unicode="&#xf00a;" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 288v-192q0 -40 -28 -68t-68 -28h-320 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68z" />
-<glyph unicode="&#xf00b;" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-960 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h960q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68z" />
-<glyph unicode="&#xf00c;" horiz-adv-x="1792" d="M1671 970q0 -40 -28 -68l-724 -724l-136 -136q-28 -28 -68 -28t-68 28l-136 136l-362 362q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -295l656 657q28 28 68 28t68 -28l136 -136q28 -28 28 -68z" />
-<glyph unicode="&#xf00d;" horiz-adv-x="1408" d="M1298 214q0 -40 -28 -68l-136 -136q-28 -28 -68 -28t-68 28l-294 294l-294 -294q-28 -28 -68 -28t-68 28l-136 136q-28 28 -28 68t28 68l294 294l-294 294q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -294l294 294q28 28 68 28t68 -28l136 -136q28 -28 28 -68 t-28 -68l-294 -294l294 -294q28 -28 28 -68z" />
-<glyph unicode="&#xf00e;" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-224q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v224h-224q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h224v224q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-224h224 q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5 t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
-<glyph unicode="&#xf010;" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5z M1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z " />
-<glyph unicode="&#xf011;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61t-298 61t-245 164t-164 245t-61 298q0 182 80.5 343t226.5 270q43 32 95.5 25t83.5 -50q32 -42 24.5 -94.5t-49.5 -84.5q-98 -74 -151.5 -181t-53.5 -228q0 -104 40.5 -198.5t109.5 -163.5t163.5 -109.5 t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5q0 121 -53.5 228t-151.5 181q-42 32 -49.5 84.5t24.5 94.5q31 43 84 50t95 -25q146 -109 226.5 -270t80.5 -343zM896 1408v-640q0 -52 -38 -90t-90 -38t-90 38t-38 90v640q0 52 38 90t90 38t90 -38t38 -90z" />
-<glyph unicode="&#xf012;" horiz-adv-x="1792" d="M256 96v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 224v-320q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 480v-576q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1408 864v-960q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1376v-1472q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1472q0 14 9 23t23 9h192q14 0 23 -9t9 -23z" />
-<glyph unicode="&#xf013;" d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1536 749v-222q0 -12 -8 -23t-20 -13l-185 -28q-19 -54 -39 -91q35 -50 107 -138q10 -12 10 -25t-9 -23q-27 -37 -99 -108t-94 -71q-12 0 -26 9l-138 108q-44 -23 -91 -38 q-16 -136 -29 -186q-7 -28 -36 -28h-222q-14 0 -24.5 8.5t-11.5 21.5l-28 184q-49 16 -90 37l-141 -107q-10 -9 -25 -9q-14 0 -25 11q-126 114 -165 168q-7 10 -7 23q0 12 8 23q15 21 51 66.5t54 70.5q-27 50 -41 99l-183 27q-13 2 -21 12.5t-8 23.5v222q0 12 8 23t19 13 l186 28q14 46 39 92q-40 57 -107 138q-10 12 -10 24q0 10 9 23q26 36 98.5 107.5t94.5 71.5q13 0 26 -10l138 -107q44 23 91 38q16 136 29 186q7 28 36 28h222q14 0 24.5 -8.5t11.5 -21.5l28 -184q49 -16 90 -37l142 107q9 9 24 9q13 0 25 -10q129 -119 165 -170q7 -8 7 -22 q0 -12 -8 -23q-15 -21 -51 -66.5t-54 -70.5q26 -50 41 -98l183 -28q13 -2 21 -12.5t8 -23.5z" />
-<glyph unicode="&#xf014;" horiz-adv-x="1408" d="M512 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM768 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1024 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1152 76v948h-896v-948q0 -22 7 -40.5t14.5 -27t10.5 -8.5h832q3 0 10.5 8.5t14.5 27t7 40.5zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832 q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" />
-<glyph unicode="&#xf015;" horiz-adv-x="1664" d="M1408 544v-480q0 -26 -19 -45t-45 -19h-384v384h-256v-384h-384q-26 0 -45 19t-19 45v480q0 1 0.5 3t0.5 3l575 474l575 -474q1 -2 1 -6zM1631 613l-62 -74q-8 -9 -21 -11h-3q-13 0 -21 7l-692 577l-692 -577q-12 -8 -24 -7q-13 2 -21 11l-62 74q-8 10 -7 23.5t11 21.5 l719 599q32 26 76 26t76 -26l244 -204v195q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-408l219 -182q10 -8 11 -21.5t-7 -23.5z" />
-<glyph unicode="&#xf016;" horiz-adv-x="1280" d="M128 0h1024v768h-416q-40 0 -68 28t-28 68v416h-512v-1280zM768 896h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376zM1280 864v-896q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h640q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88z " />
-<glyph unicode="&#xf017;" d="M896 992v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf018;" horiz-adv-x="1920" d="M1111 540v4l-24 320q-1 13 -11 22.5t-23 9.5h-186q-13 0 -23 -9.5t-11 -22.5l-24 -320v-4q-1 -12 8 -20t21 -8h244q12 0 21 8t8 20zM1870 73q0 -73 -46 -73h-704q13 0 22 9.5t8 22.5l-20 256q-1 13 -11 22.5t-23 9.5h-272q-13 0 -23 -9.5t-11 -22.5l-20 -256 q-1 -13 8 -22.5t22 -9.5h-704q-46 0 -46 73q0 54 26 116l417 1044q8 19 26 33t38 14h339q-13 0 -23 -9.5t-11 -22.5l-15 -192q-1 -14 8 -23t22 -9h166q13 0 22 9t8 23l-15 192q-1 13 -11 22.5t-23 9.5h339q20 0 38 -14t26 -33l417 -1044q26 -62 26 -116z" />
-<glyph unicode="&#xf019;" horiz-adv-x="1664" d="M1280 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 416v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h465l135 -136 q58 -56 136 -56t136 56l136 136h464q40 0 68 -28t28 -68zM1339 985q17 -41 -14 -70l-448 -448q-18 -19 -45 -19t-45 19l-448 448q-31 29 -14 70q17 39 59 39h256v448q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-448h256q42 0 59 -39z" />
-<glyph unicode="&#xf01a;" d="M1120 608q0 -12 -10 -24l-319 -319q-11 -9 -23 -9t-23 9l-320 320q-15 16 -7 35q8 20 30 20h192v352q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-352h192q14 0 23 -9t9 -23zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273 t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf01b;" d="M1118 660q-8 -20 -30 -20h-192v-352q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v352h-192q-14 0 -23 9t-9 23q0 12 10 24l319 319q11 9 23 9t23 -9l320 -320q15 -16 7 -35zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198 t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf01c;" d="M1023 576h316q-1 3 -2.5 8t-2.5 8l-212 496h-708l-212 -496q-1 -2 -2.5 -8t-2.5 -8h316l95 -192h320zM1536 546v-482q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v482q0 62 25 123l238 552q10 25 36.5 42t52.5 17h832q26 0 52.5 -17t36.5 -42l238 -552 q25 -61 25 -123z" />
-<glyph unicode="&#xf01d;" d="M1184 640q0 -37 -32 -55l-544 -320q-15 -9 -32 -9q-16 0 -32 8q-32 19 -32 56v640q0 37 32 56q33 18 64 -1l544 -320q32 -18 32 -55zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf01e;" d="M1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l138 138q-148 137 -349 137q-104 0 -198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5q119 0 225 52t179 147q7 10 23 12q14 0 25 -9 l137 -138q9 -8 9.5 -20.5t-7.5 -22.5q-109 -132 -264 -204.5t-327 -72.5q-156 0 -298 61t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q147 0 284.5 -55.5t244.5 -156.5l130 129q29 31 70 14q39 -17 39 -59z" />
-<glyph unicode="&#xf021;" d="M1511 480q0 -5 -1 -7q-64 -268 -268 -434.5t-478 -166.5q-146 0 -282.5 55t-243.5 157l-129 -129q-19 -19 -45 -19t-45 19t-19 45v448q0 26 19 45t45 19h448q26 0 45 -19t19 -45t-19 -45l-137 -137q71 -66 161 -102t187 -36q134 0 250 65t186 179q11 17 53 117 q8 23 30 23h192q13 0 22.5 -9.5t9.5 -22.5zM1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-26 0 -45 19t-19 45t19 45l138 138q-148 137 -349 137q-134 0 -250 -65t-186 -179q-11 -17 -53 -117q-8 -23 -30 -23h-199q-13 0 -22.5 9.5t-9.5 22.5v7q65 268 270 434.5t480 166.5 q146 0 284 -55.5t245 -156.5l130 129q19 19 45 19t45 -19t19 -45z" />
-<glyph unicode="&#xf022;" horiz-adv-x="1792" d="M384 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M384 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1536 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5z M1536 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5zM1536 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5 t9.5 -22.5zM1664 160v832q0 13 -9.5 22.5t-22.5 9.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1792 1248v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47 t47 -113z" />
-<glyph unicode="&#xf023;" horiz-adv-x="1152" d="M320 768h512v192q0 106 -75 181t-181 75t-181 -75t-75 -181v-192zM1152 672v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v192q0 184 132 316t316 132t316 -132t132 -316v-192h32q40 0 68 -28t28 -68z" />
-<glyph unicode="&#xf024;" horiz-adv-x="1792" d="M320 1280q0 -72 -64 -110v-1266q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v1266q-64 38 -64 110q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -25 -12.5 -38.5t-39.5 -27.5q-215 -116 -369 -116q-61 0 -123.5 22t-108.5 48 t-115.5 48t-142.5 22q-192 0 -464 -146q-17 -9 -33 -9q-26 0 -45 19t-19 45v742q0 32 31 55q21 14 79 43q236 120 421 120q107 0 200 -29t219 -88q38 -19 88 -19q54 0 117.5 21t110 47t88 47t54.5 21q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf025;" horiz-adv-x="1664" d="M1664 650q0 -166 -60 -314l-20 -49l-185 -33q-22 -83 -90.5 -136.5t-156.5 -53.5v-32q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-32q71 0 130 -35.5t93 -95.5l68 12q29 95 29 193q0 148 -88 279t-236.5 209t-315.5 78 t-315.5 -78t-236.5 -209t-88 -279q0 -98 29 -193l68 -12q34 60 93 95.5t130 35.5v32q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v32q-88 0 -156.5 53.5t-90.5 136.5l-185 33l-20 49q-60 148 -60 314q0 151 67 291t179 242.5 t266 163.5t320 61t320 -61t266 -163.5t179 -242.5t67 -291z" />
-<glyph unicode="&#xf026;" horiz-adv-x="768" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45z" />
-<glyph unicode="&#xf027;" horiz-adv-x="1152" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142z" />
-<glyph unicode="&#xf028;" horiz-adv-x="1664" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142zM1408 640q0 -153 -85 -282.5t-225 -188.5q-13 -5 -25 -5q-27 0 -46 19t-19 45q0 39 39 59q56 29 76 44q74 54 115.5 135.5t41.5 173.5t-41.5 173.5 t-115.5 135.5q-20 15 -76 44q-39 20 -39 59q0 26 19 45t45 19q13 0 26 -5q140 -59 225 -188.5t85 -282.5zM1664 640q0 -230 -127 -422.5t-338 -283.5q-13 -5 -26 -5q-26 0 -45 19t-19 45q0 36 39 59q7 4 22.5 10.5t22.5 10.5q46 25 82 51q123 91 192 227t69 289t-69 289 t-192 227q-36 26 -82 51q-7 4 -22.5 10.5t-22.5 10.5q-39 23 -39 59q0 26 19 45t45 19q13 0 26 -5q211 -91 338 -283.5t127 -422.5z" />
-<glyph unicode="&#xf029;" horiz-adv-x="1408" d="M384 384v-128h-128v128h128zM384 1152v-128h-128v128h128zM1152 1152v-128h-128v128h128zM128 129h384v383h-384v-383zM128 896h384v384h-384v-384zM896 896h384v384h-384v-384zM640 640v-640h-640v640h640zM1152 128v-128h-128v128h128zM1408 128v-128h-128v128h128z M1408 640v-384h-384v128h-128v-384h-128v640h384v-128h128v128h128zM640 1408v-640h-640v640h640zM1408 1408v-640h-640v640h640z" />
-<glyph unicode="&#xf02a;" horiz-adv-x="1792" d="M63 0h-63v1408h63v-1408zM126 1h-32v1407h32v-1407zM220 1h-31v1407h31v-1407zM377 1h-31v1407h31v-1407zM534 1h-62v1407h62v-1407zM660 1h-31v1407h31v-1407zM723 1h-31v1407h31v-1407zM786 1h-31v1407h31v-1407zM943 1h-63v1407h63v-1407zM1100 1h-63v1407h63v-1407z M1226 1h-63v1407h63v-1407zM1352 1h-63v1407h63v-1407zM1446 1h-63v1407h63v-1407zM1635 1h-94v1407h94v-1407zM1698 1h-32v1407h32v-1407zM1792 0h-63v1408h63v-1408z" />
-<glyph unicode="&#xf02b;" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91z" />
-<glyph unicode="&#xf02c;" horiz-adv-x="1920" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91zM1899 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-36 0 -59 14t-53 45l470 470q37 37 37 90q0 52 -37 91l-715 714q-38 38 -102 64.5t-117 26.5h224q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91z" />
-<glyph unicode="&#xf02d;" horiz-adv-x="1664" d="M1639 1058q40 -57 18 -129l-275 -906q-19 -64 -76.5 -107.5t-122.5 -43.5h-923q-77 0 -148.5 53.5t-99.5 131.5q-24 67 -2 127q0 4 3 27t4 37q1 8 -3 21.5t-3 19.5q2 11 8 21t16.5 23.5t16.5 23.5q23 38 45 91.5t30 91.5q3 10 0.5 30t-0.5 28q3 11 17 28t17 23 q21 36 42 92t25 90q1 9 -2.5 32t0.5 28q4 13 22 30.5t22 22.5q19 26 42.5 84.5t27.5 96.5q1 8 -3 25.5t-2 26.5q2 8 9 18t18 23t17 21q8 12 16.5 30.5t15 35t16 36t19.5 32t26.5 23.5t36 11.5t47.5 -5.5l-1 -3q38 9 51 9h761q74 0 114 -56t18 -130l-274 -906 q-36 -119 -71.5 -153.5t-128.5 -34.5h-869q-27 0 -38 -15q-11 -16 -1 -43q24 -70 144 -70h923q29 0 56 15.5t35 41.5l300 987q7 22 5 57q38 -15 59 -43zM575 1056q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5 t-16.5 -22.5zM492 800q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5z" />
-<glyph unicode="&#xf02e;" horiz-adv-x="1280" d="M1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
-<glyph unicode="&#xf02f;" horiz-adv-x="1664" d="M384 0h896v256h-896v-256zM384 640h896v384h-160q-40 0 -68 28t-28 68v160h-640v-640zM1536 576q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 576v-416q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-160q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68 v160h-224q-13 0 -22.5 9.5t-9.5 22.5v416q0 79 56.5 135.5t135.5 56.5h64v544q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-256h64q79 0 135.5 -56.5t56.5 -135.5z" />
-<glyph unicode="&#xf030;" horiz-adv-x="1920" d="M960 864q119 0 203.5 -84.5t84.5 -203.5t-84.5 -203.5t-203.5 -84.5t-203.5 84.5t-84.5 203.5t84.5 203.5t203.5 84.5zM1664 1280q106 0 181 -75t75 -181v-896q0 -106 -75 -181t-181 -75h-1408q-106 0 -181 75t-75 181v896q0 106 75 181t181 75h224l51 136 q19 49 69.5 84.5t103.5 35.5h512q53 0 103.5 -35.5t69.5 -84.5l51 -136h224zM960 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
-<glyph unicode="&#xf031;" horiz-adv-x="1664" d="M725 977l-170 -450q73 -1 153.5 -2t119 -1.5t52.5 -0.5l29 2q-32 95 -92 241q-53 132 -92 211zM21 -128h-21l2 79q22 7 80 18q89 16 110 31q20 16 48 68l237 616l280 724h75h53l11 -21l205 -480q103 -242 124 -297q39 -102 96 -235q26 -58 65 -164q24 -67 65 -149 q22 -49 35 -57q22 -19 69 -23q47 -6 103 -27q6 -39 6 -57q0 -14 -1 -26q-80 0 -192 8q-93 8 -189 8q-79 0 -135 -2l-200 -11l-58 -2q0 45 4 78l131 28q56 13 68 23q12 12 12 27t-6 32l-47 114l-92 228l-450 2q-29 -65 -104 -274q-23 -64 -23 -84q0 -31 17 -43 q26 -21 103 -32q3 0 13.5 -2t30 -5t40.5 -6q1 -28 1 -58q0 -17 -2 -27q-66 0 -349 20l-48 -8q-81 -14 -167 -14z" />
-<glyph unicode="&#xf032;" horiz-adv-x="1408" d="M555 15q76 -32 140 -32q131 0 216 41t122 113q38 70 38 181q0 114 -41 180q-58 94 -141 126q-80 32 -247 32q-74 0 -101 -10v-144l-1 -173l3 -270q0 -15 12 -44zM541 761q43 -7 109 -7q175 0 264 65t89 224q0 112 -85 187q-84 75 -255 75q-52 0 -130 -13q0 -44 2 -77 q7 -122 6 -279l-1 -98q0 -43 1 -77zM0 -128l2 94q45 9 68 12q77 12 123 31q17 27 21 51q9 66 9 194l-2 497q-5 256 -9 404q-1 87 -11 109q-1 4 -12 12q-18 12 -69 15q-30 2 -114 13l-4 83l260 6l380 13l45 1q5 0 14 0.5t14 0.5q1 0 21.5 -0.5t40.5 -0.5h74q88 0 191 -27 q43 -13 96 -39q57 -29 102 -76q44 -47 65 -104t21 -122q0 -70 -32 -128t-95 -105q-26 -20 -150 -77q177 -41 267 -146q92 -106 92 -236q0 -76 -29 -161q-21 -62 -71 -117q-66 -72 -140 -108q-73 -36 -203 -60q-82 -15 -198 -11l-197 4q-84 2 -298 -11q-33 -3 -272 -11z" />
-<glyph unicode="&#xf033;" horiz-adv-x="1024" d="M0 -126l17 85q4 1 77 20q76 19 116 39q29 37 41 101l27 139l56 268l12 64q8 44 17 84.5t16 67t12.5 46.5t9 30.5t3.5 11.5l29 157l16 63l22 135l8 50v38q-41 22 -144 28q-28 2 -38 4l19 103l317 -14q39 -2 73 -2q66 0 214 9q33 2 68 4.5t36 2.5q-2 -19 -6 -38 q-7 -29 -13 -51q-55 -19 -109 -31q-64 -16 -101 -31q-12 -31 -24 -88q-9 -44 -13 -82q-44 -199 -66 -306l-61 -311l-38 -158l-43 -235l-12 -45q-2 -7 1 -27q64 -15 119 -21q36 -5 66 -10q-1 -29 -7 -58q-7 -31 -9 -41q-18 0 -23 -1q-24 -2 -42 -2q-9 0 -28 3q-19 4 -145 17 l-198 2q-41 1 -174 -11q-74 -7 -98 -9z" />
-<glyph unicode="&#xf034;" horiz-adv-x="1792" d="M81 1407l54 -27q20 -5 211 -5h130l19 3l115 1l215 -1h293l34 -2q14 -1 28 7t21 16l7 8l42 1q15 0 28 -1v-104.5t1 -131.5l1 -100l-1 -58q0 -32 -4 -51q-39 -15 -68 -18q-25 43 -54 128q-8 24 -15.5 62.5t-11.5 65.5t-6 29q-13 15 -27 19q-7 2 -42.5 2t-103.5 -1t-111 -1 q-34 0 -67 -5q-10 -97 -8 -136l1 -152v-332l3 -359l-1 -147q-1 -46 11 -85q49 -25 89 -32q2 0 18 -5t44 -13t43 -12q30 -8 50 -18q5 -45 5 -50q0 -10 -3 -29q-14 -1 -34 -1q-110 0 -187 10q-72 8 -238 8q-88 0 -233 -14q-48 -4 -70 -4q-2 22 -2 26l-1 26v9q21 33 79 49 q139 38 159 50q9 21 12 56q8 192 6 433l-5 428q-1 62 -0.5 118.5t0.5 102.5t-2 57t-6 15q-6 5 -14 6q-38 6 -148 6q-43 0 -100 -13.5t-73 -24.5q-13 -9 -22 -33t-22 -75t-24 -84q-6 -19 -19.5 -32t-20.5 -13q-44 27 -56 44v297v86zM1744 128q33 0 42 -18.5t-11 -44.5 l-126 -162q-20 -26 -49 -26t-49 26l-126 162q-20 26 -11 44.5t42 18.5h80v1024h-80q-33 0 -42 18.5t11 44.5l126 162q20 26 49 26t49 -26l126 -162q20 -26 11 -44.5t-42 -18.5h-80v-1024h80z" />
-<glyph unicode="&#xf035;" d="M81 1407l54 -27q20 -5 211 -5h130l19 3l115 1l446 -1h318l34 -2q14 -1 28 7t21 16l7 8l42 1q15 0 28 -1v-104.5t1 -131.5l1 -100l-1 -58q0 -32 -4 -51q-39 -15 -68 -18q-25 43 -54 128q-8 24 -15.5 62.5t-11.5 65.5t-6 29q-13 15 -27 19q-7 2 -58.5 2t-138.5 -1t-128 -1 q-94 0 -127 -5q-10 -97 -8 -136l1 -152v52l3 -359l-1 -147q-1 -46 11 -85q49 -25 89 -32q2 0 18 -5t44 -13t43 -12q30 -8 50 -18q5 -45 5 -50q0 -10 -3 -29q-14 -1 -34 -1q-110 0 -187 10q-72 8 -238 8q-82 0 -233 -13q-45 -5 -70 -5q-2 22 -2 26l-1 26v9q21 33 79 49 q139 38 159 50q9 21 12 56q6 137 6 433l-5 44q0 265 -2 278q-2 11 -6 15q-6 5 -14 6q-38 6 -148 6q-50 0 -168.5 -14t-132.5 -24q-13 -9 -22 -33t-22 -75t-24 -84q-6 -19 -19.5 -32t-20.5 -13q-44 27 -56 44v297v86zM1505 113q26 -20 26 -49t-26 -49l-162 -126 q-26 -20 -44.5 -11t-18.5 42v80h-1024v-80q0 -33 -18.5 -42t-44.5 11l-162 126q-26 20 -26 49t26 49l162 126q26 20 44.5 11t18.5 -42v-80h1024v80q0 33 18.5 42t44.5 -11z" />
-<glyph unicode="&#xf036;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf037;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h896q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45t-45 -19 h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h640q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf038;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf039;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf03a;" horiz-adv-x="1792" d="M256 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM256 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5 t9.5 -22.5zM256 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344 q13 0 22.5 -9.5t9.5 -22.5zM256 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192 q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5z" />
-<glyph unicode="&#xf03b;" horiz-adv-x="1792" d="M384 992v-576q0 -13 -9.5 -22.5t-22.5 -9.5q-14 0 -23 9l-288 288q-9 9 -9 23t9 23l288 288q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
-<glyph unicode="&#xf03c;" horiz-adv-x="1792" d="M352 704q0 -14 -9 -23l-288 -288q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v576q0 13 9.5 22.5t22.5 9.5q14 0 23 -9l288 -288q9 -9 9 -23zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
-<glyph unicode="&#xf03d;" horiz-adv-x="1792" d="M1792 1184v-1088q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-403 403v-166q0 -119 -84.5 -203.5t-203.5 -84.5h-704q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h704q119 0 203.5 -84.5t84.5 -203.5v-165l403 402q18 19 45 19q12 0 25 -5 q39 -17 39 -59z" />
-<glyph unicode="&#xf03e;" horiz-adv-x="1920" d="M640 960q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 576v-448h-1408v192l320 320l160 -160l512 512zM1760 1280h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216 q0 13 -9.5 22.5t-22.5 9.5zM1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
-<glyph unicode="&#xf040;" d="M363 0l91 91l-235 235l-91 -91v-107h128v-128h107zM886 928q0 22 -22 22q-10 0 -17 -7l-542 -542q-7 -7 -7 -17q0 -22 22 -22q10 0 17 7l542 542q7 7 7 17zM832 1120l416 -416l-832 -832h-416v416zM1515 1024q0 -53 -37 -90l-166 -166l-416 416l166 165q36 38 90 38 q53 0 91 -38l235 -234q37 -39 37 -91z" />
-<glyph unicode="&#xf041;" horiz-adv-x="1024" d="M768 896q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1024 896q0 -109 -33 -179l-364 -774q-16 -33 -47.5 -52t-67.5 -19t-67.5 19t-46.5 52l-365 774q-33 70 -33 179q0 212 150 362t362 150t362 -150t150 -362z" />
-<glyph unicode="&#xf042;" d="M768 96v1088q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf043;" horiz-adv-x="1024" d="M512 384q0 36 -20 69q-1 1 -15.5 22.5t-25.5 38t-25 44t-21 50.5q-4 16 -21 16t-21 -16q-7 -23 -21 -50.5t-25 -44t-25.5 -38t-15.5 -22.5q-20 -33 -20 -69q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 512q0 -212 -150 -362t-362 -150t-362 150t-150 362 q0 145 81 275q6 9 62.5 90.5t101 151t99.5 178t83 201.5q9 30 34 47t51 17t51.5 -17t33.5 -47q28 -93 83 -201.5t99.5 -178t101 -151t62.5 -90.5q81 -127 81 -275z" />
-<glyph unicode="&#xf044;" horiz-adv-x="1792" d="M888 352l116 116l-152 152l-116 -116v-56h96v-96h56zM1328 1072q-16 16 -33 -1l-350 -350q-17 -17 -1 -33t33 1l350 350q17 17 1 33zM1408 478v-190q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-14 -14 -32 -8q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v126q0 13 9 22l64 64q15 15 35 7t20 -29zM1312 1216l288 -288l-672 -672h-288v288zM1756 1084l-92 -92 l-288 288l92 92q28 28 68 28t68 -28l152 -152q28 -28 28 -68t-28 -68z" />
-<glyph unicode="&#xf045;" horiz-adv-x="1664" d="M1408 547v-259q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h255v0q13 0 22.5 -9.5t9.5 -22.5q0 -27 -26 -32q-77 -26 -133 -60q-10 -4 -16 -4h-112q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832 q66 0 113 47t47 113v214q0 19 18 29q28 13 54 37q16 16 35 8q21 -9 21 -29zM1645 1043l-384 -384q-18 -19 -45 -19q-12 0 -25 5q-39 17 -39 59v192h-160q-323 0 -438 -131q-119 -137 -74 -473q3 -23 -20 -34q-8 -2 -12 -2q-16 0 -26 13q-10 14 -21 31t-39.5 68.5t-49.5 99.5 t-38.5 114t-17.5 122q0 49 3.5 91t14 90t28 88t47 81.5t68.5 74t94.5 61.5t124.5 48.5t159.5 30.5t196.5 11h160v192q0 42 39 59q13 5 25 5q26 0 45 -19l384 -384q19 -19 19 -45t-19 -45z" />
-<glyph unicode="&#xf046;" horiz-adv-x="1664" d="M1408 606v-318q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-10 -10 -23 -10q-3 0 -9 2q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832 q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v254q0 13 9 22l64 64q10 10 23 10q6 0 12 -3q20 -8 20 -29zM1639 1095l-814 -814q-24 -24 -57 -24t-57 24l-430 430q-24 24 -24 57t24 57l110 110q24 24 57 24t57 -24l263 -263l647 647q24 24 57 24t57 -24l110 -110 q24 -24 24 -57t-24 -57z" />
-<glyph unicode="&#xf047;" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-384v-384h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v384h-384v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45 t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h384v384h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-384h384v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
-<glyph unicode="&#xf048;" horiz-adv-x="1024" d="M979 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19z" />
-<glyph unicode="&#xf049;" horiz-adv-x="1792" d="M1747 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19l710 710 q19 19 32 13t13 -32v-710q4 11 13 19z" />
-<glyph unicode="&#xf04a;" horiz-adv-x="1664" d="M1619 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-8 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-19 19 -19 45t19 45l710 710q19 19 32 13t13 -32v-710q5 11 13 19z" />
-<glyph unicode="&#xf04b;" horiz-adv-x="1408" d="M1384 609l-1328 -738q-23 -13 -39.5 -3t-16.5 36v1472q0 26 16.5 36t39.5 -3l1328 -738q23 -13 23 -31t-23 -31z" />
-<glyph unicode="&#xf04c;" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45zM640 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf04d;" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf04e;" horiz-adv-x="1664" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q19 -19 19 -45t-19 -45l-710 -710q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" />
-<glyph unicode="&#xf050;" horiz-adv-x="1792" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19l-710 -710 q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" />
-<glyph unicode="&#xf051;" horiz-adv-x="1024" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19z" />
-<glyph unicode="&#xf052;" horiz-adv-x="1538" d="M14 557l710 710q19 19 45 19t45 -19l710 -710q19 -19 13 -32t-32 -13h-1472q-26 0 -32 13t13 32zM1473 0h-1408q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19z" />
-<glyph unicode="&#xf053;" horiz-adv-x="1152" d="M742 -37l-652 651q-37 37 -37 90.5t37 90.5l652 651q37 37 90.5 37t90.5 -37l75 -75q37 -37 37 -90.5t-37 -90.5l-486 -486l486 -485q37 -38 37 -91t-37 -90l-75 -75q-37 -37 -90.5 -37t-90.5 37z" />
-<glyph unicode="&#xf054;" horiz-adv-x="1152" d="M1099 704q0 -52 -37 -91l-652 -651q-37 -37 -90 -37t-90 37l-76 75q-37 39 -37 91q0 53 37 90l486 486l-486 485q-37 39 -37 91q0 53 37 90l76 75q36 38 90 38t90 -38l652 -651q37 -37 37 -90z" />
-<glyph unicode="&#xf055;" d="M1216 576v128q0 26 -19 45t-45 19h-256v256q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-256h-256q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h256v-256q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v256h256q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5 t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf056;" d="M1216 576v128q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5 t103 -385.5z" />
-<glyph unicode="&#xf057;" d="M1149 414q0 26 -19 45l-181 181l181 181q19 19 19 45q0 27 -19 46l-90 90q-19 19 -46 19q-26 0 -45 -19l-181 -181l-181 181q-19 19 -45 19q-27 0 -46 -19l-90 -90q-19 -19 -19 -46q0 -26 19 -45l181 -181l-181 -181q-19 -19 -19 -45q0 -27 19 -46l90 -90q19 -19 46 -19 q26 0 45 19l181 181l181 -181q19 -19 45 -19q27 0 46 19l90 90q19 19 19 46zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf058;" d="M1284 802q0 28 -18 46l-91 90q-19 19 -45 19t-45 -19l-408 -407l-226 226q-19 19 -45 19t-45 -19l-91 -90q-18 -18 -18 -46q0 -27 18 -45l362 -362q19 -19 45 -19q27 0 46 19l543 543q18 18 18 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf059;" d="M896 160v192q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h192q14 0 23 9t9 23zM1152 832q0 88 -55.5 163t-138.5 116t-170 41q-243 0 -371 -213q-15 -24 8 -42l132 -100q7 -6 19 -6q16 0 25 12q53 68 86 92q34 24 86 24q48 0 85.5 -26t37.5 -59 q0 -38 -20 -61t-68 -45q-63 -28 -115.5 -86.5t-52.5 -125.5v-36q0 -14 9 -23t23 -9h192q14 0 23 9t9 23q0 19 21.5 49.5t54.5 49.5q32 18 49 28.5t46 35t44.5 48t28 60.5t12.5 81zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf05a;" d="M1024 160v160q0 14 -9 23t-23 9h-96v512q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h96v-320h-96q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h448q14 0 23 9t9 23zM896 1056v160q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23 t23 -9h192q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf05b;" d="M1197 512h-109q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h109q-32 108 -112.5 188.5t-188.5 112.5v-109q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v109q-108 -32 -188.5 -112.5t-112.5 -188.5h109q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-109 q32 -108 112.5 -188.5t188.5 -112.5v109q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-109q108 32 188.5 112.5t112.5 188.5zM1536 704v-128q0 -26 -19 -45t-45 -19h-143q-37 -161 -154.5 -278.5t-278.5 -154.5v-143q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v143 q-161 37 -278.5 154.5t-154.5 278.5h-143q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h143q37 161 154.5 278.5t278.5 154.5v143q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-143q161 -37 278.5 -154.5t154.5 -278.5h143q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf05c;" d="M1097 457l-146 -146q-10 -10 -23 -10t-23 10l-137 137l-137 -137q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23t10 23l137 137l-137 137q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l137 -137l137 137q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23 l-137 -137l137 -137q10 -10 10 -23t-10 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5 t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf05d;" d="M1171 723l-422 -422q-19 -19 -45 -19t-45 19l-294 294q-19 19 -19 45t19 45l102 102q19 19 45 19t45 -19l147 -147l275 275q19 19 45 19t45 -19l102 -102q19 -19 19 -45t-19 -45zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198 t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf05e;" d="M1312 643q0 161 -87 295l-754 -753q137 -89 297 -89q111 0 211.5 43.5t173.5 116.5t116 174.5t43 212.5zM313 344l755 754q-135 91 -300 91q-148 0 -273 -73t-198 -199t-73 -274q0 -162 89 -299zM1536 643q0 -157 -61 -300t-163.5 -246t-245 -164t-298.5 -61t-298.5 61 t-245 164t-163.5 246t-61 300t61 299.5t163.5 245.5t245 164t298.5 61t298.5 -61t245 -164t163.5 -245.5t61 -299.5z" />
-<glyph unicode="&#xf060;" d="M1536 640v-128q0 -53 -32.5 -90.5t-84.5 -37.5h-704l293 -294q38 -36 38 -90t-38 -90l-75 -76q-37 -37 -90 -37q-52 0 -91 37l-651 652q-37 37 -37 90q0 52 37 91l651 650q38 38 91 38q52 0 90 -38l75 -74q38 -38 38 -91t-38 -91l-293 -293h704q52 0 84.5 -37.5 t32.5 -90.5z" />
-<glyph unicode="&#xf061;" d="M1472 576q0 -54 -37 -91l-651 -651q-39 -37 -91 -37q-51 0 -90 37l-75 75q-38 38 -38 91t38 91l293 293h-704q-52 0 -84.5 37.5t-32.5 90.5v128q0 53 32.5 90.5t84.5 37.5h704l-293 294q-38 36 -38 90t38 90l75 75q38 38 90 38q53 0 91 -38l651 -651q37 -35 37 -90z" />
-<glyph unicode="&#xf062;" horiz-adv-x="1664" d="M1611 565q0 -51 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-294 293v-704q0 -52 -37.5 -84.5t-90.5 -32.5h-128q-53 0 -90.5 32.5t-37.5 84.5v704l-294 -293q-36 -38 -90 -38t-90 38l-75 75q-38 38 -38 90q0 53 38 91l651 651q35 37 90 37q54 0 91 -37l651 -651 q37 -39 37 -91z" />
-<glyph unicode="&#xf063;" horiz-adv-x="1664" d="M1611 704q0 -53 -37 -90l-651 -652q-39 -37 -91 -37q-53 0 -90 37l-651 652q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l294 -294v704q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-704l294 294q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" />
-<glyph unicode="&#xf064;" horiz-adv-x="1792" d="M1792 896q0 -26 -19 -45l-512 -512q-19 -19 -45 -19t-45 19t-19 45v256h-224q-98 0 -175.5 -6t-154 -21.5t-133 -42.5t-105.5 -69.5t-80 -101t-48.5 -138.5t-17.5 -181q0 -55 5 -123q0 -6 2.5 -23.5t2.5 -26.5q0 -15 -8.5 -25t-23.5 -10q-16 0 -28 17q-7 9 -13 22 t-13.5 30t-10.5 24q-127 285 -127 451q0 199 53 333q162 403 875 403h224v256q0 26 19 45t45 19t45 -19l512 -512q19 -19 19 -45z" />
-<glyph unicode="&#xf065;" d="M755 480q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23zM1536 1344v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332 q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf066;" d="M768 576v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45zM1523 1248q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45 t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23z" />
-<glyph unicode="&#xf067;" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-416v-416q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v416h-416q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h416v416q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-416h416q40 0 68 -28t28 -68z" />
-<glyph unicode="&#xf068;" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-1216q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h1216q40 0 68 -28t28 -68z" />
-<glyph unicode="&#xf069;" horiz-adv-x="1664" d="M1482 486q46 -26 59.5 -77.5t-12.5 -97.5l-64 -110q-26 -46 -77.5 -59.5t-97.5 12.5l-266 153v-307q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v307l-266 -153q-46 -26 -97.5 -12.5t-77.5 59.5l-64 110q-26 46 -12.5 97.5t59.5 77.5l266 154l-266 154 q-46 26 -59.5 77.5t12.5 97.5l64 110q26 46 77.5 59.5t97.5 -12.5l266 -153v307q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-307l266 153q46 26 97.5 12.5t77.5 -59.5l64 -110q26 -46 12.5 -97.5t-59.5 -77.5l-266 -154z" />
-<glyph unicode="&#xf06a;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM896 161v190q0 14 -9 23.5t-22 9.5h-192q-13 0 -23 -10t-10 -23v-190q0 -13 10 -23t23 -10h192 q13 0 22 9.5t9 23.5zM894 505l18 621q0 12 -10 18q-10 8 -24 8h-220q-14 0 -24 -8q-10 -6 -10 -18l17 -621q0 -10 10 -17.5t24 -7.5h185q14 0 23.5 7.5t10.5 17.5z" />
-<glyph unicode="&#xf06b;" d="M928 180v56v468v192h-320v-192v-468v-56q0 -25 18 -38.5t46 -13.5h192q28 0 46 13.5t18 38.5zM472 1024h195l-126 161q-26 31 -69 31q-40 0 -68 -28t-28 -68t28 -68t68 -28zM1160 1120q0 40 -28 68t-68 28q-43 0 -69 -31l-125 -161h194q40 0 68 28t28 68zM1536 864v-320 q0 -14 -9 -23t-23 -9h-96v-416q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v416h-96q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h440q-93 0 -158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5q107 0 168 -77l128 -165l128 165q61 77 168 77q93 0 158.5 -65.5t65.5 -158.5 t-65.5 -158.5t-158.5 -65.5h440q14 0 23 -9t9 -23z" />
-<glyph unicode="&#xf06c;" horiz-adv-x="1792" d="M1280 832q0 26 -19 45t-45 19q-172 0 -318 -49.5t-259.5 -134t-235.5 -219.5q-19 -21 -19 -45q0 -26 19 -45t45 -19q24 0 45 19q27 24 74 71t67 66q137 124 268.5 176t313.5 52q26 0 45 19t19 45zM1792 1030q0 -95 -20 -193q-46 -224 -184.5 -383t-357.5 -268 q-214 -108 -438 -108q-148 0 -286 47q-15 5 -88 42t-96 37q-16 0 -39.5 -32t-45 -70t-52.5 -70t-60 -32q-30 0 -51 11t-31 24t-27 42q-2 4 -6 11t-5.5 10t-3 9.5t-1.5 13.5q0 35 31 73.5t68 65.5t68 56t31 48q0 4 -14 38t-16 44q-9 51 -9 104q0 115 43.5 220t119 184.5 t170.5 139t204 95.5q55 18 145 25.5t179.5 9t178.5 6t163.5 24t113.5 56.5l29.5 29.5t29.5 28t27 20t36.5 16t43.5 4.5q39 0 70.5 -46t47.5 -112t24 -124t8 -96z" />
-<glyph unicode="&#xf06d;" horiz-adv-x="1408" d="M1408 -160v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1152 896q0 -78 -24.5 -144t-64 -112.5t-87.5 -88t-96 -77.5t-87.5 -72t-64 -81.5t-24.5 -96.5q0 -96 67 -224l-4 1l1 -1 q-90 41 -160 83t-138.5 100t-113.5 122.5t-72.5 150.5t-27.5 184q0 78 24.5 144t64 112.5t87.5 88t96 77.5t87.5 72t64 81.5t24.5 96.5q0 94 -66 224l3 -1l-1 1q90 -41 160 -83t138.5 -100t113.5 -122.5t72.5 -150.5t27.5 -184z" />
-<glyph unicode="&#xf06e;" horiz-adv-x="1792" d="M1664 576q-152 236 -381 353q61 -104 61 -225q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 121 61 225q-229 -117 -381 -353q133 -205 333.5 -326.5t434.5 -121.5t434.5 121.5t333.5 326.5zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5 t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1792 576q0 -34 -20 -69q-140 -230 -376.5 -368.5t-499.5 -138.5t-499.5 139t-376.5 368q-20 35 -20 69t20 69q140 229 376.5 368t499.5 139t499.5 -139t376.5 -368q20 -35 20 -69z" />
-<glyph unicode="&#xf070;" horiz-adv-x="1792" d="M555 201l78 141q-87 63 -136 159t-49 203q0 121 61 225q-229 -117 -381 -353q167 -258 427 -375zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1307 1151q0 -7 -1 -9 q-105 -188 -315 -566t-316 -567l-49 -89q-10 -16 -28 -16q-12 0 -134 70q-16 10 -16 28q0 12 44 87q-143 65 -263.5 173t-208.5 245q-20 31 -20 69t20 69q153 235 380 371t496 136q89 0 180 -17l54 97q10 16 28 16q5 0 18 -6t31 -15.5t33 -18.5t31.5 -18.5t19.5 -11.5 q16 -10 16 -27zM1344 704q0 -139 -79 -253.5t-209 -164.5l280 502q8 -45 8 -84zM1792 576q0 -35 -20 -69q-39 -64 -109 -145q-150 -172 -347.5 -267t-419.5 -95l74 132q212 18 392.5 137t301.5 307q-115 179 -282 294l63 112q95 -64 182.5 -153t144.5 -184q20 -34 20 -69z " />
-<glyph unicode="&#xf071;" horiz-adv-x="1792" d="M1024 161v190q0 14 -9.5 23.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -23.5v-190q0 -14 9.5 -23.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 23.5zM1022 535l18 459q0 12 -10 19q-13 11 -24 11h-220q-11 0 -24 -11q-10 -7 -10 -21l17 -457q0 -10 10 -16.5t24 -6.5h185 q14 0 23.5 6.5t10.5 16.5zM1008 1469l768 -1408q35 -63 -2 -126q-17 -29 -46.5 -46t-63.5 -17h-1536q-34 0 -63.5 17t-46.5 46q-37 63 -2 126l768 1408q17 31 47 49t65 18t65 -18t47 -49z" />
-<glyph unicode="&#xf072;" horiz-adv-x="1408" d="M1376 1376q44 -52 12 -148t-108 -172l-161 -161l160 -696q5 -19 -12 -33l-128 -96q-7 -6 -19 -6q-4 0 -7 1q-15 3 -21 16l-279 508l-259 -259l53 -194q5 -17 -8 -31l-96 -96q-9 -9 -23 -9h-2q-15 2 -24 13l-189 252l-252 189q-11 7 -13 23q-1 13 9 25l96 97q9 9 23 9 q6 0 8 -1l194 -53l259 259l-508 279q-14 8 -17 24q-2 16 9 27l128 128q14 13 30 8l665 -159l160 160q76 76 172 108t148 -12z" />
-<glyph unicode="&#xf073;" horiz-adv-x="1664" d="M128 -128h288v288h-288v-288zM480 -128h320v288h-320v-288zM128 224h288v320h-288v-320zM480 224h320v320h-320v-320zM128 608h288v288h-288v-288zM864 -128h320v288h-320v-288zM480 608h320v288h-320v-288zM1248 -128h288v288h-288v-288zM864 224h320v320h-320v-320z M512 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1248 224h288v320h-288v-320zM864 608h320v288h-320v-288zM1248 608h288v288h-288v-288zM1280 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64 q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47 h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
-<glyph unicode="&#xf074;" horiz-adv-x="1792" d="M666 1055q-60 -92 -137 -273q-22 45 -37 72.5t-40.5 63.5t-51 56.5t-63 35t-81.5 14.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q250 0 410 -225zM1792 256q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192q-32 0 -85 -0.5t-81 -1t-73 1 t-71 5t-64 10.5t-63 18.5t-58 28.5t-59 40t-55 53.5t-56 69.5q59 93 136 273q22 -45 37 -72.5t40.5 -63.5t51 -56.5t63 -35t81.5 -14.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1792 1152q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5 v192h-256q-48 0 -87 -15t-69 -45t-51 -61.5t-45 -77.5q-32 -62 -78 -171q-29 -66 -49.5 -111t-54 -105t-64 -100t-74 -83t-90 -68.5t-106.5 -42t-128 -16.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q48 0 87 15t69 45t51 61.5t45 77.5q32 62 78 171q29 66 49.5 111 t54 105t64 100t74 83t90 68.5t106.5 42t128 16.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
-<glyph unicode="&#xf075;" horiz-adv-x="1792" d="M1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22q-17 -2 -30.5 9t-17.5 29v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281 q0 130 71 248.5t191 204.5t286 136.5t348 50.5q244 0 450 -85.5t326 -233t120 -321.5z" />
-<glyph unicode="&#xf076;" d="M1536 704v-128q0 -201 -98.5 -362t-274 -251.5t-395.5 -90.5t-395.5 90.5t-274 251.5t-98.5 362v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -52 23.5 -90t53.5 -57t71 -30t64 -13t44 -2t44 2t64 13t71 30t53.5 57t23.5 90v128q0 26 19 45t45 19h384 q26 0 45 -19t19 -45zM512 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45zM1536 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf077;" horiz-adv-x="1664" d="M1611 320q0 -53 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-486 485l-486 -485q-36 -38 -90 -38t-90 38l-75 75q-38 36 -38 90q0 53 38 91l651 651q37 37 90 37q52 0 91 -37l650 -651q38 -38 38 -91z" />
-<glyph unicode="&#xf078;" horiz-adv-x="1664" d="M1611 832q0 -53 -37 -90l-651 -651q-38 -38 -91 -38q-54 0 -90 38l-651 651q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l486 -486l486 486q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" />
-<glyph unicode="&#xf079;" horiz-adv-x="1920" d="M1280 32q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-8 0 -13.5 2t-9 7t-5.5 8t-3 11.5t-1 11.5v13v11v160v416h-192q-26 0 -45 19t-19 45q0 24 15 41l320 384q19 22 49 22t49 -22l320 -384q15 -17 15 -41q0 -26 -19 -45t-45 -19h-192v-384h576q16 0 25 -11l160 -192q7 -11 7 -21 zM1920 448q0 -24 -15 -41l-320 -384q-20 -23 -49 -23t-49 23l-320 384q-15 17 -15 41q0 26 19 45t45 19h192v384h-576q-16 0 -25 12l-160 192q-7 9 -7 20q0 13 9.5 22.5t22.5 9.5h960q8 0 13.5 -2t9 -7t5.5 -8t3 -11.5t1 -11.5v-13v-11v-160v-416h192q26 0 45 -19t19 -45z " />
-<glyph unicode="&#xf07a;" horiz-adv-x="1664" d="M640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5 l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5 t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf07b;" horiz-adv-x="1664" d="M1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
-<glyph unicode="&#xf07c;" horiz-adv-x="1920" d="M1879 584q0 -31 -31 -66l-336 -396q-43 -51 -120.5 -86.5t-143.5 -35.5h-1088q-34 0 -60.5 13t-26.5 43q0 31 31 66l336 396q43 51 120.5 86.5t143.5 35.5h1088q34 0 60.5 -13t26.5 -43zM1536 928v-160h-832q-94 0 -197 -47.5t-164 -119.5l-337 -396l-5 -6q0 4 -0.5 12.5 t-0.5 12.5v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158z" />
-<glyph unicode="&#xf07d;" horiz-adv-x="768" d="M704 1216q0 -26 -19 -45t-45 -19h-128v-1024h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v1024h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45z" />
-<glyph unicode="&#xf07e;" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-1024v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h1024v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
-<glyph unicode="&#xf080;" horiz-adv-x="1920" d="M512 512v-384h-256v384h256zM896 1024v-896h-256v896h256zM1280 768v-640h-256v640h256zM1664 1152v-1024h-256v1024h256zM1792 32v1216q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5z M1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
-<glyph unicode="&#xf081;" d="M1280 926q-56 -25 -121 -34q68 40 93 117q-65 -38 -134 -51q-61 66 -153 66q-87 0 -148.5 -61.5t-61.5 -148.5q0 -29 5 -48q-129 7 -242 65t-192 155q-29 -50 -29 -106q0 -114 91 -175q-47 1 -100 26v-2q0 -75 50 -133.5t123 -72.5q-29 -8 -51 -8q-13 0 -39 4 q21 -63 74.5 -104t121.5 -42q-116 -90 -261 -90q-26 0 -50 3q148 -94 322 -94q112 0 210 35.5t168 95t120.5 137t75 162t24.5 168.5q0 18 -1 27q63 45 105 109zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5 t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf082;" d="M1307 618l23 219h-198v109q0 49 15.5 68.5t71.5 19.5h110v219h-175q-152 0 -218 -72t-66 -213v-131h-131v-219h131v-635h262v635h175zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960 q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf083;" horiz-adv-x="1792" d="M928 704q0 14 -9 23t-23 9q-66 0 -113 -47t-47 -113q0 -14 9 -23t23 -9t23 9t9 23q0 40 28 68t68 28q14 0 23 9t9 23zM1152 574q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM128 0h1536v128h-1536v-128zM1280 574q0 159 -112.5 271.5 t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM256 1216h384v128h-384v-128zM128 1024h1536v118v138h-828l-64 -128h-644v-128zM1792 1280v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1536q-53 0 -90.5 37.5t-37.5 90.5v1280 q0 53 37.5 90.5t90.5 37.5h1536q53 0 90.5 -37.5t37.5 -90.5z" />
-<glyph unicode="&#xf084;" horiz-adv-x="1792" d="M832 1024q0 80 -56 136t-136 56t-136 -56t-56 -136q0 -42 19 -83q-41 19 -83 19q-80 0 -136 -56t-56 -136t56 -136t136 -56t136 56t56 136q0 42 -19 83q41 -19 83 -19q80 0 136 56t56 136zM1683 320q0 -17 -49 -66t-66 -49q-9 0 -28.5 16t-36.5 33t-38.5 40t-24.5 26 l-96 -96l220 -220q28 -28 28 -68q0 -42 -39 -81t-81 -39q-40 0 -68 28l-671 671q-176 -131 -365 -131q-163 0 -265.5 102.5t-102.5 265.5q0 160 95 313t248 248t313 95q163 0 265.5 -102.5t102.5 -265.5q0 -189 -131 -365l355 -355l96 96q-3 3 -26 24.5t-40 38.5t-33 36.5 t-16 28.5q0 17 49 66t66 49q13 0 23 -10q6 -6 46 -44.5t82 -79.5t86.5 -86t73 -78t28.5 -41z" />
-<glyph unicode="&#xf085;" horiz-adv-x="1920" d="M896 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1664 128q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1152q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1280 731v-185q0 -10 -7 -19.5t-16 -10.5l-155 -24q-11 -35 -32 -76q34 -48 90 -115q7 -10 7 -20q0 -12 -7 -19q-23 -30 -82.5 -89.5t-78.5 -59.5q-11 0 -21 7l-115 90q-37 -19 -77 -31q-11 -108 -23 -155q-7 -24 -30 -24h-186q-11 0 -20 7.5t-10 17.5 l-23 153q-34 10 -75 31l-118 -89q-7 -7 -20 -7q-11 0 -21 8q-144 133 -144 160q0 9 7 19q10 14 41 53t47 61q-23 44 -35 82l-152 24q-10 1 -17 9.5t-7 19.5v185q0 10 7 19.5t16 10.5l155 24q11 35 32 76q-34 48 -90 115q-7 11 -7 20q0 12 7 20q22 30 82 89t79 59q11 0 21 -7 l115 -90q34 18 77 32q11 108 23 154q7 24 30 24h186q11 0 20 -7.5t10 -17.5l23 -153q34 -10 75 -31l118 89q8 7 20 7q11 0 21 -8q144 -133 144 -160q0 -9 -7 -19q-12 -16 -42 -54t-45 -60q23 -48 34 -82l152 -23q10 -2 17 -10.5t7 -19.5zM1920 198v-140q0 -16 -149 -31 q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20 t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31zM1920 1222v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68 q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70 q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31z" />
-<glyph unicode="&#xf086;" horiz-adv-x="1792" d="M1408 768q0 -139 -94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224 q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257zM1792 512q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7 q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230z" />
-<glyph unicode="&#xf087;" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 768q0 51 -39 89.5t-89 38.5h-352q0 58 48 159.5t48 160.5q0 98 -32 145t-128 47q-26 -26 -38 -85t-30.5 -125.5t-59.5 -109.5q-22 -23 -77 -91q-4 -5 -23 -30t-31.5 -41t-34.5 -42.5 t-40 -44t-38.5 -35.5t-40 -27t-35.5 -9h-32v-640h32q13 0 31.5 -3t33 -6.5t38 -11t35 -11.5t35.5 -12.5t29 -10.5q211 -73 342 -73h121q192 0 192 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5q32 1 53.5 47t21.5 81zM1536 769 q0 -89 -49 -163q9 -33 9 -69q0 -77 -38 -144q3 -21 3 -43q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5h-36h-93q-96 0 -189.5 22.5t-216.5 65.5q-116 40 -138 40h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h274q36 24 137 155q58 75 107 128 q24 25 35.5 85.5t30.5 126.5t62 108q39 37 90 37q84 0 151 -32.5t102 -101.5t35 -186q0 -93 -48 -192h176q104 0 180 -76t76 -179z" />
-<glyph unicode="&#xf088;" d="M256 1088q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 512q0 35 -21.5 81t-53.5 47q15 17 25 47.5t10 55.5q0 69 -53 119q18 32 18 69t-17.5 73.5t-47.5 52.5q5 30 5 56q0 85 -49 126t-136 41h-128q-131 0 -342 -73q-5 -2 -29 -10.5 t-35.5 -12.5t-35 -11.5t-38 -11t-33 -6.5t-31.5 -3h-32v-640h32q16 0 35.5 -9t40 -27t38.5 -35.5t40 -44t34.5 -42.5t31.5 -41t23 -30q55 -68 77 -91q41 -43 59.5 -109.5t30.5 -125.5t38 -85q96 0 128 47t32 145q0 59 -48 160.5t-48 159.5h352q50 0 89 38.5t39 89.5z M1536 511q0 -103 -76 -179t-180 -76h-176q48 -99 48 -192q0 -118 -35 -186q-35 -69 -102 -101.5t-151 -32.5q-51 0 -90 37q-34 33 -54 82t-25.5 90.5t-17.5 84.5t-31 64q-48 50 -107 127q-101 131 -137 155h-274q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5 h288q22 0 138 40q128 44 223 66t200 22h112q140 0 226.5 -79t85.5 -216v-5q60 -77 60 -178q0 -22 -3 -43q38 -67 38 -144q0 -36 -9 -69q49 -74 49 -163z" />
-<glyph unicode="&#xf089;" horiz-adv-x="896" d="M832 1504v-1339l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41z" />
-<glyph unicode="&#xf08a;" horiz-adv-x="1792" d="M1664 940q0 81 -21.5 143t-55 98.5t-81.5 59.5t-94 31t-98 8t-112 -25.5t-110.5 -64t-86.5 -72t-60 -61.5q-18 -22 -49 -22t-49 22q-24 28 -60 61.5t-86.5 72t-110.5 64t-112 25.5t-98 -8t-94 -31t-81.5 -59.5t-55 -98.5t-21.5 -143q0 -168 187 -355l581 -560l580 559 q188 188 188 356zM1792 940q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5 q224 0 351 -124t127 -344z" />
-<glyph unicode="&#xf08b;" horiz-adv-x="1664" d="M640 96q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h320q13 0 22.5 -9.5t9.5 -22.5q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-66 0 -113 -47t-47 -113v-704 q0 -66 47 -113t113 -47h288h11h13t11.5 -1t11.5 -3t8 -5.5t7 -9t2 -13.5zM1568 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45z" />
-<glyph unicode="&#xf08c;" d="M237 122h231v694h-231v-694zM483 1030q-1 52 -36 86t-93 34t-94.5 -34t-36.5 -86q0 -51 35.5 -85.5t92.5 -34.5h1q59 0 95 34.5t36 85.5zM1068 122h231v398q0 154 -73 233t-193 79q-136 0 -209 -117h2v101h-231q3 -66 0 -694h231v388q0 38 7 56q15 35 45 59.5t74 24.5 q116 0 116 -157v-371zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf08d;" horiz-adv-x="1152" d="M480 672v448q0 14 -9 23t-23 9t-23 -9t-9 -23v-448q0 -14 9 -23t23 -9t23 9t9 23zM1152 320q0 -26 -19 -45t-45 -19h-429l-51 -483q-2 -12 -10.5 -20.5t-20.5 -8.5h-1q-27 0 -32 27l-76 485h-404q-26 0 -45 19t-19 45q0 123 78.5 221.5t177.5 98.5v512q-52 0 -90 38 t-38 90t38 90t90 38h640q52 0 90 -38t38 -90t-38 -90t-90 -38v-512q99 0 177.5 -98.5t78.5 -221.5z" />
-<glyph unicode="&#xf08e;" horiz-adv-x="1792" d="M1408 608v-320q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v320 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1792 1472v-512q0 -26 -19 -45t-45 -19t-45 19l-176 176l-652 -652q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l652 652l-176 176q-19 19 -19 45t19 45t45 19h512q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf090;" d="M1184 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45zM1536 992v-704q0 -119 -84.5 -203.5t-203.5 -84.5h-320q-13 0 -22.5 9.5t-9.5 22.5 q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q66 0 113 47t47 113v704q0 66 -47 113t-113 47h-288h-11h-13t-11.5 1t-11.5 3t-8 5.5t-7 9t-2 13.5q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf091;" horiz-adv-x="1664" d="M458 653q-74 162 -74 371h-256v-96q0 -78 94.5 -162t235.5 -113zM1536 928v96h-256q0 -209 -74 -371q141 29 235.5 113t94.5 162zM1664 1056v-128q0 -71 -41.5 -143t-112 -130t-173 -97.5t-215.5 -44.5q-42 -54 -95 -95q-38 -34 -52.5 -72.5t-14.5 -89.5q0 -54 30.5 -91 t97.5 -37q75 0 133.5 -45.5t58.5 -114.5v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 69 58.5 114.5t133.5 45.5q67 0 97.5 37t30.5 91q0 51 -14.5 89.5t-52.5 72.5q-53 41 -95 95q-113 5 -215.5 44.5t-173 97.5t-112 130t-41.5 143v128q0 40 28 68t68 28h288v96 q0 66 47 113t113 47h576q66 0 113 -47t47 -113v-96h288q40 0 68 -28t28 -68z" />
-<glyph unicode="&#xf092;" d="M394 184q-8 -9 -20 3q-13 11 -4 19q8 9 20 -3q12 -11 4 -19zM352 245q9 -12 0 -19q-8 -6 -17 7t0 18q9 7 17 -6zM291 305q-5 -7 -13 -2q-10 5 -7 12q3 5 13 2q10 -5 7 -12zM322 271q-6 -7 -16 3q-9 11 -2 16q6 6 16 -3q9 -11 2 -16zM451 159q-4 -12 -19 -6q-17 4 -13 15 t19 7q16 -5 13 -16zM514 154q0 -11 -16 -11q-17 -2 -17 11q0 11 16 11q17 2 17 -11zM572 164q2 -10 -14 -14t-18 8t14 15q16 2 18 -9zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-224q-16 0 -24.5 1t-19.5 5t-16 14.5t-5 27.5v239q0 97 -52 142q57 6 102.5 18t94 39 t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103 q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -103t0.5 -68q0 -22 -11 -33.5t-22 -13t-33 -1.5 h-224q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf093;" horiz-adv-x="1664" d="M1280 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 288v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h427q21 -56 70.5 -92 t110.5 -36h256q61 0 110.5 36t70.5 92h427q40 0 68 -28t28 -68zM1339 936q-17 -40 -59 -40h-256v-448q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v448h-256q-42 0 -59 40q-17 39 14 69l448 448q18 19 45 19t45 -19l448 -448q31 -30 14 -69z" />
-<glyph unicode="&#xf094;" d="M1407 710q0 44 -7 113.5t-18 96.5q-12 30 -17 44t-9 36.5t-4 48.5q0 23 5 68.5t5 67.5q0 37 -10 55q-4 1 -13 1q-19 0 -58 -4.5t-59 -4.5q-60 0 -176 24t-175 24q-43 0 -94.5 -11.5t-85 -23.5t-89.5 -34q-137 -54 -202 -103q-96 -73 -159.5 -189.5t-88 -236t-24.5 -248.5 q0 -40 12.5 -120t12.5 -121q0 -23 -11 -66.5t-11 -65.5t12 -36.5t34 -14.5q24 0 72.5 11t73.5 11q57 0 169.5 -15.5t169.5 -15.5q181 0 284 36q129 45 235.5 152.5t166 245.5t59.5 275zM1535 712q0 -165 -70 -327.5t-196 -288t-281 -180.5q-124 -44 -326 -44 q-57 0 -170 14.5t-169 14.5q-24 0 -72.5 -14.5t-73.5 -14.5q-73 0 -123.5 55.5t-50.5 128.5q0 24 11 68t11 67q0 40 -12.5 120.5t-12.5 121.5q0 111 18 217.5t54.5 209.5t100.5 194t150 156q78 59 232 120q194 78 316 78q60 0 175.5 -24t173.5 -24q19 0 57 5t58 5 q81 0 118 -50.5t37 -134.5q0 -23 -5 -68t-5 -68q0 -10 1 -18.5t3 -17t4 -13.5t6.5 -16t6.5 -17q16 -40 25 -118.5t9 -136.5z" />
-<glyph unicode="&#xf095;" horiz-adv-x="1408" d="M1408 296q0 -27 -10 -70.5t-21 -68.5q-21 -50 -122 -106q-94 -51 -186 -51q-27 0 -52.5 3.5t-57.5 12.5t-47.5 14.5t-55.5 20.5t-49 18q-98 35 -175 83q-128 79 -264.5 215.5t-215.5 264.5q-48 77 -83 175q-3 9 -18 49t-20.5 55.5t-14.5 47.5t-12.5 57.5t-3.5 52.5 q0 92 51 186q56 101 106 122q25 11 68.5 21t70.5 10q14 0 21 -3q18 -6 53 -76q11 -19 30 -54t35 -63.5t31 -53.5q3 -4 17.5 -25t21.5 -35.5t7 -28.5q0 -20 -28.5 -50t-62 -55t-62 -53t-28.5 -46q0 -9 5 -22.5t8.5 -20.5t14 -24t11.5 -19q76 -137 174 -235t235 -174 q2 -1 19 -11.5t24 -14t20.5 -8.5t22.5 -5q18 0 46 28.5t53 62t55 62t50 28.5q14 0 28.5 -7t35.5 -21.5t25 -17.5q25 -15 53.5 -31t63.5 -35t54 -30q70 -35 76 -53q3 -7 3 -21z" />
-<glyph unicode="&#xf096;" horiz-adv-x="1408" d="M1120 1280h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf097;" horiz-adv-x="1280" d="M1152 1280h-1024v-1242l423 406l89 85l89 -85l423 -406v1242zM1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289 q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
-<glyph unicode="&#xf098;" d="M1280 343q0 11 -2 16q-3 8 -38.5 29.5t-88.5 49.5l-53 29q-5 3 -19 13t-25 15t-21 5q-18 0 -47 -32.5t-57 -65.5t-44 -33q-7 0 -16.5 3.5t-15.5 6.5t-17 9.5t-14 8.5q-99 55 -170.5 126.5t-126.5 170.5q-2 3 -8.5 14t-9.5 17t-6.5 15.5t-3.5 16.5q0 13 20.5 33.5t45 38.5 t45 39.5t20.5 36.5q0 10 -5 21t-15 25t-13 19q-3 6 -15 28.5t-25 45.5t-26.5 47.5t-25 40.5t-16.5 18t-16 2q-48 0 -101 -22q-46 -21 -80 -94.5t-34 -130.5q0 -16 2.5 -34t5 -30.5t9 -33t10 -29.5t12.5 -33t11 -30q60 -164 216.5 -320.5t320.5 -216.5q6 -2 30 -11t33 -12.5 t29.5 -10t33 -9t30.5 -5t34 -2.5q57 0 130.5 34t94.5 80q22 53 22 101zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf099;" horiz-adv-x="1664" d="M1620 1128q-67 -98 -162 -167q1 -14 1 -42q0 -130 -38 -259.5t-115.5 -248.5t-184.5 -210.5t-258 -146t-323 -54.5q-271 0 -496 145q35 -4 78 -4q225 0 401 138q-105 2 -188 64.5t-114 159.5q33 -5 61 -5q43 0 85 11q-112 23 -185.5 111.5t-73.5 205.5v4q68 -38 146 -41 q-66 44 -105 115t-39 154q0 88 44 163q121 -149 294.5 -238.5t371.5 -99.5q-8 38 -8 74q0 134 94.5 228.5t228.5 94.5q140 0 236 -102q109 21 205 78q-37 -115 -142 -178q93 10 186 50z" />
-<glyph unicode="&#xf09a;" horiz-adv-x="768" d="M511 980h257l-30 -284h-227v-824h-341v824h-170v284h170v171q0 182 86 275.5t283 93.5h227v-284h-142q-39 0 -62.5 -6.5t-34 -23.5t-13.5 -34.5t-3 -49.5v-142z" />
-<glyph unicode="&#xf09b;" d="M1536 640q0 -251 -146.5 -451.5t-378.5 -277.5q-27 -5 -39.5 7t-12.5 30v211q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5 q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23 q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -89t0.5 -54q0 -18 -13 -30t-40 -7q-232 77 -378.5 277.5t-146.5 451.5q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf09c;" horiz-adv-x="1664" d="M1664 960v-256q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-192h96q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h672v192q0 185 131.5 316.5t316.5 131.5 t316.5 -131.5t131.5 -316.5z" />
-<glyph unicode="&#xf09d;" horiz-adv-x="1920" d="M1760 1408q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600zM160 1280q-13 0 -22.5 -9.5t-9.5 -22.5v-224h1664v224q0 13 -9.5 22.5t-22.5 9.5h-1600zM1760 0q13 0 22.5 9.5t9.5 22.5v608h-1664v-608 q0 -13 9.5 -22.5t22.5 -9.5h1600zM256 128v128h256v-128h-256zM640 128v128h384v-128h-384z" />
-<glyph unicode="&#xf09e;" horiz-adv-x="1408" d="M384 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 69q2 -28 -17 -48q-18 -21 -47 -21h-135q-25 0 -43 16.5t-20 41.5q-22 229 -184.5 391.5t-391.5 184.5q-25 2 -41.5 20t-16.5 43v135q0 29 21 47q17 17 43 17h5q160 -13 306 -80.5 t259 -181.5q114 -113 181.5 -259t80.5 -306zM1408 67q2 -27 -18 -47q-18 -20 -46 -20h-143q-26 0 -44.5 17.5t-19.5 42.5q-12 215 -101 408.5t-231.5 336t-336 231.5t-408.5 102q-25 1 -42.5 19.5t-17.5 43.5v143q0 28 20 46q18 18 44 18h3q262 -13 501.5 -120t425.5 -294 q187 -186 294 -425.5t120 -501.5z" />
-<glyph unicode="&#xf0a0;" d="M1040 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1296 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1408 160v320q0 13 -9.5 22.5t-22.5 9.5 h-1216q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5zM178 640h1180l-157 482q-4 13 -16 21.5t-26 8.5h-782q-14 0 -26 -8.5t-16 -21.5zM1536 480v-320q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v320q0 25 16 75 l197 606q17 53 63 86t101 33h782q55 0 101 -33t63 -86l197 -606q16 -50 16 -75z" />
-<glyph unicode="&#xf0a1;" horiz-adv-x="1792" d="M1664 896q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-384q0 -52 -38 -90t-90 -38q-417 347 -812 380q-58 -19 -91 -66t-31 -100.5t40 -92.5q-20 -33 -23 -65.5t6 -58t33.5 -55t48 -50t61.5 -50.5q-29 -58 -111.5 -83t-168.5 -11.5t-132 55.5q-7 23 -29.5 87.5 t-32 94.5t-23 89t-15 101t3.5 98.5t22 110.5h-122q-66 0 -113 47t-47 113v192q0 66 47 113t113 47h480q435 0 896 384q52 0 90 -38t38 -90v-384zM1536 292v954q-394 -302 -768 -343v-270q377 -42 768 -341z" />
-<glyph unicode="&#xf0a2;" horiz-adv-x="1664" d="M848 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM183 128h1298q-164 181 -246.5 411.5t-82.5 484.5q0 256 -320 256t-320 -256q0 -254 -82.5 -484.5t-246.5 -411.5zM1664 128q0 -52 -38 -90t-90 -38 h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q190 161 287 397.5t97 498.5q0 165 96 262t264 117q-8 18 -8 37q0 40 28 68t68 28t68 -28t28 -68q0 -19 -8 -37q168 -20 264 -117t96 -262q0 -262 97 -498.5t287 -397.5z" />
-<glyph unicode="&#xf0a3;" d="M1376 640l138 -135q30 -28 20 -70q-12 -41 -52 -51l-188 -48l53 -186q12 -41 -19 -70q-29 -31 -70 -19l-186 53l-48 -188q-10 -40 -51 -52q-12 -2 -19 -2q-31 0 -51 22l-135 138l-135 -138q-28 -30 -70 -20q-41 11 -51 52l-48 188l-186 -53q-41 -12 -70 19q-31 29 -19 70 l53 186l-188 48q-40 10 -52 51q-10 42 20 70l138 135l-138 135q-30 28 -20 70q12 41 52 51l188 48l-53 186q-12 41 19 70q29 31 70 19l186 -53l48 188q10 41 51 51q41 12 70 -19l135 -139l135 139q29 30 70 19q41 -10 51 -51l48 -188l186 53q41 12 70 -19q31 -29 19 -70 l-53 -186l188 -48q40 -10 52 -51q10 -42 -20 -70z" />
-<glyph unicode="&#xf0a4;" horiz-adv-x="1792" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 768q0 51 -39 89.5t-89 38.5h-576q0 20 15 48.5t33 55t33 68t15 84.5q0 67 -44.5 97.5t-115.5 30.5q-24 0 -90 -139q-24 -44 -37 -65q-40 -64 -112 -145q-71 -81 -101 -106 q-69 -57 -140 -57h-32v-640h32q72 0 167 -32t193.5 -64t179.5 -32q189 0 189 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5h331q52 0 90 38t38 90zM1792 769q0 -105 -75.5 -181t-180.5 -76h-169q-4 -62 -37 -119q3 -21 3 -43 q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5q-133 0 -322 69q-164 59 -223 59h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h288q10 0 21.5 4.5t23.5 14t22.5 18t24 22.5t20.5 21.5t19 21.5t14 17q65 74 100 129q13 21 33 62t37 72t40.5 63t55 49.5 t69.5 17.5q125 0 206.5 -67t81.5 -189q0 -68 -22 -128h374q104 0 180 -76t76 -179z" />
-<glyph unicode="&#xf0a5;" horiz-adv-x="1792" d="M1376 128h32v640h-32q-35 0 -67.5 12t-62.5 37t-50 46t-49 54q-2 3 -3.5 4.5t-4 4.5t-4.5 5q-72 81 -112 145q-14 22 -38 68q-1 3 -10.5 22.5t-18.5 36t-20 35.5t-21.5 30.5t-18.5 11.5q-71 0 -115.5 -30.5t-44.5 -97.5q0 -43 15 -84.5t33 -68t33 -55t15 -48.5h-576 q-50 0 -89 -38.5t-39 -89.5q0 -52 38 -90t90 -38h331q-15 -17 -25 -47.5t-10 -55.5q0 -69 53 -119q-18 -32 -18 -69t17.5 -73.5t47.5 -52.5q-4 -24 -4 -56q0 -85 48.5 -126t135.5 -41q84 0 183 32t194 64t167 32zM1664 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45 t45 -19t45 19t19 45zM1792 768v-640q0 -53 -37.5 -90.5t-90.5 -37.5h-288q-59 0 -223 -59q-190 -69 -317 -69q-142 0 -230 77.5t-87 217.5l1 5q-61 76 -61 178q0 22 3 43q-33 57 -37 119h-169q-105 0 -180.5 76t-75.5 181q0 103 76 179t180 76h374q-22 60 -22 128 q0 122 81.5 189t206.5 67q38 0 69.5 -17.5t55 -49.5t40.5 -63t37 -72t33 -62q35 -55 100 -129q2 -3 14 -17t19 -21.5t20.5 -21.5t24 -22.5t22.5 -18t23.5 -14t21.5 -4.5h288q53 0 90.5 -37.5t37.5 -90.5z" />
-<glyph unicode="&#xf0a6;" d="M1280 -64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 700q0 189 -167 189q-26 0 -56 -5q-16 30 -52.5 47.5t-73.5 17.5t-69 -18q-50 53 -119 53q-25 0 -55.5 -10t-47.5 -25v331q0 52 -38 90t-90 38q-51 0 -89.5 -39t-38.5 -89v-576 q-20 0 -48.5 15t-55 33t-68 33t-84.5 15q-67 0 -97.5 -44.5t-30.5 -115.5q0 -24 139 -90q44 -24 65 -37q64 -40 145 -112q81 -71 106 -101q57 -69 57 -140v-32h640v32q0 72 32 167t64 193.5t32 179.5zM1536 705q0 -133 -69 -322q-59 -164 -59 -223v-288q0 -53 -37.5 -90.5 t-90.5 -37.5h-640q-53 0 -90.5 37.5t-37.5 90.5v288q0 10 -4.5 21.5t-14 23.5t-18 22.5t-22.5 24t-21.5 20.5t-21.5 19t-17 14q-74 65 -129 100q-21 13 -62 33t-72 37t-63 40.5t-49.5 55t-17.5 69.5q0 125 67 206.5t189 81.5q68 0 128 -22v374q0 104 76 180t179 76 q105 0 181 -75.5t76 -180.5v-169q62 -4 119 -37q21 3 43 3q101 0 178 -60q139 1 219.5 -85t80.5 -227z" />
-<glyph unicode="&#xf0a7;" d="M1408 576q0 84 -32 183t-64 194t-32 167v32h-640v-32q0 -35 -12 -67.5t-37 -62.5t-46 -50t-54 -49q-9 -8 -14 -12q-81 -72 -145 -112q-22 -14 -68 -38q-3 -1 -22.5 -10.5t-36 -18.5t-35.5 -20t-30.5 -21.5t-11.5 -18.5q0 -71 30.5 -115.5t97.5 -44.5q43 0 84.5 15t68 33 t55 33t48.5 15v-576q0 -50 38.5 -89t89.5 -39q52 0 90 38t38 90v331q46 -35 103 -35q69 0 119 53q32 -18 69 -18t73.5 17.5t52.5 47.5q24 -4 56 -4q85 0 126 48.5t41 135.5zM1280 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 580 q0 -142 -77.5 -230t-217.5 -87l-5 1q-76 -61 -178 -61q-22 0 -43 3q-54 -30 -119 -37v-169q0 -105 -76 -180.5t-181 -75.5q-103 0 -179 76t-76 180v374q-54 -22 -128 -22q-121 0 -188.5 81.5t-67.5 206.5q0 38 17.5 69.5t49.5 55t63 40.5t72 37t62 33q55 35 129 100 q3 2 17 14t21.5 19t21.5 20.5t22.5 24t18 22.5t14 23.5t4.5 21.5v288q0 53 37.5 90.5t90.5 37.5h640q53 0 90.5 -37.5t37.5 -90.5v-288q0 -59 59 -223q69 -190 69 -317z" />
-<glyph unicode="&#xf0a8;" d="M1280 576v128q0 26 -19 45t-45 19h-502l189 189q19 19 19 45t-19 45l-91 91q-18 18 -45 18t-45 -18l-362 -362l-91 -91q-18 -18 -18 -45t18 -45l91 -91l362 -362q18 -18 45 -18t45 18l91 91q18 18 18 45t-18 45l-189 189h502q26 0 45 19t19 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf0a9;" d="M1285 640q0 27 -18 45l-91 91l-362 362q-18 18 -45 18t-45 -18l-91 -91q-18 -18 -18 -45t18 -45l189 -189h-502q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h502l-189 -189q-19 -19 -19 -45t19 -45l91 -91q18 -18 45 -18t45 18l362 362l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf0aa;" d="M1284 641q0 27 -18 45l-362 362l-91 91q-18 18 -45 18t-45 -18l-91 -91l-362 -362q-18 -18 -18 -45t18 -45l91 -91q18 -18 45 -18t45 18l189 189v-502q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v502l189 -189q19 -19 45 -19t45 19l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf0ab;" d="M1284 639q0 27 -18 45l-91 91q-18 18 -45 18t-45 -18l-189 -189v502q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-502l-189 189q-19 19 -45 19t-45 -19l-91 -91q-18 -18 -18 -45t18 -45l362 -362l91 -91q18 -18 45 -18t45 18l91 91l362 362q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf0ac;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1042 887q-2 -1 -9.5 -9.5t-13.5 -9.5q2 0 4.5 5t5 11t3.5 7q6 7 22 15q14 6 52 12q34 8 51 -11 q-2 2 9.5 13t14.5 12q3 2 15 4.5t15 7.5l2 22q-12 -1 -17.5 7t-6.5 21q0 -2 -6 -8q0 7 -4.5 8t-11.5 -1t-9 -1q-10 3 -15 7.5t-8 16.5t-4 15q-2 5 -9.5 10.5t-9.5 10.5q-1 2 -2.5 5.5t-3 6.5t-4 5.5t-5.5 2.5t-7 -5t-7.5 -10t-4.5 -5q-3 2 -6 1.5t-4.5 -1t-4.5 -3t-5 -3.5 q-3 -2 -8.5 -3t-8.5 -2q15 5 -1 11q-10 4 -16 3q9 4 7.5 12t-8.5 14h5q-1 4 -8.5 8.5t-17.5 8.5t-13 6q-8 5 -34 9.5t-33 0.5q-5 -6 -4.5 -10.5t4 -14t3.5 -12.5q1 -6 -5.5 -13t-6.5 -12q0 -7 14 -15.5t10 -21.5q-3 -8 -16 -16t-16 -12q-5 -8 -1.5 -18.5t10.5 -16.5 q2 -2 1.5 -4t-3.5 -4.5t-5.5 -4t-6.5 -3.5l-3 -2q-11 -5 -20.5 6t-13.5 26q-7 25 -16 30q-23 8 -29 -1q-5 13 -41 26q-25 9 -58 4q6 1 0 15q-7 15 -19 12q3 6 4 17.5t1 13.5q3 13 12 23q1 1 7 8.5t9.5 13.5t0.5 6q35 -4 50 11q5 5 11.5 17t10.5 17q9 6 14 5.5t14.5 -5.5 t14.5 -5q14 -1 15.5 11t-7.5 20q12 -1 3 17q-5 7 -8 9q-12 4 -27 -5q-8 -4 2 -8q-1 1 -9.5 -10.5t-16.5 -17.5t-16 5q-1 1 -5.5 13.5t-9.5 13.5q-8 0 -16 -15q3 8 -11 15t-24 8q19 12 -8 27q-7 4 -20.5 5t-19.5 -4q-5 -7 -5.5 -11.5t5 -8t10.5 -5.5t11.5 -4t8.5 -3 q14 -10 8 -14q-2 -1 -8.5 -3.5t-11.5 -4.5t-6 -4q-3 -4 0 -14t-2 -14q-5 5 -9 17.5t-7 16.5q7 -9 -25 -6l-10 1q-4 0 -16 -2t-20.5 -1t-13.5 8q-4 8 0 20q1 4 4 2q-4 3 -11 9.5t-10 8.5q-46 -15 -94 -41q6 -1 12 1q5 2 13 6.5t10 5.5q34 14 42 7l5 5q14 -16 20 -25 q-7 4 -30 1q-20 -6 -22 -12q7 -12 5 -18q-4 3 -11.5 10t-14.5 11t-15 5q-16 0 -22 -1q-146 -80 -235 -222q7 -7 12 -8q4 -1 5 -9t2.5 -11t11.5 3q9 -8 3 -19q1 1 44 -27q19 -17 21 -21q3 -11 -10 -18q-1 2 -9 9t-9 4q-3 -5 0.5 -18.5t10.5 -12.5q-7 0 -9.5 -16t-2.5 -35.5 t-1 -23.5l2 -1q-3 -12 5.5 -34.5t21.5 -19.5q-13 -3 20 -43q6 -8 8 -9q3 -2 12 -7.5t15 -10t10 -10.5q4 -5 10 -22.5t14 -23.5q-2 -6 9.5 -20t10.5 -23q-1 0 -2.5 -1t-2.5 -1q3 -7 15.5 -14t15.5 -13q1 -3 2 -10t3 -11t8 -2q2 20 -24 62q-15 25 -17 29q-3 5 -5.5 15.5 t-4.5 14.5q2 0 6 -1.5t8.5 -3.5t7.5 -4t2 -3q-3 -7 2 -17.5t12 -18.5t17 -19t12 -13q6 -6 14 -19.5t0 -13.5q9 0 20 -10t17 -20q5 -8 8 -26t5 -24q2 -7 8.5 -13.5t12.5 -9.5l16 -8t13 -7q5 -2 18.5 -10.5t21.5 -11.5q10 -4 16 -4t14.5 2.5t13.5 3.5q15 2 29 -15t21 -21 q36 -19 55 -11q-2 -1 0.5 -7.5t8 -15.5t9 -14.5t5.5 -8.5q5 -6 18 -15t18 -15q6 4 7 9q-3 -8 7 -20t18 -10q14 3 14 32q-31 -15 -49 18q0 1 -2.5 5.5t-4 8.5t-2.5 8.5t0 7.5t5 3q9 0 10 3.5t-2 12.5t-4 13q-1 8 -11 20t-12 15q-5 -9 -16 -8t-16 9q0 -1 -1.5 -5.5t-1.5 -6.5 q-13 0 -15 1q1 3 2.5 17.5t3.5 22.5q1 4 5.5 12t7.5 14.5t4 12.5t-4.5 9.5t-17.5 2.5q-19 -1 -26 -20q-1 -3 -3 -10.5t-5 -11.5t-9 -7q-7 -3 -24 -2t-24 5q-13 8 -22.5 29t-9.5 37q0 10 2.5 26.5t3 25t-5.5 24.5q3 2 9 9.5t10 10.5q2 1 4.5 1.5t4.5 0t4 1.5t3 6q-1 1 -4 3 q-3 3 -4 3q7 -3 28.5 1.5t27.5 -1.5q15 -11 22 2q0 1 -2.5 9.5t-0.5 13.5q5 -27 29 -9q3 -3 15.5 -5t17.5 -5q3 -2 7 -5.5t5.5 -4.5t5 0.5t8.5 6.5q10 -14 12 -24q11 -40 19 -44q7 -3 11 -2t4.5 9.5t0 14t-1.5 12.5l-1 8v18l-1 8q-15 3 -18.5 12t1.5 18.5t15 18.5q1 1 8 3.5 t15.5 6.5t12.5 8q21 19 15 35q7 0 11 9q-1 0 -5 3t-7.5 5t-4.5 2q9 5 2 16q5 3 7.5 11t7.5 10q9 -12 21 -2q7 8 1 16q5 7 20.5 10.5t18.5 9.5q7 -2 8 2t1 12t3 12q4 5 15 9t13 5l17 11q3 4 0 4q18 -2 31 11q10 11 -6 20q3 6 -3 9.5t-15 5.5q3 1 11.5 0.5t10.5 1.5 q15 10 -7 16q-17 5 -43 -12zM879 10q206 36 351 189q-3 3 -12.5 4.5t-12.5 3.5q-18 7 -24 8q1 7 -2.5 13t-8 9t-12.5 8t-11 7q-2 2 -7 6t-7 5.5t-7.5 4.5t-8.5 2t-10 -1l-3 -1q-3 -1 -5.5 -2.5t-5.5 -3t-4 -3t0 -2.5q-21 17 -36 22q-5 1 -11 5.5t-10.5 7t-10 1.5t-11.5 -7 q-5 -5 -6 -15t-2 -13q-7 5 0 17.5t2 18.5q-3 6 -10.5 4.5t-12 -4.5t-11.5 -8.5t-9 -6.5t-8.5 -5.5t-8.5 -7.5q-3 -4 -6 -12t-5 -11q-2 4 -11.5 6.5t-9.5 5.5q2 -10 4 -35t5 -38q7 -31 -12 -48q-27 -25 -29 -40q-4 -22 12 -26q0 -7 -8 -20.5t-7 -21.5q0 -6 2 -16z" />
-<glyph unicode="&#xf0ad;" horiz-adv-x="1664" d="M384 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1028 484l-682 -682q-37 -37 -90 -37q-52 0 -91 37l-106 108q-38 36 -38 90q0 53 38 91l681 681q39 -98 114.5 -173.5t173.5 -114.5zM1662 919q0 -39 -23 -106q-47 -134 -164.5 -217.5 t-258.5 -83.5q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q58 0 121.5 -16.5t107.5 -46.5q16 -11 16 -28t-16 -28l-293 -169v-224l193 -107q5 3 79 48.5t135.5 81t70.5 35.5q15 0 23.5 -10t8.5 -25z" />
-<glyph unicode="&#xf0ae;" horiz-adv-x="1792" d="M1024 128h640v128h-640v-128zM640 640h1024v128h-1024v-128zM1280 1152h384v128h-384v-128zM1792 320v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 832v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19 t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf0b0;" horiz-adv-x="1408" d="M1403 1241q17 -41 -14 -70l-493 -493v-742q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-256 256q-19 19 -19 45v486l-493 493q-31 29 -14 70q17 39 59 39h1280q42 0 59 -39z" />
-<glyph unicode="&#xf0b1;" horiz-adv-x="1792" d="M640 1280h512v128h-512v-128zM1792 640v-480q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v480h672v-160q0 -26 19 -45t45 -19h320q26 0 45 19t19 45v160h672zM1024 640v-128h-256v128h256zM1792 1120v-384h-1792v384q0 66 47 113t113 47h352v160q0 40 28 68 t68 28h576q40 0 68 -28t28 -68v-160h352q66 0 113 -47t47 -113z" />
-<glyph unicode="&#xf0b2;" d="M1283 995l-355 -355l355 -355l144 144q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l144 144l-355 355l-355 -355l144 -144q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l144 -144 l355 355l-355 355l-144 -144q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v448q0 26 19 45t45 19h448q42 0 59 -40q17 -39 -14 -69l-144 -144l355 -355l355 355l-144 144q-31 30 -14 69q17 40 59 40h448q26 0 45 -19t19 -45v-448q0 -42 -39 -59q-13 -5 -25 -5q-26 0 -45 19z " />
-<glyph unicode="&#xf0c0;" horiz-adv-x="1920" d="M593 640q-162 -5 -265 -128h-134q-82 0 -138 40.5t-56 118.5q0 353 124 353q6 0 43.5 -21t97.5 -42.5t119 -21.5q67 0 133 23q-5 -37 -5 -66q0 -139 81 -256zM1664 3q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5 t43 97.5t62 81t85.5 53.5t111.5 20q10 0 43 -21.5t73 -48t107 -48t135 -21.5t135 21.5t107 48t73 48t43 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM640 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75 t75 -181zM1344 896q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5zM1920 671q0 -78 -56 -118.5t-138 -40.5h-134q-103 123 -265 128q81 117 81 256q0 29 -5 66q66 -23 133 -23q59 0 119 21.5t97.5 42.5 t43.5 21q124 0 124 -353zM1792 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181z" />
-<glyph unicode="&#xf0c1;" horiz-adv-x="1664" d="M1456 320q0 40 -28 68l-208 208q-28 28 -68 28q-42 0 -72 -32q3 -3 19 -18.5t21.5 -21.5t15 -19t13 -25.5t3.5 -27.5q0 -40 -28 -68t-68 -28q-15 0 -27.5 3.5t-25.5 13t-19 15t-21.5 21.5t-18.5 19q-33 -31 -33 -73q0 -40 28 -68l206 -207q27 -27 68 -27q40 0 68 26 l147 146q28 28 28 67zM753 1025q0 40 -28 68l-206 207q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l208 -208q27 -27 68 -27q42 0 72 31q-3 3 -19 18.5t-21.5 21.5t-15 19t-13 25.5t-3.5 27.5q0 40 28 68t68 28q15 0 27.5 -3.5t25.5 -13t19 -15 t21.5 -21.5t18.5 -19q33 31 33 73zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-206 207q-83 83 -83 203q0 123 88 209l-88 88q-86 -88 -208 -88q-120 0 -204 84l-208 208q-84 84 -84 204t85 203l147 146q83 83 203 83q121 0 204 -85l206 -207 q83 -83 83 -203q0 -123 -88 -209l88 -88q86 88 208 88q120 0 204 -84l208 -208q84 -84 84 -204z" />
-<glyph unicode="&#xf0c2;" horiz-adv-x="1920" d="M1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5q0 132 71 241.5t187 163.5q-2 28 -2 43q0 212 150 362t362 150q158 0 286.5 -88t187.5 -230q70 62 166 62q106 0 181 -75t75 -181q0 -75 -41 -138q129 -30 213 -134.5t84 -239.5z " />
-<glyph unicode="&#xf0c3;" horiz-adv-x="1664" d="M1527 88q56 -89 21.5 -152.5t-140.5 -63.5h-1152q-106 0 -140.5 63.5t21.5 152.5l503 793v399h-64q-26 0 -45 19t-19 45t19 45t45 19h512q26 0 45 -19t19 -45t-19 -45t-45 -19h-64v-399zM748 813l-272 -429h712l-272 429l-20 31v37v399h-128v-399v-37z" />
-<glyph unicode="&#xf0c4;" horiz-adv-x="1792" d="M960 640q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1260 576l507 -398q28 -20 25 -56q-5 -35 -35 -51l-128 -64q-13 -7 -29 -7q-17 0 -31 8l-690 387l-110 -66q-8 -4 -12 -5q14 -49 10 -97q-7 -77 -56 -147.5t-132 -123.5q-132 -84 -277 -84 q-136 0 -222 78q-90 84 -79 207q7 76 56 147t131 124q132 84 278 84q83 0 151 -31q9 13 22 22l122 73l-122 73q-13 9 -22 22q-68 -31 -151 -31q-146 0 -278 84q-82 53 -131 124t-56 147q-5 59 15.5 113t63.5 93q85 79 222 79q145 0 277 -84q83 -52 132 -123t56 -148 q4 -48 -10 -97q4 -1 12 -5l110 -66l690 387q14 8 31 8q16 0 29 -7l128 -64q30 -16 35 -51q3 -36 -25 -56zM579 836q46 42 21 108t-106 117q-92 59 -192 59q-74 0 -113 -36q-46 -42 -21 -108t106 -117q92 -59 192 -59q74 0 113 36zM494 91q81 51 106 117t-21 108 q-39 36 -113 36q-100 0 -192 -59q-81 -51 -106 -117t21 -108q39 -36 113 -36q100 0 192 59zM672 704l96 -58v11q0 36 33 56l14 8l-79 47l-26 -26q-3 -3 -10 -11t-12 -12q-2 -2 -4 -3.5t-3 -2.5zM896 480l96 -32l736 576l-128 64l-768 -431v-113l-160 -96l9 -8q2 -2 7 -6 q4 -4 11 -12t11 -12l26 -26zM1600 64l128 64l-520 408l-177 -138q-2 -3 -13 -7z" />
-<glyph unicode="&#xf0c5;" horiz-adv-x="1792" d="M1696 1152q40 0 68 -28t28 -68v-1216q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v288h-544q-40 0 -68 28t-28 68v672q0 40 20 88t48 76l408 408q28 28 76 48t88 20h416q40 0 68 -28t28 -68v-328q68 40 128 40h416zM1152 939l-299 -299h299v299zM512 1323l-299 -299 h299v299zM708 676l316 316v416h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h512v256q0 40 20 88t48 76zM1664 -128v1152h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h896z" />
-<glyph unicode="&#xf0c6;" horiz-adv-x="1408" d="M1404 151q0 -117 -79 -196t-196 -79q-135 0 -235 100l-777 776q-113 115 -113 271q0 159 110 270t269 111q158 0 273 -113l605 -606q10 -10 10 -22q0 -16 -30.5 -46.5t-46.5 -30.5q-13 0 -23 10l-606 607q-79 77 -181 77q-106 0 -179 -75t-73 -181q0 -105 76 -181 l776 -777q63 -63 145 -63q64 0 106 42t42 106q0 82 -63 145l-581 581q-26 24 -60 24q-29 0 -48 -19t-19 -48q0 -32 25 -59l410 -410q10 -10 10 -22q0 -16 -31 -47t-47 -31q-12 0 -22 10l-410 410q-63 61 -63 149q0 82 57 139t139 57q88 0 149 -63l581 -581q100 -98 100 -235 z" />
-<glyph unicode="&#xf0c7;" d="M384 0h768v384h-768v-384zM1280 0h128v896q0 14 -10 38.5t-20 34.5l-281 281q-10 10 -34 20t-39 10v-416q0 -40 -28 -68t-68 -28h-576q-40 0 -68 28t-28 68v416h-128v-1280h128v416q0 40 28 68t68 28h832q40 0 68 -28t28 -68v-416zM896 928v320q0 13 -9.5 22.5t-22.5 9.5 h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5zM1536 896v-928q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h928q40 0 88 -20t76 -48l280 -280q28 -28 48 -76t20 -88z" />
-<glyph unicode="&#xf0c8;" d="M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf0c9;" d="M1536 192v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 704v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 1216v-128q0 -26 -19 -45 t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf0ca;" horiz-adv-x="1792" d="M384 128q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 640q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1152q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z M1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
-<glyph unicode="&#xf0cb;" horiz-adv-x="1792" d="M381 -84q0 -80 -54.5 -126t-135.5 -46q-106 0 -172 66l57 88q49 -45 106 -45q29 0 50.5 14.5t21.5 42.5q0 64 -105 56l-26 56q8 10 32.5 43.5t42.5 54t37 38.5v1q-16 0 -48.5 -1t-48.5 -1v-53h-106v152h333v-88l-95 -115q51 -12 81 -49t30 -88zM383 543v-159h-362 q-6 36 -6 54q0 51 23.5 93t56.5 68t66 47.5t56.5 43.5t23.5 45q0 25 -14.5 38.5t-39.5 13.5q-46 0 -81 -58l-85 59q24 51 71.5 79.5t105.5 28.5q73 0 123 -41.5t50 -112.5q0 -50 -34 -91.5t-75 -64.5t-75.5 -50.5t-35.5 -52.5h127v60h105zM1792 224v-192q0 -13 -9.5 -22.5 t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1123v-99h-335v99h107q0 41 0.5 122t0.5 121v12h-2q-8 -17 -50 -54l-71 76l136 127h106v-404h108zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5 t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
-<glyph unicode="&#xf0cc;" horiz-adv-x="1792" d="M1760 640q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h1728zM483 704q-28 35 -51 80q-48 97 -48 188q0 181 134 309q133 127 393 127q50 0 167 -19q66 -12 177 -48q10 -38 21 -118q14 -123 14 -183q0 -18 -5 -45l-12 -3l-84 6 l-14 2q-50 149 -103 205q-88 91 -210 91q-114 0 -182 -59q-67 -58 -67 -146q0 -73 66 -140t279 -129q69 -20 173 -66q58 -28 95 -52h-743zM990 448h411q7 -39 7 -92q0 -111 -41 -212q-23 -55 -71 -104q-37 -35 -109 -81q-80 -48 -153 -66q-80 -21 -203 -21q-114 0 -195 23 l-140 40q-57 16 -72 28q-8 8 -8 22v13q0 108 -2 156q-1 30 0 68l2 37v44l102 2q15 -34 30 -71t22.5 -56t12.5 -27q35 -57 80 -94q43 -36 105 -57q59 -22 132 -22q64 0 139 27q77 26 122 86q47 61 47 129q0 84 -81 157q-34 29 -137 71z" />
-<glyph unicode="&#xf0cd;" d="M48 1313q-37 2 -45 4l-3 88q13 1 40 1q60 0 112 -4q132 -7 166 -7q86 0 168 3q116 4 146 5q56 0 86 2l-1 -14l2 -64v-9q-60 -9 -124 -9q-60 0 -79 -25q-13 -14 -13 -132q0 -13 0.5 -32.5t0.5 -25.5l1 -229l14 -280q6 -124 51 -202q35 -59 96 -92q88 -47 177 -47 q104 0 191 28q56 18 99 51q48 36 65 64q36 56 53 114q21 73 21 229q0 79 -3.5 128t-11 122.5t-13.5 159.5l-4 59q-5 67 -24 88q-34 35 -77 34l-100 -2l-14 3l2 86h84l205 -10q76 -3 196 10l18 -2q6 -38 6 -51q0 -7 -4 -31q-45 -12 -84 -13q-73 -11 -79 -17q-15 -15 -15 -41 q0 -7 1.5 -27t1.5 -31q8 -19 22 -396q6 -195 -15 -304q-15 -76 -41 -122q-38 -65 -112 -123q-75 -57 -182 -89q-109 -33 -255 -33q-167 0 -284 46q-119 47 -179 122q-61 76 -83 195q-16 80 -16 237v333q0 188 -17 213q-25 36 -147 39zM1536 -96v64q0 14 -9 23t-23 9h-1472 q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h1472q14 0 23 9t9 23z" />
-<glyph unicode="&#xf0ce;" horiz-adv-x="1664" d="M512 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23 v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 160v192 q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192 q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1664 1248v-1088q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1344q66 0 113 -47t47 -113 z" />
-<glyph unicode="&#xf0d0;" horiz-adv-x="1664" d="M1190 955l293 293l-107 107l-293 -293zM1637 1248q0 -27 -18 -45l-1286 -1286q-18 -18 -45 -18t-45 18l-198 198q-18 18 -18 45t18 45l1286 1286q18 18 45 18t45 -18l198 -198q18 -18 18 -45zM286 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM636 1276 l196 -60l-196 -60l-60 -196l-60 196l-196 60l196 60l60 196zM1566 798l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM926 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98z" />
-<glyph unicode="&#xf0d1;" horiz-adv-x="1792" d="M640 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM256 640h384v256h-158q-13 0 -22 -9l-195 -195q-9 -9 -9 -22v-30zM1536 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM1792 1216v-1024q0 -15 -4 -26.5t-13.5 -18.5 t-16.5 -11.5t-23.5 -6t-22.5 -2t-25.5 0t-22.5 0.5q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-64q-3 0 -22.5 -0.5t-25.5 0t-22.5 2t-23.5 6t-16.5 11.5t-13.5 18.5t-4 26.5q0 26 19 45t45 19v320q0 8 -0.5 35t0 38 t2.5 34.5t6.5 37t14 30.5t22.5 30l198 198q19 19 50.5 32t58.5 13h160v192q0 26 19 45t45 19h1024q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf0d2;" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103q-111 0 -218 32q59 93 78 164q9 34 54 211q20 -39 73 -67.5t114 -28.5q121 0 216 68.5t147 188.5t52 270q0 114 -59.5 214t-172.5 163t-255 63q-105 0 -196 -29t-154.5 -77t-109 -110.5t-67 -129.5t-21.5 -134 q0 -104 40 -183t117 -111q30 -12 38 20q2 7 8 31t8 30q6 23 -11 43q-51 61 -51 151q0 151 104.5 259.5t273.5 108.5q151 0 235.5 -82t84.5 -213q0 -170 -68.5 -289t-175.5 -119q-61 0 -98 43.5t-23 104.5q8 35 26.5 93.5t30 103t11.5 75.5q0 50 -27 83t-77 33 q-62 0 -105 -57t-43 -142q0 -73 25 -122l-99 -418q-17 -70 -13 -177q-206 91 -333 281t-127 423q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf0d3;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-725q85 122 108 210q9 34 53 209q21 -39 73.5 -67t112.5 -28q181 0 295.5 147.5t114.5 373.5q0 84 -35 162.5t-96.5 139t-152.5 97t-197 36.5q-104 0 -194.5 -28.5t-153 -76.5 t-107.5 -109.5t-66.5 -128t-21.5 -132.5q0 -102 39.5 -180t116.5 -110q13 -5 23.5 0t14.5 19q10 44 15 61q6 23 -11 42q-50 62 -50 150q0 150 103.5 256.5t270.5 106.5q149 0 232.5 -81t83.5 -210q0 -168 -67.5 -286t-173.5 -118q-60 0 -97 43.5t-23 103.5q8 34 26.5 92.5 t29.5 102t11 74.5q0 49 -26.5 81.5t-75.5 32.5q-61 0 -103.5 -56.5t-42.5 -139.5q0 -72 24 -121l-98 -414q-24 -100 -7 -254h-183q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960z" />
-<glyph unicode="&#xf0d4;" d="M678 -57q0 -38 -10 -71h-380q-95 0 -171.5 56.5t-103.5 147.5q24 45 69 77.5t100 49.5t107 24t107 7q32 0 49 -2q6 -4 30.5 -21t33 -23t31 -23t32 -25.5t27.5 -25.5t26.5 -29.5t21 -30.5t17.5 -34.5t9.5 -36t4.5 -40.5zM385 294q-234 -7 -385 -85v433q103 -118 273 -118 q32 0 70 5q-21 -61 -21 -86q0 -67 63 -149zM558 805q0 -100 -43.5 -160.5t-140.5 -60.5q-51 0 -97 26t-78 67.5t-56 93.5t-35.5 104t-11.5 99q0 96 51.5 165t144.5 69q66 0 119 -41t84 -104t47 -130t16 -128zM1536 896v-736q0 -119 -84.5 -203.5t-203.5 -84.5h-468 q39 73 39 157q0 66 -22 122.5t-55.5 93t-72 71t-72 59.5t-55.5 54.5t-22 59.5q0 36 23 68t56 61.5t65.5 64.5t55.5 93t23 131t-26.5 145.5t-75.5 118.5q-6 6 -14 11t-12.5 7.5t-10 9.5t-10.5 17h135l135 64h-437q-138 0 -244.5 -38.5t-182.5 -133.5q0 126 81 213t207 87h960 q119 0 203.5 -84.5t84.5 -203.5v-96h-256v256h-128v-256h-256v-128h256v-256h128v256h256z" />
-<glyph unicode="&#xf0d5;" horiz-adv-x="1664" d="M876 71q0 21 -4.5 40.5t-9.5 36t-17.5 34.5t-21 30.5t-26.5 29.5t-27.5 25.5t-32 25.5t-31 23t-33 23t-30.5 21q-17 2 -50 2q-54 0 -106 -7t-108 -25t-98 -46t-69 -75t-27 -107q0 -68 35.5 -121.5t93 -84t120.5 -45.5t127 -15q59 0 112.5 12.5t100.5 39t74.5 73.5 t27.5 110zM756 933q0 60 -16.5 127.5t-47 130.5t-84 104t-119.5 41q-93 0 -144 -69t-51 -165q0 -47 11.5 -99t35.5 -104t56 -93.5t78 -67.5t97 -26q97 0 140.5 60.5t43.5 160.5zM625 1408h437l-135 -79h-135q71 -45 110 -126t39 -169q0 -74 -23 -131.5t-56 -92.5t-66 -64.5 t-56 -61t-23 -67.5q0 -26 16.5 -51t43 -48t58.5 -48t64 -55.5t58.5 -66t43 -85t16.5 -106.5q0 -160 -140 -282q-152 -131 -420 -131q-59 0 -119.5 10t-122 33.5t-108.5 58t-77 89t-30 121.5q0 61 37 135q32 64 96 110.5t145 71t155 36t150 13.5q-64 83 -64 149q0 12 2 23.5 t5 19.5t8 21.5t7 21.5q-40 -5 -70 -5q-149 0 -255.5 98t-106.5 246q0 140 95 250.5t234 141.5q94 20 187 20zM1664 1152v-128h-256v-256h-128v256h-256v128h256v256h128v-256h256z" />
-<glyph unicode="&#xf0d6;" horiz-adv-x="1920" d="M768 384h384v96h-128v448h-114l-148 -137l77 -80q42 37 55 57h2v-288h-128v-96zM1280 640q0 -70 -21 -142t-59.5 -134t-101.5 -101t-138 -39t-138 39t-101.5 101t-59.5 134t-21 142t21 142t59.5 134t101.5 101t138 39t138 -39t101.5 -101t59.5 -134t21 -142zM1792 384 v512q-106 0 -181 75t-75 181h-1152q0 -106 -75 -181t-181 -75v-512q106 0 181 -75t75 -181h1152q0 106 75 181t181 75zM1920 1216v-1152q0 -26 -19 -45t-45 -19h-1792q-26 0 -45 19t-19 45v1152q0 26 19 45t45 19h1792q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf0d7;" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf0d8;" horiz-adv-x="1024" d="M1024 320q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
-<glyph unicode="&#xf0d9;" horiz-adv-x="640" d="M640 1088v-896q0 -26 -19 -45t-45 -19t-45 19l-448 448q-19 19 -19 45t19 45l448 448q19 19 45 19t45 -19t19 -45z" />
-<glyph unicode="&#xf0da;" horiz-adv-x="640" d="M576 640q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19t-19 45v896q0 26 19 45t45 19t45 -19l448 -448q19 -19 19 -45z" />
-<glyph unicode="&#xf0db;" horiz-adv-x="1664" d="M160 0h608v1152h-640v-1120q0 -13 9.5 -22.5t22.5 -9.5zM1536 32v1120h-640v-1152h608q13 0 22.5 9.5t9.5 22.5zM1664 1248v-1216q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1344q66 0 113 -47t47 -113z" />
-<glyph unicode="&#xf0dc;" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45zM1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
-<glyph unicode="&#xf0dd;" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf0de;" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
-<glyph unicode="&#xf0e0;" horiz-adv-x="1792" d="M1792 826v-794q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v794q44 -49 101 -87q362 -246 497 -345q57 -42 92.5 -65.5t94.5 -48t110 -24.5h1h1q51 0 110 24.5t94.5 48t92.5 65.5q170 123 498 345q57 39 100 87zM1792 1120q0 -79 -49 -151t-122 -123 q-376 -261 -468 -325q-10 -7 -42.5 -30.5t-54 -38t-52 -32.5t-57.5 -27t-50 -9h-1h-1q-23 0 -50 9t-57.5 27t-52 32.5t-54 38t-42.5 30.5q-91 64 -262 182.5t-205 142.5q-62 42 -117 115.5t-55 136.5q0 78 41.5 130t118.5 52h1472q65 0 112.5 -47t47.5 -113z" />
-<glyph unicode="&#xf0e1;" d="M349 911v-991h-330v991h330zM370 1217q1 -73 -50.5 -122t-135.5 -49h-2q-82 0 -132 49t-50 122q0 74 51.5 122.5t134.5 48.5t133 -48.5t51 -122.5zM1536 488v-568h-329v530q0 105 -40.5 164.5t-126.5 59.5q-63 0 -105.5 -34.5t-63.5 -85.5q-11 -30 -11 -81v-553h-329 q2 399 2 647t-1 296l-1 48h329v-144h-2q20 32 41 56t56.5 52t87 43.5t114.5 15.5q171 0 275 -113.5t104 -332.5z" />
-<glyph unicode="&#xf0e2;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5 t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298z" />
-<glyph unicode="&#xf0e3;" horiz-adv-x="1792" d="M1771 0q0 -53 -37 -90l-107 -108q-39 -37 -91 -37q-53 0 -90 37l-363 364q-38 36 -38 90q0 53 43 96l-256 256l-126 -126q-14 -14 -34 -14t-34 14q2 -2 12.5 -12t12.5 -13t10 -11.5t10 -13.5t6 -13.5t5.5 -16.5t1.5 -18q0 -38 -28 -68q-3 -3 -16.5 -18t-19 -20.5 t-18.5 -16.5t-22 -15.5t-22 -9t-26 -4.5q-40 0 -68 28l-408 408q-28 28 -28 68q0 13 4.5 26t9 22t15.5 22t16.5 18.5t20.5 19t18 16.5q30 28 68 28q10 0 18 -1.5t16.5 -5.5t13.5 -6t13.5 -10t11.5 -10t13 -12.5t12 -12.5q-14 14 -14 34t14 34l348 348q14 14 34 14t34 -14 q-2 2 -12.5 12t-12.5 13t-10 11.5t-10 13.5t-6 13.5t-5.5 16.5t-1.5 18q0 38 28 68q3 3 16.5 18t19 20.5t18.5 16.5t22 15.5t22 9t26 4.5q40 0 68 -28l408 -408q28 -28 28 -68q0 -13 -4.5 -26t-9 -22t-15.5 -22t-16.5 -18.5t-20.5 -19t-18 -16.5q-30 -28 -68 -28 q-10 0 -18 1.5t-16.5 5.5t-13.5 6t-13.5 10t-11.5 10t-13 12.5t-12 12.5q14 -14 14 -34t-14 -34l-126 -126l256 -256q43 43 96 43q52 0 91 -37l363 -363q37 -39 37 -91z" />
-<glyph unicode="&#xf0e4;" horiz-adv-x="1792" d="M384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM576 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1004 351l101 382q6 26 -7.5 48.5t-38.5 29.5 t-48 -6.5t-30 -39.5l-101 -382q-60 -5 -107 -43.5t-63 -98.5q-20 -77 20 -146t117 -89t146 20t89 117q16 60 -6 117t-72 91zM1664 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 1024q0 53 -37.5 90.5 t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1472 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 384q0 -261 -141 -483q-19 -29 -54 -29h-1402q-35 0 -54 29 q-141 221 -141 483q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
-<glyph unicode="&#xf0e5;" horiz-adv-x="1792" d="M896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640 q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 174 120 321.5 t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" />
-<glyph unicode="&#xf0e6;" horiz-adv-x="1792" d="M704 1152q-153 0 -286 -52t-211.5 -141t-78.5 -191q0 -82 53 -158t149 -132l97 -56l-35 -84q34 20 62 39l44 31l53 -10q78 -14 153 -14q153 0 286 52t211.5 141t78.5 191t-78.5 191t-211.5 141t-286 52zM704 1280q191 0 353.5 -68.5t256.5 -186.5t94 -257t-94 -257 t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224q0 139 94 257t256.5 186.5 t353.5 68.5zM1526 111q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129 q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230q0 -120 -71 -224.5t-195 -176.5z" />
-<glyph unicode="&#xf0e7;" horiz-adv-x="896" d="M885 970q18 -20 7 -44l-540 -1157q-13 -25 -42 -25q-4 0 -14 2q-17 5 -25.5 19t-4.5 30l197 808l-406 -101q-4 -1 -12 -1q-18 0 -31 11q-18 15 -13 39l201 825q4 14 16 23t28 9h328q19 0 32 -12.5t13 -29.5q0 -8 -5 -18l-171 -463l396 98q8 2 12 2q19 0 34 -15z" />
-<glyph unicode="&#xf0e8;" horiz-adv-x="1792" d="M1792 288v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192q0 52 38 90t90 38h512v192h-96q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-96v-192h512q52 0 90 -38t38 -90v-192h96q40 0 68 -28t28 -68 z" />
-<glyph unicode="&#xf0e9;" horiz-adv-x="1664" d="M896 708v-580q0 -104 -76 -180t-180 -76t-180 76t-76 180q0 26 19 45t45 19t45 -19t19 -45q0 -50 39 -89t89 -39t89 39t39 89v580q33 11 64 11t64 -11zM1664 681q0 -13 -9.5 -22.5t-22.5 -9.5q-11 0 -23 10q-49 46 -93 69t-102 23q-68 0 -128 -37t-103 -97 q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -28 -17q-18 0 -29 17q-4 6 -14.5 24t-17.5 28q-43 60 -102.5 97t-127.5 37t-127.5 -37t-102.5 -97q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -29 -17q-17 0 -28 17q-4 6 -14.5 24t-17.5 28q-43 60 -103 97t-128 37q-58 0 -102 -23t-93 -69 q-12 -10 -23 -10q-13 0 -22.5 9.5t-9.5 22.5q0 5 1 7q45 183 172.5 319.5t298 204.5t360.5 68q140 0 274.5 -40t246.5 -113.5t194.5 -187t115.5 -251.5q1 -2 1 -7zM896 1408v-98q-42 2 -64 2t-64 -2v98q0 26 19 45t45 19t45 -19t19 -45z" />
-<glyph unicode="&#xf0ea;" horiz-adv-x="1792" d="M768 -128h896v640h-416q-40 0 -68 28t-28 68v416h-384v-1152zM1024 1312v64q0 13 -9.5 22.5t-22.5 9.5h-704q-13 0 -22.5 -9.5t-9.5 -22.5v-64q0 -13 9.5 -22.5t22.5 -9.5h704q13 0 22.5 9.5t9.5 22.5zM1280 640h299l-299 299v-299zM1792 512v-672q0 -40 -28 -68t-68 -28 h-960q-40 0 -68 28t-28 68v160h-544q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1088q40 0 68 -28t28 -68v-328q21 -13 36 -28l408 -408q28 -28 48 -76t20 -88z" />
-<glyph unicode="&#xf0eb;" horiz-adv-x="1024" d="M736 960q0 -13 -9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5q0 46 -54 71t-106 25q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5q50 0 99.5 -16t87 -54t37.5 -90zM896 960q0 72 -34.5 134t-90 101.5t-123 62t-136.5 22.5t-136.5 -22.5t-123 -62t-90 -101.5t-34.5 -134 q0 -101 68 -180q10 -11 30.5 -33t30.5 -33q128 -153 141 -298h228q13 145 141 298q10 11 30.5 33t30.5 33q68 79 68 180zM1024 960q0 -155 -103 -268q-45 -49 -74.5 -87t-59.5 -95.5t-34 -107.5q47 -28 47 -82q0 -37 -25 -64q25 -27 25 -64q0 -52 -45 -81q13 -23 13 -47 q0 -46 -31.5 -71t-77.5 -25q-20 -44 -60 -70t-87 -26t-87 26t-60 70q-46 0 -77.5 25t-31.5 71q0 24 13 47q-45 29 -45 81q0 37 25 64q-25 27 -25 64q0 54 47 82q-4 50 -34 107.5t-59.5 95.5t-74.5 87q-103 113 -103 268q0 99 44.5 184.5t117 142t164 89t186.5 32.5 t186.5 -32.5t164 -89t117 -142t44.5 -184.5z" />
-<glyph unicode="&#xf0ec;" horiz-adv-x="1792" d="M1792 352v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5q-12 0 -24 10l-319 320q-9 9 -9 22q0 14 9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h1376q13 0 22.5 -9.5t9.5 -22.5zM1792 896q0 -14 -9 -23l-320 -320q-9 -9 -23 -9 q-13 0 -22.5 9.5t-9.5 22.5v192h-1376q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1376v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
-<glyph unicode="&#xf0ed;" horiz-adv-x="1920" d="M1280 608q0 14 -9 23t-23 9h-224v352q0 13 -9.5 22.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-352h-224q-13 0 -22.5 -9.5t-9.5 -22.5q0 -14 9 -23l352 -352q9 -9 23 -9t23 9l351 351q10 12 10 24zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
-<glyph unicode="&#xf0ee;" horiz-adv-x="1920" d="M1280 672q0 14 -9 23l-352 352q-9 9 -23 9t-23 -9l-351 -351q-10 -12 -10 -24q0 -14 9 -23t23 -9h224v-352q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5v352h224q13 0 22.5 9.5t9.5 22.5zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
-<glyph unicode="&#xf0f0;" horiz-adv-x="1408" d="M384 192q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 68 5.5 131t24 138t47.5 132.5t81 103t120 60.5q-22 -52 -22 -120v-203q-58 -20 -93 -70t-35 -111q0 -80 56 -136t136 -56 t136 56t56 136q0 61 -35.5 111t-92.5 70v203q0 62 25 93q132 -104 295 -104t295 104q25 -31 25 -93v-64q-106 0 -181 -75t-75 -181v-89q-32 -29 -32 -71q0 -40 28 -68t68 -28t68 28t28 68q0 42 -32 71v89q0 52 38 90t90 38t90 -38t38 -90v-89q-32 -29 -32 -71q0 -40 28 -68 t68 -28t68 28t28 68q0 42 -32 71v89q0 68 -34.5 127.5t-93.5 93.5q0 10 0.5 42.5t0 48t-2.5 41.5t-7 47t-13 40q68 -15 120 -60.5t81 -103t47.5 -132.5t24 -138t5.5 -131zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5 t271.5 -112.5t112.5 -271.5z" />
-<glyph unicode="&#xf0f1;" horiz-adv-x="1408" d="M1280 832q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 832q0 -62 -35.5 -111t-92.5 -70v-395q0 -159 -131.5 -271.5t-316.5 -112.5t-316.5 112.5t-131.5 271.5v132q-164 20 -274 128t-110 252v512q0 26 19 45t45 19q6 0 16 -2q17 30 47 48 t65 18q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5q-33 0 -64 18v-402q0 -106 94 -181t226 -75t226 75t94 181v402q-31 -18 -64 -18q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5q35 0 65 -18t47 -48q10 2 16 2q26 0 45 -19t19 -45v-512q0 -144 -110 -252 t-274 -128v-132q0 -106 94 -181t226 -75t226 75t94 181v395q-57 21 -92.5 70t-35.5 111q0 80 56 136t136 56t136 -56t56 -136z" />
-<glyph unicode="&#xf0f2;" horiz-adv-x="1792" d="M640 1152h512v128h-512v-128zM288 1152v-1280h-64q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h64zM1408 1152v-1280h-1024v1280h128v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h128zM1792 928v-832q0 -92 -66 -158t-158 -66h-64v1280h64q92 0 158 -66 t66 -158z" />
-<glyph unicode="&#xf0f3;" horiz-adv-x="1664" d="M848 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM1664 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q190 161 287 397.5t97 498.5 q0 165 96 262t264 117q-8 18 -8 37q0 40 28 68t68 28t68 -28t28 -68q0 -19 -8 -37q168 -20 264 -117t96 -262q0 -262 97 -498.5t287 -397.5z" />
-<glyph unicode="&#xf0f4;" horiz-adv-x="1920" d="M1664 896q0 80 -56 136t-136 56h-64v-384h64q80 0 136 56t56 136zM0 128h1792q0 -106 -75 -181t-181 -75h-1280q-106 0 -181 75t-75 181zM1856 896q0 -159 -112.5 -271.5t-271.5 -112.5h-64v-32q0 -92 -66 -158t-158 -66h-704q-92 0 -158 66t-66 158v736q0 26 19 45 t45 19h1152q159 0 271.5 -112.5t112.5 -271.5z" />
-<glyph unicode="&#xf0f5;" horiz-adv-x="1408" d="M640 1472v-640q0 -61 -35.5 -111t-92.5 -70v-779q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v779q-57 20 -92.5 70t-35.5 111v640q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45 t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45zM1408 1472v-1600q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v512h-224q-13 0 -22.5 9.5t-9.5 22.5v800q0 132 94 226t226 94h256q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf0f6;" horiz-adv-x="1280" d="M1024 352v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23zM1024 608v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23zM128 0h1024v768h-416q-40 0 -68 28t-28 68v416h-512v-1280z M768 896h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376zM1280 864v-896q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h640q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88z" />
-<glyph unicode="&#xf0f7;" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1536h-1152v-1536h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM1408 1472v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf0f8;" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1152h-256v-32q0 -40 -28 -68t-68 -28h-448q-40 0 -68 28t-28 68v32h-256v-1152h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM896 1056v320q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-96h-128v96q0 13 -9.5 22.5 t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v96h128v-96q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1408 1088v-1280q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1280q0 26 19 45t45 19h320 v288q0 40 28 68t68 28h448q40 0 68 -28t28 -68v-288h320q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf0f9;" horiz-adv-x="1920" d="M640 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM256 640h384v256h-158q-14 -2 -22 -9l-195 -195q-7 -12 -9 -22v-30zM1536 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1664 800v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM1920 1344v-1152 q0 -26 -19 -45t-45 -19h-192q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-128q-26 0 -45 19t-19 45t19 45t45 19v416q0 26 13 58t32 51l198 198q19 19 51 32t58 13h160v320q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf0fa;" horiz-adv-x="1792" d="M1280 416v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM640 1152h512v128h-512v-128zM256 1152v-1280h-32 q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h32zM1440 1152v-1280h-1088v1280h160v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h160zM1792 928v-832q0 -92 -66 -158t-158 -66h-32v1280h32q92 0 158 -66t66 -158z" />
-<glyph unicode="&#xf0fb;" horiz-adv-x="1920" d="M1920 576q-1 -32 -288 -96l-352 -32l-224 -64h-64l-293 -352h69q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-96h-160h-64v32h64v416h-160l-192 -224h-96l-32 32v192h32v32h128v8l-192 24v128l192 24v8h-128v32h-32v192l32 32h96l192 -224h160v416h-64v32h64h160h96 q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-69l293 -352h64l224 -64l352 -32q261 -58 287 -93z" />
-<glyph unicode="&#xf0fc;" horiz-adv-x="1664" d="M640 640v384h-256v-256q0 -53 37.5 -90.5t90.5 -37.5h128zM1664 192v-192h-1152v192l128 192h-128q-159 0 -271.5 112.5t-112.5 271.5v320l-64 64l32 128h480l32 128h960l32 -192l-64 -32v-800z" />
-<glyph unicode="&#xf0fd;" d="M1280 192v896q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-512v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-896q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h512v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf0fe;" d="M1280 576v128q0 26 -19 45t-45 19h-320v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-320q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h320v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h320q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf100;" horiz-adv-x="1024" d="M627 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23zM1011 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23z" />
-<glyph unicode="&#xf101;" horiz-adv-x="1024" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM979 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23 l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
-<glyph unicode="&#xf102;" horiz-adv-x="1152" d="M1075 224q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM1075 608q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393 q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
-<glyph unicode="&#xf103;" horiz-adv-x="1152" d="M1075 672q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23zM1075 1056q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
-<glyph unicode="&#xf104;" horiz-adv-x="640" d="M627 992q0 -13 -10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
-<glyph unicode="&#xf105;" horiz-adv-x="640" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
-<glyph unicode="&#xf106;" horiz-adv-x="1152" d="M1075 352q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
-<glyph unicode="&#xf107;" horiz-adv-x="1152" d="M1075 800q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
-<glyph unicode="&#xf108;" horiz-adv-x="1920" d="M1792 544v832q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1376v-1088q0 -66 -47 -113t-113 -47h-544q0 -37 16 -77.5t32 -71t16 -43.5q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19 t-19 45q0 14 16 44t32 70t16 78h-544q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
-<glyph unicode="&#xf109;" horiz-adv-x="1920" d="M416 256q-66 0 -113 47t-47 113v704q0 66 47 113t113 47h1088q66 0 113 -47t47 -113v-704q0 -66 -47 -113t-113 -47h-1088zM384 1120v-704q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5v704q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5z M1760 192h160v-96q0 -40 -47 -68t-113 -28h-1600q-66 0 -113 28t-47 68v96h160h1600zM1040 96q16 0 16 16t-16 16h-160q-16 0 -16 -16t16 -16h160z" />
-<glyph unicode="&#xf10a;" horiz-adv-x="1152" d="M640 128q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1024 288v960q0 13 -9.5 22.5t-22.5 9.5h-832q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h832q13 0 22.5 9.5t9.5 22.5zM1152 1248v-1088q0 -66 -47 -113t-113 -47h-832 q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h832q66 0 113 -47t47 -113z" />
-<glyph unicode="&#xf10b;" horiz-adv-x="768" d="M464 128q0 33 -23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5t56.5 23.5t23.5 56.5zM672 288v704q0 13 -9.5 22.5t-22.5 9.5h-512q-13 0 -22.5 -9.5t-9.5 -22.5v-704q0 -13 9.5 -22.5t22.5 -9.5h512q13 0 22.5 9.5t9.5 22.5zM480 1136 q0 16 -16 16h-160q-16 0 -16 -16t16 -16h160q16 0 16 16zM768 1152v-1024q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v1024q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
-<glyph unicode="&#xf10c;" d="M768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103 t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf10d;" horiz-adv-x="1664" d="M768 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z M1664 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z" />
-<glyph unicode="&#xf10e;" horiz-adv-x="1664" d="M768 1216v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136zM1664 1216 v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136z" />
-<glyph unicode="&#xf110;" horiz-adv-x="1568" d="M496 192q0 -60 -42.5 -102t-101.5 -42q-60 0 -102 42t-42 102t42 102t102 42q59 0 101.5 -42t42.5 -102zM928 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM320 640q0 -66 -47 -113t-113 -47t-113 47t-47 113 t47 113t113 47t113 -47t47 -113zM1360 192q0 -46 -33 -79t-79 -33t-79 33t-33 79t33 79t79 33t79 -33t33 -79zM528 1088q0 -73 -51.5 -124.5t-124.5 -51.5t-124.5 51.5t-51.5 124.5t51.5 124.5t124.5 51.5t124.5 -51.5t51.5 -124.5zM992 1280q0 -80 -56 -136t-136 -56 t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1536 640q0 -40 -28 -68t-68 -28t-68 28t-28 68t28 68t68 28t68 -28t28 -68zM1328 1088q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5z" />
-<glyph unicode="&#xf111;" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf112;" horiz-adv-x="1792" d="M1792 416q0 -166 -127 -451q-3 -7 -10.5 -24t-13.5 -30t-13 -22q-12 -17 -28 -17q-15 0 -23.5 10t-8.5 25q0 9 2.5 26.5t2.5 23.5q5 68 5 123q0 101 -17.5 181t-48.5 138.5t-80 101t-105.5 69.5t-133 42.5t-154 21.5t-175.5 6h-224v-256q0 -26 -19 -45t-45 -19t-45 19 l-512 512q-19 19 -19 45t19 45l512 512q19 19 45 19t45 -19t19 -45v-256h224q713 0 875 -403q53 -134 53 -333z" />
-<glyph unicode="&#xf113;" horiz-adv-x="1664" d="M640 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1280 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1440 320 q0 120 -69 204t-187 84q-41 0 -195 -21q-71 -11 -157 -11t-157 11q-152 21 -195 21q-118 0 -187 -84t-69 -204q0 -88 32 -153.5t81 -103t122 -60t140 -29.5t149 -7h168q82 0 149 7t140 29.5t122 60t81 103t32 153.5zM1664 496q0 -207 -61 -331q-38 -77 -105.5 -133t-141 -86 t-170 -47.5t-171.5 -22t-167 -4.5q-78 0 -142 3t-147.5 12.5t-152.5 30t-137 51.5t-121 81t-86 115q-62 123 -62 331q0 237 136 396q-27 82 -27 170q0 116 51 218q108 0 190 -39.5t189 -123.5q147 35 309 35q148 0 280 -32q105 82 187 121t189 39q51 -102 51 -218 q0 -87 -27 -168q136 -160 136 -398z" />
-<glyph unicode="&#xf114;" horiz-adv-x="1664" d="M1536 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-960q0 -40 28 -68t68 -28h1216q40 0 68 28t28 68zM1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320 q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
-<glyph unicode="&#xf115;" horiz-adv-x="1920" d="M1781 605q0 35 -53 35h-1088q-40 0 -85.5 -21.5t-71.5 -52.5l-294 -363q-18 -24 -18 -40q0 -35 53 -35h1088q40 0 86 22t71 53l294 363q18 22 18 39zM640 768h768v160q0 40 -28 68t-68 28h-576q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68 v-853l256 315q44 53 116 87.5t140 34.5zM1909 605q0 -62 -46 -120l-295 -363q-43 -53 -116 -87.5t-140 -34.5h-1088q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h192q54 0 99 -24.5t67 -70.5q15 -32 15 -68z " />
-<glyph unicode="&#xf116;" horiz-adv-x="1152" d="M896 608v-64q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v224q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-224h224q14 0 23 -9t9 -23zM1024 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 -28 t-28 -68v-704q0 -40 28 -68t68 -28h704q40 0 68 28t28 68zM1152 928v-704q0 -92 -65.5 -158t-158.5 -66h-704q-93 0 -158.5 66t-65.5 158v704q0 93 65.5 158.5t158.5 65.5h704q93 0 158.5 -65.5t65.5 -158.5z" />
-<glyph unicode="&#xf117;" horiz-adv-x="1152" d="M928 1152q93 0 158.5 -65.5t65.5 -158.5v-704q0 -92 -65.5 -158t-158.5 -66h-704q-93 0 -158.5 66t-65.5 158v704q0 93 65.5 158.5t158.5 65.5h704zM1024 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 -28t-28 -68v-704q0 -40 28 -68t68 -28h704q40 0 68 28t28 68z M864 640q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-576q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h576z" />
-<glyph unicode="&#xf118;" d="M1134 461q-37 -121 -138 -195t-228 -74t-228 74t-138 195q-8 25 4 48.5t38 31.5q25 8 48.5 -4t31.5 -38q25 -80 92.5 -129.5t151.5 -49.5t151.5 49.5t92.5 129.5q8 26 32 38t49 4t37 -31.5t4 -48.5zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5 t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf119;" d="M1134 307q8 -25 -4 -48.5t-37 -31.5t-49 4t-32 38q-25 80 -92.5 129.5t-151.5 49.5t-151.5 -49.5t-92.5 -129.5q-8 -26 -31.5 -38t-48.5 -4q-26 8 -38 31.5t-4 48.5q37 121 138 195t228 74t228 -74t138 -195zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204 t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf11a;" d="M1152 448q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h640q26 0 45 -19t19 -45zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf11b;" horiz-adv-x="1920" d="M832 448v128q0 14 -9 23t-23 9h-192v192q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-192h-192q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h192v-192q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v192h192q14 0 23 9t9 23zM1408 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5 t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1920 512q0 -212 -150 -362t-362 -150q-192 0 -338 128h-220q-146 -128 -338 -128q-212 0 -362 150 t-150 362t150 362t362 150h896q212 0 362 -150t150 -362z" />
-<glyph unicode="&#xf11c;" horiz-adv-x="1920" d="M384 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM512 624v-96q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h224q16 0 16 -16zM384 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 368v-96q0 -16 -16 -16 h-864q-16 0 -16 16v96q0 16 16 16h864q16 0 16 -16zM768 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM640 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1024 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16 h96q16 0 16 -16zM896 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1280 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1152 880v-96 q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 880v-352q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h112v240q0 16 16 16h96q16 0 16 -16zM1792 128v896h-1664v-896 h1664zM1920 1024v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-1664q-53 0 -90.5 37.5t-37.5 90.5v896q0 53 37.5 90.5t90.5 37.5h1664q53 0 90.5 -37.5t37.5 -90.5z" />
-<glyph unicode="&#xf11d;" horiz-adv-x="1792" d="M1664 491v616q-169 -91 -306 -91q-82 0 -145 32q-100 49 -184 76.5t-178 27.5q-173 0 -403 -127v-599q245 113 433 113q55 0 103.5 -7.5t98 -26t77 -31t82.5 -39.5l28 -14q44 -22 101 -22q120 0 293 92zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9 h-64q-14 0 -23 9t-9 23v1266q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102 q-15 -9 -33 -9q-16 0 -32 8q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" />
-<glyph unicode="&#xf11e;" horiz-adv-x="1792" d="M832 536v192q-181 -16 -384 -117v-185q205 96 384 110zM832 954v197q-172 -8 -384 -126v-189q215 111 384 118zM1664 491v184q-235 -116 -384 -71v224q-20 6 -39 15q-5 3 -33 17t-34.5 17t-31.5 15t-34.5 15.5t-32.5 13t-36 12.5t-35 8.5t-39.5 7.5t-39.5 4t-44 2 q-23 0 -49 -3v-222h19q102 0 192.5 -29t197.5 -82q19 -9 39 -15v-188q42 -17 91 -17q120 0 293 92zM1664 918v189q-169 -91 -306 -91q-45 0 -78 8v-196q148 -42 384 90zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v1266 q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102q-15 -9 -33 -9q-16 0 -32 8 q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" />
-<glyph unicode="&#xf120;" horiz-adv-x="1664" d="M585 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23zM1664 96v-64q0 -14 -9 -23t-23 -9h-960q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h960q14 0 23 -9 t9 -23z" />
-<glyph unicode="&#xf121;" horiz-adv-x="1920" d="M617 137l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23zM1208 1204l-373 -1291q-4 -13 -15.5 -19.5t-23.5 -2.5l-62 17q-13 4 -19.5 15.5t-2.5 24.5 l373 1291q4 13 15.5 19.5t23.5 2.5l62 -17q13 -4 19.5 -15.5t2.5 -24.5zM1865 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23z" />
-<glyph unicode="&#xf122;" horiz-adv-x="1792" d="M640 454v-70q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-69l-397 -398q-19 -19 -19 -45t19 -45zM1792 416q0 -58 -17 -133.5t-38.5 -138t-48 -125t-40.5 -90.5l-20 -40q-8 -17 -28 -17q-6 0 -9 1 q-25 8 -23 34q43 400 -106 565q-64 71 -170.5 110.5t-267.5 52.5v-251q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-262q411 -28 599 -221q169 -173 169 -509z" />
-<glyph unicode="&#xf123;" horiz-adv-x="1664" d="M1186 579l257 250l-356 52l-66 10l-30 60l-159 322v-963l59 -31l318 -168l-60 355l-12 66zM1638 841l-363 -354l86 -500q5 -33 -6 -51.5t-34 -18.5q-17 0 -40 12l-449 236l-449 -236q-23 -12 -40 -12q-23 0 -34 18.5t-6 51.5l86 500l-364 354q-32 32 -23 59.5t54 34.5 l502 73l225 455q20 41 49 41q28 0 49 -41l225 -455l502 -73q45 -7 54 -34.5t-24 -59.5z" />
-<glyph unicode="&#xf124;" horiz-adv-x="1408" d="M1401 1187l-640 -1280q-17 -35 -57 -35q-5 0 -15 2q-22 5 -35.5 22.5t-13.5 39.5v576h-576q-22 0 -39.5 13.5t-22.5 35.5t4 42t29 30l1280 640q13 7 29 7q27 0 45 -19q15 -14 18.5 -34.5t-6.5 -39.5z" />
-<glyph unicode="&#xf125;" horiz-adv-x="1664" d="M557 256h595v595zM512 301l595 595h-595v-595zM1664 224v-192q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v224h-864q-14 0 -23 9t-9 23v864h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224v224q0 14 9 23t23 9h192q14 0 23 -9t9 -23 v-224h851l246 247q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-247 -246v-851h224q14 0 23 -9t9 -23z" />
-<glyph unicode="&#xf126;" horiz-adv-x="1024" d="M288 64q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM288 1216q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM928 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1024 1088q0 -52 -26 -96.5t-70 -69.5 q-2 -287 -226 -414q-68 -38 -203 -81q-128 -40 -169.5 -71t-41.5 -100v-26q44 -25 70 -69.5t26 -96.5q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 52 26 96.5t70 69.5v820q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136q0 -52 -26 -96.5t-70 -69.5v-497 q54 26 154 57q55 17 87.5 29.5t70.5 31t59 39.5t40.5 51t28 69.5t8.5 91.5q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136z" />
-<glyph unicode="&#xf127;" horiz-adv-x="1664" d="M439 265l-256 -256q-10 -9 -23 -9q-12 0 -23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23zM608 224v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM384 448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23t9 23t23 9h320 q14 0 23 -9t9 -23zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-334 335q-21 21 -42 56l239 18l273 -274q27 -27 68 -27.5t68 26.5l147 146q28 28 28 67q0 40 -28 68l-274 275l18 239q35 -21 56 -42l336 -336q84 -86 84 -204zM1031 1044l-239 -18 l-273 274q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l274 -274l-18 -240q-35 21 -56 42l-336 336q-84 86 -84 204q0 120 85 203l147 146q83 83 203 83q121 0 204 -85l334 -335q21 -21 42 -56zM1664 960q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9 t-9 23t9 23t23 9h320q14 0 23 -9t9 -23zM1120 1504v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM1527 1353l-256 -256q-11 -9 -23 -9t-23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" />
-<glyph unicode="&#xf128;" horiz-adv-x="1024" d="M704 280v-240q0 -16 -12 -28t-28 -12h-240q-16 0 -28 12t-12 28v240q0 16 12 28t28 12h240q16 0 28 -12t12 -28zM1020 880q0 -54 -15.5 -101t-35 -76.5t-55 -59.5t-57.5 -43.5t-61 -35.5q-41 -23 -68.5 -65t-27.5 -67q0 -17 -12 -32.5t-28 -15.5h-240q-15 0 -25.5 18.5 t-10.5 37.5v45q0 83 65 156.5t143 108.5q59 27 84 56t25 76q0 42 -46.5 74t-107.5 32q-65 0 -108 -29q-35 -25 -107 -115q-13 -16 -31 -16q-12 0 -25 8l-164 125q-13 10 -15.5 25t5.5 28q160 266 464 266q80 0 161 -31t146 -83t106 -127.5t41 -158.5z" />
-<glyph unicode="&#xf129;" horiz-adv-x="640" d="M640 192v-128q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64v384h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-576h64q26 0 45 -19t19 -45zM512 1344v-192q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v192 q0 26 19 45t45 19h256q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf12a;" horiz-adv-x="640" d="M512 288v-224q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v224q0 26 19 45t45 19h256q26 0 45 -19t19 -45zM542 1344l-28 -768q-1 -26 -20.5 -45t-45.5 -19h-256q-26 0 -45.5 19t-20.5 45l-28 768q-1 26 17.5 45t44.5 19h320q26 0 44.5 -19t17.5 -45z" />
-<glyph unicode="&#xf12b;" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1534 846v-206h-514l-3 27 q-4 28 -4 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q83 65 188 65q110 0 178 -59.5t68 -158.5q0 -56 -24.5 -103t-62 -76.5t-81.5 -58.5t-82 -50.5t-65.5 -51.5t-30.5 -63h232v80 h126z" />
-<glyph unicode="&#xf12c;" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1536 -50v-206h-514l-4 27 q-3 45 -3 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q80 65 188 65q110 0 178 -59.5t68 -158.5q0 -66 -34.5 -118.5t-84 -86t-99.5 -62.5t-87 -63t-41 -73h232v80h126z" />
-<glyph unicode="&#xf12d;" horiz-adv-x="1920" d="M896 128l336 384h-768l-336 -384h768zM1909 1205q15 -34 9.5 -71.5t-30.5 -65.5l-896 -1024q-38 -44 -96 -44h-768q-38 0 -69.5 20.5t-47.5 54.5q-15 34 -9.5 71.5t30.5 65.5l896 1024q38 44 96 44h768q38 0 69.5 -20.5t47.5 -54.5z" />
-<glyph unicode="&#xf12e;" horiz-adv-x="1664" d="M1664 438q0 -81 -44.5 -135t-123.5 -54q-41 0 -77.5 17.5t-59 38t-56.5 38t-71 17.5q-110 0 -110 -124q0 -39 16 -115t15 -115v-5q-22 0 -33 -1q-34 -3 -97.5 -11.5t-115.5 -13.5t-98 -5q-61 0 -103 26.5t-42 83.5q0 37 17.5 71t38 56.5t38 59t17.5 77.5q0 79 -54 123.5 t-135 44.5q-84 0 -143 -45.5t-59 -127.5q0 -43 15 -83t33.5 -64.5t33.5 -53t15 -50.5q0 -45 -46 -89q-37 -35 -117 -35q-95 0 -245 24q-9 2 -27.5 4t-27.5 4l-13 2q-1 0 -3 1q-2 0 -2 1v1024q2 -1 17.5 -3.5t34 -5t21.5 -3.5q150 -24 245 -24q80 0 117 35q46 44 46 89 q0 22 -15 50.5t-33.5 53t-33.5 64.5t-15 83q0 82 59 127.5t144 45.5q80 0 134 -44.5t54 -123.5q0 -41 -17.5 -77.5t-38 -59t-38 -56.5t-17.5 -71q0 -57 42 -83.5t103 -26.5q64 0 180 15t163 17v-2q-1 -2 -3.5 -17.5t-5 -34t-3.5 -21.5q-24 -150 -24 -245q0 -80 35 -117 q44 -46 89 -46q22 0 50.5 15t53 33.5t64.5 33.5t83 15q82 0 127.5 -59t45.5 -143z" />
-<glyph unicode="&#xf130;" horiz-adv-x="1152" d="M1152 832v-128q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-217 24 -364.5 187.5t-147.5 384.5v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -185 131.5 -316.5t316.5 -131.5 t316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45zM896 1216v-512q0 -132 -94 -226t-226 -94t-226 94t-94 226v512q0 132 94 226t226 94t226 -94t94 -226z" />
-<glyph unicode="&#xf131;" horiz-adv-x="1408" d="M271 591l-101 -101q-42 103 -42 214v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -53 15 -113zM1385 1193l-361 -361v-128q0 -132 -94 -226t-226 -94q-55 0 -109 19l-96 -96q97 -51 205 -51q185 0 316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45v-128 q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-125 13 -235 81l-254 -254q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23t10 23l1234 1234q10 10 23 10t23 -10l82 -82q10 -10 10 -23 t-10 -23zM1005 1325l-621 -621v512q0 132 94 226t226 94q102 0 184.5 -59t116.5 -152z" />
-<glyph unicode="&#xf132;" horiz-adv-x="1280" d="M1088 576v640h-448v-1137q119 63 213 137q235 184 235 360zM1280 1344v-768q0 -86 -33.5 -170.5t-83 -150t-118 -127.5t-126.5 -103t-121 -77.5t-89.5 -49.5t-42.5 -20q-12 -6 -26 -6t-26 6q-16 7 -42.5 20t-89.5 49.5t-121 77.5t-126.5 103t-118 127.5t-83 150 t-33.5 170.5v768q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf133;" horiz-adv-x="1664" d="M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280 q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
-<glyph unicode="&#xf134;" horiz-adv-x="1408" d="M512 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 1376v-320q0 -16 -12 -25q-8 -7 -20 -7q-4 0 -7 1l-448 96q-11 2 -18 11t-7 20h-256v-102q111 -23 183.5 -111t72.5 -203v-800q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v800 q0 106 62.5 190.5t161.5 114.5v111h-32q-59 0 -115 -23.5t-91.5 -53t-66 -66.5t-40.5 -53.5t-14 -24.5q-17 -35 -57 -35q-16 0 -29 7q-23 12 -31.5 37t3.5 49q5 10 14.5 26t37.5 53.5t60.5 70t85 67t108.5 52.5q-25 42 -25 86q0 66 47 113t113 47t113 -47t47 -113 q0 -33 -14 -64h302q0 11 7 20t18 11l448 96q3 1 7 1q12 0 20 -7q12 -9 12 -25z" />
-<glyph unicode="&#xf135;" horiz-adv-x="1664" d="M1440 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1664 1376q0 -249 -75.5 -430.5t-253.5 -360.5q-81 -80 -195 -176l-20 -379q-2 -16 -16 -26l-384 -224q-7 -4 -16 -4q-12 0 -23 9l-64 64q-13 14 -8 32l85 276l-281 281l-276 -85q-3 -1 -9 -1 q-14 0 -23 9l-64 64q-17 19 -5 39l224 384q10 14 26 16l379 20q96 114 176 195q188 187 358 258t431 71q14 0 24 -9.5t10 -22.5z" />
-<glyph unicode="&#xf136;" horiz-adv-x="1792" d="M1745 763l-164 -763h-334l178 832q13 56 -15 88q-27 33 -83 33h-169l-204 -953h-334l204 953h-286l-204 -953h-334l204 953l-153 327h1276q101 0 189.5 -40.5t147.5 -113.5q60 -73 81 -168.5t0 -194.5z" />
-<glyph unicode="&#xf137;" d="M909 141l102 102q19 19 19 45t-19 45l-307 307l307 307q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf138;" d="M717 141l454 454q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l307 -307l-307 -307q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf139;" d="M1165 397l102 102q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l307 307l307 -307q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf13a;" d="M813 237l454 454q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-307 -307l-307 307q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf13b;" horiz-adv-x="1408" d="M1130 939l16 175h-884l47 -534h612l-22 -228l-197 -53l-196 53l-13 140h-175l22 -278l362 -100h4v1l359 99l50 544h-644l-15 181h674zM0 1408h1408l-128 -1438l-578 -162l-574 162z" />
-<glyph unicode="&#xf13c;" horiz-adv-x="1792" d="M275 1408h1505l-266 -1333l-804 -267l-698 267l71 356h297l-29 -147l422 -161l486 161l68 339h-1208l58 297h1209l38 191h-1208z" />
-<glyph unicode="&#xf13d;" horiz-adv-x="1792" d="M960 1280q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1792 352v-352q0 -22 -20 -30q-8 -2 -12 -2q-13 0 -23 9l-93 93q-119 -143 -318.5 -226.5t-429.5 -83.5t-429.5 83.5t-318.5 226.5l-93 -93q-9 -9 -23 -9q-4 0 -12 2q-20 8 -20 30v352 q0 14 9 23t23 9h352q22 0 30 -20q8 -19 -7 -35l-100 -100q67 -91 189.5 -153.5t271.5 -82.5v647h-192q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h192v163q-58 34 -93 92.5t-35 128.5q0 106 75 181t181 75t181 -75t75 -181q0 -70 -35 -128.5t-93 -92.5v-163h192q26 0 45 -19 t19 -45v-128q0 -26 -19 -45t-45 -19h-192v-647q149 20 271.5 82.5t189.5 153.5l-100 100q-15 16 -7 35q8 20 30 20h352q14 0 23 -9t9 -23z" />
-<glyph unicode="&#xf13e;" horiz-adv-x="1152" d="M1056 768q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v320q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45q0 106 -75 181t-181 75t-181 -75t-75 -181 v-320h736z" />
-<glyph unicode="&#xf140;" d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM1152 640q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM1280 640q0 -212 -150 -362t-362 -150t-362 150 t-150 362t150 362t362 150t362 -150t150 -362zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf141;" horiz-adv-x="1408" d="M384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM896 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM1408 800v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
-<glyph unicode="&#xf142;" horiz-adv-x="384" d="M384 288v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 1312v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
-<glyph unicode="&#xf143;" d="M512 256q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM863 162q-13 232 -177 396t-396 177q-14 1 -24 -9t-10 -23v-128q0 -13 8.5 -22t21.5 -10q154 -11 264 -121t121 -264q1 -13 10 -21.5t22 -8.5h128q13 0 23 10 t9 24zM1247 161q-5 154 -56 297.5t-139.5 260t-205 205t-260 139.5t-297.5 56q-14 1 -23 -9q-10 -10 -10 -23v-128q0 -13 9 -22t22 -10q204 -7 378 -111.5t278.5 -278.5t111.5 -378q1 -13 10 -22t22 -9h128q13 0 23 10q11 9 9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf144;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1152 585q32 18 32 55t-32 55l-544 320q-31 19 -64 1q-32 -19 -32 -56v-640q0 -37 32 -56 q16 -8 32 -8q17 0 32 9z" />
-<glyph unicode="&#xf145;" horiz-adv-x="1792" d="M1024 1084l316 -316l-572 -572l-316 316zM813 105l618 618q19 19 19 45t-19 45l-362 362q-18 18 -45 18t-45 -18l-618 -618q-19 -19 -19 -45t19 -45l362 -362q18 -18 45 -18t45 18zM1702 742l-907 -908q-37 -37 -90.5 -37t-90.5 37l-126 126q56 56 56 136t-56 136 t-136 56t-136 -56l-125 126q-37 37 -37 90.5t37 90.5l907 906q37 37 90.5 37t90.5 -37l125 -125q-56 -56 -56 -136t56 -136t136 -56t136 56l126 -125q37 -37 37 -90.5t-37 -90.5z" />
-<glyph unicode="&#xf146;" d="M1280 576v128q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h896q26 0 45 19t19 45zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 t84.5 -203.5z" />
-<glyph unicode="&#xf147;" horiz-adv-x="1408" d="M1152 736v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h832q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5 t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf148;" horiz-adv-x="1024" d="M1018 933q-18 -37 -58 -37h-192v-864q0 -14 -9 -23t-23 -9h-704q-21 0 -29 18q-8 20 4 35l160 192q9 11 25 11h320v640h-192q-40 0 -58 37q-17 37 9 68l320 384q18 22 49 22t49 -22l320 -384q27 -32 9 -68z" />
-<glyph unicode="&#xf149;" horiz-adv-x="1024" d="M32 1280h704q13 0 22.5 -9.5t9.5 -23.5v-863h192q40 0 58 -37t-9 -69l-320 -384q-18 -22 -49 -22t-49 22l-320 384q-26 31 -9 69q18 37 58 37h192v640h-320q-14 0 -25 11l-160 192q-13 14 -4 34q9 19 29 19z" />
-<glyph unicode="&#xf14a;" d="M685 237l614 614q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-467 -467l-211 211q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l358 -358q19 -19 45 -19t45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5 t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf14b;" d="M404 428l152 -152l-52 -52h-56v96h-96v56zM818 818q14 -13 -3 -30l-291 -291q-17 -17 -30 -3q-14 13 3 30l291 291q17 17 30 3zM544 128l544 544l-288 288l-544 -544v-288h288zM1152 736l92 92q28 28 28 68t-28 68l-152 152q-28 28 -68 28t-68 -28l-92 -92zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf14c;" d="M1280 608v480q0 26 -19 45t-45 19h-480q-42 0 -59 -39q-17 -41 14 -70l144 -144l-534 -534q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l534 534l144 -144q18 -19 45 -19q12 0 25 5q39 17 39 59zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf14d;" d="M1005 435l352 352q19 19 19 45t-19 45l-352 352q-30 31 -69 14q-40 -17 -40 -59v-160q-119 0 -216 -19.5t-162.5 -51t-114 -79t-76.5 -95.5t-44.5 -109t-21.5 -111.5t-5 -110.5q0 -181 167 -404q10 -12 25 -12q7 0 13 3q22 9 19 33q-44 354 62 473q46 52 130 75.5 t224 23.5v-160q0 -42 40 -59q12 -5 24 -5q26 0 45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf14e;" d="M640 448l256 128l-256 128v-256zM1024 1039v-542l-512 -256v542zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf150;" d="M1145 861q18 -35 -5 -66l-320 -448q-19 -27 -52 -27t-52 27l-320 448q-23 31 -5 66q17 35 57 35h640q40 0 57 -35zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf151;" d="M1145 419q-17 -35 -57 -35h-640q-40 0 -57 35q-18 35 5 66l320 448q19 27 52 27t52 -27l320 -448q23 -31 5 -66zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf152;" d="M1088 640q0 -33 -27 -52l-448 -320q-31 -23 -66 -5q-35 17 -35 57v640q0 40 35 57q35 18 66 -5l448 -320q27 -19 27 -52zM1280 160v960q0 14 -9 23t-23 9h-960q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h960q14 0 23 9t9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf153;" horiz-adv-x="1024" d="M976 229l35 -159q3 -12 -3 -22.5t-17 -14.5l-5 -1q-4 -2 -10.5 -3.5t-16 -4.5t-21.5 -5.5t-25.5 -5t-30 -5t-33.5 -4.5t-36.5 -3t-38.5 -1q-234 0 -409 130.5t-238 351.5h-95q-13 0 -22.5 9.5t-9.5 22.5v113q0 13 9.5 22.5t22.5 9.5h66q-2 57 1 105h-67q-14 0 -23 9 t-9 23v114q0 14 9 23t23 9h98q67 210 243.5 338t400.5 128q102 0 194 -23q11 -3 20 -15q6 -11 3 -24l-43 -159q-3 -13 -14 -19.5t-24 -2.5l-4 1q-4 1 -11.5 2.5l-17.5 3.5t-22.5 3.5t-26 3t-29 2.5t-29.5 1q-126 0 -226 -64t-150 -176h468q16 0 25 -12q10 -12 7 -26 l-24 -114q-5 -26 -32 -26h-488q-3 -37 0 -105h459q15 0 25 -12q9 -12 6 -27l-24 -112q-2 -11 -11 -18.5t-20 -7.5h-387q48 -117 149.5 -185.5t228.5 -68.5q18 0 36 1.5t33.5 3.5t29.5 4.5t24.5 5t18.5 4.5l12 3l5 2q13 5 26 -2q12 -7 15 -21z" />
-<glyph unicode="&#xf154;" horiz-adv-x="1024" d="M1020 399v-367q0 -14 -9 -23t-23 -9h-956q-14 0 -23 9t-9 23v150q0 13 9.5 22.5t22.5 9.5h97v383h-95q-14 0 -23 9.5t-9 22.5v131q0 14 9 23t23 9h95v223q0 171 123.5 282t314.5 111q185 0 335 -125q9 -8 10 -20.5t-7 -22.5l-103 -127q-9 -11 -22 -12q-13 -2 -23 7 q-5 5 -26 19t-69 32t-93 18q-85 0 -137 -47t-52 -123v-215h305q13 0 22.5 -9t9.5 -23v-131q0 -13 -9.5 -22.5t-22.5 -9.5h-305v-379h414v181q0 13 9 22.5t23 9.5h162q14 0 23 -9.5t9 -22.5z" />
-<glyph unicode="&#xf155;" horiz-adv-x="1024" d="M978 351q0 -153 -99.5 -263.5t-258.5 -136.5v-175q0 -14 -9 -23t-23 -9h-135q-13 0 -22.5 9.5t-9.5 22.5v175q-66 9 -127.5 31t-101.5 44.5t-74 48t-46.5 37.5t-17.5 18q-17 21 -2 41l103 135q7 10 23 12q15 2 24 -9l2 -2q113 -99 243 -125q37 -8 74 -8q81 0 142.5 43 t61.5 122q0 28 -15 53t-33.5 42t-58.5 37.5t-66 32t-80 32.5q-39 16 -61.5 25t-61.5 26.5t-62.5 31t-56.5 35.5t-53.5 42.5t-43.5 49t-35.5 58t-21 66.5t-8.5 78q0 138 98 242t255 134v180q0 13 9.5 22.5t22.5 9.5h135q14 0 23 -9t9 -23v-176q57 -6 110.5 -23t87 -33.5 t63.5 -37.5t39 -29t15 -14q17 -18 5 -38l-81 -146q-8 -15 -23 -16q-14 -3 -27 7q-3 3 -14.5 12t-39 26.5t-58.5 32t-74.5 26t-85.5 11.5q-95 0 -155 -43t-60 -111q0 -26 8.5 -48t29.5 -41.5t39.5 -33t56 -31t60.5 -27t70 -27.5q53 -20 81 -31.5t76 -35t75.5 -42.5t62 -50 t53 -63.5t31.5 -76.5t13 -94z" />
-<glyph unicode="&#xf156;" horiz-adv-x="898" d="M898 1066v-102q0 -14 -9 -23t-23 -9h-168q-23 -144 -129 -234t-276 -110q167 -178 459 -536q14 -16 4 -34q-8 -18 -29 -18h-195q-16 0 -25 12q-306 367 -498 571q-9 9 -9 22v127q0 13 9.5 22.5t22.5 9.5h112q132 0 212.5 43t102.5 125h-427q-14 0 -23 9t-9 23v102 q0 14 9 23t23 9h413q-57 113 -268 113h-145q-13 0 -22.5 9.5t-9.5 22.5v133q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-102q0 -14 -9 -23t-23 -9h-233q47 -61 64 -144h171q14 0 23 -9t9 -23z" />
-<glyph unicode="&#xf157;" horiz-adv-x="1027" d="M603 0h-172q-13 0 -22.5 9t-9.5 23v330h-288q-13 0 -22.5 9t-9.5 23v103q0 13 9.5 22.5t22.5 9.5h288v85h-288q-13 0 -22.5 9t-9.5 23v104q0 13 9.5 22.5t22.5 9.5h214l-321 578q-8 16 0 32q10 16 28 16h194q19 0 29 -18l215 -425q19 -38 56 -125q10 24 30.5 68t27.5 61 l191 420q8 19 29 19h191q17 0 27 -16q9 -14 1 -31l-313 -579h215q13 0 22.5 -9.5t9.5 -22.5v-104q0 -14 -9.5 -23t-22.5 -9h-290v-85h290q13 0 22.5 -9.5t9.5 -22.5v-103q0 -14 -9.5 -23t-22.5 -9h-290v-330q0 -13 -9.5 -22.5t-22.5 -9.5z" />
-<glyph unicode="&#xf158;" horiz-adv-x="1280" d="M1043 971q0 100 -65 162t-171 62h-320v-448h320q106 0 171 62t65 162zM1280 971q0 -193 -126.5 -315t-326.5 -122h-340v-118h505q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-505v-192q0 -14 -9.5 -23t-22.5 -9h-167q-14 0 -23 9t-9 23v192h-224q-14 0 -23 9t-9 23v128 q0 14 9 23t23 9h224v118h-224q-14 0 -23 9t-9 23v149q0 13 9 22.5t23 9.5h224v629q0 14 9 23t23 9h539q200 0 326.5 -122t126.5 -315z" />
-<glyph unicode="&#xf159;" horiz-adv-x="1792" d="M514 341l81 299h-159l75 -300q1 -1 1 -3t1 -3q0 1 0.5 3.5t0.5 3.5zM630 768l35 128h-292l32 -128h225zM822 768h139l-35 128h-70zM1271 340l78 300h-162l81 -299q0 -1 0.5 -3.5t1.5 -3.5q0 1 0.5 3t0.5 3zM1382 768l33 128h-297l34 -128h230zM1792 736v-64q0 -14 -9 -23 t-23 -9h-213l-164 -616q-7 -24 -31 -24h-159q-24 0 -31 24l-166 616h-209l-167 -616q-7 -24 -31 -24h-159q-11 0 -19.5 7t-10.5 17l-160 616h-208q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h175l-33 128h-142q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h109l-89 344q-5 15 5 28 q10 12 26 12h137q26 0 31 -24l90 -360h359l97 360q7 24 31 24h126q24 0 31 -24l98 -360h365l93 360q5 24 31 24h137q16 0 26 -12q10 -13 5 -28l-91 -344h111q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-145l-34 -128h179q14 0 23 -9t9 -23z" />
-<glyph unicode="&#xf15a;" horiz-adv-x="1280" d="M1167 896q18 -182 -131 -258q117 -28 175 -103t45 -214q-7 -71 -32.5 -125t-64.5 -89t-97 -58.5t-121.5 -34.5t-145.5 -15v-255h-154v251q-80 0 -122 1v-252h-154v255q-18 0 -54 0.5t-55 0.5h-200l31 183h111q50 0 58 51v402h16q-6 1 -16 1v287q-13 68 -89 68h-111v164 l212 -1q64 0 97 1v252h154v-247q82 2 122 2v245h154v-252q79 -7 140 -22.5t113 -45t82.5 -78t36.5 -114.5zM952 351q0 36 -15 64t-37 46t-57.5 30.5t-65.5 18.5t-74 9t-69 3t-64.5 -1t-47.5 -1v-338q8 0 37 -0.5t48 -0.5t53 1.5t58.5 4t57 8.5t55.5 14t47.5 21t39.5 30 t24.5 40t9.5 51zM881 827q0 33 -12.5 58.5t-30.5 42t-48 28t-55 16.5t-61.5 8t-58 2.5t-54 -1t-39.5 -0.5v-307q5 0 34.5 -0.5t46.5 0t50 2t55 5.5t51.5 11t48.5 18.5t37 27t27 38.5t9 51z" />
-<glyph unicode="&#xf15b;" horiz-adv-x="1280" d="M1280 768v-800q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h544v-544q0 -40 28 -68t68 -28h544zM1277 896h-509v509q82 -15 132 -65l312 -312q50 -50 65 -132z" />
-<glyph unicode="&#xf15c;" horiz-adv-x="1280" d="M1024 160v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1024 416v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1280 768v-800q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28 t-28 68v1344q0 40 28 68t68 28h544v-544q0 -40 28 -68t68 -28h544zM1277 896h-509v509q82 -15 132 -65l312 -312q50 -50 65 -132z" />
-<glyph unicode="&#xf15d;" horiz-adv-x="1664" d="M1191 1128h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1572 -23 v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -11v-2l14 2q9 2 30 2h248v119h121zM1661 874v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162 l230 -662h70z" />
-<glyph unicode="&#xf15e;" horiz-adv-x="1664" d="M1191 104h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1661 -150 v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162l230 -662h70zM1572 1001v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -10v-3l14 3q9 1 30 1h248 v119h121z" />
-<glyph unicode="&#xf160;" horiz-adv-x="1792" d="M736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1792 -32v-192q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832 q14 0 23 -9t9 -23zM1600 480v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1408 992v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1216 1504v-192q0 -14 -9 -23t-23 -9h-256 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23z" />
-<glyph unicode="&#xf161;" horiz-adv-x="1792" d="M1216 -32v-192q0 -14 -9 -23t-23 -9h-256q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192 q14 0 23 -9t9 -23zM1408 480v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1600 992v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1792 1504v-192q0 -14 -9 -23t-23 -9h-832 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832q14 0 23 -9t9 -23z" />
-<glyph unicode="&#xf162;" d="M1346 223q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23 zM1486 165q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5 t82 -252.5zM1456 882v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165z" />
-<glyph unicode="&#xf163;" d="M1346 1247q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9 t9 -23zM1456 -142v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165zM1486 1189q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13 q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5t82 -252.5z" />
-<glyph unicode="&#xf164;" horiz-adv-x="1664" d="M256 192q0 26 -19 45t-45 19q-27 0 -45.5 -19t-18.5 -45q0 -27 18.5 -45.5t45.5 -18.5q26 0 45 18.5t19 45.5zM416 704v-640q0 -26 -19 -45t-45 -19h-288q-26 0 -45 19t-19 45v640q0 26 19 45t45 19h288q26 0 45 -19t19 -45zM1600 704q0 -86 -55 -149q15 -44 15 -76 q3 -76 -43 -137q17 -56 0 -117q-15 -57 -54 -94q9 -112 -49 -181q-64 -76 -197 -78h-36h-76h-17q-66 0 -144 15.5t-121.5 29t-120.5 39.5q-123 43 -158 44q-26 1 -45 19.5t-19 44.5v641q0 25 18 43.5t43 20.5q24 2 76 59t101 121q68 87 101 120q18 18 31 48t17.5 48.5 t13.5 60.5q7 39 12.5 61t19.5 52t34 50q19 19 45 19q46 0 82.5 -10.5t60 -26t40 -40.5t24 -45t12 -50t5 -45t0.5 -39q0 -38 -9.5 -76t-19 -60t-27.5 -56q-3 -6 -10 -18t-11 -22t-8 -24h277q78 0 135 -57t57 -135z" />
-<glyph unicode="&#xf165;" horiz-adv-x="1664" d="M256 960q0 -26 -19 -45t-45 -19q-27 0 -45.5 19t-18.5 45q0 27 18.5 45.5t45.5 18.5q26 0 45 -18.5t19 -45.5zM416 448v640q0 26 -19 45t-45 19h-288q-26 0 -45 -19t-19 -45v-640q0 -26 19 -45t45 -19h288q26 0 45 19t19 45zM1545 597q55 -61 55 -149q-1 -78 -57.5 -135 t-134.5 -57h-277q4 -14 8 -24t11 -22t10 -18q18 -37 27 -57t19 -58.5t10 -76.5q0 -24 -0.5 -39t-5 -45t-12 -50t-24 -45t-40 -40.5t-60 -26t-82.5 -10.5q-26 0 -45 19q-20 20 -34 50t-19.5 52t-12.5 61q-9 42 -13.5 60.5t-17.5 48.5t-31 48q-33 33 -101 120q-49 64 -101 121 t-76 59q-25 2 -43 20.5t-18 43.5v641q0 26 19 44.5t45 19.5q35 1 158 44q77 26 120.5 39.5t121.5 29t144 15.5h17h76h36q133 -2 197 -78q58 -69 49 -181q39 -37 54 -94q17 -61 0 -117q46 -61 43 -137q0 -32 -15 -76z" />
-<glyph unicode="&#xf166;" d="M919 233v157q0 50 -29 50q-17 0 -33 -16v-224q16 -16 33 -16q29 0 29 49zM1103 355h66v34q0 51 -33 51t-33 -51v-34zM532 621v-70h-80v-423h-74v423h-78v70h232zM733 495v-367h-67v40q-39 -45 -76 -45q-33 0 -42 28q-6 16 -6 54v290h66v-270q0 -24 1 -26q1 -15 15 -15 q20 0 42 31v280h67zM985 384v-146q0 -52 -7 -73q-12 -42 -53 -42q-35 0 -68 41v-36h-67v493h67v-161q32 40 68 40q41 0 53 -42q7 -21 7 -74zM1236 255v-9q0 -29 -2 -43q-3 -22 -15 -40q-27 -40 -80 -40q-52 0 -81 38q-21 27 -21 86v129q0 59 20 86q29 38 80 38t78 -38 q21 -28 21 -86v-76h-133v-65q0 -51 34 -51q24 0 30 26q0 1 0.5 7t0.5 16.5v21.5h68zM785 1079v-156q0 -51 -32 -51t-32 51v156q0 52 32 52t32 -52zM1318 366q0 177 -19 260q-10 44 -43 73.5t-76 34.5q-136 15 -412 15q-275 0 -411 -15q-44 -5 -76.5 -34.5t-42.5 -73.5 q-20 -87 -20 -260q0 -176 20 -260q10 -43 42.5 -73t75.5 -35q137 -15 412 -15t412 15q43 5 75.5 35t42.5 73q20 84 20 260zM563 1017l90 296h-75l-51 -195l-53 195h-78l24 -69t23 -69q35 -103 46 -158v-201h74v201zM852 936v130q0 58 -21 87q-29 38 -78 38q-51 0 -78 -38 q-21 -29 -21 -87v-130q0 -58 21 -87q27 -38 78 -38q49 0 78 38q21 27 21 87zM1033 816h67v370h-67v-283q-22 -31 -42 -31q-15 0 -16 16q-1 2 -1 26v272h-67v-293q0 -37 6 -55q11 -27 43 -27q36 0 77 45v-40zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf167;" d="M971 292v-211q0 -67 -39 -67q-23 0 -45 22v301q22 22 45 22q39 0 39 -67zM1309 291v-46h-90v46q0 68 45 68t45 -68zM343 509h107v94h-312v-94h105v-569h100v569zM631 -60h89v494h-89v-378q-30 -42 -57 -42q-18 0 -21 21q-1 3 -1 35v364h-89v-391q0 -49 8 -73 q12 -37 58 -37q48 0 102 61v-54zM1060 88v197q0 73 -9 99q-17 56 -71 56q-50 0 -93 -54v217h-89v-663h89v48q45 -55 93 -55q54 0 71 55q9 27 9 100zM1398 98v13h-91q0 -51 -2 -61q-7 -36 -40 -36q-46 0 -46 69v87h179v103q0 79 -27 116q-39 51 -106 51q-68 0 -107 -51 q-28 -37 -28 -116v-173q0 -79 29 -116q39 -51 108 -51q72 0 108 53q18 27 21 54q2 9 2 58zM790 1011v210q0 69 -43 69t-43 -69v-210q0 -70 43 -70t43 70zM1509 260q0 -234 -26 -350q-14 -59 -58 -99t-102 -46q-184 -21 -555 -21t-555 21q-58 6 -102.5 46t-57.5 99 q-26 112 -26 350q0 234 26 350q14 59 58 99t103 47q183 20 554 20t555 -20q58 -7 102.5 -47t57.5 -99q26 -112 26 -350zM511 1536h102l-121 -399v-271h-100v271q-14 74 -61 212q-37 103 -65 187h106l71 -263zM881 1203v-175q0 -81 -28 -118q-37 -51 -106 -51q-67 0 -105 51 q-28 38 -28 118v175q0 80 28 117q38 51 105 51q69 0 106 -51q28 -37 28 -117zM1216 1365v-499h-91v55q-53 -62 -103 -62q-46 0 -59 37q-8 24 -8 75v394h91v-367q0 -33 1 -35q3 -22 21 -22q27 0 57 43v381h91z" />
-<glyph unicode="&#xf168;" horiz-adv-x="1408" d="M597 869q-10 -18 -257 -456q-27 -46 -65 -46h-239q-21 0 -31 17t0 36l253 448q1 0 0 1l-161 279q-12 22 -1 37q9 15 32 15h239q40 0 66 -45zM1403 1511q11 -16 0 -37l-528 -934v-1l336 -615q11 -20 1 -37q-10 -15 -32 -15h-239q-42 0 -66 45l-339 622q18 32 531 942 q25 45 64 45h241q22 0 31 -15z" />
-<glyph unicode="&#xf169;" d="M685 771q0 1 -126 222q-21 34 -52 34h-184q-18 0 -26 -11q-7 -12 1 -29l125 -216v-1l-196 -346q-9 -14 0 -28q8 -13 24 -13h185q31 0 50 36zM1309 1268q-7 12 -24 12h-187q-30 0 -49 -35l-411 -729q1 -2 262 -481q20 -35 52 -35h184q18 0 25 12q8 13 -1 28l-260 476v1 l409 723q8 16 0 28zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf16a;" horiz-adv-x="1792" d="M1280 640q0 37 -30 54l-512 320q-31 20 -65 2q-33 -18 -33 -56v-640q0 -38 33 -56q16 -8 31 -8q20 0 34 10l512 320q30 17 30 54zM1792 640q0 -96 -1 -150t-8.5 -136.5t-22.5 -147.5q-16 -73 -69 -123t-124 -58q-222 -25 -671 -25t-671 25q-71 8 -124.5 58t-69.5 123 q-14 65 -21.5 147.5t-8.5 136.5t-1 150t1 150t8.5 136.5t22.5 147.5q16 73 69 123t124 58q222 25 671 25t671 -25q71 -8 124.5 -58t69.5 -123q14 -65 21.5 -147.5t8.5 -136.5t1 -150z" />
-<glyph unicode="&#xf16b;" horiz-adv-x="1792" d="M402 829l494 -305l-342 -285l-490 319zM1388 274v-108l-490 -293v-1l-1 1l-1 -1v1l-489 293v108l147 -96l342 284v2l1 -1l1 1v-2l343 -284zM554 1418l342 -285l-494 -304l-338 270zM1390 829l338 -271l-489 -319l-343 285zM1239 1418l489 -319l-338 -270l-494 304z" />
-<glyph unicode="&#xf16c;" horiz-adv-x="1408" d="M928 135v-151l-707 -1v151zM1169 481v-701l-1 -35v-1h-1132l-35 1h-1v736h121v-618h928v618h120zM241 393l704 -65l-13 -150l-705 65zM309 709l683 -183l-39 -146l-683 183zM472 1058l609 -360l-77 -130l-609 360zM832 1389l398 -585l-124 -85l-399 584zM1285 1536 l121 -697l-149 -26l-121 697z" />
-<glyph unicode="&#xf16d;" d="M1362 110v648h-135q20 -63 20 -131q0 -126 -64 -232.5t-174 -168.5t-240 -62q-197 0 -337 135.5t-140 327.5q0 68 20 131h-141v-648q0 -26 17.5 -43.5t43.5 -17.5h1069q25 0 43 17.5t18 43.5zM1078 643q0 124 -90.5 211.5t-218.5 87.5q-127 0 -217.5 -87.5t-90.5 -211.5 t90.5 -211.5t217.5 -87.5q128 0 218.5 87.5t90.5 211.5zM1362 1003v165q0 28 -20 48.5t-49 20.5h-174q-29 0 -49 -20.5t-20 -48.5v-165q0 -29 20 -49t49 -20h174q29 0 49 20t20 49zM1536 1211v-1142q0 -81 -58 -139t-139 -58h-1142q-81 0 -139 58t-58 139v1142q0 81 58 139 t139 58h1142q81 0 139 -58t58 -139z" />
-<glyph unicode="&#xf16e;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM698 640q0 88 -62 150t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150zM1262 640q0 88 -62 150 t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150z" />
-<glyph unicode="&#xf170;" d="M768 914l201 -306h-402zM1133 384h94l-459 691l-459 -691h94l104 160h522zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf171;" horiz-adv-x="1408" d="M815 677q8 -63 -50.5 -101t-111.5 -6q-39 17 -53.5 58t-0.5 82t52 58q36 18 72.5 12t64 -35.5t27.5 -67.5zM926 698q-14 107 -113 164t-197 13q-63 -28 -100.5 -88.5t-34.5 -129.5q4 -91 77.5 -155t165.5 -56q91 8 152 84t50 168zM1165 1240q-20 27 -56 44.5t-58 22 t-71 12.5q-291 47 -566 -2q-43 -7 -66 -12t-55 -22t-50 -43q30 -28 76 -45.5t73.5 -22t87.5 -11.5q228 -29 448 -1q63 8 89.5 12t72.5 21.5t75 46.5zM1222 205q-8 -26 -15.5 -76.5t-14 -84t-28.5 -70t-58 -56.5q-86 -48 -189.5 -71.5t-202 -22t-201.5 18.5q-46 8 -81.5 18 t-76.5 27t-73 43.5t-52 61.5q-25 96 -57 292l6 16l18 9q223 -148 506.5 -148t507.5 148q21 -6 24 -23t-5 -45t-8 -37zM1403 1166q-26 -167 -111 -655q-5 -30 -27 -56t-43.5 -40t-54.5 -31q-252 -126 -610 -88q-248 27 -394 139q-15 12 -25.5 26.5t-17 35t-9 34t-6 39.5 t-5.5 35q-9 50 -26.5 150t-28 161.5t-23.5 147.5t-22 158q3 26 17.5 48.5t31.5 37.5t45 30t46 22.5t48 18.5q125 46 313 64q379 37 676 -50q155 -46 215 -122q16 -20 16.5 -51t-5.5 -54z" />
-<glyph unicode="&#xf172;" d="M848 666q0 43 -41 66t-77 1q-43 -20 -42.5 -72.5t43.5 -70.5q39 -23 81 4t36 72zM928 682q8 -66 -36 -121t-110 -61t-119 40t-56 113q-2 49 25.5 93t72.5 64q70 31 141.5 -10t81.5 -118zM1100 1073q-20 -21 -53.5 -34t-53 -16t-63.5 -8q-155 -20 -324 0q-44 6 -63 9.5 t-52.5 16t-54.5 32.5q13 19 36 31t40 15.5t47 8.5q198 35 408 1q33 -5 51 -8.5t43 -16t39 -31.5zM1142 327q0 7 5.5 26.5t3 32t-17.5 16.5q-161 -106 -365 -106t-366 106l-12 -6l-5 -12q26 -154 41 -210q47 -81 204 -108q249 -46 428 53q34 19 49 51.5t22.5 85.5t12.5 71z M1272 1020q9 53 -8 75q-43 55 -155 88q-216 63 -487 36q-132 -12 -226 -46q-38 -15 -59.5 -25t-47 -34t-29.5 -54q8 -68 19 -138t29 -171t24 -137q1 -5 5 -31t7 -36t12 -27t22 -28q105 -80 284 -100q259 -28 440 63q24 13 39.5 23t31 29t19.5 40q48 267 80 473zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf173;" horiz-adv-x="1024" d="M390 1408h219v-388h364v-241h-364v-394q0 -136 14 -172q13 -37 52 -60q50 -31 117 -31q117 0 232 76v-242q-102 -48 -178 -65q-77 -19 -173 -19q-105 0 -186 27q-78 25 -138 75q-58 51 -79 105q-22 54 -22 161v539h-170v217q91 30 155 84q64 55 103 132q39 78 54 196z " />
-<glyph unicode="&#xf174;" d="M1123 127v181q-88 -56 -174 -56q-51 0 -88 23q-29 17 -39 45q-11 30 -11 129v295h274v181h-274v291h-164q-11 -90 -40 -147t-78 -99q-48 -40 -116 -63v-163h127v-404q0 -78 17 -121q17 -42 59 -78q43 -37 104 -57q62 -20 140 -20q67 0 129 14q57 13 134 49zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf175;" horiz-adv-x="768" d="M765 237q8 -19 -5 -35l-350 -384q-10 -10 -23 -10q-14 0 -24 10l-355 384q-13 16 -5 35q9 19 29 19h224v1248q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1248h224q21 0 29 -19z" />
-<glyph unicode="&#xf176;" horiz-adv-x="768" d="M765 1043q-9 -19 -29 -19h-224v-1248q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1248h-224q-21 0 -29 19t5 35l350 384q10 10 23 10q14 0 24 -10l355 -384q13 -16 5 -35z" />
-<glyph unicode="&#xf177;" horiz-adv-x="1792" d="M1792 736v-192q0 -14 -9 -23t-23 -9h-1248v-224q0 -21 -19 -29t-35 5l-384 350q-10 10 -10 23q0 14 10 24l384 354q16 14 35 6q19 -9 19 -29v-224h1248q14 0 23 -9t9 -23z" />
-<glyph unicode="&#xf178;" horiz-adv-x="1792" d="M1728 643q0 -14 -10 -24l-384 -354q-16 -14 -35 -6q-19 9 -19 29v224h-1248q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h1248v224q0 21 19 29t35 -5l384 -350q10 -10 10 -23z" />
-<glyph unicode="&#xf179;" horiz-adv-x="1408" d="M1393 321q-39 -125 -123 -250q-129 -196 -257 -196q-49 0 -140 32q-86 32 -151 32q-61 0 -142 -33q-81 -34 -132 -34q-152 0 -301 259q-147 261 -147 503q0 228 113 374q112 144 284 144q72 0 177 -30q104 -30 138 -30q45 0 143 34q102 34 173 34q119 0 213 -65 q52 -36 104 -100q-79 -67 -114 -118q-65 -94 -65 -207q0 -124 69 -223t158 -126zM1017 1494q0 -61 -29 -136q-30 -75 -93 -138q-54 -54 -108 -72q-37 -11 -104 -17q3 149 78 257q74 107 250 148q1 -3 2.5 -11t2.5 -11q0 -4 0.5 -10t0.5 -10z" />
-<glyph unicode="&#xf17a;" horiz-adv-x="1664" d="M682 530v-651l-682 94v557h682zM682 1273v-659h-682v565zM1664 530v-786l-907 125v661h907zM1664 1408v-794h-907v669z" />
-<glyph unicode="&#xf17b;" horiz-adv-x="1408" d="M493 1053q16 0 27.5 11.5t11.5 27.5t-11.5 27.5t-27.5 11.5t-27 -11.5t-11 -27.5t11 -27.5t27 -11.5zM915 1053q16 0 27 11.5t11 27.5t-11 27.5t-27 11.5t-27.5 -11.5t-11.5 -27.5t11.5 -27.5t27.5 -11.5zM103 869q42 0 72 -30t30 -72v-430q0 -43 -29.5 -73t-72.5 -30 t-73 30t-30 73v430q0 42 30 72t73 30zM1163 850v-666q0 -46 -32 -78t-77 -32h-75v-227q0 -43 -30 -73t-73 -30t-73 30t-30 73v227h-138v-227q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73l-1 227h-74q-46 0 -78 32t-32 78v666h918zM931 1255q107 -55 171 -153.5t64 -215.5 h-925q0 117 64 215.5t172 153.5l-71 131q-7 13 5 20q13 6 20 -6l72 -132q95 42 201 42t201 -42l72 132q7 12 20 6q12 -7 5 -20zM1408 767v-430q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73v430q0 43 30 72.5t72 29.5q43 0 73 -29.5t30 -72.5z" />
-<glyph unicode="&#xf17c;" d="M663 1125q-11 -1 -15.5 -10.5t-8.5 -9.5q-5 -1 -5 5q0 12 19 15h10zM750 1111q-4 -1 -11.5 6.5t-17.5 4.5q24 11 32 -2q3 -6 -3 -9zM399 684q-4 1 -6 -3t-4.5 -12.5t-5.5 -13.5t-10 -13q-7 -10 -1 -12q4 -1 12.5 7t12.5 18q1 3 2 7t2 6t1.5 4.5t0.5 4v3t-1 2.5t-3 2z M1254 325q0 18 -55 42q4 15 7.5 27.5t5 26t3 21.5t0.5 22.5t-1 19.5t-3.5 22t-4 20.5t-5 25t-5.5 26.5q-10 48 -47 103t-72 75q24 -20 57 -83q87 -162 54 -278q-11 -40 -50 -42q-31 -4 -38.5 18.5t-8 83.5t-11.5 107q-9 39 -19.5 69t-19.5 45.5t-15.5 24.5t-13 15t-7.5 7 q-14 62 -31 103t-29.5 56t-23.5 33t-15 40q-4 21 6 53.5t4.5 49.5t-44.5 25q-15 3 -44.5 18t-35.5 16q-8 1 -11 26t8 51t36 27q37 3 51 -30t4 -58q-11 -19 -2 -26.5t30 -0.5q13 4 13 36v37q-5 30 -13.5 50t-21 30.5t-23.5 15t-27 7.5q-107 -8 -89 -134q0 -15 -1 -15 q-9 9 -29.5 10.5t-33 -0.5t-15.5 5q1 57 -16 90t-45 34q-27 1 -41.5 -27.5t-16.5 -59.5q-1 -15 3.5 -37t13 -37.5t15.5 -13.5q10 3 16 14q4 9 -7 8q-7 0 -15.5 14.5t-9.5 33.5q-1 22 9 37t34 14q17 0 27 -21t9.5 -39t-1.5 -22q-22 -15 -31 -29q-8 -12 -27.5 -23.5 t-20.5 -12.5q-13 -14 -15.5 -27t7.5 -18q14 -8 25 -19.5t16 -19t18.5 -13t35.5 -6.5q47 -2 102 15q2 1 23 7t34.5 10.5t29.5 13t21 17.5q9 14 20 8q5 -3 6.5 -8.5t-3 -12t-16.5 -9.5q-20 -6 -56.5 -21.5t-45.5 -19.5q-44 -19 -70 -23q-25 -5 -79 2q-10 2 -9 -2t17 -19 q25 -23 67 -22q17 1 36 7t36 14t33.5 17.5t30 17t24.5 12t17.5 2.5t8.5 -11q0 -2 -1 -4.5t-4 -5t-6 -4.5t-8.5 -5t-9 -4.5t-10 -5t-9.5 -4.5q-28 -14 -67.5 -44t-66.5 -43t-49 -1q-21 11 -63 73q-22 31 -25 22q-1 -3 -1 -10q0 -25 -15 -56.5t-29.5 -55.5t-21 -58t11.5 -63 q-23 -6 -62.5 -90t-47.5 -141q-2 -18 -1.5 -69t-5.5 -59q-8 -24 -29 -3q-32 31 -36 94q-2 28 4 56q4 19 -1 18l-4 -5q-36 -65 10 -166q5 -12 25 -28t24 -20q20 -23 104 -90.5t93 -76.5q16 -15 17.5 -38t-14 -43t-45.5 -23q8 -15 29 -44.5t28 -54t7 -70.5q46 24 7 92 q-4 8 -10.5 16t-9.5 12t-2 6q3 5 13 9.5t20 -2.5q46 -52 166 -36q133 15 177 87q23 38 34 30q12 -6 10 -52q-1 -25 -23 -92q-9 -23 -6 -37.5t24 -15.5q3 19 14.5 77t13.5 90q2 21 -6.5 73.5t-7.5 97t23 70.5q15 18 51 18q1 37 34.5 53t72.5 10.5t60 -22.5zM626 1152 q3 17 -2.5 30t-11.5 15q-9 2 -9 -7q2 -5 5 -6q10 0 7 -15q-3 -20 8 -20q3 0 3 3zM1045 955q-2 8 -6.5 11.5t-13 5t-14.5 5.5q-5 3 -9.5 8t-7 8t-5.5 6.5t-4 4t-4 -1.5q-14 -16 7 -43.5t39 -31.5q9 -1 14.5 8t3.5 20zM867 1168q0 11 -5 19.5t-11 12.5t-9 3q-14 -1 -7 -7l4 -2 q14 -4 18 -31q0 -3 8 2zM921 1401q0 2 -2.5 5t-9 7t-9.5 6q-15 15 -24 15q-9 -1 -11.5 -7.5t-1 -13t-0.5 -12.5q-1 -4 -6 -10.5t-6 -9t3 -8.5q4 -3 8 0t11 9t15 9q1 1 9 1t15 2t9 7zM1486 60q20 -12 31 -24.5t12 -24t-2.5 -22.5t-15.5 -22t-23.5 -19.5t-30 -18.5 t-31.5 -16.5t-32 -15.5t-27 -13q-38 -19 -85.5 -56t-75.5 -64q-17 -16 -68 -19.5t-89 14.5q-18 9 -29.5 23.5t-16.5 25.5t-22 19.5t-47 9.5q-44 1 -130 1q-19 0 -57 -1.5t-58 -2.5q-44 -1 -79.5 -15t-53.5 -30t-43.5 -28.5t-53.5 -11.5q-29 1 -111 31t-146 43q-19 4 -51 9.5 t-50 9t-39.5 9.5t-33.5 14.5t-17 19.5q-10 23 7 66.5t18 54.5q1 16 -4 40t-10 42.5t-4.5 36.5t10.5 27q14 12 57 14t60 12q30 18 42 35t12 51q21 -73 -32 -106q-32 -20 -83 -15q-34 3 -43 -10q-13 -15 5 -57q2 -6 8 -18t8.5 -18t4.5 -17t1 -22q0 -15 -17 -49t-14 -48 q3 -17 37 -26q20 -6 84.5 -18.5t99.5 -20.5q24 -6 74 -22t82.5 -23t55.5 -4q43 6 64.5 28t23 48t-7.5 58.5t-19 52t-20 36.5q-121 190 -169 242q-68 74 -113 40q-11 -9 -15 15q-3 16 -2 38q1 29 10 52t24 47t22 42q8 21 26.5 72t29.5 78t30 61t39 54q110 143 124 195 q-12 112 -16 310q-2 90 24 151.5t106 104.5q39 21 104 21q53 1 106 -13.5t89 -41.5q57 -42 91.5 -121.5t29.5 -147.5q-5 -95 30 -214q34 -113 133 -218q55 -59 99.5 -163t59.5 -191q8 -49 5 -84.5t-12 -55.5t-20 -22q-10 -2 -23.5 -19t-27 -35.5t-40.5 -33.5t-61 -14 q-18 1 -31.5 5t-22.5 13.5t-13.5 15.5t-11.5 20.5t-9 19.5q-22 37 -41 30t-28 -49t7 -97q20 -70 1 -195q-10 -65 18 -100.5t73 -33t85 35.5q59 49 89.5 66.5t103.5 42.5q53 18 77 36.5t18.5 34.5t-25 28.5t-51.5 23.5q-33 11 -49.5 48t-15 72.5t15.5 47.5q1 -31 8 -56.5 t14.5 -40.5t20.5 -28.5t21 -19t21.5 -13t16.5 -9.5z" />
-<glyph unicode="&#xf17d;" d="M1024 36q-42 241 -140 498h-2l-2 -1q-16 -6 -43 -16.5t-101 -49t-137 -82t-131 -114.5t-103 -148l-15 11q184 -150 418 -150q132 0 256 52zM839 643q-21 49 -53 111q-311 -93 -673 -93q-1 -7 -1 -21q0 -124 44 -236.5t124 -201.5q50 89 123.5 166.5t142.5 124.5t130.5 81 t99.5 48l37 13q4 1 13 3.5t13 4.5zM732 855q-120 213 -244 378q-138 -65 -234 -186t-128 -272q302 0 606 80zM1416 536q-210 60 -409 29q87 -239 128 -469q111 75 185 189.5t96 250.5zM611 1277q-1 0 -2 -1q1 1 2 1zM1201 1132q-185 164 -433 164q-76 0 -155 -19 q131 -170 246 -382q69 26 130 60.5t96.5 61.5t65.5 57t37.5 40.5zM1424 647q-3 232 -149 410l-1 -1q-9 -12 -19 -24.5t-43.5 -44.5t-71 -60.5t-100 -65t-131.5 -64.5q25 -53 44 -95q2 -6 6.5 -17.5t7.5 -16.5q36 5 74.5 7t73.5 2t69 -1.5t64 -4t56.5 -5.5t48 -6.5t36.5 -6 t25 -4.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf17e;" d="M1173 473q0 50 -19.5 91.5t-48.5 68.5t-73 49t-82.5 34t-87.5 23l-104 24q-30 7 -44 10.5t-35 11.5t-30 16t-16.5 21t-7.5 30q0 77 144 77q43 0 77 -12t54 -28.5t38 -33.5t40 -29t48 -12q47 0 75.5 32t28.5 77q0 55 -56 99.5t-142 67.5t-182 23q-68 0 -132 -15.5 t-119.5 -47t-89 -87t-33.5 -128.5q0 -61 19 -106.5t56 -75.5t80 -48.5t103 -32.5l146 -36q90 -22 112 -36q32 -20 32 -60q0 -39 -40 -64.5t-105 -25.5q-51 0 -91.5 16t-65 38.5t-45.5 45t-46 38.5t-54 16q-50 0 -75.5 -30t-25.5 -75q0 -92 122 -157.5t291 -65.5 q73 0 140 18.5t122.5 53.5t88.5 93.5t33 131.5zM1536 256q0 -159 -112.5 -271.5t-271.5 -112.5q-130 0 -234 80q-77 -16 -150 -16q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5q0 73 16 150q-80 104 -80 234q0 159 112.5 271.5t271.5 112.5q130 0 234 -80 q77 16 150 16q143 0 273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -73 -16 -150q80 -104 80 -234z" />
-<glyph unicode="&#xf180;" horiz-adv-x="1664" d="M1483 512l-587 -587q-52 -53 -127.5 -53t-128.5 53l-587 587q-53 53 -53 128t53 128l587 587q53 53 128 53t128 -53l265 -265l-398 -399l-188 188q-42 42 -99 42q-59 0 -100 -41l-120 -121q-42 -40 -42 -99q0 -58 42 -100l406 -408q30 -28 67 -37l6 -4h28q60 0 99 41 l619 619l2 -3q53 -53 53 -128t-53 -128zM1406 1138l120 -120q14 -15 14 -36t-14 -36l-730 -730q-17 -15 -37 -15v0q-4 0 -6 1q-18 2 -30 14l-407 408q-14 15 -14 36t14 35l121 120q13 15 35 15t36 -15l252 -252l574 575q15 15 36 15t36 -15z" />
-<glyph unicode="&#xf181;" d="M704 192v1024q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-1024q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1376 576v640q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-640q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408 q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf182;" horiz-adv-x="1280" d="M1280 480q0 -40 -28 -68t-68 -28q-51 0 -80 43l-227 341h-45v-132l247 -411q9 -15 9 -33q0 -26 -19 -45t-45 -19h-192v-272q0 -46 -33 -79t-79 -33h-160q-46 0 -79 33t-33 79v272h-192q-26 0 -45 19t-19 45q0 18 9 33l247 411v132h-45l-227 -341q-29 -43 -80 -43 q-40 0 -68 28t-28 68q0 29 16 53l256 384q73 107 176 107h384q103 0 176 -107l256 -384q16 -24 16 -53zM864 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
-<glyph unicode="&#xf183;" horiz-adv-x="1024" d="M1024 832v-416q0 -40 -28 -68t-68 -28t-68 28t-28 68v352h-64v-912q0 -46 -33 -79t-79 -33t-79 33t-33 79v464h-64v-464q0 -46 -33 -79t-79 -33t-79 33t-33 79v912h-64v-352q0 -40 -28 -68t-68 -28t-68 28t-28 68v416q0 80 56 136t136 56h640q80 0 136 -56t56 -136z M736 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
-<glyph unicode="&#xf184;" d="M773 234l350 473q16 22 24.5 59t-6 85t-61.5 79q-40 26 -83 25.5t-73.5 -17.5t-54.5 -45q-36 -40 -96 -40q-59 0 -95 40q-24 28 -54.5 45t-73.5 17.5t-84 -25.5q-46 -31 -60.5 -79t-6 -85t24.5 -59zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf185;" horiz-adv-x="1792" d="M1472 640q0 117 -45.5 223.5t-123 184t-184 123t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5t45.5 -223.5t123 -184t184 -123t223.5 -45.5t223.5 45.5t184 123t123 184t45.5 223.5zM1748 363q-4 -15 -20 -20l-292 -96v-306q0 -16 -13 -26q-15 -10 -29 -4 l-292 94l-180 -248q-10 -13 -26 -13t-26 13l-180 248l-292 -94q-14 -6 -29 4q-13 10 -13 26v306l-292 96q-16 5 -20 20q-5 17 4 29l180 248l-180 248q-9 13 -4 29q4 15 20 20l292 96v306q0 16 13 26q15 10 29 4l292 -94l180 248q9 12 26 12t26 -12l180 -248l292 94 q14 6 29 -4q13 -10 13 -26v-306l292 -96q16 -5 20 -20q5 -16 -4 -29l-180 -248l180 -248q9 -12 4 -29z" />
-<glyph unicode="&#xf186;" d="M1262 233q-54 -9 -110 -9q-182 0 -337 90t-245 245t-90 337q0 192 104 357q-201 -60 -328.5 -229t-127.5 -384q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51q144 0 273.5 61.5t220.5 171.5zM1465 318q-94 -203 -283.5 -324.5t-413.5 -121.5q-156 0 -298 61 t-245 164t-164 245t-61 298q0 153 57.5 292.5t156 241.5t235.5 164.5t290 68.5q44 2 61 -39q18 -41 -15 -72q-86 -78 -131.5 -181.5t-45.5 -218.5q0 -148 73 -273t198 -198t273 -73q118 0 228 51q41 18 72 -13q14 -14 17.5 -34t-4.5 -38z" />
-<glyph unicode="&#xf187;" horiz-adv-x="1792" d="M1088 704q0 26 -19 45t-45 19h-256q-26 0 -45 -19t-19 -45t19 -45t45 -19h256q26 0 45 19t19 45zM1664 896v-960q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v960q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1728 1344v-256q0 -26 -19 -45t-45 -19h-1536 q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1536q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf188;" horiz-adv-x="1664" d="M1632 576q0 -26 -19 -45t-45 -19h-224q0 -171 -67 -290l208 -209q19 -19 19 -45t-19 -45q-18 -19 -45 -19t-45 19l-198 197q-5 -5 -15 -13t-42 -28.5t-65 -36.5t-82 -29t-97 -13v896h-128v-896q-51 0 -101.5 13.5t-87 33t-66 39t-43.5 32.5l-15 14l-183 -207 q-20 -21 -48 -21q-24 0 -43 16q-19 18 -20.5 44.5t15.5 46.5l202 227q-58 114 -58 274h-224q-26 0 -45 19t-19 45t19 45t45 19h224v294l-173 173q-19 19 -19 45t19 45t45 19t45 -19l173 -173h844l173 173q19 19 45 19t45 -19t19 -45t-19 -45l-173 -173v-294h224q26 0 45 -19 t19 -45zM1152 1152h-640q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5z" />
-<glyph unicode="&#xf189;" horiz-adv-x="1920" d="M1917 1016q23 -64 -150 -294q-24 -32 -65 -85q-78 -100 -90 -131q-17 -41 14 -81q17 -21 81 -82h1l1 -1l1 -1l2 -2q141 -131 191 -221q3 -5 6.5 -12.5t7 -26.5t-0.5 -34t-25 -27.5t-59 -12.5l-256 -4q-24 -5 -56 5t-52 22l-20 12q-30 21 -70 64t-68.5 77.5t-61 58 t-56.5 15.5q-3 -1 -8 -3.5t-17 -14.5t-21.5 -29.5t-17 -52t-6.5 -77.5q0 -15 -3.5 -27.5t-7.5 -18.5l-4 -5q-18 -19 -53 -22h-115q-71 -4 -146 16.5t-131.5 53t-103 66t-70.5 57.5l-25 24q-10 10 -27.5 30t-71.5 91t-106 151t-122.5 211t-130.5 272q-6 16 -6 27t3 16l4 6 q15 19 57 19l274 2q12 -2 23 -6.5t16 -8.5l5 -3q16 -11 24 -32q20 -50 46 -103.5t41 -81.5l16 -29q29 -60 56 -104t48.5 -68.5t41.5 -38.5t34 -14t27 5q2 1 5 5t12 22t13.5 47t9.5 81t0 125q-2 40 -9 73t-14 46l-6 12q-25 34 -85 43q-13 2 5 24q17 19 38 30q53 26 239 24 q82 -1 135 -13q20 -5 33.5 -13.5t20.5 -24t10.5 -32t3.5 -45.5t-1 -55t-2.5 -70.5t-1.5 -82.5q0 -11 -1 -42t-0.5 -48t3.5 -40.5t11.5 -39t22.5 -24.5q8 -2 17 -4t26 11t38 34.5t52 67t68 107.5q60 104 107 225q4 10 10 17.5t11 10.5l4 3l5 2.5t13 3t20 0.5l288 2 q39 5 64 -2.5t31 -16.5z" />
-<glyph unicode="&#xf18a;" horiz-adv-x="1792" d="M675 252q21 34 11 69t-45 50q-34 14 -73 1t-60 -46q-22 -34 -13 -68.5t43 -50.5t74.5 -2.5t62.5 47.5zM769 373q8 13 3.5 26.5t-17.5 18.5q-14 5 -28.5 -0.5t-21.5 -18.5q-17 -31 13 -45q14 -5 29 0.5t22 18.5zM943 266q-45 -102 -158 -150t-224 -12 q-107 34 -147.5 126.5t6.5 187.5q47 93 151.5 139t210.5 19q111 -29 158.5 -119.5t2.5 -190.5zM1255 426q-9 96 -89 170t-208.5 109t-274.5 21q-223 -23 -369.5 -141.5t-132.5 -264.5q9 -96 89 -170t208.5 -109t274.5 -21q223 23 369.5 141.5t132.5 264.5zM1563 422 q0 -68 -37 -139.5t-109 -137t-168.5 -117.5t-226 -83t-270.5 -31t-275 33.5t-240.5 93t-171.5 151t-65 199.5q0 115 69.5 245t197.5 258q169 169 341.5 236t246.5 -7q65 -64 20 -209q-4 -14 -1 -20t10 -7t14.5 0.5t13.5 3.5l6 2q139 59 246 59t153 -61q45 -63 0 -178 q-2 -13 -4.5 -20t4.5 -12.5t12 -7.5t17 -6q57 -18 103 -47t80 -81.5t34 -116.5zM1489 1046q42 -47 54.5 -108.5t-6.5 -117.5q-8 -23 -29.5 -34t-44.5 -4q-23 8 -34 29.5t-4 44.5q20 63 -24 111t-107 35q-24 -5 -45 8t-25 37q-5 24 8 44.5t37 25.5q60 13 119 -5.5t101 -65.5z M1670 1209q87 -96 112.5 -222.5t-13.5 -241.5q-9 -27 -34 -40t-52 -4t-40 34t-5 52q28 82 10 172t-80 158q-62 69 -148 95.5t-173 8.5q-28 -6 -52 9.5t-30 43.5t9.5 51.5t43.5 29.5q123 26 244 -11.5t208 -134.5z" />
-<glyph unicode="&#xf18b;" d="M1133 -34q-171 -94 -368 -94q-196 0 -367 94q138 87 235.5 211t131.5 268q35 -144 132.5 -268t235.5 -211zM638 1394v-485q0 -252 -126.5 -459.5t-330.5 -306.5q-181 215 -181 495q0 187 83.5 349.5t229.5 269.5t325 137zM1536 638q0 -280 -181 -495 q-204 99 -330.5 306.5t-126.5 459.5v485q179 -30 325 -137t229.5 -269.5t83.5 -349.5z" />
-<glyph unicode="&#xf18c;" horiz-adv-x="1408" d="M1402 433q-32 -80 -76 -138t-91 -88.5t-99 -46.5t-101.5 -14.5t-96.5 8.5t-86.5 22t-69.5 27.5t-46 22.5l-17 10q-113 -228 -289.5 -359.5t-384.5 -132.5q-19 0 -32 13t-13 32t13 31.5t32 12.5q173 1 322.5 107.5t251.5 294.5q-36 -14 -72 -23t-83 -13t-91 2.5t-93 28.5 t-92 59t-84.5 100t-74.5 146q114 47 214 57t167.5 -7.5t124.5 -56.5t88.5 -77t56.5 -82q53 131 79 291q-7 -1 -18 -2.5t-46.5 -2.5t-69.5 0.5t-81.5 10t-88.5 23t-84 42.5t-75 65t-54.5 94.5t-28.5 127.5q70 28 133.5 36.5t112.5 -1t92 -30t73.5 -50t56 -61t42 -63t27.5 -56 t16 -39.5l4 -16q12 122 12 195q-8 6 -21.5 16t-49 44.5t-63.5 71.5t-54 93t-33 112.5t12 127t70 138.5q73 -25 127.5 -61.5t84.5 -76.5t48 -85t20.5 -89t-0.5 -85.5t-13 -76.5t-19 -62t-17 -42l-7 -15q1 -5 1 -50.5t-1 -71.5q3 7 10 18.5t30.5 43t50.5 58t71 55.5t91.5 44.5 t112 14.5t132.5 -24q-2 -78 -21.5 -141.5t-50 -104.5t-69.5 -71.5t-81.5 -45.5t-84.5 -24t-80 -9.5t-67.5 1t-46.5 4.5l-17 3q-23 -147 -73 -283q6 7 18 18.5t49.5 41t77.5 52.5t99.5 42t117.5 20t129 -23.5t137 -77.5z" />
-<glyph unicode="&#xf18d;" horiz-adv-x="1280" d="M1259 283v-66q0 -85 -57.5 -144.5t-138.5 -59.5h-57l-260 -269v269h-529q-81 0 -138.5 59.5t-57.5 144.5v66h1238zM1259 609v-255h-1238v255h1238zM1259 937v-255h-1238v255h1238zM1259 1077v-67h-1238v67q0 84 57.5 143.5t138.5 59.5h846q81 0 138.5 -59.5t57.5 -143.5z " />
-<glyph unicode="&#xf18e;" d="M1152 640q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf190;" d="M1152 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-192q0 -14 -9 -23t-23 -9q-12 0 -24 10l-319 319q-9 9 -9 23t9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h352q13 0 22.5 -9.5t9.5 -22.5zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf191;" d="M1024 960v-640q0 -26 -19 -45t-45 -19q-20 0 -37 12l-448 320q-27 19 -27 52t27 52l448 320q17 12 37 12q26 0 45 -19t19 -45zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5z M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf192;" d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5 t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf193;" horiz-adv-x="1664" d="M1023 349l102 -204q-58 -179 -210 -290t-339 -111q-156 0 -288.5 77.5t-210 210t-77.5 288.5q0 181 104.5 330t274.5 211l17 -131q-122 -54 -195 -165.5t-73 -244.5q0 -185 131.5 -316.5t316.5 -131.5q126 0 232.5 65t165 175.5t49.5 236.5zM1571 249l58 -114l-256 -128 q-13 -7 -29 -7q-40 0 -57 35l-239 477h-472q-24 0 -42.5 16.5t-21.5 40.5l-96 779q-2 16 6 42q14 51 57 82.5t97 31.5q66 0 113 -47t47 -113q0 -69 -52 -117.5t-120 -41.5l37 -289h423v-128h-407l16 -128h455q40 0 57 -35l228 -455z" />
-<glyph unicode="&#xf194;" d="M1254 899q16 85 -21 132q-52 65 -187 45q-17 -3 -41 -12.5t-57.5 -30.5t-64.5 -48.5t-59.5 -70t-44.5 -91.5q80 7 113.5 -16t26.5 -99q-5 -52 -52 -143q-43 -78 -71 -99q-44 -32 -87 14q-23 24 -37.5 64.5t-19 73t-10 84t-8.5 71.5q-23 129 -34 164q-12 37 -35.5 69 t-50.5 40q-57 16 -127 -25q-54 -32 -136.5 -106t-122.5 -102v-7q16 -8 25.5 -26t21.5 -20q21 -3 54.5 8.5t58 10.5t41.5 -30q11 -18 18.5 -38.5t15 -48t12.5 -40.5q17 -46 53 -187q36 -146 57 -197q42 -99 103 -125q43 -12 85 -1.5t76 31.5q131 77 250 237 q104 139 172.5 292.5t82.5 226.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf195;" horiz-adv-x="1152" d="M1152 704q0 -191 -94.5 -353t-256.5 -256.5t-353 -94.5h-160q-14 0 -23 9t-9 23v611l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v93l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v250q0 14 9 23t23 9h160 q14 0 23 -9t9 -23v-181l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-93l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-487q188 13 318 151t130 328q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" />
-<glyph unicode="&#xf196;" horiz-adv-x="1792" />
-<glyph unicode="&#xf197;" horiz-adv-x="1792" />
-<glyph unicode="&#xf198;" horiz-adv-x="1792" />
-<glyph unicode="&#xf199;" horiz-adv-x="1792" />
-<glyph unicode="&#xf19a;" horiz-adv-x="1792" />
-<glyph unicode="&#xf19b;" horiz-adv-x="1792" />
-<glyph unicode="&#xf19c;" horiz-adv-x="1792" />
-<glyph unicode="&#xf19d;" horiz-adv-x="1792" />
-<glyph unicode="&#xf19e;" horiz-adv-x="1792" />
-<glyph unicode="&#xf500;" horiz-adv-x="1792" />
-</font>
-</defs></svg> \ No newline at end of file
diff --git a/docs/theme/mkdocs/css/font/fontawesome-webfont.ttf b/docs/theme/mkdocs/css/font/fontawesome-webfont.ttf
deleted file mode 100755
index 7ec2e1de89..0000000000
--- a/docs/theme/mkdocs/css/font/fontawesome-webfont.ttf
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/css/font/fontawesome-webfont.woff b/docs/theme/mkdocs/css/font/fontawesome-webfont.woff
deleted file mode 100755
index 27d80b123d..0000000000
--- a/docs/theme/mkdocs/css/font/fontawesome-webfont.woff
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/css/img/glyphicons-halflings-white.png b/docs/theme/mkdocs/css/img/glyphicons-halflings-white.png
deleted file mode 100644
index 3bf6484a29..0000000000
--- a/docs/theme/mkdocs/css/img/glyphicons-halflings-white.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/css/img/glyphicons-halflings.png b/docs/theme/mkdocs/css/img/glyphicons-halflings.png
deleted file mode 100644
index 686433b297..0000000000
--- a/docs/theme/mkdocs/css/img/glyphicons-halflings.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/css/main.css b/docs/theme/mkdocs/css/main.css
deleted file mode 100644
index 270c220fd5..0000000000
--- a/docs/theme/mkdocs/css/main.css
+++ /dev/null
@@ -1,2176 +0,0 @@
-/* some core mixins*/
-/* core shared with other docker projects */
-/* ******************************
- Core Docker style file
-
- used on
- www.docker.com
- docker-index
-****************************** */
-/* this is about 10% darker, but slightly different */
-.debug {
- border: 2px dotted red !important;
-}
-.debugbg {
- background-color: rgba(255, 207, 139, 0.5) !important;
-}
-.highlight1 {
- color: green !important;
-}
-.highlight2 {
- color: red !important;
-}
-body {
- margin: 0;
- color: #394d54;
- background-color: #fff;
-}
-.content {
- padding-top: 20px;
-}
-h1,
-h2,
-h3,
-h4,
-h5,
-h6 {
- font-size: 18px;
- font-weight: 400;
- color: #394d54;
- line-height: 1;
- line-height: 1.4;
-}
-h4,
-h5,
-h6 {
- font-size: 16px;
-}
-p {
- margin: 0 0 1em 0;
- font-size: 14px;
- font-weight: 400;
- color: #394d54;
- line-height: 1.7;
-}
-p strong {
- font-size: 14px;
- font-weight: 500;
- color: #394d54;
- line-height: 1.7;
-}
-p a {
- text-decoration: underline;
-}
-p a.btn {
- text-decoration: none;
-}
-.time {
- font-size: 14px;
- font-weight: 400;
- color: #949da7;
-}
-span.read-more {
- margin-left: 15px;
- white-space: nowrap;
-}
-div[class*='span'] {
- -moz-box-sizing: border-box;
- box-sizing: border-box;
-}
-.borderRadiusCode {
- border-radius: 4px;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
-}
-.box {
- padding: 18px;
- margin-bottom: 20px;
- border: 1px solid #dbdde0;
- border-radius: 4px;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
-}
-.box h1,
-.box h2,
-.box h3,
-.box h4 {
- font-weight: 700;
- font-size: 18px;
- line-height: 18px;
- margin: 0 0 10px 0;
-}
-.tbox.full {
- margin: -18px;
-}
-.fleft {
- position: relative;
- float: left;
-}
-.fright {
- position: relative;
- float: right;
-}
-.nested {
- padding: 18px;
- margin-left: 0px;
-}
-.paper {
- background-color: white;
- padding-top: 30px;
- padding-bottom: 30px;
-}
-.float-left {
- float: left;
- margin-right: 15px;
- margin-bottom: 15px;
-}
-.float-right {
- float: right;
- margin-left: 15px;
- margin-bottom: 15px;
-}
-.textcenter {
- text-align: center;
-}
-.textright {
- text-align: right;
-}
-.textsmaller {
- font-size: 13px;
-}
-.modal-backdrop {
- opacity: 0.4;
-}
-.placeholder-empty {
- width: 100%;
- color: grey;
- min-height: 100px;
- font-size: larger;
- display: -webkit-flex;
- display: -moz-flex;
- display: flex;
- -webkit-flex-flow: row;
- flex-flow: row;
- -webkit-align-items: center;
- align-items: center;
- -webkit-justify-content: center;
- justify-content: center;
-}
-.span4andahalf {
- width: 340px !important;
-}
-code {
- white-space: pre-line;
-}
-.btn {
- padding: 6px 15px;
- line-height: 1.7;
-}
-.btn-primary,
-.btn-danger {
- padding: 6px 15px;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
- background-color: #008bb8;
- font-size: 14px;
- font-weight: 400;
- color: #fff;
- box-shadow: 0px 1px 1px 0px rgba(0, 0, 0, 0.16);
-}
-.btn-primary:hover,
-.btn-danger:hover,
-.btn-primary:active,
-.btn-danger:active,
-.btn-primary:focus,
-.btn-danger:focus {
- background-color: #24b8eb;
-}
-.btn-primary.disabled,
-.btn-danger.disabled {
- background-color: #676668;
-}
-.btn-danger {
- background-color: #b74b4b !important;
-}
-.btn-danger:hover,
-.btn-danger:active,
-.btn-danger:focus {
- background-color: #edd3d7 !important;
-}
-.btn-mini {
- padding: 1px 7px !important;
- font-size: 13px !important;
-}
-.nav-button1 {
- padding: 5px 24px;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
- background-color: #ff8100;
- font-size: 14px;
- font-weight: 700;
- color: #fff;
-}
-.nav-button1:hover,
-.nav-button1:active,
-.nav-button1:focus {
- background-color: #ffa141;
-}
-.btn.nav-button2 {
- border: 1px solid #253237 !important;
- padding: 5px 24px;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
- background-color: #fff;
- font-size: 14px;
- font-weight: 700;
- color: #253237;
-}
-.btn.nav-button2:hover,
-.btn.nav-button2:active,
-.btn.nav-button2:focus {
- border-color: #24b8eb !important;
- font-size: 14px;
- font-weight: 700;
- color: #24b8eb;
-}
-.primary-cta-button1 {
- padding: 9px 24px;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
- background-color: #ff8100;
- font-size: 18px;
- font-weight: 700;
- color: #fff;
-}
-.primary-cta-button1:hover,
-.primary-cta-button1:active,
-.primary-cta-button1:focus {
- background-color: #ffa141;
-}
-.primary-cta-button2 {
- padding: 9px 24px;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
- background-color: #005976;
- font-size: 18px;
- font-weight: 700;
- color: #fff;
-}
-.primary-cta-button2:hover,
-.primary-cta-button2:active,
-.primary-cta-button2:focus {
- background-color: #24b8eb;
-}
-.btn,
-.btn-group {
- border: none;
- border-radius: 4px;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
-}
-.btn:hover,
-.btn-group:hover,
-.btn:active,
-.btn-group:active,
-.btn:focus,
-.btn-group:focus {
- color: #fff;
-}
-.add-repository .docker-caret {
- display: inline-block;
- background-color: yellow;
- width: 15px;
- height: 15px;
- background: url("../img/dashboard/caret-down-create-new-icon.svg") no-repeat 70% 86%;
-}
-.add-repository .btn.open {
- background-color: #005976;
-}
-/* =======================
- Sticky footer
-======================= */
-html,
-body {
- height: 100%;
- /* The html and body elements cannot have any padding or margin. */
-}
-/* Wrapper for page content to push down footer */
-#wrap {
- /* Negative indent footer by it's height */
- margin: 0 auto -379px;
-}
-/* Set the fixed height of the footer here */
-#push-footer,
-#footer {
- height: 379px;
- background: #253237;
-}
-#footer {
- padding-top: 36px;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- /* Social */
-}
-#footer .copyright {
- margin-top: 40px;
-}
-#footer .primary-button:hover {
- color: #eeeeee;
- text-decoration: none;
-}
-#footer ul {
- margin-top: 0px;
-}
-#footer form {
- display: inline-block;
- width: 220px;
-}
-#footer .search span {
- margin-bottom: 5px;
- display: block;
-}
-#footer .search label {
- display: none;
-}
-#footer .search ul {
- display: none;
-}
-#footer .search form input {
- background: #253237;
- border-color: #ade5f9;
- width: 220px;
- height: 37px;
- margin: 0px 0px 12px 0px !important;
-}
-#footer .search form button {
- position: absolute;
- display: block;
- margin: -44px 220px;
- background: none !important;
- border: none;
- outline: none;
- color: #999999;
-}
-#footer .search form button:hover {
- color: #eeeeee !important;
-}
-#footer a {
- color: #949da7;
-}
-#footer a:hover {
- text-decoration: none;
- color: #eeeeee;
-}
-#footer .social {
- width: 100px;
- float: left;
-}
-#footer .social li a {
- padding-left: 28px;
-}
-#footer .social li span {
- float: left;
- width: 24px;
- height: 25px;
- position: absolute;
- margin: 1px 0px 2px -28px;
-}
-#footer .social .blog {
- background: url(../img/footer/docker-blog-24.png) no-repeat;
- background-position: 0px -3px;
-}
-#footer .social .twitter {
- background: url(../img/footer/twitter-24.png) no-repeat;
- background-position: 0px -3px;
-}
-#footer .social .googleplus {
- background: url(../img/footer/googleplus-24.png) no-repeat;
- background-position: 0px -3px;
-}
-#footer .social .facebook {
- background: url(../img/footer/facebook-24.png) no-repeat;
- background-position: 0px -3px;
-}
-#footer .social .youtube {
- background: url(../img/footer/youtube-24.png) no-repeat;
- background-position: 0px -3px;
-}
-#footer .social .slideshare {
- background: url(../img/footer/slideshare-24.png) no-repeat;
- background-position: 0px -3px;
-}
-#footer .social .linkedin {
- background: url(../img/footer/sprites-small_360.png) no-repeat;
- background-position: -168px -3px;
-}
-#footer .social .github {
- background: url(../img/footer/sprites-small_360.png) no-repeat;
- background-position: -48px -3px;
-}
-#footer .social .reddit {
- background: url(../img/footer/sprites-small_360.png) no-repeat;
- background-position: -192px -3px;
-}
-#footer .social .angellist {
- background: url(../img/footer/angellist-white.svg) no-repeat;
- background-position: 5px;
- height: 20px;
-}
-/* Social Links */
-@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) {
- #footer .social .blog {
- background: url(../img/footer/docker-blog-48.png) no-repeat;
- background-size: 24px;
- background-position: 0px -3px;
- }
- #footer .social .twitter {
- background: url(../img/footer/twitter-48.png) no-repeat;
- background-size: 24px;
- background-position: 0px -3px;
- }
- #footer .social .googleplus {
- background: url(../img/footer/googleplus-48.png) no-repeat;
- background-size: 24px;
- background-position: 0px -3px;
- }
- #footer .social .facebook {
- background: url(../img/footer/facebook-48.png) no-repeat;
- background-size: 24px;
- background-position: 0px -3px;
- }
- #footer .social .youtube {
- background: url(../img/footer/youtube-48.png) no-repeat;
- background-size: 24px;
- background-position: 0px -3px;
- }
- #footer .social .slideshare {
- background: url(../img/footer/slideshare-48.png) no-repeat;
- background-size: 24px;
- background-position: 0px -3px;
- }
-}
-label {
- font-size: 14px;
- font-weight: 700;
- color: #253237;
-}
-input[type="text"],
-input[type="password"],
-input[type="url"],
-input[type="email"],
-textarea,
-select,
-.bootstrap-select button {
- width: 530px;
- padding: 0 14px;
- line-height: 11.7px;
- height: 11.7px;
- font-size: 14px;
- font-weight: 400;
- color: #394d54;
- line-height: 1.7;
- border: 1px solid #cccccc;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
-}
-input[type="text"][disabled],
-input[type="password"][disabled],
-input[type="url"][disabled],
-input[type="email"][disabled],
-textarea[disabled],
-select[disabled],
-.bootstrap-select button[disabled] {
- font-size: 14px;
- font-weight: 400;
- color: #949da7;
- background-color: #eeeeee;
-}
-input[type="text"]:invalid,
-input[type="password"]:invalid,
-input[type="url"]:invalid,
-input[type="email"]:invalid,
-textarea:invalid,
-select:invalid,
-.bootstrap-select button:invalid {
- font-size: 14px;
- font-weight: 400;
- color: #b74b4b;
- line-height: 1.7;
- border-color: #b74b4b;
- background-color: #edd3d7;
-}
-textarea {
- padding: 12px 14px;
- height: 100px;
- line-height: 1.7;
-}
-.bootstrap-select button {
- height: 13.7px;
- background-color: #ffffff;
-}
-.bootstrap-select button:active,
-.bootstrap-select button:focus,
-.bootstrap-select button:hover {
- background-color: #ffffff;
-}
-.bootstrap-select .dropdown-menu {
- margin-top: 0;
-}
-.btn-group.open .btn.dropdown-toggle {
- background-color: #ffffff;
-}
-.dropdown-menu > li > a:hover,
-.dropdown-menu > li > a:focus,
-.dropdown-menu > li > a:active {
- background-color: #ffffff;
- color: #24b8eb;
- outline: none;
-}
-.input-append .add-on,
-.input-prepend .add-on {
- border: none;
- background-color: #f2f2f2;
- line-height: 6.7px;
- height: 6.7px;
-}
-.control-group.error label {
- font-size: 14px;
- font-weight: 400;
- color: #b74b4b;
- line-height: 1.7;
-}
-.control-group.success label {
- font-size: 14px;
- font-weight: 700;
- color: #91c5c5;
- line-height: 1.7;
-}
-.control-group.success input[type="text"],
-.control-group.success input[type="password"] {
- background: url("../img/icons/check-mark-green.svg") no-repeat 95% 50%;
-}
-input[type="submit"] {
- line-height: 1.7;
- border: none;
- padding: 6px 15px;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
- background-color: #008bb8;
- font-size: 14px;
- font-weight: 400;
- color: #fff;
- box-shadow: 0px 1px 1px 0px rgba(0, 0, 0, 0.16);
-}
-input[type="submit"]:hover,
-input[type="submit"]:active,
-input[type="submit"]:focus {
- color: #fff;
-}
-input[type="submit"]:hover,
-input[type="submit"]:active,
-input[type="submit"]:focus {
- background-color: #24b8eb;
-}
-input[type="submit"].disabled {
- background-color: #676668;
-}
-input[type="radio"],
-input[type="checkbox"] {
- margin: 0 0.5em 0 0;
- position: relative;
- vertical-align: middle;
- bottom: 1px;
-}
-input[type="reset"] {
- font-size: 14px;
- font-weight: 400;
- color: #005976;
- border: none;
- background-color: #fff;
-}
-input[type="reset"]:hover {
- font-size: 14px;
- font-weight: 400;
- color: #24b8eb;
-}
-.input-prepend .btn-group .dropdown-toggle {
- font-size: 15px;
- font-weight: 400;
- color: #394d54;
- background-image: url("../img/caret-down-user-icon.svg");
-}
-.btn-group.open .btn-primary.dropdown-toggle {
- background-color: #24b8eb;
-}
-.alert {
- padding: 8px 14px 8px 14px;
- border: none;
- /* &.alert-block {
- line-height: 46px !important;
- padding: 0 14px;
- width: 532px;
- .border-radius;
- }*/
-}
-.alert ul {
- margin-top: 0;
-}
-.alert.alert-error {
- font-size: 14px;
- font-weight: 400;
- color: #b74b4b;
- line-height: 1.7;
- background-color: #edd3d7;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
-}
-.alert.alert-error a {
- font-size: 14px;
- font-weight: 700;
- color: #b74b4b;
- line-height: 1.7;
-}
-.alert.alert-info {
- font-size: 14px;
- font-weight: 400;
- color: #24b8eb;
- line-height: 1.7;
- background-color: #d3f1fb;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
-}
-.alert.alert-info a {
- font-size: 14px;
- font-weight: 700;
- color: #005976;
- line-height: 1.7;
-}
-.alert.alert-success {
- font-size: 14px;
- font-weight: 400;
- color: #91c5c5;
- line-height: 1.7;
- background-color: #e0f0d9;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
-}
-.alert.alert-success a {
- font-size: 14px;
- font-weight: 700;
- color: #91c5c5;
- line-height: 1.7;
-}
-form dl {
- margin: 0;
-}
-form dd {
- margin: 0;
-}
-form dd.helptext {
- margin-top: 3px;
-}
-form dd.helptext + dd {
- margin-top: 22px;
-}
-form dt {
- margin: 32px 0 8px 0;
-}
-form dt:first-child {
- margin-top: 0;
-}
-form dt .error {
- display: inline-block;
- margin-bottom: 12px;
- border-color: #b74b4b;
- font-size: 14px;
- font-weight: 400;
- color: #b74b4b;
- line-height: 1.7;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
-}
-form dt .error a {
- font-size: 14px;
- font-weight: 700;
- color: #b74b4b;
- line-height: 1.7;
-}
-.form-inline label {
- margin: 0 15px 0 0;
-}
-.form-inline input[type="text"],
-.form-inline input[type="password"],
-.form-inline input[type="url"],
-.form-inline input[type="email"],
-.form-inline textarea {
- width: 360px;
- margin: 0 15px 0 0;
-}
-.form-inline input[type="submit"] {
- margin: 0;
-}
-.form-inline select {
- height: 11.7px;
-}
-div + .form-inline {
- margin-top: 20px;
-}
-.form-inline + hr {
- margin-top: 20px;
-}
-#stickynav .navbar-inner {
- background-color: #3a4855;
- border: none;
- height: 30px;
- min-height: 30px;
- color: white;
- text-align: right;
-}
-#stickynav .nav li a {
- padding: 5px 14px;
- color: #eeeeee;
-}
-#topmostnav {
- border-bottom: 1px solid #dbdde0;
-}
-#topmostnav li a {
- font-size: 14px;
- font-weight: 700;
- color: #253237;
- line-height: 55px;
- padding: 0 20px;
-}
-#topmostnav li a:hover {
- font-size: 14px;
- font-weight: 700;
- color: #24b8eb;
-}
-#topmostnav li.active a {
- background-color: #E8E8E8;
-}
-#topmostnav .brand {
- margin: 8px 20px 0 8px;
- padding: 0;
-}
-#topmostnav .navbar-index-search {
- position: relative;
- float: left;
- margin: 13px 20px 0 0;
- /* firefox 18- */
- /* firefox 19+ */
- /* ie */
-}
-#topmostnav .navbar-index-search ::-webkit-input-placeholder {
- padding-top: 0;
-}
-#topmostnav .navbar-index-search :-moz-placeholder {
- padding-top: 0;
-}
-#topmostnav .navbar-index-search ::-moz-placeholder {
- padding-top: 0;
-}
-#topmostnav .navbar-index-search :-ms-input-placeholder {
- padding-top: 0;
-}
-#topmostnav .navbar-index-search input[type="text"] {
- height: 27px;
- margin-top: 0;
- font-size: 14px;
- font-weight: 400;
- color: #949da7;
- background: #ffffff url("../img/nav/search-icon.svg") no-repeat 95% 50%;
- border-color: #dbdde0;
- border-radius: 0;
-}
-#topmostnav .navbar-index-search .search-query {
- -webkit-transition: box-shadow linear 0.2s, background linear 0.3s, width linear 0.3s;
- -moz-transition: box-shadow linear 0.2s, background linear 0.3s, width linear 0.3s;
- -ms-transition: box-shadow linear 0.2s, background linear 0.3s, width linear 0.3s;
- -o-transition: box-shadow linear 0.2s, background linear 0.3s, width linear 0.3s;
- transition: box-shadow linear 0.2s, background linear 0.3s, width linear 0.3s;
- width: 140px;
-}
-#topmostnav.public {
- border-bottom: none;
- height: 80px;
-}
-#topmostnav.public .nav {
- margin-right: 0;
-}
-#topmostnav.public li a {
- line-height: 80px;
- padding: 0 15px;
-}
-#topmostnav.public li.active a {
- background-color: #E8E8E8;
-}
-#topmostnav.public #usernav .btn {
- margin: 24px 0 0 13px;
-}
-#topmostnav.public .brand {
- padding-left: 10px;
- margin: 18px 15px 0 0;
-}
-.brand.logo a {
- text-decoration: none;
-}
-.brand.logo a {
- text-decoration: none;
-}
-.navbar .navbar-inner {
- padding-right: 0px;
- padding-left: 0px;
-}
-.navbar .brand {
- margin-left: 0px;
- float: left;
- display: block;
-}
-.navbar .brand.logo {
- padding-top: 0;
- padding-bottom: 0;
-}
-.navbar .nav li a {
- padding: 0;
-}
-.nav-underline {
- height: 6px;
- background-color: #71afc0;
-}
-.nav-login li a {
- color: white;
- padding: 10px 15px 10px;
-}
-.inline-icon {
- margin-bottom: 6px;
-}
-.float-left {
- float: left;
- margin-right: 15px;
- margin-bottom: 15px;
-}
-.float-right {
- float: right;
- margin-left: 15px;
- margin-bottom: 15px;
-}
-.navbar #usernav .nav img {
- margin-right: 8px;
-}
-.navbar #usernav .nav li {
- padding-top: 15px;
-}
-.navbar #usernav .nav li a,
-#versionnav .nav li a.dropdown-toggle {
- font-size: 14px;
- font-weight: 400;
- color: #394d54;
- line-height: 1.7;
- line-height: 30px;
- padding: 0 20px 0 0;
- background: url("../img/nav/caret-down-user-icon.svg") no-repeat 100% 50%;
-}
-.navbar #usernav .nav li a:hover,
-#versionnav .nav li a.dropdown-toggle:hover {
- background-image: url("../img/nav/caret-down-user-icon-over.svg");
-}
-.navbar #usernav .nav li ul li,
-#versionnav .version {
- padding: 0;
- margin: 0;
- height: 28px;
-}
-.navbar #usernav .nav li ul li a {
- padding: 0 0 0 12px;
- background-image: none;
- line-height: 28px;
-}
-.navbar #usernav .nav li ul li a:hover {
- background-image: none;
-}
-.navbar-index-search input[type="text"] {
- background-color: #fff;
- border-color: #dbdde0;
-}
-/*
-#usernav > a {
- padding: 0 20px 0 0;
- background: url(../img/caret-down-user-icon.svg) no-repeat 100% 50%;
-}
-#usernav > a:hover {
- background-image: url(../img/caret-down-user-icon-over.svg);
-}
-*/
-#leftnav ul a {
- padding: 0 0 0 19px;
- font-size: 14px;
- font-weight: 400;
- color: #005976;
-}
-#leftnav ul a:hover {
- font-size: 14px;
- font-weight: 400;
- color: #24b8eb;
- text-decoration: none;
-}
-#leftnav div:first-child {
- border: 1px solid #dbdde0;
- margin-bottom: 22px;
-}
-#leftnav .nav {
- margin: 0, 0, 20px, 0;
-}
-#leftnav .nav > li > a {
- line-height: 22px;
- font-size: 16px;
- font-weight: 500;
- color: #005976;
-}
-#leftnav .nav > li > a:hover {
- font-size: 16px;
- font-weight: 500;
- color: #24b8eb;
- text-decoration: none;
- background-color: inherit;
-}
-#leftnav .nav.nav-tabs > li > a.dropdown-toggle,
-#leftnav .nav.nav-tabs li.dropdown .dropdown-menu li a {
- background: url("../img/nav/caret-down-subnav-icon.svg") no-repeat 90% 50%;
- font-size: 16px;
- font-weight: 500;
- color: #949da7;
- line-height: 69px ;
- height: 69px;
-}
-#leftnav .nav.nav-tabs > li > a.dropdown-toggle img,
-#leftnav .nav.nav-tabs li.dropdown .dropdown-menu li a img {
- margin-right: 11px;
-}
-#leftnav .nav.nav-tabs > li > a.dropdown-toggle img.profile,
-#leftnav .nav.nav-tabs li.dropdown .dropdown-menu li a img.profile {
- -webkit-border-radius: 20px;
- -moz-border-radius: 20px;
- border-radius: 20px;
-}
-#leftnav .nav.nav-tabs > li > a.dropdown-toggle:hover,
-#leftnav .nav.nav-tabs li.dropdown .dropdown-menu li a:hover {
- font-size: 16px;
- font-weight: 500;
- color: #24b8eb;
- text-decoration: none;
-}
-#leftnav .nav.nav-tabs > li > a.dropdown-toggle:focus,
-#leftnav .nav.nav-tabs li.dropdown .dropdown-menu li a:focus {
- outline: none;
-}
-#leftnav .nav.nav-tabs li.dropdown .dropdown-menu {
- width: 100%;
- margin: 0;
- padding: 0;
- border-style: solid;
- border-color: #dbdde0;
- border-width: 0 1px 1px 1px;
- left: -1px;
- top: 68px;
-}
-#leftnav .nav.nav-tabs li.dropdown .dropdown-menu li a {
- background-image: none;
- border-top: 1px solid #dbdde0;
-}
-#leftnav .nav.nav-tabs.nav-stacked > li > a {
- border: 0;
-}
-Killwithfire #leftnav .nav.nav-tabs li.active a {
- font-size: 16px;
- font-weight: 500;
- color: #394d54;
- line-height: 2;
- line-height: 48px;
- background-color: #d3f1fb;
- border-left: 10px solid #ade5f9;
- padding-left: 9px;
-}
-Killwithfire #leftnav .nav.nav-tabs li.active a:hover {
- font-size: 16px;
- font-weight: 500;
- color: #24b8eb;
- text-decoration: none;
- cursor: pointer;
-}
-Killwithfire #leftnav .nav.nav-tabs li.active a:focus {
- outline: none;
-}
-#leftnav .nav.nav-tabs > li > a {
- line-height: 48px;
- font-size: 16px;
- font-weight: 500;
- color: #005976;
-}
-#leftnav .nav.nav-tabs > li > a:hover {
- font-size: 16px;
- font-weight: 500;
- color: #24b8eb;
- text-decoration: none;
-}
-#leftnav .nav.nav-tabs > li > a:focus {
- outline: none;
-}
-#leftnav h3 {
- font-size: 16px;
- font-weight: 700;
- color: #394d54;
- line-height: 2;
- margin: 23px 0 3px 0;
- padding-left: 20px;
-}
-#leftnav .progress {
- margin-left: 20px;
- margin-right: 20px;
- margin-bottom: 12px;
-}
-#leftnav #profile_badge {
- margin-bottom: 0px;
-}
-#leftnav #profile_badge #profile_name {
- text-align: left;
- padding: .6em;
- padding-bottom: .1em;
- font-size: 1.3em;
- font-weight: bolder;
-}
-#leftnav #profile_badge #profile_details ul {
- padding: 0px;
- padding-left: .6em;
-}
-#leftnav #profile_badge #profile_details ul li {
- list-style-type: none;
-}
-#leftnav #subnav {
- margin: 0 20px;
-}
-#leftnav #subnav h1 {
- margin-bottom: 2px;
- margin-top: 12px;
-}
-#leftnav #subnav ul li {
- list-style-type: none;
-}
-#leftnav #subnav #billing_info .progress {
- margin: 0px;
-}
-#leftnav #subnav #repo_count {
- float: right;
- color: #949da7;
- font-style: oblique;
- font-size: .8em;
-}
-#leftnav #subnav .buy-button {
- margin-top: 8px;
-}
-.large-note {
- font-size: 20px;
- font-weight: 300;
- color: #394d54;
-}
-.large-header {
- font-size: 20px;
- font-weight: 400;
- color: #394d54;
-}
-.profile-link {
- font-size: 20px;
- font-weight: 400;
- color: #005976;
-}
-.profile-link-hover {
- font-size: 20px;
- font-weight: 400;
- color: #24b8eb;
-}
-.tile-number {
- font-size: 20px;
- font-weight: 500;
- color: #949da7;
-}
-.subhead {
- font-size: 18px;
- font-weight: 400;
- color: #394d54;
- line-height: 1;
-}
-.secondary-nav-header {
- font-size: 18px;
- font-weight: 500;
- color: #394d54;
-}
-.body-header {
- font-size: 18px;
- font-weight: 700;
- color: #394d54;
- line-height: 1.33;
-}
-.tab-link {
- font-size: 18px;
- font-weight: 500;
- color: #005976;
-}
-.tab-hover {
- font-size: 18px;
- font-weight: 500;
- color: #24b8eb;
-}
-.footer-title {
- font-size: 18px;
- font-weight: 400;
- color: #ade5f9;
- line-height: 1.8;
-}
-.primary-cta {
- font-size: 18px;
- font-weight: 700;
- color: #fff;
-}
-.home-body-header {
- font-size: 16px;
- font-weight: 400;
- color: #253237;
-}
-.tile-private {
- font-size: 16px;
- font-weight: 400;
- color: #394d54;
- line-height: 2;
-}
-.tile-medium {
- font-size: 16px;
- font-weight: 500;
- color: #394d54;
- line-height: 2;
-}
-.tile-header {
- font-size: 16px;
- font-weight: 700;
- color: #394d54;
- line-height: 2;
-}
-.secondary-nav {
- font-size: 16px;
- font-weight: 500;
- color: #005976;
-}
-.secondary-nav-hover {
- font-size: 16px;
- font-weight: 500;
- color: #24b8eb;
- text-decoration: none;
-}
-.eyebrow {
- font-size: 16px;
- font-weight: 500;
- color: #949da7;
-}
-.details-header {
- font-size: 15px;
- font-weight: 400;
- color: #394d54;
-}
-.tertiary-nav {
- font-size: 14px;
- font-weight: 400;
- color: #005976;
-}
-.tertiary-nav-hover {
- font-size: 14px;
- font-weight: 400;
- color: #24b8eb;
- text-decoration: none;
-}
-.home-body3 {
- font-size: 14px;
- font-weight: 400;
- color: #253237;
- line-height: 2;
-}
-.home-body1 {
- font-size: 14px;
- font-weight: 500;
- color: #253237;
- line-height: 2;
-}
-.emphasis1 {
- font-size: 14px;
- font-weight: 700;
- color: #253237;
-}
-.body {
- font-size: 14px;
- font-weight: 400;
- color: #394d54;
- line-height: 1.7;
-}
-.body-bold {
- font-size: 14px;
- font-weight: 500;
- color: #394d54;
- line-height: 1.7;
-}
-.home-link3 {
- font-size: 14px;
- font-weight: 400;
- color: #005976;
-}
-.home-link3-hover {
- font-size: 14px;
- font-weight: 400;
- color: #24b8eb;
-}
-.emphasis1-hover {
- font-size: 14px;
- font-weight: 700;
- color: #24b8eb;
-}
-.grey-body {
- font-size: 14px;
- font-weight: 400;
- color: #949da7;
-}
-.primary-button {
- font-size: 14px;
- font-weight: 400;
- color: #fff;
-}
-.nav-button {
- font-size: 14px;
- font-weight: 700;
- color: #fff;
-}
-.emphasis2 {
- font-size: 13px;
- font-weight: 500;
- color: #253237;
-}
-.small-body {
- font-size: 13px;
- font-weight: 400;
- color: #394d54;
- line-height: 2;
-}
-.header1 {
- font-size: 44px;
- font-weight: 500;
- color: #253237;
- line-height: 1.891;
-}
-.eyebrow-header {
- font-size: 44px;
- font-weight: 100;
- color: #253237;
- line-height: 1.891;
-}
-.header2 {
- font-size: 32px;
- font-weight: 300;
- color: #394d54;
-}
-.header3 {
- font-size: 26px;
- font-weight: 300;
- color: #394d54;
- line-height: 1.3;
-}
-.header5 {
- font-size: 21px;
- font-weight: 300;
- color: #394d54;
-}
-.alert-red-body {
- font-size: 14px;
- font-weight: 400;
- color: #b74b4b;
- line-height: 1.7;
-}
-.alert-red-link {
- font-size: 14px;
- font-weight: 700;
- color: #b74b4b;
- line-height: 1.7;
-}
-.alert-green-body {
- font-size: 14px;
- font-weight: 400;
- color: #91c5c5;
- line-height: 1.7;
-}
-.alert-green-link {
- font-size: 14px;
- font-weight: 700;
- color: #91c5c5;
- line-height: 1.7;
-}
-.alert-blue-body {
- font-size: 14px;
- font-weight: 400;
- color: #24b8eb;
- line-height: 1.7;
-}
-.alert-blue-link {
- font-size: 14px;
- font-weight: 700;
- color: #005976;
- line-height: 1.7;
-}
-/* specific pages */
-/* Home */
-#homepage {
- /* Three Functional Blocks */
- /* What Is Docker? */
- /* How Is It Used? */
- /* What's Trending? */
- /* What Are They Saying? */
-}
-#homepage h1 {
- display: block !important;
-}
-#homepage h2 {
- margin: 0 !important;
-}
-#homepage a {
- color: #24b8eb;
-}
-#homepage a:hover {
- color: #008bb8;
- text-decoration: none;
-}
-#homepage #three {
- padding-top: 86px;
- text-align: center;
-}
-#homepage #three .header2 {
- display: block;
- margin-bottom: 8px !important;
-}
-#homepage #three .img {
- height: 98px;
- background-repeat: no-repeat !important;
- display: block;
- margin: 0 auto;
- background-position: center;
-}
-#homepage #three #stack-icon {
- background: url("../img/homepage/developer-stack-icon.png");
- background-size: 91px 77px;
- width: 91px;
-}
-#homepage #three #container-icon {
- background: url("../img/homepage/container-icon.png");
- background-size: 108px 83px;
- width: 108px;
-}
-#homepage #three #rack-icon {
- background: url("../img/homepage/server-rack-icon.png");
- background-size: 108px 83px;
- width: 108px;
-}
-#homepage #three .home-body1 {
- display: block;
- height: 180px;
-}
-#homepage #what-is-docker {
- padding-top: 70px;
- padding-bottom: 102px;
- text-align: center;
- background: #f2fcff;
-}
-#homepage #what-is-docker #section-title h3 {
- margin: 0 !important;
-}
-#homepage #what-is-docker #body {
- background-image: url("../img/homepage/what-is-docker-arrow-loop.png");
- background-position: center;
- background-repeat: no-repeat;
- height: 404px;
-}
-#homepage #what-is-docker #body .halfling {
- padding-top: 92px;
- width: 260px;
-}
-#homepage #use .content {
- margin-bottom: 36px;
-}
-#homepage #use #section-title {
- margin-top: 62px;
- margin-bottom: 46px;
-}
-#homepage #use #see-more {
- text-align: center;
- margin: 0px !important;
- margin-top: 46px !important;
- margin-bottom: 82px !important;
-}
-#homepage #whats-trending {
- text-align: center;
- background: #f2fcff;
- padding-bottom: 76px;
-}
-#homepage #whats-trending #section-title {
- margin: 52px 0px;
-}
-#homepage #whats-trending #body {
- margin-bottom: 36px;
-}
-#homepage #whats-trending #body .bucket {
- background: #ffffff;
- border-top: 4px solid #ade5f9;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- height: 346px;
- margin-top: 24px !important;
-}
-#homepage #whats-trending #body .bucket .content {
- text-align: left;
- height: 290px;
- max-height: 290px;
- margin: 0 !important;
- margin-left: 15px !important;
- margin-right: 19px !important;
- overflow: hidden;
- padding-top: 17px !important;
-}
-#homepage #whats-trending #body .bucket .view-more {
- margin-right: 10px;
- margin-bottom: 15px;
-}
-#homepage #whats-trending .official-repo {
- height: 100px;
- overflow: hidden;
-}
-#homepage #whats-trending .official-repo .repo-img {
- margin-top: 8px;
-}
-#homepage #whats-trending .official-repo .repo-info {
- width: 220px;
- padding-left: 10px;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
-}
-#homepage #whats-trending .official-repo .repo-info .home-body-header {
- margin-right: 6px;
-}
-#homepage #whats-trending .contributor {
- height: 38px;
- margin-bottom: 12px;
- margin-top: 5px;
-}
-#homepage #whats-trending .contributor .avatar {
- width: 36px;
- height: 36px;
-}
-#homepage #whats-trending .contributor .name {
- padding-left: 10px;
- line-height: 38px;
-}
-#homepage #whats-trending .contributor .points {
- padding-left: 10px;
- line-height: 38px;
- background: url("../img/homepage/homepage-cloud-upload-icon.svg");
- background-position: center left;
- background-repeat: no-repeat;
- width: 46px;
- text-align: right;
-}
-#homepage #whats-trending .popular-repo {
- margin-bottom: 48px;
-}
-#homepage #whats-trending .popular-repo .link {
- height: 20px;
- overflow: hidden;
- margin-bottom: 1px;
-}
-#homepage #whats-trending .popular-repo .downloads {
- padding-left: 34px;
- line-height: 38px;
- background: url("../img/homepage/homepage-cloud-download-icon.svg");
- background-position: center left;
- background-repeat: no-repeat;
- text-align: left;
- margin-right: 15px;
-}
-#homepage #whats-trending .popular-repo .stars {
- padding-left: 34px;
- line-height: 38px;
- background: url("../img/homepage/homepage-star-icon.svg");
- background-position: center left;
- background-repeat: no-repeat;
- text-align: left;
-}
-#homepage #what-are-they-saying {
- padding-bottom: 74px;
-}
-#homepage #what-are-they-saying #section-title {
- margin: 72px 0px 64px 0px;
-}
-#homepage #what-are-they-saying #tweets {
- width: 930px;
-}
-#homepage #what-are-they-saying #tweets .who {
- line-height: 16px;
-}
-#homepage #what-are-they-saying #tweets .who .tweet-name {
- font-weight: bold;
-}
-#homepage #what-are-they-saying #tweets .who .tweet-body {
- padding-left: 6px;
-}
-#homepage #what-are-they-saying #tweets .row {
- margin-top: 12px;
- margin-bottom: 24px;
-}
-#homepage #what-are-they-saying #tweets .avatar {
- width: 30px;
- height: 30px;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
-}
-#homepage #what-are-they-saying .home-body-header {
- line-height: 16px;
-}
-#homepage #what-are-they-saying .tile-private {
- line-height: 16px;
-}
-#homepage #what-are-they-saying #up-down {
- position: absolute !important;
- margin-left: 950px;
- width: 20px;
-}
-#homepage #what-are-they-saying #up-down span {
- display: none;
-}
-#homepage #what-are-they-saying #up-down #up {
- display: block;
- height: 11px;
- width: 20px;
- margin-bottom: 180px;
- background-image: url("../img/homepage/arrow-up-icon.svg");
-}
-#homepage #what-are-they-saying #up-down #up:hover {
- background-image: url("../img/homepage/arrow-up-icon-over.svg");
-}
-#homepage #what-are-they-saying #up-down #down {
- display: block;
- height: 11px;
- width: 20px;
- background-image: url("../img/homepage/arrow-down-icon.svg");
-}
-#homepage #what-are-they-saying #up-down #down:hover {
- background-image: url("../img/homepage/arrow-down-icon-over.svg");
-}
-@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) {
- #home-banner #logo-block {
- background: url("../img/homepage/docker-whale-home-logo+@2x.png");
- background-size: 459px 261px;
- }
- #three #stack-icon {
- background: url("../img/homepage/developer-stack-icon+@2x.png");
- background-size: 91px 77px;
- }
- #three #container-icon {
- background: url("../img/homepage/container-icon+@2x.png");
- background-size: 108px 83px;
- }
- #three #rack-icon {
- background: url("../img/homepage/server-rack-icon+@2x.png");
- background-size: 108px 83px;
- }
- #what-is-docker #body {
- background-image: url("../img/homepage/what-is-docker-arrow-loop+@2x.png");
- background-position: center;
- background-repeat: no-repeat;
- background-size: 764px 276px;
- }
-}
-/* What is Docker? */
-#what-is-docker #banner-block {
- height: 454px;
- background-color: #f2fcff;
-}
-#what-is-docker #banner-block h1 {
- margin: 0;
- margin-top: 52px;
-}
-#what-is-docker #banner-block #video-block {
- margin-top: 76px;
-}
-#what-is-docker #why-block #visual-block {
- padding-top: 192px;
- /* 89px */
- padding-left: 32px;
-}
-#what-is-docker #why-block #visual-block #devs-like-icon {
- margin: 0 auto;
- height: 114px;
- width: 134px;
- background-image: url("../img/what_is_docker/devs-like-icon.png");
- background-size: 134px 114px;
- background-repeat: no-repeat;
- background-position: center;
-}
-#what-is-docker #why-block #visual-block #devs-like-icon span {
- display: none;
-}
-#what-is-docker #why-block #visual-block #dotted-line-arrow {
- margin: 0 auto;
- margin-top: 26px !important;
- /* 0 */
- margin-bottom: 32px !important;
- /* 19 */
- height: 261px;
- width: 107px;
- background-image: url("../img/what_is_docker/dotted-line-arrow.png");
- background-size: 107px 261px;
- background-repeat: no-repeat;
- background-position: center;
-}
-#what-is-docker #why-block #visual-block #dotted-line-arrow span {
- display: none;
-}
-#what-is-docker #why-block #visual-block #sysadmins-like-icon {
- margin: 0 auto;
- height: 129px;
- width: 121px;
- background-image: url("../img/what_is_docker/sysadmins-like-icon.png");
- background-size: 121px 129px;
- background-repeat: no-repeat;
- background-position: center;
-}
-#what-is-docker #why-block #visual-block #sysadmins-like-icon span {
- display: none;
-}
-#what-is-docker #why-block #copy-block {
- padding-top: 106px;
- padding-left: 28px;
-}
-#what-is-docker #why-block #copy-block h2 {
- margin: 0;
-}
-#what-is-docker #why-block #copy-block #copy2 {
- margin-top: 84px;
- margin-bottom: 94px;
-}
-#what-is-docker #compare-block {
- background-color: #f2fcff;
- padding-top: 103px;
- padding-bottom: 100px;
-}
-#what-is-docker #compare-block h1 {
- margin: 0;
-}
-#what-is-docker #compare-block #copy-block {
- max-width: 360px;
-}
-#what-is-docker #compare-block #copy-block #copy1 {
- margin-top: 128px;
-}
-#what-is-docker #compare-block #copy-block #copy2 {
- margin-top: 153px;
- margin-bottom: 50px;
-}
-#what-is-docker #compare-block #curly-brace-large {
- margin-top: 72px;
- background-image: url("../img/what_is_docker/curly-brace-large.png");
- background-size: 33px 142px;
- background-repeat: no-repeat;
- background-position: center;
- height: 142px;
- width: 33px;
-}
-#what-is-docker #compare-block #curly-brace-small {
- margin-top: 208px;
- background-image: url("../img/what_is_docker/curly-brace-small.png");
- background-size: 27px 65px;
- background-repeat: no-repeat;
- background-position: center;
- height: 65px;
- width: 27px;
-}
-#what-is-docker #compare-block #visual-block {
- max-width: 220px;
-}
-#what-is-docker #compare-block #visual-block * {
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- text-align: center;
-}
-#what-is-docker #compare-block #visual-block .base-block {
- background: #394d54;
- margin-top: 4px;
- height: 31px;
- line-height: 31px;
- color: #ffffff;
-}
-#what-is-docker #compare-block #visual-block .docker-block {
- background: #24b8eb;
- margin-top: 4px;
- height: 31px;
- line-height: 31px;
- color: #ffffff;
-}
-#what-is-docker #compare-block #visual-block .twin-block .left,
-#what-is-docker #compare-block #visual-block .twin-block .right {
- width: 108px;
-}
-#what-is-docker #compare-block #visual-block .twin-block .left div {
- background: #91c5c5;
- color: #ffffff;
-}
-#what-is-docker #compare-block #visual-block .twin-block .left .half-block1 {
- height: 40px;
- line-height: 40px;
-}
-#what-is-docker #compare-block #visual-block .twin-block .left .half-block2 {
- height: 29px;
- line-height: 29px;
- margin: 4px 0px;
-}
-#what-is-docker #compare-block #visual-block .twin-block .left .half-block3 {
- height: 63px;
- line-height: 63px;
-}
-#what-is-docker #compare-block #visual-block .twin-block .right {
- border: 3px solid #ffa141;
-}
-#what-is-docker #compare-block #visual-block .twin-block .right div {
- background: #e0f0d9;
-}
-#what-is-docker #compare-block #visual-block .twin-block .right .half-block1 {
- height: 37px;
- line-height: 37px;
-}
-#what-is-docker #compare-block #visual-block .twin-block .right .half-block2 {
- height: 29px;
- line-height: 29px;
- margin: 4px 0px;
-}
-#what-is-docker #compare-block #visual-block .twin-block .right .half-block3 {
- height: 60px;
- line-height: 60px;
-}
-#what-is-docker #compare-block #visual-block #visual1 {
- margin-top: 73px;
-}
-#what-is-docker #compare-block #visual-block #visual2 {
- margin-top: 102px;
-}
-#what-is-docker #compare-block #visual-block #visual2 .half-block2 {
- margin-bottom: 0;
-}
-#what-is-docker #compare-block #visual-block #visual2 .right .half-block2 {
- height: 26px;
- line-height: 26px;
-}
-#what-is-docker #compare-block #buttons a {
- margin-right: 20px;
-}
-@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) {
- #what-is-docker #why-block #visual-block #devs-like-icon {
- background-image: url("../img/what_is_docker/devs-like-icon-@2x.png");
- background-size: 134px 114px;
- background-repeat: no-repeat;
- background-position: center;
- }
- #what-is-docker #why-block #visual-block #dotted-line-arrow {
- background-image: url("../img/what_is_docker/dotted-line-arrow+@2x.png");
- background-size: 107px 261px;
- background-repeat: no-repeat;
- background-position: center;
- }
- #what-is-docker #why-block #visual-block #sysadmins-like-icon {
- background-image: url("../img/what_is_docker/sysadmins-like-icon+2x.png");
- background-size: 121px 129px;
- background-repeat: no-repeat;
- background-position: center;
- }
- #what-is-docker #compare-block #curly-brace-large {
- background-image: url("../img/what_is_docker/curly-brace-large+@2x.png");
- background-size: 33px 142px;
- background-repeat: no-repeat;
- background-position: center;
- }
- #what-is-docker #compare-block #curly-brace-small {
- background-image: url("../img/what_is_docker/curly-brace-small+@2x.png");
- background-size: 27px 65px;
- background-repeat: no-repeat;
- background-position: center;
- }
-}
-.partners-list {
- margin-top: 32px;
-}
-.partners-list > .row-fluid {
- margin: 20px 0px;
-}
-.partners-list > .row-fluid > .partners-logo {
- padding-right: 20px;
- text-align: center;
-}
-.partners-list > .row-fluid > .partners-logo > img {
- max-height: 70px;
-}
-/* Plans - Pricing Block */
-#plans .row .span2 {
- margin-left: 0;
-}
-#plans #features {
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- text-align: right;
- width: 144px;
- height: 435px;
- padding-top: 84px;
- padding-bottom: 12px;
-}
-#plans #features .feature-label {
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- height: 42px;
- margin-bottom: 8px;
- padding-top: 6px;
- padding-right: 8px;
-}
-#plans #free {
- background-color: #f2fcff;
-}
-#plans .plan {
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- margin: 0px 6px 0px 0px;
- background: #d3f1fb;
- width: 105px;
- height: 435px;
- text-align: center;
-}
-#plans .plan .plan-name {
- padding: 10px;
- height: 60px;
- line-height: 62px;
-}
-#plans .plan .plan-feature {
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- height: 42px;
- line-height: 30px;
- margin-bottom: 8px;
- padding: 6px;
-}
-#plans .plan .plan-feature .feature-yes {
- display: block;
- height: 23px;
- background-image: url("../img/universal/docker-logo-pin.png");
- background-position: center;
- background-repeat: no-repeat;
- background-size: 22px 16px;
-}
-#display-table .row .span2 {
- margin-left: 0;
-}
-#display-table #labels {
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- padding-right: 22px;
- text-align: right;
- padding-top: 84px;
- padding-bottom: 12px;
-}
-#display-table #labels .column-label {
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- height: 42px;
- margin-bottom: 8px;
- padding-top: 6px;
-}
-#display-table #labels .column-label-high {
- height: 100px !important;
-}
-#display-table .bg-dark {
- background-color: #f2fcff;
-}
-#display-table .bg-light {
- background-color: #d3f1fb;
-}
-#display-table .column-large {
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- margin: 0px 16px 0px 0px;
- width: 216px;
- text-align: center;
-}
-#display-table .column-large .column-name {
- padding: 10px;
- height: 60px;
- line-height: 62px;
-}
-#display-table .column-large .column-feature {
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- height: 42px;
- line-height: 30px;
- margin-bottom: 8px;
- padding: 6px;
-}
-#display-table .column-large .column-feature .feature-yes {
- display: block;
- height: 23px;
- background-image: url("../img/universal/docker-logo-pin.png");
- background-position: center;
- background-repeat: no-repeat;
- background-size: 22px 16px;
-}
-#display-table .column-large .column-feature-high {
- padding-left: 12px;
- text-align: left;
- height: 100px !important;
-}
-/* Usecases */
-#usecases .target-link {
- text-align: right;
-}
-#usecases .row-fluid {
- margin-top: 15px;
- margin-bottom: 45px;
-}
-/* listing teams & people */
-/* Listing people (team, contributors etc.) */
-.list-people .team-member {
- position: relative;
- float: left;
- margin: 0px 10px 10px 0;
- box-sizing: border-box;
- -moz-box-sizing: border-box;
- background-color: #f2fcff;
- border: 2px solid #d3f1fb;
- max-width: 570px;
-}
-.list-people .team-member img {
- width: 130px;
- height: 130px;
-}
-.list-people .team-member .name {
- position: absolute;
- float: center;
- bottom: 0px;
- left: 0px;
- right: 0px;
- margin-right: auto;
- margin-left: auto;
- text-align: center;
- line-height: 18px;
- font-size: 16px;
- padding: 10px 8px;
- color: #ffffff;
- background: -moz-linear-gradient(top, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.65) 65%, rgba(0, 0, 0, 0.65) 99%);
- /* FF3.6+ */
- background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(0, 0, 0, 0)), color-stop(65%, rgba(0, 0, 0, 0.65)), color-stop(99%, rgba(0, 0, 0, 0.65)));
- /* Chrome,Safari4+ */
- background: -webkit-linear-gradient(top, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.65) 65%, rgba(0, 0, 0, 0.65) 99%);
- /* Chrome10+,Safari5.1+ */
- background: -o-linear-gradient(top, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.65) 65%, rgba(0, 0, 0, 0.65) 99%);
- /* Opera 11.10+ */
- background: -ms-linear-gradient(top, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.65) 65%, rgba(0, 0, 0, 0.65) 99%);
- /* IE10+ */
- background: linear-gradient(to bottom, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.65) 65%, rgba(0, 0, 0, 0.65) 99%);
- /* W3C */
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#a6000000', GradientType=0);
- /* IE6-9 */
-}
-.list-people .team-member .bio {
- display: none;
-}
-.entries h3 {
- margin: 10px 0px 20px 0px !important;
-}
-.entries .event {
- margin-bottom: 15px !important;
-}
-.entries .event .event-date {
- margin: 0px !important;
-}
-.entries .event .event-event-title {
- margin: 0px !important;
-}
-.entries .event p {
- margin: 0px !important;
-}
-/* patches */
-#content {
- padding-bottom: 100px;
-}
-ul {
- list-style-position: inside;
-}
-h1 {
- display: none;
-}
-h1,
-h2,
-h3 {
- margin: 0;
-}
-a {
- color: #24b8eb;
- text-decoration: none !important;
-}
-a:hover {
- color: #008bb8;
- text-decoration: none;
-}
-.primary-cta-button1,
-.primary-cta-button2 {
- color: #ffffff !important;
- padding: 6px 12px !important;
-}
-.action-buttons {
- margin-top: 75px;
-}
-.header2,
-.header3 {
- display: block;
-}
-.center-cta-btn {
- margin-top: 30px;
- margin-left: 110px;
-}
-.expand {
- min-height: 700px;
- height: 100%;
-}
-.menu-caption {
- display: block;
- padding: 10px;
- padding-bottom: 0;
-}
-.bg-clr-blue7 {
- background-color: #f2fcff;
-}
-.bg-clr-blue11 {
- background-color: #d3f1fb;
-}
-.padded {
- border-collapse: separate;
- border-spacing: 10px 10px;
- border: 1px solid #fff;
-}
-/* Blocks for community/participate */
-#community-blocks {
- text-align: center;
- font-weight: bold;
- font-size: 12px;
-}
-#community-blocks a {
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- display: inline-block;
- width: 125px;
- height: 125px;
- padding: 8px;
- margin: 0 auto;
- background-color: #f2fcff;
- border: 2px solid #d3f1fb;
-}
-#community-blocks a span {
- display: block;
-}
-.margin-section {
- margin: 30px 0px;
-}
-/* Logo - copy banner */
-#wrapping-banner {
- text-align: center;
- position: relative;
- left: 0;
- right: 0;
- background: #ffffff;
- /* Old browsers */
- background: -moz-linear-gradient(top, #ffffff 0%, #b8edff 50%, #83dfff 100%);
- /* FF3.6+ */
- background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff), color-stop(50%, #b8edff), color-stop(100%, #83dfff));
- /* Chrome,Safari4+ */
- background: -webkit-linear-gradient(top, #ffffff 0%, #b8edff 50%, #83dfff 100%);
- /* Chrome10+,Safari5.1+ */
- background: -o-linear-gradient(top, #ffffff 0%, #b8edff 50%, #83dfff 100%);
- /* Opera 11.10+ */
- background: -ms-linear-gradient(top, #ffffff 0%, #b8edff 50%, #83dfff 100%);
- /* IE10+ */
- background: linear-gradient(to bottom, #ffffff 0%, #b8edff 50%, #83dfff 100%);
- /* W3C */
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#83dfff', GradientType=0);
- /* IE6-9 */
-}
-#wrapping-banner h1,
-#wrapping-banner h2,
-#wrapping-banner h3 {
- display: block;
-}
-#wrapping-banner h2 {
- display: block;
- margin-top: 20px !important;
- margin-bottom: 20px !important;
-}
-#wrapping-banner .primary-cta-button1,
-#wrapping-banner .primary-cta-button2 {
- min-width: 180px;
-}
-#wrapping-banner #copy-block {
- width: 425px;
- margin-left: 26px;
- margin-bottom: 104px;
- margin-top: 74px !important;
-}
-#wrapping-banner #logo-block {
- height: 261px;
- width: 459px;
- margin-top: 57px;
- margin-bottom: 86px;
- background: url("../img/homepage/docker-whale-home-logo+.png");
- background-size: 459px 261px;
- background-repeat: no-repeat;
-}
-#wrapping-banner .eyebrow-header {
- line-height: 46px;
-}
-#wrapping-banner .header1 {
- line-height: 46px;
-}
-#wrapping-banner .subhead {
- margin-top: 20px;
- margin-bottom: 20px;
- line-height: 30px;
-}
-#wrapping-banner .email-form {
- margin-top: 18px;
-}
-#wrapping-banner .email-form label {
- display: none;
-}
-#wrapping-banner .email-form ul[class=errorlist] {
- list-style: none;
-}
-#wrapping-banner .email-form input[class=form-control] {
- width: 300px;
-}
-@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) {
- #wrapping-banner #logo-block {
- background: url("../img/homepage/docker-whale-home-logo+@2x.png");
- background-size: 459px 261px;
- }
-}
diff --git a/docs/theme/mkdocs/css/prettify-1.0.css b/docs/theme/mkdocs/css/prettify-1.0.css
deleted file mode 100644
index e0df245523..0000000000
--- a/docs/theme/mkdocs/css/prettify-1.0.css
+++ /dev/null
@@ -1,28 +0,0 @@
-.com { color: #93a1a1; }
-.lit { color: #195f91; }
-.pun, .opn, .clo { color: #93a1a1; }
-.fun { color: #dc322f; }
-.str, .atv { color: #D14; }
-.kwd, .prettyprint .tag { color: #1e347b; }
-.typ, .atn, .dec, .var { color: teal; }
-.pln { color: #48484c; }
-
-.prettyprint {
- padding: 8px;
-}
-.prettyprint.linenums {
- -webkit-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0;
- -moz-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0;
- box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0;
-}
-
-/* Specify class=linenums on a pre to get line numbering */
-ol.linenums {
- margin: 0 0 0 33px; /* IE indents via margin-left */
-}
-ol.linenums li {
- padding-left: 12px;
- color: #bebec5;
- line-height: 20px;
- text-shadow: 0 1px 0 #fff;
-}
diff --git a/docs/theme/mkdocs/fonts/LigatureSymbols.textClipping b/docs/theme/mkdocs/fonts/LigatureSymbols.textClipping
deleted file mode 100644
index e69de29bb2..0000000000
--- a/docs/theme/mkdocs/fonts/LigatureSymbols.textClipping
+++ /dev/null
diff --git a/docs/theme/mkdocs/fonts/LigatureSymbols/LigatureSymbols-2.11.eot b/docs/theme/mkdocs/fonts/LigatureSymbols/LigatureSymbols-2.11.eot
deleted file mode 100644
index 4350e01ce2..0000000000
--- a/docs/theme/mkdocs/fonts/LigatureSymbols/LigatureSymbols-2.11.eot
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/fonts/LigatureSymbols/LigatureSymbols-2.11.otf b/docs/theme/mkdocs/fonts/LigatureSymbols/LigatureSymbols-2.11.otf
deleted file mode 100644
index 1926697261..0000000000
--- a/docs/theme/mkdocs/fonts/LigatureSymbols/LigatureSymbols-2.11.otf
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/fonts/LigatureSymbols/LigatureSymbols-2.11.svg b/docs/theme/mkdocs/fonts/LigatureSymbols/LigatureSymbols-2.11.svg
deleted file mode 100644
index 1133aa11d5..0000000000
--- a/docs/theme/mkdocs/fonts/LigatureSymbols/LigatureSymbols-2.11.svg
+++ /dev/null
@@ -1,1299 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
-<!--
-2012-7-17: Created.
--->
-<svg>
-<metadata>
-Created by FontForge 20110222 at Thu Jan 31 03:56:08 2013
- By KazuyukiMotoyama
-Created by KazuyukiMotoyama with FontForge 2.0 (http://fontforge.sf.net) OFL license
-</metadata>
-<defs>
-<font id="LigatureSymbols" horiz-adv-x="716" >
- <font-face
- font-family="LigatureSymbols"
- font-weight="400"
- font-stretch="normal"
- units-per-em="1024"
- panose-1="2 0 5 3 0 0 0 0 0 0"
- ascent="819"
- descent="-205"
- x-height="526"
- cap-height="735"
- bbox="-15 -227 3034.26 859"
- underline-thickness="51"
- underline-position="-102"
- unicode-range="U+0020-FF00"
- />
-<missing-glyph horiz-adv-x="476"
-d="M102 0h272v682h-272v-682zM136 34v614h204v-614h-204z" />
- <glyph glyph-name="addstar" unicode="addstar"
-d="M78 33h561c43 0 78 35 78 78v393c0 43 -35 78 -78 78h-561c-43 0 -78 -35 -78 -78v-393c0 -43 35 -78 78 -78zM42 111v393c0 19 17 35 36 35h561c19 0 36 -16 36 -35v-393c0 -19 -17 -35 -36 -35h-561c-19 0 -36 16 -36 35zM136 130l114 60l114 -60l-22 127l92 89
-l-127 20l-57 114l-56 -114l-128 -20l92 -89zM562 307h80v-45h-80v-81h-46v81h-81v45h81v81h46v-81z" />
- <glyph glyph-name="adjust" unicode="adjust"
-d="M358 666c198 0 359 -161 359 -359s-161 -358 -359 -358s-358 160 -358 358s160 359 358 359zM358 603v-592c164 0 296 132 296 296s-132 296 -296 296z" />
- <glyph glyph-name="album" unicode="album" horiz-adv-x="595"
-d="M81 666h434c45 0 81 -37 81 -81v-475c0 -43 -35 -79 -78 -81v54c13 2 24 14 24 27v475c0 14 -13 26 -27 26h-434c-14 0 -27 -12 -27 -26c5 1 12 2 18 2c5 0 9 0 14 -1l325 -49c44 -8 76 -48 76 -92v-423c0 -42 -30 -73 -71 -73c-4 0 -10 0 -15 1l-324 49
-c-43 8 -77 48 -77 91v495c0 44 37 81 81 81zM97 411l285 -42l7 49l-285 42zM157 368l-4 -30l158 -24l4 30z" />
- <glyph glyph-name="alignadjust" unicode="alignadjust" horiz-adv-x="665"
-d="M29 604h609c15 0 28 -13 28 -27v-41c0 -16 -13 -29 -28 -29h-609c-16 0 -29 13 -29 29v41c0 15 13 27 29 27zM29 438h609c15 0 28 -12 28 -26v-42c0 -15 -13 -28 -28 -28h-609c-16 0 -29 13 -29 28v42c0 14 13 26 29 26zM29 272h609c15 0 28 -12 28 -26v-42
-c0 -15 -13 -28 -28 -28h-609c-16 0 -29 13 -29 28v42c0 14 13 26 29 26zM29 108h609c15 0 28 -14 28 -28v-41c0 -16 -13 -29 -28 -29h-609c-16 0 -29 13 -29 29v41c0 15 13 28 29 28z" />
- <glyph glyph-name="aligncenter" unicode="aligncenter" horiz-adv-x="665"
-d="M500 507h-333c-16 0 -29 14 -29 28v42c0 14 13 27 29 27h333c14 0 27 -13 27 -27v-42c0 -15 -13 -28 -27 -28zM610 345h-555c-15 0 -27 12 -27 28v41c0 16 12 27 27 27h555c15 0 28 -11 28 -27v-41c0 -16 -13 -28 -28 -28zM527 182h-388c-16 0 -28 13 -28 28v42
-c0 15 12 28 28 28h388c14 0 28 -13 28 -28v-42c0 -15 -14 -28 -28 -28zM29 108h609c15 0 28 -14 28 -28v-41c0 -16 -13 -29 -28 -29h-609c-16 0 -29 13 -29 29v41c0 15 13 28 29 28z" />
- <glyph glyph-name="alignleft" unicode="alignleft" horiz-adv-x="665"
-d="M0 577v-42c0 -14 13 -28 29 -28h331c15 0 28 13 28 28v42c0 14 -13 27 -28 27h-331c-16 0 -29 -13 -29 -27zM0 414v-41c0 -16 13 -28 29 -28h554c15 0 27 12 27 28v41c0 15 -12 27 -27 27h-554c-16 0 -29 -12 -29 -27zM0 252v-42c0 -15 13 -28 29 -28h388
-c14 0 26 13 26 28v42c0 15 -12 28 -26 28h-388c-16 0 -29 -13 -29 -28zM0 80v-41c0 -16 13 -29 29 -29h609c15 0 28 13 28 29v41c0 14 -13 28 -28 28h-609c-16 0 -29 -13 -29 -28z" />
- <glyph glyph-name="alignright" unicode="alignright" horiz-adv-x="665"
-d="M638 507h-333c-15 0 -27 14 -27 28v42c0 14 12 27 27 27h333c15 0 28 -13 28 -27v-42c0 -15 -13 -28 -28 -28zM638 345h-555c-15 0 -28 12 -28 28v41c0 16 13 27 28 27h555c15 0 28 -11 28 -27v-41c0 -16 -13 -28 -28 -28zM638 182h-388c-15 0 -28 13 -28 28v42
-c0 15 13 28 28 28h388c15 0 28 -13 28 -28v-42c0 -15 -13 -28 -28 -28zM29 108h609c15 0 28 -14 28 -28v-41c0 -16 -13 -29 -28 -29h-609c-16 0 -29 13 -29 29v41c0 15 13 28 29 28z" />
- <glyph glyph-name="amazon" unicode="ama&#x7a;on"
-d="M525 438v-155c0 -47 20 -68 38 -94c6 -9 7 -19 -1 -26c-19 -17 -57 -49 -76 -67l-1 1c-6 -6 -15 -7 -23 -3c-33 28 -40 41 -58 67c-54 -55 -92 -73 -164 -73c-84 0 -150 53 -150 157c0 81 45 136 107 163c54 24 130 27 188 34v14c0 24 2 51 -12 71c-12 18 -37 27 -57 27
-c-38 0 -71 -19 -79 -60c-2 -9 -9 -18 -18 -19l-97 10c-8 2 -17 10 -14 22c22 118 128 152 223 152c49 0 112 -13 150 -49c49 -46 44 -106 44 -172zM385 341v21c-73 0 -148 -15 -148 -101c0 -43 22 -72 60 -72c29 0 54 16 70 45c19 35 18 67 18 107zM681 150
-c12 -11 -2 -68 -8 -93c-2 -7 5 -9 10 -3c38 41 39 116 29 125c-10 10 -85 10 -126 -28c-6 -6 -4 -13 3 -11c26 6 81 21 92 10zM653 108c12 11 -1 24 -13 17c-83 -49 -175 -84 -261 -96c-129 -17 -259 13 -369 58c-9 4 -14 -6 -6 -11c104 -72 235 -121 372 -103
-c98 13 206 66 277 135z" />
- <glyph glyph-name="android" unicode="android" horiz-adv-x="657"
-d="M466 680l-39 -55c61 -29 105 -83 110 -146h-416c5 63 48 117 109 146l-39 55c-2 4 -1 8 2 10s7 1 10 -2l40 -58c26 10 55 16 86 16s59 -6 86 -16l40 58c2 3 6 4 9 2s4 -6 2 -10zM241 537c13 0 23 10 23 23c0 12 -10 23 -23 23c-12 0 -23 -11 -23 -23c0 -13 11 -23 23 -23
-zM419 537c13 0 23 10 23 23c0 12 -10 23 -23 23c-12 0 -23 -11 -23 -23c0 -13 11 -23 23 -23zM0 218v185c0 26 20 48 47 48c26 0 46 -22 46 -48v-185c0 -27 -20 -48 -46 -48c-27 0 -47 21 -47 48zM563 218v185c0 26 21 48 47 48s47 -22 47 -48v-185c0 -27 -21 -48 -47 -48
-s-47 21 -47 48zM122 111v339h416v-339c0 -20 -17 -37 -37 -37h-41v-105c0 -26 -21 -47 -47 -47s-47 21 -47 47v105h-73v-105c0 -26 -20 -47 -46 -47c-27 0 -47 21 -47 47v105h-42c-19 0 -36 17 -36 37z" />
- <glyph glyph-name="app" unicode="app" horiz-adv-x="768"
-d="M577 244l-3 -2c-15 -8 -25 -14 -29 -14c-3 -1 -5 -2 -7 -3c-7 13 -27 52 -57 104c-36 66 -139 309 -142 319c-2 10 0 20 7 24c1 1 3 1 5 1c6 0 13 -4 17 -7c6 -5 123 -184 186 -298c38 -69 51 -94 56 -103c-2 -1 -4 -2 -6 -4c-4 -5 -18 -13 -24 -16h-1zM353 544l13 -7
-c22 -12 27 -38 16 -60l-87 50c8 14 23 22 37 22c8 0 15 -1 21 -5zM368 453l1 -1c3 -1 3 -6 2 -8s-3 -3 -5 -3h-4l-1 1l-3 -5h1c3 -2 4 -5 3 -8c-2 -2 -3 -3 -5 -3c-1 0 -2 0 -3 1l-1 1l-6 -11l1 -1c2 -1 3 -5 2 -7s-3 -3 -5 -3c-1 0 -2 0 -3 1h-1l-3 -5l1 -1c3 -2 4 -5 2 -8
-c-1 -2 -2 -3 -4 -3c-1 0 -2 1 -3 1l-1 1l-3 -4l-4 -7l-87 50l4 7l3 4l-1 1c-3 1 -4 6 -2 8c1 2 2 3 4 3c1 0 2 0 3 -1h1l3 4l-1 1c-3 2 -4 5 -2 8c1 2 3 3 5 3c1 0 2 -1 3 -1l1 -1l6 11h-1c-3 2 -4 5 -2 8c1 2 2 3 4 3c1 0 2 -1 3 -1l1 -1l3 6l-1 1c-3 1 -4 5 -2 7
-c1 2 3 3 5 3h4l1 -1l4 7l87 -50zM56 115l172 298l87 -51l-172 -297l-4 -7c-15 6 -30 14 -44 22c-14 9 -29 19 -42 29l1 3zM0 159v149h133l-87 -149h-46zM521 191l14 -21l5 -5l3 -6h-311l87 149h139c34 -61 55 -101 55 -102c2 -3 3 -5 5 -6c1 -3 2 -7 3 -9zM657 239l-9 21
-c-2 3 -3 5 -5 7c-1 3 -2 6 -3 8l-8 16c-3 5 -6 10 -10 17h146v-149h-75c0 1 -1 3 -1 5l-11 23c-1 2 -2 5 -4 7c0 3 -1 5 -2 7l-10 23c-1 2 -4 4 -5 6c-1 3 -2 7 -3 9zM653 174l10 -20l1 -3s-15 -13 -28 -20s-31 -13 -31 -13l-3 4l-11 18v8l-8 6l-15 21v7l-7 5l-8 13l-5 8
-c7 1 19 6 37 16c1 0 1 1 2 1s1 1 2 1c15 8 26 15 31 22l4 -9l6 -13v-11l7 -4l10 -23l-1 -10zM670 129l84 -126c11 -20 1 -44 -19 -55c-7 -4 -15 -6 -22 -6c-14 0 -27 6 -35 19l-61 139c7 3 19 8 29 13c8 5 18 11 24 16zM32 -42l-5 -9c-1 -2 -4 -3 -7 -3h-1c-1 0 -2 0 -2 1
-c-1 0 -1 1 -2 1c-2 2 -2 6 -1 8l5 9l29 122c12 -9 25 -18 37 -25s25 -13 38 -18z" />
- <glyph glyph-name="apple" unicode="apple" horiz-adv-x="601"
-d="M426 588c8 22 13 41 13 59c0 3 -1 5 -1 8s-1 7 -2 11c-50 -11 -85 -33 -107 -65c-22 -31 -33 -68 -34 -111c18 2 33 5 44 8c15 5 31 15 47 30c18 18 32 40 40 60zM369 488c-30 -10 -51 -14 -62 -14c-9 0 -28 4 -59 12c-30 9 -55 14 -77 14c-49 0 -90 -21 -123 -63
-c-32 -42 -48 -95 -48 -161c0 -71 21 -143 63 -217c43 -74 87 -110 130 -110c14 0 32 5 57 14c23 9 43 14 61 14s40 -4 65 -13c26 -9 46 -13 61 -13c37 0 74 28 111 83c12 18 23 37 32 55c8 17 15 35 21 52c-27 8 -50 27 -69 55c-19 29 -29 61 -29 96c0 33 9 62 27 89
-c11 14 28 32 50 51c-7 9 -15 18 -22 25c-8 7 -15 13 -22 18c-28 18 -59 28 -93 28c-20 0 -45 -6 -74 -15z" />
- <glyph glyph-name="arrowdown" unicode="arrowdown"
-d="M466 654h-215c-26 0 -45 -20 -45 -46v-250h-170c-16 0 -27 -7 -34 -22c-1 -5 -2 -9 -2 -12c0 -10 3 -19 10 -26l324 -323c12 -15 36 -14 50 0l323 323c22 20 7 60 -26 60h-171v250c0 26 -18 46 -44 46z" />
- <glyph glyph-name="arrowleft" unicode="arrowleft" horiz-adv-x="689"
-d="M689 206v215c0 26 -19 45 -45 45h-250v170c0 16 -8 27 -22 34c-5 1 -10 2 -14 2c-10 0 -18 -3 -24 -10l-324 -324c-14 -12 -13 -36 0 -50l324 -324c20 -22 60 -7 60 26v172h250c26 0 45 18 45 44z" />
- <glyph glyph-name="arrowright" unicode="arrowright" horiz-adv-x="690"
-d="M0 410v-215c0 -26 19 -45 46 -45h250v-172c0 -16 7 -26 22 -33c4 -1 9 -2 13 -2c10 0 18 3 25 10l323 325c14 12 14 36 0 50l-323 322c-20 22 -60 8 -60 -25v-171h-250c-27 0 -46 -18 -46 -44z" />
- <glyph glyph-name="arrowup" unicode="arrowup"
-d="M251 -40h215c26 0 45 20 45 46v250h170c16 0 28 8 34 23c2 5 2 8 2 12c0 10 -3 18 -10 25l-324 323c-11 15 -36 14 -50 0l-323 -323c-22 -20 -7 -60 26 -60h171v-250c0 -26 18 -46 44 -46z" />
- <glyph glyph-name="back" unicode="back" horiz-adv-x="489"
-d="M489 589v-563l-489 281z" />
- <glyph glyph-name="backspace" unicode="backspace" horiz-adv-x="768"
-d="M253 560h452c35 0 63 -28 63 -63v-379c0 -35 -28 -64 -63 -64h-452l-253 253zM566 152l57 56l-100 99l100 99l-57 57l-99 -99l-98 99l-57 -56l99 -100l-99 -98l57 -56l99 98z" />
- <glyph glyph-name="bad" unicode="bad" horiz-adv-x="665"
-d="M505 532v37h109v70h-371s-59 -45 -59 -45v-319s82 -61 118 -136c36 -76 34 -164 34 -164h94s4 72 0 129c-5 58 -24 129 -24 129h260v82h-161v37h161v73h-161v37h130v70h-130zM0 590h142v-308h-142v308z" />
- <glyph glyph-name="ban" unicode="ban" horiz-adv-x="715"
-d="M651 512c98 -139 85 -334 -40 -459s-318 -137 -458 -40c-16 12 -34 26 -49 40c-15 15 -28 32 -39 49c-98 139 -86 334 39 459s319 137 459 40c16 -12 33 -26 48 -40c15 -15 29 -32 40 -49zM129 167l370 370c-104 63 -242 50 -331 -39c-90 -90 -102 -228 -39 -331z
-M587 447l-370 -369c104 -63 242 -50 331 39c90 90 102 227 39 330z" />
- <glyph glyph-name="barcode" unicode="barcode" horiz-adv-x="768"
-d="M0 10h25v594h-25v-594zM75 10h49v594h-49v-594zM173 10h50v594h-50v-594zM272 10h100v594h-100v-594zM421 10h75v594h-75v-594zM545 10h50v594h-50v-594zM644 10h25v594h-25v-594zM719 10h49v594h-49v-594z" />
- <glyph glyph-name="bell" unicode="bell" horiz-adv-x="768"
-d="M282 11h-205c-40 0 -75 29 -77 70c60 45 98 101 123 163c24 62 33 130 38 202c4 49 36 93 80 126c25 18 52 33 80 42c0 3 -2 6 -2 8c0 36 29 64 65 64s65 -28 65 -64c0 -2 -2 -6 -2 -8c28 -9 56 -24 81 -41c44 -32 79 -76 79 -124c4 -71 15 -142 40 -204
-c25 -63 63 -120 121 -164c-2 -41 -37 -70 -77 -70h-205c-10 -48 -51 -83 -101 -83s-92 35 -103 83zM103 81h562c-45 50 -76 107 -94 168c-19 60 -28 124 -32 190c-2 32 -27 61 -58 83c-30 22 -66 34 -96 34c-28 0 -65 -14 -97 -34c-31 -20 -57 -50 -58 -80
-c-3 -65 -13 -130 -31 -191c-20 -62 -52 -120 -96 -170zM385 -40c5 0 7 3 7 8c0 6 -2 9 -7 9c-32 0 -56 25 -56 56c0 6 -3 9 -8 9c-6 0 -10 -3 -10 -9c0 -40 33 -73 74 -73z" />
- <glyph glyph-name="bicycle" unicode="bicycle" horiz-adv-x="921"
-d="M573 428l56 -60c32 20 68 33 108 33c101 0 185 -83 185 -185c0 -101 -84 -184 -185 -184c-91 0 -167 65 -182 153l-83 -5h-1c-7 0 -12 4 -17 8l-170 211l-10 -21c56 -32 96 -92 96 -162c0 -101 -84 -184 -186 -184c-101 0 -184 83 -184 184c0 102 83 185 184 185
-c16 0 31 -2 46 -5l42 110l-115 31c-11 3 -19 15 -16 26c4 12 16 20 28 17l138 -39c6 -1 13 -6 15 -12c2 -4 3 -11 1 -17l-10 -23l221 -42l29 87l-40 -3h-1c-12 0 -22 12 -22 23s9 22 22 23l130 6c12 0 23 -10 23 -22c1 -13 -10 -22 -21 -23l-44 -2zM463 249l55 157l-215 39z
-M503 226l50 3c2 41 18 78 44 108l-41 44zM166 225l48 128c-9 2 -20 3 -30 3c-77 0 -139 -62 -139 -140c0 -77 62 -139 139 -139s141 62 141 139c0 51 -27 96 -67 120l-50 -127c-5 -11 -18 -16 -30 -12c-11 5 -16 17 -12 28zM737 195l-137 -8c14 -63 69 -110 137 -110
-c77 0 140 62 140 139c0 78 -63 140 -140 140c-29 0 -55 -7 -77 -22l93 -103c5 -7 8 -16 4 -23c-3 -8 -11 -13 -20 -13zM598 231l91 5l-62 68c-16 -22 -27 -45 -29 -73z" />
- <glyph glyph-name="bold" unicode="bold" horiz-adv-x="614"
-d="M0 2v-43c34 1 62 2 82 3c20 0 35 1 42 1c53 4 98 7 137 6l90 -2c78 0 136 10 184 32c23 11 43 27 63 49c15 15 26 33 33 53c8 27 12 51 12 73c0 80 -55 148 -163 173c17 8 33 16 44 22s20 10 25 14c38 28 57 61 57 105c0 19 -3 38 -9 55c-12 35 -39 64 -77 82
-c-17 10 -33 15 -44 17c-30 8 -59 12 -87 12h-35c-7 0 -13 0 -17 1h-10h-6c-2 0 -5 0 -8 -1h-20l-173 -5l-119 -3l2 -38c28 -4 45 -6 52 -6c14 0 25 -3 31 -7c3 0 5 -2 6 -4c2 -7 4 -22 5 -50c2 -50 2 -90 2 -120c1 -31 1 -52 3 -64v-225c0 -39 -1 -68 -5 -88
-c-1 -7 -4 -14 -9 -22c-14 -6 -32 -12 -56 -15c-12 -2 -23 -4 -32 -5zM247 362v79c2 55 0 95 -1 127c-2 14 -2 27 -2 34c24 5 43 7 59 7c52 0 91 -11 117 -35c26 -22 39 -50 39 -85c0 -95 -56 -131 -162 -131c-18 0 -35 1 -50 4zM247 166v144c10 2 24 4 46 4
-c51 1 90 -4 114 -14c49 -18 83 -70 83 -139c0 -33 -7 -59 -18 -82c-12 -23 -29 -39 -55 -51c-53 -25 -119 -23 -164 -4c-3 8 -4 14 -4 19z" />
- <glyph glyph-name="book" unicode="book" horiz-adv-x="768"
-d="M0 53v432s54 81 196 81c143 0 188 -77 188 -77s45 77 188 77c142 0 196 -81 196 -81v-432s-95 70 -198 70c-102 0 -186 -75 -186 -75s-84 75 -186 75c-103 0 -198 -70 -198 -70zM65 468v-314s41 31 139 31c97 0 148 -58 148 -58v327s-69 50 -156 50
-c-86 0 -131 -36 -131 -36zM416 454v-327s48 58 148 58c99 0 139 -31 139 -31v314s-45 36 -131 36c-87 0 -156 -50 -156 -50z" />
- <glyph glyph-name="bookmark" unicode="bookmark" horiz-adv-x="605"
-d="M39 640h495c40 0 71 -34 71 -75v-506c0 -50 -31 -85 -77 -85h-485c-31 0 -43 24 -43 38v591c0 18 14 37 39 37zM134 16h394c22 0 35 16 35 43v506c0 15 -12 33 -29 33h-47v-383l-138 44l-134 -44v383h-81v-582zM278 438v-37h55v-56h37v56h55v37h-55v56h-37v-56h-55z" />
- <glyph glyph-name="building" unicode="building" horiz-adv-x="607"
-d="M41 655h525c23 0 41 -18 41 -41v-592c0 -23 -18 -41 -41 -41h-135v133h-255v-133h-135c-23 0 -41 18 -41 41v592c0 23 18 41 41 41zM90 521h427v50h-427v-50zM90 406h427v50h-427v-50zM90 291h427v50h-427v-50zM90 176h427v50h-427v-50zM290 -41h-87v128h87v-128z
-M404 -41h-87v128h87v-128z" />
- <glyph glyph-name="bus" unicode="bus" horiz-adv-x="665"
-d="M0 106v434c0 14 8 32 19 43c3 3 7 5 10 7h1c48 37 111 64 183 79c38 7 78 11 120 11s82 -4 120 -11c72 -15 135 -42 183 -79h1c3 -2 6 -4 9 -7c11 -11 20 -29 20 -43v-434c0 -32 -22 -57 -51 -64v-58c0 -27 -22 -50 -49 -50c-28 0 -50 23 -50 50v56h-366v-56
-c0 -27 -23 -50 -50 -50c-28 0 -50 23 -50 50v58c-29 7 -50 32 -50 64zM500 605h-334c-18 0 -33 -15 -33 -33c0 -17 15 -32 33 -32h334c18 0 32 15 32 32c0 18 -14 33 -32 33zM100 273h465c18 0 33 16 33 34v165c0 18 -15 34 -33 34h-465c-18 0 -32 -16 -32 -34v-165
-c0 -18 14 -34 32 -34zM136 106c29 0 52 24 52 53c0 30 -23 53 -52 53c-30 0 -53 -23 -53 -53c0 -29 23 -53 53 -53zM529 106c30 0 54 24 54 53c0 30 -24 53 -54 53c-29 0 -52 -23 -52 -53c0 -29 23 -53 52 -53z" />
- <glyph glyph-name="camera" unicode="camera" horiz-adv-x="737"
-d="M585 540h68c46 0 84 -37 84 -84v-364c0 -46 -38 -84 -84 -84h-569c-46 0 -84 38 -84 84v364c0 47 38 84 84 84h69c17 27 48 66 76 66h279c28 0 60 -39 77 -66zM366 114c103 0 187 84 187 187c0 104 -84 188 -187 188c-104 0 -189 -84 -189 -188c0 -103 85 -187 189 -187z
-M369 414c62 0 112 -51 112 -113c0 -61 -50 -112 -112 -112s-113 51 -113 112c0 62 51 113 113 113z" />
- <glyph glyph-name="car" unicode="car" horiz-adv-x="768"
-d="M638 589l114 -229c2 -3 3 -7 4 -10c7 -18 12 -43 12 -59v-109c0 -34 -23 -62 -55 -70v-64c0 -31 -25 -55 -55 -55c-31 0 -55 24 -55 55v62h-438v-62c0 -31 -24 -55 -55 -55c-30 0 -55 24 -55 55v64c-32 8 -55 36 -55 70v109c0 16 5 41 12 59c1 3 2 7 4 10l114 229
-c9 17 33 33 53 33h402c20 0 44 -16 53 -33zM177 520l-61 -139c-3 -5 -3 -11 -3 -15h542c0 4 0 10 -3 15l-61 139c-8 18 -32 34 -51 34h-312c-19 0 -43 -16 -51 -34zM150 182c32 0 57 26 57 59c0 32 -25 57 -57 57s-59 -25 -59 -57c0 -33 27 -59 59 -59zM618 182
-c32 0 59 26 59 59c0 32 -27 57 -59 57s-57 -25 -57 -57c0 -33 25 -59 57 -59z" />
- <glyph glyph-name="category" unicode="category" horiz-adv-x="550"
-d="M83 666l-55 -56h496l-55 56h-386zM551 390h-551v193h551v-193zM386 445v55h-220v-55h27v28h165v-28h28zM551 169h-551v193h551v-193zM386 224v56h-220v-56h27v28h165v-28h28zM551 -51h-551v192h551v-192zM386 4v55h-220v-55h27v28h165v-28h28z" />
- <glyph glyph-name="check" unicode="check" horiz-adv-x="768"
-d="M620 657l-304 -436l-210 156l-106 -147l358 -273l410 588z" />
- <glyph glyph-name="chrome" unicode="chrome"
-d="M680 466h-322c-31 0 -59 -10 -84 -25c-43 -27 -72 -75 -74 -129l-124 215c66 84 167 139 282 139c141 0 264 -82 322 -200zM60 507l160 -278c1 -1 1 -2 2 -3c14 -25 36 -45 62 -59c23 -11 47 -19 74 -19s52 8 75 19l-125 -215c-174 25 -308 174 -308 355
-c0 74 22 143 60 200zM442 441h249c16 -41 26 -87 26 -134c0 -198 -161 -358 -359 -358c-8 0 -15 0 -23 1l160 276c1 1 1 2 2 3c13 24 20 50 20 78v5c-2 54 -32 102 -75 129zM239 307c0 67 52 120 119 120s120 -53 120 -120s-53 -120 -120 -120s-119 53 -119 120z" />
- <glyph glyph-name="cinnamon" unicode="cinnamon" horiz-adv-x="819"
-d="M793 333l26 -26l-26 -17l24 -37l-41 -4c2 0 16 -32 16 -32l-34 5c0 -4 -2 -52 -2 -52l-19 14l2 -26l-26 14l2 -35l-10 9c2 -14 8 -42 10 -43c-5 0 -31 9 -31 9c-2 -8 -6 -43 -6 -43l-21 11l-4 -46l-13 11c4 -30 7 -77 -22 -80c-28 -3 -54 32 -61 59c-2 3 -3 5 -3 5
-c-7 -10 -31 -31 -31 -31l-9 28l-16 -20c0 -24 -6 -51 -26 -56c-39 -10 -63 41 -70 57v2c-16 -3 -68 -13 -123 -15c-2 -19 -15 -37 -39 -37c-28 0 -50 24 -54 46c-4 2 -8 3 -12 5c-5 -22 -16 -45 -28 -50c-19 -8 -65 7 -68 31c-1 5 -1 12 -1 19l-37 -13s4 27 7 33l-40 20
-s13 13 23 20c2 2 4 3 6 5l-36 18s22 16 32 21c0 0 -25 12 -32 16c0 0 25 18 34 22c1 0 -33 36 -33 36s14 6 24 9c-5 0 -16 23 -23 30c0 0 20 5 34 6l-21 33s33 1 36 1l-14 32s28 -3 36 -7l-12 36l29 -2l-7 38s39 -14 43 -16c0 0 -7 33 0 25c5 -6 33 -34 41 -40
-c7 -4 85 -36 103 -41c11 -4 41 10 60 21c-23 6 -59 19 -60 25c5 9 53 11 79 52c26 42 26 85 26 85l-14 15l20 11c-5 2 -28 29 -31 91c-3 22 -19 64 -19 64l14 -7l3 23l18 -19c7 5 13 20 13 20s0 -12 4 -23c12 -4 73 -28 83 -55s24 -36 24 -44c2 7 16 18 16 18l-3 -19
-c4 0 87 -10 87 -10l3 20l11 -10s37 63 47 85c10 23 35 42 35 42l-16 -33c12 7 45 26 45 26c-8 -6 -22 -20 -20 -26c13 -24 33 -137 15 -163c32 0 9 -8 9 -8l-11 -7c0 -6 6 -40 19 -55c15 -19 26 -32 33 -36c10 -3 59 -20 59 -20zM742 193l-2 43c12 -3 26 -6 29 -4
-c-1 11 -11 19 -10 26c0 0 31 8 34 6c0 0 -22 26 -22 29c0 0 21 8 22 13c2 3 -20 18 -25 26c0 0 19 13 24 16c0 0 -13 3 -24 10c-26 7 -37 31 -41 39c-3 8 -34 49 -35 69c10 32 22 115 -13 165c-5 8 -15 -3 -15 -3c-5 -4 -51 -87 -51 -97c-4 0 -10 0 -10 -5
-c-10 2 -100 10 -113 -3c-5 11 -35 74 -70 94c-36 20 -63 16 -63 16c2 -12 3 -99 39 -135c-17 -5 -20 -11 -20 -11l13 -9c-3 -4 -11 -83 -40 -109c-20 -18 -52 -37 -52 -37c3 -4 22 -14 39 -18c9 5 15 10 15 10l-7 -11c7 -1 14 -1 18 1c-20 -14 -30 -24 -30 -24
-c2 -2 27 -8 27 -8c-4 -4 -17 -23 -17 -23c0 -1 23 -6 23 -6c-2 -2 -10 -17 -10 -17s23 -2 34 -14c1 -1 0 -1 -1 -1c6 -4 11 -7 14 -9c-8 2 -51 14 -60 13c4 7 9 21 9 21l-28 8l21 24l-30 8c-23 -9 -53 -17 -77 -3c-31 18 -93 33 -93 35c-17 16 -42 20 -42 20l3 -32
-c-5 0 -23 -1 -26 2c-2 -3 9 -28 9 -28c2 -2 -32 3 -32 3c0 -3 16 -27 21 -30c-10 1 -39 0 -39 0c0 -2 23 -31 23 -31c-8 0 -33 -6 -33 -6l28 -29c-5 -2 -29 -7 -29 -7c0 -2 24 -30 31 -30c-17 -4 -31 -22 -31 -22s28 -13 31 -13c-6 -4 -30 -24 -30 -24l33 -13
-c-11 -8 -28 -24 -28 -24s28 -13 36 -10l-11 -27l20 10c1 15 4 28 8 29c2 1 3 0 6 -5c9 -22 -13 -66 29 -76c31 -8 37 39 42 71c0 0 3 3 6 1c4 0 8 -1 10 -6c1 -2 1 -7 0 -14c49 -17 180 -14 217 -1c-3 11 -4 21 -3 30c3 8 14 -4 14 -4c-4 -35 19 -100 52 -94
-c28 6 26 52 25 86l-34 -21c2 1 -10 18 -9 36c0 0 11 -15 18 -21c6 5 14 9 26 21c8 -12 16 -30 16 -30l18 20l11 -23l26 25l18 -23s18 26 18 29c0 0 11 -18 12 -19c4 0 19 35 19 35s15 -12 19 -11c1 7 6 36 6 34l18 -7s9 36 11 41c5 -2 12 -2 17 -5c0 0 -3 2 -4 32l-20 15
-l-25 -41l-27 28s-28 -34 -37 -36c-6 5 -4 22 -4 22c-7 -9 -33 -27 -33 -27c0 5 -6 22 -6 22l-32 5c3 0 37 9 37 9l8 -21l30 26s5 -18 5 -21c0 0 34 31 34 35c0 0 20 -30 25 -28c5 4 22 42 22 43c0 0 23 -16 26 -23c0 1 7 28 7 28s26 -18 26 -15l-7 33zM684 496l-19 3
-s7 6 12 11c-3 2 -15 5 -24 4c2 6 23 12 19 16c-26 -4 -32 -7 -35 -16c-1 -1 -1 -3 -2 -4c-4 6 -8 12 -8 14c0 8 30 59 41 75c14 20 35 -103 16 -120c-5 4 -10 7 -10 7s11 6 10 10zM421 511l-14 3c-25 26 -27 92 -27 92s21 -6 34 -10c33 -19 51 -79 52 -83l-3 -2
-c-7 4 -28 16 -37 19c15 -14 -7 0 -7 0l19 -17c-1 0 -26 11 -26 11c2 -2 9 -13 9 -13zM633 433v1c-4 11 -3 22 1 28c3 4 7 6 11 6c6 0 14 -3 22 -17c10 -20 4 -39 0 -47c-3 -6 -9 -7 -12 -7c-10 0 -14 12 -22 36zM525 465c10 0 22 -9 23 -24c3 -31 -5 -41 -12 -43
-c-2 0 -4 -1 -6 -1c-12 0 -15 15 -18 30c-1 5 -2 10 -4 14c-1 6 -1 13 3 17c3 5 8 7 14 7zM540 436c1 3 0 10 -3 14c0 0 -1 0 -1 1c-13 12 -3 -21 1 -19c1 1 2 2 3 4zM735 329c7 0 15 -6 16 -13c1 -4 -2 -8 -6 -11c-7 -9 -18 -14 -31 -14c-7 0 -12 1 -13 1c-2 1 -4 2 -5 4
-c0 1 -2 4 -4 9c-2 -2 -4 -3 -6 -4c-4 -4 -9 -7 -15 -9c-10 -4 -22 -6 -34 -6c-25 0 -53 7 -62 16c-3 3 -8 8 -6 15c2 4 7 7 11 7c3 0 8 -3 17 -6c9 -4 21 -8 29 -9c4 -1 8 -1 12 -1c14 0 29 3 38 8c3 2 5 6 7 10v7c0 4 -1 8 -1 11c-4 2 -8 4 -11 7c-4 4 -11 7 -17 10
-c-9 5 -17 10 -17 18c0 2 0 7 5 11c11 8 40 8 43 8c6 0 17 0 23 -3c15 -6 22 -8 23 -16c2 -7 -3 -13 -9 -19c-5 -4 -10 -9 -16 -12v-5c0 -9 1 -11 1 -11c7 -11 12 -16 14 -17l1 1c1 9 8 13 13 13z" />
- <glyph glyph-name="circle" unicode="circle"
-d="M441 664c153 0 276 -124 276 -276c0 -143 -111 -262 -251 -274c-32 -94 -121 -163 -226 -163c-132 0 -240 107 -240 239c0 108 71 198 168 229c15 137 132 245 273 245zM78 507c-43 0 -78 35 -78 78s35 78 78 78s77 -35 77 -78s-34 -78 -77 -78zM78 626
-c-23 0 -41 -18 -41 -41s18 -41 41 -41s41 18 41 41s-18 41 -41 41zM478 188c95 17 167 101 167 200c0 113 -91 204 -204 204c-98 0 -180 -70 -198 -163c130 -1 235 -108 235 -239v-2zM403 188v2c0 90 -72 163 -162 164c14 -84 79 -151 162 -166zM240 27c65 0 119 37 147 91
-c-111 23 -197 110 -216 221c-56 -26 -95 -83 -95 -149c0 -91 73 -163 164 -163z" />
- <glyph glyph-name="clear" unicode="clear" horiz-adv-x="768"
-d="M438 524v127c0 23 -17 40 -39 40h-30c-22 0 -39 -17 -39 -40v-127c0 -22 17 -40 39 -40h30c22 0 39 18 39 40zM269 500l-90 89c-15 15 -41 15 -56 0l-21 -21c-15 -15 -15 -41 0 -56l89 -90c15 -15 42 -15 57 0l21 21c15 15 15 42 0 57zM577 422l89 90c15 15 15 41 0 56
-l-21 21c-15 15 -41 15 -56 0l-90 -89c-15 -15 -15 -42 0 -57l21 -21c15 -15 42 -15 57 0zM40 253h127c22 0 40 17 40 39v31c0 22 -18 38 -40 38h-127c-23 0 -40 -16 -40 -38v-31c0 -22 17 -39 40 -39zM601 253h127c23 0 40 17 40 39v31c0 22 -17 38 -40 38h-127
-c-22 0 -40 -16 -40 -38v-31c0 -22 18 -39 40 -39zM179 26l90 89c15 15 15 41 0 56l-21 22c-15 15 -42 15 -57 0l-89 -91c-15 -15 -15 -41 0 -56l21 -20c15 -15 41 -15 56 0zM666 102l-89 91c-15 15 -42 15 -57 0l-21 -22c-15 -15 -15 -41 0 -56l90 -89c15 -15 41 -15 56 0
-l21 20c15 15 15 41 0 56zM438 -37v127c0 22 -17 40 -39 40h-30c-22 0 -39 -18 -39 -40v-127c0 -23 17 -40 39 -40h30c22 0 39 17 39 40z" />
- <glyph glyph-name="clip" unicode="clip"
-d="M175 285l280 280c3 3 27 27 65 40c53 17 107 3 150 -40c44 -43 57 -96 40 -149c-12 -38 -37 -64 -40 -67l-301 -301c-52 -52 -182 -119 -302 0c-119 119 -51 250 0 301l323 324c12 12 31 12 43 0s12 -31 0 -43l-322 -324c-5 -4 -106 -109 0 -215c103 -103 204 -11 215 0
-l301 302s17 17 25 41c10 32 3 60 -25 88c-60 60 -118 10 -129 0l-280 -279c-10 -10 -17 -27 0 -44s33 -9 43 0l194 194c12 11 32 11 43 0c12 -12 12 -32 0 -44l-194 -193c-27 -26 -82 -47 -129 0c-48 47 -27 103 0 129z" />
- <glyph glyph-name="cloud" unicode="cloud" horiz-adv-x="819"
-d="M343 34h-172c-94 0 -171 77 -171 171c0 71 43 130 103 156c0 5 -1 10 -1 15c0 56 47 102 103 102c34 0 64 -17 83 -42c31 84 112 145 207 145c122 0 220 -99 222 -220c60 -27 102 -86 102 -156c0 -94 -77 -171 -171 -171h-167v100h81c12 0 16 8 7 17l-141 151
-c-4 4 -10 7 -16 7s-13 -3 -17 -7l-141 -151c-8 -9 -6 -17 7 -17h82v-100z" />
- <glyph glyph-name="code" unicode="code" horiz-adv-x="768"
-d="M159 309l172 -173l-83 -80l-248 248l254 254l79 -78zM609 305l-172 173l83 80l248 -248l-254 -254l-79 78z" />
- <glyph glyph-name="comment" unicode="comment"
-d="M80 645h557c44 0 80 -36 80 -80v-338c0 -44 -36 -80 -80 -80h-106l5 -137c0 -33 -18 -41 -42 -18l-157 155h-257c-44 0 -80 36 -80 80v338c0 44 36 80 80 80z" />
- <glyph glyph-name="comments" unicode="comments" horiz-adv-x="768"
-d="M227 147l-130 -87s27 72 29 124c-77 41 -126 108 -126 183c0 125 139 227 310 227c142 0 262 -71 299 -166c-14 2 -28 3 -42 3h-14c-70 -3 -135 -26 -185 -65c-55 -44 -85 -106 -83 -168c1 -19 5 -40 12 -58c-24 0 -47 3 -70 7zM708 20l-85 46c-17 -4 -37 -7 -55 -8h-12
-c-109 0 -197 63 -200 143c-4 83 86 154 200 158h11c109 0 198 -61 201 -142c2 -49 -28 -93 -77 -123c2 -35 17 -74 17 -74z" />
- <glyph glyph-name="compass" unicode="compass"
-d="M358 666c198 0 359 -161 359 -359s-161 -358 -359 -358s-358 160 -358 358s160 359 358 359zM358 32c152 0 276 123 276 275s-124 276 -276 276s-275 -124 -275 -276s123 -275 275 -275zM417 249l-214 -97l97 214l214 97zM242 190l155 78l-78 78z" />
- <glyph glyph-name="cookpad" unicode="cookpad"
-d="M358 666c198 0 359 -161 359 -359s-161 -358 -359 -358s-358 160 -358 358s160 359 358 359zM358 -14c177 0 322 144 322 321s-145 322 -322 322s-321 -145 -321 -322s144 -321 321 -321zM462 468c-16 39 -55 69 -105 69c-40 0 -79 -27 -93 -52
-c-79 36 -161 -28 -161 -103c0 -52 31 -87 75 -109c-5 -45 -13 -97 -18 -141c-2 -15 -6 -33 4 -45c25 -6 52 -3 80 -3h244c17 8 14 29 16 43c5 45 12 95 18 138c73 -2 123 46 123 114c0 89 -100 147 -183 89zM433 439c0 -9 -6 -11 -6 -18c9 -6 20 -14 32 -18
-c10 30 44 57 85 51c40 -5 66 -46 63 -85c-3 -33 -34 -66 -82 -67c3 20 4 41 -15 42c-20 0 -22 -31 -25 -58c-4 -29 -5 -57 -8 -74h-198c-28 0 -57 4 -53 -24c3 -16 29 -13 53 -13c62 0 135 2 193 -1c-2 -18 -4 -37 -7 -53h-268c8 60 15 124 23 184c-45 2 -84 36 -79 87
-c8 69 106 88 141 32c2 38 30 71 65 75c41 5 76 -21 86 -60z" />
- <glyph glyph-name="copy" unicode="copy" horiz-adv-x="696"
-d="M572 632l105 -109c10 -11 19 -34 19 -49v-323c0 -15 -12 -29 -28 -29h-187v49h157c5 0 9 4 9 9v272c0 5 -4 9 -9 9h-116c-5 0 -10 4 -10 9v124c0 5 -4 9 -9 9h-190c-5 0 -10 -4 -10 -9v-69c-10 4 -23 6 -33 6h-15v93c0 16 13 28 28 28h242c15 0 37 -9 47 -20zM570 510h42
-c5 0 6 3 3 7l-48 49c-3 4 -6 3 -6 -2v-45c0 -5 4 -9 9 -9zM318 472l104 -110c11 -11 19 -33 19 -48v-323c0 -16 -12 -29 -27 -29h-385c-16 0 -29 13 -29 29v473c0 15 13 29 29 29h241c15 0 37 -10 48 -21zM58 11h325c5 0 10 4 10 9v272c0 5 -5 9 -10 9h-116c-5 0 -9 4 -9 9
-v124c0 5 -4 9 -9 9h-191c-5 0 -9 -4 -9 -9v-414c0 -5 4 -9 9 -9zM360 356l-47 51c-4 4 -7 1 -7 -4v-44c0 -5 5 -9 10 -9h41c5 0 7 3 3 6z" />
- <glyph glyph-name="crop" unicode="crop"
-d="M591 140h126v-65h-126v-126h-66v126h-399v399h-126v66h126v126h65v-126h374l74 73l35 -35l-83 -83v-355zM191 166l309 308h-309v-308zM525 429l-288 -289h288v289z" />
- <glyph glyph-name="crown" unicode="crown" horiz-adv-x="768"
-d="M384 469c-44 0 -80 36 -80 80c0 45 36 80 80 80s80 -35 80 -80c0 -44 -36 -80 -80 -80zM65 502c35 0 63 -29 63 -64c0 -36 -28 -64 -63 -64c-36 0 -65 28 -65 64c0 35 29 64 65 64zM705 502c35 0 63 -29 63 -64c0 -36 -28 -64 -63 -64c-36 0 -65 28 -65 64
-c0 35 29 64 65 64zM135 60l-53 290c16 3 31 12 43 22c33 -30 75 -59 115 -59c48 0 87 74 114 136c9 -3 20 -6 30 -6s21 3 30 6c27 -62 66 -136 114 -136c40 0 82 29 115 59c12 -10 27 -19 43 -22l-53 -290h-498zM124 35h520v-49h-520v49z" />
- <glyph glyph-name="cut" unicode="cut"
-d="M184 258h-4c-42 0 -87 -20 -121 -53c-35 -32 -59 -75 -59 -118c0 -49 35 -79 83 -79c41 0 87 21 122 53c34 33 58 75 58 118c0 5 0 12 -1 17l32 28l314 -161c5 -2 10 -4 15 -4c7 0 20 4 34 6c13 3 27 6 35 7c14 2 25 15 25 29c0 10 -5 19 -14 25l-261 181l261 181
-c9 6 14 15 14 25c0 14 -11 28 -25 30c-4 0 -9 1 -15 3c-12 3 -28 5 -40 7s-21 2 -29 -2c-2 -1 -8 -4 -19 -9c-10 -5 -23 -12 -38 -20s-32 -16 -50 -26c-18 -9 -39 -19 -57 -29c-38 -19 -75 -38 -103 -52c-14 -7 -26 -14 -35 -18c-8 -4 -12 -7 -12 -7l-32 29c1 5 1 11 1 16
-c0 43 -24 86 -58 118c-35 32 -81 53 -122 53c-48 0 -83 -30 -83 -79c0 -42 24 -85 60 -118c36 -34 82 -56 124 -53c4 -6 13 -14 22 -22s17 -17 23 -23v-8c-6 -6 -13 -13 -23 -22c-9 -8 -17 -17 -22 -23zM74 527v3c3 1 6 1 9 1c24 0 50 -15 67 -29c8 -7 18 -19 25 -31
-c8 -12 15 -26 15 -37v-2c-5 -1 -8 -1 -10 -1c-24 0 -48 15 -66 30c-7 7 -18 17 -26 29s-14 26 -14 37zM219 251l41 40l-2 48l365 186l64 -12l-380 -262l-17 9l-40 -36c-7 11 -18 20 -31 27zM232 351l-13 14c13 5 24 14 31 25l16 -14c-15 -7 -28 -11 -34 -25zM278 307
-c0 -16 13 -29 29 -29c17 0 30 13 30 29c0 17 -13 30 -29 30c-18 0 -30 -13 -30 -30zM338 236l77 53l272 -188l-64 -12zM75 87c0 22 15 47 37 65s48 32 68 32c3 0 6 -1 8 -1v-2c1 0 1 -1 1 -2c0 -22 -15 -46 -37 -64s-47 -32 -69 -32h-4c-1 1 -2 1 -4 1v3z" />
- <glyph glyph-name="dashboard" unicode="dashboard"
-d="M105 8h506c9 0 18 4 23 11c27 30 47 68 61 107c14 40 22 82 22 122c0 98 -40 187 -105 253c-66 66 -155 105 -254 105s-188 -39 -254 -105c-65 -66 -104 -154 -104 -253c0 -40 8 -82 22 -122c14 -39 33 -77 61 -107c5 -7 12 -11 22 -11zM313 501c0 26 20 45 45 45
-s45 -19 45 -45c0 -25 -20 -44 -45 -44s-45 19 -45 44zM134 427c0 25 20 44 45 44s45 -19 45 -44s-20 -45 -45 -45s-45 20 -45 45zM493 427c0 25 20 44 45 44c26 0 45 -19 45 -44s-19 -44 -45 -44c-25 0 -45 19 -45 44zM355 202l52 186c3 9 11 16 22 16s22 -10 22 -21
-c0 -2 -2 -7 -4 -16c-3 -10 -5 -22 -9 -34c-3 -13 -7 -28 -11 -42c-9 -31 -18 -60 -23 -80c-3 -10 -5 -19 -6 -22c20 -14 35 -36 35 -61c0 -42 -33 -75 -75 -75s-74 33 -74 75c0 19 7 38 20 51s32 22 51 23zM60 248c0 25 19 44 44 44s46 -19 46 -44s-21 -45 -46 -45
-s-44 20 -44 45zM567 248c0 25 20 44 45 44s44 -19 44 -44s-19 -45 -44 -45s-45 20 -45 45z" />
- <glyph glyph-name="delicious" unicode="delicious" horiz-adv-x="665"
-d="M303 332h-303v303h303v-303zM655 332h-303v303h303v-303zM272 604h-241v-242h241v242zM303 -20h-303v303h303v-303zM352 -20v303h303v-303h-303zM399 252h-16v-16zM440 252l-57 -57v-41l98 98h-41zM522 252l-139 -139v-41l180 180h-41zM383 10h19l223 222v20h-21
-l-221 -221v-21zM484 10l141 141v40l-182 -181h41zM566 10l59 59v41l-100 -100h41zM607 10h18v18z" />
- <glyph glyph-name="down" unicode="down"
-d="M356 297l246 246l115 -119l-355 -354l-362 362l112 113z" />
- <glyph glyph-name="dribbble" unicode="dribbble"
-d="M358 666c198 0 359 -161 359 -359s-161 -358 -359 -358s-358 160 -358 358s160 359 358 359zM358 613c-25 0 -48 -3 -71 -9c4 -5 61 -82 113 -178c116 43 160 110 160 111c-53 48 -124 76 -202 76zM227 584c-85 -40 -149 -119 -168 -213c7 -1 136 -2 282 37
-c-52 94 -110 171 -114 176zM595 502c-1 -1 -50 -72 -171 -121c7 -15 14 -30 20 -45c2 -5 6 -10 8 -15c104 13 208 -10 213 -11c-1 73 -27 140 -70 192zM52 307c0 -79 30 -151 79 -205c0 0 83 150 249 203c4 1 8 2 11 3c-7 17 -15 35 -24 52c-158 -47 -309 -44 -315 -44v-9z
-M529 53l1 1c69 46 117 120 130 205c-6 2 -92 28 -190 13c40 -111 56 -201 59 -219zM477 26h1c-5 27 -22 120 -65 232c-1 0 -1 -1 -2 -1c-174 -60 -236 -181 -240 -190l6 -7c51 -37 113 -59 181 -59c42 0 83 9 119 25z" />
- <glyph glyph-name="dropdown" unicode="dropdown" horiz-adv-x="614"
-d="M602 454l-253 -317c-24 -29 -61 -29 -84 0l-253 317c-24 30 -12 53 25 53h540c38 0 49 -23 25 -53z" />
- <glyph glyph-name="edit" unicode="edit" horiz-adv-x="757"
-d="M558 100v129l80 80v-235c0 -47 -39 -86 -85 -86h-468c-47 0 -85 39 -85 86v467c0 47 38 86 85 86h475v-1l-80 -79h-368c-17 0 -32 -15 -32 -33v-414c0 -18 15 -32 32 -32h414c17 0 32 14 32 32zM634 588l85 -85l39 39l-85 85zM335 288l84 -85l271 271l-84 85zM275 144
-l116 31l-85 85z" />
- <glyph glyph-name="eject" unicode="eject" horiz-adv-x="665"
-d="M13 274l274 343c26 31 66 31 91 0l274 -343c26 -32 14 -57 -27 -57h-585c-40 0 -53 25 -27 57zM50 -34h565c28 0 51 22 51 51v67c0 28 -23 50 -51 50h-565c-28 0 -50 -22 -50 -50v-67c0 -29 22 -51 50 -51z" />
- <glyph glyph-name="etc" unicode="etc"
-d="M176 307c0 48 -40 88 -88 88c-49 0 -88 -40 -88 -88s39 -88 88 -88c48 0 88 40 88 88zM446 307c0 48 -40 88 -88 88s-88 -40 -88 -88s40 -88 88 -88s88 40 88 88zM717 307c0 48 -39 88 -88 88c-48 0 -88 -40 -88 -88s40 -88 88 -88c49 0 88 40 88 88z" />
- <glyph glyph-name="evernote" unicode="evernote" horiz-adv-x="617"
-d="M65 511h69c15 0 28 13 28 28c0 0 -1 14 -1 31v44c0 13 3 24 9 32c8 12 23 20 37 24c16 5 82 9 125 -8c16 -6 31 -27 34 -47c25 1 65 1 100 -3c44 -5 78 -11 95 -17c16 -5 34 -20 39 -49c9 -50 21 -250 15 -317c-10 -104 -25 -167 -32 -187c-33 -103 -62 -107 -143 -107
-c-102 0 -134 16 -134 99c0 91 43 93 116 91c10 -1 -1 -11 -1 -29c0 -17 7 -24 -3 -24c-20 0 -49 3 -49 -26c0 -35 17 -34 61 -34c55 0 66 8 66 58c0 82 -23 94 -56 98c-35 4 -70 9 -87 15c-42 15 -39 72 -39 87c0 3 -4 2 -4 0c0 -23 -1 -53 -13 -89c-3 -10 -6 -16 -6 -16
-c-13 -29 -36 -18 -72 -14c-36 5 -111 20 -145 34c-14 7 -20 14 -28 30c-19 41 -40 175 -43 194c-3 25 -3 36 -3 36c0 16 2 31 11 44c4 6 11 12 20 16c8 3 20 6 34 6zM131 531h-70c-16 0 -31 -3 -43 -8c0 -1 -4 -3 -7 -4l1 1l134 133h1l-2 -4c-5 -9 -8 -22 -8 -35
-c0 -17 1 -75 1 -75c0 -4 -3 -8 -7 -8zM460 325c18 0 36 -5 49 -11c0 20 -4 53 -37 54c-30 1 -39 -24 -41 -44c9 1 19 2 29 1z" />
- <glyph glyph-name="exchange" unicode="exchange" horiz-adv-x="798"
-d="M696 164h81c24 0 28 -14 11 -30l-118 -119c-10 -11 -29 -11 -40 0l-119 119c-16 16 -12 30 12 30h81v294c-4 41 -38 72 -80 72c-43 0 -78 -33 -80 -75v-296c-3 -62 -40 -117 -92 -145c-24 -12 -50 -18 -79 -18s-54 6 -78 18c-53 28 -91 83 -93 146v290h-80
-c-24 0 -29 13 -12 29l118 119c11 11 30 11 40 0l119 -119c17 -16 12 -29 -12 -29h-80v-291c2 -42 35 -76 78 -76s79 36 79 79v293c3 63 39 116 92 144c24 12 51 19 80 19s55 -7 80 -19c51 -27 87 -79 92 -140v-295z" />
- <glyph glyph-name="external" unicode="external" horiz-adv-x="665"
-d="M501 547l-334 -336l70 -71l335 335l62 -61c17 -17 32 -12 32 14v181c0 16 -14 31 -31 31h-181c-26 0 -32 -15 -15 -32zM538 82v227h76v-253c0 -45 -37 -82 -82 -82h-450c-45 0 -82 37 -82 82v451c0 45 37 82 82 81h277v-76h-251c-16 0 -31 -15 -31 -31v-399
-c0 -16 15 -31 31 -31h399c16 0 31 15 31 31z" />
- <glyph glyph-name="facebook" unicode="facebook" horiz-adv-x="665"
-d="M38 640h590c20 0 38 -18 38 -38v-590c0 -20 -18 -38 -38 -38h-590c-20 0 -38 18 -38 38v590c0 20 18 38 38 38zM473 266h92l4 88h-96v61v4c0 25 5 39 37 39h56l2 82s-25 4 -61 4c-88 0 -127 -55 -127 -114v-76h-65v-88h65v-244h93v244z" />
- <glyph glyph-name="file" unicode="file" horiz-adv-x="596"
-d="M430 638l141 -148c14 -15 26 -43 26 -65v-438c0 -20 -16 -38 -38 -38h-521c-20 0 -38 18 -38 38v641c0 20 18 38 38 38h328c22 0 50 -13 64 -28zM79 15h439c7 0 13 6 13 13v366c0 7 -6 13 -13 13h-157c-7 0 -13 6 -13 13v167c0 7 -5 12 -12 12h-257c-7 0 -12 -5 -12 -12
-v-559c0 -7 5 -13 12 -13zM487 482l-63 68c-5 5 -9 3 -9 -4v-61c0 -6 6 -12 12 -12h56c7 0 9 4 4 9zM156 540h124c13 0 25 -12 25 -26v-15c0 -13 -12 -25 -25 -25h-124c-14 0 -26 12 -26 25v15c0 14 12 26 26 26zM156 406h124c13 0 25 -12 25 -26v-15c0 -13 -12 -25 -25 -25
-h-124c-14 0 -26 12 -26 25v15c0 14 12 26 26 26zM439 206h-283c-14 0 -26 11 -26 25v15c0 14 12 25 26 25h283c13 0 26 -11 26 -25v-15c0 -14 -13 -25 -26 -25zM439 69h-283c-14 0 -26 11 -26 24v16c0 14 12 25 26 25h283c13 0 26 -11 26 -25v-16c0 -13 -13 -24 -26 -24z
-" />
- <glyph glyph-name="firefox" unicode="firefox" horiz-adv-x="798"
-d="M444 -63h-1c-1 -1 -1 -2 -2 -2c-3 -6 -10 -10 -17 -10c-17 1 -37 2 -55 5c-2 0 -5 1 -7 1c-3 -3 -8 -5 -13 -5h-3c-23 4 -48 12 -72 22c-19 8 -37 16 -53 26c-57 30 -107 74 -144 128c-27 37 -46 80 -57 124c-9 1 -16 9 -16 17c-1 13 -2 27 -2 40c0 19 1 39 3 56
-c-4 4 -6 10 -5 16c4 35 15 70 29 102c5 13 11 25 18 36c-1 8 -1 15 -1 23c0 42 14 82 42 114c3 4 8 6 14 6h6c7 -2 12 -8 13 -15c2 -14 7 -28 15 -39c67 67 159 107 260 107c60 0 117 -14 167 -40c43 -16 82 -41 114 -74c1 2 2 5 4 6c3 4 8 6 13 6c4 0 9 -1 12 -3
-c22 -16 40 -40 52 -69c13 -29 21 -61 23 -96c0 -4 1 -8 1 -13c6 -2 12 -8 13 -15c3 -15 4 -32 4 -47c0 -50 -11 -98 -34 -142c-2 -6 -4 -13 -6 -18c4 -4 7 -9 7 -15v-3c-6 -48 -48 -101 -106 -137c-6 -4 -12 -8 -18 -11c1 -6 -1 -12 -5 -16c-31 -34 -89 -57 -157 -64
-c-12 -1 -25 -1 -36 -1zM574 186l-21 -28c-4 -3 -9 -5 -13 -7c-1 0 -2 0 -3 1c-3 3 -2 10 1 17c-4 -3 -10 -7 -15 -11c-10 -8 -18 -17 -24 -25c-3 -1 -7 -2 -10 -2c3 3 6 6 8 10c-18 -9 -43 -15 -67 -15h-4c-6 1 -12 1 -17 2c-19 3 -39 9 -56 18c0 0 -1 0 -2 1c5 1 10 1 15 1
-s9 0 13 -1c-9 4 -21 8 -33 8h-4h-1c-1 0 -1 0 -2 -1c-47 28 -83 72 -88 119c-3 27 0 50 12 73c-7 1 -14 2 -22 2c-12 0 -25 -2 -36 -5c-5 -1 -8 -2 -11 -3c-1 3 -4 6 -5 9c16 6 35 9 52 9c10 0 20 -1 29 -2c1 -1 3 -1 4 -1l1 -1h5c0 -1 0 -1 1 -1s2 0 3 -1h1c1 0 2 -1 3 -1
-h1c1 -1 2 -1 3 -1c0 -1 1 -1 1 -1c1 0 2 -1 3 -1c0 0 1 0 1 -1c1 0 2 0 3 -1h1c2 -1 3 -1 4 -2c3 7 4 15 4 23v3c0 8 -2 16 -5 23c-2 4 -5 9 -7 13c-12 19 -18 42 -18 68c0 47 23 90 60 116c-5 0 -10 1 -14 1c-37 0 -69 -17 -89 -45c-12 3 -34 5 -45 5
-c-48 0 -91 -22 -120 -58c-10 -13 -19 -28 -25 -43c-13 -30 -24 -63 -28 -98c4 12 10 24 16 34c-8 -28 -12 -63 -12 -103c0 -12 0 -26 1 -38c1 16 4 32 6 45c11 -131 89 -243 202 -299c14 -9 33 -18 51 -26c24 -9 47 -16 67 -19c-10 4 -21 9 -31 14c5 -1 11 -2 17 -3
-c11 -3 24 -6 37 -8c18 -3 36 -4 52 -4c-5 2 -11 4 -17 7c12 1 24 2 35 3h2c11 0 23 1 34 2c65 6 119 29 146 58c-14 -7 -32 -13 -50 -17c16 9 34 20 48 31c9 5 19 10 28 16c55 34 92 82 98 124c-8 -14 -21 -29 -38 -42c15 26 29 53 38 82c20 41 31 87 31 135
-c0 15 -1 30 -3 44v-6c0 -22 -4 -41 -11 -58c-1 15 -2 32 -4 46c2 15 3 32 2 48c-4 67 -31 121 -69 150c19 -20 32 -51 32 -86c0 -3 0 -5 -1 -8c-38 85 -116 150 -210 169c53 -27 98 -70 127 -122c-19 18 -43 34 -71 41c46 -42 76 -101 78 -169c0 -8 0 -17 -1 -25
-c-7 18 -20 34 -33 47c4 -22 8 -44 8 -69c1 -35 -3 -68 -10 -99c-3 15 -7 30 -12 42c0 -4 0 -8 -1 -11c-2 -36 -12 -68 -26 -92zM102 617c-24 -28 -37 -62 -37 -101v-2l4 4s1 1 1 2c2 1 3 2 4 3l1 1s2 2 4 3v1c2 1 3 2 5 4c2 1 3 3 5 4v1c5 3 11 7 16 10c8 4 17 8 26 12
-c-3 2 -5 5 -8 8c0 1 0 1 -1 2c0 0 0 1 -1 1c0 1 -1 1 -1 2l-1 1c0 1 -1 2 -1 2c0 1 -1 2 -1 3l-1 1c0 1 -1 1 -1 2s-1 2 -1 2c0 1 -1 2 -1 2c0 1 -1 1 -1 2s0 1 -1 2v1c-1 1 -1 2 -1 2c-1 1 -1 1 -1 2s-1 1 -1 2v1c-1 1 -2 3 -2 4c0 0 -1 0 -1 1v2c-1 1 -1 1 -1 2v2l-1 1v3
-c0 0 0 1 -1 1v4zM390 473c-1 15 -47 11 -65 11c-9 0 -19 5 -26 10c-1 -6 -2 -14 -2 -20c0 -20 5 -41 15 -58c3 -4 5 -8 7 -12c16 11 40 23 48 29c13 10 24 24 23 40zM426 282c-47 0 -47 -21 -90 -21c-22 0 -51 11 -68 38c0 -7 0 -16 1 -24c4 -32 26 -65 58 -90
-c20 1 42 6 53 10c30 10 53 33 70 39c7 3 21 -5 28 9c6 11 -20 39 -52 39z" />
- <glyph glyph-name="flag" unicode="flag" horiz-adv-x="642"
-d="M108 -33v565c23 14 35 36 35 62c0 39 -32 72 -71 72c-40 0 -72 -33 -72 -72c0 -26 14 -48 37 -62v-565c0 -10 7 -18 16 -18h37c10 0 18 8 18 18zM143 500v-324c0 -19 10 -27 22 -18c23 17 43 30 61 39c37 17 63 25 87 26c30 0 53 -6 76 -17c22 -10 42 -26 65 -41
-c13 -8 29 -13 47 -14c30 -2 72 5 121 45c11 9 20 32 20 49v324c0 19 -8 26 -20 17c-25 -19 -48 -32 -68 -38c-41 -11 -73 -9 -100 7c-23 15 -43 31 -65 41c-23 11 -46 17 -76 17c-11 0 -25 -3 -40 -7c-27 -8 -62 -25 -108 -57c-12 -9 -22 -31 -22 -49z" />
- <glyph glyph-name="flickr" unicode="flickr" horiz-adv-x="665"
-d="M84 640h498c47 0 84 -37 84 -84v-498c0 -25 -10 -44 -25 -59c-14 -14 -36 -25 -59 -25h-498c-47 0 -84 37 -84 84v498c0 23 11 45 25 59c15 15 34 25 59 25zM195 197c62 0 113 50 113 112s-51 113 -113 113c-61 0 -113 -51 -113 -113s52 -112 113 -112zM471 197
-c61 0 113 50 113 112s-52 113 -113 113c-62 0 -114 -51 -114 -113s52 -112 114 -112z" />
- <glyph glyph-name="folder" unicode="folder"
-d="M380 508h305c17 0 32 -15 32 -32v-423c0 -17 -15 -31 -32 -31h-653c-17 0 -32 14 -32 31v423c0 17 15 32 32 32h34l16 53c0 17 15 32 32 32h218c17 0 32 -15 32 -32z" />
- <glyph glyph-name="foursquare" unicode="foursquare" horiz-adv-x="665"
-d="M356 116l156 155c11 11 12 29 3 42l151 127v-466h-666v666h554l-154 -212l-44 44c-12 12 -33 12 -45 0l-9 -9c-25 40 -70 66 -120 66c-78 0 -140 -62 -140 -140c0 -76 60 -137 135 -140l134 -133c12 -13 33 -13 45 0zM326 204l-86 68c24 12 44 32 57 56
-c15 -20 26 -34 27 -35c1 -2 4 -4 7 -4s6 1 9 5l252 346h74v-160l-329 -277c-2 -1 -4 -2 -5 -2c-4 0 -6 3 -6 3zM182 499c60 0 110 -49 110 -110c0 -60 -50 -109 -110 -109s-109 49 -109 109c0 61 49 110 109 110z" />
- <glyph glyph-name="forward" unicode="forward" horiz-adv-x="768"
-d="M494 616v-124c-530 0 -493 -494 -493 -494c104 345 493 245 493 245v-127l274 254z" />
- <glyph glyph-name="friend" unicode="friend" horiz-adv-x="818"
-d="M552 163c41 -23 64 -61 60 -100c-2 -24 -1 -24 -32 -28c-19 -2 -140 -3 -263 -3c-140 0 -286 1 -297 4c-41 11 -17 87 37 123c43 27 130 69 154 74c33 7 37 28 0 91c-8 15 -17 58 -18 104c-1 74 12 124 77 149c12 4 26 6 39 6c43 0 83 -24 100 -59
-c23 -47 12 -170 -12 -215c-29 -51 -26 -67 6 -75c20 -5 86 -36 149 -71zM771 226c32 -17 50 -48 47 -78c-1 -18 -1 -19 -25 -22c-12 -2 -75 -3 -149 -3c-13 31 -38 59 -72 77c-39 22 -85 45 -120 60c23 11 43 20 52 22c25 6 28 20 0 70c-7 12 -15 46 -16 82
-c-1 58 12 98 62 117c10 3 21 5 31 5c33 0 64 -18 77 -46c17 -37 9 -133 -9 -169c-22 -40 -20 -52 5 -58c16 -4 67 -29 117 -57z" />
- <glyph glyph-name="frustrate" unicode="frustrate"
-d="M358 656c198 0 359 -155 359 -349s-161 -349 -359 -349s-358 155 -358 349s160 349 358 349zM120 345l8 -21c3 -7 11 -12 19 -9l175 63c7 3 9 8 10 21c2 13 0 19 -7 23l-160 92c-7 4 -17 2 -21 -5l-11 -20c-4 -7 -2 -16 5 -20l108 -62l-117 -42c-7 -3 -11 -12 -9 -20z
-M589 324l8 21c2 8 -2 17 -9 20l-117 42l108 62c7 4 9 13 5 20l-12 20c-4 7 -13 9 -20 5l-160 -92c-7 -4 -9 -10 -7 -23c1 -13 3 -18 10 -21l174 -63c8 -3 17 2 20 9zM530 99c20 7 31 32 24 52c-32 81 -109 133 -196 133s-163 -52 -195 -133c-7 -20 3 -45 23 -52
-c20 -8 325 -8 344 0z" />
- <glyph glyph-name="full" unicode="full" horiz-adv-x="665"
-d="M338 382l70 -69c4 -4 8 -6 14 -6c5 0 9 2 13 6l119 118l72 -72c23 -22 40 -13 40 18v226c0 19 -16 37 -38 37h-226c-32 0 -40 -17 -17 -40l72 -72l-119 -118c-3 -4 -5 -9 -5 -14c0 -6 2 -10 5 -14zM0 238v-227c0 -19 16 -37 38 -37h225c32 0 41 17 18 40l-72 72l119 119
-c3 4 5 8 5 14c0 5 -2 9 -5 13l-70 70c-4 3 -8 5 -14 5c-5 0 -10 -2 -14 -5l-118 -119l-72 72c-23 22 -40 14 -40 -17z" />
- <glyph glyph-name="game" unicode="game"
-d="M143 558v72h72v-72h-72zM502 630h71v-72h-71v72zM645 415v143h72v-287h-72v-71h-72v-72h72v-72h72v-71h-144v71h-71v72h-287v-72h-72v-71h-143v71h72v72h71v72h-71v71h-72v287h72v-143h71v71h72v72h72v-72h143v72h72v-72h71v-71h72zM287 343v72h-72v-72h72zM502 343v72
-h-72v-72h72z" />
- <glyph glyph-name="gear" unicode="gear"
-d="M649 523l-68 -69c18 -28 31 -60 37 -94h99v-106h-99c-6 -34 -19 -65 -37 -93l68 -70l-75 -75l-69 69c-28 -18 -59 -32 -93 -38v-98h-107v98c-34 6 -65 20 -93 38l-70 -69l-74 75l68 70c-18 28 -32 59 -38 93h-98v106h98c6 34 20 66 38 94l-68 69l74 75l70 -69
-c28 18 59 32 93 38v99h107v-99c34 -6 65 -20 93 -38l69 69zM358 159c82 0 149 66 149 148s-67 149 -149 149s-147 -67 -147 -149s65 -148 147 -148z" />
- <glyph glyph-name="geo" unicode="geo"
-d="M358 666c198 0 359 -161 359 -359s-161 -358 -359 -358s-358 160 -358 358s160 359 358 359zM383 155v-115c129 11 232 115 243 243h-114v47h114c-10 130 -114 233 -243 244v-115h-47v115c-130 -10 -235 -114 -245 -244h116v-47h-116c11 -129 115 -233 245 -244v116h47z
-" />
- <glyph glyph-name="github" unicode="github" horiz-adv-x="768"
-d="M754 164l-2 -8c-3 -8 -7 -16 -10 -24c0 -2 -2 -6 -3 -8c-32 -71 -92 -105 -185 -122c-5 -1 -14 -3 -23 -4c-90 -11 -158 -13 -248 -5c-3 0 -7 1 -9 1c-125 14 -199 59 -238 131c-1 1 -3 4 -4 8c-4 7 -7 16 -10 23c-2 4 -3 6 -4 9c-13 37 -18 80 -18 128
-c0 84 26 117 61 162c-27 96 11 162 11 162s57 12 165 -65c58 25 213 27 287 5c45 30 128 72 162 60c8 -14 27 -56 11 -149c11 -20 71 -64 71 -187c-1 -45 -6 -84 -14 -117zM99 193c0 -111 78 -160 187 -169c7 -1 14 -1 22 -2c51 -1 115 -2 178 0c14 1 28 2 41 4
-c104 15 147 75 147 159c0 61 -28 141 -140 141c-8 0 -74 -8 -137 -8c-71 0 -144 8 -155 8c-115 0 -143 -91 -143 -133zM231 244c22 0 39 -26 39 -58s-17 -58 -39 -58s-38 26 -38 58s16 58 38 58zM554 128c-23 0 -40 26 -40 58s17 58 40 58c22 0 39 -26 39 -58
-s-17 -58 -39 -58zM388 100c-10 0 -18 9 -18 19c0 9 8 17 18 17s19 -8 19 -17c0 -10 -9 -19 -19 -19zM389 40c-29 0 -52 25 -52 40c0 6 4 11 10 11s10 -5 10 -11c1 -3 14 -20 32 -20c14 0 27 12 27 20c0 6 5 11 10 11c6 0 11 -5 11 -11c0 -18 -20 -40 -48 -40z" />
- <glyph glyph-name="globe" unicode="globe"
-d="M610 560c66 -66 107 -156 107 -253c0 -98 -41 -186 -107 -252s-155 -106 -252 -106c-98 0 -186 40 -252 106s-106 154 -106 252c0 97 40 187 106 253s154 106 252 106c97 0 186 -40 252 -106zM399 105h2c3 0 6 -1 8 -4c2 -2 4 -4 8 -4c1 0 2 1 2 3c0 4 1 8 1 9
-c1 3 3 3 5 3c1 0 1 0 1 2l-2 2c-1 0 -2 -1 -2 -2c-1 -1 -2 -2 -3 0l-6 -4l-7 2l-12 18l4 26c0 1 -1 3 -4 4s-3 3 -2 4c-4 2 -9 4 -15 4c-1 0 -4 -1 -9 -2c-5 0 -8 0 -8 2c0 3 3 9 5 16c1 3 2 8 3 10c0 2 1 4 1 4l5 12l-1 2l-7 1c-2 0 -9 -4 -14 -8c-5 -6 -9 -11 -9 -15
-l-20 -4c-4 0 -8 1 -11 5c-1 5 -4 11 -8 17c-4 5 -5 10 -5 15c0 6 1 14 3 19c2 6 2 13 -2 19c1 0 4 2 2 4l5 6l1 1l1 -1c4 3 11 4 17 3c7 -1 11 2 13 7l7 -7c2 -1 6 6 6 8l-3 2l18 4l1 -2h8l10 -6c1 0 2 1 3 2c2 2 3 2 4 1l9 -10c-1 -2 -1 -4 -1 -6c1 -1 2 -2 2 -3
-c0 -4 9 -22 14 -22c3 0 4 2 3 6v8c0 5 -1 11 -3 17c-3 5 -5 12 -7 18v2c0 3 2 6 6 8c3 2 5 4 5 4c3 2 6 5 10 7c3 2 6 7 8 10l3 7v4h3s2 1 2 3c0 0 -1 1 -2 1c-1 1 -4 3 -6 5l2 2c3 3 4 10 2 13l8 4c-2 -4 4 -5 6 -4l4 9c-2 5 -3 0 0 6c3 1 6 2 9 4c3 1 5 2 8 2
-c1 0 2 -1 2 -1c2 0 3 1 3 1c0 3 -1 5 -2 5l5 11c4 0 8 2 10 6l8 1c2 0 3 1 3 3v2l15 4l2 5l-4 6s1 1 1 2s-1 2 -2 3c-1 0 -2 1 -3 1c-1 1 -2 2 -3 2h2h6s4 1 4 4c0 4 -2 5 -6 5c-11 0 -28 -4 -34 -16l-6 -3l8 8l1 2c0 1 -1 2 -3 3h-3c10 0 16 3 20 6c3 3 6 6 13 8
-c7 -1 14 -1 21 -1c6 1 12 1 19 1c3 2 7 6 9 10l10 1c2 -2 9 3 9 6s-1 4 -4 5s-6 3 -6 6v3c1 1 0 2 -1 2c-4 0 -14 -5 -17 -7c-2 -2 -3 1 -3 3l1 -1l4 2l10 4l1 1c0 4 -6 5 -8 5c-1 0 -3 -1 -5 -2c-2 0 -4 0 -4 2l1 2c-7 5 -13 15 -13 18v4c1 1 0 1 -2 1h-3c-1 -1 -2 0 -2 2
-s-4 13 -9 13l-3 -3c0 -2 -1 -3 -3 -4s-3 -2 -3 -3h-1l-10 -6c0 2 -1 2 -2 1c-1 0 -1 -1 -3 -1h-2c5 0 4 7 0 7l-8 -1c-2 0 -2 0 0 2c1 2 3 4 1 6c0 2 -1 2 -2 1l2 3c2 1 -1 5 -3 7l-9 1l-6 6c-1 -1 -2 0 -4 1c-1 1 -3 3 -4 3l-7 -3l-18 4c-2 0 -5 -1 -5 -4c0 -1 0 -2 1 -2
-c2 -1 2 -2 2 -3s1 -5 2 -10c0 -5 0 -7 -3 -6l-4 -6c0 -2 2 -3 3 -3c3 -2 6 -5 8 -8c2 -2 2 -5 1 -8l-19 -15v-1c0 -3 0 -5 1 -7c2 -2 2 -5 4 -8c5 -2 5 -4 1 -6c-2 0 -4 -1 -6 -2l-2 -2c0 -1 -1 -1 -2 -1h-3h-2s0 1 1 1c0 0 1 1 1 2l-9 5l-4 7c1 3 1 5 0 6s-1 3 -1 5
-c0 4 -2 7 -6 7c-5 0 -9 -1 -14 -2c2 1 -2 6 -3 6c-5 0 -11 2 -18 6s-12 6 -16 6c-3 0 -9 -1 -13 -3c2 1 2 2 3 5l-6 10l-1 1c-2 0 -4 -1 -6 -3c-2 -1 -5 0 -5 4c0 1 1 2 1 2c1 1 1 1 0 2c0 3 1 6 4 9c2 2 3 6 4 9c2 1 2 2 2 3c0 2 1 2 2 2c2 0 5 1 7 2c2 2 4 3 7 3l1 3
-c0 1 -3 2 -9 3c-7 1 -10 1 -10 3l1 1c6 -2 11 -3 14 -3c6 -1 9 1 15 4c2 1 8 3 13 6c0 1 -1 1 -4 2h4l7 4v4l-2 2l10 2c-1 2 1 3 2 3c2 0 4 -1 6 -3s3 -2 4 -2l9 3c0 1 1 1 3 1c2 1 3 2 2 3l-7 7c-2 0 -3 3 -1 3c3 0 5 1 3 4c-2 1 -5 3 -8 4c-3 2 -6 3 -9 3
-c-2 0 -6 -1 -6 -4c0 -2 1 -2 2 -2c2 0 3 -1 3 -2c2 -1 1 -2 -1 -2h-2c-2 0 -5 -2 -7 -6c-2 -3 -5 -6 -8 -7c-1 0 -1 0 -1 1c1 1 0 1 0 2c-1 1 -2 2 -3 2c-2 1 -4 1 -4 2c0 2 2 3 4 6c1 3 -2 4 -7 4c-2 0 -4 -1 -5 -3c-1 -1 -2 -3 -3 -5l-10 11l-8 1c0 2 1 4 2 6
-c2 4 -6 9 -9 12c-1 0 -3 1 -5 1c-1 0 -7 -5 -11 -7c-2 -1 -3 -2 -3 -3c0 -2 2 -2 5 -2h-1c-2 0 -3 -1 -3 -4c0 -1 8 -3 10 -3s4 0 4 -1c1 -1 1 -1 3 -1l3 1v-2s-1 -2 -1 -2l1 -3l-10 -5l-1 -1c-1 0 -2 0 -2 -1s0 -3 2 -5c1 -2 0 -3 -5 -3l-3 2c0 2 -2 4 -7 6
-c-9 3 -25 4 -39 4c-7 1 -12 1 -16 1l-15 -5l4 -8c-1 0 -3 -1 -3 -1c-4 3 -10 9 -12 9l-7 1c-22 -1 -48 -22 -73 -47s-47 -53 -58 -70h2c2 0 3 1 6 2c2 1 3 -1 3 -4c0 -2 0 -3 -1 -5s1 -3 5 -3c1 0 2 1 2 3c1 2 1 2 1 0l2 -7v-1c0 -1 -1 -2 -2 -3c-3 -1 0 -4 3 -4h5l2 1l1 1
-c0 -4 4 -5 7 -5h1s-1 -2 -2 -3c-2 0 -2 -1 0 -2l10 -2v-1l6 -13c0 -2 -2 -7 -4 -7s-2 1 -2 2c1 0 1 1 1 3c0 1 -1 2 -1 3c-1 1 -3 1 -7 1c-1 0 -4 0 -2 -3l5 -11l2 -2c-6 0 -7 -20 -7 -26l1 -8l1 -3v-1l-1 -9l12 -20h3c0 -1 0 -2 -1 -3s-1 -2 -1 -4l4 -3c0 -6 2 -7 7 -12
-c0 -3 4 -7 10 -11c7 -3 11 -5 13 -6c4 -14 11 -29 21 -38l1 -6l-2 -2c-2 0 -2 -1 -1 -2l8 -4c2 2 3 0 5 -3c2 -4 3 -6 4 -7v-3l5 -7l2 -2l2 5c-2 5 -9 16 -15 25c-3 5 -6 10 -9 14c-2 3 -3 5 -3 6s-1 12 -2 14c1 -1 4 -2 6 -3c3 -1 6 -2 8 -3c1 -8 4 -14 9 -19
-c4 -4 8 -9 11 -15c-2 -2 2 -2 4 -2c1 -2 1 -3 1 -7c9 -9 27 -30 27 -39v-1l-2 -6c4 -9 13 -16 22 -19h2c5 -3 12 -6 19 -9c6 -4 12 -7 18 -9l10 6c5 -1 11 -6 18 -12s16 -13 28 -15c4 3 6 2 6 -2v-2l11 -13l2 -6c6 -4 13 -10 16 -17zM270 608l-1 2c-2 1 -7 3 -9 3
-c-1 0 -3 -1 -7 -2c-7 -4 -18 -7 -26 -11c-4 -2 -7 -3 -9 -3c4 0 8 1 12 3c3 2 7 3 11 3l3 -2c2 -1 3 -1 5 -1c1 0 2 0 4 -2c2 1 4 1 7 -1l3 2v4l-1 2l2 -1c2 0 4 1 6 4zM421 22l1 -6c0 -2 -1 -2 -2 -4c-3 -2 -8 -5 -8 -11c0 -1 1 -2 1 -4c1 -1 2 -2 2 -4c0 -1 -1 -2 -1 -3
-c69 12 131 45 179 96h-1c-2 -1 -5 -1 -6 0l-3 -1l-5 1h-3c-2 3 -4 5 -7 7l-1 1c-1 0 -2 0 -2 -2c0 9 -7 17 -15 17c0 -1 -1 -1 -1 -1h-2l-2 1h3l2 6l-5 3l-1 -1c-4 1 -7 3 -9 7l-3 1v-1l-2 -1c-4 -1 -7 -2 -9 -3c-4 1 -7 3 -8 4l-12 -1c0 4 -2 9 -7 9c-6 0 -14 0 -16 -7
-c0 -2 1 -5 2 -6v-4l-1 -2l-1 -1h-1l-3 7l3 4c-1 2 -1 3 -1 5s-1 3 -1 5l-1 1h-3l-6 -4h-4l-1 -2c-1 0 -1 -1 -1 -2c0 0 -1 0 -1 -1l-1 1h-4c-2 -2 -3 -5 -4 -8l2 -2l-5 -2l-1 -2l-3 -2v-1h-1v-5h-1c-1 4 -4 8 -10 11h-3v-2c0 -2 2 -3 4 -4c2 -2 3 -4 4 -5c-1 1 -3 0 -3 -1
-v-2l6 -9v-17l2 -4c-2 -5 -4 -10 -7 -13v1l-2 -1l-1 -1l-1 -4l1 -1v-1l-2 2l-1 -6l-5 -2c-2 -1 -3 -2 -2 -5c0 -2 -1 -3 -3 -4l1 -2l-2 -3c0 -1 0 -2 -1 -2v-4l1 -7l2 -1l2 1z" />
- <glyph glyph-name="good" unicode="good" horiz-adv-x="665"
-d="M505 82v-37h109v-70h-371s-59 45 -59 45v319s82 61 118 136c36 76 34 164 34 164h94s4 -72 0 -129c-5 -58 -24 -129 -24 -129h260v-82h-161v-37h161v-73h-161v-36h130v-71h-130zM0 25h142v308h-142v-308z" />
- <glyph glyph-name="google" unicode="google" horiz-adv-x="655"
-d="M82 635h491c45 0 82 -37 82 -82v-82h-102v102h-51v-102h-103v-51h103v-103h51v103h102v-359c0 -45 -37 -81 -82 -81h-196c1 6 1 12 1 18c0 68 -14 102 -86 155c-20 15 -66 46 -66 68c0 25 7 37 45 67s66 70 66 119c0 53 -23 100 -64 124h59l50 53h-222
-c-63 0 -122 -27 -160 -67v36c0 45 37 82 82 82zM248 402c10 -78 -25 -129 -84 -127c-60 2 -117 57 -127 136s30 138 89 137c60 -2 112 -67 122 -146zM0 111v177c29 -29 70 -46 121 -46c7 0 14 0 21 1c-7 -13 -12 -29 -12 -44c0 -26 15 -41 33 -58h-41
-c-46 0 -88 -12 -122 -30zM309 -20h-227c-39 0 -72 26 -80 63c27 42 84 73 150 72c20 0 40 -5 57 -10c48 -34 88 -54 97 -93c2 -7 3 -15 3 -23v-9z" />
- <glyph glyph-name="graph" unicode="graph"
-d="M0 6h717v56h-661v546h-56v-602zM98 116h616v442l-130 -119l-121 44l-128 -146l-131 47l-106 -110v-158z" />
- <glyph glyph-name="group" unicode="group" horiz-adv-x="818"
-d="M669 155c42 -23 66 -64 63 -105c-2 -25 -3 -26 -35 -30c-20 -3 -146 -4 -276 -4c-147 0 -301 3 -312 6c-44 11 -20 91 38 129c45 29 137 73 162 78c34 7 38 28 0 96c-9 15 -19 61 -20 109c-1 78 14 131 82 157c14 5 28 7 41 7c45 0 87 -25 104 -62
-c25 -49 15 -180 -11 -227c-30 -53 -27 -70 6 -79c22 -6 90 -38 158 -75zM125 185c-16 -11 -31 -25 -43 -39c-38 0 -67 1 -70 2c-25 6 -11 52 22 72c25 16 76 41 90 44c18 4 22 15 0 53c-5 8 -11 34 -11 61c-1 44 8 74 46 87c32 12 68 -3 81 -30c13 -28 6 -100 -8 -126
-c-16 -31 -13 -39 5 -44c4 -1 12 -5 23 -10c-44 -18 -104 -51 -135 -70zM783 223c24 -13 37 -35 35 -58c-1 -14 -1 -15 -19 -17c-5 -1 -28 -2 -58 -2c-13 17 -31 33 -53 44c-41 24 -91 50 -128 66c10 4 19 7 23 8c19 4 22 15 0 53c-4 8 -11 34 -11 61c-1 44 7 74 45 87
-c33 12 69 -3 81 -30c13 -28 8 -100 -6 -126c-16 -31 -14 -39 3 -44c12 -4 50 -22 88 -42z" />
- <glyph glyph-name="hatena" unicode="hatena" horiz-adv-x="819"
-d="M397 608c-17 -6 -91 -33 -94 -34c-2 1 -76 28 -93 34c17 6 91 32 93 33c3 -1 77 -27 94 -33zM609 608c-17 -6 -91 -33 -93 -34c-3 1 -77 28 -94 34c17 6 91 32 94 33c2 -1 76 -27 93 -33zM295 527c-17 -6 -92 -31 -94 -32c-2 1 -76 26 -93 32c17 6 91 32 93 33
-c2 -1 77 -27 94 -33zM410 495c-2 1 -77 26 -94 32c17 6 92 32 94 33c3 -1 77 -27 94 -33c-17 -6 -91 -31 -94 -32zM618 495c-2 1 -77 26 -94 32c17 6 92 32 94 33c2 -1 77 -27 94 -33c-17 -6 -92 -31 -94 -32zM410 553l-48 -16s-14 -6 -26 -10c13 -5 71 -24 74 -26
-c4 2 60 21 74 26c-15 5 -70 25 -74 26zM93 479c3 0 77 -27 94 -33c-17 -6 -91 -31 -94 -32c-2 1 -76 26 -93 32c17 6 91 33 93 33zM304 479c3 0 77 -27 94 -33c-17 -6 -91 -31 -94 -32c-2 1 -76 26 -93 32c17 6 91 33 93 33zM517 479c2 0 77 -27 94 -33
-c-17 -6 -92 -31 -94 -32c-2 1 -76 26 -93 32c17 6 91 33 93 33zM726 479c2 0 76 -27 93 -33c-17 -6 -91 -31 -93 -32c-3 1 -77 26 -94 32c17 6 91 33 94 33zM19 446c0 0 70 -24 74 -25c4 1 52 17 75 25c-23 8 -71 25 -75 27c-4 -2 -73 -27 -73 -27h-1zM230 446
-c23 -8 71 -24 74 -25c4 1 52 17 75 25c-23 8 -71 25 -75 27c-3 -2 -51 -19 -74 -27zM651 446c23 -8 71 -24 75 -25c4 1 72 24 74 25c-2 1 -70 25 -74 27c-4 -2 -52 -19 -75 -27zM103 364c17 6 92 31 95 32c2 -1 76 -26 93 -32c-17 -6 -91 -32 -93 -33c-3 1 -78 27 -95 33z
-M501 364c-17 -6 -92 -32 -94 -33c-2 1 -77 27 -94 33c17 6 92 31 94 32c2 -1 77 -26 94 -32zM528 364c17 6 92 31 94 32c3 -1 77 -26 94 -32c-17 -6 -91 -32 -94 -33c-2 1 -77 27 -94 33zM198 338c3 1 50 18 73 26c-23 8 -70 24 -73 25c-4 -1 -51 -17 -74 -25
-c23 -8 70 -25 74 -26zM407 389c-3 -1 -51 -17 -74 -25c23 -8 71 -25 74 -26c3 1 50 18 73 26c-23 8 -70 24 -73 25zM622 338c3 1 50 18 73 26c-23 8 -70 24 -73 25c-3 -1 -51 -17 -74 -25c23 -8 71 -25 74 -26zM316 257c17 6 92 33 94 33s76 -27 93 -33
-c-17 -6 -91 -32 -93 -33c-2 1 -77 27 -94 33zM367 147h-32v-47h-18v-26h18v-101h32v101h18v26h-18v47zM41 145h-34v-172h34v76h71v-76h32v172h-32v-64h-71v64zM579 101h-31v-128h31v51c0 12 1 21 1 24c2 8 5 14 10 19c4 4 9 6 15 6c5 0 9 -2 12 -4s6 -7 8 -12
-c1 -5 2 -14 2 -29v-55h30v82c0 14 -3 26 -10 33c-9 8 -20 13 -32 13c-6 0 -12 -2 -17 -4c-6 -2 -12 -6 -19 -12v16zM265 88v12h32v-127h-32v14c-10 -8 -24 -14 -38 -14c-35 0 -63 29 -63 64c0 36 28 63 63 63c14 0 28 -4 38 -12zM494 12h27c-5 -13 -16 -26 -25 -30
-s-20 -9 -32 -9c-18 0 -34 7 -46 19c-12 11 -18 27 -18 45s6 33 18 45s27 18 45 18s34 -6 46 -18c12 -11 17 -28 17 -48v-5h-97c1 -9 5 -16 11 -21s15 -8 24 -8c11 0 22 4 30 12zM779 88v12h33v-127h-33v14c-10 -8 -24 -14 -38 -14c-35 0 -63 29 -63 64c0 36 28 63 63 63
-c14 0 28 -4 38 -12zM430 52h67c-2 6 -7 13 -13 17c-5 4 -12 6 -20 6s-16 -2 -23 -7c-4 -3 -7 -9 -11 -16zM227 2c19 0 35 16 35 35s-16 36 -35 36s-34 -17 -34 -36s15 -35 34 -35zM741 2c19 0 35 16 35 35s-16 36 -35 36s-34 -17 -34 -36s15 -35 34 -35z" />
- <glyph glyph-name="heart" unicode="heart" horiz-adv-x="768"
-d="M582 624c166 0 221 -192 163 -297c-89 -163 -361 -336 -361 -336s-273 173 -361 336c-58 105 -4 297 163 297c154 0 193 -133 198 -153c5 20 44 153 198 153z" />
- <glyph glyph-name="heartempty" unicode="heartempty" horiz-adv-x="768"
-d="M384 -14c5 0 11 1 15 4c11 7 259 165 344 320c36 66 32 155 -9 224c-36 61 -96 95 -168 95c-99 0 -153 -53 -182 -98c-29 45 -84 98 -182 98c-73 0 -132 -34 -169 -95c-41 -69 -44 -158 -8 -224c84 -155 333 -313 343 -320c5 -3 10 -4 16 -4zM202 569
-c118 0 148 -98 152 -117c4 -13 16 -24 30 -24c13 0 26 11 29 24c5 19 35 117 153 117c65 0 100 -35 117 -66c30 -49 33 -118 8 -164c-67 -120 -252 -250 -307 -288c-56 38 -241 168 -307 288c-25 46 -22 115 8 164c17 31 52 66 117 66z" />
- <glyph glyph-name="help" unicode="help"
-d="M358 666c198 0 359 -161 359 -359s-161 -358 -359 -358s-358 160 -358 358s160 359 358 359zM331 196h24c3 61 17 81 74 115c35 22 46 29 59 43c18 19 27 43 27 71c0 71 -57 114 -150 114c-32 0 -57 -6 -82 -15c-50 -19 -81 -59 -81 -103c0 -22 15 -33 46 -33
-c26 0 40 11 39 29v24c0 15 6 41 14 54c10 16 31 27 55 27c45 0 74 -36 74 -89c0 -20 -3 -39 -11 -57c-7 -14 -15 -25 -39 -51c-38 -40 -49 -69 -49 -114v-15zM344 51c29 0 52 23 52 52s-22 52 -52 52c-29 0 -51 -23 -51 -52s22 -52 51 -52z" />
- <glyph glyph-name="horizontal" unicode="hori&#x7a;ontal" horiz-adv-x="687"
-d="M330 537h-287v-179c-15 -4 -31 -11 -43 -21v261c0 37 31 68 68 68h237c37 0 68 -31 68 -68v-238h-43v177zM471 453h69c-3 28 -15 54 -35 74c-27 27 -62 38 -96 35v51c47 3 96 -13 132 -50c31 -31 47 -69 50 -110h67l-92 -100zM68 322h552c37 0 67 -31 67 -68v-238
-c0 -37 -30 -67 -67 -67h-552c-37 0 -68 30 -68 67v238c0 37 31 68 68 68zM134 -7h424v286h-424v-286zM78 98c20 0 38 17 38 37s-18 37 -38 37s-37 -17 -37 -37s17 -37 37 -37z" />
- <glyph glyph-name="home" unicode="home" horiz-adv-x="747"
-d="M623 416l116 -106c14 -13 10 -23 -9 -23h-87v-277c0 -19 -16 -36 -35 -36h-151v194c0 19 -17 36 -36 36h-95c-19 0 -36 -17 -36 -36v-194h-151c-19 0 -36 17 -36 36v277h-86c-19 0 -23 10 -9 23l339 308c14 13 38 13 53 0l77 -69v55c0 19 17 36 36 36h75
-c19 0 35 -17 35 -36v-188z" />
- <glyph glyph-name="hot" unicode="hot" horiz-adv-x="819"
-d="M630 303c0 125 -65 190 -190 190c125 0 190 64 190 189c0 -125 64 -189 189 -189c-125 0 -189 -65 -189 -190zM345 624c0 -227 119 -346 346 -346c-227 0 -346 -119 -346 -346c0 227 -118 346 -345 346c227 0 345 119 345 346zM595 146c0 -59 31 -91 90 -91h1
-c-60 0 -91 -31 -91 -90c0 59 -31 90 -90 90c59 0 90 32 90 91z" />
- <glyph glyph-name="image" unicode="image"
-d="M0 14v586h717v-586h-717zM644 208v319h-571v-271l156 93l204 -111l83 49zM510 356c-32 0 -57 26 -57 58s25 58 57 58s57 -26 57 -58s-25 -58 -57 -58z" />
- <glyph glyph-name="info" unicode="info"
-d="M358 666c198 0 359 -161 359 -359s-161 -358 -359 -358s-358 160 -358 358s160 359 358 359zM354 534c-10 -12 -15 -26 -15 -41c0 -12 4 -22 10 -29c7 -7 17 -11 27 -11c14 0 27 6 37 18c9 11 14 27 14 44c0 10 -3 19 -10 26s-17 11 -27 11c-13 0 -26 -6 -36 -18z
-M263 327l12 -13c9 10 18 18 24 23c6 4 11 6 15 6c3 0 6 -1 8 -3c1 -3 2 -6 2 -11c0 -25 -3 -41 -16 -101s-20 -104 -20 -133c0 -11 2 -19 6 -24c3 -5 9 -9 17 -9c13 0 32 10 54 27c22 18 44 43 68 75l-13 11c-8 -10 -16 -17 -22 -22c-6 -4 -11 -8 -15 -8c-3 0 -6 3 -8 5
-c-1 3 -2 7 -2 13c0 4 1 17 5 40c3 23 2 23 8 57c1 10 4 24 7 41c8 51 13 82 13 92c0 9 -3 17 -6 22c-4 5 -10 7 -17 7c-12 0 -28 -9 -50 -25c-22 -17 -44 -40 -70 -70z" />
- <glyph glyph-name="instapaper" unicode="instapaper" horiz-adv-x="665"
-d="M129 640h408c72 0 129 -57 129 -129v-307c-3 -30 -18 -58 -34 -67c-18 -10 -54 3 -81 -13c-28 -16 -31 -52 -49 -66c-22 -16 -40 -21 -72 -24h-316c-62 0 -114 50 -114 112v365c0 72 57 129 129 129zM385 500h29v38h-160v-38h27c10 0 19 -9 19 -20v-285
-c0 -11 -9 -20 -19 -20h-27v-38h160v38h-29c-10 0 -19 9 -19 20v285c0 11 9 20 19 20zM552 34h-121c114 0 235 72 235 170v-58c0 -62 -52 -112 -114 -112zM114 19h438c62 0 114 52 114 114v-13c0 -62 -52 -114 -114 -114h-438c-62 0 -114 52 -114 114v13
-c0 -62 52 -114 114 -114zM114 -7h438c62 0 114 51 114 113v-3c0 -72 -57 -129 -129 -129h-408c-72 0 -129 57 -129 129v3c0 -62 52 -113 114 -113z" />
- <glyph glyph-name="internetexplorer" unicode="internetexplorer" horiz-adv-x="737"
-d="M537 184h183c-44 -132 -170 -227 -317 -227c-144 0 -267 92 -314 220c-41 -85 -50 -154 -18 -185c38 -39 96 -35 166 -1c-89 -51 -165 -65 -212 -18c-55 55 -18 253 119 426c0 0 0 1 1 1c5 7 12 15 18 22c0 0 1 0 1 1c2 3 5 6 8 9c1 1 2 2 2 3c3 2 5 5 7 7l3 3
-c2 2 4 6 6 8c1 1 3 2 4 3l10 10l15 15c1 1 2 1 3 2c5 5 11 10 15 15c2 1 3 2 4 3l15 12c1 2 2 3 3 4l12 9c2 2 4 3 5 4c4 4 10 8 14 11c2 2 4 3 6 5l12 9c3 2 6 4 8 5c2 2 5 3 7 5l15 9l4 4c10 6 21 12 31 18c-85 -36 -183 -111 -268 -213c-11 -13 -22 -27 -31 -40
-c25 160 162 283 329 283c8 0 16 0 24 -1c119 55 225 63 268 19c37 -36 38 -89 13 -152c14 48 9 88 -20 117c-32 32 -91 27 -165 -6c125 -48 214 -170 214 -311c0 -14 -1 -28 -2 -41h-474c3 -26 12 -48 22 -67c27 -49 71 -76 120 -76c54 0 107 17 134 76zM263 344h287
-c-16 93 -80 131 -147 131c-66 0 -123 -48 -140 -131z" />
- <glyph glyph-name="iphone" unicode="iphone" horiz-adv-x="416"
-d="M76 691h265c42 0 76 -34 76 -76v-616c0 -42 -34 -76 -76 -76h-265c-42 0 -76 34 -76 76v616c0 42 34 76 76 76zM49 74h319v473h-319v-473zM208 -31c24 0 42 18 42 41c0 24 -18 42 -42 42c-23 0 -41 -18 -41 -42c0 -23 18 -41 41 -41z" />
- <glyph glyph-name="italic" unicode="italic" horiz-adv-x="456"
-d="M8 11l-8 -36c3 0 8 0 16 1c6 0 16 1 27 2c35 4 62 6 79 5h87c19 -2 35 -4 46 -6c10 -1 17 -1 19 -1c3 -2 6 -2 8 -2h5h6c3 0 7 0 12 1h5c1 1 3 1 5 1c2 3 3 7 3 10s2 5 3 7c0 4 1 7 1 12c0 3 1 8 1 13c-8 1 -15 3 -20 4s-8 1 -9 1c-17 2 -33 5 -53 9c-1 3 -1 5 -1 7v5
-l6 19l18 102l18 68l27 136c5 31 16 74 29 132c1 9 3 21 6 35c4 16 7 28 11 38c11 4 26 9 45 14c17 4 35 8 49 13c2 9 4 17 6 22c0 3 1 6 1 9c1 2 1 5 1 8c-3 0 -9 0 -17 -1c-8 0 -17 -1 -29 -2c-45 -3 -76 -4 -96 -4h-11c-6 0 -13 1 -22 1l-141 6l-9 -45h8c2 -1 7 -1 10 -1
-c31 -2 51 -6 64 -12v-18l-4 -20l-9 -59l-7 -28l-14 -68c0 -1 -3 -11 -8 -27c-5 -17 -11 -42 -17 -77l-5 -28l-26 -116l-12 -59c-3 -18 -10 -34 -18 -45c-12 -5 -28 -12 -52 -17c-15 -4 -28 -6 -34 -9z" />
- <glyph glyph-name="key" unicode="key"
-d="M318 171l-39 40s-111 -43 -223 68c-95 95 -53 244 9 305c66 66 207 106 310 3s59 -225 59 -225l283 -282l-8 -147l-144 -9l-8 72l-75 9l-7 75l-74 10l-11 72zM104 544c-44 -44 -56 -103 -27 -131c29 -29 87 -17 131 27s57 103 28 131c-28 29 -88 17 -132 -27zM683 24
-l2 42l-269 269l-22 -22z" />
- <glyph glyph-name="keyboard" unicode="keyboard" horiz-adv-x="768"
-d="M30 553h708c16 0 30 -14 30 -30v-432c0 -16 -14 -30 -30 -30h-708c-16 0 -30 14 -30 30v432c0 16 14 30 30 30zM51 113h666v389h-666v-389zM123 461h61v-62h-61v62zM239 461h61v-62h-61v62zM353 461h62v-62h-62v62zM469 461h60v-62h-60v62zM584 461h61v-62h-61v62z
-M181 338h62v-62h-62v62zM297 276v62h61v-62h-61zM412 276v62h61v-62h-61zM589 276h-62v62h62v-62zM529 154h-290v61h290v-61z" />
- <glyph glyph-name="kudakurage" unicode="kudakurage" horiz-adv-x="683"
-d="M613 523l5 -8c17 -33 42 -79 22 -131c-7 -18 -22 -31 -36 -42c-6 -5 -12 -10 -17 -15c13 -50 34 -90 61 -117c2 -2 6 -5 10 -8c12 -7 28 -18 24 -38c0 -2 -2 -4 -5 -4c-23 0 -43 14 -66 43c-20 29 -39 65 -54 113c-5 -2 -11 -3 -17 -5c-3 0 -7 -1 -10 -2
-c4 -24 8 -46 11 -70c6 -52 12 -101 36 -139c3 -5 7 -9 11 -14c10 -10 21 -23 13 -43c-1 -2 -2 -3 -3 -3c-2 -1 -3 0 -4 0c-60 33 -71 114 -81 193c-3 24 -6 49 -10 72c-4 0 -7 -1 -11 -1c-11 -2 -24 -4 -36 -4c3 -67 11 -132 18 -190c1 -16 3 -33 5 -48c1 -8 4 -21 8 -35v-2
-c0 -1 1 -3 1 -5c3 -7 9 -18 4 -27c-2 -3 -6 -6 -10 -8h-5c-20 0 -25 38 -27 62l-1 6c-2 17 -5 37 -7 55c-8 61 -16 124 -19 189c-13 -2 -28 -3 -41 -4c-9 0 -20 -1 -30 -1c18 -45 11 -102 5 -156c-7 -60 -13 -118 10 -159c3 -5 7 -8 12 -12c9 -7 20 -16 12 -38
-c-1 -3 -4 -4 -6 -3c-72 24 -63 113 -55 199c5 55 10 112 -5 153c-1 6 -1 10 1 13c-13 -1 -27 -2 -42 -2c-8 -36 -15 -75 -21 -118c-2 -12 -4 -25 -6 -37c-8 -56 -17 -114 -16 -179c1 -5 2 -11 3 -16c3 -13 5 -29 -10 -38c-1 -1 -2 -1 -3 -1h-1c-18 2 -17 28 -17 42v5
-c0 74 13 150 24 225c6 40 11 77 15 114c-9 1 -22 1 -32 -1c-5 0 -10 -1 -14 -1c-8 -78 -28 -152 -60 -224c-1 -4 -3 -8 -4 -12c-7 -18 -16 -40 -36 -48c-2 0 -5 0 -6 3c-11 18 2 37 11 51c4 5 7 11 9 15c30 63 48 136 56 216c-5 2 -15 2 -19 2c-3 0 -7 -1 -10 -1h-13
-c-4 -68 -28 -128 -69 -170c-13 -14 -28 -28 -43 -26c-2 0 -4 1 -5 2c-4 6 -5 13 -4 18c3 8 12 13 20 17c3 2 7 4 9 6c36 38 59 93 63 153c0 1 -4 1 -7 0h-9c-1 1 -2 1 -3 2c-6 5 -11 9 -17 14c-32 26 -62 50 -68 102c-6 55 13 95 30 133c3 5 5 11 8 16c24 53 54 94 89 119
-c44 31 101 47 166 47c37 0 76 -6 114 -17c90 -26 155 -82 205 -177zM575 355c41 24 50 77 21 130c-41 77 -93 137 -140 164c-31 17 -105 38 -161 38c-6 0 -12 -1 -17 -1c-87 -8 -150 -43 -191 -106c-11 -19 -50 -85 -55 -136c-4 -41 3 -70 22 -92c26 -28 71 -41 143 -41
-c37 0 76 4 114 7c20 2 40 4 58 5c11 1 23 2 35 2c65 3 131 6 171 30zM457 524c-2 -3 -5 -6 -8 -7c-1 -1 -4 -2 -5 -2h-2h-2s-2 1 -3 1c-5 2 -10 6 -12 11c-1 0 -1 0 -2 1c-1 4 -1 8 -1 12c0 7 2 13 5 17c2 4 5 6 9 7c1 1 2 2 3 2h3h1c1 0 2 0 3 -1c6 -2 11 -5 14 -10
-c0 -1 0 -1 1 -1c1 -4 2 -8 1 -12c0 -6 -1 -13 -5 -18zM200 500c-12 0 -22 7 -24 18c-1 7 0 15 4 20c8 9 25 9 33 0c4 -4 8 -13 6 -27c0 0 0 -1 -1 -2c-5 -6 -11 -9 -18 -9zM528 458c1 -1 1 -2 1 -3c-3 -14 -17 -30 -32 -30c-5 0 -10 1 -13 4c-2 1 -3 3 -2 5
-c-6 -5 -12 -9 -19 -12h-2c-2 0 -4 1 -5 3c0 0 0 1 -1 1c-2 1 -4 3 -3 6c2 16 16 29 31 29h7c1 -1 4 -2 4 -3c1 -1 1 -3 0 -4c0 -2 -1 -3 -2 -5c9 9 22 14 33 12c1 -1 2 -1 3 -3zM559 454c2 -1 3 -3 3 -4c0 -5 -1 -10 -4 -13c-4 -4 -10 -7 -16 -7s-13 3 -16 6c-1 1 -1 3 -1 4
-c0 9 10 17 22 17c5 0 9 -1 12 -3zM104 404v2l-1 1c-1 0 -2 1 -3 2c-1 2 -1 3 -1 4c3 13 17 26 30 26c2 0 4 0 5 -1c3 0 5 -3 4 -6c-2 -15 -12 -26 -27 -30h-1c-2 0 -5 1 -6 2zM184 435v-4c-6 -12 -14 -27 -31 -33c-1 -1 -1 -1 -2 -1c-2 0 -5 1 -6 3v2c-2 0 -3 1 -4 2
-c0 1 -1 4 0 5c4 15 16 30 32 30c2 0 5 0 7 -1c2 0 3 -1 4 -3zM218 434c2 0 3 0 4 -1c1 -2 2 -3 1 -5c-2 -19 -17 -27 -28 -32c-1 -1 -2 -1 -2 -1c-2 0 -4 1 -5 2c-5 6 -6 13 -3 19c5 11 21 18 33 18zM392 420c4 0 8 -1 12 -4c2 -1 4 -3 3 -5c-5 -31 -44 -44 -78 -44
-c-37 0 -64 15 -70 40c0 1 0 4 2 5c4 3 9 5 14 5c7 0 15 -5 20 -10c4 -3 8 -7 12 -8c15 -5 32 -4 49 2c5 2 10 6 14 9c7 5 14 10 22 10z" />
- <glyph glyph-name="laugh" unicode="laugh"
-d="M358 656c198 0 359 -155 359 -349s-161 -349 -359 -349s-358 155 -358 349s160 349 358 349zM138 366l3 -1c5 0 10 3 12 8c0 1 11 49 55 49c45 0 55 -47 56 -49c2 -5 6 -8 11 -8l32 10c3 1 5 3 6 6c2 3 2 6 1 8c-1 4 -20 85 -106 85c-91 0 -105 -81 -106 -84s-1 -6 1 -9
-c1 -3 4 -5 7 -6zM575 365l32 10c3 1 5 3 6 6c2 3 2 6 1 8c-1 4 -20 85 -105 85c-91 0 -106 -81 -107 -84s-1 -6 1 -9c1 -3 4 -5 7 -6l28 -9l3 -1c5 0 10 3 12 8c0 1 11 49 56 49c44 0 55 -47 55 -49c2 -5 6 -8 11 -8zM554 208c7 20 -4 43 -24 51s-325 8 -344 0
-c-20 -8 -30 -31 -23 -51c32 -81 108 -134 195 -134s164 53 196 134z" />
- <glyph glyph-name="left" unicode="left" horiz-adv-x="475"
-d="M227 309l246 -246l-119 -114l-354 354l362 363l113 -112z" />
- <glyph glyph-name="wink" unicode="wink"
-d="M358 656c198 0 359 -155 359 -349s-161 -349 -359 -349s-358 155 -358 349s160 349 358 349zM587 324l8 21c3 8 -1 17 -9 20l-117 42l108 62c7 4 9 13 5 20l-12 20c-4 7 -13 9 -19 5l-161 -92c-7 -4 -8 -10 -7 -23s3 -18 10 -21l175 -63c7 -3 16 2 19 9zM258 485h-41
-c-11 0 -19 -9 -19 -20v-100c0 -11 8 -21 19 -21h41c10 0 20 10 20 21v100c0 11 -10 20 -20 20zM228 243l-39 -13c-4 -1 -7 -4 -8 -7c-2 -3 -2 -7 -1 -11s36 -105 178 -104c142 -1 178 100 179 104s1 8 -1 11c-1 3 -5 6 -9 7l-34 12l-5 1c-6 0 -11 -5 -13 -10
-c0 -1 -22 -61 -117 -61c-94 0 -115 58 -116 61c-2 5 -8 10 -14 10z" />
- <glyph glyph-name="link" unicode="link"
-d="M333 390l80 81c7 7 15 16 23 26c8 9 17 17 26 24c17 15 37 28 62 28c22 0 41 -10 55 -23s22 -32 22 -54c0 -9 -1 -19 -4 -26c-7 -14 -13 -24 -19 -32c-3 -4 -6 -8 -6 -12c0 -3 0 -6 2 -7c11 -27 19 -50 24 -78c3 -11 9 -16 19 -16c4 0 8 1 12 4c8 5 15 13 22 21
-c4 4 7 8 9 10c36 35 57 85 57 136c0 54 -22 102 -57 137c-35 34 -84 57 -136 57s-102 -21 -137 -58l-137 -136c-36 -37 -56 -85 -56 -136c0 -15 6 -46 16 -75c10 -28 23 -53 40 -53c9 0 28 15 44 32s32 36 32 43c0 5 -4 11 -8 20c-5 9 -7 20 -7 33c0 20 8 40 22 54zM330 6
-l137 136c36 35 56 86 56 137c0 15 -6 45 -16 74c-9 28 -23 54 -40 54c-7 0 -28 -16 -43 -33c-17 -17 -33 -35 -33 -42c0 -5 3 -13 8 -21c5 -9 9 -19 9 -32c-1 -20 -9 -40 -23 -56l-81 -80c-7 -8 -15 -16 -23 -25l-25 -25c-17 -16 -38 -27 -63 -27c-42 0 -76 33 -76 76
-c0 10 2 19 5 26c6 14 12 24 19 32c3 4 4 8 4 11c0 2 -1 4 -2 8c-12 27 -19 50 -24 78c-2 5 -3 9 -6 11c-3 4 -8 5 -13 5c-4 0 -7 -1 -11 -4c-8 -5 -16 -13 -23 -21c-3 -4 -7 -7 -9 -9c-36 -36 -57 -86 -57 -137c0 -53 21 -102 57 -137c35 -35 83 -56 136 -56
-c52 0 102 20 137 57z" />
- <glyph glyph-name="linkedin" unicode="linkedin" horiz-adv-x="665"
-d="M0 556v-498c0 -47 37 -84 84 -84h498c23 0 45 11 59 25c15 15 25 34 25 59v498c0 47 -37 84 -84 84h-498c-25 0 -44 -10 -59 -25c-14 -14 -25 -36 -25 -59zM90 490c0 32 26 60 58 60c33 0 60 -28 60 -60c0 -33 -27 -59 -60 -59c-32 0 -58 26 -58 59zM251 79v305
-c0 7 7 13 12 13h85c12 0 12 -14 12 -23c24 24 55 30 87 30c78 0 128 -37 128 -119v-206c0 -7 -6 -13 -12 -13h-88c-7 0 -12 7 -12 13v186c0 31 -9 48 -44 48c-44 0 -55 -29 -55 -68v-166c0 -7 -7 -13 -14 -13h-87c-5 0 -12 7 -12 13zM92 79v305c0 7 7 13 12 13h87
-c8 0 13 -5 13 -13v-305c0 -7 -6 -13 -13 -13h-87c-6 0 -12 7 -12 13z" />
- <glyph glyph-name="list" unicode="list" horiz-adv-x="768"
-d="M129 536c0 36 -28 64 -64 64s-65 -28 -65 -64s29 -65 65 -65s64 29 64 65zM204 483h564v104h-564v-104zM129 307c0 36 -28 65 -64 65s-65 -29 -65 -65s29 -64 65 -64s64 28 64 64zM204 255h564v104h-564v-104zM129 79c0 36 -28 64 -64 64s-65 -28 -65 -64s29 -65 65 -65
-s64 29 64 65zM204 28h564v103h-564v-103z" />
- <glyph glyph-name="location" unicode="location" horiz-adv-x="665"
-d="M333 -44l333 702l-666 -356h333v-346z" />
- <glyph glyph-name="lock" unicode="lock" horiz-adv-x="550"
-d="M468 334h67c9 0 16 -8 16 -17v-352c0 -9 -7 -16 -16 -16h-519c-9 0 -16 7 -16 16v352c0 9 7 17 16 17h65v164c0 92 59 168 150 168h86c92 0 151 -76 151 -168v-164zM166 334h218v1v155c0 51 -42 94 -94 94h-31c-51 0 -93 -43 -93 -94v-155v-1zM229 51h93l-23 101
-c16 8 27 25 27 44c0 29 -23 51 -51 51s-50 -22 -50 -51c0 -19 11 -36 27 -44z" />
- <glyph glyph-name="login" unicode="login"
-d="M391 -18h195c37 0 68 13 92 38c24 24 39 56 39 92v391c0 36 -15 68 -39 92s-56 38 -92 38h-195v-82h195c28 0 49 -21 49 -48v-391c0 -27 -21 -49 -49 -49h-195v-81zM0 385v-156c0 -18 15 -33 33 -33h182v-123c0 -11 5 -20 15 -25c4 -1 9 -1 11 -1c7 0 13 2 18 7l235 235
-c9 9 8 27 0 37l-235 234c-8 8 -18 9 -29 6c-10 -5 -15 -13 -15 -24v-124h-182c-18 0 -33 -15 -33 -33z" />
- <glyph glyph-name="logout" unicode="logout"
-d="M0 503v-391c0 -36 15 -68 39 -93c24 -24 55 -37 91 -37h196v81h-196c-27 0 -48 22 -48 49v391c0 27 21 48 48 48h196v82h-196c-36 0 -67 -14 -91 -38c-24 -25 -39 -56 -39 -92zM215 385v-156c0 -18 16 -33 34 -33h181v-123c0 -11 6 -20 16 -25c4 -1 8 -1 10 -1
-c7 0 13 2 18 7l235 235c11 9 10 27 0 37l-235 234c-14 15 -44 6 -44 -18v-124h-181c-18 0 -34 -15 -34 -33z" />
- <glyph glyph-name="magic" unicode="magic"
-d="M304 511l-29 -93l-28 93l-93 29l93 28l28 94l29 -94l93 -28zM466 562l-14 -47l-16 47l-46 15l46 14l16 46l14 -46l46 -14zM9 51l573 556c4 5 10 8 17 8c9 1 18 -2 25 -9c3 -2 7 -6 13 -11c11 -10 23 -22 32 -34c4 -6 6 -11 6 -16c1 -10 -2 -19 -8 -25l-573 -558
-c-5 -5 -11 -7 -18 -8c-9 -1 -18 2 -25 9c-3 3 -7 6 -13 12c-11 9 -23 21 -31 34c-4 6 -6 12 -7 17c-1 10 2 18 9 25zM469 455l42 -43l133 129l-42 44zM190 398l-13 -46l-14 46l-46 15l46 14l14 47l13 -47l48 -14zM656 433l15 -47l46 -14l-46 -15l-15 -46l-15 46l-46 15
-l46 14z" />
- <glyph glyph-name="mail" unicode="mail" horiz-adv-x="768"
-d="M768 551l-384 -329l-384 329v19h768v-19zM768 87l-254 183l254 220v-403zM0 490l254 -220l-254 -183v403zM384 157l105 92l279 -201v-4h-768v4l279 201z" />
- <glyph glyph-name="map" unicode="map"
-d="M0 17l220 83v497l-220 -83v-497zM469 17l-221 83v497l221 -83v-497zM497 17l220 83v497l-220 -83v-497z" />
- <glyph glyph-name="meal" unicode="meal" horiz-adv-x="570"
-d="M201 406v234h67v-268c0 -37 -30 -68 -67 -68v-296c0 -18 -15 -34 -34 -34h-67c-18 0 -33 16 -33 34v296c-37 0 -67 31 -67 68v268h67v-234h33v234h67v-234h34zM369 304v236c0 55 45 100 100 100s100 -45 100 -100v-532c0 -18 -14 -34 -32 -34h-68c-18 0 -34 16 -34 34
-v296h-66z" />
- <glyph glyph-name="memo" unicode="memo" horiz-adv-x="674"
-d="M158 666h401c63 0 116 -53 116 -116v-485c0 -63 -53 -116 -116 -116h-401c-63 0 -116 53 -116 116v11h-20c-12 0 -22 9 -22 20s10 22 22 22h20v168h-20c-12 0 -22 10 -22 21s10 22 22 22h20v168h-20c-12 0 -22 10 -22 21s10 21 22 21h20v11c0 63 53 116 116 116zM611 65
-v485c0 29 -23 52 -52 52h-401c-29 0 -53 -23 -53 -52v-11h42c11 0 22 -10 22 -21s-11 -21 -22 -21h-42v-168h42c11 0 22 -11 22 -22s-11 -21 -22 -21h-42v-168h42c11 0 22 -11 22 -22s-11 -20 -22 -20h-42v-11c0 -29 24 -53 53 -53h401c29 0 52 24 52 53zM253 539h253
-c12 0 21 -10 21 -21s-9 -21 -21 -21h-253c-11 0 -22 10 -22 21s11 21 22 21zM253 455h253c12 0 21 -10 21 -21c0 -12 -9 -21 -21 -21h-253c-11 0 -22 9 -22 21c0 11 11 21 22 21zM253 371h253c12 0 21 -10 21 -22c0 -11 -9 -20 -21 -20h-253c-11 0 -22 9 -22 20
-c0 12 11 22 22 22zM253 286h253c12 0 21 -10 21 -21c0 -12 -9 -21 -21 -21h-253c-11 0 -22 9 -22 21c0 11 11 21 22 21zM253 202h253c12 0 21 -10 21 -22c0 -11 -9 -20 -21 -20h-253c-11 0 -22 9 -22 20c0 12 11 22 22 22zM253 118h253c12 0 21 -11 21 -22s-9 -20 -21 -20
-h-253c-11 0 -22 9 -22 20s11 22 22 22z" />
- <glyph glyph-name="menu" unicode="menu" horiz-adv-x="665"
-d="M44 526h578c25 0 44 19 44 44c0 24 -19 43 -44 43h-578c-25 0 -44 -19 -44 -43c0 -25 19 -44 44 -44zM44 351h578c25 0 44 19 44 44c0 24 -19 43 -44 43h-578c-25 0 -44 -19 -44 -43c0 -25 19 -44 44 -44zM44 176h578c25 0 44 19 44 43c0 25 -19 44 -44 44h-578
-c-25 0 -44 -19 -44 -44c0 -24 19 -43 44 -43zM44 1h578c25 0 44 19 44 43c0 25 -19 44 -44 44h-578c-25 0 -44 -19 -44 -44c0 -24 19 -43 44 -43z" />
- <glyph glyph-name="minus" unicode="minus" horiz-adv-x="757"
-d="M0 386h758v-158h-758v158z" />
- <glyph glyph-name="mixi" unicode="mixi" horiz-adv-x="715"
-d="M352 637c200 13 376 -119 363 -319c-12 -193 -177 -293 -335 -354v71c-209 -15 -399 86 -379 301c15 166 181 289 351 301zM514 188h51v158c0 41 -3 71 -20 91c-18 20 -31 31 -75 31c-33 0 -67 -17 -96 -53c-19 35 -39 53 -83 53c-28 0 -69 -16 -91 -51v46h-52v-275h52
-v142c0 43 20 67 36 79c11 8 27 13 39 13c20 0 36 -6 44 -19c8 -12 13 -23 13 -67v-148h51v154c0 43 37 80 71 80c33 0 42 -11 52 -23c7 -8 8 -29 8 -53v-158z" />
- <glyph glyph-name="move" unicode="move"
-d="M224 71l116 -116c5 -5 11 -8 18 -7c8 0 15 2 20 7l115 116c16 16 11 28 -12 28h-78v164h162v-80c0 -23 14 -27 30 -11l115 115c5 5 7 11 7 19c1 7 -2 14 -7 20l-115 114c-16 16 -30 12 -29 -11v-78h-163v162h78c23 0 28 13 12 29l-115 114c-10 10 -28 11 -38 0l-116 -114
-c-16 -16 -11 -29 12 -29h78v-161h-161v77c0 23 -14 27 -30 11l-115 -114c-5 -5 -7 -12 -8 -20c0 -8 3 -14 8 -19l115 -115c16 -16 29 -12 29 11v79h162v-163h-78c-23 0 -28 -12 -12 -28z" />
- <glyph glyph-name="music" unicode="music" horiz-adv-x="667"
-d="M182 510v-349c-15 4 -31 7 -45 7c-32 0 -65 -11 -92 -29s-45 -47 -45 -81c0 -36 18 -63 45 -81s60 -28 92 -28c30 0 64 10 91 28s44 45 44 81v366l305 87v-241c-14 4 -31 6 -46 6c-31 0 -65 -9 -92 -27s-44 -47 -44 -81c0 -36 17 -64 44 -81c27 -18 61 -29 92 -29
-c30 0 65 11 92 29c28 17 45 45 45 81v461c0 22 -15 37 -37 37c-2 0 -14 -4 -33 -9c-40 -11 -100 -28 -168 -48c-35 -9 -66 -19 -97 -27c-30 -9 -56 -18 -79 -24c-24 -7 -39 -11 -45 -13c-16 -5 -27 -19 -27 -35z" />
- <glyph glyph-name="newwindow" unicode="tabs"
-d="M430 558h-322c-19 0 -36 -17 -36 -36v-286c0 -19 17 -36 36 -36h35v-72h-35c-59 0 -108 49 -108 108v286c0 59 49 108 108 108h322c59 0 108 -49 108 -108h-72c0 19 -17 36 -36 36zM287 486h322c59 0 108 -48 108 -107v-287c0 -59 -49 -107 -108 -107h-322
-c-59 0 -108 48 -108 107v287c0 59 49 107 108 107zM287 56h322c19 0 36 17 36 36v287c0 19 -17 36 -36 36h-322c-19 0 -36 -17 -36 -36v-287c0 -19 17 -36 36 -36z" />
- <glyph glyph-name="next" unicode="next" horiz-adv-x="489"
-d="M0 26v563l489 -282z" />
- <glyph glyph-name="notify" unicode="notify" horiz-adv-x="678"
-d="M0 640h679v-500h-244l-96 -166l-95 166h-244v500z" />
- <glyph glyph-name="off" unicode="off" horiz-adv-x="660"
-d="M459 583c118 -50 201 -167 201 -304c0 -181 -148 -330 -330 -330c-181 0 -330 149 -330 330c0 137 83 254 202 304v-111c-62 -42 -104 -112 -104 -193c0 -128 104 -232 232 -232s232 104 232 232c0 81 -41 151 -103 193v111zM385 281v385h-110v-385h110z" />
- <glyph glyph-name="opera" unicode="opera" horiz-adv-x="666"
-d="M330 666c197 0 337 -145 337 -357c0 -197 -140 -360 -337 -360s-330 163 -330 360c0 208 133 357 330 357zM331 30c104 0 126 120 126 274c0 185 -28 283 -126 283c-113 0 -122 -132 -122 -297c0 -154 29 -260 122 -260z" />
- <glyph glyph-name="ordble" unicode="ordble" horiz-adv-x="709"
-d="M356 666c96 0 179 -35 249 -105c70 -71 105 -156 105 -256c0 -99 -35 -184 -104 -253s-152 -103 -249 -103c-102 0 -188 35 -256 106s-101 155 -101 252c0 66 15 126 47 180s75 98 130 130c5 3 11 7 17 9c0 0 58 -35 57 -94c-51 25 -105 -28 -105 -28s58 16 93 -9
-c-85 -50 -130 -153 -103 -253c32 -121 156 -193 277 -160s192 156 159 276c-30 113 -138 182 -250 166c8 39 50 81 50 81s-44 6 -79 -57c-11 69 -98 78 -99 78c50 27 104 40 162 40zM222 428c23 23 54 29 69 14c14 -15 8 -45 -16 -68c-23 -24 -53 -30 -68 -15
-c-14 14 -9 45 15 69z" />
- <glyph glyph-name="paint" unicode="paint"
-d="M326 317h82v309h-82v-309zM457 404l85 -85c14 -14 14 -36 0 -50l-267 -266c-13 -14 -36 -14 -49 0l-216 216c-13 13 -13 36 0 49l266 267v-259h181v128zM531 380c0 0 67 -27 67 -159c0 -82 -9 -95 -9 -95s128 -14 128 111c0 126 -186 143 -186 143z" />
- <glyph glyph-name="paramater" unicode="paramater"
-d="M414 580v-37h303v-60h-303v-37c0 -11 -10 -20 -21 -20h-69c-11 0 -21 9 -21 20v37h-303v60h303v37c0 11 10 20 21 20h69c11 0 21 -9 21 -20zM125 394h71c11 0 19 -9 19 -20v-37h502v-59h-502v-37c0 -11 -8 -21 -19 -21h-71c-11 0 -21 10 -21 21v37h-104v59h104v37
-c0 11 10 20 21 20zM514 188h71c11 0 20 -9 20 -20v-37h112v-59h-112v-37c0 -11 -9 -21 -20 -21h-71c-11 0 -20 10 -20 21v37h-494v59h494v37c0 11 9 20 20 20z" />
- <glyph glyph-name="pause" unicode="pause" horiz-adv-x="665"
-d="M0 609v-604c0 -17 14 -31 31 -31h212c16 0 29 14 29 31v604c0 17 -13 31 -29 31h-212c-17 0 -31 -14 -31 -31zM393 609v-604c0 -17 14 -31 30 -31h212c17 0 31 14 31 31v604c0 17 -14 31 -31 31h-212c-16 0 -30 -14 -30 -31z" />
- <glyph glyph-name="pc" unicode="pc"
-d="M59 650h598c33 0 60 -26 60 -59v-382c0 -33 -27 -61 -60 -61h-233v-99h170c25 0 27 -82 30 -85h-531s0 85 30 85h170v99h-234c-33 0 -59 28 -59 61v382c0 33 26 59 59 59zM59 209h598v382h-598v-382z" />
- <glyph glyph-name="pencil" unicode="pencil" horiz-adv-x="695"
-d="M587 666l-109 -98s36 -22 69 -53c32 -31 55 -66 55 -66l93 111s-1 20 -45 63c-45 43 -63 43 -63 43zM232 117l-5 -48l346 360s-23 32 -51 59c-29 28 -62 50 -62 50l-346 -360l54 3l6 -58zM0 -36l86 176l48 4l4 -55l58 -8l-6 -44l-174 -88z" />
- <glyph glyph-name="phone" unicode="phone"
-d="M0 487c0 -30 11 -63 25 -98s32 -68 46 -93c38 -66 87 -131 143 -185s122 -99 196 -126c43 -17 86 -36 134 -36c24 0 58 9 89 22c30 13 57 33 67 57c4 9 9 21 12 35c3 13 5 26 5 35c0 5 0 10 -1 11c-3 6 -10 11 -18 16c-18 9 -21 12 -48 28c-28 16 -57 34 -82 47
-c-12 7 -20 10 -23 10c-16 0 -36 -22 -53 -46c-18 -24 -38 -46 -52 -46c-7 0 -14 3 -22 8s-16 9 -21 12c-88 50 -147 109 -197 196c-6 10 -20 31 -20 42c0 13 18 28 36 44c17 15 35 33 35 55c0 3 -2 12 -6 25c-9 26 -21 56 -31 85c-5 14 -9 24 -10 29c-2 3 -3 7 -4 12
-s-3 9 -4 13c-3 9 -8 16 -13 20c-5 2 -17 5 -29 6c-12 0 -26 1 -32 1c-3 0 -7 0 -11 -1h-13c-32 -14 -55 -42 -72 -75c-16 -33 -26 -70 -26 -103z" />
- <glyph glyph-name="photo" unicode="photo" horiz-adv-x="665"
-d="M522 -32v572h-522v-572h522zM47 103v390h428v-390h-428zM666 646v-571h-118v134h70v390h-428v-38h-47v85h523z" />
- <glyph glyph-name="picasa" unicode="picasa"
-d="M503 395l-272 247c40 15 82 24 127 24c51 0 101 -12 145 -31v-240zM329 503l-317 -290c-8 30 -12 61 -12 94c0 138 78 259 193 318zM542 189v426c104 -62 175 -177 175 -308c0 -41 -8 -81 -20 -118h-155zM171 306v-304c-66 40 -116 100 -145 172zM209 151h472
-c-58 -119 -181 -202 -323 -202c-53 0 -104 13 -149 33v169z" />
- <glyph glyph-name="pin" unicode="pin" horiz-adv-x="425"
-d="M217 691c116 0 209 -95 209 -209c0 -115 -213 -559 -213 -559s-213 444 -213 559c0 114 93 209 209 209h4h4zM213 404c52 0 95 44 95 97c0 52 -43 95 -95 95c-53 0 -96 -43 -96 -95c0 -53 43 -97 96 -97z" />
- <glyph glyph-name="pinterest" unicode="pinterest"
-d="M298 59l-5 -18c-7 -29 -23 -56 -37 -78c34 -9 67 -14 102 -14c99 0 188 39 254 104c65 65 105 155 105 254s-40 189 -105 254c-66 65 -155 105 -254 105s-188 -40 -253 -105c-66 -65 -105 -155 -105 -254c0 -74 21 -142 60 -198c38 -56 92 -102 154 -129c-1 25 1 53 7 80
-c1 8 4 20 8 36c3 14 8 34 14 60c6 25 14 58 23 100c-3 6 -5 12 -6 19c-4 13 -6 25 -5 38c0 52 30 93 70 93c33 0 48 -25 48 -54c0 -16 -5 -35 -12 -58c-8 -24 -15 -45 -20 -69c-5 -19 0 -36 11 -49c11 -12 28 -20 46 -20c34 0 62 21 82 56s32 83 32 135c0 39 -13 72 -39 97
-s-63 39 -111 39c-54 0 -98 -19 -129 -51s-48 -75 -48 -121c0 -29 9 -51 25 -69c5 -8 7 -11 5 -20c-1 -3 -3 -8 -4 -14c-3 -13 -4 -30 -22 -24c-50 20 -73 76 -73 138c0 51 21 106 64 149c43 44 108 74 192 74c69 0 126 -24 166 -63c40 -38 61 -90 61 -142
-c0 -71 -19 -132 -53 -176s-83 -70 -140 -70c-39 0 -75 20 -88 45c-6 -22 -10 -38 -13 -50c-3 -13 -5 -24 -7 -30z" />
- <glyph glyph-name="plane" unicode="plane"
-d="M392 540l-15 -15l128 -11l77 77c12 12 34 30 66 50s53 26 61 18c22 -22 0 -65 -66 -130l-76 -76l11 -128l15 14c12 13 25 13 35 3c12 -12 7 -29 -17 -53l-24 -25l12 -86l17 18c11 12 23 12 34 2c12 -12 10 -27 -6 -43l-36 -36c14 -96 16 -150 5 -161
-c-5 -4 -12 -8 -22 -10c-9 -1 -17 0 -22 4c-4 5 -10 23 -16 54c-7 32 -24 86 -54 162c-29 77 -50 120 -60 131c-4 4 -10 4 -17 0c-7 -3 -32 -24 -72 -63c-40 -40 -77 -72 -112 -97c-1 -6 2 -26 7 -59s7 -55 6 -63c-2 -8 -10 -19 -23 -32c-7 -7 -12 -11 -17 -12
-c-13 13 -33 55 -60 124c-75 33 -116 54 -124 62c0 4 4 10 11 17c13 13 24 21 33 22c8 2 29 -1 62 -7c33 -5 53 -7 60 -7c24 36 69 89 139 159c20 22 26 36 19 43c-10 11 -54 31 -130 60c-77 29 -130 48 -162 54c-32 7 -50 12 -54 17c-5 4 -6 12 -4 22c1 10 5 17 10 22
-c10 10 64 9 161 -5l35 36c16 15 31 17 43 5c11 -10 10 -22 -1 -33l-18 -17l86 -12l24 23c24 24 41 29 53 17c11 -11 10 -22 -2 -35z" />
- <glyph glyph-name="play" unicode="play" horiz-adv-x="584"
-d="M0 605v-605c0 -11 5 -20 15 -26c4 -3 11 -4 16 -4s9 1 14 4l524 302c10 7 16 16 16 27c0 10 -6 19 -16 26l-524 302c-18 13 -45 -3 -45 -26z" />
- <glyph glyph-name="playmedia" unicode="playmedia"
-d="M0 307c0 -99 39 -189 105 -254c65 -65 154 -104 253 -104s188 39 254 104c65 65 105 155 105 254s-40 189 -105 254c-66 65 -155 105 -254 105s-188 -40 -253 -105c-66 -65 -105 -155 -105 -254zM108 307c0 70 28 132 73 177s107 74 177 74s133 -29 178 -74
-c46 -45 73 -107 73 -177s-27 -132 -73 -177c-45 -45 -107 -74 -178 -74c-70 0 -132 29 -177 74s-73 107 -73 177zM261 447v-281c0 -5 2 -9 7 -12c2 -1 5 -2 7 -2s6 1 8 2l244 141c4 2 8 6 8 12s-4 10 -8 12l-244 142c-3 2 -9 2 -15 0c-5 -3 -7 -9 -7 -14z" />
- <glyph glyph-name="plusicon" unicode="plus"
-d="M438 386h279v-159h-279v-277h-159v277h-279v159h279v279h159v-279z" />
- <glyph glyph-name="present" unicode="present" horiz-adv-x="627"
-d="M454 472h121c29 0 53 -23 53 -53v-182h-288v212c-10 3 -19 7 -25 13c-1 0 -1 1 -2 1c0 0 0 -1 -1 -1c-7 -6 -15 -10 -24 -13v-212h-288v182c0 30 23 53 52 53h122c-14 7 -27 17 -38 26c-48 46 -57 110 -19 146c16 14 37 22 60 22c33 0 67 -13 96 -40
-c16 -15 31 -36 40 -56c10 20 25 41 41 56c28 27 64 40 96 40c24 0 45 -8 60 -22c38 -36 29 -100 -20 -146c-10 -9 -23 -19 -36 -26zM276 501c4 9 -6 55 -39 86c-17 16 -40 25 -60 25c-6 0 -16 -1 -23 -7c-2 -2 -8 -6 -8 -17c0 -13 8 -33 27 -50c24 -23 62 -39 90 -39
-c9 0 13 2 13 2zM352 501c0 0 5 -2 13 -2c28 0 66 16 90 39c19 17 25 37 25 50c0 11 -5 15 -6 17c-7 6 -18 7 -24 7c-19 0 -43 -9 -60 -25c-32 -31 -43 -76 -38 -87v1zM288 -51h-236c-29 0 -52 23 -52 52v183h288v-235zM575 -51h-235v235h288v-183c0 -29 -24 -52 -53 -52z
-" />
- <glyph glyph-name="print" unicode="print"
-d="M181 597l-11 -86h377l-11 86c0 26 -21 46 -47 46h-262c-26 0 -46 -20 -46 -46zM46 464h625c26 0 46 -20 46 -46v-274c0 -26 -20 -46 -46 -46h-85v-127h-455v127h-85c-26 0 -46 20 -46 46v274c0 26 20 46 46 46zM540 17v297h-363v-297h363zM486 228h-260
-c-6 0 -11 6 -11 12v14c0 6 5 11 11 11h260c6 0 12 -5 12 -11v-14c0 -6 -6 -12 -12 -12zM486 145h-260c-6 0 -11 6 -11 12v14c0 6 5 11 11 11h260c6 0 12 -5 12 -11v-14c0 -6 -6 -12 -12 -12zM486 62h-260c-6 0 -11 6 -11 12v14c0 6 5 11 11 11h260c6 0 12 -5 12 -11v-14
-c0 -6 -6 -12 -12 -12z" />
- <glyph glyph-name="quote" unicode="quote"
-d="M306 548l-26 40c-180 -121 -280 -268 -280 -389c0 -117 86 -172 159 -172c92 0 157 78 157 160c0 69 -44 128 -103 150c-17 6 -33 11 -33 40c0 37 27 92 126 171zM703 548l-26 40c-178 -121 -280 -268 -280 -389c0 -117 88 -172 161 -172c93 0 159 78 159 160
-c0 69 -45 128 -106 150c-17 6 -32 11 -32 40c0 37 28 92 124 171z" />
- <glyph glyph-name="readability" unicode="readability" horiz-adv-x="819"
-d="M210 301v1c-2 16 -7 33 -15 47c-7 12 -17 23 -28 31c14 122 118 216 243 216s228 -94 242 -216c-10 -8 -20 -19 -27 -31c-8 -14 -14 -31 -16 -47v-1l-8 -77c-57 36 -123 55 -191 55s-135 -19 -192 -55zM150 58l-59 138c-50 1 -91 43 -91 93c0 52 42 94 94 94
-c34 0 64 -18 80 -46c7 -11 11 -24 13 -38v-1l29 -269c0 -5 -4 -11 -9 -11h-48c-5 0 -9 6 -9 11v29zM632 298v1c2 14 6 27 13 38c16 28 46 46 80 46c52 0 94 -42 94 -94c0 -50 -41 -92 -91 -93l-58 -138v-29c0 -5 -5 -11 -10 -11h-48c-5 0 -9 6 -9 11zM232 88l-11 111
-c54 36 119 56 189 56s134 -20 188 -56l-11 -111h-355z" />
- <glyph glyph-name="record" unicode="record" horiz-adv-x="421"
-d="M85 459v95c0 61 55 112 125 112c69 0 125 -51 125 -112v-95h-250zM422 453v-191c-41 -112 -162 -129 -162 -129v-127h133v-57h-366v57h134v127s-120 17 -161 129v191l49 23v-174s15 -117 161 -117s163 117 163 117v174zM335 426v-86c0 -61 -56 -112 -125 -112
-c-70 0 -125 51 -125 112v86h250z" />
- <glyph glyph-name="refresh" unicode="refresh" horiz-adv-x="629"
-d="M536 282h94c0 -82 -31 -165 -92 -226c-123 -123 -323 -123 -446 0s-123 323 0 446c56 56 129 86 203 91v88l241 -139l-241 -140v97c-50 -4 -98 -26 -136 -64c-87 -86 -87 -226 0 -312c86 -87 226 -87 312 0c44 43 66 102 65 159z" />
- <glyph glyph-name="remove" unicode="remove"
-d="M358 666c198 0 359 -161 359 -359s-161 -358 -359 -358s-358 160 -358 358s160 359 358 359zM360 255l114 -115c14 -14 37 -14 51 0c13 13 13 36 0 50l-114 115l114 115c13 14 13 37 0 50c-14 14 -37 14 -51 0l-114 -115l-114 115c-14 14 -37 14 -51 0
-c-13 -13 -13 -36 0 -50l114 -115l-114 -115c-13 -14 -13 -37 0 -50c14 -14 37 -14 51 0z" />
- <glyph glyph-name="repeat" unicode="repeat" horiz-adv-x="665"
-d="M453 646v-95h-408c-16 0 -30 -14 -30 -31v-264l107 95c5 6 10 8 15 11v67h316v-95c0 -28 17 -36 40 -16l161 148c7 6 12 14 12 24c0 9 -5 18 -12 24l-161 148c-23 20 -40 12 -40 -16zM650 358l-106 -96c-5 -4 -12 -7 -16 -10v-67h-315v96c0 28 -17 35 -40 15l-162 -148
-c-7 -6 -11 -14 -11 -24c0 -9 4 -18 11 -24l162 -147c23 -20 40 -13 40 15v95h407c17 0 30 14 30 31v264z" />
- <glyph glyph-name="reply" unicode="reply" horiz-adv-x="768"
-d="M0 370l274 -254v127s389 100 493 -245c0 0 37 494 -493 494v124z" />
- <glyph glyph-name="right" unicode="right" horiz-adv-x="475"
-d="M248 305l-246 246l119 115l354 -355l-363 -362l-112 111z" />
- <glyph glyph-name="rss" unicode="rss" horiz-adv-x="665"
-d="M0 528v99c39 8 80 13 122 13c300 0 544 -244 544 -544c0 -42 -6 -83 -14 -122h-98c11 39 16 80 16 122c0 248 -200 449 -448 449c-42 0 -83 -6 -122 -17zM0 300v106c38 15 79 23 122 23c183 0 333 -150 333 -333c0 -43 -9 -84 -24 -122h-105c22 36 33 78 33 122
-c0 131 -106 238 -237 238c-45 0 -86 -12 -122 -34zM122 218c68 0 122 -54 122 -122s-54 -122 -122 -122s-122 54 -122 122s54 122 122 122z" />
- <glyph glyph-name="safari" unicode="safari"
-d="M358 635c198 0 359 -161 359 -359s-161 -358 -359 -358s-358 160 -358 358c0 167 113 307 267 348c0 1 -1 2 -1 4c-19 4 -34 18 -34 34c0 19 21 34 47 34s47 -15 47 -34c0 -11 -7 -21 -17 -27v-2v-1c16 2 33 3 49 3zM265 638c3 10 12 17 22 17c8 0 14 -4 18 -10
-c5 5 9 12 9 18c0 14 -16 26 -35 26s-35 -12 -35 -26c0 -11 9 -21 21 -25zM358 -23c165 0 299 134 299 299c0 166 -134 299 -299 299s-299 -133 -299 -299c0 -165 134 -299 299 -299zM360 560c154 0 279 -125 279 -280c0 -154 -125 -280 -279 -280s-278 126 -278 280
-c0 155 124 280 278 280zM360 19c142 0 260 118 260 261c0 144 -118 260 -260 260s-259 -116 -259 -260c0 -143 117 -261 259 -261zM308 454l-8 40c-4 2 -5 3 -6 4h-3v2l17 4l36 -29h1l-5 25c-1 2 -2 4 -3 5s-3 1 -6 1l-1 2l18 4v-2c-2 -1 -4 -2 -5 -3c0 -1 -1 -3 0 -5
-l10 -49l-2 -1l-46 37l-1 -1l7 -32c0 -2 1 -4 2 -5s5 -2 8 -1l1 -3l-20 -4v2c3 1 5 3 5 4c1 1 1 3 1 5zM535 315l-91 -41c-1 -9 -3 -17 -7 -25l35 -36l-47 16c-6 -8 -16 -15 -25 -20l-4 -92l-39 84c-11 0 -21 3 -30 8l-131 -113l99 141c-2 3 -4 5 -5 8l-96 3l87 41
-c1 11 4 21 9 30l-33 37l46 -18c7 7 16 13 24 17l5 100l41 -91c11 -2 21 -6 30 -11l123 105l-94 -132c1 -2 2 -3 3 -5zM338 298l60 50c-7 4 -14 6 -22 8c-4 1 -9 1 -14 1c-13 0 -24 -3 -35 -9c-6 -3 -13 -7 -17 -12c-7 -6 -12 -14 -16 -22c-3 -7 -5 -14 -6 -22
-c0 -3 -1 -6 -1 -10c0 -13 4 -26 10 -37c1 -1 1 -2 2 -3zM577 305v1c4 2 7 4 8 7c2 2 2 7 0 13c0 2 -1 3 -1 4c-1 0 -2 1 -3 0l-17 -3c0 -4 2 -8 4 -9c1 -1 5 -1 10 -1v-2l-25 -5v2c4 1 6 3 8 5c1 1 1 5 0 9l-17 -3c-1 0 -2 -1 -3 -2c0 -1 0 -3 1 -6c0 -4 2 -8 4 -10
-c3 -3 7 -5 12 -6v-2h-15l-9 42l2 1c1 -2 1 -4 2 -5s2 -1 4 -1l36 7c2 1 3 2 3 3c1 1 1 3 0 5h2l9 -42zM383 256l-51 -43c7 -3 14 -5 22 -6h8c14 0 28 3 38 10c7 4 14 9 19 14c6 7 10 15 14 23c2 6 3 11 4 17c1 4 1 8 1 11c0 14 -4 26 -10 37l-45 -62v-1zM325 217l52 45l-3 3
-c4 3 6 9 6 14c0 10 -8 17 -18 17c-6 0 -11 -3 -14 -7l-4 3l-41 -56l-3 -7l-61 -85l80 69zM362 292c7 0 14 -6 14 -13s-7 -13 -14 -13s-12 6 -12 13s5 13 12 13zM197 238v-2l-42 -26c-2 -1 -3 -2 -4 -3v-3h-3l-4 21l2 1c0 -2 1 -3 1 -4c1 0 2 -1 4 0h1l1 1l24 15l-24 4
-s-1 0 -3 -2l-4 -2l-2 -2v-5h-1l-5 24h2c0 -2 1 -3 1 -4c1 -1 1 -1 2 -1s1 1 2 1c0 0 1 1 2 1l22 13l-25 3h-2h-2s-2 -1 -2 -2v-4h-2l-2 14h1c1 -1 1 -2 2 -2c1 -1 2 -2 4 -2l49 -6v-2l-32 -19v-1zM402 93l7 -2c3 -1 5 -2 7 -3c3 -2 6 -5 6 -10c1 -4 1 -8 -2 -12
-c-2 -4 -7 -8 -13 -9c-2 0 -5 -1 -6 -1c-2 0 -4 0 -5 1h-2h-1h-1c-1 0 -1 -1 -1 -1c-1 -1 -1 -1 -1 -2l-2 -1l-4 21h2c3 -5 6 -10 9 -12s8 -3 11 -2c4 0 6 3 7 5s2 4 1 6c0 2 -1 4 -3 5s-5 2 -8 3l-6 1c-5 2 -9 4 -12 6c-2 2 -4 4 -5 8c0 4 0 8 2 12c2 3 6 7 12 8
-c2 1 5 1 8 0h6s1 1 1 1c1 1 1 2 1 2l2 1l4 -18l-3 -1c-1 4 -4 8 -7 10c-3 3 -8 4 -11 3s-5 -2 -6 -4c-1 -1 -2 -4 -1 -6c0 -3 1 -5 3 -5c2 -1 5 -3 11 -4z" />
- <glyph glyph-name="save" unicode="save" horiz-adv-x="623"
-d="M390 676v-149h78l-156 -188l-156 188h82v149h152zM522 435l91 -144c5 -12 11 -35 11 -49v-277c0 -15 -12 -26 -26 -26h-571c-15 0 -27 11 -27 26v277c0 14 5 37 10 49l91 144c5 13 23 24 36 24h41l42 -51h-84l-81 -148c-1 0 -1 -1 -1 -2c0 -2 0 -3 -1 -4h517v4
-c0 1 -1 2 -1 3l-81 147h-84l42 51h40c14 0 31 -11 36 -24zM239 146h147c13 0 25 12 25 26c0 13 -12 25 -25 25h-147c-14 0 -26 -12 -26 -25c0 -14 12 -26 26 -26z" />
- <glyph glyph-name="search" unicode="search"
-d="M541 173l176 -176l-72 -73l-184 185c-45 -25 -97 -39 -151 -39c-171 0 -310 139 -310 310s139 310 310 310s311 -139 311 -310c0 -80 -31 -153 -80 -207zM103 380c0 -115 92 -207 207 -207s207 92 207 207s-92 207 -207 207s-207 -92 -207 -207z" />
- <glyph glyph-name="wrench" unicode="wrench"
-d="M247 423l10 85l-135 137c29 14 62 23 97 23c121 0 219 -97 219 -219c0 -18 -3 -38 -7 -56l249 -248c45 -46 49 -116 8 -157s-112 -38 -158 8l-243 245c-22 -7 -44 -12 -68 -12c-121 0 -219 99 -219 220c0 34 7 64 20 93l139 -141z" />
- <glyph glyph-name="share" unicode="share" horiz-adv-x="788"
-d="M623 180l75 74v-265h-698v532h281l-84 -72h-121v-388h547v119zM550 301v-110l238 222l-238 213v-109c-460 0 -427 -427 -427 -427c90 298 427 211 427 211z" />
- <glyph glyph-name="shopping" unicode="shopping"
-d="M644 174v-46h-441l-77 453h-126v45h165l77 -452h402zM717 627l-69 -400h-361l-70 400h500zM334 504v77h-62l14 -77h48zM380 504h63v77h-63v-77zM489 581v-77h64v77h-64zM599 504h50l14 77h-64v-77zM334 458h-41l11 -64h30v64zM443 394v64h-63v-64h63zM489 394h64v64h-64
-v-64zM641 458h-42v-64h31zM334 348h-22l13 -75h9v75zM380 273h63v75h-63v-75zM553 348h-64v-75h64v75zM599 348v-75h10l14 75h-24zM254 101c32 0 56 -25 56 -56c0 -32 -24 -57 -56 -57c-31 0 -56 25 -56 57c0 31 25 56 56 56zM597 101c32 0 56 -25 56 -56
-c0 -32 -24 -57 -56 -57s-56 25 -56 57c0 31 24 56 56 56z" />
- <glyph glyph-name="shuffle" unicode="shuffle" horiz-adv-x="768"
-d="M0 157v-64c0 -9 7 -16 16 -16h92c54 0 99 25 136 63c38 38 69 89 100 138c25 40 50 78 76 107c25 30 50 48 80 48h85v-73c0 -23 16 -27 35 -12l139 116c12 10 12 29 0 39l-139 115c-19 16 -35 12 -35 -12v-77h-85c-55 0 -98 -24 -136 -63c-37 -38 -71 -89 -101 -137
-c-26 -41 -50 -80 -76 -109c-25 -29 -50 -47 -79 -47h-92c-9 0 -16 -7 -16 -16zM0 514v-64c0 -9 7 -16 16 -16h92c45 0 81 -44 120 -101c1 3 2 5 3 7c1 1 4 3 5 5c15 25 32 49 48 75c-24 31 -47 59 -77 78c-29 20 -61 31 -99 31h-92c-11 0 -16 -5 -16 -15zM585 175h-85
-c-44 0 -82 43 -120 99c-2 -3 -3 -5 -4 -7c-2 -2 -3 -4 -5 -7c-7 -12 -16 -25 -23 -37c-8 -11 -16 -24 -23 -35c23 -31 47 -58 76 -77c28 -20 61 -33 99 -33h85v-70c0 -23 16 -28 35 -12l139 117c12 10 12 28 0 38l-139 115c-19 15 -35 12 -35 -12v-79z" />
- <glyph glyph-name="skype" unicode="skype"
-d="M696 230c13 -27 21 -56 21 -88c0 -110 -89 -198 -199 -198c-34 0 -65 8 -93 23c-20 -4 -41 -6 -63 -6c-189 0 -342 154 -342 342c0 24 3 47 8 69c-17 30 -28 64 -28 100c0 110 89 199 199 199c38 0 74 -12 105 -31c18 3 38 5 58 5c188 0 343 -153 343 -342
-c0 -25 -4 -49 -9 -73zM538 140c15 23 23 48 23 76c0 24 -4 44 -13 60s-23 30 -39 41c-16 10 -35 20 -58 27s-48 14 -76 20c-22 5 -38 9 -47 11c-9 3 -19 7 -28 11c-8 4 -15 9 -20 15c-4 6 -7 13 -7 20c0 13 7 24 21 33c15 10 34 15 59 15c27 0 47 -5 58 -13
-c11 -9 21 -22 30 -38c7 -13 14 -22 21 -28c6 -6 16 -9 28 -9c14 0 27 5 36 15c9 9 14 21 14 33s-4 26 -11 39s-18 26 -32 37c-15 12 -35 22 -58 29c-22 7 -49 10 -79 10c-39 0 -72 -6 -100 -16c-30 -11 -51 -27 -66 -46c-15 -20 -24 -43 -24 -69c0 -27 8 -51 23 -69
-c14 -17 33 -33 58 -43c24 -10 54 -19 90 -27c26 -5 47 -10 62 -15c14 -5 27 -11 36 -20c9 -8 14 -19 14 -32c0 -17 -9 -32 -25 -43c-17 -12 -41 -19 -70 -19c-20 0 -37 4 -49 10s-22 13 -28 22c-7 9 -14 21 -20 35c-6 12 -12 23 -20 29c-8 7 -19 11 -30 11
-c-14 0 -27 -5 -36 -13c-9 -9 -14 -21 -14 -33c0 -19 7 -42 21 -62s34 -38 57 -50c33 -17 73 -25 122 -25c41 0 77 6 107 18c31 13 55 30 70 53z" />
- <glyph glyph-name="sleipnir" unicode="sleipnir" horiz-adv-x="558"
-d="M406 78h-230s-8 10 -21 23c0 140 80 205 117 257c-36 -19 -68 -30 -86 -31c-11 -17 -45 -58 -55 -65c-12 -26 -31 -32 -51 -32c-70 0 -83 73 -79 83s90 140 105 172s4 23 20 50c16 28 51 54 58 59c-15 11 -48 52 -52 71c-6 36 17 10 44 -8c16 -11 49 -31 67 -39
-c138 0 219 -89 219 -195c0 -83 -33 -172 -33 -285v-37zM449 118v20c0 59 9 111 17 161c8 43 15 84 15 124c0 59 -22 112 -63 152c-43 40 -101 63 -171 64h-1c10 13 28 26 34 27c9 2 22 2 30 4c9 2 15 8 38 8c18 0 42 -7 42 -12c0 -7 -26 -3 -42 -20c-4 -6 9 1 16 1
-c6 1 17 2 33 -2c11 -3 24 -6 46 -1c7 2 22 0 4 -16c-12 -10 -18 -14 -22 -17c-6 -4 27 13 62 -19c19 -16 46 -36 28 -44c-10 -5 -24 0 -34 -3c-8 -3 18 -2 25 -7c4 -4 6 -16 13 -23c8 -7 16 -8 22 -18c6 -9 19 -37 0 -27c-13 7 -24 12 -37 11c-10 0 20 -8 32 -28
-c7 -13 0 -18 4 -29c4 -9 13 -16 16 -24c5 -13 -3 -61 -9 -74c-5 -12 -10 -20 -16 -13c-5 6 -15 6 -19 6c7 -11 2 -18 6 -27c5 -11 13 -17 13 -28c0 -10 -6 -35 -15 -35c-11 0 -24 16 -30 12c-8 -4 20 -24 23 -37c4 -16 -10 -28 -13 -38s0 -29 -9 -38c-7 -7 -13 -10 -38 -10z
-M185 51h212l74 -82l-10 -55h-339l-7 58z" />
- <glyph glyph-name="small" unicode="small" horiz-adv-x="665"
-d="M333 571v-226c0 -10 4 -19 11 -27c6 -7 16 -11 27 -11h225c32 0 40 17 17 40l-71 73l118 118c3 4 6 9 6 14s-3 9 -6 13l-69 69c-4 4 -8 6 -14 6c-5 0 -10 -2 -14 -6l-119 -119l-71 72c-23 23 -40 15 -40 -16zM5 49l70 -69c4 -3 8 -6 14 -6c5 0 9 3 13 6l119 119l72 -71
-c23 -23 40 -16 40 15v226c0 19 -16 38 -38 38h-225c-32 0 -41 -17 -18 -40l72 -72l-119 -118c-3 -4 -5 -10 -5 -15s2 -9 5 -13z" />
- <glyph glyph-name="smile" unicode="smile"
-d="M358 656c198 0 359 -155 359 -349s-161 -349 -359 -349s-358 155 -358 349s160 349 358 349zM258 485h-41c-11 0 -19 -9 -19 -20v-100c0 -11 8 -21 19 -21h41c10 0 20 10 20 21v100c0 11 -10 20 -20 20zM500 485h-41c-10 0 -20 -9 -20 -20v-100c0 -11 10 -21 20 -21h41
-c11 0 19 10 19 21v100c0 11 -8 20 -19 20zM228 243l-39 -13c-4 -1 -7 -4 -8 -7c-2 -3 -2 -7 -1 -11s36 -105 178 -104c142 -1 178 100 179 104s1 8 -1 11c-1 3 -5 6 -9 7l-34 12l-5 1c-6 0 -11 -5 -13 -10c0 -1 -22 -61 -117 -61c-94 0 -115 58 -116 61c-2 5 -8 10 -14 10z
-" />
- <glyph glyph-name="sns" unicode="sns" horiz-adv-x="685"
-d="M271 274l173 -97c25 29 62 47 104 47c76 0 137 -62 137 -138s-61 -137 -137 -137c-77 0 -138 61 -138 137c0 8 1 17 2 25l-178 99c-25 -25 -59 -40 -97 -40c-76 0 -137 61 -137 137s61 137 137 137c39 0 75 -16 100 -42l177 96c-2 10 -4 20 -4 30c0 76 61 138 138 138
-c76 0 137 -62 137 -138s-61 -137 -137 -137c-39 0 -74 15 -99 42l-178 -95c2 -10 3 -21 3 -31c0 -11 -1 -23 -3 -33z" />
- <glyph glyph-name="sort" unicode="sort" horiz-adv-x="461"
-d="M9 401l191 238c17 22 45 22 62 0l191 -238c17 -22 9 -40 -20 -40h-404c-29 0 -37 18 -20 40zM453 213l-191 -238c-17 -22 -45 -22 -62 0l-191 238c-17 22 -9 40 20 40h404c29 0 37 -18 20 -40z" />
- <glyph glyph-name="star" unicode="star" horiz-adv-x="778"
-d="M148 -62l241 125l241 -125l-46 267l194 189l-269 39l-120 244l-120 -244l-269 -39l195 -189z" />
- <glyph glyph-name="starempty" unicode="starempty" horiz-adv-x="778"
-d="M630 -62l-241 125l-241 -125l47 267l-195 189l269 39l120 244l120 -244l269 -39l-194 -189zM278 377l-155 -23l111 -108c13 -13 20 -32 17 -50l-26 -154l137 73c8 4 18 6 27 6s19 -2 27 -6l137 -73l-26 154c-3 18 4 37 17 50l111 108l-154 23c-18 3 -35 15 -43 32
-l-69 139l-68 -139c-8 -17 -25 -29 -43 -32z" />
- <glyph glyph-name="stop" unicode="stop" horiz-adv-x="665"
-d="M0 609v-604c0 -17 14 -31 31 -31h604c17 0 31 14 31 31v604c0 17 -14 31 -31 31h-604c-17 0 -31 -14 -31 -31z" />
- <glyph glyph-name="surprise" unicode="surprise"
-d="M358 656c198 0 359 -155 359 -349s-161 -349 -359 -349s-358 155 -358 349s160 349 358 349zM119 420c0 -58 47 -106 105 -106s106 48 106 106s-48 105 -106 105s-105 -47 -105 -105zM493 314c58 0 105 48 105 106s-47 105 -105 105s-106 -47 -106 -105s48 -106 106 -106
-zM271 420c0 -26 -21 -47 -47 -47s-47 21 -47 47s21 47 47 47s47 -21 47 -47zM493 467c26 0 47 -21 47 -47s-21 -47 -47 -47s-48 21 -48 47s22 47 48 47zM316 77h84c51 0 94 42 94 94s-43 94 -94 94h-84c-51 0 -93 -42 -93 -94s42 -94 93 -94z" />
- <glyph glyph-name="sync" unicode="sync" horiz-adv-x="768"
-d="M563 307h65c0 58 -22 113 -56 155h-1c-25 30 -55 53 -91 68c-1 0 -2 1 -2 1c-6 2 -12 6 -18 8c-2 0 -3 1 -5 1c-5 2 -12 3 -17 4c-2 1 -5 2 -7 2c-6 1 -11 2 -17 3h-6c-7 1 -15 1 -22 1c-50 1 -99 -14 -141 -43c-17 -12 -43 -8 -54 9c-12 17 -7 41 10 53
-c54 38 117 58 182 58c1 0 1 1 1 1c2 0 3 -1 4 -1c9 0 18 0 26 -1c4 0 7 -1 11 -1c4 -1 9 -1 14 -2c2 0 4 -1 6 -1c3 -1 8 -3 12 -4c6 -1 13 -3 19 -5c3 -1 6 -2 8 -3c8 -2 16 -5 23 -8c2 0 3 -1 4 -1c46 -20 87 -50 120 -90c0 -1 1 -1 1 -2c5 -6 10 -13 14 -19
-c1 0 1 -1 1 -2c36 -52 58 -113 58 -181h63l-102 -153zM0 307l102 154l103 -154h-65c0 -57 21 -109 55 -151c1 -1 1 -2 2 -3c5 -6 10 -12 15 -17v-1c16 -16 35 -30 55 -41c1 0 1 -1 1 -1c6 -3 13 -6 19 -8c1 -1 3 -2 4 -2c5 -2 10 -4 16 -6c2 -1 4 -2 7 -2c4 -2 10 -3 15 -4
-c3 -1 6 -1 9 -2c5 -1 10 -2 15 -2c3 -1 5 -1 8 -1c6 -1 14 -1 20 -1c51 -1 100 14 142 44c17 11 43 6 54 -11c12 -17 7 -41 -10 -53c-54 -38 -117 -58 -182 -58c-11 0 -22 1 -33 2c-2 0 -4 1 -6 1c-6 1 -11 1 -17 2c-2 1 -4 1 -5 1c-4 1 -10 2 -14 3c-6 2 -12 3 -18 5
-c-3 1 -6 2 -10 3c-6 2 -14 5 -21 8c-2 0 -4 1 -5 2c-8 4 -17 8 -24 12c-1 0 -2 1 -2 1c-27 14 -50 32 -72 54c0 1 -1 1 -1 2c-6 6 -13 13 -19 20c-2 1 -3 4 -4 6l-12 15c0 1 -1 1 -1 2c-36 51 -58 113 -58 181h-63z" />
- <glyph glyph-name="tabezou" unicode="tabe&#x7a;ou" horiz-adv-x="1228"
-d="M1087 496l15 15c7 25 -7 19 26 51c4 4 -10 -10 32 33c28 27 79 7 67 -4c-14 -15 -68 -69 -117 -118l69 -69c6 -6 6 -16 0 -22s-17 -6 -23 0l-19 18c-4 -5 -8 -6 -8 -13c0 -9 -4 -68 -6 -85c-4 -28 -42 -84 -61 -108c-19 -23 -67 -44 -105 -44c-38 1 -82 33 -110 53
-c-28 22 -63 62 -63 62v-284h-128v152h-28v-152h-135v152h-75v-156h-128v156h-26v-152h-129v378l-135 -121s95 193 128 230c30 32 52 44 81 44h461s38 11 54 10c16 -2 59 -14 75 -23c15 -9 52 -52 63 -78c12 -26 27 -114 38 -129c10 -15 39 -43 57 -47s57 11 57 11
-s23 20 35 49c7 18 8 47 3 71c-3 10 -13 17 -18 22l-16 -16c-6 -6 -17 -6 -23 0s-6 16 0 22l69 69l-32 33c-17 -13 -36 -15 -58 7l-46 45c-4 5 -4 12 0 17c5 5 12 5 17 0l44 -44c3 -3 8 -3 11 0s3 9 0 12l-44 44c-5 5 -5 12 0 17c5 4 13 4 18 0v-1l44 -43c3 -3 8 -3 11 0
-s3 8 0 11l-44 44c-5 4 -5 13 0 17c4 5 12 5 16 0l47 -45c22 -22 19 -42 7 -59zM601 199h81v29h-81c-22 0 -46 1 -63 18c-18 18 -34 51 -34 65l-2 142h-30l2 -142c0 -25 19 -63 43 -87c26 -26 59 -25 84 -25zM1127 410l-40 41c-17 -16 -33 -32 -45 -44c12 1 32 -3 45 -3
-c14 0 30 5 40 6zM717 359c14 0 26 13 26 27s-12 27 -26 27s-27 -13 -27 -27s13 -27 27 -27z" />
- <glyph glyph-name="table" unicode="table"
-d="M0 561v-508c0 -25 20 -45 45 -45h628c25 0 44 20 44 45v508c0 25 -19 45 -44 45h-628c-25 0 -45 -20 -45 -45zM60 388v129h179v-129h-179zM269 388v129h180v-129h-180zM478 388v129h179v-129h-179zM60 228v129h179v-129h-179zM269 228v129h180v-129h-180zM478 228v129
-h179v-129h-179zM60 69v130h179v-130h-179zM269 69v130h180v-130h-180zM478 69v130h179v-130h-179z" />
- <glyph glyph-name="tag" unicode="tag" horiz-adv-x="665"
-d="M0 652h267l379 -379c44 -44 0 -89 0 -89s-134 -133 -178 -178c-45 -44 -89 0 -89 0l-379 379v267zM183 469c22 23 22 57 0 79s-57 22 -79 0s-22 -57 0 -79s57 -22 79 0z" />
- <glyph glyph-name="tile" unicode="tile" horiz-adv-x="665"
-d="M0 343h297v297h-297v-297zM369 343h297v297h-297v-297zM0 -26h297v297h-297v-297zM369 -26h297v297h-297v-297z" />
- <glyph glyph-name="tilemenu" unicode="tilemenu" horiz-adv-x="665"
-d="M0 450h190v190h-190v-190zM238 450h190v190h-190v-190zM475 450h191v190h-191v-190zM0 212h190v190h-190v-190zM238 212h190v190h-190v-190zM475 212h191v190h-191v-190zM0 -26h190v191h-190v-191zM238 -26h190v191h-190v-191zM475 -26h191v191h-191v-191z" />
- <glyph glyph-name="time" unicode="time"
-d="M358 -51c-198 0 -358 160 -358 358s160 359 358 359s359 -161 359 -359s-161 -358 -359 -358zM358 577c-148 0 -268 -122 -268 -270s120 -268 268 -268s270 120 270 268s-122 270 -270 270zM455 170l-127 93c-9 7 -18 22 -18 34v203c0 11 10 20 22 20h42
-c11 0 20 -9 20 -20v-160c0 -12 9 -27 18 -34l93 -67c9 -7 11 -21 4 -30l-25 -34c-7 -9 -20 -11 -29 -5z" />
- <glyph glyph-name="trash" unicode="trash" horiz-adv-x="572"
-d="M441 567h99c18 0 32 -14 32 -32v-23c0 -15 -11 -29 -25 -32v-475c0 -31 -26 -56 -58 -56h-406c-32 0 -57 25 -57 56v475c-14 3 -26 17 -26 32v23c0 18 15 32 33 32h98v42c0 31 25 57 57 57h196c32 0 57 -26 57 -57v-42zM384 616h-196c-5 0 -8 -3 -8 -7v-42h212v42
-c0 4 -3 7 -8 7zM99 13h375c4 0 7 5 7 9v457h-390v-457c0 -4 3 -9 8 -9zM176 50h-6c-18 0 -33 15 -33 33v327c0 17 15 31 33 31h6c17 0 32 -14 32 -31v-327c0 -18 -15 -33 -32 -33zM289 50h-5c-18 0 -33 15 -33 33v327c0 17 15 31 33 31h5c18 0 33 -14 33 -31v-327
-c0 -18 -15 -33 -33 -33zM402 50h-5c-18 0 -32 15 -32 33v327c0 17 14 31 32 31h5c18 0 33 -14 33 -31v-327c0 -18 -15 -33 -33 -33z" />
- <glyph glyph-name="trouble" unicode="trouble"
-d="M358 656c198 0 359 -155 359 -349s-161 -349 -359 -349s-358 155 -358 349s160 349 358 349zM198 465v-100c0 -11 8 -21 19 -21h41c10 0 20 10 20 21v100c0 11 -10 20 -20 20h-41c-11 0 -19 -9 -19 -20zM439 465v-100c0 -11 10 -21 20 -21h41c11 0 19 10 19 21v100
-c0 11 -8 20 -19 20h-41c-10 0 -20 -9 -20 -20zM584 144c9 9 17 19 6 31c-9 9 -20 19 -29 29c-9 9 -20 18 -32 25c-20 12 -46 15 -70 9c-18 -5 -34 -18 -46 -31c-13 -13 -25 -34 -43 -40c-20 -6 -36 6 -48 21c-12 14 -24 29 -40 39c-19 12 -43 16 -65 13
-c-23 -4 -40 -16 -55 -31c-8 -8 -16 -17 -24 -24c-8 -8 -24 -20 -12 -32c7 -7 15 -19 25 -24c12 -5 24 13 31 21c18 17 39 45 68 30c16 -9 28 -29 41 -42c14 -14 33 -24 53 -27c23 -4 47 1 66 13c16 11 28 26 40 40c14 16 34 27 54 15c8 -5 14 -13 20 -20c9 -8 18 -18 27 -26
-c12 -12 25 3 33 11z" />
- <glyph glyph-name="tumblr" unicode="tumblr" horiz-adv-x="665"
-d="M84 640h498c47 0 84 -37 84 -84v-498c0 -25 -10 -44 -25 -59c-14 -14 -36 -25 -59 -25h-498c-47 0 -84 37 -84 84v498c0 23 11 45 25 59c15 15 34 25 59 25zM225 365v-186c0 -25 2 -43 7 -55s15 -25 28 -36s29 -21 48 -27c18 -6 40 -9 64 -9c22 0 41 2 59 7
-c18 4 39 12 62 22v84c-27 -17 -53 -27 -80 -27c-15 0 -29 5 -40 12c-9 5 -16 11 -19 20c-3 8 -5 28 -5 59v136h126v82h-126v135h-75c-3 -27 -9 -50 -18 -67c-9 -18 -21 -33 -36 -46c-14 -12 -31 -22 -53 -29v-75h58z" />
- <glyph glyph-name="twitter" unicode="twitter" horiz-adv-x="778"
-d="M768 546c-22 -32 -48 -59 -79 -82c1 -7 1 -14 1 -21c0 -208 -158 -448 -448 -448c-89 0 -172 27 -242 71c12 -1 25 -3 38 -3c74 0 141 26 195 68c-70 1 -127 48 -147 110c9 -2 20 -3 30 -3c14 0 29 2 42 6c-73 14 -127 77 -127 153v2c22 -11 45 -18 71 -19
-c-42 29 -70 77 -70 131c0 29 8 56 21 80c78 -95 194 -159 325 -165c-2 11 -4 24 -4 36c0 87 70 158 157 158c46 0 87 -20 116 -51c36 7 69 21 99 39c-11 -37 -36 -69 -68 -88c32 4 61 13 90 26z" />
- <glyph glyph-name="underline" unicode="underline" horiz-adv-x="665"
-d="M0 638l2 -37c4 -1 10 -2 18 -2c16 0 35 -1 49 -5s18 -12 20 -27c2 -16 2 -36 2 -53v-18v-140c0 -53 3 -100 19 -139c17 -39 47 -71 102 -91c39 -14 82 -20 124 -20s90 7 133 22c42 15 80 42 104 81c10 18 17 44 21 71c3 26 4 50 4 72c0 7 0 31 -2 59c0 14 -1 29 -1 45
-c-2 32 -3 60 -4 79c-1 8 -2 14 -2 16c-2 8 -2 15 -2 23s3 14 8 17c11 7 29 9 46 10c8 1 17 2 23 4c2 4 2 8 2 12c0 7 -1 15 -3 22h-4h-5c-11 0 -22 0 -33 -2c-11 -1 -23 -2 -34 -2c-25 0 -48 1 -72 3s-47 3 -72 1v-35c4 -2 14 -2 25 -2h15c5 1 9 1 11 1c13 0 24 -5 33 -14
-c2 -2 5 -10 7 -20c2 -11 4 -24 6 -39c3 -30 7 -67 8 -100c2 -34 3 -62 3 -73c0 -67 -10 -117 -39 -151c-28 -34 -73 -51 -146 -51c-91 0 -137 57 -142 142c-3 79 -6 156 -6 235c0 23 2 40 4 48c5 18 18 21 43 19c11 -1 28 0 46 3v3c0 5 0 12 -1 17c-1 6 -1 11 0 16
-c-56 -2 -116 -4 -173 -4c-19 0 -40 1 -59 2c-19 2 -41 3 -61 3h-9c-2 0 -5 -1 -8 -1zM0 -27h666v68h-666v-68z" />
- <glyph glyph-name="undo" unicode="undo" horiz-adv-x="581"
-d="M248 393v-26v-40c0 -14 -11 -20 -22 -12l-217 156c-12 8 -12 23 0 31l217 157c11 8 22 3 22 -11v-39v-26c49 0 150 -6 216 -49c151 -99 238 -423 -256 -587c0 0 298 149 246 354c-13 55 -74 104 -206 92z" />
- <glyph glyph-name="unlock" unicode="unlock" horiz-adv-x="550"
-d="M468 334h67c9 0 16 -8 16 -17v-352c0 -9 -7 -16 -16 -16h-519c-9 0 -16 7 -16 16v352c0 9 7 17 16 17h368v1v155c0 51 -42 94 -94 94h-31c-51 0 -93 -43 -93 -94v-59h-85v67c0 92 59 168 150 168h86c92 0 151 -76 151 -168v-164zM228 51h94l-23 101c16 8 27 25 27 44
-c0 29 -23 51 -51 51s-50 -22 -50 -51c0 -19 11 -36 27 -44z" />
- <glyph glyph-name="up" unicode="up"
-d="M360 317l-245 -245l-115 118l354 355l363 -363l-112 -112z" />
- <glyph glyph-name="upload" unicode="upload"
-d="M132 381h129v-211c0 -18 15 -33 33 -33h129c18 0 34 15 34 33v211h129c17 0 22 9 10 22l-214 213c-6 7 -15 11 -24 11s-17 -4 -23 -11l-213 -213c-12 -13 -8 -22 10 -22zM0 232v-228c0 -10 5 -16 16 -16h684c11 0 17 6 17 16v228c0 10 -8 18 -17 18h-65
-c-9 0 -17 -9 -17 -18v-145h-520v145c0 10 -7 18 -16 18h-66c-9 0 -16 -9 -16 -18z" />
- <glyph glyph-name="user" unicode="user"
-d="M646 138c47 -26 74 -70 71 -115c-3 -28 -3 -29 -39 -33c-23 -3 -163 -5 -307 -5c-163 0 -333 2 -346 5c-48 13 -22 102 43 143c50 33 152 82 179 88c38 8 43 31 1 106c-10 17 -22 68 -23 122c-2 86 16 145 91 173c14 5 30 8 45 8c50 0 97 -28 116 -69
-c27 -55 16 -199 -13 -251c-32 -60 -29 -78 8 -88c24 -6 99 -43 174 -84z" />
- <glyph glyph-name="vertical" unicode="vertical"
-d="M68 651h237c37 0 68 -30 68 -68v-551c0 -38 -31 -69 -68 -69h-237c-37 0 -68 31 -68 69v551c0 38 31 68 68 68zM665 372h-52c3 35 -7 69 -34 96c-20 20 -47 33 -75 35v-69l-100 96l100 92v-68c41 -2 79 -19 110 -50c37 -36 54 -85 51 -132zM44 98h286v423h-286v-423z
-M412 337h237c37 0 68 -31 68 -69v-236c0 -38 -31 -69 -68 -69h-261c10 12 18 28 22 44h178v286h-176v44zM186 4c20 0 37 18 37 38s-17 37 -37 37s-36 -17 -36 -37s16 -38 36 -38z" />
- <glyph glyph-name="video" unicode="video" horiz-adv-x="768"
-d="M496 396l219 126c29 17 53 5 53 -30v-372c0 -34 -24 -48 -53 -31l-219 127v-94c0 -35 -28 -63 -63 -63h-372c-34 0 -61 28 -61 63v371c0 35 27 62 61 62h372c35 0 63 -27 63 -62v-97z" />
- <glyph glyph-name="view" unicode="view" horiz-adv-x="794"
-d="M397 376c38 0 69 -31 69 -69s-31 -68 -69 -68s-68 30 -68 68s30 69 68 69zM397 546c226 0 389 -212 389 -212c11 -14 11 -39 0 -53c0 0 -163 -212 -389 -212s-389 212 -389 212c-11 14 -11 39 0 53c0 0 163 212 389 212zM397 136c94 0 171 77 171 171s-77 171 -171 171
-s-171 -77 -171 -171s77 -171 171 -171z" />
- <glyph glyph-name="volume" unicode="volume" horiz-adv-x="315"
-d="M0 382v-150c0 -9 7 -15 15 -15h84l169 -129c27 -28 47 -18 47 20v399c0 39 -20 47 -47 19l-169 -129h-84c-8 0 -15 -6 -15 -15z" />
- <glyph glyph-name="volumedown" unicode="volumedown" horiz-adv-x="463"
-d="M0 382v-150c0 -9 7 -15 15 -15h84l169 -129c27 -28 47 -19 47 20v399c0 38 -20 47 -47 19l-169 -129h-84c-8 0 -15 -7 -15 -15zM380 145c5 -3 10 -5 15 -5c12 0 22 6 28 17c28 47 41 97 41 150c0 52 -13 103 -41 151c-9 15 -28 19 -43 11s-20 -28 -12 -43
-c23 -38 32 -78 32 -119s-9 -81 -32 -119c-8 -15 -3 -35 12 -43z" />
- <glyph glyph-name="volumeup" unicode="volumeup"
-d="M582 -5c5 -4 11 -5 17 -5c10 0 22 5 27 14c60 91 91 193 91 301c0 109 -31 211 -91 303c-9 13 -29 16 -44 8c-15 -9 -19 -29 -10 -44c53 -81 81 -172 81 -267c0 -94 -29 -185 -81 -267c-9 -13 -5 -34 10 -43zM481 70c4 -4 11 -5 17 -5c10 0 21 5 26 14
-c44 70 66 145 66 226c0 82 -22 157 -65 227c-10 15 -29 20 -44 10c-15 -8 -19 -28 -10 -43c75 -119 75 -267 0 -386c-9 -15 -5 -35 10 -43zM0 381v-151c0 -9 7 -15 15 -15h84l169 -129c27 -27 47 -19 47 19v401c0 38 -20 46 -47 19l-169 -129h-84c-8 0 -15 -7 -15 -15z
-M380 143c5 -3 10 -5 15 -5c12 0 22 7 28 17c28 48 41 98 41 150c0 53 -13 104 -41 152c-9 15 -28 19 -43 11s-20 -28 -12 -43c23 -39 32 -78 32 -120c0 -41 -9 -80 -32 -119c-8 -15 -3 -35 12 -43z" />
- <glyph glyph-name="walking" unicode="walking" horiz-adv-x="499"
-d="M304 593c0 40 -33 73 -74 73c-40 0 -72 -33 -72 -73c0 -41 32 -73 72 -73c41 0 74 32 74 73zM225 -51h-65s-3 185 2 207c4 22 47 68 49 86c2 19 -17 97 -17 97s-43 -39 -57 -46s-124 -25 -124 -25l-13 56s105 23 120 35c15 11 55 108 85 120c20 9 74 5 101 5
-c28 0 120 -53 129 -65c10 -11 65 -119 65 -119l-50 -28l-40 86s-31 26 -43 30c-13 4 -30 9 -33 -2c-4 -10 23 -92 30 -115c6 -24 39 -133 51 -156s83 -125 83 -125l-61 -40s-87 118 -98 135c-12 17 -46 108 -46 108s-58 -71 -63 -93c-4 -20 -5 -151 -5 -151z" />
- <glyph glyph-name="web" unicode="web"
-d="M0 318v1c9 116 51 203 124 258c72 56 150 83 235 83c89 1 172 -29 246 -89c75 -59 112 -147 112 -261v-3v-2v-2c0 -115 -37 -201 -112 -260c-75 -60 -158 -90 -247 -90h-2h-2c-87 1 -167 31 -241 91c-74 59 -112 150 -113 274zM337 475v158h-24c-5 -6 -9 -13 -13 -19
-s-8 -12 -12 -19c-4 -6 -9 -14 -12 -20c-4 -6 -7 -12 -10 -19c-6 -10 -11 -20 -15 -29c-5 -9 -9 -18 -12 -26c6 -4 13 -9 21 -12c9 -3 18 -6 27 -8c10 -2 19 -3 27 -4c9 -1 17 -2 23 -2zM379 633v-157c5 0 11 -1 17 0c6 0 13 1 19 2c11 2 24 5 34 8c11 4 21 9 28 15
-c-12 29 -25 52 -38 74s-28 41 -44 57v1h-16zM271 624v1c-7 -3 -14 -8 -22 -11c-7 -3 -16 -7 -23 -11c-14 -7 -28 -15 -42 -24c-13 -9 -26 -19 -37 -29c4 -4 9 -8 13 -11s9 -7 14 -11c4 -2 9 -5 14 -9c5 -3 11 -7 17 -11c8 18 16 37 26 54c10 18 21 35 32 50c1 2 2 4 4 6
-c1 1 2 4 4 6zM577 550v1c-25 19 -47 35 -69 45s-44 20 -64 28c16 -16 30 -36 39 -55c10 -20 20 -41 28 -61c4 2 9 4 15 8c5 3 12 6 18 9c6 4 11 8 17 12c6 5 12 9 16 13zM560 327h115c0 37 -8 72 -23 108c-14 35 -34 64 -59 89v1c-5 -8 -12 -15 -19 -20
-c-8 -5 -15 -9 -23 -13c-5 -3 -10 -7 -15 -9c-5 -3 -12 -5 -17 -8c4 -8 8 -17 12 -25c3 -9 8 -19 10 -28c6 -16 10 -33 14 -50c3 -15 5 -31 5 -45zM198 475v1c-8 4 -17 7 -24 11c-7 5 -14 10 -20 14c-6 3 -12 7 -17 11s-9 8 -13 12c-26 -25 -45 -53 -57 -86
-c-13 -33 -22 -70 -26 -110h123c0 28 4 55 11 82c6 28 15 49 23 65zM337 328v115c-8 -1 -18 -1 -27 0c-10 1 -20 4 -29 7c-8 2 -18 4 -26 7c-9 2 -18 6 -25 10c-6 -10 -11 -22 -15 -35c-5 -12 -8 -25 -11 -37c-2 -12 -3 -25 -4 -36s-2 -22 -2 -31h139zM379 441v-113h148
-c0 6 0 13 -1 21c-2 7 -3 16 -4 24c-3 12 -6 25 -10 37c-4 11 -8 22 -13 31c-2 5 -4 11 -6 15c-3 5 -6 8 -8 11c-11 -8 -26 -13 -44 -17c-17 -4 -37 -8 -55 -9h-3h-4zM164 295h-123c0 -17 3 -36 8 -59c5 -24 15 -46 26 -70c5 -12 11 -24 17 -36c7 -11 15 -23 23 -34
-c6 4 12 7 17 10c6 3 13 7 19 10c7 3 14 6 22 10c7 3 16 7 25 11c-8 25 -17 49 -23 76c-7 26 -11 52 -11 81v1zM337 178v117h-139c0 -8 1 -20 3 -32c1 -12 4 -25 6 -38c4 -14 7 -28 11 -40s8 -22 12 -31c18 7 36 12 48 15c13 4 25 7 37 8h11c4 1 8 1 11 1zM379 295v-116
-c7 -1 15 -2 23 -3c9 -1 20 -3 29 -5l15 -3c5 -2 11 -3 16 -4c6 -2 12 -3 18 -5c5 -2 10 -3 14 -5c13 33 21 60 26 83c5 22 7 41 7 57v1h-148zM675 294v1h-115v-3v-3c-1 -19 -4 -41 -8 -64c-4 -22 -13 -48 -25 -80c16 -8 31 -16 43 -24s23 -17 31 -25c17 17 32 40 45 70
-c13 29 22 59 27 91c1 6 1 12 2 18v19zM337 -10v156c-25 -4 -46 -9 -62 -13s-28 -8 -36 -12c6 -15 12 -28 18 -40c6 -11 13 -23 19 -33c2 -4 6 -8 9 -13c3 -4 5 -9 8 -13c3 -5 6 -11 9 -17c4 -5 7 -11 11 -15h24zM379 -10h23c9 7 18 17 25 28c8 11 17 24 23 35
-c7 13 14 25 20 37s11 23 15 31c-11 4 -26 8 -41 12s-36 8 -65 12v-155zM577 72v1c-2 3 -6 7 -9 10s-8 7 -13 10c-4 3 -9 6 -15 9s-14 7 -21 11c-4 -8 -11 -22 -21 -41c-9 -19 -25 -42 -45 -67c25 4 47 13 67 25c22 11 41 26 57 42zM205 104v1c-7 -4 -18 -9 -29 -14
-c-12 -5 -25 -11 -37 -19c7 -6 14 -12 20 -16c6 -5 13 -9 19 -13c11 -7 24 -14 37 -20s29 -12 49 -18c-7 8 -12 18 -17 26s-11 16 -16 24s-9 17 -13 25c-5 8 -9 16 -13 24z" />
- <glyph glyph-name="wifi" unicode="wifi" horiz-adv-x="819"
-d="M486 178c-43 42 -110 42 -153 0c-42 -42 -42 -110 0 -153c43 -42 110 -42 153 0c42 43 42 111 0 153zM260 251c-28 -28 -46 -61 -55 -97l-67 65c14 34 35 64 63 91c115 116 302 116 417 0c27 -27 49 -57 63 -91l-67 -65c-9 36 -27 69 -55 97c-83 83 -217 83 -299 0z
-M127 384c-26 -27 -49 -56 -66 -87l-61 61c19 30 42 58 68 85c188 188 496 188 684 0c26 -27 48 -55 67 -85l-61 -61c-17 31 -40 60 -66 87c-156 156 -409 156 -565 0z" />
- <glyph glyph-name="youtube" unicode="youtube" horiz-adv-x="609"
-d="M98 485v-125h52v125l70 206h-55l-41 -134l-41 134h-57zM238 477c0 -46 4 -63 10 -81c11 -29 31 -43 62 -43s52 14 63 43c6 18 10 35 10 81s-4 71 -10 89c-11 29 -32 43 -63 43s-51 -14 -62 -43c-6 -19 -10 -43 -10 -89zM554 360v242h-48v-145c0 -15 -1 -27 -3 -33
-c-3 -12 -10 -17 -19 -17s-15 5 -18 15c-1 6 -2 17 -2 31v149h-46v-184c0 -43 15 -65 46 -65c18 0 34 11 43 34v-27h47zM334 482v-18c0 -29 0 -29 -1 -33c-3 -20 -11 -31 -23 -31c-13 0 -20 12 -23 36v37v16c0 25 0 41 1 46c3 18 10 26 22 26s20 -11 23 -30c1 -6 1 -22 1 -49
-zM102 326h405c56 0 102 -47 102 -103v-197c0 -56 -46 -103 -102 -103h-405c-56 0 -102 47 -102 103v197c0 56 46 103 102 103zM138 218h42v42h-121v-42h42v-214h37v214zM356 4v21c6 -16 17 -26 31 -26c17 0 29 12 34 37c3 12 5 33 5 63c0 31 -2 53 -4 66
-c-5 25 -18 37 -35 37c-13 0 -23 -8 -29 -22v80h-33v-256h31zM482 94h68v15c0 36 -4 59 -10 71c-8 14 -22 22 -40 22c-19 0 -33 -8 -41 -21c-5 -8 -9 -20 -10 -36c-1 -7 -2 -21 -2 -39c0 -23 1 -38 2 -46c1 -18 5 -33 11 -43c8 -12 22 -18 39 -18s30 5 38 15s12 26 12 49v4v4
-h-33c0 -26 -5 -38 -16 -38c-8 0 -14 6 -16 18c-2 6 -2 17 -2 31v12zM261 4h34v193h-35v-123c0 -11 0 -19 -2 -24c-2 -8 -6 -12 -13 -12c-6 0 -11 3 -13 11c-2 4 -2 12 -2 22v126h-32v-151c0 -31 9 -47 32 -47c13 0 24 9 31 25v-20zM482 130v3c-1 11 0 21 3 27c3 5 8 8 14 8
-c7 0 12 -4 14 -11c2 -5 2 -13 2 -24v-8h-33v5zM376 165c8 0 13 -10 15 -27v-38s0 -35 -1 -38c-1 -17 -6 -26 -14 -26c-9 0 -16 7 -18 21c-1 5 -1 17 -1 35c0 25 0 39 1 43c2 19 8 30 18 30z" />
- <glyph glyph-name="zoomin" unicode="&#x7a;oomin"
-d="M541 173l176 -176l-72 -73l-184 185c-45 -25 -97 -39 -151 -39c-171 0 -310 139 -310 310s139 310 310 310s311 -139 311 -310c0 -80 -31 -153 -80 -207zM86 380c0 -124 100 -223 224 -223c123 0 224 99 224 223s-101 223 -224 223c-124 0 -224 -99 -224 -223zM346 415
-h124v-71h-124v-123h-71v123h-123v71h123v124h71v-124z" />
- <glyph glyph-name="zoomout" unicode="&#x7a;oomout"
-d="M541 173l176 -176l-72 -73l-184 185c-45 -25 -97 -39 -151 -39c-171 0 -310 139 -310 310s139 310 310 310s311 -139 311 -310c0 -80 -31 -153 -80 -207zM86 380c0 -124 100 -223 224 -223c123 0 224 99 224 223s-101 223 -224 223c-124 0 -224 -99 -224 -223zM142 415
-h337v-71h-337v71z" />
- <glyph glyph-name="brush" unicode="brush"
-d="M680 626l11 -12s54 -54 5 -104c-42 -41 -89 -43 -145 -79c-67 -41 -103 -100 -95 -135c15 -65 92 -118 25 -186c-5 -4 -15 -16 -19 -20c0 0 3 -21 -20 -21c0 0 5 -22 -20 -22l-152 152l-5 5l-151 151c0 24 21 21 21 21c0 16 14 19 20 19c0 0 14 15 20 21
-c67 68 122 -11 185 -25c36 -9 96 27 137 94c35 57 36 104 78 146c50 50 105 -5 105 -5zM594 597c-19 -19 -19 -51 0 -70s52 -20 71 -1s19 53 0 72s-52 18 -71 -1zM3 201l-3 40l82 82l305 -307l-81 -83l-41 5l-4 48l-48 4l-3 51l-49 2l-4 49l-48 3l-5 49l-49 4l-3 49z" />
- <glyph glyph-name="buffalo" unicode="buffalo" horiz-adv-x="3034"
-d="M524 520l-41 -149c-11 -42 -50 -62 -70 -64c29 -6 46 -29 36 -66l-37 -138c-13 -53 -54 -83 -109 -83h-303l154 574h314c40 0 66 -37 56 -74zM716 123l126 471h149l-131 -489c-13 -49 -60 -85 -114 -85h-224c-39 0 -65 37 -55 75l134 499h149l-127 -477
-c-3 -10 4 -16 10 -16h54c11 0 25 7 29 22zM1123 319l43 159c6 26 28 36 43 36h189c9 35 24 63 57 80h-321c-38 0 -93 -25 -109 -85l-130 -489h148l59 219h177l43 80h-199zM1553 319l43 159c6 26 28 36 43 36h212c8 35 24 63 58 80h-345c-38 0 -93 -25 -109 -85l-130 -489
-h149l58 219h177l43 80h-199zM1627 20l331 516c25 39 66 58 106 58h102l-57 -574h-143l13 139h-167l-89 -139h-96zM2286 509l-111 -414c-11 -40 19 -75 54 -75h296c-27 20 -41 41 -41 81h-143c-6 0 -14 6 -11 16l128 477h-61c-46 0 -96 -29 -111 -85zM2532 109l108 400
-c16 63 72 85 110 85h226c42 0 66 -38 56 -73l-111 -416c-13 -49 -58 -85 -113 -85h-209c-45 0 -79 43 -67 89zM334 370l35 129c2 7 -2 15 -12 15h-75l-45 -166h69c11 0 24 7 28 22zM2784 493l-100 -376c-3 -10 4 -16 10 -16h54c11 0 25 7 29 22l100 376c2 7 -2 15 -11 15
-h-55c-13 0 -24 -10 -27 -21zM2010 466l-146 -227h124zM268 123l35 129c2 7 -2 15 -12 15h-76l-44 -166h69c11 0 24 7 28 22z" />
- <glyph glyph-name="dailycalendar" unicode="dailycalendar" horiz-adv-x="665"
-d="M558 560h57c28 0 51 -22 51 -49v-486c0 -28 -23 -51 -51 -51h-565c-28 0 -50 23 -50 51v486c0 27 22 49 50 49h58v6c0 17 5 36 18 50c12 13 32 24 62 24c31 0 52 -11 65 -24c12 -14 17 -34 17 -50v-6h125v6c0 17 6 36 19 50c12 13 32 24 63 24c30 0 51 -11 64 -24
-c12 -14 17 -34 17 -50v-6zM221 479v87c0 16 -10 24 -33 24c-22 0 -31 -8 -31 -24v-87c0 -16 9 -23 31 -23c23 0 33 7 33 23zM509 479v87c0 16 -12 24 -32 24c-23 0 -33 -8 -33 -24v-87c0 -16 10 -23 33 -23c22 0 32 7 32 23zM68 42h530v353h-530v-353zM161 262h50
-c0 13 3 24 10 33c6 8 17 13 30 13c9 0 18 -3 25 -9s12 -15 12 -26c0 -7 -2 -13 -6 -17c-3 -4 -9 -8 -14 -10s-11 -4 -17 -4c-7 -1 -14 -1 -19 0v-37c6 0 14 0 21 -1c6 0 13 -1 18 -4c6 -2 12 -6 16 -12c3 -5 5 -12 5 -21c0 -13 -4 -23 -12 -30c-8 -8 -18 -11 -30 -11
-c-7 0 -15 1 -20 4s-10 6 -14 10c-3 5 -6 11 -8 17s-3 13 -3 20h-50c0 -15 2 -29 7 -40c4 -12 10 -21 19 -29c8 -8 19 -15 30 -19c12 -4 26 -6 40 -6c12 0 25 2 36 6c11 3 21 8 30 15s17 17 22 27c5 11 8 23 8 37s-4 27 -12 38c-8 10 -20 17 -34 20v1c12 3 21 10 27 20
-c6 9 9 21 9 33c0 11 -2 21 -7 30s-13 17 -21 23s-17 10 -27 13s-21 5 -31 5c-13 0 -26 -2 -37 -6c-10 -5 -20 -11 -28 -18c-7 -8 -13 -18 -18 -29c-4 -10 -6 -23 -7 -36zM445 255v-167h53v258h-42c-1 -10 -5 -18 -10 -24c-4 -7 -10 -13 -16 -17c-7 -4 -14 -7 -23 -8
-c-8 -2 -17 -2 -26 -2v-40h64z" />
- <glyph glyph-name="coffee" unicode="coffee" horiz-adv-x="696"
-d="M397 347c-3 67 -7 103 -47 147c-51 57 -70 112 -28 197c11 -57 15 -108 55 -139s73 -115 20 -205zM322 347c-2 36 -4 54 -26 79c-27 30 -38 59 -15 105c6 -31 7 -58 29 -74s41 -62 12 -110zM503 31h182c11 0 15 -8 8 -17c0 0 -71 -91 -169 -91h-351s-169 91 -169 91
-c-7 9 -4 17 7 17h180c-25 13 -62 70 -62 141v150h438v-12c14 12 31 18 49 18c25 0 72 -26 72 -71c0 -65 -43 -89 -68 -106c0 0 -47 -37 -80 -80c-11 -19 -24 -34 -37 -40zM616 301c-16 0 -36 -7 -49 -39v-83c0 -11 -1 -24 -3 -35c22 22 48 37 48 37c16 11 48 32 48 73
-c1 29 -26 47 -44 47zM205 289h-28v-41h28v41zM205 224h-28v-67s8 -90 65 -117c-35 41 -37 88 -37 117v67z" />
- <glyph glyph-name="dark" unicode="dark" horiz-adv-x="549"
-d="M312 555v-7c0 -27 -12 -40 -37 -40s-36 13 -36 40v7c0 26 11 39 36 39s37 -13 37 -39zM386 523l5 6c15 22 33 25 52 11c20 -14 23 -33 8 -55l-6 -5c-15 -22 -33 -25 -52 -10c-20 14 -22 31 -7 53zM160 529l4 -6c15 -22 13 -39 -6 -53c-20 -15 -39 -12 -54 10l-4 5
-c-15 22 -13 41 6 55c20 14 39 9 54 -11zM275 463c85 0 155 -70 155 -156c0 -85 -70 -154 -155 -154c-86 0 -155 69 -155 154c0 86 69 156 155 156zM51 419l7 -2c26 -8 34 -23 27 -47c-8 -24 -24 -31 -49 -23l-7 2c-25 8 -34 23 -27 47c8 24 24 31 49 23zM492 417l7 2
-c26 8 42 1 49 -23s-1 -39 -27 -47l-6 -2c-26 -8 -42 -1 -49 23c-8 24 1 39 26 47zM275 221c47 0 86 39 86 86c0 48 -39 87 -86 87c-48 0 -87 -39 -87 -87c0 -47 39 -86 87 -86zM29 266l7 2c25 8 41 2 49 -22c7 -24 -1 -39 -27 -47l-7 -2c-25 -8 -41 -2 -49 22
-c-7 24 2 39 27 47zM515 268l6 -2c26 -8 34 -23 27 -47s-23 -30 -49 -22l-7 2c-25 8 -34 23 -26 47c7 24 23 30 49 22zM100 129l4 6c15 22 34 24 54 10c19 -14 21 -31 6 -53l-4 -6c-15 -22 -34 -24 -54 -10c-19 14 -21 31 -6 53zM445 135l6 -6c15 -22 12 -39 -8 -53
-c-19 -14 -37 -12 -52 10l-5 6c-15 22 -13 39 7 53c19 14 37 12 52 -10zM312 68v-8c0 -27 -12 -40 -37 -40s-36 13 -36 40v8c0 27 11 40 36 40s37 -13 37 -40z" />
- <glyph glyph-name="eraser" unicode="eraser" horiz-adv-x="666"
-d="M68 378l254 254c23 23 58 23 81 0l246 -246c23 -23 23 -59 0 -82l-254 -254c-90 -90 -236 -90 -327 0c-90 90 -90 238 0 328zM354 91l-245 246c-68 -68 -68 -178 0 -246s177 -68 245 0z" />
- <glyph glyph-name="grayscale" unicode="grayscale" horiz-adv-x="768"
-d="M0 8v598h768v-598h-768zM383 122v-63h64v63h65v61h-65v63h65v61h-65v62h65v61h-65v63h65v62h-65v-62h-64v62h-65v-62h-62v62h-205v-496h267v63h65zM383 493v-63h-65v63h65zM256 369v61h62v-61h-62zM447 369h-64v61h64v-61zM318 369h65v-62h-65v62zM256 246v61h62v-61h-62
-zM447 246h-64v61h64v-61zM318 183v63h65v-63h-65zM256 122v61h62v-61h-62zM383 183h64v-61h-64v61z" />
- <glyph glyph-name="ink" unicode="ink" horiz-adv-x="542"
-d="M500 340c-6 10 -18 26 -33 48c-16 22 -34 46 -52 74c-18 29 -38 59 -56 93c-17 34 -32 68 -43 104c-3 11 -9 20 -17 25s-18 7 -28 6c-9 1 -18 -1 -27 -6c-8 -5 -15 -14 -18 -25c-11 -36 -26 -70 -43 -104s-36 -64 -54 -93c-19 -28 -37 -52 -52 -74
-c-16 -22 -27 -38 -34 -48c-13 -20 -25 -44 -32 -68c-7 -25 -11 -49 -11 -77c0 -38 8 -73 22 -106c13 -34 32 -62 57 -87c26 -25 54 -44 87 -58s68 -21 105 -21c38 0 73 7 107 21c33 14 61 33 86 58s44 53 57 87c14 33 22 68 22 106c0 28 -5 52 -12 77c-7 24 -18 48 -31 68z
-M186 67c-18 0 -35 6 -47 19c-13 13 -20 30 -20 48c0 14 4 26 11 37c2 2 4 6 8 11s10 12 14 19c5 7 9 15 13 23s8 17 10 26c2 7 6 10 11 8c6 1 11 -1 12 -8c3 -8 6 -18 11 -26c4 -8 9 -16 13 -23c5 -7 10 -14 14 -19s6 -9 8 -11c7 -10 11 -23 11 -37c0 -18 -8 -35 -21 -48
-c-12 -13 -29 -19 -48 -19z" />
- <glyph glyph-name="invert" unicode="invert" horiz-adv-x="768"
-d="M0 606h768v-598h-768v598zM384 59v71l177 177l-177 177v71h-333v-496h333zM384 130l-177 177l177 177v-354z" />
- <glyph glyph-name="light" unicode="light" horiz-adv-x="687"
-d="M380 627v-79c0 -27 -12 -40 -37 -40s-37 13 -37 40v79c0 26 12 39 37 39s37 -13 37 -39zM455 523l46 65c15 20 34 24 53 10s21 -32 6 -54l-46 -64c-15 -22 -33 -24 -53 -10c-19 14 -21 31 -6 53zM185 587l47 -64c15 -22 13 -39 -7 -53c-19 -15 -37 -12 -52 10l-47 64
-c-15 22 -13 39 7 53c19 15 37 12 52 -10zM343 463c86 0 156 -70 156 -156c0 -85 -70 -154 -156 -154s-156 69 -156 154c0 86 70 156 156 156zM51 441l76 -24c25 -8 34 -23 26 -47c-7 -24 -24 -31 -50 -23l-74 24c-25 8 -34 24 -27 48c8 23 24 30 49 22zM560 417l75 24
-c26 8 42 1 49 -22c8 -24 -1 -40 -27 -47l-74 -25c-25 -8 -41 -1 -49 23c-7 24 1 39 26 47zM343 221c48 0 87 39 87 86c0 48 -39 87 -87 87s-86 -39 -86 -87c0 -47 38 -86 86 -86zM29 244l75 24c25 8 42 2 49 -22c8 -24 -1 -39 -26 -47l-76 -25c-25 -8 -41 -1 -49 23
-c-7 24 2 39 27 47zM583 268l75 -24c25 -8 34 -23 26 -47c-7 -24 -23 -31 -49 -23l-75 25c-26 8 -33 23 -26 47c8 24 24 30 49 22zM126 72l47 63c15 22 33 25 52 10c20 -14 22 -31 7 -53l-47 -63c-15 -22 -33 -26 -53 -12c-19 14 -21 33 -6 55zM514 135l46 -63
-c15 -22 13 -41 -6 -55s-38 -9 -53 11l-46 64c-15 22 -13 39 6 53c20 14 38 12 53 -10zM380 68v-79c0 -27 -12 -40 -37 -40s-37 13 -37 40v79c0 27 12 40 37 40s37 -13 37 -40z" />
- <glyph glyph-name="palette" unicode="palette" horiz-adv-x="768"
-d="M767 506c15 50 -112 130 -227 135c-223 9 -515 -108 -539 -365c-18 -206 194 -312 350 -312c157 0 306 121 322 187c16 68 -143 49 -132 157c16 153 204 125 226 198zM531 541c0 -26 -20 -46 -45 -46c-26 0 -46 20 -46 46c0 25 20 45 46 45c25 0 45 -20 45 -45zM407 517
-c0 -28 -22 -50 -49 -50s-49 22 -49 50c0 26 22 48 49 48s49 -22 49 -48zM288 452c0 -29 -22 -52 -51 -52c-28 0 -51 23 -51 52c0 27 23 49 51 49c29 0 51 -22 51 -49zM188 338c0 -29 -24 -53 -53 -53c-31 0 -55 24 -55 53c0 31 24 55 55 55c29 0 53 -24 53 -55zM463 146
-c0 -38 -32 -69 -71 -69c-38 0 -69 31 -69 69c0 39 31 72 69 72c39 0 71 -33 71 -72z" />
- <glyph glyph-name="refreshbutton" unicode="refreshbutton"
-d="M358 666c198 0 359 -161 359 -359s-161 -358 -359 -358s-358 160 -358 358s160 359 358 359zM198 298h-69c0 -60 23 -120 67 -165c90 -89 235 -89 325 0c89 90 89 236 0 325c-42 41 -94 63 -148 66v77l-175 -114l175 -113v82c37 -3 71 -18 99 -46c63 -62 63 -166 0 -228
-c-62 -63 -165 -63 -227 0c-33 31 -48 74 -47 116z" />
- <glyph glyph-name="sepia" unicode="sepia" horiz-adv-x="768"
-d="M49 257c-60 -42 -24 -95 26 -98c50 -4 92 -38 80 -79c-22 -70 -8 -128 106 -70c58 29 97 101 172 -30c44 -77 156 -26 141 62c-7 43 17 69 101 94c153 45 88 172 12 204s-87 87 -60 143c26 54 -48 141 -113 83c-52 -46 -117 -4 -118 12s-57 133 -90 34
-c-22 -63 13 -172 -181 -59c-123 72 -183 -113 -49 -178c63 -31 33 -77 -27 -118z" />
- <glyph glyph-name="download" unicode="download"
-d="M586 383h-129v211c0 18 -15 33 -33 33h-129c-19 0 -34 -15 -34 -33v-211h-129c-17 0 -23 -11 -10 -24l214 -213c6 -6 14 -9 23 -9s18 3 24 9l213 213c12 13 8 24 -10 24zM0 232v-228c0 -10 5 -16 16 -16h684c11 0 17 6 17 16v228c0 10 -8 17 -17 17h-65
-c-9 0 -17 -8 -17 -17v-145h-520v145c0 10 -7 17 -16 17h-66c-9 0 -16 -8 -16 -17z" />
- <glyph glyph-name="windows" unicode="windows" horiz-adv-x="768"
-d="M444 572l-73 -253s-83 58 -144 52c-60 -6 -141 -36 -141 -36l74 255s153 82 284 -18zM410 295l73 251c22 -15 61 -42 124 -50c63 -7 161 33 161 33l-73 -253c-11 -4 -57 -30 -141 -35c-85 -5 -144 54 -144 54zM0 36l73 255s82 38 151 33c68 -4 123 -42 134 -51l-73 -255
-s-84 55 -142 50s-109 -15 -143 -32zM324 -4l73 253s78 -51 129 -49c51 1 86 4 155 31h1c-5 -13 -73 -251 -73 -251s-80 -38 -154 -34c-73 3 -117 45 -131 50z" />
- <glyph glyph-name="emphasis" unicode="emphasis" horiz-adv-x="560"
-d="M525 111c0 0 34 -4 35 -4c-4 -43 -27 -110 -40 -132c-51 1 -143 2 -222 2h-125c-46 0 -101 -1 -173 -2v29l53 5c44 6 49 11 49 87v308c0 75 -5 80 -49 88l-30 4v29v0c45 -2 101 -3 147 -3h203c62 0 116 1 129 3c1 -13 7 -72 12 -127l-36 -4c-10 29 -23 53 -36 65
-c-18 15 -47 25 -94 25h-77c-31 0 -31 -1 -31 -32v-144c0 -24 1 -25 27 -25h66c50 0 61 6 71 45l5 21s35 0 35 -1c-2 -26 -3 -56 -3 -87c0 -32 1 -62 3 -88c0 -1 -36 -1 -35 -1l-5 21c-10 39 -21 46 -71 46h-66c-26 0 -27 -1 -27 -26v-98c0 -38 4 -64 15 -78
-c13 -15 31 -22 101 -22c83 0 116 3 169 96zM340 635c0 39 -31 70 -70 70c-38 0 -70 -31 -70 -70c0 -38 32 -70 70 -70c39 0 70 32 70 70z" />
- <glyph glyph-name="gree" unicode="gree" horiz-adv-x="618"
-d="M0 122l309 -172l309 172v356l-309 172l-309 -172v-356z" />
- <glyph glyph-name="gumroad" unicode="gumroad" horiz-adv-x="595"
-d="M85 88v382c0 20 23 43 42 43h310c14 -25 41 -43 73 -43c47 0 85 39 85 85c0 48 -38 85 -85 85c-32 0 -59 -17 -73 -42h-310c-31 0 -63 -15 -88 -39c-25 -25 -39 -57 -39 -89v-382c0 -32 14 -64 39 -89c25 -24 57 -39 88 -39h341c31 0 63 15 88 39c25 25 39 57 39 89v212
-c0 35 -14 68 -40 92c-24 23 -56 36 -87 36h-170c-34 0 -66 -14 -91 -40c-23 -24 -37 -56 -37 -88v-42c0 -32 14 -64 39 -88c25 -25 57 -40 89 -40h11c15 -25 42 -42 74 -42c47 0 85 38 85 85s-38 85 -85 85c-32 0 -59 -17 -74 -43h-11c-20 0 -43 24 -43 43v42
-c0 20 19 43 43 43h170c19 0 42 -19 42 -43v-212c0 -19 -23 -43 -42 -43h-341c-19 0 -42 24 -42 43z" />
- <glyph glyph-name="instagram" unicode="instagram" horiz-adv-x="680"
-d="M680 365v207c0 37 -31 68 -68 68h-544c-37 0 -68 -31 -68 -68v-207h165c26 71 95 122 175 122s149 -51 175 -122h165zM680 305h-153v-5c0 -103 -84 -187 -187 -187s-187 84 -187 187v5h-153v-277c0 -37 31 -68 68 -68h544c37 0 68 31 68 68v277zM59 580h34v-156h-34v156z
-M127 580h34v-156h-34v156zM195 580h34v-98c-11 -8 -23 -17 -34 -26v124zM340 172c71 0 127 57 127 128s-56 127 -127 127s-128 -56 -128 -127s57 -128 128 -128zM459 580h161v-156h-108c-14 21 -33 38 -53 52v104z" />
- <glyph glyph-name="jpa" unicode="jpa" horiz-adv-x="1547"
-d="M162 386c-3 0 -4 1 -6 2c-1 2 -1 4 -1 7s0 6 1 7c2 2 3 3 6 3c2 0 4 -1 5 -3c1 -1 2 -4 2 -7s-1 -5 -2 -7c-1 -1 -3 -2 -5 -2zM269 500c-1 0 -3 0 -4 1c-2 1 -3 4 -3 7c0 2 1 4 1 6c1 2 3 4 6 4s4 -1 5 -3s2 -4 2 -6c0 -3 -1 -5 -2 -7s-3 -2 -5 -2zM234 385
-c-1 0 -2 0 -3 1c0 0 -1 1 -1 3c0 1 1 2 2 3s2 1 4 1l2 1h2l1 1v-3c0 -3 -1 -5 -2 -6s-3 -1 -5 -1zM73 396h-11l5 16zM237 507h1c1 0 2 1 3 1h1v-2c0 -3 -1 -5 -2 -6c-2 -1 -3 -1 -5 -1h-3c0 1 -1 2 -1 3c0 2 1 3 2 4c1 0 2 1 4 1zM272 460c-1 -1 -2 -1 -4 -1h-8v12h8
-c2 0 3 -1 4 -2c2 0 2 -2 2 -4s0 -4 -2 -5zM299 461c2 0 3 0 5 -1c1 -1 2 -3 2 -5h-14c0 2 1 4 2 5s3 1 5 1zM299 405c2 0 4 -1 5 -3c1 -1 2 -4 2 -7s-1 -5 -2 -7c-1 -1 -3 -2 -5 -2c-3 0 -5 1 -6 2c-1 2 -2 4 -2 7s1 6 2 7c1 2 3 3 6 3zM374 542h868
-c169 0 305 -120 305 -267v-325h-1122c-168 0 -305 119 -305 266v98c-70 26 -120 88 -120 161c0 97 87 175 194 175c82 0 151 -45 180 -108zM325 524h-7v-30h8v16v5c1 2 3 3 6 3c2 0 3 -1 4 -2s1 -2 1 -4v-18h8v20c0 4 -1 7 -3 8c-2 2 -5 3 -8 3c-2 0 -4 -1 -6 -2l-3 -3v4z
-M336 402c1 -1 1 -2 1 -3v-19h8v21c0 3 -1 6 -3 8c-2 1 -5 2 -8 2c-2 0 -4 0 -6 -2c-1 0 -2 -2 -3 -3v4h-7v-30h8v17v4c1 2 3 4 6 4c2 0 3 -1 4 -3zM337 478v-41h8v41h-8zM324 467h-7v-30h8v14c0 3 0 5 1 6c1 2 3 3 6 3h1h1v8v0h-1c-2 0 -4 -1 -6 -2c0 -1 -2 -2 -3 -4v5z
-M303 518c1 -1 2 -2 2 -3s-1 -2 -2 -2s-2 -1 -3 -1h-3c-3 -1 -5 -1 -7 -2c-3 -2 -4 -4 -4 -8c0 -3 1 -5 3 -7c1 -1 4 -2 6 -2c3 0 5 0 6 1c2 1 3 2 4 3v-2c0 0 0 -1 1 -1h8v1s-1 0 -1 1v2v3v14c0 4 -2 6 -4 8c-3 1 -6 2 -9 2c-5 0 -9 -2 -11 -4c-1 -2 -2 -4 -2 -7h8
-c0 1 0 2 1 3c0 1 2 1 4 1h3zM295 443c-2 2 -3 4 -3 7h22v6c-1 2 -1 4 -3 6c-1 2 -3 4 -5 5s-4 1 -7 1c-4 0 -8 -1 -11 -4s-4 -7 -4 -12c0 -6 2 -10 5 -12c3 -3 6 -4 10 -4c5 0 9 1 12 4l3 6h-8c-1 -1 -1 -2 -2 -2c-1 -1 -3 -2 -4 -2c-2 0 -4 1 -5 1zM314 395c0 5 -1 8 -4 12
-c-2 3 -6 4 -11 4c-6 0 -10 -1 -12 -4c-3 -4 -4 -7 -4 -12c0 -4 1 -8 4 -11c2 -3 6 -5 12 -5c5 0 9 2 11 5c3 3 4 7 4 11zM262 524h-7v-42h8v16c0 -2 1 -3 2 -3c2 -1 4 -2 6 -2c4 0 7 1 10 4c2 3 3 7 3 12s-1 9 -4 12c-2 2 -5 4 -9 4c-2 0 -4 -1 -6 -2l-3 -3v4zM269 478h-17
-v-41h8v15h9c4 0 8 1 10 3s4 5 4 10c0 4 -2 8 -4 10s-6 3 -10 3zM271 421v-7h8v7h-8zM279 380v30h-8v-30h8zM264 386c-1 1 -1 1 -1 3v15h5v6h-5v9h-8v-9h-4v-6h4v-18c0 -2 1 -3 2 -4c1 -2 3 -2 7 -2h4v6h-1h-1h-2zM241 518c1 -1 1 -2 1 -3s0 -2 -2 -2c0 0 -1 -1 -3 -1h-2
-c-4 -1 -6 -1 -7 -2c-3 -2 -5 -4 -5 -8c0 -3 1 -5 3 -7c2 -1 4 -2 7 -2c2 0 4 0 6 1l3 3c0 0 0 -1 1 -2v-1h9v1c-1 0 -1 0 -1 1c-1 0 -1 1 -1 2v3v14c0 4 -1 6 -4 8c-2 1 -5 2 -9 2c-5 0 -8 -2 -11 -4c-1 -2 -2 -4 -2 -7h8c0 1 0 2 1 3s2 1 4 1h4zM227 396c-3 -1 -5 -4 -5 -8
-c0 -3 1 -5 3 -6c2 -2 4 -3 7 -3c2 0 4 1 6 2c1 1 2 2 4 3v-2v-2h9v1l-1 1c-1 1 -1 1 -1 2v4v14c0 3 -1 6 -4 7c-2 1 -5 2 -9 2c-5 0 -8 -1 -10 -4c-2 -2 -2 -4 -3 -6h8c0 1 1 2 1 2c1 1 2 2 4 2s3 0 4 -1c1 0 1 -1 1 -3c0 -1 0 -1 -1 -2h-4l-2 -1c-3 0 -6 -1 -7 -2zM202 509
-h-9v-1c0 -4 1 -8 3 -11s5 -4 11 -4c5 0 8 2 10 5c2 2 2 5 2 8v29h-8v-29c0 -2 -1 -3 -1 -4c-1 -2 -2 -2 -4 -2s-3 0 -3 2c-1 1 -1 3 -1 6v1zM211 421v-7h8v7h-8zM219 380v30h-8v-30h8zM183 407c-2 -3 -4 -7 -4 -12s2 -9 4 -12c2 -2 6 -4 11 -4c4 0 8 2 11 5c1 2 2 5 2 7h-8
-c0 -1 -1 -3 -1 -4c-1 -1 -2 -1 -4 -1c-3 0 -5 1 -6 4v5v5c1 3 3 4 6 4c2 0 3 0 4 -1s1 -2 1 -3h8c0 4 -2 7 -4 9c-2 1 -6 2 -9 2c-5 0 -8 -1 -11 -4zM150 407c-2 -4 -4 -7 -4 -12c0 -4 2 -8 4 -11c3 -3 7 -5 12 -5s9 2 11 5c3 3 4 7 4 11c0 5 -1 8 -4 12c-2 3 -6 4 -11 4
-s-9 -1 -12 -4zM75 389l2 -9h10l-15 41h-9l-15 -41h9l3 9h15zM112 382c2 2 3 4 3 7s-1 4 -2 6c-2 1 -4 3 -7 3c-5 1 -8 2 -9 3c-1 0 -1 1 -1 2c0 0 0 1 1 1c1 1 2 1 4 1s3 0 4 -1s1 -2 1 -3h8c0 4 -2 6 -4 8s-5 2 -9 2s-7 -1 -10 -3c-2 -2 -3 -4 -3 -7c0 -2 1 -4 2 -5
-c2 -2 4 -3 8 -4s7 -2 8 -2s1 -1 1 -2s-1 -2 -1 -2c-1 -1 -3 -1 -4 -1c-3 0 -5 1 -6 2c0 0 -1 1 -1 3h-8c0 -3 1 -6 4 -8c2 -2 5 -3 10 -3s8 1 11 3zM141 382c2 2 4 4 4 7s-1 4 -3 6c-1 1 -4 3 -7 3c-5 1 -7 2 -8 3c-1 0 -1 1 -1 2c0 0 0 1 1 1c1 1 2 1 3 1c3 0 4 0 5 -1
-c0 -1 1 -2 1 -3h8c-1 4 -2 6 -4 8c-3 2 -6 2 -10 2s-7 -1 -9 -3s-3 -4 -3 -7c0 -2 1 -4 2 -5c1 -2 4 -3 7 -4c5 -1 8 -2 8 -2c1 0 2 -1 2 -2s-1 -2 -2 -2c-1 -1 -2 -1 -4 -1s-4 1 -5 2c-1 0 -1 1 -1 3h-8c0 -3 1 -6 3 -8c3 -2 6 -3 11 -3s8 1 10 3zM425 -25h1097v300
-c0 134 -125 242 -280 242h-859c4 -13 6 -27 6 -42c0 -96 -87 -175 -195 -175c-17 0 -33 2 -49 6v-90c0 -133 126 -241 280 -241zM299 507h2c1 0 2 1 2 1h2v-2c0 -3 -1 -5 -3 -6c-1 -1 -3 -1 -4 -1h-3c-1 1 -1 2 -1 3c0 2 0 3 2 4c0 0 2 1 3 1zM1153 475h69
-c139 0 251 -93 251 -207v-254h-64v244c0 86 -91 156 -202 156h-54v-166h192v-64h-192v-170h-64v461h64zM459 75h55v400h64v-461h-64h-70c-138 0 -251 93 -251 208v22h67v-17c0 -84 89 -152 199 -152zM704 475h144c57 0 107 -25 141 -64c25 -30 41 -68 41 -110
-s-16 -80 -41 -110c-34 -39 -84 -64 -141 -64h-80v18v46h62h26c58 6 103 53 103 110s-45 104 -103 110h-26h-123h-3v-4v-212v-4v-64v-113h-64v113v64v220v64h64z" />
- <glyph glyph-name="mobage" unicode="mobage" horiz-adv-x="700"
-d="M654 418c115 142 -22 252 -22 252s34 -107 -55 -147c-61 57 -144 91 -234 91c-189 0 -343 -153 -343 -341c0 -190 154 -343 343 -343c190 0 344 153 344 343c0 51 -12 101 -33 145zM556 212c-27 -92 -111 -159 -213 -159c-121 0 -220 98 -220 220c0 99 66 182 157 210
-c-6 -20 -9 -40 -9 -62c0 -121 98 -219 220 -219c22 0 44 3 65 10z" />
- <glyph glyph-name="strike" unicode="strike" horiz-adv-x="700"
-d="M0 331h700v-62h-700v62zM370 395l64 -34h-255c-18 27 -29 60 -29 97c-1 116 89 195 237 195c33 0 75 -4 116 -16c13 -4 23 -6 35 -8c8 -23 18 -78 18 -146c0 0 -39 -3 -40 -3c-17 52 -61 126 -134 126c-68 0 -104 -44 -104 -95c0 -47 41 -89 92 -116zM443 97
-c0 66 -50 111 -102 142h223c11 -24 18 -52 18 -85c0 -126 -103 -207 -258 -207c-93 0 -152 26 -173 38c-20 23 -33 96 -33 166l39 3c20 -66 89 -160 176 -160c75 0 110 52 110 103z" />
- <glyph glyph-name="yapcasia" unicode="yapcasia" horiz-adv-x="800"
-d="M65 -47h6v45h12v6h-30v-6h12v-45zM170 -22c0 15 -12 27 -26 27s-26 -12 -26 -27s11 -26 26 -26c14 0 26 11 26 26zM164 -22c0 -11 -9 -20 -20 -20s-20 9 -20 20s8 21 20 21s20 -10 20 -21zM245 4h-8l-21 -22v22h-7v-51h7v21l2 3l19 -24h8l-22 28zM285 4h-8l17 -29v-22h6
-v22l16 29h-7l-12 -22zM403 -22c0 15 -12 27 -26 27c-15 0 -27 -12 -27 -27s12 -26 27 -26c14 0 26 11 26 26zM397 -22c0 -11 -10 -20 -20 -20c-11 0 -20 9 -20 20s8 21 20 21c11 0 20 -10 20 -21zM506 -47v6h-20l17 20c2 3 3 7 3 10c0 9 -7 16 -15 16c-9 0 -15 -7 -16 -15h6
-c0 5 5 9 10 9s9 -5 9 -10c0 -3 -2 -6 -4 -9l-22 -27h32zM596 -22c0 15 -11 27 -26 27c-14 0 -26 -12 -26 -27s12 -26 26 -26c15 0 26 11 26 26zM590 -22c0 -11 -9 -20 -20 -20s-20 9 -20 20s8 21 20 21s20 -10 20 -21zM639 4l-4 -6h9v-45h6v51h-11zM731 -47v6h-20l17 20
-c2 3 3 7 3 10c0 9 -7 16 -16 16s-14 -7 -15 -15h6c0 5 4 9 9 9c6 0 10 -5 10 -10c0 -3 -2 -6 -4 -9l-22 -27h32zM497 97h-22l11 33zM795 78c4 -4 5 -9 5 -14c0 -4 -1 -10 -6 -14c-4 -4 -9 -5 -14 -5h-23c-5 1 -10 1 -14 5c-2 1 -3 2 -3 3l-3 -3c-5 -4 -10 -5 -14 -5h-20
-c-4 0 -8 1 -13 4c-4 -3 -8 -4 -12 -4h-45c-5 0 -10 1 -15 5c-1 1 -1 2 -2 3c-9 -7 -20 -10 -33 -10c-5 0 -10 0 -14 1c-3 0 -5 1 -7 1v0c-4 -2 -7 -2 -10 -2c-4 0 -9 1 -14 5v0c-4 -2 -8 -3 -12 -3h-23c-4 1 -9 1 -14 5l-3 3l-3 -3c-4 -4 -9 -5 -14 -5h-20c-5 1 -10 1 -14 5
-c-3 3 -5 6 -6 10c-3 -1 -6 -2 -9 -2v0c-7 0 -13 3 -18 7v0h-1c-5 -4 -12 -7 -18 -7h-1c-5 0 -11 2 -15 5c-1 -1 -2 -3 -4 -5c-3 -3 -7 -6 -12 -8c-9 -5 -20 -7 -31 -7h-1c-15 0 -29 6 -39 17c-7 7 -12 17 -14 27c-7 -5 -16 -8 -26 -9v0c5 -4 6 -9 6 -14c0 -4 -1 -10 -6 -14
-c-4 -4 -9 -5 -14 -5h-26c-4 0 -8 1 -13 4c-4 -3 -8 -4 -12 -4h-23c-5 1 -10 1 -14 5c-2 1 -3 2 -3 3l-3 -3c-5 -4 -10 -5 -15 -5h-19c-5 1 -9 1 -14 4c-4 -3 -8 -4 -13 -4h-40c-4 0 -9 1 -14 5c-4 4 -5 10 -5 14c0 5 1 10 5 14c5 4 10 5 14 5v4l-18 33c-3 1 -6 2 -8 5
-c-4 4 -5 9 -5 13c0 5 1 10 6 14c4 4 9 5 14 5h20c4 0 8 -1 12 -4c4 3 9 4 13 4h17c5 0 10 -1 14 -5h1h1c4 4 9 5 14 5h29c4 0 8 -1 12 -4c3 -3 6 -6 7 -10c0 0 0 -1 1 -1l21 -60c2 -1 4 -1 5 -3c1 1 2 1 3 2v41c-2 0 -4 2 -5 3c-4 4 -5 9 -5 13c0 5 1 10 6 14c4 4 9 5 14 5
-h32c13 0 25 -2 34 -9c4 -3 7 -7 9 -11c2 2 3 4 5 6c10 11 24 17 39 17c5 0 9 -1 14 -2c2 0 4 -1 6 -2v1c3 2 7 3 10 3c4 0 9 -2 13 -6c3 -4 4 -7 4 -11c5 4 11 6 17 6s13 -2 18 -7v0h1c5 5 12 7 18 7c7 0 14 -2 19 -7c2 -2 3 -4 5 -7v3c0 5 1 10 5 14c5 4 10 5 15 5h28
-c4 0 9 -1 12 -4c4 -3 6 -6 8 -10v-1l21 -58c0 3 1 7 5 11c1 1 3 2 4 3c-5 6 -7 14 -7 22c0 11 5 22 13 29c9 7 20 11 32 11c5 0 9 -1 13 -2c2 0 3 -1 5 -1v0c4 2 7 3 10 3c4 -1 8 -1 13 -6c4 2 8 3 12 3h45c5 0 10 -1 15 -5c3 -2 4 -6 5 -9c0 4 2 7 5 9c5 4 10 5 14 5h29
-c4 0 9 -1 12 -4c4 -3 6 -6 7 -10l1 -1l21 -60c3 -1 6 -2 8 -4zM79 58c1 1 2 3 2 6s-1 5 -2 7c-2 1 -4 1 -8 1h-10v19l21 39h1c3 0 5 1 6 2c2 1 3 4 3 6c0 3 -1 6 -3 7c-1 1 -3 2 -7 2h-17c-4 0 -6 -1 -7 -2s-2 -4 -2 -7c0 -2 1 -5 2 -6s3 -2 5 -2h1l-12 -25l-12 25h1
-c3 0 4 1 6 2c1 1 1 4 1 6c0 3 0 6 -2 7c-1 1 -3 2 -6 2h-20c-4 0 -6 -1 -8 -2c-1 -1 -2 -4 -2 -7c0 -2 1 -5 2 -6c2 -1 4 -2 6 -2h2l22 -41v-17h-11c-3 0 -6 0 -7 -1c-1 -2 -2 -4 -2 -7s1 -5 2 -6c2 -2 4 -2 7 -2h40c4 0 6 0 8 2zM72 89v-6c4 0 8 -1 12 -4l6 3l14 39
-c-2 0 -4 1 -6 3l-1 1v0c-3 -3 -6 -4 -8 -5zM182 58c2 1 3 3 3 6s-1 5 -2 6c-2 2 -4 2 -7 2h-1l-24 67v0c-2 5 -6 8 -10 8h-29c-3 0 -6 -1 -7 -2c-2 -1 -3 -4 -3 -7s1 -5 3 -6c1 -1 4 -2 7 -2h6l-20 -58h-2c-2 0 -5 0 -6 -2c-1 -1 -2 -3 -2 -6s1 -5 2 -6c2 -2 4 -2 8 -2h19
-c4 0 6 0 8 2c1 1 2 3 2 6s-1 5 -2 7c-2 1 -4 1 -8 1h-2l3 9h33l3 -9h-2c-4 0 -6 0 -8 -1c-1 -2 -2 -4 -2 -7s1 -5 2 -6c2 -2 4 -2 8 -2h23c3 0 6 0 7 2zM260 96c7 5 10 12 10 22s-3 17 -10 22c-6 4 -16 7 -28 7h-32c-3 0 -6 -1 -7 -2c-2 -2 -3 -4 -3 -7c0 -2 1 -5 3 -6
-c1 -1 3 -2 6 -2h1v-58h-1c-3 0 -5 0 -7 -2c-1 -1 -2 -3 -2 -6s1 -5 3 -6c1 -2 3 -2 7 -2h26c4 0 6 0 8 2c1 1 2 3 2 6s-1 5 -2 7c-2 1 -4 1 -8 1h-7v16h13c12 0 22 3 28 8zM409 135c-3 -3 -5 -6 -5 -11c0 -4 2 -8 5 -10c3 -3 7 -4 11 -4c5 0 9 1 12 4c3 2 4 6 4 10
-c0 5 -1 8 -4 11c-3 2 -7 4 -12 4s-8 -2 -11 -4zM371 135c-3 -3 -4 -6 -4 -11c0 -4 1 -8 4 -10c3 -3 7 -4 12 -4s8 1 11 4c3 2 5 6 5 10c0 5 -2 8 -5 11c-3 2 -6 4 -11 4s-9 -2 -12 -4zM347 59c8 4 12 8 12 13c0 2 -1 5 -2 6c-2 2 -3 3 -5 3s-6 -2 -13 -6
-c-6 -3 -12 -5 -17 -5c-8 0 -14 3 -19 8c-4 6 -6 13 -6 23s2 18 6 23c4 6 10 8 18 8c6 0 10 -1 13 -3c2 -2 5 -5 6 -10c1 -3 2 -5 3 -6s3 -1 5 -1c3 0 5 0 6 1c1 2 2 4 2 8v20c0 3 -1 5 -2 6c-1 2 -3 2 -5 2s-3 0 -4 -1s-2 -2 -3 -4c-4 2 -8 3 -12 4c-3 1 -7 1 -11 1
-c-12 0 -23 -4 -32 -13c-8 -9 -12 -21 -12 -35s4 -26 12 -34c9 -9 19 -14 33 -14c10 0 19 2 27 6zM364 101c1 1 2 2 4 3c-2 0 -3 1 -4 2c0 1 -1 1 -1 2c-1 -1 -1 -1 -1 -2c-5 -4 -10 -5 -14 -5s-8 1 -12 4c-4 4 -5 7 -6 11s-2 5 -3 5c0 0 -2 1 -6 1c-5 0 -7 -1 -10 -4
-c-2 -3 -4 -8 -4 -17c0 -8 2 -14 4 -16c3 -3 5 -5 11 -5c3 0 7 1 12 4c4 2 7 4 9 5c3 1 4 2 9 2c2 0 4 0 6 -1c1 4 3 8 6 11zM394 73c3 2 5 6 5 10c0 5 -2 8 -5 11c-3 2 -6 4 -11 4s-9 -2 -12 -4c-3 -3 -4 -7 -4 -11s1 -7 4 -10s7 -4 12 -4s8 1 11 4zM402 101v0l3 3
-c-1 0 -2 1 -3 2v0h-1c-1 -1 -2 -2 -3 -2l3 -3h1zM432 73c3 2 4 6 4 10c0 5 -1 8 -4 11c-3 2 -7 4 -12 4c-4 0 -8 -2 -11 -4c-3 -3 -5 -7 -5 -11s2 -7 5 -10s7 -4 11 -4c5 0 9 1 12 4zM435 104c2 -1 3 -2 4 -3c3 -2 5 -6 6 -10l11 30c-3 0 -5 1 -7 3c-1 1 -2 3 -3 4v-4
-c0 -6 -2 -13 -7 -18c-1 -1 -2 -2 -4 -2zM534 58c1 1 2 3 2 6s-1 5 -2 6c-1 2 -4 2 -6 2h-2l-24 67v0c-2 5 -5 8 -10 8h-28c-4 0 -6 -1 -8 -2c-1 -1 -2 -4 -2 -7s1 -5 2 -6c2 -1 4 -2 8 -2h6l-21 -58h-1c-3 0 -5 0 -7 -2c-1 -1 -2 -3 -2 -6s1 -5 3 -6c1 -2 4 -2 7 -2h20
-c3 0 6 0 7 2c2 1 3 3 3 6s-1 5 -3 7c-1 1 -4 1 -7 1h-3l4 9h33l3 -9h-3c-3 0 -6 0 -7 -1c-2 -2 -3 -4 -3 -7s1 -5 3 -6c1 -2 4 -2 7 -2h23c4 0 6 0 8 2zM610 61c7 5 10 12 10 22c0 7 -2 13 -7 18c-4 4 -11 7 -21 10c-1 0 -3 0 -5 1c-13 2 -20 6 -20 11c0 3 2 6 4 8
-c3 2 7 3 12 3c3 0 6 -1 9 -2c3 -2 5 -4 7 -7v-2c2 -4 5 -6 8 -6s5 1 7 2c1 1 1 3 1 7v0v15c0 3 -1 6 -1 7c-1 1 -3 1 -6 1c-2 0 -4 0 -5 -1c-1 0 -1 -1 -2 -3c-4 2 -7 3 -10 3c-4 1 -7 1 -11 1c-10 0 -19 -2 -25 -8c-7 -6 -10 -13 -10 -21c0 -7 2 -13 6 -17s11 -7 20 -9
-c3 -1 5 -2 9 -2c12 -3 18 -7 18 -13c0 -3 -2 -6 -4 -8c-3 -2 -7 -3 -11 -3c-5 0 -10 1 -13 3c-4 2 -7 5 -9 9c0 0 0 1 -1 2c-2 5 -5 8 -8 8s-6 -1 -7 -2c-1 -2 -2 -4 -2 -7v-1v-18c1 -4 1 -6 3 -7c1 -1 3 -2 6 -2c2 0 4 1 5 1l3 3c3 -1 7 -2 10 -3c4 0 8 -1 13 -1
-c12 0 21 3 27 8zM571 83l3 -3c2 -1 5 -2 9 -2c1 0 3 0 3 1c-1 0 -4 2 -8 3c-3 0 -5 1 -7 1zM588 122l-1 1c-1 1 -2 1 -4 1h-3c3 -1 5 -2 8 -2zM618 110c1 -1 2 -1 2 -2c7 -7 10 -16 10 -25v0h3h2v37h-2c-3 0 -5 0 -8 1c0 -3 -2 -6 -4 -9c-1 -1 -2 -1 -3 -2zM686 58
-c1 1 2 3 2 6s-1 5 -2 7c-2 1 -4 1 -8 1h-13v58h13c4 0 6 1 8 2c1 1 2 3 2 6s-1 5 -2 7c-2 1 -4 2 -8 2h-45c-4 0 -6 -1 -8 -2c-1 -2 -2 -4 -2 -7s1 -5 2 -6c2 -1 4 -2 8 -2h13v-58h-13c-4 0 -6 0 -8 -1c-1 -2 -2 -4 -2 -7s1 -5 2 -6c2 -2 4 -2 8 -2h45c4 0 6 0 8 2zM676 83
-h2c4 0 8 -1 13 -3c1 1 3 1 4 2l14 39c-2 0 -4 1 -6 3c-3 3 -5 6 -5 9c-1 -3 -2 -6 -5 -9c-5 -4 -10 -4 -15 -4h-2v-37zM788 58c1 1 2 3 2 6s-1 5 -2 6c-2 2 -4 2 -7 2h-1l-24 67v0c-2 5 -5 8 -10 8h-29c-3 0 -6 -1 -7 -2c-2 -1 -3 -4 -3 -7s1 -5 3 -6c1 -1 4 -2 7 -2h6
-l-20 -58h-2c-2 0 -4 0 -6 -2c-1 -1 -2 -3 -2 -6s1 -5 2 -6c2 -2 4 -2 8 -2h20c3 0 6 0 7 2c2 1 2 3 2 6s0 5 -2 7c-1 1 -4 1 -7 1h-3l3 9h33l4 -9h-3c-4 0 -6 0 -8 -1c-1 -2 -2 -4 -2 -7s1 -5 2 -6c2 -2 4 -2 8 -2h23c4 0 6 0 8 2zM751 97h-22l11 33zM243 127
-c3 -2 5 -5 5 -9s-2 -7 -5 -9s-7 -3 -14 -3h-10v24h10c6 0 11 -1 14 -3zM237 117v1v0v0c0 1 -3 2 -8 2v0v-4v0c5 0 8 1 8 1zM146 97h-23l12 33zM573 406c0 -63 -34 -119 -85 -149l10 -40c1 -5 -1 -11 -4 -16c-4 -4 -9 -7 -15 -7h-43c-2 0 -4 0 -6 1c-2 -1 -5 -1 -7 -1h-46
-c-2 0 -4 0 -7 1c-2 -1 -4 -1 -6 -1h-43c-6 0 -11 3 -15 7c-3 5 -5 11 -3 16l9 40c-51 30 -85 86 -85 149c0 86 62 158 145 171l8 55c2 9 10 16 19 16c10 0 18 -7 19 -16l9 -55c83 -12 146 -84 146 -171zM481 457h-162l29 -51h104zM407 579l-8 50l-8 -50l-4 -27h24zM424 512
-l14 27h-76l14 -27v0l-6 -42h60l-6 42v0zM321 213h43l2 23l13 156h-17l-33 -144zM379 234l-2 -21h46l-2 21l-13 158h-16zM436 213h43l-8 35l-33 144h-17l13 -156z" />
- <glyph glyph-name="yapcasialogo" unicode="yapcasialogo" horiz-adv-x="2671"
-d="M612 274c0 -112 -61 -209 -150 -263l16 -70c2 -10 0 -20 -7 -28c-6 -8 -16 -13 -26 -13h-75c-4 0 -8 1 -12 2c-4 -1 -8 -2 -12 -2h-81c-4 0 -8 1 -11 2c-4 -1 -8 -2 -12 -2h-75c-11 0 -20 5 -27 13c-6 8 -8 18 -6 28l16 70c-90 54 -150 151 -150 263
-c0 152 111 278 256 302l15 96c3 16 17 28 33 28c17 0 31 -12 33 -28l16 -96c146 -23 259 -149 259 -302zM448 363h-284l50 -90h183zM318 579l-14 87l-13 -87l-8 -48h43zM348 461l25 47h-135l25 -47v0l-10 -75h106l-10 75h-1zM167 -66h75l3 40l24 274h-31l-57 -253zM268 -29
-l-3 -37h81l-3 37l-24 277h-27zM370 -66h75l-14 61l-58 253h-30l23 -274zM829 31h15v107h28v14h-72v-14h29v-107zM1083 92c0 34 -29 63 -64 63c-34 0 -63 -29 -63 -63c0 -36 28 -64 63 -64s64 28 64 64zM1068 92c0 -28 -22 -49 -49 -49c-26 0 -48 21 -48 49c0 26 20 48 48 48
-c29 0 49 -22 49 -48zM1264 152h-20l-51 -52v52h-15v-121h15v51l6 5l46 -56h20l-55 67zM1359 152h-17l40 -68v-53h15v53l39 68h-17l-30 -52zM1645 92c0 34 -29 63 -63 63c-35 0 -64 -29 -64 -63c0 -36 29 -64 64 -64s63 28 63 64zM1630 92c0 -28 -22 -49 -48 -49
-s-49 21 -49 49c0 26 20 48 49 48c28 0 48 -22 48 -48zM1896 31v14h-49l40 48c5 7 9 16 9 25c0 21 -18 37 -38 37c-22 0 -36 -15 -39 -36h15c1 12 11 22 24 22c12 0 23 -11 23 -23c0 -8 -5 -16 -10 -22l-53 -65h78zM2113 92c0 34 -28 63 -63 63s-63 -29 -63 -63
-c0 -36 28 -64 63 -64s63 28 63 64zM2098 92c0 -28 -22 -49 -48 -49s-48 21 -48 49c0 26 20 48 48 48s48 -22 48 -48zM2215 152l-8 -14h21v-107h14v121h-27zM2439 31v14h-49l40 48c6 7 9 16 9 25c0 21 -17 37 -38 37c-22 0 -36 -15 -38 -36h15c1 12 11 22 23 22
-c13 0 24 -11 24 -23c0 -8 -6 -16 -11 -22l-53 -65h78zM1235 395c8 -5 12 -13 12 -23c0 -11 -4 -19 -12 -24c-7 -5 -19 -8 -35 -8h-28v63h28c15 0 27 -3 35 -8zM1221 370v2v1h-1c-1 1 -8 4 -20 4h-2v-10h2c13 -1 20 2 21 3zM2658 268c10 -10 13 -23 13 -34
-c0 -12 -3 -27 -15 -37s-25 -11 -37 -12h-59c-12 1 -25 2 -37 12c-3 3 -6 6 -8 9c-1 -3 -4 -6 -7 -9c-12 -10 -25 -11 -37 -12h-51c-10 1 -21 2 -32 8c-10 -6 -21 -8 -31 -8h-118c-12 1 -24 2 -36 12c-3 2 -5 4 -6 7c-23 -18 -53 -25 -86 -25c-13 0 -26 1 -37 3
-c-5 1 -11 2 -16 3h-2c-8 -5 -16 -6 -24 -6c-11 0 -23 1 -35 12l-1 1c-10 -6 -21 -7 -30 -7h-60c-12 1 -25 2 -37 12c-3 3 -5 6 -7 9c-2 -3 -5 -6 -8 -9c-12 -10 -25 -11 -37 -12h-51c-12 1 -24 2 -37 12c-8 8 -12 17 -13 26c-8 -3 -16 -4 -24 -4h-1c-17 0 -34 6 -47 17v1
-s-1 0 -1 -1c-13 -12 -30 -17 -48 -17v0c-15 0 -29 4 -41 13c-3 -5 -6 -9 -9 -13c-9 -9 -19 -15 -31 -22c-24 -12 -52 -18 -81 -18h-1c-40 0 -76 15 -102 43c-19 20 -30 44 -36 72c-18 -14 -41 -21 -66 -24h1c11 -11 14 -25 14 -36c0 -12 -3 -26 -14 -36
-c-12 -11 -25 -13 -37 -13h-68c-10 0 -22 2 -32 9c-11 -7 -22 -9 -32 -9h-60c-12 1 -25 2 -37 12c-3 3 -5 6 -7 9c-2 -3 -5 -6 -8 -9c-12 -10 -25 -11 -36 -12h-52c-11 1 -22 2 -34 10c-11 -8 -22 -10 -33 -10h-103c-12 0 -25 2 -37 12c-11 11 -14 25 -14 37c0 11 2 25 14 36
-c12 10 25 11 36 11v10l-46 87c-8 2 -15 6 -21 12c-10 10 -13 24 -13 35s2 25 14 36c12 10 25 12 37 12h51c10 0 22 -2 32 -10c11 9 22 10 32 10h45c12 0 25 -1 37 -12l2 -2c0 1 1 2 2 2c12 10 25 12 37 12h74c10 0 22 -3 31 -10s15 -16 18 -26c1 -1 1 -2 1 -3l57 -155
-c4 -1 9 -3 13 -6l6 3v106c-5 2 -9 5 -12 8c-10 10 -13 24 -13 35s3 26 14 36c12 10 25 12 37 12h82c35 0 66 -6 89 -24c10 -7 18 -17 24 -27c3 4 7 9 11 14c26 29 63 44 102 44c12 0 23 -2 34 -4c5 -1 10 -3 15 -5c1 0 1 1 1 1c8 5 17 8 26 8c10 0 25 -4 34 -16
-c7 -9 9 -18 10 -27c12 10 28 15 43 15c17 0 35 -5 48 -17c0 -1 0 -1 1 -1v1c13 12 31 17 48 17s35 -5 47 -17c6 -5 10 -11 14 -18c-1 3 -1 5 -1 8c0 12 3 26 15 36s25 12 37 12h74c10 0 22 -3 31 -10s15 -16 18 -26c1 -1 1 -2 1 -3l55 -150c1 9 3 19 12 28c3 4 7 7 11 8
-c-13 16 -19 36 -19 56c0 30 13 57 35 76s51 28 83 28c11 0 22 -2 32 -4c4 -1 9 -2 13 -3v0c10 6 18 6 26 7c10 -1 22 -1 34 -14c10 6 20 6 29 7h118c12 -1 25 -1 37 -12c8 -7 12 -15 13 -24c2 9 6 17 14 24c12 10 24 12 36 12h75c10 0 22 -3 31 -10s15 -16 18 -26
-c1 -1 1 -2 1 -3l57 -155c6 -2 13 -5 19 -11zM812 217c4 3 6 9 6 17c0 7 -2 13 -6 16s-10 5 -19 5h-26v49l53 99h3c7 0 13 2 16 5c4 4 6 10 6 17c0 8 -2 13 -6 17c-4 3 -10 5 -19 5h-45c-8 0 -13 -2 -16 -5c-4 -4 -5 -9 -5 -17c0 -7 1 -13 4 -17c3 -3 8 -5 14 -5h1l-30 -65
-l-31 65h3c6 0 11 2 14 6c3 3 4 9 4 16c0 8 -1 13 -5 17c-3 3 -9 5 -17 5h-51c-9 0 -16 -2 -19 -5c-4 -4 -6 -9 -6 -17c0 -7 2 -13 5 -17c4 -3 9 -5 16 -5h4l56 -105v-43h-26c-9 0 -16 -2 -19 -5c-4 -3 -6 -9 -6 -16c0 -8 2 -14 6 -17c4 -4 10 -5 19 -5h103c8 0 15 1 19 5z
-M793 297v-16c11 0 22 -1 33 -9c5 3 10 6 15 7l36 100c-5 2 -11 5 -16 9c-1 1 -2 2 -2 3c-1 0 -1 -1 -1 -1c-6 -6 -14 -10 -21 -12zM1079 217c4 3 6 9 6 17c0 7 -2 12 -6 16c-3 3 -9 5 -16 5h-3l-63 172v1c-5 12 -13 19 -25 19h-74c-9 0 -16 -2 -20 -5c-4 -4 -6 -9 -6 -17
-s2 -14 6 -17s11 -5 20 -5h16l-54 -148h-3c-7 0 -13 -2 -16 -5c-4 -4 -6 -9 -6 -16c0 -8 2 -14 6 -17c4 -4 10 -5 19 -5h52c8 0 15 1 19 5c4 3 6 9 6 17c0 7 -2 13 -6 16s-11 5 -19 5h-7l8 23h86l8 -23h-7c-9 0 -16 -2 -19 -5c-4 -3 -6 -9 -6 -16c0 -8 2 -14 6 -17
-c3 -4 10 -5 19 -5h60c9 0 15 1 19 5zM1279 315c17 13 25 33 25 58c0 24 -8 43 -25 55c-16 13 -41 19 -73 19h-82c-9 0 -15 -2 -19 -6c-4 -3 -6 -9 -6 -16s2 -13 6 -16c4 -4 9 -6 15 -6h4v-148h-4c-6 0 -12 -2 -15 -5c-4 -4 -6 -9 -6 -16c0 -8 2 -14 6 -17c4 -4 10 -5 19 -5
-h68c9 0 15 1 19 5c3 3 5 9 5 17c0 7 -2 13 -5 16c-4 3 -10 5 -19 5h-20v41h34c32 0 57 6 73 19zM1662 415c-8 -7 -11 -15 -11 -26c0 -12 3 -21 11 -28s18 -10 30 -10s22 3 30 10c7 7 11 16 11 28c0 11 -4 19 -11 26c-8 7 -18 10 -30 10s-22 -3 -30 -10zM1566 415
-c-8 -7 -12 -15 -12 -26c0 -12 4 -21 12 -28c7 -7 17 -10 29 -10c13 0 23 3 30 10c8 7 11 16 11 28c0 11 -3 19 -11 26c-7 7 -17 10 -30 10c-12 0 -22 -3 -29 -10zM1503 221c20 10 30 21 30 33c0 6 -1 12 -5 16s-8 7 -13 7c-4 0 -15 -5 -32 -14c-16 -9 -32 -14 -46 -14
-c-20 0 -35 7 -47 21c-11 14 -16 33 -16 59s5 46 16 60s27 21 47 21c13 0 24 -3 31 -9c8 -5 13 -14 17 -27c2 -7 4 -12 7 -14c3 -3 8 -4 13 -4c8 0 14 1 16 4c3 4 5 10 5 19v51c0 9 -2 15 -5 18c-2 4 -7 5 -13 5c-5 0 -8 -1 -11 -3s-5 -5 -8 -10c-10 5 -20 8 -29 10
-s-18 3 -28 3c-33 0 -61 -11 -82 -35c-22 -24 -33 -53 -33 -89c0 -37 11 -66 32 -89c22 -23 50 -35 84 -35c26 0 49 6 70 16zM1548 329c3 2 5 4 8 6c-3 2 -6 4 -8 7c-2 1 -3 3 -4 5c-1 -2 -2 -3 -3 -5c-12 -11 -25 -12 -36 -13c-9 0 -21 3 -30 11c-9 9 -12 17 -16 27
-c-2 10 -5 12 -6 13s-6 3 -16 3c-15 0 -20 -3 -26 -10s-11 -21 -11 -44c0 -22 5 -36 11 -43s12 -10 26 -11c8 0 20 3 34 11c8 5 16 8 22 11c7 3 11 5 22 6c5 0 10 -1 15 -3c3 11 9 22 18 29zM1625 256c8 7 12 16 12 27s-4 20 -12 27c-7 6 -17 10 -30 10c-12 0 -22 -4 -29 -11
-c-8 -6 -12 -15 -12 -26s4 -20 12 -27c7 -7 17 -11 29 -11c13 0 23 4 30 11zM1644 328c0 1 0 1 1 1c2 2 5 4 8 6c-3 2 -6 4 -9 7v1l-1 -1c-3 -2 -5 -5 -8 -7c3 -1 5 -4 8 -6c0 0 1 0 1 -1zM1722 256c8 7 11 16 11 27s-3 20 -11 27c-8 6 -18 10 -30 10s-22 -4 -30 -11
-c-8 -6 -11 -15 -11 -26s3 -20 11 -27s18 -11 30 -11s22 4 30 11zM1731 335c3 -1 6 -3 8 -6c8 -6 14 -15 17 -25l27 75c-5 2 -11 5 -16 9c-4 4 -7 7 -9 11c1 -3 1 -7 1 -10c1 -17 -6 -35 -19 -47c-3 -2 -6 -5 -9 -7zM1985 217c4 3 6 9 6 17c0 7 -2 12 -6 16c-4 3 -9 5 -16 5
-h-3l-63 172v1c-5 12 -13 19 -25 19h-74c-9 0 -16 -2 -20 -5c-4 -4 -6 -9 -6 -17s2 -14 6 -17s11 -5 20 -5h15l-53 -148h-3c-7 0 -13 -2 -16 -5c-4 -4 -6 -9 -6 -16c0 -8 2 -14 6 -17c4 -4 10 -5 19 -5h52c8 0 15 1 19 5c4 3 6 9 6 17c0 7 -2 13 -6 16s-11 5 -19 5h-7l8 23
-h86l8 -23h-7c-9 0 -16 -2 -20 -5c-3 -3 -5 -9 -5 -16c0 -8 2 -14 5 -17c4 -4 11 -5 20 -5h60c9 0 15 1 19 5zM2182 225c16 13 25 32 25 56c0 20 -6 36 -18 47c-11 11 -29 20 -55 25c-3 1 -7 2 -13 3c-34 7 -50 17 -50 29c0 8 3 15 11 21c7 5 16 8 28 8c10 0 18 -2 25 -6
-s13 -10 17 -19c0 -1 1 -2 1 -3c5 -10 12 -15 21 -15c8 0 13 1 16 4c3 4 5 9 5 17v2l-1 38c0 9 -1 14 -4 17c-2 3 -7 4 -14 4c-6 0 -9 0 -12 -2c-2 -2 -5 -5 -7 -9c-8 4 -17 7 -26 9c-8 1 -17 2 -26 2c-27 0 -49 -7 -66 -21c-17 -15 -25 -33 -25 -56c0 -17 5 -31 14 -41
-c10 -10 28 -19 54 -25c5 -2 12 -4 21 -6c31 -7 46 -18 46 -32c0 -9 -3 -16 -10 -21s-16 -8 -28 -8c-14 0 -25 3 -34 8s-16 12 -22 23c0 1 -1 4 -3 7c-6 12 -13 18 -21 18s-14 -1 -17 -5c-4 -3 -5 -9 -5 -18v-2l1 -47c0 -8 1 -14 5 -17c3 -3 9 -5 17 -5c5 0 9 1 12 3
-c2 1 5 4 7 7c9 -3 18 -6 28 -7c9 -2 20 -3 32 -3c31 0 54 7 71 20zM2081 283c2 -5 5 -7 9 -9s11 -4 21 -4c4 0 7 0 9 1c-4 2 -12 5 -23 8c-6 1 -12 2 -16 4zM2125 382c-1 2 -2 3 -3 3c-3 2 -6 3 -12 3h-5c5 -2 12 -4 20 -6zM2202 352c2 -2 4 -4 6 -5c17 -17 25 -41 25 -66v0
-h6h7v96h-7c-6 0 -13 0 -19 2c-1 -7 -4 -15 -11 -22c-2 -2 -4 -4 -7 -5zM2376 217c4 3 6 9 6 17c0 7 -2 13 -6 16c-3 3 -10 5 -19 5h-33v148h33c9 0 16 2 19 5c4 3 6 9 6 17s-2 13 -5 16c-4 4 -11 5 -20 5h-118c-9 0 -15 -1 -19 -5c-4 -3 -6 -8 -6 -16s2 -14 6 -17
-s10 -5 19 -5h34v-148h-34c-9 0 -15 -2 -19 -5s-6 -9 -6 -16c0 -8 2 -14 6 -17c4 -4 10 -5 19 -5h118c9 0 15 1 19 5zM2350 281h7c10 0 21 -1 32 -8c4 3 8 5 12 6l36 100c-6 2 -11 5 -16 9c-8 7 -12 16 -14 24c-1 -8 -5 -17 -13 -23c-12 -11 -25 -12 -37 -12h-7v-96z
-M2639 217c4 3 6 9 6 17c0 7 -2 12 -6 16c-4 3 -9 5 -16 5h-4l-62 172v1c-5 12 -13 19 -25 19h-75c-9 0 -15 -2 -19 -5c-4 -4 -6 -9 -6 -17s2 -14 6 -17s10 -5 19 -5h16l-53 -148h-3c-7 0 -13 -2 -16 -5c-4 -4 -6 -9 -6 -16c0 -8 2 -14 6 -17c4 -4 10 -5 19 -5h51
-c9 0 16 1 20 5c4 3 6 9 6 17c0 7 -2 13 -6 16s-11 5 -20 5h-7l9 23h86l8 -23h-7c-9 0 -16 -2 -20 -5s-5 -9 -5 -16c0 -8 1 -14 5 -17c4 -4 11 -5 20 -5h59c9 0 16 1 20 5zM2544 319h-57l29 84zM1890 319h-57l29 84zM984 319h-57l29 84z" />
- <glyph glyph-name="yapcasialogomark" unicode="yapcasialogomark" horiz-adv-x="550"
-d="M550 277c0 -101 -54 -189 -134 -237l14 -63c2 -9 0 -18 -6 -26c-6 -7 -14 -11 -24 -11h-67c-4 0 -7 1 -11 2c-3 -1 -7 -2 -10 -2h-73c-4 0 -7 1 -11 2c-3 -1 -7 -2 -10 -2h-68c-9 0 -18 4 -24 11c-5 8 -7 17 -5 26l14 63c-81 48 -135 136 -135 237c0 136 100 250 230 271
-l14 86c2 15 15 26 30 26s27 -11 30 -26l13 -86c132 -20 233 -134 233 -271zM403 357h-256l46 -81h165zM286 551l-12 79l-12 -79l-7 -43h38zM313 445l23 42h-122l23 -42v0l-9 -68h95l-9 68h-1zM150 -30h68l3 37l21 246h-28l-51 -227zM242 4l-3 -34h73l-3 34l-22 249h-24z
-M333 -30h67l-12 56l-52 227h-27l21 -246z" />
- <glyph glyph-name="ltthon" unicode="ltthon" horiz-adv-x="757"
-d="M757 306c3 -49 -14 -78 -27 -114c-9 -25 -20 -50 -32 -73c-5 -2 -9 8 -16 12c-6 5 -11 10 -23 9c13 18 26 40 35 68c8 27 16 53 24 81c6 22 16 39 14 57c-2 20 -18 31 -28 45c-4 21 -12 39 -22 56c-19 34 -44 71 -73 98c-48 43 -96 79 -183 73c-20 -2 -40 -6 -60 -13
-c-6 -1 -11 -5 -16 -6c-12 0 -24 8 -37 6c-12 -1 -22 -8 -28 -14c-12 -11 -11 -32 -29 -40c-10 13 -18 29 -28 42c-4 4 -10 6 -12 12c69 27 127 58 225 51c94 -6 157 -57 212 -121c49 -57 96 -135 104 -229zM121 447c-14 7 -50 39 -45 63c3 13 25 19 32 29c14 17 16 41 29 48
-c15 10 45 10 61 0c1 -1 2 -3 4 -4c12 -8 37 -48 34 -65c-2 -10 -7 -8 -16 -18c-8 -4 -10 -13 -18 -16c0 -8 0 -15 -2 -20c-23 -13 -50 -32 -79 -17zM299 411c-7 0 -14 -1 -16 4c8 44 39 65 52 103c-16 16 -39 12 -40 35c-1 11 8 24 22 26c18 3 65 -26 75 -36
-c6 -6 13 -19 12 -25c-1 -8 -7 -7 -12 -14c-31 3 -49 -6 -51 -32c16 -5 23 7 47 4c16 -2 33 -13 43 -27c13 -18 16 -36 6 -62c-30 -18 -68 -27 -112 -31c-4 8 -1 22 -2 33c-8 7 -24 7 -24 22zM366 395c-1 4 2 12 -4 10c-6 -5 -18 -3 -19 -12c8 -8 14 0 23 2zM354 456
-c-13 -4 -37 -16 -35 -25c9 1 15 10 26 12s22 -2 31 0c1 16 -14 15 -22 13zM593 508c13 -2 18 -19 24 -22c6 -10 17 -14 16 -30c-5 -6 -16 -6 -24 -9c-12 -18 -39 -22 -41 -50c-8 -8 -17 -14 -26 -20c-2 -11 -8 -17 -12 -25c2 -23 3 -50 -6 -67c-20 -10 -28 13 -39 29
-c-3 5 -7 12 -12 18c-7 10 -16 12 -16 26c-1 14 5 52 10 63c8 17 28 24 30 39c-10 2 -24 -3 -36 0c-16 3 -32 15 -32 28c-1 26 28 19 50 14c9 -2 19 -5 26 -6c22 -3 46 0 61 4c12 3 16 10 27 8zM66 401c-11 2 -22 13 -22 24c-1 11 9 27 20 29c12 1 15 -7 26 -13
-c52 -15 90 13 144 8c16 -7 33 -15 34 -36c2 -16 -8 -33 -18 -45c22 -2 37 -10 45 -26c-5 -21 -7 -49 4 -65c35 0 44 26 67 37c10 20 16 44 46 44c17 -19 -3 -33 -16 -50c-9 -12 -13 -25 -22 -35c-17 -18 -48 -25 -71 -36c-10 3 -24 2 -37 2c-9 8 -19 12 -24 26
-c-5 15 0 36 -10 49c-12 3 -9 -9 -14 -12c-5 -5 -12 -7 -18 -11c-4 -10 -17 -17 -25 -32c-2 -4 -2 -11 -4 -16c-8 -22 -18 -53 -56 -41c-1 15 -3 29 2 43c2 8 11 13 14 20c4 12 4 27 8 39c9 31 29 63 40 97c-17 2 -28 13 -52 12c-23 -1 -41 -16 -61 -12zM121 74c0 1 0 2 1 3
-l5 -6l-1 -1h-1h-2c0 1 -1 1 -1 2c-1 0 -1 1 -1 2zM99 121c0 -1 1 -1 1 -2c1 0 1 -1 1 -2v-1l-2 -2l-1 -1c-1 -1 -1 -1 -2 -1s-1 -1 -2 -1s-1 1 -2 1l-1 1c-1 1 -1 1 -1 2v2c1 0 1 1 2 1c0 1 1 1 1 2c1 0 2 0 2 1h2h2zM40 299c1 0 1 -1 1 -1c1 -1 1 -1 1 -2v-2
-c0 -1 -1 -1 -1 -2c-1 0 -1 0 -2 -1h-2h-2c-1 0 -2 0 -2 1c-1 0 -1 0 -2 1v2v2l1 1c1 1 1 1 2 1s1 1 2 1h2c1 -1 2 -1 2 -1zM44 243h-2h-2s-1 1 -1 1c-1 1 -1 1 -1 2c-1 1 -1 2 0 2c0 1 0 1 1 2l1 1c1 0 2 0 2 1h2c1 0 2 0 2 -1c1 0 1 0 2 -1c0 0 1 -1 1 -2v-2l-1 -1
-c-1 -1 -1 -1 -2 -1c-1 -1 -1 -1 -2 -1zM63 182c0 1 0 1 -1 1v1l1 1h2h1s1 0 1 -1c1 0 1 -1 2 -2v-1v-1v-1h-1l-1 -1c-1 0 -1 1 -1 1h-1c0 1 -1 1 -1 1v1zM116 96c1 0 1 -1 2 -2c0 0 0 -1 1 -1c0 -1 0 -2 -1 -2c0 -1 0 -1 -1 -2c0 -1 -1 -1 -1 -1l-2 -2h-2h-2l-1 1
-c-1 1 -1 2 -1 2v2c0 1 1 1 1 2c1 0 1 1 2 1c0 1 1 1 1 1c1 1 2 1 2 1h2zM144 49c0 1 0 2 1 3l6 -5l-1 -1h-1h-2s-1 0 -2 1s-1 2 -1 2zM200 7c1 0 1 0 2 -1l4 -2l-4 -6l-4 2l-1 1c-1 0 -1 1 -1 1c-1 1 -1 1 -1 2c0 0 0 1 1 2l1 1h2h1zM481 10c19 -21 70 -29 106 -16
-c-12 -13 -31 -10 -45 -14c-7 -3 -13 -7 -20 -11c-44 -20 -111 -32 -175 -32c-47 0 -100 10 -143 32c-2 1 -4 5 -6 6c-7 4 -16 6 -23 11c-4 2 -7 7 -12 10c-4 3 -10 3 -14 6c-8 5 -17 13 -24 20c-22 19 -37 40 -55 67c-37 56 -76 115 -69 215c2 31 13 64 24 95
-c15 -23 56 -32 85 -16c-6 -23 -11 -52 -10 -83c1 -8 3 -17 2 -25c-1 -10 -9 -18 -12 -28c-8 -33 -5 -72 33 -73c27 -85 77 -147 160 -176c11 -14 26 -42 50 -45c28 -3 53 11 57 41c17 -7 30 -20 55 -12c8 2 14 7 20 12s9 13 16 16zM55 264c0 0 0 1 -1 1c-1 1 -1 1 -2 1h-2
-l-19 -3l1 -5l18 3h2v-1v-2l4 1v2s0 2 -1 3zM56 233l-1 4l-18 -4l1 -5zM35 242l3 -3c1 0 2 -1 3 -1h4c1 1 3 1 4 2c1 0 2 1 2 2c1 1 1 2 2 3c0 2 0 3 -1 4c0 2 0 3 -1 4s-1 2 -2 2c-1 1 -2 1 -4 2c-1 0 -2 0 -4 -1c-1 0 -2 0 -3 -1s-2 -1 -3 -2c0 -1 -1 -2 -1 -4v-4
-c0 -1 1 -2 1 -3zM46 297c0 2 -1 3 -1 4c-1 1 -2 1 -3 2s-2 1 -3 1c-1 1 -2 1 -3 1c-1 -1 -3 -1 -4 -1c-1 -1 -2 -1 -3 -2c0 -1 -1 -2 -2 -3v-3c0 -2 0 -3 1 -3c0 -1 1 -2 2 -2v-1h-2v-4l24 2v4h-9v0c1 1 2 1 2 2c1 1 1 2 1 3zM42 278h5v6l-6 -1zM26 331v-3s0 -2 1 -3
-c0 -1 1 -2 2 -2c-1 -1 -2 -1 -3 -2v-3c0 -2 0 -3 1 -4l2 -2v0h-3v-5l18 1v5l-10 -1c-1 0 -2 1 -2 1c-1 0 -1 0 -2 1v1v1v2h1l1 1h2h10v5h-10h-2h-1c0 1 -1 1 -1 1c0 1 -1 1 -1 2s1 1 1 2l1 1h1h2h10v5h-12c-1 0 -2 0 -3 -1c-1 0 -2 0 -2 -1c-1 -1 -1 -1 -1 -2zM27 272l-4 -1
-l1 -5l4 1zM25 262v-5l4 1v5zM48 270v5l-18 -3l1 -5zM31 232l1 -5l4 1l-2 5zM45 214l-9 -3l1 -5l24 7l-1 5l-9 -3h-4s-2 1 -2 2c-1 2 -1 3 0 3c1 1 2 1 3 2l10 2l-2 5l-10 -3c-1 0 -2 0 -3 -1c-1 0 -1 -1 -2 -1c0 -1 -1 -2 -1 -3s0 -2 1 -3c0 -1 0 -2 1 -3c1 0 2 -1 3 -1v0z
-M49 193c1 -1 2 -1 3 -2h3h4c1 1 2 1 3 2s2 2 2 3c1 1 1 2 1 3v4c-1 2 -2 4 -4 5c-1 1 -4 1 -6 1l2 -5h3c0 -1 1 -1 1 -2c1 -1 1 -2 0 -2v-2c-1 -1 -1 -1 -2 -1c0 -1 -1 -1 -2 -1c0 0 -1 -1 -2 -1h-2c0 1 -1 1 -1 1l-2 2c0 2 0 3 2 4l-1 5c-1 0 -2 -1 -3 -2c-1 0 -1 -1 -1 -2
-c-1 -1 -1 -2 -1 -3s1 -2 1 -3c0 -2 1 -3 2 -4zM54 185c-1 -1 -1 -1 -1 -2v-3s1 -2 1 -2c0 -1 1 -2 1 -3c1 -1 1 -2 2 -2c1 -1 2 -1 3 -1c0 -1 1 0 3 0l-2 5c-1 -1 -2 -1 -3 0c0 0 -1 1 -1 2v1v1v1h1c1 1 1 1 1 0c1 0 1 0 1 -1c1 0 1 -1 1 -1c1 -1 1 -2 1 -2l2 -2
-c0 -1 1 -1 1 -2h2h3s1 1 2 1c0 1 1 2 1 2v2c0 1 0 2 -1 3c0 1 0 2 -1 3c-1 0 -2 1 -3 2h1l1 1l-2 4l-1 -1c-1 0 -2 -1 -3 -1l-8 -3c-1 -1 -2 -1 -2 -2zM59 149l3 -5l22 10l-2 5l-10 -4l-4 9l10 4l-3 5l-22 -10l2 -5l9 4l4 -9zM89 134l-9 -9l3 -5l11 14h1c0 1 1 1 1 1
-c1 0 1 -1 2 -1v-1c1 -1 1 -1 1 -2l4 2c-1 1 -1 1 -1 2l-1 1l-3 3c-1 0 -2 1 -3 0l-21 -3l2 -4l13 2v0zM92 109l-8 -5l3 -4l21 13l-3 4l-2 -1v0c1 1 1 2 1 3c0 2 -1 3 -1 4c-1 0 -2 1 -2 2c-1 0 -2 1 -3 1h-3c-2 -1 -3 -1 -4 -2c-2 -1 -3 -2 -4 -3c0 -1 -1 -2 -1 -3v-3
-s0 -2 1 -2c0 -1 1 -2 2 -3c1 0 2 -1 3 -1v0zM112 81c1 0 3 0 4 1c1 0 2 1 3 2c1 0 2 1 2 2c1 1 1 2 2 3v3c0 2 -1 3 -2 4c0 1 -1 1 -2 2h-3v0l2 2l-3 4l-20 -15l3 -4l7 5v0v-3s1 -2 2 -3c0 -1 1 -2 2 -2c1 -1 2 -1 3 -1zM122 67c1 -1 2 -1 3 -1s3 0 4 1c1 0 2 1 3 1
-c1 1 2 2 2 3c1 2 1 3 1 4c1 1 0 2 0 3s-1 2 -2 4c-1 1 -3 2 -4 3c-2 0 -4 0 -6 -1l3 -3h2l2 -2s1 -2 1 -3s0 -2 -1 -3l-9 10l-3 -3c0 -1 -1 -2 -1 -4v-3s1 -3 2 -4s2 -2 3 -2zM133 59l-2 -3l3 -3l13 12l-3 4l-6 -6c-1 0 -1 -1 -2 -1c0 0 -1 -1 -2 -1c0 0 -1 0 -2 1
-c0 0 -1 0 -2 1v1h-1l-3 -3s1 0 1 -1l1 -1h2c0 -1 1 -1 2 -1l1 1v0zM146 42h3s3 0 4 1c1 0 2 1 3 2s1 2 2 3c0 1 1 2 1 4c0 1 -1 2 -1 3c-1 1 -1 2 -3 3c-1 1 -3 2 -4 3c-2 0 -4 -1 -6 -2l3 -3c1 1 2 1 2 1c1 0 2 -1 3 -2c1 0 1 -1 1 -3c1 -1 0 -2 -1 -3l-9 9l-3 -3
-s-1 -2 -1 -4v-3c1 -2 2 -3 3 -4s2 -1 3 -2zM168 23l4 -3l7 17l-4 3l-10 -7v0l5 11l-4 4l-15 -11l3 -3l11 7v0l-6 -11l4 -3l10 8v0zM184 12c2 -1 3 -1 4 0c1 0 2 0 3 1l3 3s1 2 2 3v4c-1 1 -1 2 -2 3c0 1 -1 2 -2 3c-2 1 -3 1 -4 1c-1 1 -2 1 -3 1c-2 -1 -3 -1 -4 -2
-s-2 -1 -2 -3c-1 -1 -2 -2 -2 -3v-4s0 -2 1 -3l3 -3c1 0 2 -1 3 -1zM195 -3l9 -6l13 22l-5 2l-4 -7l-5 3c-2 0 -3 1 -4 1h-3s-2 -1 -3 -2c-1 0 -1 -1 -2 -2c0 -1 -1 -2 -1 -3v-3s1 -1 2 -2c0 -1 1 -2 3 -3zM191 24v-2v-1c0 -1 -1 -2 -1 -2l-2 -2l-1 -1h-2h-2c-1 1 -1 1 -1 2
-c-1 1 -1 1 -1 2c0 0 0 1 1 2c0 0 0 1 1 2l1 1c1 1 1 1 2 1c0 1 1 1 1 1c1 0 2 -1 2 -1c1 -1 2 -1 2 -2zM666 273c-8 12 -3 32 -5 49c-1 15 -1 32 9 42c7 -2 11 3 16 2c20 -2 24 -32 14 -52c-3 -6 -9 -9 -12 -14c-4 -9 -3 -18 -6 -23c-7 0 -9 -4 -16 -4zM607 304
-c-1 -13 6 -25 2 -37c-24 -15 -26 9 -35 31c-5 14 -14 27 -12 40c4 26 29 21 51 8c4 -13 -6 -27 -6 -42zM657 115c16 1 19 -16 13 -36c-18 -9 -31 -29 -51 -43c-37 -25 -88 -32 -128 -4c-8 18 -11 41 -14 65c-27 -5 -10 -54 -22 -77c-10 -18 -39 -19 -51 0c4 38 19 97 22 146
-c2 18 2 35 7 49c4 12 31 47 44 50c23 6 33 -8 41 -22c7 -45 -24 -52 -27 -87c10 -8 22 -4 31 -6c9 -3 22 -8 28 -17c17 -22 -4 -63 24 -72c18 4 44 11 59 28c6 7 13 26 24 26zM396 263c19 -13 2 -34 -10 -53c-25 -37 -43 -76 -67 -115c19 -9 58 1 69 -16c0 -8 0 -15 -2 -20
-c-14 -9 -42 -4 -51 -19c-4 -29 24 -26 29 -46c-3 -9 -14 -13 -21 -12c-9 0 -33 14 -38 28c-6 15 1 29 0 44c-11 10 -30 -5 -45 3c-5 5 -5 18 -2 26c8 10 32 3 39 14c-38 2 -61 19 -79 41c-5 32 -20 73 8 91c29 2 38 -17 57 -25c10 -24 17 -53 28 -77c8 6 10 17 14 27
-c4 8 11 14 14 24c7 17 7 40 15 57c1 3 13 21 18 24c7 4 15 4 24 4zM546 192v20h4v-16h10v-4h-14zM569 209v-17h-5v17h-6v3h17v-3h-6zM575 202h8v-4h-8v4zM593 209v-17h-4v17h-6v3h16v-3h-6zM619 212v-20h-5v9h-8v-9h-4v20h4v-7h8v7h5zM628 212c1 1 2 1 4 1c1 0 3 0 4 -1
-c1 0 2 -1 3 -2s2 -2 2 -4c0 -1 1 -2 1 -4c0 -1 -1 -3 -1 -4s-1 -2 -2 -3s-2 -2 -3 -2c-1 -1 -3 -1 -4 -1c-2 0 -3 0 -4 1c-2 0 -3 1 -4 2c0 1 -1 2 -2 3v4v4c1 2 2 3 2 4c1 1 2 2 4 2zM636 207c0 1 -1 1 -2 2h-2h-3l-2 -2v-2c-1 -1 -1 -2 -1 -3s0 -1 1 -2v-2c1 -1 1 -2 2 -2
-s2 -1 3 -1s2 1 2 1c1 0 2 1 2 2c0 0 1 1 1 2v2v3s-1 1 -1 2zM658 199v13h4v-20h-5l-8 14v0v-14h-4v20h4z" />
- <glyph glyph-name="calendar" unicode="calendar" horiz-adv-x="650"
-d="M0 499v-476c0 -26 22 -48 49 -48h552c27 0 49 22 49 48v476c0 26 -22 48 -49 48h-56v5c0 17 -5 36 -17 50c-13 13 -33 23 -62 23c-30 0 -50 -10 -62 -23c-13 -14 -18 -33 -18 -50v-5h-122v5c0 17 -5 36 -17 50c-13 13 -33 23 -63 23c-29 0 -49 -10 -61 -23
-c-13 -14 -18 -33 -18 -50v-5h-56c-27 0 -49 -22 -49 -48zM66 40v104h117v-104h-117zM66 160v104h117v-104h-117zM66 280v105h117v-105h-117zM153 468v84c0 16 10 24 31 24c22 0 32 -8 32 -24v-84c0 -16 -10 -24 -32 -24c-21 0 -31 8 -31 24zM199 40v104h118v-104h-118z
-M199 160v104h118v-104h-118zM199 280v105h118v-105h-118zM333 40v104h118v-104h-118zM333 160v104h118v-104h-118zM333 280v105h118v-105h-118zM467 40v104h117v-104h-117zM467 160v104h117v-104h-117zM467 280v105h117v-105h-117zM434 468v84c0 16 10 24 32 24
-c20 0 31 -8 31 -24v-84c0 -16 -10 -24 -31 -24c-22 0 -32 8 -32 24z" />
- <glyph glyph-name="SQALE" unicode="SQALE" horiz-adv-x="1932"
-d="M178 599c-86 0 -168 -29 -168 -136c0 -55 30 -103 113 -163c85 -61 110 -85 110 -128c0 -60 -50 -76 -105 -76c-26 0 -64 2 -95 8c-23 4 -33 -16 -33 -30c0 -13 4 -21 11 -26c23 -14 88 -18 117 -18c110 0 183 46 183 149c0 63 -32 104 -117 163c-70 48 -105 86 -105 126
-c0 53 34 66 103 66c38 0 59 -3 82 -5c26 -3 34 11 34 27c0 12 -4 21 -17 28c-18 10 -53 15 -113 15zM1138 153l20 -83c6 -27 18 -35 38 -35c38 0 47 13 47 32c0 7 -2 20 -9 45c-25 99 -80 313 -114 434c-12 41 -35 53 -81 53c-41 0 -67 -15 -77 -47
-c-33 -108 -96 -343 -122 -440c-6 -20 -9 -38 -9 -45c0 -23 20 -32 45 -32c15 0 25 5 32 30l21 88c8 28 17 34 35 34h135c24 0 33 -8 39 -34zM1019 504c5 16 9 20 19 20c9 0 14 -4 19 -20c17 -55 55 -220 55 -235c0 -16 -8 -19 -30 -19h-92c-20 0 -29 3 -29 19s42 180 58 235
-zM1400 126v437c0 26 -18 31 -40 31c-17 0 -39 -5 -39 -31v-463c0 -41 23 -62 74 -62h149c19 0 24 15 24 34c0 16 -5 33 -24 33h-121c-19 0 -23 4 -23 21zM1739 524h157c18 0 23 16 23 34c0 17 -5 33 -23 33h-186c-50 0 -74 -23 -74 -62v-429c0 -41 24 -62 74 -62h199
-c18 0 23 15 23 34c0 16 -5 33 -23 33h-170c-20 0 -23 4 -23 21v144c0 18 3 22 23 22h145c19 0 24 13 24 32c0 16 -5 30 -24 30h-145c-20 0 -23 4 -23 21v114c0 28 3 35 23 35zM746 309c33 0 41 -14 40 -35c-1 -2 -1 -4 -1 -7c-8 -102 -34 -160 -76 -195c-7 -6 -6 -12 -3 -15
-c18 -20 37 -41 43 -46c12 -14 14 -32 -2 -48c-19 -17 -36 -9 -47 2c-7 7 -37 42 -59 67c-3 3 -10 8 -20 8c-24 -3 -54 -3 -76 0c-80 11 -137 57 -157 171c-3 16 -5 30 -6 46c0 3 0 6 -1 10v7c-1 20 7 35 40 35c32 0 42 -15 42 -29c0 -3 0 -6 1 -10v-16c1 -7 2 -32 6 -50
-c14 -83 50 -100 116 -100c86 0 115 23 120 167v9c0 14 8 29 40 29zM793 395c2 -22 -1 -43 -41 -43c-16 0 -93 23 -166 23c-80 0 -155 -23 -169 -23c-44 0 -42 28 -40 41c2 15 4 30 7 43c20 103 71 153 156 167c11 2 15 9 16 13c1 9 4 18 8 25c5 10 15 13 27 13
-c10 0 21 -4 25 -13c4 -8 6 -17 8 -26c0 -4 2 -11 15 -13c94 -18 142 -85 154 -207z" />
- <glyph glyph-name="heteml" unicode="heteml" horiz-adv-x="1132"
-d="M1132 508c-24 4 -48 -6 -63 -24c21 -25 31 -57 34 -103c7 -84 5 -150 -71 -212c-27 -22 -56 -37 -87 -49c3 -20 3 -42 0 -63c-6 -30 -57 -27 -83 -28c-41 -2 -95 -1 -111 9c-9 6 -2 31 3 36c3 4 5 10 5 16c-27 0 -54 0 -82 1c-40 1 -81 -1 -120 -1c0 -11 -1 -23 -3 -34
-c-4 -30 -48 -27 -70 -27c-35 -2 -81 0 -93 10c-9 7 -4 28 2 36c7 10 8 32 9 53c-23 17 -42 42 -56 77c-2 6 -5 13 -7 19c-28 -23 -60 -44 -94 -66c-75 -49 -150 -31 -198 5c-49 35 -55 120 -39 146c15 26 53 38 117 69c60 29 59 69 81 108c4 6 10 12 18 17
-c-7 6 -13 14 -17 25c17 5 35 -3 45 -12c-1 12 9 30 28 41c5 -11 5 -24 1 -35c29 5 58 5 73 3c23 14 57 25 117 32c120 16 453 18 525 -18c23 -12 42 -24 57 -37c22 17 53 23 79 6zM201 392c7 0 13 6 13 13c0 6 -6 12 -13 12s-12 -6 -12 -12c0 -7 5 -13 12 -13z" />
- <glyph glyph-name="hatenabookmark" unicode="hatenabookmark" horiz-adv-x="650"
-d="M293 264c8 -6 12 -16 12 -31c0 -13 -4 -22 -14 -28c-9 -6 -25 -9 -48 -9h-33v77h35c23 0 39 -3 48 -9zM277 343c-8 -5 -24 -7 -48 -7h-19v70h21c23 0 39 -3 47 -8s13 -15 13 -28s-5 -22 -14 -27zM80 625h490c44 0 80 -36 80 -80v-490c0 -44 -36 -80 -80 -80h-490
-c-44 0 -80 36 -80 80v490c0 44 36 80 80 80zM533 471h-85v-230h85v230zM384 176c8 14 12 30 12 49c0 26 -7 47 -21 63c-14 15 -34 24 -58 26c22 6 38 15 48 26c10 12 15 28 15 48c0 15 -3 29 -10 41s-17 22 -30 29c-11 6 -24 11 -40 13c-16 3 -43 4 -83 4h-96v-350h99
-c40 0 69 1 86 4c18 3 32 7 44 14c15 8 26 19 34 33zM523 138c9 9 13 19 13 32c0 12 -4 23 -13 32c-9 8 -20 12 -33 12s-24 -4 -32 -13c-9 -8 -13 -19 -13 -31c0 -13 4 -23 13 -32s19 -13 32 -13s24 4 33 13z" />
- <glyph glyph-name="paperboy_co." unicode="paperboy" horiz-adv-x="576"
-d="M576 372c0 159 -129 288 -288 288s-288 -129 -288 -288c0 -118 73 -223 181 -266c13 -34 52 -129 52 -129c9 -22 31 -37 55 -37s46 15 55 37c0 0 39 95 53 129c107 43 180 148 180 266zM288 59c-18 45 -42 101 -42 101c-2 7 -7 12 -14 13c-88 25 -150 107 -150 199
-c0 114 92 206 206 206s206 -92 206 -206c0 -92 -61 -174 -150 -199c-6 -1 -12 -6 -14 -13c0 0 -23 -56 -42 -101z" />
- <glyph glyph-name="checkbox" unicode="checkbox" horiz-adv-x="700"
-d="M517 174l74 106v-303h-591v590h476l-51 -74v0h-351v-442l443 -1v124zM583 623l-236 -341l-165 122l-83 -115l280 -214l321 461z" />
- <glyph glyph-name="checkboxempty" unicode="checkboxempty" horiz-adv-x="700"
-d="M0 -23v590h591v-590h-591zM517 493h-443v-443h443v443z" />
- <glyph glyph-name="aim" unicode="aim" horiz-adv-x="569"
-d="M447 603c25 -25 37 -54 37 -88c0 -29 -8 -55 -26 -77c-17 -22 -40 -37 -67 -44c33 -4 64 2 93 17l21 13l58 -133l-18 -10c-45 -25 -85 -40 -119 -45c57 -45 103 -104 136 -178l7 -16l-133 -79l-11 19c-22 50 -65 92 -128 123c-25 -34 -50 -61 -74 -78
-c-38 -29 -86 -50 -145 -62l-19 -5l-59 161l45 7c12 4 24 8 37 15c38 18 65 46 83 83c2 3 3 12 4 24c7 89 38 152 91 190c-17 22 -25 47 -25 75c0 34 12 63 37 88c24 25 53 37 88 37c34 0 63 -12 87 -37zM508 309l-24 55c-46 -19 -90 -22 -132 -8l-9 3l-4 10
-c-1 4 -2 10 -3 18v5c-17 4 -30 9 -43 18c-26 -15 -45 -35 -57 -60c-13 -25 -21 -60 -25 -104c-2 -20 -4 -33 -8 -39c-29 -61 -77 -101 -145 -119l28 -78c47 11 87 30 117 55c19 15 39 38 63 69l10 13c3 4 8 6 14 6c3 0 7 -1 9 -3c72 -31 124 -73 154 -128l62 36
-c-30 58 -68 107 -116 145c-15 11 -30 22 -46 30l-21 11c-7 3 -10 9 -9 18c2 14 8 21 20 21l13 -2l62 -3c26 3 56 13 90 31zM360 594c-22 0 -41 -7 -57 -23s-24 -34 -24 -56s8 -41 24 -56c16 -16 35 -24 57 -24s40 8 56 24c16 15 24 34 24 56s-8 40 -24 56s-34 23 -56 23z
-" />
- <glyph glyph-name="bing" unicode="bing" horiz-adv-x="680"
-d="M340 474c188 0 340 -101 340 -226s-152 -227 -340 -227c-187 0 -339 101 -340 226v0v1v0v0v331h98v-172c62 42 147 67 242 67zM340 77c131 0 238 76 238 171c0 94 -107 171 -238 171s-238 -77 -238 -171c0 -95 107 -171 238 -171z" />
- <glyph glyph-name="blogger" unicode="blogger" horiz-adv-x="650"
-d="M326 348h-73c-12 0 -23 11 -23 24c0 12 11 23 23 23h73c13 0 23 -11 23 -23c0 -13 -10 -24 -23 -24zM253 250h145c13 0 23 -10 23 -23s-10 -23 -23 -23h-145c-12 0 -23 10 -23 23s11 23 23 23zM98 625h454c54 0 98 -44 98 -98v-454c0 -54 -44 -98 -98 -98h-454
-c-54 0 -98 44 -98 98v454c0 54 44 98 98 98zM526 222v96c0 18 -5 30 -27 30h-17c-18 0 -28 11 -28 24v11c0 57 -62 117 -116 117h-85c-71 0 -127 -56 -127 -127v-152c0 -67 58 -121 117 -121h161c65 0 122 55 122 122z" />
- <glyph glyph-name="cursor" unicode="cursor" horiz-adv-x="340"
-d="M298 342v-42h42v-42h-42h-43h-42v-43v-42h42v-43v-42h43v-43v-42h-43h-42v42v43h-43v42v43h-42v42h-43v-42h-42v-43h-43v43v42v43v42v42v43v42v43v42v43v42h43v-42h42v-43h43v-42h42v-43h43v-42h42v-43h43z" />
- <glyph glyph-name="digg" unicode="digg" horiz-adv-x="880"
-d="M132 244h-42v113h42v-113zM132 435h-132v-270h222v385h-90v-115zM263 472h90v78h-90v-78zM263 165h90v270h-90v-270zM527 244h-42v113h42v-113zM395 129v-79h222v385h-222v-270h132v-36h-132zM790 244h-42v113h42v-113zM658 129v-79h222v385h-222v-270h132v-36h-132z" />
- <glyph glyph-name="grab" unicode="grab" horiz-adv-x="680"
-d="M298 640h42h43v-42h-43h-42v42zM128 598h42h43v-43h-43h-42v43zM213 555h42v43h43v-43v-42v-43v-42v-43h-43v43v42h-42v43v42zM425 598h43h42v-43h-42h-43v-42v-43v-42v-43h-42v43v42v43v42v43h42zM85 470v43v42h43v-42v-43h-43zM553 555v-42v-43h42v-42h-42v-43v-42h-43
-v42v43v42v43v42h43zM595 470v43h43v-43h-43zM638 428v42h42v-42v-43v-42v-43h-42v43v42v43zM170 385h-42v43v42h42v-42v-43zM43 385h42h43v-42h-43h-42v42zM0 258v42v43h43v-43v-42h-43zM128 300v43h42v42h43v-42v-43v-42h-43v42h-42zM595 215v43v42h43v-42v-43v-42h-43v42z
-M85 258v-43h-42v43h42zM128 130h-43v43v42h43v-42v-43zM553 88v42v43h42v-43v-42h-42zM170 130v-42h-42v42h42zM213 88v-43h-43v43h43zM510 2v43v43h43v-43v-43v-42h-43v42zM255 -40h-42v42v43h42v-43v-42z" />
- <glyph glyph-name="myspace" unicode="myspace" horiz-adv-x="582"
-d="M436 407c-59 0 -106 47 -106 106s47 107 106 107s107 -48 107 -107s-48 -106 -107 -106zM242 425c-43 0 -78 35 -78 78s35 78 78 78c44 0 79 -35 79 -78s-35 -78 -79 -78zM582 242c0 -3 0 -7 -1 -10h1v-252h-291v132h-155v66h-136v151v0v6c0 48 39 87 87 87
-c34 0 62 -18 77 -46c20 21 47 35 78 35c43 0 80 -25 97 -62c26 24 60 38 97 38c81 0 146 -65 146 -145zM87 434c-35 0 -64 28 -64 64c0 35 29 64 64 64c36 0 64 -29 64 -64c0 -36 -28 -64 -64 -64z" />
- <glyph glyph-name="pointer" unicode="pointer" horiz-adv-x="638"
-d="M298 640v-42h-43h-42v42h42h43zM298 470v43v42v43h42v-43v-42v-43h43h42h43h42v-42h-42v-43v-42h-43v42v43h-42h-43v-43v-42h-42v42v43v42zM128 385v-42h-43h-42v42h42h43zM553 343h-43v42v43h43h42v-43h-42v-42zM595 343v42h43v-42v-43v-42v-43v-42h-43v42v43v42v43z
-M0 343h43v-43v-42h-43v42v43zM170 258v42h-42v43h42v42v43v42v43v42v43h43v-43v-42v-43v-42v-43v-42v-43v-42h-43zM43 215v43h42v-43h-42zM298 173v42v43h42v-43v-42v-43v-42h-42v42v43zM383 173v42v43h42v-43v-42v-43v-42h-42v42v43zM85 215h43v-42v-43h-43v43v42zM510 215
-v-42v-43v-42h-42v42v43v42v43h42v-43zM553 88v42v43h42v-43v-42h-42zM128 88v42h42v-42h-42zM170 45v43h43v-43h-43zM510 2v43v43h43v-43v-43v-42h-43h-42v42h42zM425 2v43h43v-43h-43zM298 2h42h43h42v-42h-42h-43h-42h-43h-42v42v43h42v-43h43z" />
- <glyph glyph-name="sitemap" unicode="sitemap" horiz-adv-x="680"
-d="M604 316v-142h76v-181h-181v181h75v112h-219v-112h76v-181h-182v181h76v112h-219v-112h75v-181h-181v181h76v112v30h30h219v110h-98v181h226v-181h-98v-110h219h18h12z" />
- <glyph glyph-name="terminal" unicode="terminal" horiz-adv-x="680"
-d="M0 40v520h680v-520h-680zM59 383l121 47v27l-121 48v-30l86 -31l-86 -32v-29zM191 348h119v30h-119v-30z" />
- <glyph glyph-name="vimeo" unicode="vimeo" horiz-adv-x="650"
-d="M130 625h390c72 0 130 -58 130 -130v-390c0 -72 -58 -130 -130 -130h-390c-72 0 -130 58 -130 130v390c0 72 58 130 130 130zM538 409c4 20 4 41 -9 57c-17 21 -54 22 -79 18c-20 -3 -89 -33 -113 -106c42 3 64 -3 60 -49c-2 -20 -12 -41 -23 -61
-c-12 -23 -36 -69 -66 -36c-28 30 -26 86 -32 124c-4 21 -8 48 -14 70c-6 18 -20 41 -37 46c-18 5 -40 -3 -53 -11c-42 -24 -74 -59 -110 -88v-3c7 -6 9 -18 20 -19c25 -4 48 23 65 -5c10 -17 13 -35 19 -54c9 -24 16 -51 23 -79c11 -47 26 -119 67 -136c21 -9 53 3 69 13
-c43 25 77 62 105 100c66 89 103 190 108 219z" />
- <glyph glyph-name="wordpress" unicode="wordpress" horiz-adv-x="700"
-d="M50 300c0 44 9 85 26 122l143 -392c-100 48 -169 151 -169 270zM553 315c0 -26 -10 -55 -23 -97l-30 -100l-109 323c18 1 35 3 35 3c16 2 14 25 -2 24c0 0 -49 -3 -80 -3c-30 0 -79 3 -79 3c-16 1 -18 -23 -2 -24c0 0 15 -2 31 -3l47 -128l-66 -197l-109 325
-c18 1 34 3 34 3c17 2 15 25 -2 24c0 0 -48 -3 -80 -3h-19c54 81 146 135 251 135c78 0 149 -30 203 -79c-2 1 -3 1 -4 1c-30 0 -51 -26 -51 -54c0 -24 15 -45 30 -70c11 -20 25 -46 25 -83zM265 12l90 262l93 -253c0 -2 1 -3 2 -4c-31 -11 -65 -17 -100 -17
-c-29 0 -58 4 -85 12zM613 444c24 -43 37 -92 37 -144c0 -111 -60 -207 -149 -260l92 266c17 42 22 77 22 107c0 11 0 21 -2 31zM350 650c193 0 350 -157 350 -350s-157 -350 -350 -350s-350 157 -350 350s157 350 350 350zM350 -34c184 0 334 150 334 334s-150 334 -334 334
-s-334 -150 -334 -334s150 -334 334 -334z" />
- <glyph glyph-name="yahoo" unicode="yahoo" horiz-adv-x="940"
-d="M741 444l22 33c-25 2 -112 2 -152 2c-48 0 -143 3 -161 0l7 -35c10 0 76 -10 96 -13c-4 -31 -132 -119 -147 -141c-26 39 -108 138 -160 215c20 5 97 7 113 11l3 27c-15 2 -136 3 -189 2c-81 -3 -164 2 -173 -2l1 -31c18 -4 93 -11 105 -15c41 -32 202 -232 208 -252
-c3 -19 3 -39 3 -49v-23c0 -47 2 -56 -5 -65c-16 -16 -88 -12 -105 -13l-6 -34c32 -1 134 3 166 3c63 0 173 0 188 -1l2 35c-16 3 -102 1 -114 3c-3 18 -9 50 -9 70l2 27c0 18 1 36 4 48c12 35 194 175 213 180c19 4 74 17 88 18zM708 188l53 -24c9 13 115 186 144 223l35 46
-c-13 5 -17 9 -54 26c-62 29 -60 27 -74 35l-13 -45c-7 -23 -76 -235 -91 -261zM656 78l29 -12l30 -13l31 58l-33 13l-35 18z" />
- <glyph glyph-name="dropbox" unicode="dropbox" horiz-adv-x="682"
-d="M682 503l-130 -112l130 -113l-217 -135l-124 111l-124 -111l-217 135l130 113l-130 112l216 137l125 -112l125 112zM140 391l201 -127l201 127l-201 127zM341 210l122 -108l97 61v-65l-219 -138l-219 138v65l97 -61z" />
- <glyph glyph-name="server" unicode="server" horiz-adv-x="580"
-d="M36 494h508c19 0 36 -17 36 -36v-84c0 -20 -17 -36 -36 -36h-508c-20 0 -36 16 -36 36v84c0 19 16 36 36 36zM536 408v16c0 6 -6 12 -12 12h-64c-7 0 -12 -6 -12 -12v-16c0 -7 5 -12 12 -12h64c6 0 12 5 12 12zM36 310h508c19 0 36 -16 36 -36v-84c0 -20 -17 -36 -36 -36
-h-508c-20 0 -36 16 -36 36v84c0 20 16 36 36 36zM536 224v16c0 6 -6 12 -12 12h-64c-7 0 -12 -6 -12 -12v-16c0 -7 5 -12 12 -12h64c6 0 12 5 12 12zM36 126h508c19 0 36 -16 36 -36v-84c0 -20 -17 -36 -36 -36h-508c-20 0 -36 16 -36 36v84c0 20 16 36 36 36zM536 40v16
-c0 7 -6 12 -12 12h-64c-7 0 -12 -5 -12 -12v-16c0 -7 5 -12 12 -12h64c6 0 12 5 12 12zM544 521h-508c-6 0 -12 -1 -17 -3l61 83c12 16 38 29 58 29h304c19 0 45 -13 57 -29l62 -83c-6 2 -12 3 -17 3z" />
- <glyph glyph-name="bag" unicode="bag" horiz-adv-x="680"
-d="M680 433v-120c-95 -35 -213 -55 -340 -55s-245 20 -340 55v120c0 22 18 40 40 40h165v30c0 46 38 85 85 85h100c47 0 85 -39 85 -85v-30h165c22 0 40 -18 40 -40zM255 503v-30h170v30c0 19 -16 35 -35 35h-100c-19 0 -35 -16 -35 -35zM290 320v-20c0 -6 4 -10 10 -10h80
-c6 0 10 4 10 10v20c0 6 -4 10 -10 10h-80c-6 0 -10 -4 -10 -10zM0 52v218c96 -33 213 -52 340 -52s244 19 340 52v-218c0 -22 -18 -40 -40 -40h-600c-22 0 -40 18 -40 40zM390 155v20c0 6 -4 10 -10 10h-80c-6 0 -10 -4 -10 -10v-20c0 -6 4 -10 10 -10h80c6 0 10 4 10 10z
-" />
- <glyph glyph-name="college" unicode="college" horiz-adv-x="780"
-d="M390 568l390 -156l-390 -155l-291 116c-18 -15 -31 -39 -33 -66h7c8 0 14 -6 14 -14v-37c0 -8 -6 -14 -14 -14h-5l19 -194c1 -8 -5 -15 -13 -15h-35c-8 0 -14 7 -14 15l20 194h-5c-8 0 -15 6 -15 14v37c0 8 7 14 15 14h11c2 29 15 54 33 72l-84 33zM379 229l11 -4l11 4
-l214 86l16 -177c1 -12 -7 -17 -18 -12l-84 43c-11 6 -29 5 -39 -1l-81 -46c-10 -6 -28 -6 -38 0l-81 46c-10 6 -28 7 -38 1l-85 -43c-11 -6 -19 0 -18 12l16 177z" />
- <glyph glyph-name="female" unicode="female" horiz-adv-x="339"
-d="M245 584c0 42 -34 76 -76 76c-41 0 -75 -34 -75 -76s34 -76 75 -76c42 0 76 34 76 76zM287 460l50 -157c5 -13 -3 -27 -16 -31c-13 -5 -27 3 -32 16l-27 83c-4 13 -16 24 -27 24c-10 0 -15 -11 -11 -24l58 -179c4 -13 -4 -24 -18 -24h-25v-203c0 -14 -12 -25 -25 -25
-c-14 0 -26 11 -26 25v203h-38v-203c0 -14 -11 -25 -25 -25s-25 11 -25 25v203h-25c-14 0 -22 11 -18 24l58 179c4 13 -1 24 -12 24c-10 0 -22 -11 -27 -24l-27 -83c-4 -13 -18 -21 -31 -16c-14 4 -21 18 -17 31l51 157c4 13 19 24 33 24h169c14 0 28 -11 33 -24z" />
- <glyph glyph-name="line" unicode="line" horiz-adv-x="684"
-d="M341 629c190 0 343 -124 343 -278c0 -75 -37 -141 -95 -193c-94 -93 -256 -187 -273 -180c-28 11 21 71 1 97c-3 4 -14 3 -34 6c-165 22 -283 131 -283 271c0 154 152 277 341 277zM146 259h58c10 0 16 8 16 18c0 7 -5 16 -18 16h-47c-4 0 -4 4 -4 18v101
-c0 9 -6 18 -17 18c-10 0 -17 -8 -17 -18v-122c0 -27 13 -31 29 -31zM277 273v139c0 9 -7 18 -18 18c-9 0 -17 -8 -17 -18v-139c0 -9 7 -16 18 -16c9 0 17 7 17 16zM441 292v122c0 9 -7 16 -18 16c-8 0 -17 -5 -17 -16v-88l-58 81c-8 14 -18 23 -30 23c-15 0 -16 -12 -16 -29
-v-128c0 -9 7 -16 17 -16c9 0 17 6 17 16v91l58 -81c13 -17 16 -26 32 -26c11 0 15 10 15 35zM553 361h-51v29c0 3 1 7 6 7h45c11 0 18 6 18 17c0 13 -10 17 -19 17h-58c-18 0 -27 -12 -27 -28v-113c0 -20 8 -31 27 -31h59c13 0 18 8 18 18c0 13 -10 17 -18 17h-44
-c-4 0 -7 3 -7 6v28h53c13 0 15 10 15 17c0 10 -8 16 -17 16z" />
- <glyph glyph-name="male" unicode="male" horiz-adv-x="303"
-d="M224 584c0 42 -34 76 -76 76c-41 0 -75 -34 -75 -76s34 -76 75 -76c42 0 76 34 76 76zM25 483h253c14 0 25 -11 25 -25v-164c0 -14 -11 -26 -25 -26v0c-14 0 -25 12 -25 26v75c0 14 -7 26 -16 26s-16 -12 -16 -26v-404c0 -14 -11 -25 -25 -25v0c-14 0 -25 11 -25 25v177
-c0 14 -9 25 -19 25c-11 0 -19 -11 -19 -25v-177c0 -14 -12 -25 -26 -25v0c-14 0 -25 11 -25 25v404c0 14 -7 26 -16 26c-8 0 -15 -12 -15 -26v-75c0 -14 -12 -26 -26 -26v0c-14 0 -25 12 -25 26v164c0 14 11 25 25 25z" />
- <glyph glyph-name="spa" unicode="spa" horiz-adv-x="640"
-d="M528 305l-14 -19c46 -16 77 -46 77 -90c0 -81 -117 -142 -271 -142s-271 61 -271 142c0 44 31 74 77 90l-14 19c-67 -16 -112 -62 -112 -126c0 -103 134 -187 320 -187c184 0 320 83 320 187c0 64 -45 110 -112 126zM148 162l20 -13c57 36 71 77 71 128
-c0 26 -11 63 -31 99c-21 36 -34 73 -34 101c0 29 13 60 47 88l-20 13c-58 -37 -71 -82 -71 -127c0 -27 11 -64 32 -99c20 -36 34 -73 34 -101s-13 -61 -48 -89zM275 131l21 -11c58 39 76 88 76 145c0 30 -12 71 -33 112s-33 81 -33 114c0 34 16 73 52 105l-22 12
-c-61 -42 -76 -94 -76 -146c0 -30 12 -72 33 -112c21 -41 34 -80 34 -114s-17 -72 -52 -105zM414 162l20 -13c57 36 70 77 70 128c0 26 -10 63 -31 99c-20 36 -34 73 -34 101c0 29 14 61 48 89l-20 12c-59 -37 -71 -82 -71 -127c0 -27 10 -64 31 -99c21 -36 34 -73 34 -101
-s-13 -61 -47 -89z" />
- <glyph glyph-name="umbrella" unicode="umbrella" horiz-adv-x="628"
-d="M288 65v242c10 3 20 4 26 4s16 -1 26 -4v-242c0 -42 -28 -105 -105 -105c-76 0 -104 63 -104 105c0 14 11 26 26 26c14 0 26 -12 26 -26c0 -13 5 -53 52 -53c50 0 53 44 53 53zM340 614v-28c161 -13 288 -148 288 -312h-4c-12 45 -52 69 -101 69s-89 -24 -101 -69h-7
-c-10 36 -38 55 -75 65v0c-8 2 -17 3 -26 3s-18 -1 -26 -3v0c-37 -10 -66 -29 -75 -65h-8c-11 45 -52 69 -100 69c-49 0 -90 -24 -101 -69h-4c0 164 127 299 288 312v28c0 14 11 26 26 26c14 0 26 -12 26 -26z" />
- <glyph glyph-name="ustream" unicode="ustream" horiz-adv-x="650"
-d="M373 120c-71 0 -113 55 -113 163v342h229v-342c0 -111 -41 -163 -116 -163zM630 292v323c12 -9 20 -24 20 -40v-550c0 -28 -22 -50 -50 -50h-550c-28 0 -50 22 -50 50v550c0 28 22 50 50 50h68v-331c0 -199 92 -288 251 -288c163 0 261 92 261 286z" />
- <glyph glyph-name="slideshare" unicode="slideshare" horiz-adv-x="668"
-d="M634 603v-264c3 2 5 4 8 6c20 14 34 -5 21 -24c-24 -29 -70 -66 -141 -95c26 -88 12 -151 -17 -190c-17 -24 -40 -38 -63 -43v-1c-50 -13 -100 11 -98 69c0 1 -1 71 -1 124c-5 1 -11 3 -18 5v-129c4 -130 -253 -90 -179 165c-70 29 -116 66 -141 95c-12 19 1 38 22 24
-c2 -2 5 -4 8 -6v264c0 36 27 66 61 66h477c34 0 61 -30 61 -66zM601 320v253c0 43 -14 61 -54 61h-422c-42 0 -54 -15 -54 -61v-256c90 -47 167 -38 209 -37c18 1 30 -3 36 -10c2 -1 3 -2 4 -4c8 -7 16 -13 23 -19c2 21 14 35 45 33c43 -1 122 -10 213 40zM244 465
-c45 0 81 -35 81 -77s-36 -77 -81 -77c-46 0 -82 35 -82 77s36 77 82 77zM434 465c45 0 82 -35 82 -77s-37 -77 -82 -77s-82 35 -82 77s37 77 82 77z" />
- <glyph glyph-name="soundcloud" unicode="soundcloud" horiz-adv-x="1085"
-d="M900 321c-8 69 -36 116 -77 153c-38 35 -93 65 -168 61c-17 -1 -33 -3 -49 -7c-10 -3 -33 -9 -37 -17c-3 -5 -2 -16 -2 -26v-364c0 -16 -3 -45 5 -52c5 -7 18 -5 32 -5h335c42 0 70 9 94 28c23 17 40 42 48 73c9 36 1 73 -14 99c-29 49 -92 84 -167 57zM539 503
-c-16 -1 -14 -16 -14 -34c-2 -29 -1 -59 -2 -85c-2 -54 0 -114 -3 -169c-1 -38 2 -71 4 -110c1 -19 -1 -41 17 -40c16 1 14 17 15 34c2 31 5 63 5 92c1 50 -3 103 -3 153c0 37 -1 77 -3 115c-1 22 3 46 -16 44zM492 477c-14 -2 -11 -16 -11 -33c-1 -26 -2 -56 -2 -79
-c0 -35 0 -67 -2 -105c-2 -54 0 -103 2 -156c1 -19 0 -39 14 -40c19 -1 16 22 16 41c3 52 6 103 4 156c-3 51 -1 106 -4 159c0 10 2 44 -2 51c-4 6 -12 7 -15 6zM356 446c-11 -2 -9 -18 -9 -33c0 -55 -3 -105 -5 -159c-1 -23 -2 -45 -2 -64c1 -31 5 -69 7 -101
-c0 -11 0 -25 11 -25c14 0 12 23 13 37c1 17 2 33 3 48c5 64 -1 128 -2 195c0 26 -2 47 -2 74c0 16 -1 30 -14 28zM400 440c-11 -3 -9 -20 -9 -35c0 -33 -2 -60 -3 -93c-1 -40 -3 -86 -3 -122c0 -30 4 -70 6 -102c1 -13 1 -23 12 -23c13 -1 12 13 13 25c3 34 6 67 6 99
-c1 19 0 41 -1 62c-2 52 -3 102 -5 156c-1 19 2 37 -16 33zM312 437c-11 -2 -9 -14 -9 -27c-1 -24 -2 -51 -2 -72c-2 -62 -7 -128 -2 -190c0 -13 2 -28 3 -45c1 -15 -2 -39 12 -38c10 0 10 13 11 24c2 34 6 67 7 99c1 20 -1 41 -2 62c-2 50 -3 102 -5 154c-1 15 1 35 -13 33z
-M445 432c-11 -3 -9 -15 -10 -29c-1 -87 -7 -174 -2 -259c0 -13 1 -29 2 -46c1 -16 -1 -35 15 -34c9 1 12 10 13 23c1 35 5 71 5 103c0 38 -2 80 -3 121c-1 28 -2 62 -3 91c-1 11 1 23 -4 27c-3 4 -11 5 -13 3zM267 417c-8 -1 -7 -9 -7 -20c-2 -59 -4 -104 -6 -162
-c-1 -15 -2 -31 -2 -45c1 -32 4 -57 6 -89c1 -13 -1 -37 12 -37c10 1 9 16 9 26c3 34 8 67 8 100c0 17 -1 37 -2 56c-2 48 -4 95 -6 143c0 12 1 31 -12 28zM224 376c-10 -2 -8 -27 -9 -40c-2 -45 -3 -75 -5 -120c-2 -42 2 -79 5 -119c1 -13 0 -32 10 -32c10 -1 9 16 10 26
-c1 13 2 23 2 33c2 23 6 45 6 65c0 12 -2 30 -3 46c-2 41 -4 77 -6 116c-1 13 1 26 -10 25zM143 312c-2 1 -7 3 -8 0c-5 -2 -4 -20 -5 -30c-1 -11 -2 -22 -3 -31c-1 -21 -5 -41 -5 -63c0 -20 3 -42 5 -63c1 -9 2 -20 3 -31c1 -8 0 -27 9 -26c7 0 7 17 7 26c1 12 2 22 3 32
-c2 20 6 43 7 62c0 11 -2 21 -3 32c-2 21 -4 42 -6 62c-1 11 -1 21 -4 30zM93 309c-5 -2 -5 -22 -5 -30c-1 -11 -2 -21 -3 -31c-2 -20 -6 -39 -5 -61c0 -28 5 -60 8 -90c1 -7 -1 -26 8 -25c6 1 6 17 7 26c1 12 2 22 3 31c2 20 6 39 6 60c0 22 -4 40 -6 61c-1 10 -2 19 -3 31
-c-1 9 0 32 -10 28zM180 306c-8 -2 -7 -17 -8 -27c0 -11 -1 -22 -2 -31c-1 -21 -5 -38 -5 -60c0 -20 3 -41 5 -63c1 -10 2 -20 2 -33c1 -10 1 -25 8 -26c10 -1 9 13 11 25c2 25 3 43 5 65c1 11 3 21 3 33c0 19 -4 38 -6 57c-1 9 -1 19 -2 30s0 32 -11 30zM49 289
-c-3 -16 -4 -33 -6 -50s-6 -34 -6 -51c1 -16 4 -35 6 -52c1 -7 2 -15 3 -25c1 -6 1 -22 7 -22c3 0 4 2 5 9c3 23 5 43 8 64c1 9 3 17 3 26s-2 18 -3 27c-3 18 -4 33 -7 52c-1 8 0 29 -10 22zM15 252c-2 1 -6 2 -6 -1c-2 -8 -4 -20 -5 -31c-1 -10 -4 -22 -4 -32
-c0 -9 3 -22 5 -33c0 -4 1 -10 2 -17c1 -5 1 -13 6 -13c6 1 7 23 8 30c2 11 5 24 5 33c0 11 -3 22 -5 33s-2 22 -6 31z" />
- <glyph glyph-name="ubuntu" unicode="ubuntu" horiz-adv-x="702"
-d="M527 519c-34 19 -45 62 -26 96c13 23 37 35 61 35c12 0 24 -3 35 -9c34 -20 45 -63 26 -96c-13 -23 -37 -35 -61 -35c-12 0 -24 3 -35 9zM702 320h-116c-4 54 -31 102 -72 133c-7 5 -14 10 -22 15c-26 14 -56 22 -88 22c-33 0 -63 -8 -90 -23l-64 97c45 27 97 42 154 42
-c22 0 44 -2 66 -7c-8 -39 9 -80 45 -101c14 -8 30 -12 47 -12c23 0 45 8 62 23c46 -50 75 -116 78 -189zM228 549l64 -97c-40 -31 -67 -78 -70 -132c-1 -4 -1 -8 -1 -13c0 -4 0 -9 1 -13c4 -57 34 -106 78 -137l-61 -99c-58 38 -102 96 -122 164c28 16 48 47 48 82
-s-20 67 -50 83c19 66 59 123 113 162zM70 374c39 0 71 -31 71 -70s-32 -71 -71 -71s-70 32 -70 71s31 70 70 70zM262 44l61 100c24 -12 52 -19 81 -19c32 0 62 8 89 23c8 4 15 9 22 15c40 30 67 77 71 131h116c-3 -76 -35 -145 -85 -196c-15 11 -34 17 -53 17
-c-17 0 -33 -4 -47 -12c-32 -19 -49 -53 -47 -87c-22 -5 -44 -8 -66 -8c-52 0 -100 13 -142 36zM564 91c24 0 48 -12 61 -35c19 -34 7 -78 -26 -97c-11 -6 -23 -9 -35 -9c-25 0 -48 12 -61 35c-20 34 -8 77 26 97c11 6 23 9 35 9z" />
- <glyph glyph-name="vk" unicode="vk" horiz-adv-x="875"
-d="M530 315c-16 6 -16 29 -17 45c-4 57 16 144 -8 181c-17 22 -99 20 -149 17c-14 -2 -31 -5 -43 -11s-24 -16 -24 -25c0 -13 30 -11 41 -28c12 -18 12 -57 12 -89c0 -37 -6 -86 -21 -88c-23 -1 -36 22 -48 39c-24 33 -48 74 -66 114c-9 21 -14 44 -27 53
-c-20 14 -56 15 -91 14c-32 -1 -78 3 -87 -16c-7 -21 8 -41 16 -58c41 -89 85 -167 139 -241c50 -69 97 -124 189 -153c26 -8 140 -31 163 0c8 12 6 39 10 59s9 40 28 41c16 1 25 -13 35 -23c11 -11 20 -20 28 -30c19 -19 39 -45 63 -55c33 -14 84 -10 132 -8
-c39 1 67 9 70 32c2 18 -18 44 -30 59c-30 37 -44 48 -78 82c-15 15 -34 31 -34 49c-1 11 8 21 16 32c35 52 70 89 102 143c9 16 30 53 22 71c-9 20 -59 14 -90 14c-40 0 -92 3 -102 -5c-19 -13 -27 -34 -36 -54c-20 -46 -47 -93 -75 -128c-10 -12 -29 -37 -40 -33z" />
- <glyph glyph-name="yelp" unicode="yelp" horiz-adv-x="645"
-d="M386 459c-1 24 -5 47 -7 70c-2 25 1 52 -7 73c-11 30 -46 40 -74 53c-27 13 -40 23 -77 20c-22 -2 -53 -11 -80 -20c-38 -13 -77 -27 -88 -56c-12 -30 4 -51 16 -70c37 -57 75 -115 111 -170c7 -9 17 -16 16 -28c-22 8 -40 14 -60 21c-19 7 -38 20 -60 21
-c-26 2 -50 -13 -61 -32c-16 -30 -20 -116 -7 -154c18 -49 83 -49 123 -78c-10 -14 -24 -25 -27 -41c-8 -42 25 -68 50 -80c24 -11 60 -23 94 -35s71 -31 103 -27c42 6 51 51 49 101c37 -10 67 -44 109 -49c45 -6 72 33 90 55c19 22 41 51 45 80c5 44 -19 59 -45 71
-c-21 9 -42 18 -62 26c-10 4 -23 7 -28 16c61 19 137 20 127 92c-2 22 -19 51 -35 73c-26 37 -55 58 -96 76c-25 12 -54 30 -85 18c-14 -5 -19 -20 -34 -26zM149 620c29 10 51 18 85 19c9 1 27 1 33 -10c5 -8 5 -27 6 -39c6 -68 10 -126 16 -201c2 -31 -1 -56 -23 -58
-c-26 -2 -42 33 -55 53c-38 57 -68 102 -107 160c-9 13 -19 23 -18 35c2 23 40 33 63 41zM502 404c16 -24 29 -42 30 -73c-15 -18 -50 -23 -84 -32c-13 -4 -30 -7 -46 -11c-25 -6 -61 -20 -67 13c-6 26 28 55 44 78c20 28 30 51 52 71c24 22 62 -35 71 -46zM152 207
-c-34 -12 -55 -21 -92 -25c-27 10 -29 118 -11 145c4 7 17 13 23 11c36 -11 82 -31 123 -46c21 -9 54 -15 39 -50c-7 -15 -65 -30 -82 -35zM344 199c1 13 11 23 25 25c0 0 1 3 3 2c34 -9 87 -26 128 -39c13 -4 32 -7 37 -18c12 -27 -20 -59 -32 -74c-10 -14 -33 -51 -60 -48
-c-21 2 -46 54 -57 71c-8 13 -18 29 -25 39c-8 12 -21 26 -19 42zM220 160c9 11 20 29 35 32c10 3 27 0 34 -10c9 -16 4 -66 5 -91c1 -28 4 -78 -5 -88c-16 -19 -61 -1 -84 7c-24 8 -61 18 -64 40c-2 17 11 26 24 41c19 25 35 47 55 69z" />
- <glyph glyph-name=".notdef" unicode="&#xff00;" horiz-adv-x="476"
-d="M102 0h272v682h-272v-682zM136 34v614h204v-614h-204z" />
- <glyph glyph-name="A" unicode="A" horiz-adv-x="517"
-d="M532 0h-81l-89 242h-207l-88 -242h-82l273 762zM258 526l-77 -214h155z" />
- <glyph glyph-name="B" unicode="B" horiz-adv-x="551"
-d="M61 735h175c58 0 109 -27 141 -71c23 -30 35 -66 35 -105s-12 -75 -35 -104c-3 -5 -7 -10 -10 -15c34 -12 63 -31 88 -58c38 -40 61 -96 61 -155c0 -60 -23 -114 -61 -155c-41 -44 -100 -72 -166 -72h-228v735zM133 455h108c55 2 99 48 99 104s-44 102 -99 105h-108v-209
-zM133 382v-310h158c85 1 153 70 153 155s-68 155 -153 155h-158z" />
- <glyph glyph-name="C" unicode="C" horiz-adv-x="720"
-d="M721 579l-63 -44c-58 79 -153 131 -261 131s-204 -52 -262 -131c-38 -51 -60 -115 -60 -184s22 -132 60 -183c58 -79 154 -130 262 -130s203 51 261 130l60 -41c-58 -80 -148 -139 -254 -157c-155 -28 -305 37 -391 155c-33 45 -57 99 -67 158c-19 106 10 211 70 294
-c59 79 149 137 254 155c156 28 306 -36 391 -153z" />
- <glyph glyph-name="D" unicode="D" horiz-adv-x="688"
-d="M72 735h254c82 0 157 -26 218 -71c90 -67 149 -174 149 -296c0 -121 -59 -228 -149 -296c-61 -45 -136 -72 -218 -72h-1h-253v735zM143 72h189c161 4 290 135 290 296c0 162 -129 293 -290 296h-189v-592z" />
- <glyph glyph-name="E" unicode="E" horiz-adv-x="567"
-d="M516 735v-71h-383v-209h383v-72h-383v-311h383v-72h-455v735h455z" />
- <glyph glyph-name="F" unicode="F" horiz-adv-x="577"
-d="M506 735v-71h-383v-209h383v-72h-383v-383h-72v735h455z" />
- <glyph glyph-name="G" unicode="G" horiz-adv-x="803"
-d="M397 264v73h397c-1 -25 -5 -49 -11 -73c-36 -145 -157 -265 -319 -294c-155 -28 -305 37 -391 155c-33 45 -57 99 -67 158c-38 210 108 411 324 449c156 28 306 -36 391 -153l-63 -44c-58 79 -153 131 -261 131c-178 0 -322 -142 -322 -315c0 -69 22 -131 60 -183
-c58 -79 154 -130 262 -130c147 0 272 95 311 226h-311z" />
- <glyph glyph-name="H" unicode="H" horiz-adv-x="649"
-d="M516 455v280h72v-735h-72v383h-383v-383h-72v735h72v-280h383z" />
- <glyph glyph-name="I" unicode="I" horiz-adv-x="235"
-d="M82 0v735h72v-735h-72z" />
- <glyph glyph-name="J" unicode="J" horiz-adv-x="490"
-d="M337 206v529h72v-527c0 -66 -28 -125 -72 -166c-41 -38 -96 -61 -156 -61c-62 0 -120 25 -161 66l52 51c28 -29 66 -46 109 -46c85 0 155 69 156 154z" />
- <glyph glyph-name="K" unicode="K" horiz-adv-x="604"
-d="M539 735l-350 -331l374 -404h-94l-326 351v-351h-71v735h71v-280l297 280h99z" />
- <glyph glyph-name="L" unicode="L" horiz-adv-x="567"
-d="M143 735v-663h383v-72h-454v735h71z" />
- <glyph glyph-name="M" unicode="M" horiz-adv-x="721"
-d="M51 753l310 -443l310 443v-753h-73v524l-237 -339l-237 339v-524h-73v753z" />
- <glyph glyph-name="N" unicode="N" horiz-adv-x="628"
-d="M506 185v551h72v-756l-455 570v-550h-72v756z" />
- <glyph glyph-name="O" unicode="O" horiz-adv-x="794"
-d="M788 431c37 -211 -107 -412 -324 -450c-216 -38 -421 101 -458 312c-38 210 108 411 324 449s421 -101 458 -311zM397 48c178 0 323 140 323 313s-145 315 -323 315s-322 -142 -322 -315s144 -313 322 -313z" />
- <glyph glyph-name="P" unicode="P" horiz-adv-x="546"
-d="M51 735h279c58 0 109 -27 141 -71c22 -30 35 -66 35 -105s-13 -75 -35 -104c-32 -44 -83 -72 -141 -72h-207v-383h-72v735zM123 455h210c56 1 101 47 101 104c0 56 -45 103 -101 105h-210v-209z" />
- <glyph glyph-name="Q" unicode="Q" horiz-adv-x="794"
-d="M676 -62l-76 95c-41 -25 -86 -42 -136 -50c-216 -38 -421 101 -458 312c-38 210 108 411 324 449s421 -101 458 -312c25 -137 -30 -271 -130 -357l110 -137h-92zM489 288l124 -157c66 57 107 141 107 233c0 173 -145 313 -323 313s-322 -140 -322 -313s144 -315 322 -315
-c57 0 111 16 158 40l-158 199h92z" />
- <glyph glyph-name="R" unicode="R" horiz-adv-x="542"
-d="M350 383h-104l297 -383h-91l-297 383h-12v-383h-71v735h278c58 0 110 -27 142 -71c22 -30 34 -66 34 -105s-12 -75 -34 -104c-32 -44 -84 -72 -142 -72zM353 664h-210v-209h210c56 1 102 47 102 104c0 56 -46 103 -102 105z" />
- <glyph glyph-name="S" unicode="S" horiz-adv-x="532"
-d="M114 172l-63 -37c31 -56 93 -155 222 -155c154 0 211 130 208 197c-1 37 -11 74 -35 111s-68 79 -131 126c-54 40 -86 63 -95 73c-17 17 -46 50 -46 96c0 31 21 93 100 93c69 0 108 -53 136 -90l59 46c-34 46 -90 120 -193 120c-130 0 -179 -102 -179 -172
-c0 -40 13 -78 39 -113c15 -20 54 -54 115 -100s103 -85 126 -118c17 -24 24 -48 25 -73c1 -43 -36 -125 -136 -125c-57 0 -108 40 -152 121z" />
- <glyph glyph-name="T" unicode="T" horiz-adv-x="475"
-d="M10 735h455v-71h-192v-664h-71v664h-192v71z" />
- <glyph glyph-name="U" unicode="U" horiz-adv-x="649"
-d="M588 735v-491c0 -71 -28 -134 -72 -181c-48 -51 -115 -82 -191 -82s-144 31 -192 82c-44 47 -72 111 -72 181v491h72v-492c1 -105 87 -191 192 -191s190 86 191 190v493h72z" />
- <glyph glyph-name="V" unicode="V" horiz-adv-x="609"
-d="M579 735l-275 -762l-273 762h82l191 -526l193 526h82z" />
- <glyph glyph-name="W" unicode="W" horiz-adv-x="949"
-d="M696 209l141 526h82l-212 -762l-232 580l-232 -580l-212 762h82l140 -526l222 550z" />
- <glyph glyph-name="X" unicode="X" horiz-adv-x="609"
-d="M566 735l-219 -357l232 -378h-84l-190 308l-189 -308h-85l231 378l-219 357h84l178 -289l177 289h84z" />
- <glyph glyph-name="Y" unicode="Y" horiz-adv-x="585"
-d="M293 446l177 289h85l-226 -368v-367h-72v368l-226 367h85z" />
- <glyph glyph-name="Z" unicode="Z" horiz-adv-x="553"
-d="M54 735h469l-379 -663h365v-72h-489l379 664h-345v71z" />
- <glyph glyph-name="a" unicode="a" horiz-adv-x="644"
-d="M511 432v94h72v-526h-72v74c-50 -55 -124 -91 -206 -91c-152 0 -285 120 -285 270s133 270 285 270c82 0 156 -36 206 -91zM511 247v12c-4 110 -95 198 -207 198c-115 0 -215 -91 -215 -204s100 -204 215 -204c112 0 203 88 207 198z" />
- <glyph glyph-name="b" unicode="b" horiz-adv-x="685"
-d="M133 754v-324c53 58 132 96 216 96c152 0 275 -120 275 -270s-123 -270 -275 -270c-84 0 -163 38 -216 96v-82h-72v754h72zM348 52c115 0 207 91 207 204s-92 204 -207 204s-215 -91 -215 -204s100 -204 215 -204z" />
- <glyph glyph-name="c" unicode="c" horiz-adv-x="593"
-d="M548 412l-56 -39c-38 51 -98 84 -167 84c-70 0 -134 -34 -174 -85c-26 -34 -41 -75 -41 -119s15 -85 41 -119c40 -51 104 -85 174 -85c69 0 129 33 167 84l56 -39c-50 -68 -131 -111 -222 -111c-92 0 -178 44 -230 112c-35 45 -55 100 -55 158s20 113 55 158
-c52 68 138 112 230 112c91 0 172 -43 222 -111z" />
- <glyph glyph-name="d" unicode="d" horiz-adv-x="654"
-d="M521 430v324h72v-754h-72v82c-53 -58 -132 -96 -216 -96c-152 0 -274 120 -274 270s122 270 274 270c84 0 163 -38 216 -96zM306 52c115 0 215 91 215 204s-100 204 -215 204c-114 0 -207 -91 -207 -204s93 -204 207 -204z" />
- <glyph glyph-name="e" unicode="e" horiz-adv-x="641"
-d="M600 255h-490v-2c0 -113 100 -204 215 -204c82 0 152 47 186 115l61 -29c-44 -90 -137 -152 -246 -152c-152 0 -285 120 -285 270c0 42 11 82 29 117c47 91 147 153 256 153c130 0 238 -89 267 -208c4 -19 7 -40 7 -60zM121 315h400c-27 82 -104 142 -196 142
-c-82 0 -158 -47 -194 -116c-4 -8 -7 -17 -10 -26z" />
- <glyph glyph-name="f" unicode="f" horiz-adv-x="347"
-d="M306 749v-78c-11 7 -25 11 -39 11c-39 0 -70 -31 -71 -70v-86h110v-60h-110v-466h-72v466h-73v60h73v84c0 53 29 99 72 124c22 12 45 20 71 20c14 0 27 -2 39 -5z" />
- <glyph glyph-name="g" unicode="g" horiz-adv-x="644"
-d="M46 -43h75c36 -70 111 -118 195 -118c103 0 189 74 205 172c1 4 1 30 1 68c-50 -57 -124 -93 -207 -93c-152 0 -284 120 -284 270s132 270 284 270c82 0 156 -36 207 -92c-1 54 -1 92 -1 92h72v-484c0 -14 -1 -29 -3 -42c-22 -129 -136 -227 -273 -227
-c-122 0 -231 76 -271 184zM314 52c114 0 207 91 207 204s-93 204 -207 204c-115 0 -215 -91 -215 -204s100 -204 215 -204z" />
- <glyph glyph-name="h" unicode="h" horiz-adv-x="588"
-d="M133 754v-292c42 40 109 64 171 64s110 -24 152 -64c44 -42 71 -102 71 -168v-294h-71v298c-3 87 -64 157 -152 157c-87 0 -169 -70 -171 -157v-298h-72v754h72z" />
- <glyph glyph-name="i" unicode="i" horiz-adv-x="245"
-d="M164 608h-82v82h82v-82zM159 0h-72v526h72v-526z" />
- <glyph glyph-name="j" unicode="j" horiz-adv-x="279"
-d="M198 608h-82v82h82v-82zM121 -86v612h73v-610c0 -53 -30 -99 -73 -124c-20 -12 -45 -19 -72 -19c-13 0 -27 2 -39 5v78c11 -7 25 -12 39 -12c39 0 71 32 72 70z" />
- <glyph glyph-name="k" unicode="k" horiz-adv-x="517"
-d="M472 526l-274 -238l319 -288h-107l-268 241l-9 -9v-232h-72v754h72v-426l229 198h110z" />
- <glyph glyph-name="l" unicode="l" horiz-adv-x="235"
-d="M82 0v754h72v-754h-72z" />
- <glyph glyph-name="m" unicode="m" horiz-adv-x="921"
-d="M102 526v-64c42 40 109 64 171 64s110 -24 152 -64c13 -13 26 -28 36 -44c41 66 124 108 207 108c62 0 108 -24 150 -64c45 -42 73 -102 73 -168v-294h-73v298c-2 87 -62 157 -150 157s-170 -71 -171 -159v-296h-72v298c-3 87 -64 157 -152 157c-87 0 -169 -70 -171 -157
-v-298h-71v526h71z" />
- <glyph glyph-name="n" unicode="n" horiz-adv-x="527"
-d="M103 526v-64c42 40 109 64 171 64s109 -24 151 -64c44 -42 72 -102 72 -168v-294h-72v298c-2 87 -64 157 -151 157c-88 0 -169 -70 -171 -157v-298h-72v526h72z" />
- <glyph glyph-name="o" unicode="o" horiz-adv-x="600"
-d="M305 541c152 0 275 -121 275 -271s-123 -270 -275 -270s-285 120 -285 270s133 271 285 271zM304 67c114 0 207 90 207 203s-93 204 -207 204c-115 0 -215 -91 -215 -204s100 -203 215 -203z" />
- <glyph glyph-name="p" unicode="p" horiz-adv-x="654"
-d="M133 541v-97c53 58 132 97 216 97c152 0 275 -121 275 -271s-123 -270 -275 -270c-84 0 -163 38 -216 96v-309h-72v754h72zM348 67c115 0 207 90 207 203s-92 204 -207 204s-215 -91 -215 -204s100 -203 215 -203z" />
- <glyph glyph-name="q" unicode="q" horiz-adv-x="654"
-d="M521 444v97h72v-754h-72v309c-53 -58 -132 -96 -216 -96c-152 0 -274 120 -274 270s122 271 274 271c84 0 163 -39 216 -97zM306 67c115 0 215 90 215 203s-100 204 -215 204c-114 0 -207 -91 -207 -204s93 -203 207 -203z" />
- <glyph glyph-name="r" unicode="r" horiz-adv-x="379"
-d="M143 526v-64c42 40 99 64 161 64c19 0 38 -3 55 -7v-75c-17 6 -36 11 -55 11c-87 0 -159 -70 -161 -157v-298h-71v526h71z" />
- <glyph glyph-name="s" unicode="s" horiz-adv-x="407"
-d="M321 434l45 47c-50 49 -101 74 -151 74c-43 0 -78 -14 -107 -41c-28 -28 -42 -62 -42 -103c0 -32 9 -59 26 -85c17 -25 52 -49 101 -75c45 -24 75 -42 88 -57c13 -16 19 -35 19 -55c0 -24 -11 -45 -30 -63c-19 -17 -43 -27 -71 -27c-40 0 -78 21 -114 61l-44 -51
-c18 -24 42 -43 71 -56s58 -20 90 -20c47 0 85 15 117 46c32 32 48 69 48 113c0 32 -10 60 -28 86c-18 25 -55 51 -107 78c-43 22 -71 42 -84 58s-20 33 -20 50c0 20 9 38 25 53c16 14 35 22 58 22c36 0 73 -18 110 -55z" />
- <glyph glyph-name="t" unicode="t" horiz-adv-x="336"
-d="M205 526h91v-60h-91v-466h-72v466h-92v60h92v228h72v-228z" />
- <glyph glyph-name="u" unicode="u" horiz-adv-x="568"
-d="M445 0v47c-42 -40 -110 -64 -172 -64s-108 24 -150 64c-44 43 -72 102 -72 168v311h72v-315c2 -87 63 -157 150 -157c88 0 169 70 172 157v315h72v-526h-72z" />
- <glyph glyph-name="v" unicode="v" horiz-adv-x="537"
-d="M269 159l169 367h79l-248 -539l-249 539h79z" />
- <glyph glyph-name="w" unicode="w" horiz-adv-x="865"
-d="M610 167l156 362h79l-234 -542l-179 406l-178 -406l-234 542h79l156 -362l177 405z" />
- <glyph glyph-name="x" unicode="x" horiz-adv-x="577"
-d="M539 526l-204 -252l222 -274h-93l-175 217l-176 -217h-93l223 274l-204 252h93l157 -194l156 194h94z" />
- <glyph glyph-name="y" unicode="y" horiz-adv-x="558"
-d="M280 160l169 366h78l-347 -753h-80l140 301l-209 452h79z" />
- <glyph glyph-name="z" unicode="z" horiz-adv-x="560"
-d="M48 526h492l-378 -466h352v-60h-494l378 466h-350v60z" />
- <glyph glyph-name="zero" unicode="0" horiz-adv-x="583"
-d="M288 755c205 0 255 -224 255 -386s-50 -386 -255 -386s-247 226 -247 386s41 386 247 386zM291 49c157 0 183 201 183 319c0 117 -26 318 -183 318c-162 0 -180 -200 -180 -318s18 -319 180 -319z" />
- <glyph glyph-name="one" unicode="1" horiz-adv-x="317"
-d="M61 735h175v-735h-73v664h-102v71z" />
- <glyph glyph-name="two" unicode="2" horiz-adv-x="583"
-d="M464 386l-267 -314h325v-72h-481l255 299s117 135 128 152s19 47 19 75c0 87 -70 158 -158 158c-87 0 -158 -71 -158 -158c0 -26 6 -49 17 -71h-74c-8 23 -13 45 -13 71c0 125 103 228 228 228c117 0 213 -88 226 -202c1 -8 1 -18 1 -26c0 -53 -18 -102 -48 -140z" />
- <glyph glyph-name="three" unicode="3" horiz-adv-x="567"
-d="M156 563h-72c2 105 89 192 195 192s193 -87 193 -195c0 -63 -31 -119 -78 -154c67 -40 112 -113 112 -196c0 -126 -102 -227 -227 -227c-123 0 -223 96 -228 217h72c5 -81 73 -147 156 -147c86 0 155 71 155 157s-69 156 -155 156v71c68 0 122 55 122 123
-s-54 123 -122 123s-122 -53 -123 -120z" />
- <glyph glyph-name="four" unicode="4" horiz-adv-x="589"
-d="M439 775v-494h89v-72h-89v-209h-71v209h-327zM179 281h189v267z" />
- <glyph glyph-name="five" unicode="5" horiz-adv-x="592"
-d="M254 663l-36 -192c20 6 42 9 65 9c137 0 248 -112 248 -249s-111 -248 -248 -248c-117 0 -205 80 -232 190h73c25 -71 81 -122 160 -122c99 0 179 80 179 179c0 98 -80 180 -179 180c-26 0 -53 -6 -81 -14c-30 -8 -51 -14 -78 -27l70 366h317v-72h-258z" />
- <glyph glyph-name="six" unicode="6" horiz-adv-x="557"
-d="M424 725l-187 -292c14 2 28 4 42 4c125 0 227 -102 227 -227c0 -126 -102 -227 -227 -227c-106 0 -196 73 -221 171c-5 17 -7 37 -7 56c0 43 13 83 33 117l6 10l272 427zM157 308l-19 -28c-10 -22 -16 -45 -16 -70c0 -86 71 -157 157 -157s155 71 155 157
-s-69 156 -155 156c-49 0 -93 -23 -122 -58z" />
- <glyph glyph-name="seven" unicode="7" horiz-adv-x="569"
-d="M61 664v71h467l-394 -754l-64 33l340 650h-349z" />
- <glyph glyph-name="eight" unicode="8" horiz-adv-x="557"
-d="M394 406c67 -40 112 -113 112 -196c0 -126 -102 -227 -227 -227c-126 0 -228 101 -228 227c0 83 44 156 111 196c-47 35 -78 91 -78 154c0 108 87 195 195 195s193 -87 193 -195c0 -63 -30 -119 -78 -154zM156 560c0 -68 55 -123 123 -123s122 55 122 123
-s-54 123 -122 123s-123 -55 -123 -123zM279 53c86 0 155 71 155 157s-69 156 -155 156s-157 -70 -157 -156s71 -157 157 -157z" />
- <glyph glyph-name="nine" unicode="9" horiz-adv-x="536"
-d="M123 12l186 292c-13 -2 -27 -4 -41 -4c-126 0 -227 102 -227 227c0 126 101 228 227 228c105 0 194 -73 220 -171c4 -17 8 -38 8 -57c0 -43 -13 -82 -33 -116l-7 -11l-273 -427zM389 429l19 29c11 22 16 44 16 69c0 86 -70 157 -156 157s-156 -71 -156 -157
-s70 -155 156 -155c49 0 92 22 121 57z" />
- <glyph glyph-name="asterisk" unicode="*" horiz-adv-x="614"
-d="M444 700l37 -62l-158 -58l158 -60l-37 -62l-129 108l28 -167h-73l30 167l-131 -108l-36 62l160 60l-160 58l36 62l131 -108l-30 167h73l-28 -167z" />
- <glyph glyph-name="backslash" unicode="\" horiz-adv-x="661"
-d="M51 806h82l477 -854h-83z" />
- <glyph glyph-name="colon" unicode=":" horiz-adv-x="614"
-d="M269 509h77v-77h-77v77zM269 82h77v-77h-77v77z" />
- <glyph glyph-name="comma" unicode="," horiz-adv-x="614"
-d="M300 116l70 -33l-94 -196l-60 29z" />
- <glyph glyph-name="ellipsis" unicode="&#x2026;" horiz-adv-x="0"
- />
- <glyph glyph-name="exclam" unicode="!" horiz-adv-x="614"
-d="M271 729h73v-570h-73v570zM269 77h77v-77h-77v77z" />
- <glyph glyph-name="numbersign" unicode="#" horiz-adv-x="595"
-d="M575 527v-60h-120l-24 -161h114v-60h-123l-36 -246h-60l35 246h-161l-37 -246h-61l37 246h-119v60h128l24 161h-121v60h130l34 232h60l-33 -232h161l35 232h61l-35 -232h111zM209 306h162l23 161h-162z" />
- <glyph glyph-name="period" unicode="." horiz-adv-x="614"
-d="M269 77h77v-77h-77v77z" />
- <glyph glyph-name="periodcentered" unicode="&#xb7;" horiz-adv-x="614"
-d="M269 343h77v-77h-77v77z" />
- <glyph glyph-name="question" unicode="?" horiz-adv-x="614"
-d="M188 450h-74c-7 23 -12 46 -12 71c0 126 81 210 207 210c117 0 191 -64 204 -178c1 -8 1 -17 1 -26c0 -53 -14 -98 -50 -135c-35 -35 -59 -58 -97 -91c-41 -36 -41 -98 -41 -144h-77c0 108 24 153 59 188c34 34 83 64 109 97c22 26 28 57 28 85c0 87 -49 136 -136 136
-c-88 0 -138 -55 -138 -142c0 -26 6 -49 17 -71zM249 77h77v-77h-77v77z" />
- <glyph glyph-name="quotedbl" unicode="&#x22;" horiz-adv-x="614"
-d="M176 763h95v-113l-56 -118l-36 18l49 118h-52v95zM343 763h95v-113l-56 -118l-37 18l50 118h-52v95z" />
- <glyph glyph-name="quotesingle" unicode="'" horiz-adv-x="614"
-d="M260 763h94v-113l-56 -118l-36 18l50 118h-52v95z" />
- <glyph glyph-name="semicolon" unicode=";" horiz-adv-x="614"
-d="M297 509h77v-77h-77v77zM314 116l70 -33l-93 -196l-61 29z" />
- <glyph glyph-name="slash" unicode="/" horiz-adv-x="614"
-d="M116 -48l306 854h77l-306 -854h-77z" />
- <glyph glyph-name="underscore" unicode="_" horiz-adv-x="614"
-d="M45 -83h524v-60h-524v60z" />
- <glyph glyph-name="braceleft" unicode="{" horiz-adv-x="614"
-d="M452 859h-28c-29 0 -51 -2 -63 -5c-22 -6 -40 -17 -54 -31c-13 -14 -24 -32 -31 -56c-6 -24 -10 -64 -10 -118c-1 -55 -1 -91 -2 -105c-2 -32 -7 -56 -15 -73c-8 -16 -21 -30 -37 -40c-12 -7 -29 -11 -49 -12v-81c25 -1 44 -8 59 -19c16 -12 28 -28 34 -51
-c6 -22 10 -63 10 -124c0 -60 2 -100 5 -122c4 -32 13 -57 26 -75c14 -18 31 -32 54 -40c15 -6 39 -8 73 -8h28v77c-33 0 -55 3 -65 7s-17 9 -21 15c-7 10 -12 24 -14 42c-1 11 -2 49 -2 114c0 72 -8 122 -24 154s-43 56 -80 71c33 15 57 33 71 56c15 22 26 53 30 94
-c2 22 3 71 3 149c0 43 7 71 18 84c11 12 33 18 68 18h16v79z" />
- <glyph glyph-name="braceright" unicode="}" horiz-adv-x="614"
-d="M452 338v81c-25 1 -45 7 -61 19c-15 11 -27 28 -33 50c-7 22 -10 64 -10 125c-1 59 -2 101 -5 123c-4 31 -13 56 -27 74c-13 19 -30 33 -53 40c-15 6 -40 9 -73 9h-27v-79h15c30 0 50 -3 60 -10s17 -20 21 -37c3 -12 4 -55 4 -129c0 -71 9 -120 24 -151s42 -56 81 -74
-c-29 -12 -53 -30 -69 -53s-27 -55 -32 -95c-2 -22 -4 -72 -4 -152c0 -43 -5 -71 -16 -83s-34 -20 -69 -20h-15v-77h27c29 0 50 1 63 5c22 6 40 16 53 30c14 13 25 33 32 57c6 24 10 63 10 118c1 55 1 90 2 105c1 32 7 56 16 73c8 16 20 30 36 40c12 7 30 11 50 11z" />
- <glyph glyph-name="bracketleft" unicode="[" horiz-adv-x="614"
-d="M391 856v-73h-96v-809h96v-72h-168v954h168z" />
- <glyph glyph-name="bracketright" unicode="]" horiz-adv-x="614"
-d="M223 783v73h168v-954h-168v72h96v809h-96z" />
- <glyph glyph-name="parenleft" unicode="(" horiz-adv-x="614"
-d="M398 818h-81c-33 -76 -58 -158 -75 -247s-26 -180 -26 -273c0 -87 8 -171 22 -252c15 -80 34 -150 59 -209h77c-26 61 -47 134 -62 215c-14 82 -21 167 -21 255c0 95 9 188 28 277c20 89 46 166 79 234z" />
- <glyph glyph-name="parenright" unicode=")" horiz-adv-x="614"
-d="M216 -163h81c33 76 59 158 76 247s25 180 25 273c0 87 -7 170 -21 251s-35 151 -60 210h-76c26 -62 46 -134 61 -216c14 -81 22 -166 22 -254c0 -95 -10 -187 -29 -276s-46 -168 -79 -235z" />
- <glyph glyph-name="emdash" unicode="&#x2014;" horiz-adv-x="614"
-d="M629 406v-73h-643v73h643z" />
- <glyph glyph-name="endash" unicode="&#x2013;" horiz-adv-x="614"
-d="M475 406v-73h-336v73h336z" />
- <glyph glyph-name="hyphen" unicode="-" horiz-adv-x="614"
-d="M444 406v-73h-274v73h274z" />
- <glyph glyph-name="guillemotleft" unicode="&#x3c;" horiz-adv-x="614"
-d="M565 98l-505 232l-11 6v67l11 7l505 230v-79l-418 -191l418 -192v-80z" />
- <glyph glyph-name="guillemotright" unicode="&#x3e;" horiz-adv-x="614"
-d="M49 640l505 -230l11 -7v-67l-11 -6l-505 -232v80l418 192l-418 191v79z" />
- <glyph glyph-name="guilsinglleft" unicode="&#x2039;" horiz-adv-x="614"
-d="M565 98l-505 232l-11 6v67l11 7l505 230v-79l-418 -191l418 -192v-80z" />
- <glyph glyph-name="guilsinglright" unicode="&#x203a;" horiz-adv-x="614"
-d="M49 640l505 -230l11 -7v-67l-11 -6l-505 -232v80l418 192l-418 191v79z" />
- <glyph glyph-name="quotedblbase" unicode="&#x201e;" horiz-adv-x="614"
- />
- <glyph glyph-name="quotedblleft" unicode="&#x201c;" horiz-adv-x="0"
- />
- <glyph glyph-name="quotedblright" unicode="&#x201d;" horiz-adv-x="0"
- />
- <glyph glyph-name="quoteleft" unicode="&#x2018;" horiz-adv-x="614"
- />
- <glyph glyph-name="quoteright" unicode="&#x2019;" horiz-adv-x="614"
- />
- <glyph glyph-name="quotesinglbase" unicode="&#x201a;" horiz-adv-x="614"
- />
- <glyph glyph-name="space" unicode=" " horiz-adv-x="368"
- />
- <glyph glyph-name="dollar" unicode="$" horiz-adv-x="614"
-d="M354 687v-256c65 -47 107 -89 131 -125c24 -37 35 -73 36 -110c2 -60 -44 -175 -167 -195v-119h-71v117c-110 14 -164 103 -192 154l63 37c38 -71 81 -109 129 -119v319c-56 43 -93 75 -107 94c-26 35 -39 73 -39 113c0 65 41 155 146 170v68h71v-69
-c79 -15 125 -77 155 -117l-60 -45c-22 29 -51 68 -95 83zM283 485v205c-54 -14 -70 -63 -70 -90c0 -46 29 -78 47 -95c3 -4 12 -11 23 -20zM354 333v-257c65 22 88 83 87 118c0 25 -8 48 -24 72c-14 19 -35 42 -63 67z" />
- <glyph glyph-name="asciitilde" unicode="~" horiz-adv-x="614"
-d="M561 329v82c-42 -27 -70 -43 -84 -49c-14 -5 -29 -8 -43 -8c-11 0 -25 3 -39 7s-42 17 -81 35c-57 27 -101 40 -134 40c-15 0 -31 -2 -47 -8c-16 -5 -43 -19 -80 -39v-81c37 23 65 37 83 43c17 7 34 10 48 10c10 0 22 -2 34 -6s41 -16 85 -36c56 -26 100 -37 132 -37
-c14 0 30 2 46 8c15 5 43 19 80 39z" />
- <glyph glyph-name="equal" unicode="=" horiz-adv-x="614"
-d="M560 505v-72h-506v72h506zM560 286v-73h-506v73h506z" />
- <glyph glyph-name="percent" unicode="%" horiz-adv-x="770"
-d="M72 -51l534 819h77l-536 -819h-75zM184 753c95 0 173 -78 173 -173c0 -96 -78 -174 -173 -174c-96 0 -174 78 -174 174c0 95 78 173 174 173zM184 468c61 0 111 51 111 112s-50 110 -111 110s-111 -49 -111 -110s50 -112 111 -112zM586 326c96 0 174 -78 174 -174
-c0 -95 -78 -174 -174 -174c-95 0 -173 79 -173 174c0 96 78 174 173 174zM586 41c61 0 111 50 111 111s-50 111 -111 111s-111 -50 -111 -111s50 -111 111 -111z" />
- <glyph glyph-name="plus" unicode="+" horiz-adv-x="614"
-d="M343 394h217v-71h-217v-218h-72v218h-217v71h217v217h72v-217z" />
- <glyph glyph-name="ampersand" unicode="&#x26;" horiz-adv-x="638"
-d="M596 220l-49 52c-23 -20 -53 -44 -93 -73l-73 73l-112 118c51 43 86 79 103 107s26 53 26 78c0 24 -7 45 -20 67c-13 20 -33 37 -59 49c-25 12 -52 19 -83 19c-48 0 -89 -13 -122 -42c-28 -24 -42 -54 -42 -91c0 -20 5 -43 17 -66c11 -24 37 -60 77 -108
-c-71 -56 -117 -103 -141 -140c-23 -37 -35 -73 -35 -110c0 -48 17 -89 52 -122c34 -32 79 -48 136 -48c42 0 83 7 121 22c39 14 90 47 150 96l98 -100h102c-18 22 -39 45 -65 70c-33 33 -59 57 -79 75c29 20 59 45 91 74zM224 444c-31 34 -53 66 -69 94c-7 12 -11 24 -11 37
-c0 17 9 33 25 46c16 12 37 18 63 18c28 0 51 -6 67 -18s25 -27 25 -44c0 -14 -7 -32 -20 -51c-17 -27 -45 -54 -80 -82zM282 273l116 -119c-51 -40 -96 -70 -136 -86c-25 -11 -50 -17 -77 -17c-34 0 -63 11 -87 33s-35 46 -35 74c0 24 10 50 29 78s61 64 123 111
-c25 -28 48 -52 67 -74z" />
- <glyph glyph-name="at" unicode="@" horiz-adv-x="770"
-d="M524 541h53s-39 -221 -59 -332c-17 -96 108 -14 145 29c36 41 118 223 -27 368c-131 130 -329 94 -415 44c-101 -59 -192 -197 -162 -356c33 -178 158 -259 233 -278c163 -41 270 -2 372 103c17 0 32 1 52 1c-69 -105 -186 -162 -284 -164c-86 -1 -191 2 -299 102
-c-109 101 -145 252 -110 389c35 136 138 247 279 281s327 -2 421 -168c80 -141 14 -287 -38 -345c-80 -90 -247 -163 -223 -30c1 5 2 12 3 18c-39 -36 -88 -59 -139 -59c-101 0 -176 88 -159 197s121 197 222 197c53 0 96 -25 124 -64c7 40 11 67 11 67zM332 193
-c63 0 124 46 150 109c5 24 10 49 14 74c-4 66 -50 113 -116 113c-76 0 -134 -66 -147 -148s23 -148 99 -148z" />
- <glyph glyph-name="bar" unicode="|" horiz-adv-x="614"
-d="M271 856h72v-954h-72v954z" />
- <glyph glyph-name="asciicircum" unicode="^" horiz-adv-x="614"
-d="M37 254l230 505l6 11h68l6 -11l231 -505h-79l-192 419l-191 -419h-79z" />
- </font>
-</defs></svg>
diff --git a/docs/theme/mkdocs/fonts/LigatureSymbols/LigatureSymbols-2.11.ttf b/docs/theme/mkdocs/fonts/LigatureSymbols/LigatureSymbols-2.11.ttf
deleted file mode 100644
index 0338d4cb96..0000000000
--- a/docs/theme/mkdocs/fonts/LigatureSymbols/LigatureSymbols-2.11.ttf
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/fonts/LigatureSymbols/LigatureSymbols-2.11.woff b/docs/theme/mkdocs/fonts/LigatureSymbols/LigatureSymbols-2.11.woff
deleted file mode 100644
index 8a823128a8..0000000000
--- a/docs/theme/mkdocs/fonts/LigatureSymbols/LigatureSymbols-2.11.woff
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/fonts/LigatureSymbols/README.txt b/docs/theme/mkdocs/fonts/LigatureSymbols/README.txt
deleted file mode 100644
index da0665ed67..0000000000
--- a/docs/theme/mkdocs/fonts/LigatureSymbols/README.txt
+++ /dev/null
@@ -1,126 +0,0 @@
-
-This font was found and taken from:
-http://kudakurage.com/ligature_symbols/
-
-
-Use it as follows:
-
-<!-- HTML -->
-
-<p>Simple use for mailto link.</p>
-<a href="mailto:mail@example.com" class="lsf">mail</a>
-
-<p>Use tha icon with text.</p>
-<a href="http://twitter.com/" class="lsf-icon" title="twitter">Twitter</a>
-
-<p>Use tha icon with unicode.</p>
-<a href="http://amazon.com/" class="lsf-icon amazon">Amazon</a>
-
-
-/* CSS */
-
-@font-face {
- font-family: 'LigatureSymbols';
- src: url('LigatureSymbols-2.11.eot');
- src: url('LigatureSymbols-2.11.eot?#iefix') format('embedded-opentype'),
- url('LigatureSymbols-2.11.woff') format('woff'),
- url('LigatureSymbols-2.11.ttf') format('truetype'),
- url('LigatureSymbols-2.11.svg#LigatureSymbols') format('svg');
- src: url('LigatureSymbols-2.11.ttf') format('truetype');
- font-weight: normal;
- font-style: normal;
-}
-
-.lsf, .lsf-icon:before {
- font-family: 'LigatureSymbols';
- -webkit-text-rendering: optimizeLegibility;
- -moz-text-rendering: optimizeLegibility;
- -ms-text-rendering: optimizeLegibility;
- -o-text-rendering: optimizeLegibility;
- text-rendering: optimizeLegibility;
- -webkit-font-smoothing: antialiased;
- -moz-font-smoothing: antialiased;
- -ms-font-smoothing: antialiased;
- -o-font-smoothing: antialiased;
- font-smoothing: antialiased;
-}
-
-.lsf-icon:before {
- content:attr(title);
- margin-right:0.3em;
- font-size:130%;
-}
-
-.lsf-icon.amazon:before {
- content: '\E007';
-}
-
-
-
-
-
-Use by including this in your style sheet:
-
-
-
-// LigatureSymbols font kit
-// ----------------------------------- // -----------------------------------
-
-
-@font-face {
- font-family: 'LigatureSymbols';
- src: url('../fonts/LigatureSymbols/LigatureSymbols-2.11.eot');
- src: url('../fonts/LigatureSymbols/LigatureSymbols-2.11.eot?#iefix') format('embedded-opentype'),
- url('../fonts/LigatureSymbols/LigatureSymbols-2.11.woff') format('woff'),
- url('../fonts/LigatureSymbols/LigatureSymbols-2.11.ttf') format('truetype'),
- url('../fonts/LigatureSymbols/LigatureSymbols-2.11.svg#LigatureSymbols') format('svg');
- font-weight: normal;
- font-style: normal;
-}
-
-.lsf {
- font-family: 'LigatureSymbols';
- -webkit-text-rendering: optimizeLegibility;
- -moz-text-rendering: optimizeLegibility;
- -ms-text-rendering: optimizeLegibility;
- -o-text-rendering: optimizeLegibility;
- text-rendering: optimizeLegibility;
- -webkit-font-smoothing: antialiased;
- -moz-font-smoothing: antialiased;
- -ms-font-smoothing: antialiased;
- -o-font-smoothing: antialiased;
- font-smoothing: antialiased;
- -webkit-font-feature-settings: "liga" 1, "dlig" 1;
- -moz-font-feature-settings: "liga=1, dlig=1";
- -ms-font-feature-settings: "liga" 1, "dlig" 1;
- -o-font-feature-settings: "liga" 1, "dlig" 1;
- font-feature-settings: "liga" 1, "dlig" 1;
-}
-.lsf-icon:before {
- content:attr(title);
- margin-right:0.3em;
- font-size:130%;
- font-family: 'LigatureSymbols';
- -webkit-text-rendering: optimizeLegibility;
- -moz-text-rendering: optimizeLegibility;
- -ms-text-rendering: optimizeLegibility;
- -o-text-rendering: optimizeLegibility;
- text-rendering: optimizeLegibility;
- -webkit-font-smoothing: antialiased;
- -moz-font-smoothing: antialiased;
- -ms-font-smoothing: antialiased;
- -o-font-smoothing: antialiased;
- font-smoothing: antialiased;
- -webkit-font-feature-settings: "liga" 1, "dlig" 1;
- -moz-font-feature-settings: "liga=1, dlig=1";
- -ms-font-feature-settings: "liga" 1, "dlig" 1;
- -o-font-feature-settings: "liga" 1, "dlig" 1;
- font-feature-settings: "liga" 1, "dlig" 1;
-}
-
-
-
-
-
-And then practice it by:
-
diff --git a/docs/theme/mkdocs/fonts/LigatureSymbols/index.html b/docs/theme/mkdocs/fonts/LigatureSymbols/index.html
deleted file mode 100755
index 254ae9fd91..0000000000
--- a/docs/theme/mkdocs/fonts/LigatureSymbols/index.html
+++ /dev/null
@@ -1,1350 +0,0 @@
-<!doctype html>
-<head id="www-sitename-com" data-template-set="html5-reset">
- <meta charset="utf-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
- <title>Ligature Symbols</title>
- <meta name="viewport" content="initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=0" />
- <meta name="title" content="Ligature Symbols">
- <meta name="description" content="">
- <meta name="author" content="Kazuyuki Motoyama">
- <meta name="Copyright" content="Copyright Kazuyuki Motoyama 2012. All Rights Reserved.">
- <link rel="shortcut icon" href="../favicon.ico">
- <link rel="stylesheet" href="style.css" type="text/css" charset="utf-8" />
-</head>
-<body>
-<div id="body">
- <h1 class="lsf">Ligature kudakurage Symbols</h1>
- <div class="name lsf">by Kazuyuki Motoyama</div>
- <img src="http://cdn-ak.f.st-hatena.com/images/fotolife/k/kudakurage/20120720/20120720104355.png" class="main-image">
- <div class="lsf-input"><input type="text" class="lsf" placeholder="I love Symbols Web Font wink" /></div>
- <div class="table">
- <table>
- <tr class="header">
- <th class="symbol">Symbol</th>
- <th class="ligature">Ligature</th>
- <th class="unicode">Unicode</th>
- </tr>
- <tr>
- <td class="lsf symbol">table</td>
- <td class="ligature">table, cell</td>
- <td class="unicode">\E127</td>
- </tr>
- <tr>
- <td class="lsf symbol">copy</td>
- <td class="ligature">copy, files</td>
- <td class="unicode">\E038</td>
- </tr>
- <tr>
- <td class="lsf symbol">cut</td>
- <td class="ligature">cut, scissors</td>
- <td class="unicode">\E03b</td>
- </tr>
- <tr>
- <td class="lsf symbol">backspace</td>
- <td class="ligature">backspace</td>
- <td class="unicode">\E010</td>
- </tr>
- <tr>
- <td class="lsf symbol">alignleft</td>
- <td class="ligature">alignleft</td>
- <td class="unicode">\E005</td>
- </tr>
- <tr>
- <td class="lsf symbol">aligncenter</td>
- <td class="ligature">aligncenter</td>
- <td class="unicode">\E004</td>
- </tr>
- <tr>
- <td class="lsf symbol">alignright</td>
- <td class="ligature">alignright</td>
- <td class="unicode">\E006</td>
- </tr>
- <tr>
- <td class="lsf symbol">alignadjust</td>
- <td class="ligature">alignadjust</td>
- <td class="unicode">\E003</td>
- </tr>
- <tr>
- <td class="lsf symbol">italic</td>
- <td class="ligature">italic</td>
- <td class="unicode">\E079</td>
- </tr>
- <tr>
- <td class="lsf symbol">bold</td>
- <td class="ligature">bold</td>
- <td class="unicode">\E01f</td>
- </tr>
- <tr>
- <td class="lsf symbol">underline</td>
- <td class="ligature">underline</td>
- <td class="unicode">\E132</td>
- </tr>
- <tr>
- <td class="lsf symbol">strike</td>
- <td class="ligature">strike</td>
- <td class="unicode">\E159</td>
- </tr>
- <tr>
- <td class="lsf symbol">emphasis</td>
- <td class="ligature">emphasis</td>
- <td class="unicode">\E152</td>
- </tr>
- <tr>
- <td class="lsf symbol">code</td>
- <td class="ligature">code</td>
- <td class="unicode">\E032</td>
- </tr>
- <tr>
- <td class="lsf symbol">link</td>
- <td class="ligature">link, chain</td>
- <td class="unicode">\E082</td>
- </tr>
- <tr>
- <td class="lsf symbol">quote</td>
- <td class="ligature">quote</td>
- <td class="unicode">\E10b</td>
- </tr>
- <tr>
- <td class="lsf symbol">graph</td>
- <td class="ligature">graph</td>
- <td class="unicode">\E05b</td>
- </tr>
- <tr>
- <td class="lsf symbol">magic</td>
- <td class="ligature">magic, effect</td>
- <td class="unicode">\E089</td>
- </tr>
- <tr>
- <td class="lsf symbol">brush</td>
- <td class="ligature">brush</td>
- <td class="unicode">\E022</td>
- </tr>
- <tr>
- <td class="lsf symbol">color</td>
- <td class="ligature">color, palette</td>
- <td class="unicode">\E033</td>
- </tr>
- <tr>
- <td class="lsf symbol">contrast</td>
- <td class="ligature">contrast, adjust</td>
- <td class="unicode">\E001</td>
- </tr>
- <tr>
- <td class="lsf symbol">ink</td>
- <td class="ligature">ink, water</td>
- <td class="unicode">\E14a</td>
- </tr>
- <tr>
- <td class="lsf symbol">gradation</td>
- <td class="ligature">gradation, grayscale</td>
- <td class="unicode">\E149</td>
- </tr>
- <tr>
- <td class="lsf symbol">sepia</td>
- <td class="ligature">sepia, grunge</td>
- <td class="unicode">\E14e</td>
- </tr>
- <tr>
- <td class="lsf symbol">invert</td>
- <td class="ligature">invert</td>
- <td class="unicode">\E14b</td>
- </tr>
- <tr>
- <td class="lsf symbol">paint</td>
- <td class="ligature">paint</td>
- <td class="unicode">\E09b</td>
- </tr>
- <tr>
- <td class="lsf symbol">paramater</td>
- <td class="ligature">paramater, param, slider</td>
- <td class="unicode">\E09c</td>
- </tr>
- <tr>
- <td class="lsf symbol">crop</td>
- <td class="ligature">crop</td>
- <td class="unicode">\E039</td>
- </tr>
- <tr>
- <td class="lsf symbol">check</td>
- <td class="ligature">check, ok</td>
- <td class="unicode">\E029</td>
- </tr>
- <tr>
- <td class="lsf symbol">checkbox</td>
- <td class="ligature">checkbox</td>
- <td class="unicode">\E02a</td>
- </tr>
- <tr>
- <td class="lsf symbol">checkboxempty</td>
- <td class="ligature">checkboxempty</td>
- <td class="unicode">\E02b</td>
- </tr>
- <tr>
- <td class="lsf symbol">pc</td>
- <td class="ligature">pc, display, computer</td>
- <td class="unicode">\E09e</td>
- </tr>
- <tr>
- <td class="lsf symbol">keyboard</td>
- <td class="ligature">keyboard</td>
- <td class="unicode">\E07d</td>
- </tr>
- <tr>
- <td class="lsf symbol">mobile</td>
- <td class="ligature">mobile, iphone, smartphone</td>
- <td class="unicode">\E078</td>
- </tr>
- <tr>
- <td class="lsf symbol">horizontal</td>
- <td class="ligature">horizontal</td>
- <td class="unicode">\E071</td>
- </tr>
- <tr>
- <td class="lsf symbol">vertical</td>
- <td class="ligature">vertical</td>
- <td class="unicode">\E138</td>
- </tr>
- <tr>
- <td class="lsf symbol">web</td>
- <td class="ligature">web</td>
- <td class="unicode">\E13f</td>
- </tr>
- <tr>
- <td class="lsf symbol">mail</td>
- <td class="ligature">mail</td>
- <td class="unicode">\E08a</td>
- </tr>
- <tr>
- <td class="lsf symbol">shopping</td>
- <td class="ligature">shopping, cart</td>
- <td class="unicode">\E119</td>
- </tr>
- <tr>
- <td class="lsf symbol">dashboard</td>
- <td class="ligature">dashboard</td>
- <td class="unicode">\E03c</td>
- </tr>
- <tr>
- <td class="lsf symbol">key</td>
- <td class="ligature">key</td>
- <td class="unicode">\E07c</td>
- </tr>
- <tr>
- <td class="lsf symbol">sns</td>
- <td class="ligature">sns, network</td>
- <td class="unicode">\E11f</td>
- </tr>
- <tr>
- <td class="lsf symbol">calendar</td>
- <td class="ligature">calendar</td>
- <td class="unicode">\E15e</td>
- </tr>
- <tr>
- <td class="lsf symbol">dailycalendar</td>
- <td class="ligature">dailycalendar</td>
- <td class="unicode">\E025</td>
- </tr>
- <tr>
- <td class="lsf symbol">ban</td>
- <td class="ligature">ban</td>
- <td class="unicode">\E012</td>
- </tr>
- <tr>
- <td class="lsf symbol">remove</td>
- <td class="ligature">remove, close</td>
- <td class="unicode">\E10f</td>
- </tr>
- <tr>
- <td class="lsf symbol">pen</td>
- <td class="ligature">pen, pencil, write</td>
- <td class="unicode">\E09f</td>
- </tr>
- <tr>
- <td class="lsf symbol">eraser</td>
- <td class="ligature">eraser</td>
- <td class="unicode">\E148</td>
- </tr>
- <tr>
- <td class="lsf symbol">edit</td>
- <td class="ligature">edit, addnew</td>
- <td class="unicode">\E041</td>
- </tr>
- <tr>
- <td class="lsf symbol">tabs</td>
- <td class="ligature">tabs</td>
- <td class="unicode">\E095</td>
- </tr>
- <tr>
- <td class="lsf symbol">tag</td>
- <td class="ligature">tag</td>
- <td class="unicode">\E128</td>
- </tr>
- <tr>
- <td class="lsf symbol">setup</td>
- <td class="ligature">setup, wrench, spanner</td>
- <td class="unicode">\E117</td>
- </tr>
- <tr>
- <td class="lsf symbol">setting</td>
- <td class="ligature">setting, gear</td>
- <td class="unicode">\E055</td>
- </tr>
- <tr>
- <td class="lsf symbol">etc</td>
- <td class="ligature">etc, ellipsis</td>
- <td class="unicode">\E043</td>
- </tr>
- <tr>
- <td class="lsf symbol">clip</td>
- <td class="ligature">clip, attach</td>
- <td class="unicode">\E030</td>
- </tr>
- <tr>
- <td class="lsf symbol">bookmark</td>
- <td class="ligature">bookmark</td>
- <td class="unicode">\E021</td>
- </tr>
- <tr>
- <td class="lsf symbol">book</td>
- <td class="ligature">book</td>
- <td class="unicode">\E020</td>
- </tr>
- <tr>
- <td class="lsf symbol">album</td>
- <td class="ligature">album</td>
- <td class="unicode">\E002</td>
- </tr>
- <tr>
- <td class="lsf symbol">user</td>
- <td class="ligature">user, you, human, man</td>
- <td class="unicode">\E137</td>
- </tr>
- <tr>
- <td class="lsf symbol">friend</td>
- <td class="ligature">friend, users</td>
- <td class="unicode">\E051</td>
- </tr>
- <tr>
- <td class="lsf symbol">group</td>
- <td class="ligature">group</td>
- <td class="unicode">\E05c</td>
- </tr>
- <tr>
- <td class="lsf symbol">frustrate</td>
- <td class="ligature">frustrate</td>
- <td class="unicode">\E052</td>
- </tr>
- <tr>
- <td class="lsf symbol">laugh</td>
- <td class="ligature">laugh</td>
- <td class="unicode">\E07f</td>
- </tr>
- <tr>
- <td class="lsf symbol">wink</td>
- <td class="ligature">wink</td>
- <td class="unicode">\E081</td>
- </tr>
- <tr>
- <td class="lsf symbol">smile</td>
- <td class="ligature">smile</td>
- <td class="unicode">\E11e</td>
- </tr>
- <tr>
- <td class="lsf symbol">surprise</td>
- <td class="ligature">surprise</td>
- <td class="unicode">\E124</td>
- </tr>
- <tr>
- <td class="lsf symbol">trouble</td>
- <td class="ligature">trouble</td>
- <td class="unicode">\E12d</td>
- </tr>
- <tr>
- <td class="lsf symbol">male</td>
- <td class="ligature">male, man</td>
- <td class="unicode">\E176</td>
- </tr>
- <tr>
- <td class="lsf symbol">female</td>
- <td class="ligature">female, woman, lady</td>
- <td class="unicode">\E175</td>
- </tr>
- <tr>
- <td class="lsf symbol">game</td>
- <td class="ligature">game</td>
- <td class="unicode">\E054</td>
- </tr>
- <tr>
- <td class="lsf symbol">globe</td>
- <td class="ligature">globe, global, earth</td>
- <td class="unicode">\E058</td>
- </tr>
- <tr>
- <td class="lsf symbol">home</td>
- <td class="ligature">home, house</td>
- <td class="unicode">\E072</td>
- </tr>
- <tr>
- <td class="lsf symbol">building</td>
- <td class="ligature">building</td>
- <td class="unicode">\E023</td>
- </tr>
- <tr>
- <td class="lsf symbol">rss</td>
- <td class="ligature">rss, feed</td>
- <td class="unicode">\E113</td>
- </tr>
- <tr>
- <td class="lsf symbol">server</td>
- <td class="ligature">server</td>
- <td class="unicode">\E16c</td>
- </tr>
- <tr>
- <td class="lsf symbol">sitemap</td>
- <td class="ligature">sitemap</td>
- <td class="unicode">\E16d</td>
- </tr>
- <tr>
- <td class="lsf symbol">app</td>
- <td class="ligature">app, application</td>
- <td class="unicode">\E009</td>
- </tr>
- <tr>
- <td class="lsf symbol">memo</td>
- <td class="ligature">memo</td>
- <td class="unicode">\E08d</td>
- </tr>
- <tr>
- <td class="lsf symbol">meal</td>
- <td class="ligature">meal, dish, lunch</td>
- <td class="unicode">\E08c</td>
- </tr>
- <tr>
- <td class="lsf symbol">coffee</td>
- <td class="ligature">coffee, cup</td>
- <td class="unicode">\E146</td>
- </tr>
- <tr>
- <td class="lsf symbol">spa</td>
- <td class="ligature">spa, onsen</td>
- <td class="unicode">\E177</td>
- </tr>
- <tr>
- <td class="lsf symbol">college</td>
- <td class="ligature">college</td>
- <td class="unicode">\E174</td>
- </tr>
- <tr>
- <td class="lsf symbol">bag</td>
- <td class="ligature">bag</td>
- <td class="unicode">\E173</td>
- </tr>
- <tr>
- <td class="lsf symbol">present</td>
- <td class="ligature">present, gift</td>
- <td class="unicode">\E109</td>
- </tr>
- <tr>
- <td class="lsf symbol">umbrella</td>
- <td class="ligature">umbrella</td>
- <td class="unicode">\E178</td>
- </tr>
- <tr>
- <td class="lsf symbol">twinkle</td>
- <td class="ligature">twinkle, spark, hot</td>
- <td class="unicode">\E073</td>
- </tr>
- <tr>
- <td class="lsf symbol">crown</td>
- <td class="ligature">crown</td>
- <td class="unicode">\E03a</td>
- </tr>
- <tr>
- <td class="lsf symbol">category</td>
- <td class="ligature">category, drawer</td>
- <td class="unicode">\E028</td>
- </tr>
- <tr>
- <td class="lsf symbol">circle</td>
- <td class="ligature">circle</td>
- <td class="unicode">\E02e</td>
- </tr>
- <tr>
- <td class="lsf symbol">info</td>
- <td class="ligature">info, information</td>
- <td class="unicode">\E075</td>
- </tr>
- <tr>
- <td class="lsf symbol">help</td>
- <td class="ligature">help</td>
- <td class="unicode">\E070</td>
- </tr>
- <tr>
- <td class="lsf symbol">refreshbutton</td>
- <td class="ligature">refreshbutton</td>
- <td class="unicode">\E14d</td>
- </tr>
- <tr>
- <td class="lsf symbol">terminal</td>
- <td class="ligature">terminal</td>
- <td class="unicode">\E16e</td>
- </tr>
- <tr>
- <td class="lsf symbol"></td>
- <td class="ligature"></td>
- <td class="unicode"></td>
- </tr>
- </table>
- </div>
- <div class="table">
- <table>
- <tr class="header">
- <th class="symbol">Symbol</th>
- <th class="ligature">Ligature</th>
- <th class="unicode">Unicode</th>
- </tr>
- <tr>
- <td class="lsf symbol">file</td>
- <td class="ligature">file</td>
- <td class="unicode">\E048</td>
- </tr>
- <tr>
- <td class="lsf symbol">print</td>
- <td class="ligature">print</td>
- <td class="unicode">\E10a</td>
- </tr>
- <tr>
- <td class="lsf symbol">delete</td>
- <td class="ligature">delete, trash</td>
- <td class="unicode">\E12c</td>
- </tr>
- <tr>
- <td class="lsf symbol">clear</td>
- <td class="ligature">clear</td>
- <td class="unicode">\E02f</td>
- </tr>
- <tr>
- <td class="lsf symbol">save</td>
- <td class="ligature">save, stock</td>
- <td class="unicode">\E115</td>
- </tr>
- <tr>
- <td class="lsf symbol">upload</td>
- <td class="ligature">upload</td>
- <td class="unicode">\E136</td>
- </tr>
- <tr>
- <td class="lsf symbol">cloud</td>
- <td class="ligature">cloud</td>
- <td class="unicode">\E031</td>
- </tr>
- <tr>
- <td class="lsf symbol">folder</td>
- <td class="ligature">folder</td>
- <td class="unicode">\E04c</td>
- </tr>
- <tr>
- <td class="lsf symbol">camera</td>
- <td class="ligature">camera</td>
- <td class="unicode">\E026</td>
- </tr>
- <tr>
- <td class="lsf symbol">photo</td>
- <td class="ligature">photo, images</td>
- <td class="unicode">\E101</td>
- </tr>
- <tr>
- <td class="lsf symbol">image</td>
- <td class="ligature">image, img</td>
- <td class="unicode">\E074</td>
- </tr>
- <tr>
- <td class="lsf symbol">barcode</td>
- <td class="ligature">barcode</td>
- <td class="unicode">\E013</td>
- </tr>
- <tr>
- <td class="lsf symbol">phone</td>
- <td class="ligature">phone, call</td>
- <td class="unicode">\E100</td>
- </tr>
- <tr>
- <td class="lsf symbol">music</td>
- <td class="ligature">music</td>
- <td class="unicode">\E094</td>
- </tr>
- <tr>
- <td class="lsf symbol">video</td>
- <td class="ligature">video</td>
- <td class="unicode">\E139</td>
- </tr>
- <tr>
- <td class="lsf symbol">playmedia</td>
- <td class="ligature">playmedia</td>
- <td class="unicode">\E107</td>
- </tr>
- <tr>
- <td class="lsf symbol">record</td>
- <td class="ligature">record, mic, microphone</td>
- <td class="unicode">\E10d</td>
- </tr>
- <tr>
- <td class="lsf symbol">play</td>
- <td class="ligature">play</td>
- <td class="unicode">\E106</td>
- </tr>
- <tr>
- <td class="lsf symbol">pause</td>
- <td class="ligature">pause</td>
- <td class="unicode">\E09d</td>
- </tr>
- <tr>
- <td class="lsf symbol">stop</td>
- <td class="ligature">stop</td>
- <td class="unicode">\E123</td>
- </tr>
- <tr>
- <td class="lsf symbol">eject</td>
- <td class="ligature">eject</td>
- <td class="unicode">\E042</td>
- </tr>
- <tr>
- <td class="lsf symbol">bell</td>
- <td class="ligature">bell</td>
- <td class="unicode">\E014</td>
- </tr>
- <tr>
- <td class="lsf symbol">volumeup</td>
- <td class="ligature">volumeup</td>
- <td class="unicode">\E13d</td>
- </tr>
- <tr>
- <td class="lsf symbol">volumedown</td>
- <td class="ligature">volumedown</td>
- <td class="unicode">\E13c</td>
- </tr>
- <tr>
- <td class="lsf symbol">volume</td>
- <td class="ligature">volume, volumeoff</td>
- <td class="unicode">\E13b</td>
- </tr>
- <tr>
- <td class="lsf symbol">off</td>
- <td class="ligature">off, power</td>
- <td class="unicode">\E098</td>
- </tr>
- <tr>
- <td class="lsf symbol">light</td>
- <td class="ligature">light, brightness</td>
- <td class="unicode">\E14c</td>
- </tr>
- <tr>
- <td class="lsf symbol">dark</td>
- <td class="ligature">dark, darkness</td>
- <td class="unicode">\E147</td>
- </tr>
- <tr>
- <td class="lsf symbol">lock</td>
- <td class="ligature">lock</td>
- <td class="unicode">\E086</td>
- </tr>
- <tr>
- <td class="lsf symbol">unlock</td>
- <td class="ligature">unlock</td>
- <td class="unicode">\E134</td>
- </tr>
- <tr>
- <td class="lsf symbol">flag</td>
- <td class="ligature">flag</td>
- <td class="unicode">\E04a</td>
- </tr>
- <tr>
- <td class="lsf symbol">wifi</td>
- <td class="ligature">wifi</td>
- <td class="unicode">\E140</td>
- </tr>
- <tr>
- <td class="lsf symbol">time</td>
- <td class="ligature">time</td>
- <td class="unicode">\E12b</td>
- </tr>
- <tr>
- <td class="lsf symbol">map</td>
- <td class="ligature">map</td>
- <td class="unicode">\E08b</td>
- </tr>
- <tr>
- <td class="lsf symbol">geo</td>
- <td class="ligature">geo</td>
- <td class="unicode">\E056</td>
- </tr>
- <tr>
- <td class="lsf symbol">location</td>
- <td class="ligature">location, direction</td>
- <td class="unicode">\E085</td>
- </tr>
- <tr>
- <td class="lsf symbol">pin</td>
- <td class="ligature">pin</td>
- <td class="unicode">\E103</td>
- </tr>
- <tr>
- <td class="lsf symbol">walking</td>
- <td class="ligature">walking</td>
- <td class="unicode">\E13e</td>
- </tr>
- <tr>
- <td class="lsf symbol">bicycle</td>
- <td class="ligature">bicycle</td>
- <td class="unicode">\E015</td>
- </tr>
- <tr>
- <td class="lsf symbol">car</td>
- <td class="ligature">car</td>
- <td class="unicode">\E027</td>
- </tr>
- <tr>
- <td class="lsf symbol">bus</td>
- <td class="ligature">bus</td>
- <td class="unicode">\E024</td>
- </tr>
- <tr>
- <td class="lsf symbol">plane</td>
- <td class="ligature">plane, airport</td>
- <td class="unicode">\E105</td>
- </tr>
- <tr>
- <td class="lsf symbol">compass</td>
- <td class="ligature">compass</td>
- <td class="unicode">\E036</td>
- </tr>
- <tr>
- <td class="lsf symbol">cursor</td>
- <td class="ligature">cursor</td>
- <td class="unicode">\E166</td>
- </tr>
- <tr>
- <td class="lsf symbol">pointer</td>
- <td class="ligature">pointer</td>
- <td class="unicode">\E16b</td>
- </tr>
- <tr>
- <td class="lsf symbol">grab</td>
- <td class="ligature">grab</td>
- <td class="unicode">\E169</td>
- </tr>
- <tr>
- <td class="lsf symbol">arrowup</td>
- <td class="ligature">arrowup</td>
- <td class="unicode">\E00e</td>
- </tr>
- <tr>
- <td class="lsf symbol">arrowright</td>
- <td class="ligature">arrowright</td>
- <td class="unicode">\E00d</td>
- </tr>
- <tr>
- <td class="lsf symbol">arrowdown</td>
- <td class="ligature">arrowdown</td>
- <td class="unicode">\E00b</td>
- </tr>
- <tr>
- <td class="lsf symbol">arrowleft</td>
- <td class="ligature">arrowleft</td>
- <td class="unicode">\E00c</td>
- </tr>
- <tr>
- <td class="lsf symbol">up</td>
- <td class="ligature">up</td>
- <td class="unicode">\E135</td>
- </tr>
- <tr>
- <td class="lsf symbol">right</td>
- <td class="ligature">right</td>
- <td class="unicode">\E112</td>
- </tr>
- <tr>
- <td class="lsf symbol">down</td>
- <td class="ligature">down</td>
- <td class="unicode">\E03e</td>
- </tr>
- <tr>
- <td class="lsf symbol">left</td>
- <td class="ligature">left</td>
- <td class="unicode">\E080</td>
- </tr>
- <tr>
- <td class="lsf symbol">back</td>
- <td class="ligature">back</td>
- <td class="unicode">\E00f</td>
- </tr>
- <tr>
- <td class="lsf symbol">next</td>
- <td class="ligature">next</td>
- <td class="unicode">\E096</td>
- </tr>
- <tr>
- <td class="lsf symbol">dropdown</td>
- <td class="ligature">dropdown</td>
- <td class="unicode">\E040</td>
- </tr>
- <tr>
- <td class="lsf symbol">sort</td>
- <td class="ligature">sort</td>
- <td class="unicode">\E120</td>
- </tr>
- <tr>
- <td class="lsf symbol">good</td>
- <td class="ligature">good, like</td>
- <td class="unicode">\E059</td>
- </tr>
- <tr>
- <td class="lsf symbol">bad</td>
- <td class="ligature">bad, nogood</td>
- <td class="unicode">\E011</td>
- </tr>
- <tr>
- <td class="lsf symbol">full</td>
- <td class="ligature">full</td>
- <td class="unicode">\E053</td>
- </tr>
- <tr>
- <td class="lsf symbol">small</td>
- <td class="ligature">small</td>
- <td class="unicode">\E11d</td>
- </tr>
- <tr>
- <td class="lsf symbol">move</td>
- <td class="ligature">move</td>
- <td class="unicode">\E093</td>
- </tr>
- <tr>
- <td class="lsf symbol">undo</td>
- <td class="ligature">undo</td>
- <td class="unicode">\E133</td>
- </tr>
- <tr>
- <td class="lsf symbol">forward</td>
- <td class="ligature">forward</td>
- <td class="unicode">\E04e</td>
- </tr>
- <tr>
- <td class="lsf symbol">reply</td>
- <td class="ligature">reply</td>
- <td class="unicode">\E111</td>
- </tr>
- <tr>
- <td class="lsf symbol">share</td>
- <td class="ligature">share</td>
- <td class="unicode">\E118</td>
- </tr>
- <tr>
- <td class="lsf symbol">login</td>
- <td class="ligature">login, in</td>
- <td class="unicode">\E087</td>
- </tr>
- <tr>
- <td class="lsf symbol">logout</td>
- <td class="ligature">logout, out</td>
- <td class="unicode">\E088</td>
- </tr>
- <tr>
- <td class="lsf symbol">exchange</td>
- <td class="ligature">exchange</td>
- <td class="unicode">\E045</td>
- </tr>
- <tr>
- <td class="lsf symbol">shuffle</td>
- <td class="ligature">shuffle, random</td>
- <td class="unicode">\E11a</td>
- </tr>
- <tr>
- <td class="lsf symbol">repeat</td>
- <td class="ligature">repeat, retweet</td>
- <td class="unicode">\E110</td>
- </tr>
- <tr>
- <td class="lsf symbol">refresh</td>
- <td class="ligature">refresh, reload</td>
- <td class="unicode">\E10e</td>
- </tr>
- <tr>
- <td class="lsf symbol">sync</td>
- <td class="ligature">sync</td>
- <td class="unicode">\E125</td>
- </tr>
- <tr>
- <td class="lsf symbol">external</td>
- <td class="ligature">external, newtab</td>
- <td class="unicode">\E046</td>
- </tr>
- <tr>
- <td class="lsf symbol">addstar</td>
- <td class="ligature">addstar</td>
- <td class="unicode">\E000</td>
- </tr>
- <tr>
- <td class="lsf symbol">star</td>
- <td class="ligature">star</td>
- <td class="unicode">\E121</td>
- </tr>
- <tr>
- <td class="lsf symbol">starempty</td>
- <td class="ligature">starempty</td>
- <td class="unicode">\E122</td>
- </tr>
- <tr>
- <td class="lsf symbol">heart</td>
- <td class="ligature">heart, love</td>
- <td class="unicode">\E06e</td>
- </tr>
- <tr>
- <td class="lsf symbol">heartempty</td>
- <td class="ligature">heartempty</td>
- <td class="unicode">\E06f</td>
- </tr>
- <tr>
- <td class="lsf symbol">view</td>
- <td class="ligature">view, eye</td>
- <td class="unicode">\E13a</td>
- </tr>
- <tr>
- <td class="lsf symbol">comment</td>
- <td class="ligature">comment, balloon</td>
- <td class="unicode">\E034</td>
- </tr>
- <tr>
- <td class="lsf symbol">comments</td>
- <td class="ligature">comments, balloons</td>
- <td class="unicode">\E035</td>
- </tr>
- <tr>
- <td class="lsf symbol">plus</td>
- <td class="ligature">plus, add</td>
- <td class="unicode">\E108</td>
- </tr>
- <tr>
- <td class="lsf symbol">minus</td>
- <td class="ligature">minus</td>
- <td class="unicode">\E08f</td>
- </tr>
- <tr>
- <td class="lsf symbol">zoomin</td>
- <td class="ligature">zoomin, zoom</td>
- <td class="unicode">\E142</td>
- </tr>
- <tr>
- <td class="lsf symbol">zoomout</td>
- <td class="ligature">zoomout</td>
- <td class="unicode">\E143</td>
- </tr>
- <tr>
- <td class="lsf symbol">search</td>
- <td class="ligature">search</td>
- <td class="unicode">\E116</td>
- </tr>
- <tr>
- <td class="lsf symbol">menu</td>
- <td class="ligature">menu</td>
- <td class="unicode">\E08e</td>
- </tr>
- <tr>
- <td class="lsf symbol">tilemenu</td>
- <td class="ligature">tilemenu</td>
- <td class="unicode">\E12a</td>
- </tr>
- <tr>
- <td class="lsf symbol">list</td>
- <td class="ligature">list</td>
- <td class="unicode">\E084</td>
- </tr>
- <tr>
- <td class="lsf symbol">tile</td>
- <td class="ligature">tile</td>
- <td class="unicode">\E129</td>
- </tr>
- <tr>
- <td class="lsf symbol">notify</td>
- <td class="ligature">notify</td>
- <td class="unicode">\E097</td>
- </tr>
- </table>
- </div>
- <h2>Logos</h2>
- <div class="table">
- <table>
- <tr class="header">
- <th class="symbol">Symbol</th>
- <th class="ligature">Ligature</th>
- <th class="unicode">Unicode</th>
- </tr>
- <tr>
- <td class="lsf symbol">apple</td>
- <td class="ligature">apple</td>
- <td class="unicode">\E00a</td>
- </tr>
- <tr>
- <td class="lsf symbol">android</td>
- <td class="ligature">android</td>
- <td class="unicode">\E008</td>
- </tr>
- <tr>
- <td class="lsf symbol">windows</td>
- <td class="ligature">windows</td>
- <td class="unicode">\E151</td>
- </tr>
- <tr>
- <td class="lsf symbol">ubuntu</td>
- <td class="ligature">ubuntu</td>
- <td class="unicode">\E17b</td>
- </tr>
- <tr>
- <td class="lsf symbol">amazon</td>
- <td class="ligature">amazon</td>
- <td class="unicode">\E007</td>
- </tr>
- <tr>
- <td class="lsf symbol">facebook</td>
- <td class="ligature">facebook</td>
- <td class="unicode">\E047</td>
- </tr>
- <tr>
- <td class="lsf symbol">twitter</td>
- <td class="ligature">twitter</td>
- <td class="unicode">\E12f</td>
- </tr>
- <tr>
- <td class="lsf symbol">vk</td>
- <td class="ligature">vk</td>
- <td class="unicode">\E17c</td>
- </tr>
- <tr>
- <td class="lsf symbol">google</td>
- <td class="ligature">google</td>
- <td class="unicode">\E05a</td>
- </tr>
- <tr>
- <td class="lsf symbol">yahoo</td>
- <td class="ligature">yahoo</td>
- <td class="unicode">\E172</td>
- </tr>
- <tr>
- <td class="lsf symbol">bing</td>
- <td class="ligature">bing</td>
- <td class="unicode">\E164</td>
- </tr>
- <tr>
- <td class="lsf symbol">hatena</td>
- <td class="ligature">hatena</td>
- <td class="unicode">\E05d</td>
- </tr>
- <tr>
- <td class="lsf symbol">hatenabookmark</td>
- <td class="ligature">hatenabookmark</td>
- <td class="unicode">\E161</td>
- </tr>
- <tr>
- <td class="lsf symbol">digg</td>
- <td class="ligature">digg</td>
- <td class="unicode">\E167</td>
- </tr>
- <tr>
- <td class="lsf symbol">linkedin</td>
- <td class="ligature">linkedin</td>
- <td class="unicode">\E083</td>
- </tr>
- <tr>
- <td class="lsf symbol">myspace</td>
- <td class="ligature">myspace</td>
- <td class="unicode">\E16a</td>
- </tr>
- <tr>
- <td class="lsf symbol">paperboy</td>
- <td class="ligature">paperboy</td>
- <td class="unicode">\E162</td>
- </tr>
- <tr>
- <td class="lsf symbol">mixi</td>
- <td class="ligature">mixi</td>
- <td class="unicode">\E090</td>
- </tr>
- <tr>
- <td class="lsf symbol">line</td>
- <td class="ligature">line</td>
- <td class="unicode">\E157</td>
- </tr>
- <tr>
- <td class="lsf symbol">mobage</td>
- <td class="ligature">mobage</td>
- <td class="unicode">\E158</td>
- </tr>
- <tr>
- <td class="lsf symbol">gree</td>
- <td class="ligature">gree</td>
- <td class="unicode">\E153</td>
- </tr>
- <tr>
- <td class="lsf symbol">skype</td>
- <td class="ligature">skype</td>
- <td class="unicode">\E11b</td>
- </tr>
- <tr>
- <td class="lsf symbol">aim</td>
- <td class="ligature">aim</td>
- <td class="unicode">\E163</td>
- </tr>
- <tr>
- <td class="lsf symbol">yelp</td>
- <td class="ligature">yelp</td>
- <td class="unicode">\E17d</td>
- </tr>
- <tr>
- <td class="lsf symbol">foursquare</td>
- <td class="ligature">foursquare</td>
- <td class="unicode">\E04d</td>
- </tr>
- <tr>
- <td class="lsf symbol">pinterest</td>
- <td class="ligature">pinterest</td>
- <td class="unicode">\E104</td>
- </tr>
- <tr>
- <td class="lsf symbol">flickr</td>
- <td class="ligature">flickr</td>
- <td class="unicode">\E04b</td>
- </tr>
- </table>
- </div>
- <div class="table">
- <table>
- <tr class="header">
- <th class="symbol">Symbol</th>
- <th class="ligature">Ligature</th>
- <th class="unicode">Unicode</th>
- </tr>
- <tr>
- <td class="lsf symbol">tumblr</td>
- <td class="ligature">tumblr</td>
- <td class="unicode">\E12e</td>
- </tr>
- <tr>
- <td class="lsf symbol">wordpress</td>
- <td class="ligature">wordpress</td>
- <td class="unicode">\E171</td>
- </tr>
- <tr>
- <td class="lsf symbol">blogger</td>
- <td class="ligature">blogger</td>
- <td class="unicode">\E165</td>
- </tr>
- <tr>
- <td class="lsf symbol">evernote</td>
- <td class="ligature">evernote</td>
- <td class="unicode">\E044</td>
- </tr>
- <tr>
- <td class="lsf symbol">dropbox</td>
- <td class="ligature">dropbox</td>
- <td class="unicode">\E168</td>
- </tr>
- <tr>
- <td class="lsf symbol">slideshare</td>
- <td class="ligature">slideshare</td>
- <td class="unicode">\E179</td>
- </tr>
- <tr>
- <td class="lsf symbol">github</td>
- <td class="ligature">github</td>
- <td class="unicode">\E057</td>
- </tr>
- <tr>
- <td class="lsf symbol">yapcasialogomark</td>
- <td class="ligature">yapcasialogomark</td>
- <td class="unicode">\E15c</td>
- </tr>
- <tr>
- <td class="lsf symbol">dribbble</td>
- <td class="ligature">dribbble</td>
- <td class="unicode">\E03f</td>
- </tr>
- <tr>
- <td class="lsf symbol">cookpad</td>
- <td class="ligature">cookpad</td>
- <td class="unicode">\E037</td>
- </tr>
- <tr>
- <td class="lsf symbol">instapaper</td>
- <td class="ligature">instapaper</td>
- <td class="unicode">\E076</td>
- </tr>
- <tr>
- <td class="lsf symbol">readability</td>
- <td class="ligature">readability</td>
- <td class="unicode">\E10c</td>
- </tr>
- <tr>
- <td class="lsf symbol">gumroad</td>
- <td class="ligature">gumroad</td>
- <td class="unicode">\E154</td>
- </tr>
- <tr>
- <td class="lsf symbol">picasa</td>
- <td class="ligature">picasa</td>
- <td class="unicode">\E102</td>
- </tr>
- <tr>
- <td class="lsf symbol">instagram</td>
- <td class="ligature">instagram</td>
- <td class="unicode">\E155</td>
- </tr>
- <tr>
- <td class="lsf symbol">delicious</td>
- <td class="ligature">delicious</td>
- <td class="unicode">\E03d</td>
- </tr>
- <tr>
- <td class="lsf symbol">youtube</td>
- <td class="ligature">youtube</td>
- <td class="unicode">\E141</td>
- </tr>
- <tr>
- <td class="lsf symbol">vimeo</td>
- <td class="ligature">vimeo</td>
- <td class="unicode">\E170</td>
- </tr>
- <tr>
- <td class="lsf symbol">ustream</td>
- <td class="ligature">ustream</td>
- <td class="unicode">\E16f</td>
- </tr>
- <tr>
- <td class="lsf symbol">soundcloud</td>
- <td class="ligature">soundcloud</td>
- <td class="unicode">\E17a</td>
- </tr>
- <tr>
- <td class="lsf symbol">chrome</td>
- <td class="ligature">chrome</td>
- <td class="unicode">\E02c</td>
- </tr>
- <tr>
- <td class="lsf symbol">safari</td>
- <td class="ligature">safari</td>
- <td class="unicode">\E114</td>
- </tr>
- <tr>
- <td class="lsf symbol">sleipnir</td>
- <td class="ligature">sleipnir, chess, knight</td>
- <td class="unicode">\E11c</td>
- </tr>
- <tr>
- <td class="lsf symbol">firefox</td>
- <td class="ligature">firefox</td>
- <td class="unicode">\E049</td>
- </tr>
- <tr>
- <td class="lsf symbol">opera</td>
- <td class="ligature">opera</td>
- <td class="unicode">\E099</td>
- </tr>
- <tr>
- <td class="lsf symbol">internetexplorer</td>
- <td class="ligature">internetexplorer, ie</td>
- <td class="unicode">\E077</td>
- </tr>
- </table>
- </div>
-
- <h2>HTML & CSS</h2>
- <p>Please copy & paste this code to your HTML file or Stylesheet.</p>
- <textarea class="lsf-html"><!-- HTML -->
-
-<p>Simple use for mailto link.</p>
-<a href="mailto:mail@example.com" class="lsf">mail</a>
-
-<p>Use tha icon with text.</p>
-<a href="http://twitter.com/" class="lsf-icon" title="twitter">Twitter</a>
-
-<p>Use tha icon with unicode.</p>
-<a href="http://amazon.com/" class="lsf-icon amazon">Amazon</a></textarea>
- <textarea class="lsf-css">/* CSS */
-
-@font-face {
- font-family: 'LigatureSymbols';
- src: url('LigatureSymbols-2.11.eot');
- src: url('LigatureSymbols-2.11.eot?#iefix') format('embedded-opentype'),
- url('LigatureSymbols-2.11.woff') format('woff'),
- url('LigatureSymbols-2.11.ttf') format('truetype'),
- url('LigatureSymbols-2.11.svg#LigatureSymbols') format('svg');
- src: url('LigatureSymbols-2.11.ttf') format('truetype');
- font-weight: normal;
- font-style: normal;
-}
-
-.lsf, .lsf-icon:before {
- font-family: 'LigatureSymbols';
- -webkit-text-rendering: optimizeLegibility;
- -moz-text-rendering: optimizeLegibility;
- -ms-text-rendering: optimizeLegibility;
- -o-text-rendering: optimizeLegibility;
- text-rendering: optimizeLegibility;
- -webkit-font-smoothing: antialiased;
- -moz-font-smoothing: antialiased;
- -ms-font-smoothing: antialiased;
- -o-font-smoothing: antialiased;
- font-smoothing: antialiased;
-}
-
-.lsf-icon:before {
- content:attr(title);
- margin-right:0.3em;
- font-size:130%;
-}
-
-.lsf-icon.amazon:before {
- content: '\E007';
-}</textarea>
-
- <h2>Download</h2>
- <div class="download">
- <p>
- You can get Ligature Symbols for free. This Font is licensed under <a href="http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL">the SIL Open Font License</a> for download and using.<br />
- Ligature Symbols has broad support for the modern browser (Chrome, Safari, Firefox, iOS - Mobile Safari, Android Browser).
- </p>
- <a href="LigatureSymbols.zip" class="lsf-icon download-button" title="download">Download<span>ver.2.11 - zip file : 391KB</span></a>
- </div>
-
- <h2>How to make this font ?</h2>
- <p>Ligature Symbols is to display the symbol with a ligature features. I created this font by using <a href="http://fontforge.sourceforge.net/">FontForge</a> (open source postscript font editor).<br />IF you want to learn more, you may read <a href="http://d.hatena.ne.jp/kudakurage/20120720/1342749116">my blog entry</a>.</p>
-
- <h2>About me</h2>
- <div class="profile">
- <a href="http://kudakurage.com/"><img src="profile.jpg" class="profile-image" /></a>
- <div class="profile-text">
- <h3>Kazuyuki Motoyama <span>(kudakurage)</span></h3>
- <p class="profile-comment">I have been working as a Web designer in Kyoto.<br />UI Design / App Design / Illustration / HTML5&CSS3 / Javascript / PHP</p>
- </div>
- <ul class="profile-acount">
- <li><a href="http://d.hatena.ne.jp/kudakurage/" class="lsf-icon" title="album">Blog</a></li>
- <li><a href="https://twitter.com/kudakurage" class="lsf-icon" title="twitter">Twitter</a></li>
- <li><a href="http://dribbble.com/kudakurage" class="lsf-icon" title="dribbble">Dribbble</a></li>
- <li><a href="https://github.com/kudakurage" class="lsf-icon" title="github">Github</a></li>
- </ul>
- </div>
- <p id="copyright"><a href="http://kudakurage.com/">Copyright &copy; 2012 kazuyuki motoyama (kudakurage)</a></p>
-</div>
-<script type="text/javascript">
-
- var _gaq = _gaq || [];
- _gaq.push(['_setAccount', 'UA-33534717-1']);
- _gaq.push(['_trackPageview']);
-
- (function() {
- var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
- ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
- var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
- })();
-
-</script>
-</body>
-</html> \ No newline at end of file
diff --git a/docs/theme/mkdocs/fonts/LigatureSymbols/style.css b/docs/theme/mkdocs/fonts/LigatureSymbols/style.css
deleted file mode 100755
index 2e8d1f297d..0000000000
--- a/docs/theme/mkdocs/fonts/LigatureSymbols/style.css
+++ /dev/null
@@ -1,520 +0,0 @@
-@charset 'UTF-8';
-
-@font-face {
- font-family: 'LigatureSymbols';
- src: url('LigatureSymbols-2.11.eot');
- src: url('LigatureSymbols-2.11.eot?#iefix') format('embedded-opentype'),
- url('LigatureSymbols-2.11.woff') format('woff'),
- url('LigatureSymbols-2.11.ttf') format('truetype'),
- url('LigatureSymbols-2.11.svg#LigatureSymbols') format('svg');
- font-weight: normal;
- font-style: normal;
-}
-
-.lsf {
- font-family: 'LigatureSymbols';
- -webkit-text-rendering: optimizeLegibility;
- -moz-text-rendering: optimizeLegibility;
- -ms-text-rendering: optimizeLegibility;
- -o-text-rendering: optimizeLegibility;
- text-rendering: optimizeLegibility;
- -webkit-font-smoothing: antialiased;
- -moz-font-smoothing: antialiased;
- -ms-font-smoothing: antialiased;
- -o-font-smoothing: antialiased;
- font-smoothing: antialiased;
- -webkit-font-feature-settings: "liga" 1, "dlig" 1;
- -moz-font-feature-settings: "liga=1, dlig=1";
- -ms-font-feature-settings: "liga" 1, "dlig" 1;
- -o-font-feature-settings: "liga" 1, "dlig" 1;
- font-feature-settings: "liga" 1, "dlig" 1;
-}
-.lsf-icon:before {
- content:attr(title);
- margin-right:0.3em;
- font-size:130%;
- font-family: 'LigatureSymbols';
- -webkit-text-rendering: optimizeLegibility;
- -moz-text-rendering: optimizeLegibility;
- -ms-text-rendering: optimizeLegibility;
- -o-text-rendering: optimizeLegibility;
- text-rendering: optimizeLegibility;
- -webkit-font-smoothing: antialiased;
- -moz-font-smoothing: antialiased;
- -ms-font-smoothing: antialiased;
- -o-font-smoothing: antialiased;
- font-smoothing: antialiased;
- -webkit-font-feature-settings: "liga" 1, "dlig" 1;
- -moz-font-feature-settings: "liga=1, dlig=1";
- -ms-font-feature-settings: "liga" 1, "dlig" 1;
- -o-font-feature-settings: "liga" 1, "dlig" 1;
- font-feature-settings: "liga" 1, "dlig" 1;
-}
-
-
-
-/* RESET */
-html, body,
-div,
-ul, ol, li,
-dl, dt, dd, td, th,
-h1, h2, h3, h4, h5, h6,
-p, pre, blockquote, fieldset,
-form, input, button, textarea {
- margin: 0;
- padding: 0;
-}
-
-h1, h2, h3, h4, h5, h6,
-pre, code, address, caption, cite, code,
-em, strong, th {
- font-size: 1.0em;
- font-weight: normal;
- font-style: normal;
-}
-
-ul, ol, li {
- list-style: none;
-}
-
-fieldset, img {
- border: none;
-}
-
-img {
- -ms-interpolation-mode: bicubic;
-}
-
-caption, th {
- text-align: left;
-}
-
-table {
- border-collapse: collapse;
- border-spacing: 0;
-}
-
-input,textarea,select {
- font-family: inherit;
- font-size: inherit;
- font-weight: inherit;
-}
-
-input,textarea,select {
- *font-size: 100%;
-}
-
-button {
- background-color: transparent;
- text-decoration: none;
-}
-
-label {
- cursor: pointer;
-}
-
-/* IEPNGFIX */
-img { behavior: url(lib/iepngfix.htc); }
-
-.main-image {
- position:absolute;
- top:-1000px;
- width:400px;
-}
-
-/* ELEMENT */
-body {
- clear: both;
- background-color: #ffffff;
- text-align: center;
- color: #333;
- font-size: 16px;
- font-weight: normal;
- font-style: normal;
- line-height: 1.5;
- font-family :
- Meiryo,
- 'メイリオ',
- 'Lucida Grande',
- Verdana,
- 'Hiragino Kaku Gothic Pro',
- 'ヒラギノ角ゴ Pro W3',
- 'MS Pゴシック',
- 'MS P Gothic',
- sans-serif;
-}
-a {
- color: #006DBE;
- font-weight: normal;
- font-style: normal;
- text-decoration: none;
-}
-a:hover {
- text-decoration: underline;
-}
-
-html{
- font-size:100%;
- -webkit-text-size-adjust:100%;
- -ms-text-size-adjust:100%;
- -webkit-font-smoothing:antialiased;
- text-align:center;
-}
-#body {
- width:900px;
- margin:0 auto;
-}
-#copyright {
- margin:60px 0 20px;
- text-align:center;
- font-size:14px;
-}
-#copyright,
-#copyright a {
- color:#ccc;
-}
-h1 {
- margin:60px 0 0px;
- font-size:48px;
-}
-h2 {
- clear:both;
- padding:60px 7px 2px;
- margin-bottom:30px;
- border-bottom:1px solid #ccc;
- text-align:left;
- font-size:20px;
- font-weight:bold;
-}
-p {
- margin:10px 0;
- color:#999;
- text-align:left;
-}
-.lsf-input {
- margin:60px 0 40px;
- font-size:48px;
- text-align:center;
-}
-.lsf-input input {
- width:860px;
- padding:10px 20px;
- border:1px solid #ccc;
- -webkit-border-radius:5px;
- -moz-border-radius:5px;
- -ms-border-radius:5px;
- -o-border-radius:5px;
- border-radius:5px;
- text-align:center;
- -webkit-box-shadow:inset 0 2px 6px rgba(0,0,0,0.1);
- -moz-box-shadow:inset 0 2px 6px rgba(0,0,0,0.1);
- -ms-box-shadow:inset 0 2px 6px rgba(0,0,0,0.1);
- -o-box-shadow:inset 0 2px 6px rgba(0,0,0,0.1);
- box-shadow:inset 0 2px 6px rgba(0,0,0,0.1);
-}
-.lsf-input::-webkit-input-placeholder {
- text-align:center;
-}
-.table {
- float:left;
- width:420px;
-}
-.table:nth-child(2n-1) {
- float:right;
-}
-.table table {
- width:100%;
-}
-.table td,
-.table th {
- vertical-align:middle;
-}
-.table tr:nth-child(2n) th,
-.table tr:nth-child(2n) td {
- background:#f0f0f0;
-}
-.table th {
- padding-bottom:5px;
- text-align:center;
- font-size:12px;
- color:#999;
-}
-.table td.symbol {
- width:60px;
- font-size:36px;
- text-align:center;
-}
-.table td.ligature {
- text-align:left;
- padding-left:10px;
-}
-.table td.unicode {
- width:100px;
- border-left:2px solid #fff;
-}
-
-.lsf-html,
-.lsf-css {
- overflow:auto;
- width:860px;
- min-height:170px;
- padding:20px;
- border:1px solid #ddd;
- font-size:14px;
- text-align:left;
- background:#f9f9f9;
- -webkit-border-radius:5px;
- -moz-border-radius:5px;
- -ms-border-radius:5px;
- -o-border-radius:5px;
- border-radius:5px;
- -webkit-overflow-scrolling:touch;
-}
-.lsf-css {
- min-height:940px;
- margin-top:10px;
-}
-
-.download {
- min-height:170px;
-}
-.download-button {
- display:inline-block;
- padding:2px 30px 10px;
- font-size:25px;
- color: #666;
- -webkit-box-shadow:0 1px 3px rgba(0,0,0,0.3);
- -moz-box-shadow:0 1px 3px rgba(0,0,0,0.3);
- -ms-box-shadow:0 1px 3px rgba(0,0,0,0.3);
- -o-box-shadow:0 1px 3px rgba(0,0,0,0.3);
- box-shadow:0 1px 3px rgba(0,0,0,0.3);
- -webkit-border-radius:10px;
- -moz-border-radius:10px;
- -ms-border-radius:10px;
- -o-border-radius:10px;
- border-radius:10px;
- -webkit-transition:0.2s;
- -moz-transition:0.2s;
- -ms-transition:0.2s;
- -o-transition:0.2s;
- transition:0.2s;
- background: #f6f6f6;
- background: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f6f6f6));
- background: linear-gradient(top, #fff #f6f6f6);
- background: -webkit-linear-gradient(top, #fff #f6f6f6);
- background: -moz-linear-gradient(top, #fff #f6f6f6);
- background: -ms-linear-gradient(top, #fff #f6f6f6);
- background: -o-linear-gradient(top, #fff #f6f6f6);
-}
-.download-button:hover {
- color: #006DBE;
- text-decoration:none;
- -webkit-box-shadow:0 3px 9px rgba(0,0,0,0.3);
- -moz-box-shadow:0 3px 9px rgba(0,0,0,0.3);
- -ms-box-shadow:0 3px 9px rgba(0,0,0,0.3);
- -o-box-shadow:0 3px 9px rgba(0,0,0,0.3);
- box-shadow:0 3px 9px rgba(0,0,0,0.3);
-}
-.download-button:active {
- margin-top:3px;
- color: #333;
- -webkit-transition:0s;
- -moz-transition:0s;
- transition:0s;
- -webkit-box-shadow:0 0px 2px rgba(0,0,0,0.5), inset 0 2px 2px rgba(0,0,0,0.2);
- -moz-box-shadow:0 0px 2px rgba(0,0,0,0.5), inset 0 2px 2px rgba(0,0,0,0.2);
- -ms-box-shadow:0 0px 2px rgba(0,0,0,0.5), inset 0 2px 2px rgba(0,0,0,0.2);
- -o-box-shadow:0 0px 2px rgba(0,0,0,0.5), inset 0 2px 2px rgba(0,0,0,0.2);
- box-shadow:0 0px 2px rgba(0,0,0,0.5), inset 0 2px 2px rgba(0,0,0,0.2);
- background: #f0f0f0;
- background: -webkit-gradient(linear, left top, left bottom, from(#fcfcfc), to(#f0f0f0));
- background: linear-gradient(top, #fcfcfc #f0f0f0);
- background: -webkit-linear-gradient(top, #fcfcfc #f0f0f0);
- background: -moz-linear-gradient(top, #fcfcfc #f0f0f0);
- background: -ms-linear-gradient(top, #fcfcfc #f0f0f0);
- background: -o-linear-gradient(top, #fcfcfc #f0f0f0);
-}
-.download-button span {
- display:block;
- font-size:13px;
-}
-
-.profile {
- overflow:hidden;
-}
-.profile-image {
- float:left;
- width:120px;
- -webkit-border-radius:5px;
- -moz-border-radius:5px;
- -ms-border-radius:5px;
- -o-border-radius:5px;
- border-radius:5px;
- opacity:0.8;
- -webkit-transition:0.2s;
- -moz-transition:0.2s;
- -ms-transition:0.2s;
- -o-transition:0.2s;
- transition:0.2s;
-}
-.profile-image:hover {
- opacity:1;
-}
-.profile-text {
- float:left;
- width:400px;
- margin-top:5px;
- margin-left:40px;
-}
-.profile-text h3 {
- font-size:24px;
- text-align:left;
-}
-.profile-text h3 span {
- font-size:18px;
- color:#999;
-}
-.profile-acount {
- float:left;
- padding-left:80px;
- margin-left:60px;
- border-left:1px solid #eee;
- text-align:left;
-}
-.profile-acount li {
- padding:1px 0;
-}
-.profile-acount li a {
- font-size:16px;
-}
-
-
-@media (max-width: 900px){
- #body {
- width:100%;
- margin:0 auto 20px;
- font-size:14px;
- }
- h1 {
- margin-top:15px;
- font-size:24px;
- }
- h2 {
- padding:50px 10px 2px;
- margin-bottom:10px;
- }
- p {
- margin-left:10px;
- margin-right:10px;
- }
- .name {
- font-size:12px;
- }
- .lsf-input {
- margin:15px 0 25px;
- font-size:22px;
- }
- .lsf-input input {
- width:80%;
- margin:0 5%;
- padding-left:5%;
- padding-right:5%;
- }
- .table {
- float:none !important;
- width:100%;
- }
- .table th {
- font-size:8px;
- }
- .table td.symbol {
- width:60px;
- font-size:32px;
- }
- .table td.ligature {
- padding-left:5px;
- }
- .table td.unicode {
- width:70px;
- font-size:11px;
- }
- .lsf-html, .lsf-css {
- width:80%;
- min-height:80px;
- max-height:80px;
- margin:5px 5%;
- padding-left:5%;
- padding-right:5%;
- }
- .profile-image {
- width:48px;
- margin:0 10px;
- }
- .profile-text {
- float:none;
- width:auto;
- margin:0 10px 0 0;
- }
- .profile-text h3 {
- font-size:18px;
- }
- .profile-text h3 span {
- display:block;
- font-size:12px;
- }
- .profile-acount {
- width:100%;
- padding:0;
- margin:20px 0 0;
- border:0;
- border-top:1px solid #ddd;
- }
- .profile-acount li {
- border-bottom:1px solid #ddd;
- }
- .profile-acount li a {
- display:block;
- padding:10px 20px;
- color:#555;
- font-size:20px;
- background: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f0f0f0));
- background: linear-gradient(top, #fff #f0f0f0);
- background: -webkit-linear-gradient(top, #fff #f0f0f0);
- background: -moz-linear-gradient(top, #fff #f0f0f0);
- background: -ms-linear-gradient(top, #fff #f0f0f0);
- background: -o-linear-gradient(top, #fff #f0f0f0);
- }
- .profile-acount li a:after {
- content:"right";
- float:right;
- color:#999;
- line-height:1.7;
- font-size:120%;
- font-family: 'LigatureSymbols';
- text-shadow:0 2px 0 #fff;
- -webkit-text-rendering: optimizeLegibility;
- -moz-text-rendering: optimizeLegibility;
- -ms-text-rendering: optimizeLegibility;
- -o-text-rendering: optimizeLegibility;
- text-rendering: optimizeLegibility;
- -webkit-font-smoothing: antialiased;
- -moz-font-smoothing: antialiased;
- -ms-font-smoothing: antialiased;
- -o-font-smoothing: antialiased;
- font-smoothing: antialiased;
- -webkit-font-feature-settings: "liga" 1, "dlig" 1;
- -moz-font-feature-settings: "liga=1, dlig=1";
- -ms-font-feature-settings: "liga" 1, "dlig" 1;
- -o-font-feature-settings: "liga" 1, "dlig" 1;
- font-feature-settings: "liga" 1, "dlig" 1;
- }
- #copyright {
- margin:20px 0;
- font-size:10px;
- }
-}
-
-
-
-
-
diff --git a/docs/theme/mkdocs/fonts/fontawesome-webfont.eot b/docs/theme/mkdocs/fonts/fontawesome-webfont.eot
deleted file mode 100755
index 7c79c6a6bc..0000000000
--- a/docs/theme/mkdocs/fonts/fontawesome-webfont.eot
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/fonts/fontawesome-webfont.svg b/docs/theme/mkdocs/fonts/fontawesome-webfont.svg
deleted file mode 100755
index 45fdf33830..0000000000
--- a/docs/theme/mkdocs/fonts/fontawesome-webfont.svg
+++ /dev/null
@@ -1,414 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
-<svg xmlns="http://www.w3.org/2000/svg">
-<metadata></metadata>
-<defs>
-<font id="fontawesomeregular" horiz-adv-x="1536" >
-<font-face units-per-em="1792" ascent="1536" descent="-256" />
-<missing-glyph horiz-adv-x="448" />
-<glyph unicode=" " horiz-adv-x="448" />
-<glyph unicode="&#x09;" horiz-adv-x="448" />
-<glyph unicode="&#xa0;" horiz-adv-x="448" />
-<glyph unicode="&#xa8;" horiz-adv-x="1792" />
-<glyph unicode="&#xa9;" horiz-adv-x="1792" />
-<glyph unicode="&#xae;" horiz-adv-x="1792" />
-<glyph unicode="&#xb4;" horiz-adv-x="1792" />
-<glyph unicode="&#xc6;" horiz-adv-x="1792" />
-<glyph unicode="&#x2000;" horiz-adv-x="768" />
-<glyph unicode="&#x2001;" />
-<glyph unicode="&#x2002;" horiz-adv-x="768" />
-<glyph unicode="&#x2003;" />
-<glyph unicode="&#x2004;" horiz-adv-x="512" />
-<glyph unicode="&#x2005;" horiz-adv-x="384" />
-<glyph unicode="&#x2006;" horiz-adv-x="256" />
-<glyph unicode="&#x2007;" horiz-adv-x="256" />
-<glyph unicode="&#x2008;" horiz-adv-x="192" />
-<glyph unicode="&#x2009;" horiz-adv-x="307" />
-<glyph unicode="&#x200a;" horiz-adv-x="85" />
-<glyph unicode="&#x202f;" horiz-adv-x="307" />
-<glyph unicode="&#x205f;" horiz-adv-x="384" />
-<glyph unicode="&#x2122;" horiz-adv-x="1792" />
-<glyph unicode="&#x221e;" horiz-adv-x="1792" />
-<glyph unicode="&#x2260;" horiz-adv-x="1792" />
-<glyph unicode="&#xe000;" horiz-adv-x="500" d="M0 0z" />
-<glyph unicode="&#xf000;" horiz-adv-x="1792" d="M1699 1350q0 -35 -43 -78l-632 -632v-768h320q26 0 45 -19t19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45t45 19h320v768l-632 632q-43 43 -43 78q0 23 18 36.5t38 17.5t43 4h1408q23 0 43 -4t38 -17.5t18 -36.5z" />
-<glyph unicode="&#xf001;" d="M1536 1312v-1120q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v537l-768 -237v-709q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89 t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v967q0 31 19 56.5t49 35.5l832 256q12 4 28 4q40 0 68 -28t28 -68z" />
-<glyph unicode="&#xf002;" horiz-adv-x="1664" d="M1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -52 -38 -90t-90 -38q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5 t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
-<glyph unicode="&#xf003;" horiz-adv-x="1792" d="M1664 32v768q-32 -36 -69 -66q-268 -206 -426 -338q-51 -43 -83 -67t-86.5 -48.5t-102.5 -24.5h-1h-1q-48 0 -102.5 24.5t-86.5 48.5t-83 67q-158 132 -426 338q-37 30 -69 66v-768q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1664 1083v11v13.5t-0.5 13 t-3 12.5t-5.5 9t-9 7.5t-14 2.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5q0 -168 147 -284q193 -152 401 -317q6 -5 35 -29.5t46 -37.5t44.5 -31.5t50.5 -27.5t43 -9h1h1q20 0 43 9t50.5 27.5t44.5 31.5t46 37.5t35 29.5q208 165 401 317q54 43 100.5 115.5t46.5 131.5z M1792 1120v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" />
-<glyph unicode="&#xf004;" horiz-adv-x="1792" d="M896 -128q-26 0 -44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600 q-18 -18 -44 -18z" />
-<glyph unicode="&#xf005;" horiz-adv-x="1664" d="M1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -21 -10.5 -35.5t-30.5 -14.5q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455 l502 -73q56 -9 56 -46z" />
-<glyph unicode="&#xf006;" horiz-adv-x="1664" d="M1137 532l306 297l-422 62l-189 382l-189 -382l-422 -62l306 -297l-73 -421l378 199l377 -199zM1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500 l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46z" />
-<glyph unicode="&#xf007;" horiz-adv-x="1408" d="M1408 131q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q9 0 42 -21.5t74.5 -48t108 -48t133.5 -21.5t133.5 21.5t108 48t74.5 48t42 21.5q61 0 111.5 -20t85.5 -53.5t62 -81 t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" />
-<glyph unicode="&#xf008;" horiz-adv-x="1920" d="M384 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 320v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 704v128q0 26 -19 45t-45 19h-128 q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 -64v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM384 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45 t45 -19h128q26 0 45 19t19 45zM1792 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 704v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1792 320v128 q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 704v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19 t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1920 1248v-1344q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1344q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
-<glyph unicode="&#xf009;" horiz-adv-x="1664" d="M768 512v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM768 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 512v-384q0 -52 -38 -90t-90 -38 h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
-<glyph unicode="&#xf00a;" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 288v-192q0 -40 -28 -68t-68 -28h-320 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68z" />
-<glyph unicode="&#xf00b;" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-960 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h960q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68z" />
-<glyph unicode="&#xf00c;" horiz-adv-x="1792" d="M1671 970q0 -40 -28 -68l-724 -724l-136 -136q-28 -28 -68 -28t-68 28l-136 136l-362 362q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -295l656 657q28 28 68 28t68 -28l136 -136q28 -28 28 -68z" />
-<glyph unicode="&#xf00d;" horiz-adv-x="1408" d="M1298 214q0 -40 -28 -68l-136 -136q-28 -28 -68 -28t-68 28l-294 294l-294 -294q-28 -28 -68 -28t-68 28l-136 136q-28 28 -28 68t28 68l294 294l-294 294q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -294l294 294q28 28 68 28t68 -28l136 -136q28 -28 28 -68 t-28 -68l-294 -294l294 -294q28 -28 28 -68z" />
-<glyph unicode="&#xf00e;" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-224q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v224h-224q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h224v224q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-224h224 q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5 t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
-<glyph unicode="&#xf010;" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5z M1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z " />
-<glyph unicode="&#xf011;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61t-298 61t-245 164t-164 245t-61 298q0 182 80.5 343t226.5 270q43 32 95.5 25t83.5 -50q32 -42 24.5 -94.5t-49.5 -84.5q-98 -74 -151.5 -181t-53.5 -228q0 -104 40.5 -198.5t109.5 -163.5t163.5 -109.5 t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5q0 121 -53.5 228t-151.5 181q-42 32 -49.5 84.5t24.5 94.5q31 43 84 50t95 -25q146 -109 226.5 -270t80.5 -343zM896 1408v-640q0 -52 -38 -90t-90 -38t-90 38t-38 90v640q0 52 38 90t90 38t90 -38t38 -90z" />
-<glyph unicode="&#xf012;" horiz-adv-x="1792" d="M256 96v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 224v-320q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 480v-576q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1408 864v-960q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1376v-1472q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1472q0 14 9 23t23 9h192q14 0 23 -9t9 -23z" />
-<glyph unicode="&#xf013;" d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1536 749v-222q0 -12 -8 -23t-20 -13l-185 -28q-19 -54 -39 -91q35 -50 107 -138q10 -12 10 -25t-9 -23q-27 -37 -99 -108t-94 -71q-12 0 -26 9l-138 108q-44 -23 -91 -38 q-16 -136 -29 -186q-7 -28 -36 -28h-222q-14 0 -24.5 8.5t-11.5 21.5l-28 184q-49 16 -90 37l-141 -107q-10 -9 -25 -9q-14 0 -25 11q-126 114 -165 168q-7 10 -7 23q0 12 8 23q15 21 51 66.5t54 70.5q-27 50 -41 99l-183 27q-13 2 -21 12.5t-8 23.5v222q0 12 8 23t19 13 l186 28q14 46 39 92q-40 57 -107 138q-10 12 -10 24q0 10 9 23q26 36 98.5 107.5t94.5 71.5q13 0 26 -10l138 -107q44 23 91 38q16 136 29 186q7 28 36 28h222q14 0 24.5 -8.5t11.5 -21.5l28 -184q49 -16 90 -37l142 107q9 9 24 9q13 0 25 -10q129 -119 165 -170q7 -8 7 -22 q0 -12 -8 -23q-15 -21 -51 -66.5t-54 -70.5q26 -50 41 -98l183 -28q13 -2 21 -12.5t8 -23.5z" />
-<glyph unicode="&#xf014;" horiz-adv-x="1408" d="M512 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM768 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1024 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1152 76v948h-896v-948q0 -22 7 -40.5t14.5 -27t10.5 -8.5h832q3 0 10.5 8.5t14.5 27t7 40.5zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832 q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" />
-<glyph unicode="&#xf015;" horiz-adv-x="1664" d="M1408 544v-480q0 -26 -19 -45t-45 -19h-384v384h-256v-384h-384q-26 0 -45 19t-19 45v480q0 1 0.5 3t0.5 3l575 474l575 -474q1 -2 1 -6zM1631 613l-62 -74q-8 -9 -21 -11h-3q-13 0 -21 7l-692 577l-692 -577q-12 -8 -24 -7q-13 2 -21 11l-62 74q-8 10 -7 23.5t11 21.5 l719 599q32 26 76 26t76 -26l244 -204v195q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-408l219 -182q10 -8 11 -21.5t-7 -23.5z" />
-<glyph unicode="&#xf016;" horiz-adv-x="1280" d="M128 0h1024v768h-416q-40 0 -68 28t-28 68v416h-512v-1280zM768 896h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376zM1280 864v-896q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h640q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88z " />
-<glyph unicode="&#xf017;" d="M896 992v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf018;" horiz-adv-x="1920" d="M1111 540v4l-24 320q-1 13 -11 22.5t-23 9.5h-186q-13 0 -23 -9.5t-11 -22.5l-24 -320v-4q-1 -12 8 -20t21 -8h244q12 0 21 8t8 20zM1870 73q0 -73 -46 -73h-704q13 0 22 9.5t8 22.5l-20 256q-1 13 -11 22.5t-23 9.5h-272q-13 0 -23 -9.5t-11 -22.5l-20 -256 q-1 -13 8 -22.5t22 -9.5h-704q-46 0 -46 73q0 54 26 116l417 1044q8 19 26 33t38 14h339q-13 0 -23 -9.5t-11 -22.5l-15 -192q-1 -14 8 -23t22 -9h166q13 0 22 9t8 23l-15 192q-1 13 -11 22.5t-23 9.5h339q20 0 38 -14t26 -33l417 -1044q26 -62 26 -116z" />
-<glyph unicode="&#xf019;" horiz-adv-x="1664" d="M1280 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 416v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h465l135 -136 q58 -56 136 -56t136 56l136 136h464q40 0 68 -28t28 -68zM1339 985q17 -41 -14 -70l-448 -448q-18 -19 -45 -19t-45 19l-448 448q-31 29 -14 70q17 39 59 39h256v448q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-448h256q42 0 59 -39z" />
-<glyph unicode="&#xf01a;" d="M1120 608q0 -12 -10 -24l-319 -319q-11 -9 -23 -9t-23 9l-320 320q-15 16 -7 35q8 20 30 20h192v352q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-352h192q14 0 23 -9t9 -23zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273 t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf01b;" d="M1118 660q-8 -20 -30 -20h-192v-352q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v352h-192q-14 0 -23 9t-9 23q0 12 10 24l319 319q11 9 23 9t23 -9l320 -320q15 -16 7 -35zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198 t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf01c;" d="M1023 576h316q-1 3 -2.5 8t-2.5 8l-212 496h-708l-212 -496q-1 -2 -2.5 -8t-2.5 -8h316l95 -192h320zM1536 546v-482q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v482q0 62 25 123l238 552q10 25 36.5 42t52.5 17h832q26 0 52.5 -17t36.5 -42l238 -552 q25 -61 25 -123z" />
-<glyph unicode="&#xf01d;" d="M1184 640q0 -37 -32 -55l-544 -320q-15 -9 -32 -9q-16 0 -32 8q-32 19 -32 56v640q0 37 32 56q33 18 64 -1l544 -320q32 -18 32 -55zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf01e;" d="M1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l138 138q-148 137 -349 137q-104 0 -198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5q119 0 225 52t179 147q7 10 23 12q14 0 25 -9 l137 -138q9 -8 9.5 -20.5t-7.5 -22.5q-109 -132 -264 -204.5t-327 -72.5q-156 0 -298 61t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q147 0 284.5 -55.5t244.5 -156.5l130 129q29 31 70 14q39 -17 39 -59z" />
-<glyph unicode="&#xf021;" d="M1511 480q0 -5 -1 -7q-64 -268 -268 -434.5t-478 -166.5q-146 0 -282.5 55t-243.5 157l-129 -129q-19 -19 -45 -19t-45 19t-19 45v448q0 26 19 45t45 19h448q26 0 45 -19t19 -45t-19 -45l-137 -137q71 -66 161 -102t187 -36q134 0 250 65t186 179q11 17 53 117 q8 23 30 23h192q13 0 22.5 -9.5t9.5 -22.5zM1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-26 0 -45 19t-19 45t19 45l138 138q-148 137 -349 137q-134 0 -250 -65t-186 -179q-11 -17 -53 -117q-8 -23 -30 -23h-199q-13 0 -22.5 9.5t-9.5 22.5v7q65 268 270 434.5t480 166.5 q146 0 284 -55.5t245 -156.5l130 129q19 19 45 19t45 -19t19 -45z" />
-<glyph unicode="&#xf022;" horiz-adv-x="1792" d="M384 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M384 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1536 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5z M1536 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5zM1536 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5 t9.5 -22.5zM1664 160v832q0 13 -9.5 22.5t-22.5 9.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1792 1248v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47 t47 -113z" />
-<glyph unicode="&#xf023;" horiz-adv-x="1152" d="M320 768h512v192q0 106 -75 181t-181 75t-181 -75t-75 -181v-192zM1152 672v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v192q0 184 132 316t316 132t316 -132t132 -316v-192h32q40 0 68 -28t28 -68z" />
-<glyph unicode="&#xf024;" horiz-adv-x="1792" d="M320 1280q0 -72 -64 -110v-1266q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v1266q-64 38 -64 110q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -25 -12.5 -38.5t-39.5 -27.5q-215 -116 -369 -116q-61 0 -123.5 22t-108.5 48 t-115.5 48t-142.5 22q-192 0 -464 -146q-17 -9 -33 -9q-26 0 -45 19t-19 45v742q0 32 31 55q21 14 79 43q236 120 421 120q107 0 200 -29t219 -88q38 -19 88 -19q54 0 117.5 21t110 47t88 47t54.5 21q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf025;" horiz-adv-x="1664" d="M1664 650q0 -166 -60 -314l-20 -49l-185 -33q-22 -83 -90.5 -136.5t-156.5 -53.5v-32q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-32q71 0 130 -35.5t93 -95.5l68 12q29 95 29 193q0 148 -88 279t-236.5 209t-315.5 78 t-315.5 -78t-236.5 -209t-88 -279q0 -98 29 -193l68 -12q34 60 93 95.5t130 35.5v32q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v32q-88 0 -156.5 53.5t-90.5 136.5l-185 33l-20 49q-60 148 -60 314q0 151 67 291t179 242.5 t266 163.5t320 61t320 -61t266 -163.5t179 -242.5t67 -291z" />
-<glyph unicode="&#xf026;" horiz-adv-x="768" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45z" />
-<glyph unicode="&#xf027;" horiz-adv-x="1152" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142z" />
-<glyph unicode="&#xf028;" horiz-adv-x="1664" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142zM1408 640q0 -153 -85 -282.5t-225 -188.5q-13 -5 -25 -5q-27 0 -46 19t-19 45q0 39 39 59q56 29 76 44q74 54 115.5 135.5t41.5 173.5t-41.5 173.5 t-115.5 135.5q-20 15 -76 44q-39 20 -39 59q0 26 19 45t45 19q13 0 26 -5q140 -59 225 -188.5t85 -282.5zM1664 640q0 -230 -127 -422.5t-338 -283.5q-13 -5 -26 -5q-26 0 -45 19t-19 45q0 36 39 59q7 4 22.5 10.5t22.5 10.5q46 25 82 51q123 91 192 227t69 289t-69 289 t-192 227q-36 26 -82 51q-7 4 -22.5 10.5t-22.5 10.5q-39 23 -39 59q0 26 19 45t45 19q13 0 26 -5q211 -91 338 -283.5t127 -422.5z" />
-<glyph unicode="&#xf029;" horiz-adv-x="1408" d="M384 384v-128h-128v128h128zM384 1152v-128h-128v128h128zM1152 1152v-128h-128v128h128zM128 129h384v383h-384v-383zM128 896h384v384h-384v-384zM896 896h384v384h-384v-384zM640 640v-640h-640v640h640zM1152 128v-128h-128v128h128zM1408 128v-128h-128v128h128z M1408 640v-384h-384v128h-128v-384h-128v640h384v-128h128v128h128zM640 1408v-640h-640v640h640zM1408 1408v-640h-640v640h640z" />
-<glyph unicode="&#xf02a;" horiz-adv-x="1792" d="M63 0h-63v1408h63v-1408zM126 1h-32v1407h32v-1407zM220 1h-31v1407h31v-1407zM377 1h-31v1407h31v-1407zM534 1h-62v1407h62v-1407zM660 1h-31v1407h31v-1407zM723 1h-31v1407h31v-1407zM786 1h-31v1407h31v-1407zM943 1h-63v1407h63v-1407zM1100 1h-63v1407h63v-1407z M1226 1h-63v1407h63v-1407zM1352 1h-63v1407h63v-1407zM1446 1h-63v1407h63v-1407zM1635 1h-94v1407h94v-1407zM1698 1h-32v1407h32v-1407zM1792 0h-63v1408h63v-1408z" />
-<glyph unicode="&#xf02b;" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91z" />
-<glyph unicode="&#xf02c;" horiz-adv-x="1920" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91zM1899 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-36 0 -59 14t-53 45l470 470q37 37 37 90q0 52 -37 91l-715 714q-38 38 -102 64.5t-117 26.5h224q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91z" />
-<glyph unicode="&#xf02d;" horiz-adv-x="1664" d="M1639 1058q40 -57 18 -129l-275 -906q-19 -64 -76.5 -107.5t-122.5 -43.5h-923q-77 0 -148.5 53.5t-99.5 131.5q-24 67 -2 127q0 4 3 27t4 37q1 8 -3 21.5t-3 19.5q2 11 8 21t16.5 23.5t16.5 23.5q23 38 45 91.5t30 91.5q3 10 0.5 30t-0.5 28q3 11 17 28t17 23 q21 36 42 92t25 90q1 9 -2.5 32t0.5 28q4 13 22 30.5t22 22.5q19 26 42.5 84.5t27.5 96.5q1 8 -3 25.5t-2 26.5q2 8 9 18t18 23t17 21q8 12 16.5 30.5t15 35t16 36t19.5 32t26.5 23.5t36 11.5t47.5 -5.5l-1 -3q38 9 51 9h761q74 0 114 -56t18 -130l-274 -906 q-36 -119 -71.5 -153.5t-128.5 -34.5h-869q-27 0 -38 -15q-11 -16 -1 -43q24 -70 144 -70h923q29 0 56 15.5t35 41.5l300 987q7 22 5 57q38 -15 59 -43zM575 1056q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5 t-16.5 -22.5zM492 800q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5z" />
-<glyph unicode="&#xf02e;" horiz-adv-x="1280" d="M1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
-<glyph unicode="&#xf02f;" horiz-adv-x="1664" d="M384 0h896v256h-896v-256zM384 640h896v384h-160q-40 0 -68 28t-28 68v160h-640v-640zM1536 576q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 576v-416q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-160q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68 v160h-224q-13 0 -22.5 9.5t-9.5 22.5v416q0 79 56.5 135.5t135.5 56.5h64v544q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-256h64q79 0 135.5 -56.5t56.5 -135.5z" />
-<glyph unicode="&#xf030;" horiz-adv-x="1920" d="M960 864q119 0 203.5 -84.5t84.5 -203.5t-84.5 -203.5t-203.5 -84.5t-203.5 84.5t-84.5 203.5t84.5 203.5t203.5 84.5zM1664 1280q106 0 181 -75t75 -181v-896q0 -106 -75 -181t-181 -75h-1408q-106 0 -181 75t-75 181v896q0 106 75 181t181 75h224l51 136 q19 49 69.5 84.5t103.5 35.5h512q53 0 103.5 -35.5t69.5 -84.5l51 -136h224zM960 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
-<glyph unicode="&#xf031;" horiz-adv-x="1664" d="M725 977l-170 -450q73 -1 153.5 -2t119 -1.5t52.5 -0.5l29 2q-32 95 -92 241q-53 132 -92 211zM21 -128h-21l2 79q22 7 80 18q89 16 110 31q20 16 48 68l237 616l280 724h75h53l11 -21l205 -480q103 -242 124 -297q39 -102 96 -235q26 -58 65 -164q24 -67 65 -149 q22 -49 35 -57q22 -19 69 -23q47 -6 103 -27q6 -39 6 -57q0 -14 -1 -26q-80 0 -192 8q-93 8 -189 8q-79 0 -135 -2l-200 -11l-58 -2q0 45 4 78l131 28q56 13 68 23q12 12 12 27t-6 32l-47 114l-92 228l-450 2q-29 -65 -104 -274q-23 -64 -23 -84q0 -31 17 -43 q26 -21 103 -32q3 0 13.5 -2t30 -5t40.5 -6q1 -28 1 -58q0 -17 -2 -27q-66 0 -349 20l-48 -8q-81 -14 -167 -14z" />
-<glyph unicode="&#xf032;" horiz-adv-x="1408" d="M555 15q76 -32 140 -32q131 0 216 41t122 113q38 70 38 181q0 114 -41 180q-58 94 -141 126q-80 32 -247 32q-74 0 -101 -10v-144l-1 -173l3 -270q0 -15 12 -44zM541 761q43 -7 109 -7q175 0 264 65t89 224q0 112 -85 187q-84 75 -255 75q-52 0 -130 -13q0 -44 2 -77 q7 -122 6 -279l-1 -98q0 -43 1 -77zM0 -128l2 94q45 9 68 12q77 12 123 31q17 27 21 51q9 66 9 194l-2 497q-5 256 -9 404q-1 87 -11 109q-1 4 -12 12q-18 12 -69 15q-30 2 -114 13l-4 83l260 6l380 13l45 1q5 0 14 0.5t14 0.5q1 0 21.5 -0.5t40.5 -0.5h74q88 0 191 -27 q43 -13 96 -39q57 -29 102 -76q44 -47 65 -104t21 -122q0 -70 -32 -128t-95 -105q-26 -20 -150 -77q177 -41 267 -146q92 -106 92 -236q0 -76 -29 -161q-21 -62 -71 -117q-66 -72 -140 -108q-73 -36 -203 -60q-82 -15 -198 -11l-197 4q-84 2 -298 -11q-33 -3 -272 -11z" />
-<glyph unicode="&#xf033;" horiz-adv-x="1024" d="M0 -126l17 85q4 1 77 20q76 19 116 39q29 37 41 101l27 139l56 268l12 64q8 44 17 84.5t16 67t12.5 46.5t9 30.5t3.5 11.5l29 157l16 63l22 135l8 50v38q-41 22 -144 28q-28 2 -38 4l19 103l317 -14q39 -2 73 -2q66 0 214 9q33 2 68 4.5t36 2.5q-2 -19 -6 -38 q-7 -29 -13 -51q-55 -19 -109 -31q-64 -16 -101 -31q-12 -31 -24 -88q-9 -44 -13 -82q-44 -199 -66 -306l-61 -311l-38 -158l-43 -235l-12 -45q-2 -7 1 -27q64 -15 119 -21q36 -5 66 -10q-1 -29 -7 -58q-7 -31 -9 -41q-18 0 -23 -1q-24 -2 -42 -2q-9 0 -28 3q-19 4 -145 17 l-198 2q-41 1 -174 -11q-74 -7 -98 -9z" />
-<glyph unicode="&#xf034;" horiz-adv-x="1792" d="M81 1407l54 -27q20 -5 211 -5h130l19 3l115 1l215 -1h293l34 -2q14 -1 28 7t21 16l7 8l42 1q15 0 28 -1v-104.5t1 -131.5l1 -100l-1 -58q0 -32 -4 -51q-39 -15 -68 -18q-25 43 -54 128q-8 24 -15.5 62.5t-11.5 65.5t-6 29q-13 15 -27 19q-7 2 -42.5 2t-103.5 -1t-111 -1 q-34 0 -67 -5q-10 -97 -8 -136l1 -152v-332l3 -359l-1 -147q-1 -46 11 -85q49 -25 89 -32q2 0 18 -5t44 -13t43 -12q30 -8 50 -18q5 -45 5 -50q0 -10 -3 -29q-14 -1 -34 -1q-110 0 -187 10q-72 8 -238 8q-88 0 -233 -14q-48 -4 -70 -4q-2 22 -2 26l-1 26v9q21 33 79 49 q139 38 159 50q9 21 12 56q8 192 6 433l-5 428q-1 62 -0.5 118.5t0.5 102.5t-2 57t-6 15q-6 5 -14 6q-38 6 -148 6q-43 0 -100 -13.5t-73 -24.5q-13 -9 -22 -33t-22 -75t-24 -84q-6 -19 -19.5 -32t-20.5 -13q-44 27 -56 44v297v86zM1744 128q33 0 42 -18.5t-11 -44.5 l-126 -162q-20 -26 -49 -26t-49 26l-126 162q-20 26 -11 44.5t42 18.5h80v1024h-80q-33 0 -42 18.5t11 44.5l126 162q20 26 49 26t49 -26l126 -162q20 -26 11 -44.5t-42 -18.5h-80v-1024h80z" />
-<glyph unicode="&#xf035;" d="M81 1407l54 -27q20 -5 211 -5h130l19 3l115 1l446 -1h318l34 -2q14 -1 28 7t21 16l7 8l42 1q15 0 28 -1v-104.5t1 -131.5l1 -100l-1 -58q0 -32 -4 -51q-39 -15 -68 -18q-25 43 -54 128q-8 24 -15.5 62.5t-11.5 65.5t-6 29q-13 15 -27 19q-7 2 -58.5 2t-138.5 -1t-128 -1 q-94 0 -127 -5q-10 -97 -8 -136l1 -152v52l3 -359l-1 -147q-1 -46 11 -85q49 -25 89 -32q2 0 18 -5t44 -13t43 -12q30 -8 50 -18q5 -45 5 -50q0 -10 -3 -29q-14 -1 -34 -1q-110 0 -187 10q-72 8 -238 8q-82 0 -233 -13q-45 -5 -70 -5q-2 22 -2 26l-1 26v9q21 33 79 49 q139 38 159 50q9 21 12 56q6 137 6 433l-5 44q0 265 -2 278q-2 11 -6 15q-6 5 -14 6q-38 6 -148 6q-50 0 -168.5 -14t-132.5 -24q-13 -9 -22 -33t-22 -75t-24 -84q-6 -19 -19.5 -32t-20.5 -13q-44 27 -56 44v297v86zM1505 113q26 -20 26 -49t-26 -49l-162 -126 q-26 -20 -44.5 -11t-18.5 42v80h-1024v-80q0 -33 -18.5 -42t-44.5 11l-162 126q-26 20 -26 49t26 49l162 126q26 20 44.5 11t18.5 -42v-80h1024v80q0 33 18.5 42t44.5 -11z" />
-<glyph unicode="&#xf036;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf037;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h896q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45t-45 -19 h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h640q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf038;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf039;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf03a;" horiz-adv-x="1792" d="M256 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM256 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5 t9.5 -22.5zM256 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344 q13 0 22.5 -9.5t9.5 -22.5zM256 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192 q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5z" />
-<glyph unicode="&#xf03b;" horiz-adv-x="1792" d="M384 992v-576q0 -13 -9.5 -22.5t-22.5 -9.5q-14 0 -23 9l-288 288q-9 9 -9 23t9 23l288 288q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
-<glyph unicode="&#xf03c;" horiz-adv-x="1792" d="M352 704q0 -14 -9 -23l-288 -288q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v576q0 13 9.5 22.5t22.5 9.5q14 0 23 -9l288 -288q9 -9 9 -23zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
-<glyph unicode="&#xf03d;" horiz-adv-x="1792" d="M1792 1184v-1088q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-403 403v-166q0 -119 -84.5 -203.5t-203.5 -84.5h-704q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h704q119 0 203.5 -84.5t84.5 -203.5v-165l403 402q18 19 45 19q12 0 25 -5 q39 -17 39 -59z" />
-<glyph unicode="&#xf03e;" horiz-adv-x="1920" d="M640 960q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 576v-448h-1408v192l320 320l160 -160l512 512zM1760 1280h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216 q0 13 -9.5 22.5t-22.5 9.5zM1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
-<glyph unicode="&#xf040;" d="M363 0l91 91l-235 235l-91 -91v-107h128v-128h107zM886 928q0 22 -22 22q-10 0 -17 -7l-542 -542q-7 -7 -7 -17q0 -22 22 -22q10 0 17 7l542 542q7 7 7 17zM832 1120l416 -416l-832 -832h-416v416zM1515 1024q0 -53 -37 -90l-166 -166l-416 416l166 165q36 38 90 38 q53 0 91 -38l235 -234q37 -39 37 -91z" />
-<glyph unicode="&#xf041;" horiz-adv-x="1024" d="M768 896q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1024 896q0 -109 -33 -179l-364 -774q-16 -33 -47.5 -52t-67.5 -19t-67.5 19t-46.5 52l-365 774q-33 70 -33 179q0 212 150 362t362 150t362 -150t150 -362z" />
-<glyph unicode="&#xf042;" d="M768 96v1088q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf043;" horiz-adv-x="1024" d="M512 384q0 36 -20 69q-1 1 -15.5 22.5t-25.5 38t-25 44t-21 50.5q-4 16 -21 16t-21 -16q-7 -23 -21 -50.5t-25 -44t-25.5 -38t-15.5 -22.5q-20 -33 -20 -69q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 512q0 -212 -150 -362t-362 -150t-362 150t-150 362 q0 145 81 275q6 9 62.5 90.5t101 151t99.5 178t83 201.5q9 30 34 47t51 17t51.5 -17t33.5 -47q28 -93 83 -201.5t99.5 -178t101 -151t62.5 -90.5q81 -127 81 -275z" />
-<glyph unicode="&#xf044;" horiz-adv-x="1792" d="M888 352l116 116l-152 152l-116 -116v-56h96v-96h56zM1328 1072q-16 16 -33 -1l-350 -350q-17 -17 -1 -33t33 1l350 350q17 17 1 33zM1408 478v-190q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-14 -14 -32 -8q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v126q0 13 9 22l64 64q15 15 35 7t20 -29zM1312 1216l288 -288l-672 -672h-288v288zM1756 1084l-92 -92 l-288 288l92 92q28 28 68 28t68 -28l152 -152q28 -28 28 -68t-28 -68z" />
-<glyph unicode="&#xf045;" horiz-adv-x="1664" d="M1408 547v-259q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h255v0q13 0 22.5 -9.5t9.5 -22.5q0 -27 -26 -32q-77 -26 -133 -60q-10 -4 -16 -4h-112q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832 q66 0 113 47t47 113v214q0 19 18 29q28 13 54 37q16 16 35 8q21 -9 21 -29zM1645 1043l-384 -384q-18 -19 -45 -19q-12 0 -25 5q-39 17 -39 59v192h-160q-323 0 -438 -131q-119 -137 -74 -473q3 -23 -20 -34q-8 -2 -12 -2q-16 0 -26 13q-10 14 -21 31t-39.5 68.5t-49.5 99.5 t-38.5 114t-17.5 122q0 49 3.5 91t14 90t28 88t47 81.5t68.5 74t94.5 61.5t124.5 48.5t159.5 30.5t196.5 11h160v192q0 42 39 59q13 5 25 5q26 0 45 -19l384 -384q19 -19 19 -45t-19 -45z" />
-<glyph unicode="&#xf046;" horiz-adv-x="1664" d="M1408 606v-318q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-10 -10 -23 -10q-3 0 -9 2q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832 q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v254q0 13 9 22l64 64q10 10 23 10q6 0 12 -3q20 -8 20 -29zM1639 1095l-814 -814q-24 -24 -57 -24t-57 24l-430 430q-24 24 -24 57t24 57l110 110q24 24 57 24t57 -24l263 -263l647 647q24 24 57 24t57 -24l110 -110 q24 -24 24 -57t-24 -57z" />
-<glyph unicode="&#xf047;" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-384v-384h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v384h-384v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45 t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h384v384h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-384h384v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
-<glyph unicode="&#xf048;" horiz-adv-x="1024" d="M979 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19z" />
-<glyph unicode="&#xf049;" horiz-adv-x="1792" d="M1747 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19l710 710 q19 19 32 13t13 -32v-710q4 11 13 19z" />
-<glyph unicode="&#xf04a;" horiz-adv-x="1664" d="M1619 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-8 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-19 19 -19 45t19 45l710 710q19 19 32 13t13 -32v-710q5 11 13 19z" />
-<glyph unicode="&#xf04b;" horiz-adv-x="1408" d="M1384 609l-1328 -738q-23 -13 -39.5 -3t-16.5 36v1472q0 26 16.5 36t39.5 -3l1328 -738q23 -13 23 -31t-23 -31z" />
-<glyph unicode="&#xf04c;" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45zM640 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf04d;" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf04e;" horiz-adv-x="1664" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q19 -19 19 -45t-19 -45l-710 -710q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" />
-<glyph unicode="&#xf050;" horiz-adv-x="1792" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19l-710 -710 q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" />
-<glyph unicode="&#xf051;" horiz-adv-x="1024" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19z" />
-<glyph unicode="&#xf052;" horiz-adv-x="1538" d="M14 557l710 710q19 19 45 19t45 -19l710 -710q19 -19 13 -32t-32 -13h-1472q-26 0 -32 13t13 32zM1473 0h-1408q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19z" />
-<glyph unicode="&#xf053;" horiz-adv-x="1152" d="M742 -37l-652 651q-37 37 -37 90.5t37 90.5l652 651q37 37 90.5 37t90.5 -37l75 -75q37 -37 37 -90.5t-37 -90.5l-486 -486l486 -485q37 -38 37 -91t-37 -90l-75 -75q-37 -37 -90.5 -37t-90.5 37z" />
-<glyph unicode="&#xf054;" horiz-adv-x="1152" d="M1099 704q0 -52 -37 -91l-652 -651q-37 -37 -90 -37t-90 37l-76 75q-37 39 -37 91q0 53 37 90l486 486l-486 485q-37 39 -37 91q0 53 37 90l76 75q36 38 90 38t90 -38l652 -651q37 -37 37 -90z" />
-<glyph unicode="&#xf055;" d="M1216 576v128q0 26 -19 45t-45 19h-256v256q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-256h-256q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h256v-256q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v256h256q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5 t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf056;" d="M1216 576v128q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5 t103 -385.5z" />
-<glyph unicode="&#xf057;" d="M1149 414q0 26 -19 45l-181 181l181 181q19 19 19 45q0 27 -19 46l-90 90q-19 19 -46 19q-26 0 -45 -19l-181 -181l-181 181q-19 19 -45 19q-27 0 -46 -19l-90 -90q-19 -19 -19 -46q0 -26 19 -45l181 -181l-181 -181q-19 -19 -19 -45q0 -27 19 -46l90 -90q19 -19 46 -19 q26 0 45 19l181 181l181 -181q19 -19 45 -19q27 0 46 19l90 90q19 19 19 46zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf058;" d="M1284 802q0 28 -18 46l-91 90q-19 19 -45 19t-45 -19l-408 -407l-226 226q-19 19 -45 19t-45 -19l-91 -90q-18 -18 -18 -46q0 -27 18 -45l362 -362q19 -19 45 -19q27 0 46 19l543 543q18 18 18 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf059;" d="M896 160v192q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h192q14 0 23 9t9 23zM1152 832q0 88 -55.5 163t-138.5 116t-170 41q-243 0 -371 -213q-15 -24 8 -42l132 -100q7 -6 19 -6q16 0 25 12q53 68 86 92q34 24 86 24q48 0 85.5 -26t37.5 -59 q0 -38 -20 -61t-68 -45q-63 -28 -115.5 -86.5t-52.5 -125.5v-36q0 -14 9 -23t23 -9h192q14 0 23 9t9 23q0 19 21.5 49.5t54.5 49.5q32 18 49 28.5t46 35t44.5 48t28 60.5t12.5 81zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf05a;" d="M1024 160v160q0 14 -9 23t-23 9h-96v512q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h96v-320h-96q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h448q14 0 23 9t9 23zM896 1056v160q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23 t23 -9h192q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf05b;" d="M1197 512h-109q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h109q-32 108 -112.5 188.5t-188.5 112.5v-109q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v109q-108 -32 -188.5 -112.5t-112.5 -188.5h109q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-109 q32 -108 112.5 -188.5t188.5 -112.5v109q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-109q108 32 188.5 112.5t112.5 188.5zM1536 704v-128q0 -26 -19 -45t-45 -19h-143q-37 -161 -154.5 -278.5t-278.5 -154.5v-143q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v143 q-161 37 -278.5 154.5t-154.5 278.5h-143q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h143q37 161 154.5 278.5t278.5 154.5v143q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-143q161 -37 278.5 -154.5t154.5 -278.5h143q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf05c;" d="M1097 457l-146 -146q-10 -10 -23 -10t-23 10l-137 137l-137 -137q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23t10 23l137 137l-137 137q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l137 -137l137 137q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23 l-137 -137l137 -137q10 -10 10 -23t-10 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5 t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf05d;" d="M1171 723l-422 -422q-19 -19 -45 -19t-45 19l-294 294q-19 19 -19 45t19 45l102 102q19 19 45 19t45 -19l147 -147l275 275q19 19 45 19t45 -19l102 -102q19 -19 19 -45t-19 -45zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198 t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf05e;" d="M1312 643q0 161 -87 295l-754 -753q137 -89 297 -89q111 0 211.5 43.5t173.5 116.5t116 174.5t43 212.5zM313 344l755 754q-135 91 -300 91q-148 0 -273 -73t-198 -199t-73 -274q0 -162 89 -299zM1536 643q0 -157 -61 -300t-163.5 -246t-245 -164t-298.5 -61t-298.5 61 t-245 164t-163.5 246t-61 300t61 299.5t163.5 245.5t245 164t298.5 61t298.5 -61t245 -164t163.5 -245.5t61 -299.5z" />
-<glyph unicode="&#xf060;" d="M1536 640v-128q0 -53 -32.5 -90.5t-84.5 -37.5h-704l293 -294q38 -36 38 -90t-38 -90l-75 -76q-37 -37 -90 -37q-52 0 -91 37l-651 652q-37 37 -37 90q0 52 37 91l651 650q38 38 91 38q52 0 90 -38l75 -74q38 -38 38 -91t-38 -91l-293 -293h704q52 0 84.5 -37.5 t32.5 -90.5z" />
-<glyph unicode="&#xf061;" d="M1472 576q0 -54 -37 -91l-651 -651q-39 -37 -91 -37q-51 0 -90 37l-75 75q-38 38 -38 91t38 91l293 293h-704q-52 0 -84.5 37.5t-32.5 90.5v128q0 53 32.5 90.5t84.5 37.5h704l-293 294q-38 36 -38 90t38 90l75 75q38 38 90 38q53 0 91 -38l651 -651q37 -35 37 -90z" />
-<glyph unicode="&#xf062;" horiz-adv-x="1664" d="M1611 565q0 -51 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-294 293v-704q0 -52 -37.5 -84.5t-90.5 -32.5h-128q-53 0 -90.5 32.5t-37.5 84.5v704l-294 -293q-36 -38 -90 -38t-90 38l-75 75q-38 38 -38 90q0 53 38 91l651 651q35 37 90 37q54 0 91 -37l651 -651 q37 -39 37 -91z" />
-<glyph unicode="&#xf063;" horiz-adv-x="1664" d="M1611 704q0 -53 -37 -90l-651 -652q-39 -37 -91 -37q-53 0 -90 37l-651 652q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l294 -294v704q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-704l294 294q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" />
-<glyph unicode="&#xf064;" horiz-adv-x="1792" d="M1792 896q0 -26 -19 -45l-512 -512q-19 -19 -45 -19t-45 19t-19 45v256h-224q-98 0 -175.5 -6t-154 -21.5t-133 -42.5t-105.5 -69.5t-80 -101t-48.5 -138.5t-17.5 -181q0 -55 5 -123q0 -6 2.5 -23.5t2.5 -26.5q0 -15 -8.5 -25t-23.5 -10q-16 0 -28 17q-7 9 -13 22 t-13.5 30t-10.5 24q-127 285 -127 451q0 199 53 333q162 403 875 403h224v256q0 26 19 45t45 19t45 -19l512 -512q19 -19 19 -45z" />
-<glyph unicode="&#xf065;" d="M755 480q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23zM1536 1344v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332 q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf066;" d="M768 576v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45zM1523 1248q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45 t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23z" />
-<glyph unicode="&#xf067;" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-416v-416q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v416h-416q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h416v416q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-416h416q40 0 68 -28t28 -68z" />
-<glyph unicode="&#xf068;" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-1216q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h1216q40 0 68 -28t28 -68z" />
-<glyph unicode="&#xf069;" horiz-adv-x="1664" d="M1482 486q46 -26 59.5 -77.5t-12.5 -97.5l-64 -110q-26 -46 -77.5 -59.5t-97.5 12.5l-266 153v-307q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v307l-266 -153q-46 -26 -97.5 -12.5t-77.5 59.5l-64 110q-26 46 -12.5 97.5t59.5 77.5l266 154l-266 154 q-46 26 -59.5 77.5t12.5 97.5l64 110q26 46 77.5 59.5t97.5 -12.5l266 -153v307q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-307l266 153q46 26 97.5 12.5t77.5 -59.5l64 -110q26 -46 12.5 -97.5t-59.5 -77.5l-266 -154z" />
-<glyph unicode="&#xf06a;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM896 161v190q0 14 -9 23.5t-22 9.5h-192q-13 0 -23 -10t-10 -23v-190q0 -13 10 -23t23 -10h192 q13 0 22 9.5t9 23.5zM894 505l18 621q0 12 -10 18q-10 8 -24 8h-220q-14 0 -24 -8q-10 -6 -10 -18l17 -621q0 -10 10 -17.5t24 -7.5h185q14 0 23.5 7.5t10.5 17.5z" />
-<glyph unicode="&#xf06b;" d="M928 180v56v468v192h-320v-192v-468v-56q0 -25 18 -38.5t46 -13.5h192q28 0 46 13.5t18 38.5zM472 1024h195l-126 161q-26 31 -69 31q-40 0 -68 -28t-28 -68t28 -68t68 -28zM1160 1120q0 40 -28 68t-68 28q-43 0 -69 -31l-125 -161h194q40 0 68 28t28 68zM1536 864v-320 q0 -14 -9 -23t-23 -9h-96v-416q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v416h-96q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h440q-93 0 -158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5q107 0 168 -77l128 -165l128 165q61 77 168 77q93 0 158.5 -65.5t65.5 -158.5 t-65.5 -158.5t-158.5 -65.5h440q14 0 23 -9t9 -23z" />
-<glyph unicode="&#xf06c;" horiz-adv-x="1792" d="M1280 832q0 26 -19 45t-45 19q-172 0 -318 -49.5t-259.5 -134t-235.5 -219.5q-19 -21 -19 -45q0 -26 19 -45t45 -19q24 0 45 19q27 24 74 71t67 66q137 124 268.5 176t313.5 52q26 0 45 19t19 45zM1792 1030q0 -95 -20 -193q-46 -224 -184.5 -383t-357.5 -268 q-214 -108 -438 -108q-148 0 -286 47q-15 5 -88 42t-96 37q-16 0 -39.5 -32t-45 -70t-52.5 -70t-60 -32q-30 0 -51 11t-31 24t-27 42q-2 4 -6 11t-5.5 10t-3 9.5t-1.5 13.5q0 35 31 73.5t68 65.5t68 56t31 48q0 4 -14 38t-16 44q-9 51 -9 104q0 115 43.5 220t119 184.5 t170.5 139t204 95.5q55 18 145 25.5t179.5 9t178.5 6t163.5 24t113.5 56.5l29.5 29.5t29.5 28t27 20t36.5 16t43.5 4.5q39 0 70.5 -46t47.5 -112t24 -124t8 -96z" />
-<glyph unicode="&#xf06d;" horiz-adv-x="1408" d="M1408 -160v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1152 896q0 -78 -24.5 -144t-64 -112.5t-87.5 -88t-96 -77.5t-87.5 -72t-64 -81.5t-24.5 -96.5q0 -96 67 -224l-4 1l1 -1 q-90 41 -160 83t-138.5 100t-113.5 122.5t-72.5 150.5t-27.5 184q0 78 24.5 144t64 112.5t87.5 88t96 77.5t87.5 72t64 81.5t24.5 96.5q0 94 -66 224l3 -1l-1 1q90 -41 160 -83t138.5 -100t113.5 -122.5t72.5 -150.5t27.5 -184z" />
-<glyph unicode="&#xf06e;" horiz-adv-x="1792" d="M1664 576q-152 236 -381 353q61 -104 61 -225q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 121 61 225q-229 -117 -381 -353q133 -205 333.5 -326.5t434.5 -121.5t434.5 121.5t333.5 326.5zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5 t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1792 576q0 -34 -20 -69q-140 -230 -376.5 -368.5t-499.5 -138.5t-499.5 139t-376.5 368q-20 35 -20 69t20 69q140 229 376.5 368t499.5 139t499.5 -139t376.5 -368q20 -35 20 -69z" />
-<glyph unicode="&#xf070;" horiz-adv-x="1792" d="M555 201l78 141q-87 63 -136 159t-49 203q0 121 61 225q-229 -117 -381 -353q167 -258 427 -375zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1307 1151q0 -7 -1 -9 q-105 -188 -315 -566t-316 -567l-49 -89q-10 -16 -28 -16q-12 0 -134 70q-16 10 -16 28q0 12 44 87q-143 65 -263.5 173t-208.5 245q-20 31 -20 69t20 69q153 235 380 371t496 136q89 0 180 -17l54 97q10 16 28 16q5 0 18 -6t31 -15.5t33 -18.5t31.5 -18.5t19.5 -11.5 q16 -10 16 -27zM1344 704q0 -139 -79 -253.5t-209 -164.5l280 502q8 -45 8 -84zM1792 576q0 -35 -20 -69q-39 -64 -109 -145q-150 -172 -347.5 -267t-419.5 -95l74 132q212 18 392.5 137t301.5 307q-115 179 -282 294l63 112q95 -64 182.5 -153t144.5 -184q20 -34 20 -69z " />
-<glyph unicode="&#xf071;" horiz-adv-x="1792" d="M1024 161v190q0 14 -9.5 23.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -23.5v-190q0 -14 9.5 -23.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 23.5zM1022 535l18 459q0 12 -10 19q-13 11 -24 11h-220q-11 0 -24 -11q-10 -7 -10 -21l17 -457q0 -10 10 -16.5t24 -6.5h185 q14 0 23.5 6.5t10.5 16.5zM1008 1469l768 -1408q35 -63 -2 -126q-17 -29 -46.5 -46t-63.5 -17h-1536q-34 0 -63.5 17t-46.5 46q-37 63 -2 126l768 1408q17 31 47 49t65 18t65 -18t47 -49z" />
-<glyph unicode="&#xf072;" horiz-adv-x="1408" d="M1376 1376q44 -52 12 -148t-108 -172l-161 -161l160 -696q5 -19 -12 -33l-128 -96q-7 -6 -19 -6q-4 0 -7 1q-15 3 -21 16l-279 508l-259 -259l53 -194q5 -17 -8 -31l-96 -96q-9 -9 -23 -9h-2q-15 2 -24 13l-189 252l-252 189q-11 7 -13 23q-1 13 9 25l96 97q9 9 23 9 q6 0 8 -1l194 -53l259 259l-508 279q-14 8 -17 24q-2 16 9 27l128 128q14 13 30 8l665 -159l160 160q76 76 172 108t148 -12z" />
-<glyph unicode="&#xf073;" horiz-adv-x="1664" d="M128 -128h288v288h-288v-288zM480 -128h320v288h-320v-288zM128 224h288v320h-288v-320zM480 224h320v320h-320v-320zM128 608h288v288h-288v-288zM864 -128h320v288h-320v-288zM480 608h320v288h-320v-288zM1248 -128h288v288h-288v-288zM864 224h320v320h-320v-320z M512 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1248 224h288v320h-288v-320zM864 608h320v288h-320v-288zM1248 608h288v288h-288v-288zM1280 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64 q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47 h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
-<glyph unicode="&#xf074;" horiz-adv-x="1792" d="M666 1055q-60 -92 -137 -273q-22 45 -37 72.5t-40.5 63.5t-51 56.5t-63 35t-81.5 14.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q250 0 410 -225zM1792 256q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192q-32 0 -85 -0.5t-81 -1t-73 1 t-71 5t-64 10.5t-63 18.5t-58 28.5t-59 40t-55 53.5t-56 69.5q59 93 136 273q22 -45 37 -72.5t40.5 -63.5t51 -56.5t63 -35t81.5 -14.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1792 1152q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5 v192h-256q-48 0 -87 -15t-69 -45t-51 -61.5t-45 -77.5q-32 -62 -78 -171q-29 -66 -49.5 -111t-54 -105t-64 -100t-74 -83t-90 -68.5t-106.5 -42t-128 -16.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q48 0 87 15t69 45t51 61.5t45 77.5q32 62 78 171q29 66 49.5 111 t54 105t64 100t74 83t90 68.5t106.5 42t128 16.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
-<glyph unicode="&#xf075;" horiz-adv-x="1792" d="M1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22q-17 -2 -30.5 9t-17.5 29v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281 q0 130 71 248.5t191 204.5t286 136.5t348 50.5q244 0 450 -85.5t326 -233t120 -321.5z" />
-<glyph unicode="&#xf076;" d="M1536 704v-128q0 -201 -98.5 -362t-274 -251.5t-395.5 -90.5t-395.5 90.5t-274 251.5t-98.5 362v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -52 23.5 -90t53.5 -57t71 -30t64 -13t44 -2t44 2t64 13t71 30t53.5 57t23.5 90v128q0 26 19 45t45 19h384 q26 0 45 -19t19 -45zM512 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45zM1536 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf077;" horiz-adv-x="1664" d="M1611 320q0 -53 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-486 485l-486 -485q-36 -38 -90 -38t-90 38l-75 75q-38 36 -38 90q0 53 38 91l651 651q37 37 90 37q52 0 91 -37l650 -651q38 -38 38 -91z" />
-<glyph unicode="&#xf078;" horiz-adv-x="1664" d="M1611 832q0 -53 -37 -90l-651 -651q-38 -38 -91 -38q-54 0 -90 38l-651 651q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l486 -486l486 486q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" />
-<glyph unicode="&#xf079;" horiz-adv-x="1920" d="M1280 32q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-8 0 -13.5 2t-9 7t-5.5 8t-3 11.5t-1 11.5v13v11v160v416h-192q-26 0 -45 19t-19 45q0 24 15 41l320 384q19 22 49 22t49 -22l320 -384q15 -17 15 -41q0 -26 -19 -45t-45 -19h-192v-384h576q16 0 25 -11l160 -192q7 -11 7 -21 zM1920 448q0 -24 -15 -41l-320 -384q-20 -23 -49 -23t-49 23l-320 384q-15 17 -15 41q0 26 19 45t45 19h192v384h-576q-16 0 -25 12l-160 192q-7 9 -7 20q0 13 9.5 22.5t22.5 9.5h960q8 0 13.5 -2t9 -7t5.5 -8t3 -11.5t1 -11.5v-13v-11v-160v-416h192q26 0 45 -19t19 -45z " />
-<glyph unicode="&#xf07a;" horiz-adv-x="1664" d="M640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5 l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5 t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf07b;" horiz-adv-x="1664" d="M1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
-<glyph unicode="&#xf07c;" horiz-adv-x="1920" d="M1879 584q0 -31 -31 -66l-336 -396q-43 -51 -120.5 -86.5t-143.5 -35.5h-1088q-34 0 -60.5 13t-26.5 43q0 31 31 66l336 396q43 51 120.5 86.5t143.5 35.5h1088q34 0 60.5 -13t26.5 -43zM1536 928v-160h-832q-94 0 -197 -47.5t-164 -119.5l-337 -396l-5 -6q0 4 -0.5 12.5 t-0.5 12.5v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158z" />
-<glyph unicode="&#xf07d;" horiz-adv-x="768" d="M704 1216q0 -26 -19 -45t-45 -19h-128v-1024h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v1024h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45z" />
-<glyph unicode="&#xf07e;" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-1024v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h1024v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
-<glyph unicode="&#xf080;" horiz-adv-x="1920" d="M512 512v-384h-256v384h256zM896 1024v-896h-256v896h256zM1280 768v-640h-256v640h256zM1664 1152v-1024h-256v1024h256zM1792 32v1216q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5z M1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
-<glyph unicode="&#xf081;" d="M1280 926q-56 -25 -121 -34q68 40 93 117q-65 -38 -134 -51q-61 66 -153 66q-87 0 -148.5 -61.5t-61.5 -148.5q0 -29 5 -48q-129 7 -242 65t-192 155q-29 -50 -29 -106q0 -114 91 -175q-47 1 -100 26v-2q0 -75 50 -133.5t123 -72.5q-29 -8 -51 -8q-13 0 -39 4 q21 -63 74.5 -104t121.5 -42q-116 -90 -261 -90q-26 0 -50 3q148 -94 322 -94q112 0 210 35.5t168 95t120.5 137t75 162t24.5 168.5q0 18 -1 27q63 45 105 109zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5 t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf082;" d="M1307 618l23 219h-198v109q0 49 15.5 68.5t71.5 19.5h110v219h-175q-152 0 -218 -72t-66 -213v-131h-131v-219h131v-635h262v635h175zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960 q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf083;" horiz-adv-x="1792" d="M928 704q0 14 -9 23t-23 9q-66 0 -113 -47t-47 -113q0 -14 9 -23t23 -9t23 9t9 23q0 40 28 68t68 28q14 0 23 9t9 23zM1152 574q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM128 0h1536v128h-1536v-128zM1280 574q0 159 -112.5 271.5 t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM256 1216h384v128h-384v-128zM128 1024h1536v118v138h-828l-64 -128h-644v-128zM1792 1280v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1536q-53 0 -90.5 37.5t-37.5 90.5v1280 q0 53 37.5 90.5t90.5 37.5h1536q53 0 90.5 -37.5t37.5 -90.5z" />
-<glyph unicode="&#xf084;" horiz-adv-x="1792" d="M832 1024q0 80 -56 136t-136 56t-136 -56t-56 -136q0 -42 19 -83q-41 19 -83 19q-80 0 -136 -56t-56 -136t56 -136t136 -56t136 56t56 136q0 42 -19 83q41 -19 83 -19q80 0 136 56t56 136zM1683 320q0 -17 -49 -66t-66 -49q-9 0 -28.5 16t-36.5 33t-38.5 40t-24.5 26 l-96 -96l220 -220q28 -28 28 -68q0 -42 -39 -81t-81 -39q-40 0 -68 28l-671 671q-176 -131 -365 -131q-163 0 -265.5 102.5t-102.5 265.5q0 160 95 313t248 248t313 95q163 0 265.5 -102.5t102.5 -265.5q0 -189 -131 -365l355 -355l96 96q-3 3 -26 24.5t-40 38.5t-33 36.5 t-16 28.5q0 17 49 66t66 49q13 0 23 -10q6 -6 46 -44.5t82 -79.5t86.5 -86t73 -78t28.5 -41z" />
-<glyph unicode="&#xf085;" horiz-adv-x="1920" d="M896 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1664 128q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1152q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1280 731v-185q0 -10 -7 -19.5t-16 -10.5l-155 -24q-11 -35 -32 -76q34 -48 90 -115q7 -10 7 -20q0 -12 -7 -19q-23 -30 -82.5 -89.5t-78.5 -59.5q-11 0 -21 7l-115 90q-37 -19 -77 -31q-11 -108 -23 -155q-7 -24 -30 -24h-186q-11 0 -20 7.5t-10 17.5 l-23 153q-34 10 -75 31l-118 -89q-7 -7 -20 -7q-11 0 -21 8q-144 133 -144 160q0 9 7 19q10 14 41 53t47 61q-23 44 -35 82l-152 24q-10 1 -17 9.5t-7 19.5v185q0 10 7 19.5t16 10.5l155 24q11 35 32 76q-34 48 -90 115q-7 11 -7 20q0 12 7 20q22 30 82 89t79 59q11 0 21 -7 l115 -90q34 18 77 32q11 108 23 154q7 24 30 24h186q11 0 20 -7.5t10 -17.5l23 -153q34 -10 75 -31l118 89q8 7 20 7q11 0 21 -8q144 -133 144 -160q0 -9 -7 -19q-12 -16 -42 -54t-45 -60q23 -48 34 -82l152 -23q10 -2 17 -10.5t7 -19.5zM1920 198v-140q0 -16 -149 -31 q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20 t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31zM1920 1222v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68 q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70 q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31z" />
-<glyph unicode="&#xf086;" horiz-adv-x="1792" d="M1408 768q0 -139 -94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224 q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257zM1792 512q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7 q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230z" />
-<glyph unicode="&#xf087;" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 768q0 51 -39 89.5t-89 38.5h-352q0 58 48 159.5t48 160.5q0 98 -32 145t-128 47q-26 -26 -38 -85t-30.5 -125.5t-59.5 -109.5q-22 -23 -77 -91q-4 -5 -23 -30t-31.5 -41t-34.5 -42.5 t-40 -44t-38.5 -35.5t-40 -27t-35.5 -9h-32v-640h32q13 0 31.5 -3t33 -6.5t38 -11t35 -11.5t35.5 -12.5t29 -10.5q211 -73 342 -73h121q192 0 192 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5q32 1 53.5 47t21.5 81zM1536 769 q0 -89 -49 -163q9 -33 9 -69q0 -77 -38 -144q3 -21 3 -43q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5h-36h-93q-96 0 -189.5 22.5t-216.5 65.5q-116 40 -138 40h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h274q36 24 137 155q58 75 107 128 q24 25 35.5 85.5t30.5 126.5t62 108q39 37 90 37q84 0 151 -32.5t102 -101.5t35 -186q0 -93 -48 -192h176q104 0 180 -76t76 -179z" />
-<glyph unicode="&#xf088;" d="M256 1088q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 512q0 35 -21.5 81t-53.5 47q15 17 25 47.5t10 55.5q0 69 -53 119q18 32 18 69t-17.5 73.5t-47.5 52.5q5 30 5 56q0 85 -49 126t-136 41h-128q-131 0 -342 -73q-5 -2 -29 -10.5 t-35.5 -12.5t-35 -11.5t-38 -11t-33 -6.5t-31.5 -3h-32v-640h32q16 0 35.5 -9t40 -27t38.5 -35.5t40 -44t34.5 -42.5t31.5 -41t23 -30q55 -68 77 -91q41 -43 59.5 -109.5t30.5 -125.5t38 -85q96 0 128 47t32 145q0 59 -48 160.5t-48 159.5h352q50 0 89 38.5t39 89.5z M1536 511q0 -103 -76 -179t-180 -76h-176q48 -99 48 -192q0 -118 -35 -186q-35 -69 -102 -101.5t-151 -32.5q-51 0 -90 37q-34 33 -54 82t-25.5 90.5t-17.5 84.5t-31 64q-48 50 -107 127q-101 131 -137 155h-274q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5 h288q22 0 138 40q128 44 223 66t200 22h112q140 0 226.5 -79t85.5 -216v-5q60 -77 60 -178q0 -22 -3 -43q38 -67 38 -144q0 -36 -9 -69q49 -74 49 -163z" />
-<glyph unicode="&#xf089;" horiz-adv-x="896" d="M832 1504v-1339l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41z" />
-<glyph unicode="&#xf08a;" horiz-adv-x="1792" d="M1664 940q0 81 -21.5 143t-55 98.5t-81.5 59.5t-94 31t-98 8t-112 -25.5t-110.5 -64t-86.5 -72t-60 -61.5q-18 -22 -49 -22t-49 22q-24 28 -60 61.5t-86.5 72t-110.5 64t-112 25.5t-98 -8t-94 -31t-81.5 -59.5t-55 -98.5t-21.5 -143q0 -168 187 -355l581 -560l580 559 q188 188 188 356zM1792 940q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5 q224 0 351 -124t127 -344z" />
-<glyph unicode="&#xf08b;" horiz-adv-x="1664" d="M640 96q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h320q13 0 22.5 -9.5t9.5 -22.5q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-66 0 -113 -47t-47 -113v-704 q0 -66 47 -113t113 -47h288h11h13t11.5 -1t11.5 -3t8 -5.5t7 -9t2 -13.5zM1568 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45z" />
-<glyph unicode="&#xf08c;" d="M237 122h231v694h-231v-694zM483 1030q-1 52 -36 86t-93 34t-94.5 -34t-36.5 -86q0 -51 35.5 -85.5t92.5 -34.5h1q59 0 95 34.5t36 85.5zM1068 122h231v398q0 154 -73 233t-193 79q-136 0 -209 -117h2v101h-231q3 -66 0 -694h231v388q0 38 7 56q15 35 45 59.5t74 24.5 q116 0 116 -157v-371zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf08d;" horiz-adv-x="1152" d="M480 672v448q0 14 -9 23t-23 9t-23 -9t-9 -23v-448q0 -14 9 -23t23 -9t23 9t9 23zM1152 320q0 -26 -19 -45t-45 -19h-429l-51 -483q-2 -12 -10.5 -20.5t-20.5 -8.5h-1q-27 0 -32 27l-76 485h-404q-26 0 -45 19t-19 45q0 123 78.5 221.5t177.5 98.5v512q-52 0 -90 38 t-38 90t38 90t90 38h640q52 0 90 -38t38 -90t-38 -90t-90 -38v-512q99 0 177.5 -98.5t78.5 -221.5z" />
-<glyph unicode="&#xf08e;" horiz-adv-x="1792" d="M1408 608v-320q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v320 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1792 1472v-512q0 -26 -19 -45t-45 -19t-45 19l-176 176l-652 -652q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l652 652l-176 176q-19 19 -19 45t19 45t45 19h512q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf090;" d="M1184 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45zM1536 992v-704q0 -119 -84.5 -203.5t-203.5 -84.5h-320q-13 0 -22.5 9.5t-9.5 22.5 q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q66 0 113 47t47 113v704q0 66 -47 113t-113 47h-288h-11h-13t-11.5 1t-11.5 3t-8 5.5t-7 9t-2 13.5q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf091;" horiz-adv-x="1664" d="M458 653q-74 162 -74 371h-256v-96q0 -78 94.5 -162t235.5 -113zM1536 928v96h-256q0 -209 -74 -371q141 29 235.5 113t94.5 162zM1664 1056v-128q0 -71 -41.5 -143t-112 -130t-173 -97.5t-215.5 -44.5q-42 -54 -95 -95q-38 -34 -52.5 -72.5t-14.5 -89.5q0 -54 30.5 -91 t97.5 -37q75 0 133.5 -45.5t58.5 -114.5v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 69 58.5 114.5t133.5 45.5q67 0 97.5 37t30.5 91q0 51 -14.5 89.5t-52.5 72.5q-53 41 -95 95q-113 5 -215.5 44.5t-173 97.5t-112 130t-41.5 143v128q0 40 28 68t68 28h288v96 q0 66 47 113t113 47h576q66 0 113 -47t47 -113v-96h288q40 0 68 -28t28 -68z" />
-<glyph unicode="&#xf092;" d="M394 184q-8 -9 -20 3q-13 11 -4 19q8 9 20 -3q12 -11 4 -19zM352 245q9 -12 0 -19q-8 -6 -17 7t0 18q9 7 17 -6zM291 305q-5 -7 -13 -2q-10 5 -7 12q3 5 13 2q10 -5 7 -12zM322 271q-6 -7 -16 3q-9 11 -2 16q6 6 16 -3q9 -11 2 -16zM451 159q-4 -12 -19 -6q-17 4 -13 15 t19 7q16 -5 13 -16zM514 154q0 -11 -16 -11q-17 -2 -17 11q0 11 16 11q17 2 17 -11zM572 164q2 -10 -14 -14t-18 8t14 15q16 2 18 -9zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-224q-16 0 -24.5 1t-19.5 5t-16 14.5t-5 27.5v239q0 97 -52 142q57 6 102.5 18t94 39 t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103 q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -103t0.5 -68q0 -22 -11 -33.5t-22 -13t-33 -1.5 h-224q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf093;" horiz-adv-x="1664" d="M1280 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 288v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h427q21 -56 70.5 -92 t110.5 -36h256q61 0 110.5 36t70.5 92h427q40 0 68 -28t28 -68zM1339 936q-17 -40 -59 -40h-256v-448q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v448h-256q-42 0 -59 40q-17 39 14 69l448 448q18 19 45 19t45 -19l448 -448q31 -30 14 -69z" />
-<glyph unicode="&#xf094;" d="M1407 710q0 44 -7 113.5t-18 96.5q-12 30 -17 44t-9 36.5t-4 48.5q0 23 5 68.5t5 67.5q0 37 -10 55q-4 1 -13 1q-19 0 -58 -4.5t-59 -4.5q-60 0 -176 24t-175 24q-43 0 -94.5 -11.5t-85 -23.5t-89.5 -34q-137 -54 -202 -103q-96 -73 -159.5 -189.5t-88 -236t-24.5 -248.5 q0 -40 12.5 -120t12.5 -121q0 -23 -11 -66.5t-11 -65.5t12 -36.5t34 -14.5q24 0 72.5 11t73.5 11q57 0 169.5 -15.5t169.5 -15.5q181 0 284 36q129 45 235.5 152.5t166 245.5t59.5 275zM1535 712q0 -165 -70 -327.5t-196 -288t-281 -180.5q-124 -44 -326 -44 q-57 0 -170 14.5t-169 14.5q-24 0 -72.5 -14.5t-73.5 -14.5q-73 0 -123.5 55.5t-50.5 128.5q0 24 11 68t11 67q0 40 -12.5 120.5t-12.5 121.5q0 111 18 217.5t54.5 209.5t100.5 194t150 156q78 59 232 120q194 78 316 78q60 0 175.5 -24t173.5 -24q19 0 57 5t58 5 q81 0 118 -50.5t37 -134.5q0 -23 -5 -68t-5 -68q0 -10 1 -18.5t3 -17t4 -13.5t6.5 -16t6.5 -17q16 -40 25 -118.5t9 -136.5z" />
-<glyph unicode="&#xf095;" horiz-adv-x="1408" d="M1408 296q0 -27 -10 -70.5t-21 -68.5q-21 -50 -122 -106q-94 -51 -186 -51q-27 0 -52.5 3.5t-57.5 12.5t-47.5 14.5t-55.5 20.5t-49 18q-98 35 -175 83q-128 79 -264.5 215.5t-215.5 264.5q-48 77 -83 175q-3 9 -18 49t-20.5 55.5t-14.5 47.5t-12.5 57.5t-3.5 52.5 q0 92 51 186q56 101 106 122q25 11 68.5 21t70.5 10q14 0 21 -3q18 -6 53 -76q11 -19 30 -54t35 -63.5t31 -53.5q3 -4 17.5 -25t21.5 -35.5t7 -28.5q0 -20 -28.5 -50t-62 -55t-62 -53t-28.5 -46q0 -9 5 -22.5t8.5 -20.5t14 -24t11.5 -19q76 -137 174 -235t235 -174 q2 -1 19 -11.5t24 -14t20.5 -8.5t22.5 -5q18 0 46 28.5t53 62t55 62t50 28.5q14 0 28.5 -7t35.5 -21.5t25 -17.5q25 -15 53.5 -31t63.5 -35t54 -30q70 -35 76 -53q3 -7 3 -21z" />
-<glyph unicode="&#xf096;" horiz-adv-x="1408" d="M1120 1280h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf097;" horiz-adv-x="1280" d="M1152 1280h-1024v-1242l423 406l89 85l89 -85l423 -406v1242zM1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289 q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
-<glyph unicode="&#xf098;" d="M1280 343q0 11 -2 16q-3 8 -38.5 29.5t-88.5 49.5l-53 29q-5 3 -19 13t-25 15t-21 5q-18 0 -47 -32.5t-57 -65.5t-44 -33q-7 0 -16.5 3.5t-15.5 6.5t-17 9.5t-14 8.5q-99 55 -170.5 126.5t-126.5 170.5q-2 3 -8.5 14t-9.5 17t-6.5 15.5t-3.5 16.5q0 13 20.5 33.5t45 38.5 t45 39.5t20.5 36.5q0 10 -5 21t-15 25t-13 19q-3 6 -15 28.5t-25 45.5t-26.5 47.5t-25 40.5t-16.5 18t-16 2q-48 0 -101 -22q-46 -21 -80 -94.5t-34 -130.5q0 -16 2.5 -34t5 -30.5t9 -33t10 -29.5t12.5 -33t11 -30q60 -164 216.5 -320.5t320.5 -216.5q6 -2 30 -11t33 -12.5 t29.5 -10t33 -9t30.5 -5t34 -2.5q57 0 130.5 34t94.5 80q22 53 22 101zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf099;" horiz-adv-x="1664" d="M1620 1128q-67 -98 -162 -167q1 -14 1 -42q0 -130 -38 -259.5t-115.5 -248.5t-184.5 -210.5t-258 -146t-323 -54.5q-271 0 -496 145q35 -4 78 -4q225 0 401 138q-105 2 -188 64.5t-114 159.5q33 -5 61 -5q43 0 85 11q-112 23 -185.5 111.5t-73.5 205.5v4q68 -38 146 -41 q-66 44 -105 115t-39 154q0 88 44 163q121 -149 294.5 -238.5t371.5 -99.5q-8 38 -8 74q0 134 94.5 228.5t228.5 94.5q140 0 236 -102q109 21 205 78q-37 -115 -142 -178q93 10 186 50z" />
-<glyph unicode="&#xf09a;" horiz-adv-x="768" d="M511 980h257l-30 -284h-227v-824h-341v824h-170v284h170v171q0 182 86 275.5t283 93.5h227v-284h-142q-39 0 -62.5 -6.5t-34 -23.5t-13.5 -34.5t-3 -49.5v-142z" />
-<glyph unicode="&#xf09b;" d="M1536 640q0 -251 -146.5 -451.5t-378.5 -277.5q-27 -5 -39.5 7t-12.5 30v211q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5 q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23 q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -89t0.5 -54q0 -18 -13 -30t-40 -7q-232 77 -378.5 277.5t-146.5 451.5q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf09c;" horiz-adv-x="1664" d="M1664 960v-256q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-192h96q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h672v192q0 185 131.5 316.5t316.5 131.5 t316.5 -131.5t131.5 -316.5z" />
-<glyph unicode="&#xf09d;" horiz-adv-x="1920" d="M1760 1408q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600zM160 1280q-13 0 -22.5 -9.5t-9.5 -22.5v-224h1664v224q0 13 -9.5 22.5t-22.5 9.5h-1600zM1760 0q13 0 22.5 9.5t9.5 22.5v608h-1664v-608 q0 -13 9.5 -22.5t22.5 -9.5h1600zM256 128v128h256v-128h-256zM640 128v128h384v-128h-384z" />
-<glyph unicode="&#xf09e;" horiz-adv-x="1408" d="M384 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 69q2 -28 -17 -48q-18 -21 -47 -21h-135q-25 0 -43 16.5t-20 41.5q-22 229 -184.5 391.5t-391.5 184.5q-25 2 -41.5 20t-16.5 43v135q0 29 21 47q17 17 43 17h5q160 -13 306 -80.5 t259 -181.5q114 -113 181.5 -259t80.5 -306zM1408 67q2 -27 -18 -47q-18 -20 -46 -20h-143q-26 0 -44.5 17.5t-19.5 42.5q-12 215 -101 408.5t-231.5 336t-336 231.5t-408.5 102q-25 1 -42.5 19.5t-17.5 43.5v143q0 28 20 46q18 18 44 18h3q262 -13 501.5 -120t425.5 -294 q187 -186 294 -425.5t120 -501.5z" />
-<glyph unicode="&#xf0a0;" d="M1040 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1296 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1408 160v320q0 13 -9.5 22.5t-22.5 9.5 h-1216q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5zM178 640h1180l-157 482q-4 13 -16 21.5t-26 8.5h-782q-14 0 -26 -8.5t-16 -21.5zM1536 480v-320q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v320q0 25 16 75 l197 606q17 53 63 86t101 33h782q55 0 101 -33t63 -86l197 -606q16 -50 16 -75z" />
-<glyph unicode="&#xf0a1;" horiz-adv-x="1792" d="M1664 896q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-384q0 -52 -38 -90t-90 -38q-417 347 -812 380q-58 -19 -91 -66t-31 -100.5t40 -92.5q-20 -33 -23 -65.5t6 -58t33.5 -55t48 -50t61.5 -50.5q-29 -58 -111.5 -83t-168.5 -11.5t-132 55.5q-7 23 -29.5 87.5 t-32 94.5t-23 89t-15 101t3.5 98.5t22 110.5h-122q-66 0 -113 47t-47 113v192q0 66 47 113t113 47h480q435 0 896 384q52 0 90 -38t38 -90v-384zM1536 292v954q-394 -302 -768 -343v-270q377 -42 768 -341z" />
-<glyph unicode="&#xf0a2;" horiz-adv-x="1664" d="M848 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM183 128h1298q-164 181 -246.5 411.5t-82.5 484.5q0 256 -320 256t-320 -256q0 -254 -82.5 -484.5t-246.5 -411.5zM1664 128q0 -52 -38 -90t-90 -38 h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q190 161 287 397.5t97 498.5q0 165 96 262t264 117q-8 18 -8 37q0 40 28 68t68 28t68 -28t28 -68q0 -19 -8 -37q168 -20 264 -117t96 -262q0 -262 97 -498.5t287 -397.5z" />
-<glyph unicode="&#xf0a3;" d="M1376 640l138 -135q30 -28 20 -70q-12 -41 -52 -51l-188 -48l53 -186q12 -41 -19 -70q-29 -31 -70 -19l-186 53l-48 -188q-10 -40 -51 -52q-12 -2 -19 -2q-31 0 -51 22l-135 138l-135 -138q-28 -30 -70 -20q-41 11 -51 52l-48 188l-186 -53q-41 -12 -70 19q-31 29 -19 70 l53 186l-188 48q-40 10 -52 51q-10 42 20 70l138 135l-138 135q-30 28 -20 70q12 41 52 51l188 48l-53 186q-12 41 19 70q29 31 70 19l186 -53l48 188q10 41 51 51q41 12 70 -19l135 -139l135 139q29 30 70 19q41 -10 51 -51l48 -188l186 53q41 12 70 -19q31 -29 19 -70 l-53 -186l188 -48q40 -10 52 -51q10 -42 -20 -70z" />
-<glyph unicode="&#xf0a4;" horiz-adv-x="1792" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 768q0 51 -39 89.5t-89 38.5h-576q0 20 15 48.5t33 55t33 68t15 84.5q0 67 -44.5 97.5t-115.5 30.5q-24 0 -90 -139q-24 -44 -37 -65q-40 -64 -112 -145q-71 -81 -101 -106 q-69 -57 -140 -57h-32v-640h32q72 0 167 -32t193.5 -64t179.5 -32q189 0 189 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5h331q52 0 90 38t38 90zM1792 769q0 -105 -75.5 -181t-180.5 -76h-169q-4 -62 -37 -119q3 -21 3 -43 q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5q-133 0 -322 69q-164 59 -223 59h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h288q10 0 21.5 4.5t23.5 14t22.5 18t24 22.5t20.5 21.5t19 21.5t14 17q65 74 100 129q13 21 33 62t37 72t40.5 63t55 49.5 t69.5 17.5q125 0 206.5 -67t81.5 -189q0 -68 -22 -128h374q104 0 180 -76t76 -179z" />
-<glyph unicode="&#xf0a5;" horiz-adv-x="1792" d="M1376 128h32v640h-32q-35 0 -67.5 12t-62.5 37t-50 46t-49 54q-2 3 -3.5 4.5t-4 4.5t-4.5 5q-72 81 -112 145q-14 22 -38 68q-1 3 -10.5 22.5t-18.5 36t-20 35.5t-21.5 30.5t-18.5 11.5q-71 0 -115.5 -30.5t-44.5 -97.5q0 -43 15 -84.5t33 -68t33 -55t15 -48.5h-576 q-50 0 -89 -38.5t-39 -89.5q0 -52 38 -90t90 -38h331q-15 -17 -25 -47.5t-10 -55.5q0 -69 53 -119q-18 -32 -18 -69t17.5 -73.5t47.5 -52.5q-4 -24 -4 -56q0 -85 48.5 -126t135.5 -41q84 0 183 32t194 64t167 32zM1664 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45 t45 -19t45 19t19 45zM1792 768v-640q0 -53 -37.5 -90.5t-90.5 -37.5h-288q-59 0 -223 -59q-190 -69 -317 -69q-142 0 -230 77.5t-87 217.5l1 5q-61 76 -61 178q0 22 3 43q-33 57 -37 119h-169q-105 0 -180.5 76t-75.5 181q0 103 76 179t180 76h374q-22 60 -22 128 q0 122 81.5 189t206.5 67q38 0 69.5 -17.5t55 -49.5t40.5 -63t37 -72t33 -62q35 -55 100 -129q2 -3 14 -17t19 -21.5t20.5 -21.5t24 -22.5t22.5 -18t23.5 -14t21.5 -4.5h288q53 0 90.5 -37.5t37.5 -90.5z" />
-<glyph unicode="&#xf0a6;" d="M1280 -64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 700q0 189 -167 189q-26 0 -56 -5q-16 30 -52.5 47.5t-73.5 17.5t-69 -18q-50 53 -119 53q-25 0 -55.5 -10t-47.5 -25v331q0 52 -38 90t-90 38q-51 0 -89.5 -39t-38.5 -89v-576 q-20 0 -48.5 15t-55 33t-68 33t-84.5 15q-67 0 -97.5 -44.5t-30.5 -115.5q0 -24 139 -90q44 -24 65 -37q64 -40 145 -112q81 -71 106 -101q57 -69 57 -140v-32h640v32q0 72 32 167t64 193.5t32 179.5zM1536 705q0 -133 -69 -322q-59 -164 -59 -223v-288q0 -53 -37.5 -90.5 t-90.5 -37.5h-640q-53 0 -90.5 37.5t-37.5 90.5v288q0 10 -4.5 21.5t-14 23.5t-18 22.5t-22.5 24t-21.5 20.5t-21.5 19t-17 14q-74 65 -129 100q-21 13 -62 33t-72 37t-63 40.5t-49.5 55t-17.5 69.5q0 125 67 206.5t189 81.5q68 0 128 -22v374q0 104 76 180t179 76 q105 0 181 -75.5t76 -180.5v-169q62 -4 119 -37q21 3 43 3q101 0 178 -60q139 1 219.5 -85t80.5 -227z" />
-<glyph unicode="&#xf0a7;" d="M1408 576q0 84 -32 183t-64 194t-32 167v32h-640v-32q0 -35 -12 -67.5t-37 -62.5t-46 -50t-54 -49q-9 -8 -14 -12q-81 -72 -145 -112q-22 -14 -68 -38q-3 -1 -22.5 -10.5t-36 -18.5t-35.5 -20t-30.5 -21.5t-11.5 -18.5q0 -71 30.5 -115.5t97.5 -44.5q43 0 84.5 15t68 33 t55 33t48.5 15v-576q0 -50 38.5 -89t89.5 -39q52 0 90 38t38 90v331q46 -35 103 -35q69 0 119 53q32 -18 69 -18t73.5 17.5t52.5 47.5q24 -4 56 -4q85 0 126 48.5t41 135.5zM1280 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 580 q0 -142 -77.5 -230t-217.5 -87l-5 1q-76 -61 -178 -61q-22 0 -43 3q-54 -30 -119 -37v-169q0 -105 -76 -180.5t-181 -75.5q-103 0 -179 76t-76 180v374q-54 -22 -128 -22q-121 0 -188.5 81.5t-67.5 206.5q0 38 17.5 69.5t49.5 55t63 40.5t72 37t62 33q55 35 129 100 q3 2 17 14t21.5 19t21.5 20.5t22.5 24t18 22.5t14 23.5t4.5 21.5v288q0 53 37.5 90.5t90.5 37.5h640q53 0 90.5 -37.5t37.5 -90.5v-288q0 -59 59 -223q69 -190 69 -317z" />
-<glyph unicode="&#xf0a8;" d="M1280 576v128q0 26 -19 45t-45 19h-502l189 189q19 19 19 45t-19 45l-91 91q-18 18 -45 18t-45 -18l-362 -362l-91 -91q-18 -18 -18 -45t18 -45l91 -91l362 -362q18 -18 45 -18t45 18l91 91q18 18 18 45t-18 45l-189 189h502q26 0 45 19t19 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf0a9;" d="M1285 640q0 27 -18 45l-91 91l-362 362q-18 18 -45 18t-45 -18l-91 -91q-18 -18 -18 -45t18 -45l189 -189h-502q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h502l-189 -189q-19 -19 -19 -45t19 -45l91 -91q18 -18 45 -18t45 18l362 362l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf0aa;" d="M1284 641q0 27 -18 45l-362 362l-91 91q-18 18 -45 18t-45 -18l-91 -91l-362 -362q-18 -18 -18 -45t18 -45l91 -91q18 -18 45 -18t45 18l189 189v-502q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v502l189 -189q19 -19 45 -19t45 19l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf0ab;" d="M1284 639q0 27 -18 45l-91 91q-18 18 -45 18t-45 -18l-189 -189v502q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-502l-189 189q-19 19 -45 19t-45 -19l-91 -91q-18 -18 -18 -45t18 -45l362 -362l91 -91q18 -18 45 -18t45 18l91 91l362 362q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf0ac;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1042 887q-2 -1 -9.5 -9.5t-13.5 -9.5q2 0 4.5 5t5 11t3.5 7q6 7 22 15q14 6 52 12q34 8 51 -11 q-2 2 9.5 13t14.5 12q3 2 15 4.5t15 7.5l2 22q-12 -1 -17.5 7t-6.5 21q0 -2 -6 -8q0 7 -4.5 8t-11.5 -1t-9 -1q-10 3 -15 7.5t-8 16.5t-4 15q-2 5 -9.5 10.5t-9.5 10.5q-1 2 -2.5 5.5t-3 6.5t-4 5.5t-5.5 2.5t-7 -5t-7.5 -10t-4.5 -5q-3 2 -6 1.5t-4.5 -1t-4.5 -3t-5 -3.5 q-3 -2 -8.5 -3t-8.5 -2q15 5 -1 11q-10 4 -16 3q9 4 7.5 12t-8.5 14h5q-1 4 -8.5 8.5t-17.5 8.5t-13 6q-8 5 -34 9.5t-33 0.5q-5 -6 -4.5 -10.5t4 -14t3.5 -12.5q1 -6 -5.5 -13t-6.5 -12q0 -7 14 -15.5t10 -21.5q-3 -8 -16 -16t-16 -12q-5 -8 -1.5 -18.5t10.5 -16.5 q2 -2 1.5 -4t-3.5 -4.5t-5.5 -4t-6.5 -3.5l-3 -2q-11 -5 -20.5 6t-13.5 26q-7 25 -16 30q-23 8 -29 -1q-5 13 -41 26q-25 9 -58 4q6 1 0 15q-7 15 -19 12q3 6 4 17.5t1 13.5q3 13 12 23q1 1 7 8.5t9.5 13.5t0.5 6q35 -4 50 11q5 5 11.5 17t10.5 17q9 6 14 5.5t14.5 -5.5 t14.5 -5q14 -1 15.5 11t-7.5 20q12 -1 3 17q-5 7 -8 9q-12 4 -27 -5q-8 -4 2 -8q-1 1 -9.5 -10.5t-16.5 -17.5t-16 5q-1 1 -5.5 13.5t-9.5 13.5q-8 0 -16 -15q3 8 -11 15t-24 8q19 12 -8 27q-7 4 -20.5 5t-19.5 -4q-5 -7 -5.5 -11.5t5 -8t10.5 -5.5t11.5 -4t8.5 -3 q14 -10 8 -14q-2 -1 -8.5 -3.5t-11.5 -4.5t-6 -4q-3 -4 0 -14t-2 -14q-5 5 -9 17.5t-7 16.5q7 -9 -25 -6l-10 1q-4 0 -16 -2t-20.5 -1t-13.5 8q-4 8 0 20q1 4 4 2q-4 3 -11 9.5t-10 8.5q-46 -15 -94 -41q6 -1 12 1q5 2 13 6.5t10 5.5q34 14 42 7l5 5q14 -16 20 -25 q-7 4 -30 1q-20 -6 -22 -12q7 -12 5 -18q-4 3 -11.5 10t-14.5 11t-15 5q-16 0 -22 -1q-146 -80 -235 -222q7 -7 12 -8q4 -1 5 -9t2.5 -11t11.5 3q9 -8 3 -19q1 1 44 -27q19 -17 21 -21q3 -11 -10 -18q-1 2 -9 9t-9 4q-3 -5 0.5 -18.5t10.5 -12.5q-7 0 -9.5 -16t-2.5 -35.5 t-1 -23.5l2 -1q-3 -12 5.5 -34.5t21.5 -19.5q-13 -3 20 -43q6 -8 8 -9q3 -2 12 -7.5t15 -10t10 -10.5q4 -5 10 -22.5t14 -23.5q-2 -6 9.5 -20t10.5 -23q-1 0 -2.5 -1t-2.5 -1q3 -7 15.5 -14t15.5 -13q1 -3 2 -10t3 -11t8 -2q2 20 -24 62q-15 25 -17 29q-3 5 -5.5 15.5 t-4.5 14.5q2 0 6 -1.5t8.5 -3.5t7.5 -4t2 -3q-3 -7 2 -17.5t12 -18.5t17 -19t12 -13q6 -6 14 -19.5t0 -13.5q9 0 20 -10t17 -20q5 -8 8 -26t5 -24q2 -7 8.5 -13.5t12.5 -9.5l16 -8t13 -7q5 -2 18.5 -10.5t21.5 -11.5q10 -4 16 -4t14.5 2.5t13.5 3.5q15 2 29 -15t21 -21 q36 -19 55 -11q-2 -1 0.5 -7.5t8 -15.5t9 -14.5t5.5 -8.5q5 -6 18 -15t18 -15q6 4 7 9q-3 -8 7 -20t18 -10q14 3 14 32q-31 -15 -49 18q0 1 -2.5 5.5t-4 8.5t-2.5 8.5t0 7.5t5 3q9 0 10 3.5t-2 12.5t-4 13q-1 8 -11 20t-12 15q-5 -9 -16 -8t-16 9q0 -1 -1.5 -5.5t-1.5 -6.5 q-13 0 -15 1q1 3 2.5 17.5t3.5 22.5q1 4 5.5 12t7.5 14.5t4 12.5t-4.5 9.5t-17.5 2.5q-19 -1 -26 -20q-1 -3 -3 -10.5t-5 -11.5t-9 -7q-7 -3 -24 -2t-24 5q-13 8 -22.5 29t-9.5 37q0 10 2.5 26.5t3 25t-5.5 24.5q3 2 9 9.5t10 10.5q2 1 4.5 1.5t4.5 0t4 1.5t3 6q-1 1 -4 3 q-3 3 -4 3q7 -3 28.5 1.5t27.5 -1.5q15 -11 22 2q0 1 -2.5 9.5t-0.5 13.5q5 -27 29 -9q3 -3 15.5 -5t17.5 -5q3 -2 7 -5.5t5.5 -4.5t5 0.5t8.5 6.5q10 -14 12 -24q11 -40 19 -44q7 -3 11 -2t4.5 9.5t0 14t-1.5 12.5l-1 8v18l-1 8q-15 3 -18.5 12t1.5 18.5t15 18.5q1 1 8 3.5 t15.5 6.5t12.5 8q21 19 15 35q7 0 11 9q-1 0 -5 3t-7.5 5t-4.5 2q9 5 2 16q5 3 7.5 11t7.5 10q9 -12 21 -2q7 8 1 16q5 7 20.5 10.5t18.5 9.5q7 -2 8 2t1 12t3 12q4 5 15 9t13 5l17 11q3 4 0 4q18 -2 31 11q10 11 -6 20q3 6 -3 9.5t-15 5.5q3 1 11.5 0.5t10.5 1.5 q15 10 -7 16q-17 5 -43 -12zM879 10q206 36 351 189q-3 3 -12.5 4.5t-12.5 3.5q-18 7 -24 8q1 7 -2.5 13t-8 9t-12.5 8t-11 7q-2 2 -7 6t-7 5.5t-7.5 4.5t-8.5 2t-10 -1l-3 -1q-3 -1 -5.5 -2.5t-5.5 -3t-4 -3t0 -2.5q-21 17 -36 22q-5 1 -11 5.5t-10.5 7t-10 1.5t-11.5 -7 q-5 -5 -6 -15t-2 -13q-7 5 0 17.5t2 18.5q-3 6 -10.5 4.5t-12 -4.5t-11.5 -8.5t-9 -6.5t-8.5 -5.5t-8.5 -7.5q-3 -4 -6 -12t-5 -11q-2 4 -11.5 6.5t-9.5 5.5q2 -10 4 -35t5 -38q7 -31 -12 -48q-27 -25 -29 -40q-4 -22 12 -26q0 -7 -8 -20.5t-7 -21.5q0 -6 2 -16z" />
-<glyph unicode="&#xf0ad;" horiz-adv-x="1664" d="M384 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1028 484l-682 -682q-37 -37 -90 -37q-52 0 -91 37l-106 108q-38 36 -38 90q0 53 38 91l681 681q39 -98 114.5 -173.5t173.5 -114.5zM1662 919q0 -39 -23 -106q-47 -134 -164.5 -217.5 t-258.5 -83.5q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q58 0 121.5 -16.5t107.5 -46.5q16 -11 16 -28t-16 -28l-293 -169v-224l193 -107q5 3 79 48.5t135.5 81t70.5 35.5q15 0 23.5 -10t8.5 -25z" />
-<glyph unicode="&#xf0ae;" horiz-adv-x="1792" d="M1024 128h640v128h-640v-128zM640 640h1024v128h-1024v-128zM1280 1152h384v128h-384v-128zM1792 320v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 832v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19 t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf0b0;" horiz-adv-x="1408" d="M1403 1241q17 -41 -14 -70l-493 -493v-742q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-256 256q-19 19 -19 45v486l-493 493q-31 29 -14 70q17 39 59 39h1280q42 0 59 -39z" />
-<glyph unicode="&#xf0b1;" horiz-adv-x="1792" d="M640 1280h512v128h-512v-128zM1792 640v-480q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v480h672v-160q0 -26 19 -45t45 -19h320q26 0 45 19t19 45v160h672zM1024 640v-128h-256v128h256zM1792 1120v-384h-1792v384q0 66 47 113t113 47h352v160q0 40 28 68 t68 28h576q40 0 68 -28t28 -68v-160h352q66 0 113 -47t47 -113z" />
-<glyph unicode="&#xf0b2;" d="M1283 995l-355 -355l355 -355l144 144q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l144 144l-355 355l-355 -355l144 -144q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l144 -144 l355 355l-355 355l-144 -144q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v448q0 26 19 45t45 19h448q42 0 59 -40q17 -39 -14 -69l-144 -144l355 -355l355 355l-144 144q-31 30 -14 69q17 40 59 40h448q26 0 45 -19t19 -45v-448q0 -42 -39 -59q-13 -5 -25 -5q-26 0 -45 19z " />
-<glyph unicode="&#xf0c0;" horiz-adv-x="1920" d="M593 640q-162 -5 -265 -128h-134q-82 0 -138 40.5t-56 118.5q0 353 124 353q6 0 43.5 -21t97.5 -42.5t119 -21.5q67 0 133 23q-5 -37 -5 -66q0 -139 81 -256zM1664 3q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5 t43 97.5t62 81t85.5 53.5t111.5 20q10 0 43 -21.5t73 -48t107 -48t135 -21.5t135 21.5t107 48t73 48t43 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM640 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75 t75 -181zM1344 896q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5zM1920 671q0 -78 -56 -118.5t-138 -40.5h-134q-103 123 -265 128q81 117 81 256q0 29 -5 66q66 -23 133 -23q59 0 119 21.5t97.5 42.5 t43.5 21q124 0 124 -353zM1792 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181z" />
-<glyph unicode="&#xf0c1;" horiz-adv-x="1664" d="M1456 320q0 40 -28 68l-208 208q-28 28 -68 28q-42 0 -72 -32q3 -3 19 -18.5t21.5 -21.5t15 -19t13 -25.5t3.5 -27.5q0 -40 -28 -68t-68 -28q-15 0 -27.5 3.5t-25.5 13t-19 15t-21.5 21.5t-18.5 19q-33 -31 -33 -73q0 -40 28 -68l206 -207q27 -27 68 -27q40 0 68 26 l147 146q28 28 28 67zM753 1025q0 40 -28 68l-206 207q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l208 -208q27 -27 68 -27q42 0 72 31q-3 3 -19 18.5t-21.5 21.5t-15 19t-13 25.5t-3.5 27.5q0 40 28 68t68 28q15 0 27.5 -3.5t25.5 -13t19 -15 t21.5 -21.5t18.5 -19q33 31 33 73zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-206 207q-83 83 -83 203q0 123 88 209l-88 88q-86 -88 -208 -88q-120 0 -204 84l-208 208q-84 84 -84 204t85 203l147 146q83 83 203 83q121 0 204 -85l206 -207 q83 -83 83 -203q0 -123 -88 -209l88 -88q86 88 208 88q120 0 204 -84l208 -208q84 -84 84 -204z" />
-<glyph unicode="&#xf0c2;" horiz-adv-x="1920" d="M1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5q0 132 71 241.5t187 163.5q-2 28 -2 43q0 212 150 362t362 150q158 0 286.5 -88t187.5 -230q70 62 166 62q106 0 181 -75t75 -181q0 -75 -41 -138q129 -30 213 -134.5t84 -239.5z " />
-<glyph unicode="&#xf0c3;" horiz-adv-x="1664" d="M1527 88q56 -89 21.5 -152.5t-140.5 -63.5h-1152q-106 0 -140.5 63.5t21.5 152.5l503 793v399h-64q-26 0 -45 19t-19 45t19 45t45 19h512q26 0 45 -19t19 -45t-19 -45t-45 -19h-64v-399zM748 813l-272 -429h712l-272 429l-20 31v37v399h-128v-399v-37z" />
-<glyph unicode="&#xf0c4;" horiz-adv-x="1792" d="M960 640q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1260 576l507 -398q28 -20 25 -56q-5 -35 -35 -51l-128 -64q-13 -7 -29 -7q-17 0 -31 8l-690 387l-110 -66q-8 -4 -12 -5q14 -49 10 -97q-7 -77 -56 -147.5t-132 -123.5q-132 -84 -277 -84 q-136 0 -222 78q-90 84 -79 207q7 76 56 147t131 124q132 84 278 84q83 0 151 -31q9 13 22 22l122 73l-122 73q-13 9 -22 22q-68 -31 -151 -31q-146 0 -278 84q-82 53 -131 124t-56 147q-5 59 15.5 113t63.5 93q85 79 222 79q145 0 277 -84q83 -52 132 -123t56 -148 q4 -48 -10 -97q4 -1 12 -5l110 -66l690 387q14 8 31 8q16 0 29 -7l128 -64q30 -16 35 -51q3 -36 -25 -56zM579 836q46 42 21 108t-106 117q-92 59 -192 59q-74 0 -113 -36q-46 -42 -21 -108t106 -117q92 -59 192 -59q74 0 113 36zM494 91q81 51 106 117t-21 108 q-39 36 -113 36q-100 0 -192 -59q-81 -51 -106 -117t21 -108q39 -36 113 -36q100 0 192 59zM672 704l96 -58v11q0 36 33 56l14 8l-79 47l-26 -26q-3 -3 -10 -11t-12 -12q-2 -2 -4 -3.5t-3 -2.5zM896 480l96 -32l736 576l-128 64l-768 -431v-113l-160 -96l9 -8q2 -2 7 -6 q4 -4 11 -12t11 -12l26 -26zM1600 64l128 64l-520 408l-177 -138q-2 -3 -13 -7z" />
-<glyph unicode="&#xf0c5;" horiz-adv-x="1792" d="M1696 1152q40 0 68 -28t28 -68v-1216q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v288h-544q-40 0 -68 28t-28 68v672q0 40 20 88t48 76l408 408q28 28 76 48t88 20h416q40 0 68 -28t28 -68v-328q68 40 128 40h416zM1152 939l-299 -299h299v299zM512 1323l-299 -299 h299v299zM708 676l316 316v416h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h512v256q0 40 20 88t48 76zM1664 -128v1152h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h896z" />
-<glyph unicode="&#xf0c6;" horiz-adv-x="1408" d="M1404 151q0 -117 -79 -196t-196 -79q-135 0 -235 100l-777 776q-113 115 -113 271q0 159 110 270t269 111q158 0 273 -113l605 -606q10 -10 10 -22q0 -16 -30.5 -46.5t-46.5 -30.5q-13 0 -23 10l-606 607q-79 77 -181 77q-106 0 -179 -75t-73 -181q0 -105 76 -181 l776 -777q63 -63 145 -63q64 0 106 42t42 106q0 82 -63 145l-581 581q-26 24 -60 24q-29 0 -48 -19t-19 -48q0 -32 25 -59l410 -410q10 -10 10 -22q0 -16 -31 -47t-47 -31q-12 0 -22 10l-410 410q-63 61 -63 149q0 82 57 139t139 57q88 0 149 -63l581 -581q100 -98 100 -235 z" />
-<glyph unicode="&#xf0c7;" d="M384 0h768v384h-768v-384zM1280 0h128v896q0 14 -10 38.5t-20 34.5l-281 281q-10 10 -34 20t-39 10v-416q0 -40 -28 -68t-68 -28h-576q-40 0 -68 28t-28 68v416h-128v-1280h128v416q0 40 28 68t68 28h832q40 0 68 -28t28 -68v-416zM896 928v320q0 13 -9.5 22.5t-22.5 9.5 h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5zM1536 896v-928q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h928q40 0 88 -20t76 -48l280 -280q28 -28 48 -76t20 -88z" />
-<glyph unicode="&#xf0c8;" d="M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf0c9;" d="M1536 192v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 704v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 1216v-128q0 -26 -19 -45 t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf0ca;" horiz-adv-x="1792" d="M384 128q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 640q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1152q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z M1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
-<glyph unicode="&#xf0cb;" horiz-adv-x="1792" d="M381 -84q0 -80 -54.5 -126t-135.5 -46q-106 0 -172 66l57 88q49 -45 106 -45q29 0 50.5 14.5t21.5 42.5q0 64 -105 56l-26 56q8 10 32.5 43.5t42.5 54t37 38.5v1q-16 0 -48.5 -1t-48.5 -1v-53h-106v152h333v-88l-95 -115q51 -12 81 -49t30 -88zM383 543v-159h-362 q-6 36 -6 54q0 51 23.5 93t56.5 68t66 47.5t56.5 43.5t23.5 45q0 25 -14.5 38.5t-39.5 13.5q-46 0 -81 -58l-85 59q24 51 71.5 79.5t105.5 28.5q73 0 123 -41.5t50 -112.5q0 -50 -34 -91.5t-75 -64.5t-75.5 -50.5t-35.5 -52.5h127v60h105zM1792 224v-192q0 -13 -9.5 -22.5 t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1123v-99h-335v99h107q0 41 0.5 122t0.5 121v12h-2q-8 -17 -50 -54l-71 76l136 127h106v-404h108zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5 t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
-<glyph unicode="&#xf0cc;" horiz-adv-x="1792" d="M1760 640q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h1728zM483 704q-28 35 -51 80q-48 97 -48 188q0 181 134 309q133 127 393 127q50 0 167 -19q66 -12 177 -48q10 -38 21 -118q14 -123 14 -183q0 -18 -5 -45l-12 -3l-84 6 l-14 2q-50 149 -103 205q-88 91 -210 91q-114 0 -182 -59q-67 -58 -67 -146q0 -73 66 -140t279 -129q69 -20 173 -66q58 -28 95 -52h-743zM990 448h411q7 -39 7 -92q0 -111 -41 -212q-23 -55 -71 -104q-37 -35 -109 -81q-80 -48 -153 -66q-80 -21 -203 -21q-114 0 -195 23 l-140 40q-57 16 -72 28q-8 8 -8 22v13q0 108 -2 156q-1 30 0 68l2 37v44l102 2q15 -34 30 -71t22.5 -56t12.5 -27q35 -57 80 -94q43 -36 105 -57q59 -22 132 -22q64 0 139 27q77 26 122 86q47 61 47 129q0 84 -81 157q-34 29 -137 71z" />
-<glyph unicode="&#xf0cd;" d="M48 1313q-37 2 -45 4l-3 88q13 1 40 1q60 0 112 -4q132 -7 166 -7q86 0 168 3q116 4 146 5q56 0 86 2l-1 -14l2 -64v-9q-60 -9 -124 -9q-60 0 -79 -25q-13 -14 -13 -132q0 -13 0.5 -32.5t0.5 -25.5l1 -229l14 -280q6 -124 51 -202q35 -59 96 -92q88 -47 177 -47 q104 0 191 28q56 18 99 51q48 36 65 64q36 56 53 114q21 73 21 229q0 79 -3.5 128t-11 122.5t-13.5 159.5l-4 59q-5 67 -24 88q-34 35 -77 34l-100 -2l-14 3l2 86h84l205 -10q76 -3 196 10l18 -2q6 -38 6 -51q0 -7 -4 -31q-45 -12 -84 -13q-73 -11 -79 -17q-15 -15 -15 -41 q0 -7 1.5 -27t1.5 -31q8 -19 22 -396q6 -195 -15 -304q-15 -76 -41 -122q-38 -65 -112 -123q-75 -57 -182 -89q-109 -33 -255 -33q-167 0 -284 46q-119 47 -179 122q-61 76 -83 195q-16 80 -16 237v333q0 188 -17 213q-25 36 -147 39zM1536 -96v64q0 14 -9 23t-23 9h-1472 q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h1472q14 0 23 9t9 23z" />
-<glyph unicode="&#xf0ce;" horiz-adv-x="1664" d="M512 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23 v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 160v192 q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192 q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1664 1248v-1088q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1344q66 0 113 -47t47 -113 z" />
-<glyph unicode="&#xf0d0;" horiz-adv-x="1664" d="M1190 955l293 293l-107 107l-293 -293zM1637 1248q0 -27 -18 -45l-1286 -1286q-18 -18 -45 -18t-45 18l-198 198q-18 18 -18 45t18 45l1286 1286q18 18 45 18t45 -18l198 -198q18 -18 18 -45zM286 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM636 1276 l196 -60l-196 -60l-60 -196l-60 196l-196 60l196 60l60 196zM1566 798l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM926 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98z" />
-<glyph unicode="&#xf0d1;" horiz-adv-x="1792" d="M640 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM256 640h384v256h-158q-13 0 -22 -9l-195 -195q-9 -9 -9 -22v-30zM1536 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM1792 1216v-1024q0 -15 -4 -26.5t-13.5 -18.5 t-16.5 -11.5t-23.5 -6t-22.5 -2t-25.5 0t-22.5 0.5q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-64q-3 0 -22.5 -0.5t-25.5 0t-22.5 2t-23.5 6t-16.5 11.5t-13.5 18.5t-4 26.5q0 26 19 45t45 19v320q0 8 -0.5 35t0 38 t2.5 34.5t6.5 37t14 30.5t22.5 30l198 198q19 19 50.5 32t58.5 13h160v192q0 26 19 45t45 19h1024q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf0d2;" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103q-111 0 -218 32q59 93 78 164q9 34 54 211q20 -39 73 -67.5t114 -28.5q121 0 216 68.5t147 188.5t52 270q0 114 -59.5 214t-172.5 163t-255 63q-105 0 -196 -29t-154.5 -77t-109 -110.5t-67 -129.5t-21.5 -134 q0 -104 40 -183t117 -111q30 -12 38 20q2 7 8 31t8 30q6 23 -11 43q-51 61 -51 151q0 151 104.5 259.5t273.5 108.5q151 0 235.5 -82t84.5 -213q0 -170 -68.5 -289t-175.5 -119q-61 0 -98 43.5t-23 104.5q8 35 26.5 93.5t30 103t11.5 75.5q0 50 -27 83t-77 33 q-62 0 -105 -57t-43 -142q0 -73 25 -122l-99 -418q-17 -70 -13 -177q-206 91 -333 281t-127 423q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf0d3;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-725q85 122 108 210q9 34 53 209q21 -39 73.5 -67t112.5 -28q181 0 295.5 147.5t114.5 373.5q0 84 -35 162.5t-96.5 139t-152.5 97t-197 36.5q-104 0 -194.5 -28.5t-153 -76.5 t-107.5 -109.5t-66.5 -128t-21.5 -132.5q0 -102 39.5 -180t116.5 -110q13 -5 23.5 0t14.5 19q10 44 15 61q6 23 -11 42q-50 62 -50 150q0 150 103.5 256.5t270.5 106.5q149 0 232.5 -81t83.5 -210q0 -168 -67.5 -286t-173.5 -118q-60 0 -97 43.5t-23 103.5q8 34 26.5 92.5 t29.5 102t11 74.5q0 49 -26.5 81.5t-75.5 32.5q-61 0 -103.5 -56.5t-42.5 -139.5q0 -72 24 -121l-98 -414q-24 -100 -7 -254h-183q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960z" />
-<glyph unicode="&#xf0d4;" d="M678 -57q0 -38 -10 -71h-380q-95 0 -171.5 56.5t-103.5 147.5q24 45 69 77.5t100 49.5t107 24t107 7q32 0 49 -2q6 -4 30.5 -21t33 -23t31 -23t32 -25.5t27.5 -25.5t26.5 -29.5t21 -30.5t17.5 -34.5t9.5 -36t4.5 -40.5zM385 294q-234 -7 -385 -85v433q103 -118 273 -118 q32 0 70 5q-21 -61 -21 -86q0 -67 63 -149zM558 805q0 -100 -43.5 -160.5t-140.5 -60.5q-51 0 -97 26t-78 67.5t-56 93.5t-35.5 104t-11.5 99q0 96 51.5 165t144.5 69q66 0 119 -41t84 -104t47 -130t16 -128zM1536 896v-736q0 -119 -84.5 -203.5t-203.5 -84.5h-468 q39 73 39 157q0 66 -22 122.5t-55.5 93t-72 71t-72 59.5t-55.5 54.5t-22 59.5q0 36 23 68t56 61.5t65.5 64.5t55.5 93t23 131t-26.5 145.5t-75.5 118.5q-6 6 -14 11t-12.5 7.5t-10 9.5t-10.5 17h135l135 64h-437q-138 0 -244.5 -38.5t-182.5 -133.5q0 126 81 213t207 87h960 q119 0 203.5 -84.5t84.5 -203.5v-96h-256v256h-128v-256h-256v-128h256v-256h128v256h256z" />
-<glyph unicode="&#xf0d5;" horiz-adv-x="1664" d="M876 71q0 21 -4.5 40.5t-9.5 36t-17.5 34.5t-21 30.5t-26.5 29.5t-27.5 25.5t-32 25.5t-31 23t-33 23t-30.5 21q-17 2 -50 2q-54 0 -106 -7t-108 -25t-98 -46t-69 -75t-27 -107q0 -68 35.5 -121.5t93 -84t120.5 -45.5t127 -15q59 0 112.5 12.5t100.5 39t74.5 73.5 t27.5 110zM756 933q0 60 -16.5 127.5t-47 130.5t-84 104t-119.5 41q-93 0 -144 -69t-51 -165q0 -47 11.5 -99t35.5 -104t56 -93.5t78 -67.5t97 -26q97 0 140.5 60.5t43.5 160.5zM625 1408h437l-135 -79h-135q71 -45 110 -126t39 -169q0 -74 -23 -131.5t-56 -92.5t-66 -64.5 t-56 -61t-23 -67.5q0 -26 16.5 -51t43 -48t58.5 -48t64 -55.5t58.5 -66t43 -85t16.5 -106.5q0 -160 -140 -282q-152 -131 -420 -131q-59 0 -119.5 10t-122 33.5t-108.5 58t-77 89t-30 121.5q0 61 37 135q32 64 96 110.5t145 71t155 36t150 13.5q-64 83 -64 149q0 12 2 23.5 t5 19.5t8 21.5t7 21.5q-40 -5 -70 -5q-149 0 -255.5 98t-106.5 246q0 140 95 250.5t234 141.5q94 20 187 20zM1664 1152v-128h-256v-256h-128v256h-256v128h256v256h128v-256h256z" />
-<glyph unicode="&#xf0d6;" horiz-adv-x="1920" d="M768 384h384v96h-128v448h-114l-148 -137l77 -80q42 37 55 57h2v-288h-128v-96zM1280 640q0 -70 -21 -142t-59.5 -134t-101.5 -101t-138 -39t-138 39t-101.5 101t-59.5 134t-21 142t21 142t59.5 134t101.5 101t138 39t138 -39t101.5 -101t59.5 -134t21 -142zM1792 384 v512q-106 0 -181 75t-75 181h-1152q0 -106 -75 -181t-181 -75v-512q106 0 181 -75t75 -181h1152q0 106 75 181t181 75zM1920 1216v-1152q0 -26 -19 -45t-45 -19h-1792q-26 0 -45 19t-19 45v1152q0 26 19 45t45 19h1792q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf0d7;" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf0d8;" horiz-adv-x="1024" d="M1024 320q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
-<glyph unicode="&#xf0d9;" horiz-adv-x="640" d="M640 1088v-896q0 -26 -19 -45t-45 -19t-45 19l-448 448q-19 19 -19 45t19 45l448 448q19 19 45 19t45 -19t19 -45z" />
-<glyph unicode="&#xf0da;" horiz-adv-x="640" d="M576 640q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19t-19 45v896q0 26 19 45t45 19t45 -19l448 -448q19 -19 19 -45z" />
-<glyph unicode="&#xf0db;" horiz-adv-x="1664" d="M160 0h608v1152h-640v-1120q0 -13 9.5 -22.5t22.5 -9.5zM1536 32v1120h-640v-1152h608q13 0 22.5 9.5t9.5 22.5zM1664 1248v-1216q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1344q66 0 113 -47t47 -113z" />
-<glyph unicode="&#xf0dc;" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45zM1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
-<glyph unicode="&#xf0dd;" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf0de;" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
-<glyph unicode="&#xf0e0;" horiz-adv-x="1792" d="M1792 826v-794q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v794q44 -49 101 -87q362 -246 497 -345q57 -42 92.5 -65.5t94.5 -48t110 -24.5h1h1q51 0 110 24.5t94.5 48t92.5 65.5q170 123 498 345q57 39 100 87zM1792 1120q0 -79 -49 -151t-122 -123 q-376 -261 -468 -325q-10 -7 -42.5 -30.5t-54 -38t-52 -32.5t-57.5 -27t-50 -9h-1h-1q-23 0 -50 9t-57.5 27t-52 32.5t-54 38t-42.5 30.5q-91 64 -262 182.5t-205 142.5q-62 42 -117 115.5t-55 136.5q0 78 41.5 130t118.5 52h1472q65 0 112.5 -47t47.5 -113z" />
-<glyph unicode="&#xf0e1;" d="M349 911v-991h-330v991h330zM370 1217q1 -73 -50.5 -122t-135.5 -49h-2q-82 0 -132 49t-50 122q0 74 51.5 122.5t134.5 48.5t133 -48.5t51 -122.5zM1536 488v-568h-329v530q0 105 -40.5 164.5t-126.5 59.5q-63 0 -105.5 -34.5t-63.5 -85.5q-11 -30 -11 -81v-553h-329 q2 399 2 647t-1 296l-1 48h329v-144h-2q20 32 41 56t56.5 52t87 43.5t114.5 15.5q171 0 275 -113.5t104 -332.5z" />
-<glyph unicode="&#xf0e2;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5 t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298z" />
-<glyph unicode="&#xf0e3;" horiz-adv-x="1792" d="M1771 0q0 -53 -37 -90l-107 -108q-39 -37 -91 -37q-53 0 -90 37l-363 364q-38 36 -38 90q0 53 43 96l-256 256l-126 -126q-14 -14 -34 -14t-34 14q2 -2 12.5 -12t12.5 -13t10 -11.5t10 -13.5t6 -13.5t5.5 -16.5t1.5 -18q0 -38 -28 -68q-3 -3 -16.5 -18t-19 -20.5 t-18.5 -16.5t-22 -15.5t-22 -9t-26 -4.5q-40 0 -68 28l-408 408q-28 28 -28 68q0 13 4.5 26t9 22t15.5 22t16.5 18.5t20.5 19t18 16.5q30 28 68 28q10 0 18 -1.5t16.5 -5.5t13.5 -6t13.5 -10t11.5 -10t13 -12.5t12 -12.5q-14 14 -14 34t14 34l348 348q14 14 34 14t34 -14 q-2 2 -12.5 12t-12.5 13t-10 11.5t-10 13.5t-6 13.5t-5.5 16.5t-1.5 18q0 38 28 68q3 3 16.5 18t19 20.5t18.5 16.5t22 15.5t22 9t26 4.5q40 0 68 -28l408 -408q28 -28 28 -68q0 -13 -4.5 -26t-9 -22t-15.5 -22t-16.5 -18.5t-20.5 -19t-18 -16.5q-30 -28 -68 -28 q-10 0 -18 1.5t-16.5 5.5t-13.5 6t-13.5 10t-11.5 10t-13 12.5t-12 12.5q14 -14 14 -34t-14 -34l-126 -126l256 -256q43 43 96 43q52 0 91 -37l363 -363q37 -39 37 -91z" />
-<glyph unicode="&#xf0e4;" horiz-adv-x="1792" d="M384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM576 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1004 351l101 382q6 26 -7.5 48.5t-38.5 29.5 t-48 -6.5t-30 -39.5l-101 -382q-60 -5 -107 -43.5t-63 -98.5q-20 -77 20 -146t117 -89t146 20t89 117q16 60 -6 117t-72 91zM1664 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 1024q0 53 -37.5 90.5 t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1472 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 384q0 -261 -141 -483q-19 -29 -54 -29h-1402q-35 0 -54 29 q-141 221 -141 483q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
-<glyph unicode="&#xf0e5;" horiz-adv-x="1792" d="M896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640 q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 174 120 321.5 t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" />
-<glyph unicode="&#xf0e6;" horiz-adv-x="1792" d="M704 1152q-153 0 -286 -52t-211.5 -141t-78.5 -191q0 -82 53 -158t149 -132l97 -56l-35 -84q34 20 62 39l44 31l53 -10q78 -14 153 -14q153 0 286 52t211.5 141t78.5 191t-78.5 191t-211.5 141t-286 52zM704 1280q191 0 353.5 -68.5t256.5 -186.5t94 -257t-94 -257 t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224q0 139 94 257t256.5 186.5 t353.5 68.5zM1526 111q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129 q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230q0 -120 -71 -224.5t-195 -176.5z" />
-<glyph unicode="&#xf0e7;" horiz-adv-x="896" d="M885 970q18 -20 7 -44l-540 -1157q-13 -25 -42 -25q-4 0 -14 2q-17 5 -25.5 19t-4.5 30l197 808l-406 -101q-4 -1 -12 -1q-18 0 -31 11q-18 15 -13 39l201 825q4 14 16 23t28 9h328q19 0 32 -12.5t13 -29.5q0 -8 -5 -18l-171 -463l396 98q8 2 12 2q19 0 34 -15z" />
-<glyph unicode="&#xf0e8;" horiz-adv-x="1792" d="M1792 288v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192q0 52 38 90t90 38h512v192h-96q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-96v-192h512q52 0 90 -38t38 -90v-192h96q40 0 68 -28t28 -68 z" />
-<glyph unicode="&#xf0e9;" horiz-adv-x="1664" d="M896 708v-580q0 -104 -76 -180t-180 -76t-180 76t-76 180q0 26 19 45t45 19t45 -19t19 -45q0 -50 39 -89t89 -39t89 39t39 89v580q33 11 64 11t64 -11zM1664 681q0 -13 -9.5 -22.5t-22.5 -9.5q-11 0 -23 10q-49 46 -93 69t-102 23q-68 0 -128 -37t-103 -97 q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -28 -17q-18 0 -29 17q-4 6 -14.5 24t-17.5 28q-43 60 -102.5 97t-127.5 37t-127.5 -37t-102.5 -97q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -29 -17q-17 0 -28 17q-4 6 -14.5 24t-17.5 28q-43 60 -103 97t-128 37q-58 0 -102 -23t-93 -69 q-12 -10 -23 -10q-13 0 -22.5 9.5t-9.5 22.5q0 5 1 7q45 183 172.5 319.5t298 204.5t360.5 68q140 0 274.5 -40t246.5 -113.5t194.5 -187t115.5 -251.5q1 -2 1 -7zM896 1408v-98q-42 2 -64 2t-64 -2v98q0 26 19 45t45 19t45 -19t19 -45z" />
-<glyph unicode="&#xf0ea;" horiz-adv-x="1792" d="M768 -128h896v640h-416q-40 0 -68 28t-28 68v416h-384v-1152zM1024 1312v64q0 13 -9.5 22.5t-22.5 9.5h-704q-13 0 -22.5 -9.5t-9.5 -22.5v-64q0 -13 9.5 -22.5t22.5 -9.5h704q13 0 22.5 9.5t9.5 22.5zM1280 640h299l-299 299v-299zM1792 512v-672q0 -40 -28 -68t-68 -28 h-960q-40 0 -68 28t-28 68v160h-544q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1088q40 0 68 -28t28 -68v-328q21 -13 36 -28l408 -408q28 -28 48 -76t20 -88z" />
-<glyph unicode="&#xf0eb;" horiz-adv-x="1024" d="M736 960q0 -13 -9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5q0 46 -54 71t-106 25q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5q50 0 99.5 -16t87 -54t37.5 -90zM896 960q0 72 -34.5 134t-90 101.5t-123 62t-136.5 22.5t-136.5 -22.5t-123 -62t-90 -101.5t-34.5 -134 q0 -101 68 -180q10 -11 30.5 -33t30.5 -33q128 -153 141 -298h228q13 145 141 298q10 11 30.5 33t30.5 33q68 79 68 180zM1024 960q0 -155 -103 -268q-45 -49 -74.5 -87t-59.5 -95.5t-34 -107.5q47 -28 47 -82q0 -37 -25 -64q25 -27 25 -64q0 -52 -45 -81q13 -23 13 -47 q0 -46 -31.5 -71t-77.5 -25q-20 -44 -60 -70t-87 -26t-87 26t-60 70q-46 0 -77.5 25t-31.5 71q0 24 13 47q-45 29 -45 81q0 37 25 64q-25 27 -25 64q0 54 47 82q-4 50 -34 107.5t-59.5 95.5t-74.5 87q-103 113 -103 268q0 99 44.5 184.5t117 142t164 89t186.5 32.5 t186.5 -32.5t164 -89t117 -142t44.5 -184.5z" />
-<glyph unicode="&#xf0ec;" horiz-adv-x="1792" d="M1792 352v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5q-12 0 -24 10l-319 320q-9 9 -9 22q0 14 9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h1376q13 0 22.5 -9.5t9.5 -22.5zM1792 896q0 -14 -9 -23l-320 -320q-9 -9 -23 -9 q-13 0 -22.5 9.5t-9.5 22.5v192h-1376q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1376v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
-<glyph unicode="&#xf0ed;" horiz-adv-x="1920" d="M1280 608q0 14 -9 23t-23 9h-224v352q0 13 -9.5 22.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-352h-224q-13 0 -22.5 -9.5t-9.5 -22.5q0 -14 9 -23l352 -352q9 -9 23 -9t23 9l351 351q10 12 10 24zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
-<glyph unicode="&#xf0ee;" horiz-adv-x="1920" d="M1280 672q0 14 -9 23l-352 352q-9 9 -23 9t-23 -9l-351 -351q-10 -12 -10 -24q0 -14 9 -23t23 -9h224v-352q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5v352h224q13 0 22.5 9.5t9.5 22.5zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
-<glyph unicode="&#xf0f0;" horiz-adv-x="1408" d="M384 192q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 68 5.5 131t24 138t47.5 132.5t81 103t120 60.5q-22 -52 -22 -120v-203q-58 -20 -93 -70t-35 -111q0 -80 56 -136t136 -56 t136 56t56 136q0 61 -35.5 111t-92.5 70v203q0 62 25 93q132 -104 295 -104t295 104q25 -31 25 -93v-64q-106 0 -181 -75t-75 -181v-89q-32 -29 -32 -71q0 -40 28 -68t68 -28t68 28t28 68q0 42 -32 71v89q0 52 38 90t90 38t90 -38t38 -90v-89q-32 -29 -32 -71q0 -40 28 -68 t68 -28t68 28t28 68q0 42 -32 71v89q0 68 -34.5 127.5t-93.5 93.5q0 10 0.5 42.5t0 48t-2.5 41.5t-7 47t-13 40q68 -15 120 -60.5t81 -103t47.5 -132.5t24 -138t5.5 -131zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5 t271.5 -112.5t112.5 -271.5z" />
-<glyph unicode="&#xf0f1;" horiz-adv-x="1408" d="M1280 832q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 832q0 -62 -35.5 -111t-92.5 -70v-395q0 -159 -131.5 -271.5t-316.5 -112.5t-316.5 112.5t-131.5 271.5v132q-164 20 -274 128t-110 252v512q0 26 19 45t45 19q6 0 16 -2q17 30 47 48 t65 18q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5q-33 0 -64 18v-402q0 -106 94 -181t226 -75t226 75t94 181v402q-31 -18 -64 -18q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5q35 0 65 -18t47 -48q10 2 16 2q26 0 45 -19t19 -45v-512q0 -144 -110 -252 t-274 -128v-132q0 -106 94 -181t226 -75t226 75t94 181v395q-57 21 -92.5 70t-35.5 111q0 80 56 136t136 56t136 -56t56 -136z" />
-<glyph unicode="&#xf0f2;" horiz-adv-x="1792" d="M640 1152h512v128h-512v-128zM288 1152v-1280h-64q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h64zM1408 1152v-1280h-1024v1280h128v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h128zM1792 928v-832q0 -92 -66 -158t-158 -66h-64v1280h64q92 0 158 -66 t66 -158z" />
-<glyph unicode="&#xf0f3;" horiz-adv-x="1664" d="M848 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM1664 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q190 161 287 397.5t97 498.5 q0 165 96 262t264 117q-8 18 -8 37q0 40 28 68t68 28t68 -28t28 -68q0 -19 -8 -37q168 -20 264 -117t96 -262q0 -262 97 -498.5t287 -397.5z" />
-<glyph unicode="&#xf0f4;" horiz-adv-x="1920" d="M1664 896q0 80 -56 136t-136 56h-64v-384h64q80 0 136 56t56 136zM0 128h1792q0 -106 -75 -181t-181 -75h-1280q-106 0 -181 75t-75 181zM1856 896q0 -159 -112.5 -271.5t-271.5 -112.5h-64v-32q0 -92 -66 -158t-158 -66h-704q-92 0 -158 66t-66 158v736q0 26 19 45 t45 19h1152q159 0 271.5 -112.5t112.5 -271.5z" />
-<glyph unicode="&#xf0f5;" horiz-adv-x="1408" d="M640 1472v-640q0 -61 -35.5 -111t-92.5 -70v-779q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v779q-57 20 -92.5 70t-35.5 111v640q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45 t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45zM1408 1472v-1600q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v512h-224q-13 0 -22.5 9.5t-9.5 22.5v800q0 132 94 226t226 94h256q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf0f6;" horiz-adv-x="1280" d="M1024 352v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23zM1024 608v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23zM128 0h1024v768h-416q-40 0 -68 28t-28 68v416h-512v-1280z M768 896h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376zM1280 864v-896q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h640q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88z" />
-<glyph unicode="&#xf0f7;" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1536h-1152v-1536h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM1408 1472v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf0f8;" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1152h-256v-32q0 -40 -28 -68t-68 -28h-448q-40 0 -68 28t-28 68v32h-256v-1152h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM896 1056v320q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-96h-128v96q0 13 -9.5 22.5 t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v96h128v-96q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1408 1088v-1280q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1280q0 26 19 45t45 19h320 v288q0 40 28 68t68 28h448q40 0 68 -28t28 -68v-288h320q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf0f9;" horiz-adv-x="1920" d="M640 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM256 640h384v256h-158q-14 -2 -22 -9l-195 -195q-7 -12 -9 -22v-30zM1536 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1664 800v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM1920 1344v-1152 q0 -26 -19 -45t-45 -19h-192q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-128q-26 0 -45 19t-19 45t19 45t45 19v416q0 26 13 58t32 51l198 198q19 19 51 32t58 13h160v320q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf0fa;" horiz-adv-x="1792" d="M1280 416v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM640 1152h512v128h-512v-128zM256 1152v-1280h-32 q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h32zM1440 1152v-1280h-1088v1280h160v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h160zM1792 928v-832q0 -92 -66 -158t-158 -66h-32v1280h32q92 0 158 -66t66 -158z" />
-<glyph unicode="&#xf0fb;" horiz-adv-x="1920" d="M1920 576q-1 -32 -288 -96l-352 -32l-224 -64h-64l-293 -352h69q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-96h-160h-64v32h64v416h-160l-192 -224h-96l-32 32v192h32v32h128v8l-192 24v128l192 24v8h-128v32h-32v192l32 32h96l192 -224h160v416h-64v32h64h160h96 q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-69l293 -352h64l224 -64l352 -32q261 -58 287 -93z" />
-<glyph unicode="&#xf0fc;" horiz-adv-x="1664" d="M640 640v384h-256v-256q0 -53 37.5 -90.5t90.5 -37.5h128zM1664 192v-192h-1152v192l128 192h-128q-159 0 -271.5 112.5t-112.5 271.5v320l-64 64l32 128h480l32 128h960l32 -192l-64 -32v-800z" />
-<glyph unicode="&#xf0fd;" d="M1280 192v896q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-512v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-896q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h512v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf0fe;" d="M1280 576v128q0 26 -19 45t-45 19h-320v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-320q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h320v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h320q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf100;" horiz-adv-x="1024" d="M627 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23zM1011 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23z" />
-<glyph unicode="&#xf101;" horiz-adv-x="1024" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM979 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23 l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
-<glyph unicode="&#xf102;" horiz-adv-x="1152" d="M1075 224q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM1075 608q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393 q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
-<glyph unicode="&#xf103;" horiz-adv-x="1152" d="M1075 672q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23zM1075 1056q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
-<glyph unicode="&#xf104;" horiz-adv-x="640" d="M627 992q0 -13 -10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
-<glyph unicode="&#xf105;" horiz-adv-x="640" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
-<glyph unicode="&#xf106;" horiz-adv-x="1152" d="M1075 352q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
-<glyph unicode="&#xf107;" horiz-adv-x="1152" d="M1075 800q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
-<glyph unicode="&#xf108;" horiz-adv-x="1920" d="M1792 544v832q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1376v-1088q0 -66 -47 -113t-113 -47h-544q0 -37 16 -77.5t32 -71t16 -43.5q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19 t-19 45q0 14 16 44t32 70t16 78h-544q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
-<glyph unicode="&#xf109;" horiz-adv-x="1920" d="M416 256q-66 0 -113 47t-47 113v704q0 66 47 113t113 47h1088q66 0 113 -47t47 -113v-704q0 -66 -47 -113t-113 -47h-1088zM384 1120v-704q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5v704q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5z M1760 192h160v-96q0 -40 -47 -68t-113 -28h-1600q-66 0 -113 28t-47 68v96h160h1600zM1040 96q16 0 16 16t-16 16h-160q-16 0 -16 -16t16 -16h160z" />
-<glyph unicode="&#xf10a;" horiz-adv-x="1152" d="M640 128q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1024 288v960q0 13 -9.5 22.5t-22.5 9.5h-832q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h832q13 0 22.5 9.5t9.5 22.5zM1152 1248v-1088q0 -66 -47 -113t-113 -47h-832 q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h832q66 0 113 -47t47 -113z" />
-<glyph unicode="&#xf10b;" horiz-adv-x="768" d="M464 128q0 33 -23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5t56.5 23.5t23.5 56.5zM672 288v704q0 13 -9.5 22.5t-22.5 9.5h-512q-13 0 -22.5 -9.5t-9.5 -22.5v-704q0 -13 9.5 -22.5t22.5 -9.5h512q13 0 22.5 9.5t9.5 22.5zM480 1136 q0 16 -16 16h-160q-16 0 -16 -16t16 -16h160q16 0 16 16zM768 1152v-1024q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v1024q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
-<glyph unicode="&#xf10c;" d="M768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103 t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf10d;" horiz-adv-x="1664" d="M768 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z M1664 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z" />
-<glyph unicode="&#xf10e;" horiz-adv-x="1664" d="M768 1216v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136zM1664 1216 v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136z" />
-<glyph unicode="&#xf110;" horiz-adv-x="1568" d="M496 192q0 -60 -42.5 -102t-101.5 -42q-60 0 -102 42t-42 102t42 102t102 42q59 0 101.5 -42t42.5 -102zM928 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM320 640q0 -66 -47 -113t-113 -47t-113 47t-47 113 t47 113t113 47t113 -47t47 -113zM1360 192q0 -46 -33 -79t-79 -33t-79 33t-33 79t33 79t79 33t79 -33t33 -79zM528 1088q0 -73 -51.5 -124.5t-124.5 -51.5t-124.5 51.5t-51.5 124.5t51.5 124.5t124.5 51.5t124.5 -51.5t51.5 -124.5zM992 1280q0 -80 -56 -136t-136 -56 t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1536 640q0 -40 -28 -68t-68 -28t-68 28t-28 68t28 68t68 28t68 -28t28 -68zM1328 1088q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5z" />
-<glyph unicode="&#xf111;" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf112;" horiz-adv-x="1792" d="M1792 416q0 -166 -127 -451q-3 -7 -10.5 -24t-13.5 -30t-13 -22q-12 -17 -28 -17q-15 0 -23.5 10t-8.5 25q0 9 2.5 26.5t2.5 23.5q5 68 5 123q0 101 -17.5 181t-48.5 138.5t-80 101t-105.5 69.5t-133 42.5t-154 21.5t-175.5 6h-224v-256q0 -26 -19 -45t-45 -19t-45 19 l-512 512q-19 19 -19 45t19 45l512 512q19 19 45 19t45 -19t19 -45v-256h224q713 0 875 -403q53 -134 53 -333z" />
-<glyph unicode="&#xf113;" horiz-adv-x="1664" d="M640 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1280 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1440 320 q0 120 -69 204t-187 84q-41 0 -195 -21q-71 -11 -157 -11t-157 11q-152 21 -195 21q-118 0 -187 -84t-69 -204q0 -88 32 -153.5t81 -103t122 -60t140 -29.5t149 -7h168q82 0 149 7t140 29.5t122 60t81 103t32 153.5zM1664 496q0 -207 -61 -331q-38 -77 -105.5 -133t-141 -86 t-170 -47.5t-171.5 -22t-167 -4.5q-78 0 -142 3t-147.5 12.5t-152.5 30t-137 51.5t-121 81t-86 115q-62 123 -62 331q0 237 136 396q-27 82 -27 170q0 116 51 218q108 0 190 -39.5t189 -123.5q147 35 309 35q148 0 280 -32q105 82 187 121t189 39q51 -102 51 -218 q0 -87 -27 -168q136 -160 136 -398z" />
-<glyph unicode="&#xf114;" horiz-adv-x="1664" d="M1536 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-960q0 -40 28 -68t68 -28h1216q40 0 68 28t28 68zM1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320 q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
-<glyph unicode="&#xf115;" horiz-adv-x="1920" d="M1781 605q0 35 -53 35h-1088q-40 0 -85.5 -21.5t-71.5 -52.5l-294 -363q-18 -24 -18 -40q0 -35 53 -35h1088q40 0 86 22t71 53l294 363q18 22 18 39zM640 768h768v160q0 40 -28 68t-68 28h-576q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68 v-853l256 315q44 53 116 87.5t140 34.5zM1909 605q0 -62 -46 -120l-295 -363q-43 -53 -116 -87.5t-140 -34.5h-1088q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h192q54 0 99 -24.5t67 -70.5q15 -32 15 -68z " />
-<glyph unicode="&#xf116;" horiz-adv-x="1792" />
-<glyph unicode="&#xf117;" horiz-adv-x="1792" />
-<glyph unicode="&#xf118;" d="M1134 461q-37 -121 -138 -195t-228 -74t-228 74t-138 195q-8 25 4 48.5t38 31.5q25 8 48.5 -4t31.5 -38q25 -80 92.5 -129.5t151.5 -49.5t151.5 49.5t92.5 129.5q8 26 32 38t49 4t37 -31.5t4 -48.5zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5 t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf119;" d="M1134 307q8 -25 -4 -48.5t-37 -31.5t-49 4t-32 38q-25 80 -92.5 129.5t-151.5 49.5t-151.5 -49.5t-92.5 -129.5q-8 -26 -31.5 -38t-48.5 -4q-26 8 -38 31.5t-4 48.5q37 121 138 195t228 74t228 -74t138 -195zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204 t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf11a;" d="M1152 448q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h640q26 0 45 -19t19 -45zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf11b;" horiz-adv-x="1920" d="M832 448v128q0 14 -9 23t-23 9h-192v192q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-192h-192q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h192v-192q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v192h192q14 0 23 9t9 23zM1408 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5 t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1920 512q0 -212 -150 -362t-362 -150q-192 0 -338 128h-220q-146 -128 -338 -128q-212 0 -362 150 t-150 362t150 362t362 150h896q212 0 362 -150t150 -362z" />
-<glyph unicode="&#xf11c;" horiz-adv-x="1920" d="M384 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM512 624v-96q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h224q16 0 16 -16zM384 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 368v-96q0 -16 -16 -16 h-864q-16 0 -16 16v96q0 16 16 16h864q16 0 16 -16zM768 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM640 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1024 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16 h96q16 0 16 -16zM896 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1280 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1152 880v-96 q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 880v-352q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h112v240q0 16 16 16h96q16 0 16 -16zM1792 128v896h-1664v-896 h1664zM1920 1024v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-1664q-53 0 -90.5 37.5t-37.5 90.5v896q0 53 37.5 90.5t90.5 37.5h1664q53 0 90.5 -37.5t37.5 -90.5z" />
-<glyph unicode="&#xf11d;" horiz-adv-x="1792" d="M1664 491v616q-169 -91 -306 -91q-82 0 -145 32q-100 49 -184 76.5t-178 27.5q-173 0 -403 -127v-599q245 113 433 113q55 0 103.5 -7.5t98 -26t77 -31t82.5 -39.5l28 -14q44 -22 101 -22q120 0 293 92zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9 h-64q-14 0 -23 9t-9 23v1266q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102 q-15 -9 -33 -9q-16 0 -32 8q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" />
-<glyph unicode="&#xf11e;" horiz-adv-x="1792" d="M832 536v192q-181 -16 -384 -117v-185q205 96 384 110zM832 954v197q-172 -8 -384 -126v-189q215 111 384 118zM1664 491v184q-235 -116 -384 -71v224q-20 6 -39 15q-5 3 -33 17t-34.5 17t-31.5 15t-34.5 15.5t-32.5 13t-36 12.5t-35 8.5t-39.5 7.5t-39.5 4t-44 2 q-23 0 -49 -3v-222h19q102 0 192.5 -29t197.5 -82q19 -9 39 -15v-188q42 -17 91 -17q120 0 293 92zM1664 918v189q-169 -91 -306 -91q-45 0 -78 8v-196q148 -42 384 90zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v1266 q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102q-15 -9 -33 -9q-16 0 -32 8 q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" />
-<glyph unicode="&#xf120;" horiz-adv-x="1664" d="M585 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23zM1664 96v-64q0 -14 -9 -23t-23 -9h-960q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h960q14 0 23 -9 t9 -23z" />
-<glyph unicode="&#xf121;" horiz-adv-x="1920" d="M617 137l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23zM1208 1204l-373 -1291q-4 -13 -15.5 -19.5t-23.5 -2.5l-62 17q-13 4 -19.5 15.5t-2.5 24.5 l373 1291q4 13 15.5 19.5t23.5 2.5l62 -17q13 -4 19.5 -15.5t2.5 -24.5zM1865 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23z" />
-<glyph unicode="&#xf122;" horiz-adv-x="1792" d="M640 454v-70q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-69l-397 -398q-19 -19 -19 -45t19 -45zM1792 416q0 -58 -17 -133.5t-38.5 -138t-48 -125t-40.5 -90.5l-20 -40q-8 -17 -28 -17q-6 0 -9 1 q-25 8 -23 34q43 400 -106 565q-64 71 -170.5 110.5t-267.5 52.5v-251q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-262q411 -28 599 -221q169 -173 169 -509z" />
-<glyph unicode="&#xf123;" horiz-adv-x="1664" d="M1186 579l257 250l-356 52l-66 10l-30 60l-159 322v-963l59 -31l318 -168l-60 355l-12 66zM1638 841l-363 -354l86 -500q5 -33 -6 -51.5t-34 -18.5q-17 0 -40 12l-449 236l-449 -236q-23 -12 -40 -12q-23 0 -34 18.5t-6 51.5l86 500l-364 354q-32 32 -23 59.5t54 34.5 l502 73l225 455q20 41 49 41q28 0 49 -41l225 -455l502 -73q45 -7 54 -34.5t-24 -59.5z" />
-<glyph unicode="&#xf124;" horiz-adv-x="1408" d="M1401 1187l-640 -1280q-17 -35 -57 -35q-5 0 -15 2q-22 5 -35.5 22.5t-13.5 39.5v576h-576q-22 0 -39.5 13.5t-22.5 35.5t4 42t29 30l1280 640q13 7 29 7q27 0 45 -19q15 -14 18.5 -34.5t-6.5 -39.5z" />
-<glyph unicode="&#xf125;" horiz-adv-x="1664" d="M557 256h595v595zM512 301l595 595h-595v-595zM1664 224v-192q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v224h-864q-14 0 -23 9t-9 23v864h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224v224q0 14 9 23t23 9h192q14 0 23 -9t9 -23 v-224h851l246 247q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-247 -246v-851h224q14 0 23 -9t9 -23z" />
-<glyph unicode="&#xf126;" horiz-adv-x="1024" d="M288 64q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM288 1216q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM928 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1024 1088q0 -52 -26 -96.5t-70 -69.5 q-2 -287 -226 -414q-68 -38 -203 -81q-128 -40 -169.5 -71t-41.5 -100v-26q44 -25 70 -69.5t26 -96.5q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 52 26 96.5t70 69.5v820q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136q0 -52 -26 -96.5t-70 -69.5v-497 q54 26 154 57q55 17 87.5 29.5t70.5 31t59 39.5t40.5 51t28 69.5t8.5 91.5q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136z" />
-<glyph unicode="&#xf127;" horiz-adv-x="1664" d="M439 265l-256 -256q-10 -9 -23 -9q-12 0 -23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23zM608 224v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM384 448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23t9 23t23 9h320 q14 0 23 -9t9 -23zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-334 335q-21 21 -42 56l239 18l273 -274q27 -27 68 -27.5t68 26.5l147 146q28 28 28 67q0 40 -28 68l-274 275l18 239q35 -21 56 -42l336 -336q84 -86 84 -204zM1031 1044l-239 -18 l-273 274q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l274 -274l-18 -240q-35 21 -56 42l-336 336q-84 86 -84 204q0 120 85 203l147 146q83 83 203 83q121 0 204 -85l334 -335q21 -21 42 -56zM1664 960q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9 t-9 23t9 23t23 9h320q14 0 23 -9t9 -23zM1120 1504v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM1527 1353l-256 -256q-11 -9 -23 -9t-23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" />
-<glyph unicode="&#xf128;" horiz-adv-x="1024" d="M704 280v-240q0 -16 -12 -28t-28 -12h-240q-16 0 -28 12t-12 28v240q0 16 12 28t28 12h240q16 0 28 -12t12 -28zM1020 880q0 -54 -15.5 -101t-35 -76.5t-55 -59.5t-57.5 -43.5t-61 -35.5q-41 -23 -68.5 -65t-27.5 -67q0 -17 -12 -32.5t-28 -15.5h-240q-15 0 -25.5 18.5 t-10.5 37.5v45q0 83 65 156.5t143 108.5q59 27 84 56t25 76q0 42 -46.5 74t-107.5 32q-65 0 -108 -29q-35 -25 -107 -115q-13 -16 -31 -16q-12 0 -25 8l-164 125q-13 10 -15.5 25t5.5 28q160 266 464 266q80 0 161 -31t146 -83t106 -127.5t41 -158.5z" />
-<glyph unicode="&#xf129;" horiz-adv-x="640" d="M640 192v-128q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64v384h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-576h64q26 0 45 -19t19 -45zM512 1344v-192q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v192 q0 26 19 45t45 19h256q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf12a;" horiz-adv-x="640" d="M512 288v-224q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v224q0 26 19 45t45 19h256q26 0 45 -19t19 -45zM542 1344l-28 -768q-1 -26 -20.5 -45t-45.5 -19h-256q-26 0 -45.5 19t-20.5 45l-28 768q-1 26 17.5 45t44.5 19h320q26 0 44.5 -19t17.5 -45z" />
-<glyph unicode="&#xf12b;" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1534 846v-206h-514l-3 27 q-4 28 -4 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q83 65 188 65q110 0 178 -59.5t68 -158.5q0 -56 -24.5 -103t-62 -76.5t-81.5 -58.5t-82 -50.5t-65.5 -51.5t-30.5 -63h232v80 h126z" />
-<glyph unicode="&#xf12c;" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1536 -50v-206h-514l-4 27 q-3 45 -3 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q80 65 188 65q110 0 178 -59.5t68 -158.5q0 -66 -34.5 -118.5t-84 -86t-99.5 -62.5t-87 -63t-41 -73h232v80h126z" />
-<glyph unicode="&#xf12d;" horiz-adv-x="1920" d="M896 128l336 384h-768l-336 -384h768zM1909 1205q15 -34 9.5 -71.5t-30.5 -65.5l-896 -1024q-38 -44 -96 -44h-768q-38 0 -69.5 20.5t-47.5 54.5q-15 34 -9.5 71.5t30.5 65.5l896 1024q38 44 96 44h768q38 0 69.5 -20.5t47.5 -54.5z" />
-<glyph unicode="&#xf12e;" horiz-adv-x="1664" d="M1664 438q0 -81 -44.5 -135t-123.5 -54q-41 0 -77.5 17.5t-59 38t-56.5 38t-71 17.5q-110 0 -110 -124q0 -39 16 -115t15 -115v-5q-22 0 -33 -1q-34 -3 -97.5 -11.5t-115.5 -13.5t-98 -5q-61 0 -103 26.5t-42 83.5q0 37 17.5 71t38 56.5t38 59t17.5 77.5q0 79 -54 123.5 t-135 44.5q-84 0 -143 -45.5t-59 -127.5q0 -43 15 -83t33.5 -64.5t33.5 -53t15 -50.5q0 -45 -46 -89q-37 -35 -117 -35q-95 0 -245 24q-9 2 -27.5 4t-27.5 4l-13 2q-1 0 -3 1q-2 0 -2 1v1024q2 -1 17.5 -3.5t34 -5t21.5 -3.5q150 -24 245 -24q80 0 117 35q46 44 46 89 q0 22 -15 50.5t-33.5 53t-33.5 64.5t-15 83q0 82 59 127.5t144 45.5q80 0 134 -44.5t54 -123.5q0 -41 -17.5 -77.5t-38 -59t-38 -56.5t-17.5 -71q0 -57 42 -83.5t103 -26.5q64 0 180 15t163 17v-2q-1 -2 -3.5 -17.5t-5 -34t-3.5 -21.5q-24 -150 -24 -245q0 -80 35 -117 q44 -46 89 -46q22 0 50.5 15t53 33.5t64.5 33.5t83 15q82 0 127.5 -59t45.5 -143z" />
-<glyph unicode="&#xf130;" horiz-adv-x="1152" d="M1152 832v-128q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-217 24 -364.5 187.5t-147.5 384.5v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -185 131.5 -316.5t316.5 -131.5 t316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45zM896 1216v-512q0 -132 -94 -226t-226 -94t-226 94t-94 226v512q0 132 94 226t226 94t226 -94t94 -226z" />
-<glyph unicode="&#xf131;" horiz-adv-x="1408" d="M271 591l-101 -101q-42 103 -42 214v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -53 15 -113zM1385 1193l-361 -361v-128q0 -132 -94 -226t-226 -94q-55 0 -109 19l-96 -96q97 -51 205 -51q185 0 316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45v-128 q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-125 13 -235 81l-254 -254q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23t10 23l1234 1234q10 10 23 10t23 -10l82 -82q10 -10 10 -23 t-10 -23zM1005 1325l-621 -621v512q0 132 94 226t226 94q102 0 184.5 -59t116.5 -152z" />
-<glyph unicode="&#xf132;" horiz-adv-x="1280" d="M1088 576v640h-448v-1137q119 63 213 137q235 184 235 360zM1280 1344v-768q0 -86 -33.5 -170.5t-83 -150t-118 -127.5t-126.5 -103t-121 -77.5t-89.5 -49.5t-42.5 -20q-12 -6 -26 -6t-26 6q-16 7 -42.5 20t-89.5 49.5t-121 77.5t-126.5 103t-118 127.5t-83 150 t-33.5 170.5v768q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf133;" horiz-adv-x="1664" d="M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280 q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
-<glyph unicode="&#xf134;" horiz-adv-x="1408" d="M512 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 1376v-320q0 -16 -12 -25q-8 -7 -20 -7q-4 0 -7 1l-448 96q-11 2 -18 11t-7 20h-256v-102q111 -23 183.5 -111t72.5 -203v-800q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v800 q0 106 62.5 190.5t161.5 114.5v111h-32q-59 0 -115 -23.5t-91.5 -53t-66 -66.5t-40.5 -53.5t-14 -24.5q-17 -35 -57 -35q-16 0 -29 7q-23 12 -31.5 37t3.5 49q5 10 14.5 26t37.5 53.5t60.5 70t85 67t108.5 52.5q-25 42 -25 86q0 66 47 113t113 47t113 -47t47 -113 q0 -33 -14 -64h302q0 11 7 20t18 11l448 96q3 1 7 1q12 0 20 -7q12 -9 12 -25z" />
-<glyph unicode="&#xf135;" horiz-adv-x="1664" d="M1440 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1664 1376q0 -249 -75.5 -430.5t-253.5 -360.5q-81 -80 -195 -176l-20 -379q-2 -16 -16 -26l-384 -224q-7 -4 -16 -4q-12 0 -23 9l-64 64q-13 14 -8 32l85 276l-281 281l-276 -85q-3 -1 -9 -1 q-14 0 -23 9l-64 64q-17 19 -5 39l224 384q10 14 26 16l379 20q96 114 176 195q188 187 358 258t431 71q14 0 24 -9.5t10 -22.5z" />
-<glyph unicode="&#xf136;" horiz-adv-x="1792" d="M1745 763l-164 -763h-334l178 832q13 56 -15 88q-27 33 -83 33h-169l-204 -953h-334l204 953h-286l-204 -953h-334l204 953l-153 327h1276q101 0 189.5 -40.5t147.5 -113.5q60 -73 81 -168.5t0 -194.5z" />
-<glyph unicode="&#xf137;" d="M909 141l102 102q19 19 19 45t-19 45l-307 307l307 307q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf138;" d="M717 141l454 454q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l307 -307l-307 -307q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf139;" d="M1165 397l102 102q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l307 307l307 -307q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf13a;" d="M813 237l454 454q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-307 -307l-307 307q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf13b;" horiz-adv-x="1408" d="M1130 939l16 175h-884l47 -534h612l-22 -228l-197 -53l-196 53l-13 140h-175l22 -278l362 -100h4v1l359 99l50 544h-644l-15 181h674zM0 1408h1408l-128 -1438l-578 -162l-574 162z" />
-<glyph unicode="&#xf13c;" horiz-adv-x="1792" d="M275 1408h1505l-266 -1333l-804 -267l-698 267l71 356h297l-29 -147l422 -161l486 161l68 339h-1208l58 297h1209l38 191h-1208z" />
-<glyph unicode="&#xf13d;" horiz-adv-x="1792" d="M960 1280q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1792 352v-352q0 -22 -20 -30q-8 -2 -12 -2q-13 0 -23 9l-93 93q-119 -143 -318.5 -226.5t-429.5 -83.5t-429.5 83.5t-318.5 226.5l-93 -93q-9 -9 -23 -9q-4 0 -12 2q-20 8 -20 30v352 q0 14 9 23t23 9h352q22 0 30 -20q8 -19 -7 -35l-100 -100q67 -91 189.5 -153.5t271.5 -82.5v647h-192q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h192v163q-58 34 -93 92.5t-35 128.5q0 106 75 181t181 75t181 -75t75 -181q0 -70 -35 -128.5t-93 -92.5v-163h192q26 0 45 -19 t19 -45v-128q0 -26 -19 -45t-45 -19h-192v-647q149 20 271.5 82.5t189.5 153.5l-100 100q-15 16 -7 35q8 20 30 20h352q14 0 23 -9t9 -23z" />
-<glyph unicode="&#xf13e;" horiz-adv-x="1152" d="M1056 768q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v320q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45q0 106 -75 181t-181 75t-181 -75t-75 -181 v-320h736z" />
-<glyph unicode="&#xf140;" d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM1152 640q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM1280 640q0 -212 -150 -362t-362 -150t-362 150 t-150 362t150 362t362 150t362 -150t150 -362zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf141;" horiz-adv-x="1408" d="M384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM896 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM1408 800v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
-<glyph unicode="&#xf142;" horiz-adv-x="384" d="M384 288v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 1312v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
-<glyph unicode="&#xf143;" d="M512 256q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM863 162q-13 232 -177 396t-396 177q-14 1 -24 -9t-10 -23v-128q0 -13 8.5 -22t21.5 -10q154 -11 264 -121t121 -264q1 -13 10 -21.5t22 -8.5h128q13 0 23 10 t9 24zM1247 161q-5 154 -56 297.5t-139.5 260t-205 205t-260 139.5t-297.5 56q-14 1 -23 -9q-10 -10 -10 -23v-128q0 -13 9 -22t22 -10q204 -7 378 -111.5t278.5 -278.5t111.5 -378q1 -13 10 -22t22 -9h128q13 0 23 10q11 9 9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf144;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1152 585q32 18 32 55t-32 55l-544 320q-31 19 -64 1q-32 -19 -32 -56v-640q0 -37 32 -56 q16 -8 32 -8q17 0 32 9z" />
-<glyph unicode="&#xf145;" horiz-adv-x="1792" d="M1024 1084l316 -316l-572 -572l-316 316zM813 105l618 618q19 19 19 45t-19 45l-362 362q-18 18 -45 18t-45 -18l-618 -618q-19 -19 -19 -45t19 -45l362 -362q18 -18 45 -18t45 18zM1702 742l-907 -908q-37 -37 -90.5 -37t-90.5 37l-126 126q56 56 56 136t-56 136 t-136 56t-136 -56l-125 126q-37 37 -37 90.5t37 90.5l907 906q37 37 90.5 37t90.5 -37l125 -125q-56 -56 -56 -136t56 -136t136 -56t136 56l126 -125q37 -37 37 -90.5t-37 -90.5z" />
-<glyph unicode="&#xf146;" d="M1280 576v128q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h896q26 0 45 19t19 45zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 t84.5 -203.5z" />
-<glyph unicode="&#xf147;" horiz-adv-x="1408" d="M1152 736v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h832q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5 t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf148;" horiz-adv-x="1024" d="M1018 933q-18 -37 -58 -37h-192v-864q0 -14 -9 -23t-23 -9h-704q-21 0 -29 18q-8 20 4 35l160 192q9 11 25 11h320v640h-192q-40 0 -58 37q-17 37 9 68l320 384q18 22 49 22t49 -22l320 -384q27 -32 9 -68z" />
-<glyph unicode="&#xf149;" horiz-adv-x="1024" d="M32 1280h704q13 0 22.5 -9.5t9.5 -23.5v-863h192q40 0 58 -37t-9 -69l-320 -384q-18 -22 -49 -22t-49 22l-320 384q-26 31 -9 69q18 37 58 37h192v640h-320q-14 0 -25 11l-160 192q-13 14 -4 34q9 19 29 19z" />
-<glyph unicode="&#xf14a;" d="M685 237l614 614q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-467 -467l-211 211q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l358 -358q19 -19 45 -19t45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5 t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf14b;" d="M404 428l152 -152l-52 -52h-56v96h-96v56zM818 818q14 -13 -3 -30l-291 -291q-17 -17 -30 -3q-14 13 3 30l291 291q17 17 30 3zM544 128l544 544l-288 288l-544 -544v-288h288zM1152 736l92 92q28 28 28 68t-28 68l-152 152q-28 28 -68 28t-68 -28l-92 -92zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf14c;" d="M1280 608v480q0 26 -19 45t-45 19h-480q-42 0 -59 -39q-17 -41 14 -70l144 -144l-534 -534q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l534 534l144 -144q18 -19 45 -19q12 0 25 5q39 17 39 59zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf14d;" d="M1005 435l352 352q19 19 19 45t-19 45l-352 352q-30 31 -69 14q-40 -17 -40 -59v-160q-119 0 -216 -19.5t-162.5 -51t-114 -79t-76.5 -95.5t-44.5 -109t-21.5 -111.5t-5 -110.5q0 -181 167 -404q10 -12 25 -12q7 0 13 3q22 9 19 33q-44 354 62 473q46 52 130 75.5 t224 23.5v-160q0 -42 40 -59q12 -5 24 -5q26 0 45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf14e;" d="M640 448l256 128l-256 128v-256zM1024 1039v-542l-512 -256v542zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf150;" d="M1145 861q18 -35 -5 -66l-320 -448q-19 -27 -52 -27t-52 27l-320 448q-23 31 -5 66q17 35 57 35h640q40 0 57 -35zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf151;" d="M1145 419q-17 -35 -57 -35h-640q-40 0 -57 35q-18 35 5 66l320 448q19 27 52 27t52 -27l320 -448q23 -31 5 -66zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf152;" d="M1088 640q0 -33 -27 -52l-448 -320q-31 -23 -66 -5q-35 17 -35 57v640q0 40 35 57q35 18 66 -5l448 -320q27 -19 27 -52zM1280 160v960q0 14 -9 23t-23 9h-960q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h960q14 0 23 9t9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf153;" horiz-adv-x="1024" d="M976 229l35 -159q3 -12 -3 -22.5t-17 -14.5l-5 -1q-4 -2 -10.5 -3.5t-16 -4.5t-21.5 -5.5t-25.5 -5t-30 -5t-33.5 -4.5t-36.5 -3t-38.5 -1q-234 0 -409 130.5t-238 351.5h-95q-13 0 -22.5 9.5t-9.5 22.5v113q0 13 9.5 22.5t22.5 9.5h66q-2 57 1 105h-67q-14 0 -23 9 t-9 23v114q0 14 9 23t23 9h98q67 210 243.5 338t400.5 128q102 0 194 -23q11 -3 20 -15q6 -11 3 -24l-43 -159q-3 -13 -14 -19.5t-24 -2.5l-4 1q-4 1 -11.5 2.5l-17.5 3.5t-22.5 3.5t-26 3t-29 2.5t-29.5 1q-126 0 -226 -64t-150 -176h468q16 0 25 -12q10 -12 7 -26 l-24 -114q-5 -26 -32 -26h-488q-3 -37 0 -105h459q15 0 25 -12q9 -12 6 -27l-24 -112q-2 -11 -11 -18.5t-20 -7.5h-387q48 -117 149.5 -185.5t228.5 -68.5q18 0 36 1.5t33.5 3.5t29.5 4.5t24.5 5t18.5 4.5l12 3l5 2q13 5 26 -2q12 -7 15 -21z" />
-<glyph unicode="&#xf154;" horiz-adv-x="1024" d="M1020 399v-367q0 -14 -9 -23t-23 -9h-956q-14 0 -23 9t-9 23v150q0 13 9.5 22.5t22.5 9.5h97v383h-95q-14 0 -23 9.5t-9 22.5v131q0 14 9 23t23 9h95v223q0 171 123.5 282t314.5 111q185 0 335 -125q9 -8 10 -20.5t-7 -22.5l-103 -127q-9 -11 -22 -12q-13 -2 -23 7 q-5 5 -26 19t-69 32t-93 18q-85 0 -137 -47t-52 -123v-215h305q13 0 22.5 -9t9.5 -23v-131q0 -13 -9.5 -22.5t-22.5 -9.5h-305v-379h414v181q0 13 9 22.5t23 9.5h162q14 0 23 -9.5t9 -22.5z" />
-<glyph unicode="&#xf155;" horiz-adv-x="1024" d="M978 351q0 -153 -99.5 -263.5t-258.5 -136.5v-175q0 -14 -9 -23t-23 -9h-135q-13 0 -22.5 9.5t-9.5 22.5v175q-66 9 -127.5 31t-101.5 44.5t-74 48t-46.5 37.5t-17.5 18q-17 21 -2 41l103 135q7 10 23 12q15 2 24 -9l2 -2q113 -99 243 -125q37 -8 74 -8q81 0 142.5 43 t61.5 122q0 28 -15 53t-33.5 42t-58.5 37.5t-66 32t-80 32.5q-39 16 -61.5 25t-61.5 26.5t-62.5 31t-56.5 35.5t-53.5 42.5t-43.5 49t-35.5 58t-21 66.5t-8.5 78q0 138 98 242t255 134v180q0 13 9.5 22.5t22.5 9.5h135q14 0 23 -9t9 -23v-176q57 -6 110.5 -23t87 -33.5 t63.5 -37.5t39 -29t15 -14q17 -18 5 -38l-81 -146q-8 -15 -23 -16q-14 -3 -27 7q-3 3 -14.5 12t-39 26.5t-58.5 32t-74.5 26t-85.5 11.5q-95 0 -155 -43t-60 -111q0 -26 8.5 -48t29.5 -41.5t39.5 -33t56 -31t60.5 -27t70 -27.5q53 -20 81 -31.5t76 -35t75.5 -42.5t62 -50 t53 -63.5t31.5 -76.5t13 -94z" />
-<glyph unicode="&#xf156;" horiz-adv-x="898" d="M898 1066v-102q0 -14 -9 -23t-23 -9h-168q-23 -144 -129 -234t-276 -110q167 -178 459 -536q14 -16 4 -34q-8 -18 -29 -18h-195q-16 0 -25 12q-306 367 -498 571q-9 9 -9 22v127q0 13 9.5 22.5t22.5 9.5h112q132 0 212.5 43t102.5 125h-427q-14 0 -23 9t-9 23v102 q0 14 9 23t23 9h413q-57 113 -268 113h-145q-13 0 -22.5 9.5t-9.5 22.5v133q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-102q0 -14 -9 -23t-23 -9h-233q47 -61 64 -144h171q14 0 23 -9t9 -23z" />
-<glyph unicode="&#xf157;" horiz-adv-x="1027" d="M603 0h-172q-13 0 -22.5 9t-9.5 23v330h-288q-13 0 -22.5 9t-9.5 23v103q0 13 9.5 22.5t22.5 9.5h288v85h-288q-13 0 -22.5 9t-9.5 23v104q0 13 9.5 22.5t22.5 9.5h214l-321 578q-8 16 0 32q10 16 28 16h194q19 0 29 -18l215 -425q19 -38 56 -125q10 24 30.5 68t27.5 61 l191 420q8 19 29 19h191q17 0 27 -16q9 -14 1 -31l-313 -579h215q13 0 22.5 -9.5t9.5 -22.5v-104q0 -14 -9.5 -23t-22.5 -9h-290v-85h290q13 0 22.5 -9.5t9.5 -22.5v-103q0 -14 -9.5 -23t-22.5 -9h-290v-330q0 -13 -9.5 -22.5t-22.5 -9.5z" />
-<glyph unicode="&#xf158;" horiz-adv-x="1280" d="M1043 971q0 100 -65 162t-171 62h-320v-448h320q106 0 171 62t65 162zM1280 971q0 -193 -126.5 -315t-326.5 -122h-340v-118h505q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-505v-192q0 -14 -9.5 -23t-22.5 -9h-167q-14 0 -23 9t-9 23v192h-224q-14 0 -23 9t-9 23v128 q0 14 9 23t23 9h224v118h-224q-14 0 -23 9t-9 23v149q0 13 9 22.5t23 9.5h224v629q0 14 9 23t23 9h539q200 0 326.5 -122t126.5 -315z" />
-<glyph unicode="&#xf159;" horiz-adv-x="1792" d="M514 341l81 299h-159l75 -300q1 -1 1 -3t1 -3q0 1 0.5 3.5t0.5 3.5zM630 768l35 128h-292l32 -128h225zM822 768h139l-35 128h-70zM1271 340l78 300h-162l81 -299q0 -1 0.5 -3.5t1.5 -3.5q0 1 0.5 3t0.5 3zM1382 768l33 128h-297l34 -128h230zM1792 736v-64q0 -14 -9 -23 t-23 -9h-213l-164 -616q-7 -24 -31 -24h-159q-24 0 -31 24l-166 616h-209l-167 -616q-7 -24 -31 -24h-159q-11 0 -19.5 7t-10.5 17l-160 616h-208q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h175l-33 128h-142q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h109l-89 344q-5 15 5 28 q10 12 26 12h137q26 0 31 -24l90 -360h359l97 360q7 24 31 24h126q24 0 31 -24l98 -360h365l93 360q5 24 31 24h137q16 0 26 -12q10 -13 5 -28l-91 -344h111q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-145l-34 -128h179q14 0 23 -9t9 -23z" />
-<glyph unicode="&#xf15a;" horiz-adv-x="1280" d="M1167 896q18 -182 -131 -258q117 -28 175 -103t45 -214q-7 -71 -32.5 -125t-64.5 -89t-97 -58.5t-121.5 -34.5t-145.5 -15v-255h-154v251q-80 0 -122 1v-252h-154v255q-18 0 -54 0.5t-55 0.5h-200l31 183h111q50 0 58 51v402h16q-6 1 -16 1v287q-13 68 -89 68h-111v164 l212 -1q64 0 97 1v252h154v-247q82 2 122 2v245h154v-252q79 -7 140 -22.5t113 -45t82.5 -78t36.5 -114.5zM952 351q0 36 -15 64t-37 46t-57.5 30.5t-65.5 18.5t-74 9t-69 3t-64.5 -1t-47.5 -1v-338q8 0 37 -0.5t48 -0.5t53 1.5t58.5 4t57 8.5t55.5 14t47.5 21t39.5 30 t24.5 40t9.5 51zM881 827q0 33 -12.5 58.5t-30.5 42t-48 28t-55 16.5t-61.5 8t-58 2.5t-54 -1t-39.5 -0.5v-307q5 0 34.5 -0.5t46.5 0t50 2t55 5.5t51.5 11t48.5 18.5t37 27t27 38.5t9 51z" />
-<glyph unicode="&#xf15b;" horiz-adv-x="1280" d="M1280 768v-800q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h544v-544q0 -40 28 -68t68 -28h544zM1277 896h-509v509q82 -15 132 -65l312 -312q50 -50 65 -132z" />
-<glyph unicode="&#xf15c;" horiz-adv-x="1280" d="M1024 160v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1024 416v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1280 768v-800q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28 t-28 68v1344q0 40 28 68t68 28h544v-544q0 -40 28 -68t68 -28h544zM1277 896h-509v509q82 -15 132 -65l312 -312q50 -50 65 -132z" />
-<glyph unicode="&#xf15d;" horiz-adv-x="1664" d="M1191 1128h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1572 -23 v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -11v-2l14 2q9 2 30 2h248v119h121zM1661 874v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162 l230 -662h70z" />
-<glyph unicode="&#xf15e;" horiz-adv-x="1664" d="M1191 104h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1661 -150 v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162l230 -662h70zM1572 1001v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -10v-3l14 3q9 1 30 1h248 v119h121z" />
-<glyph unicode="&#xf160;" horiz-adv-x="1792" d="M736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1792 -32v-192q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832 q14 0 23 -9t9 -23zM1600 480v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1408 992v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1216 1504v-192q0 -14 -9 -23t-23 -9h-256 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23z" />
-<glyph unicode="&#xf161;" horiz-adv-x="1792" d="M1216 -32v-192q0 -14 -9 -23t-23 -9h-256q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192 q14 0 23 -9t9 -23zM1408 480v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1600 992v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1792 1504v-192q0 -14 -9 -23t-23 -9h-832 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832q14 0 23 -9t9 -23z" />
-<glyph unicode="&#xf162;" d="M1346 223q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23 zM1486 165q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5 t82 -252.5zM1456 882v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165z" />
-<glyph unicode="&#xf163;" d="M1346 1247q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9 t9 -23zM1456 -142v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165zM1486 1189q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13 q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5t82 -252.5z" />
-<glyph unicode="&#xf164;" horiz-adv-x="1664" d="M256 192q0 26 -19 45t-45 19q-27 0 -45.5 -19t-18.5 -45q0 -27 18.5 -45.5t45.5 -18.5q26 0 45 18.5t19 45.5zM416 704v-640q0 -26 -19 -45t-45 -19h-288q-26 0 -45 19t-19 45v640q0 26 19 45t45 19h288q26 0 45 -19t19 -45zM1600 704q0 -86 -55 -149q15 -44 15 -76 q3 -76 -43 -137q17 -56 0 -117q-15 -57 -54 -94q9 -112 -49 -181q-64 -76 -197 -78h-36h-76h-17q-66 0 -144 15.5t-121.5 29t-120.5 39.5q-123 43 -158 44q-26 1 -45 19.5t-19 44.5v641q0 25 18 43.5t43 20.5q24 2 76 59t101 121q68 87 101 120q18 18 31 48t17.5 48.5 t13.5 60.5q7 39 12.5 61t19.5 52t34 50q19 19 45 19q46 0 82.5 -10.5t60 -26t40 -40.5t24 -45t12 -50t5 -45t0.5 -39q0 -38 -9.5 -76t-19 -60t-27.5 -56q-3 -6 -10 -18t-11 -22t-8 -24h277q78 0 135 -57t57 -135z" />
-<glyph unicode="&#xf165;" horiz-adv-x="1664" d="M256 960q0 -26 -19 -45t-45 -19q-27 0 -45.5 19t-18.5 45q0 27 18.5 45.5t45.5 18.5q26 0 45 -18.5t19 -45.5zM416 448v640q0 26 -19 45t-45 19h-288q-26 0 -45 -19t-19 -45v-640q0 -26 19 -45t45 -19h288q26 0 45 19t19 45zM1545 597q55 -61 55 -149q-1 -78 -57.5 -135 t-134.5 -57h-277q4 -14 8 -24t11 -22t10 -18q18 -37 27 -57t19 -58.5t10 -76.5q0 -24 -0.5 -39t-5 -45t-12 -50t-24 -45t-40 -40.5t-60 -26t-82.5 -10.5q-26 0 -45 19q-20 20 -34 50t-19.5 52t-12.5 61q-9 42 -13.5 60.5t-17.5 48.5t-31 48q-33 33 -101 120q-49 64 -101 121 t-76 59q-25 2 -43 20.5t-18 43.5v641q0 26 19 44.5t45 19.5q35 1 158 44q77 26 120.5 39.5t121.5 29t144 15.5h17h76h36q133 -2 197 -78q58 -69 49 -181q39 -37 54 -94q17 -61 0 -117q46 -61 43 -137q0 -32 -15 -76z" />
-<glyph unicode="&#xf166;" d="M919 233v157q0 50 -29 50q-17 0 -33 -16v-224q16 -16 33 -16q29 0 29 49zM1103 355h66v34q0 51 -33 51t-33 -51v-34zM532 621v-70h-80v-423h-74v423h-78v70h232zM733 495v-367h-67v40q-39 -45 -76 -45q-33 0 -42 28q-6 16 -6 54v290h66v-270q0 -24 1 -26q1 -15 15 -15 q20 0 42 31v280h67zM985 384v-146q0 -52 -7 -73q-12 -42 -53 -42q-35 0 -68 41v-36h-67v493h67v-161q32 40 68 40q41 0 53 -42q7 -21 7 -74zM1236 255v-9q0 -29 -2 -43q-3 -22 -15 -40q-27 -40 -80 -40q-52 0 -81 38q-21 27 -21 86v129q0 59 20 86q29 38 80 38t78 -38 q21 -28 21 -86v-76h-133v-65q0 -51 34 -51q24 0 30 26q0 1 0.5 7t0.5 16.5v21.5h68zM785 1079v-156q0 -51 -32 -51t-32 51v156q0 52 32 52t32 -52zM1318 366q0 177 -19 260q-10 44 -43 73.5t-76 34.5q-136 15 -412 15q-275 0 -411 -15q-44 -5 -76.5 -34.5t-42.5 -73.5 q-20 -87 -20 -260q0 -176 20 -260q10 -43 42.5 -73t75.5 -35q137 -15 412 -15t412 15q43 5 75.5 35t42.5 73q20 84 20 260zM563 1017l90 296h-75l-51 -195l-53 195h-78l24 -69t23 -69q35 -103 46 -158v-201h74v201zM852 936v130q0 58 -21 87q-29 38 -78 38q-51 0 -78 -38 q-21 -29 -21 -87v-130q0 -58 21 -87q27 -38 78 -38q49 0 78 38q21 27 21 87zM1033 816h67v370h-67v-283q-22 -31 -42 -31q-15 0 -16 16q-1 2 -1 26v272h-67v-293q0 -37 6 -55q11 -27 43 -27q36 0 77 45v-40zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf167;" d="M971 292v-211q0 -67 -39 -67q-23 0 -45 22v301q22 22 45 22q39 0 39 -67zM1309 291v-46h-90v46q0 68 45 68t45 -68zM343 509h107v94h-312v-94h105v-569h100v569zM631 -60h89v494h-89v-378q-30 -42 -57 -42q-18 0 -21 21q-1 3 -1 35v364h-89v-391q0 -49 8 -73 q12 -37 58 -37q48 0 102 61v-54zM1060 88v197q0 73 -9 99q-17 56 -71 56q-50 0 -93 -54v217h-89v-663h89v48q45 -55 93 -55q54 0 71 55q9 27 9 100zM1398 98v13h-91q0 -51 -2 -61q-7 -36 -40 -36q-46 0 -46 69v87h179v103q0 79 -27 116q-39 51 -106 51q-68 0 -107 -51 q-28 -37 -28 -116v-173q0 -79 29 -116q39 -51 108 -51q72 0 108 53q18 27 21 54q2 9 2 58zM790 1011v210q0 69 -43 69t-43 -69v-210q0 -70 43 -70t43 70zM1509 260q0 -234 -26 -350q-14 -59 -58 -99t-102 -46q-184 -21 -555 -21t-555 21q-58 6 -102.5 46t-57.5 99 q-26 112 -26 350q0 234 26 350q14 59 58 99t103 47q183 20 554 20t555 -20q58 -7 102.5 -47t57.5 -99q26 -112 26 -350zM511 1536h102l-121 -399v-271h-100v271q-14 74 -61 212q-37 103 -65 187h106l71 -263zM881 1203v-175q0 -81 -28 -118q-37 -51 -106 -51q-67 0 -105 51 q-28 38 -28 118v175q0 80 28 117q38 51 105 51q69 0 106 -51q28 -37 28 -117zM1216 1365v-499h-91v55q-53 -62 -103 -62q-46 0 -59 37q-8 24 -8 75v394h91v-367q0 -33 1 -35q3 -22 21 -22q27 0 57 43v381h91z" />
-<glyph unicode="&#xf168;" horiz-adv-x="1408" d="M597 869q-10 -18 -257 -456q-27 -46 -65 -46h-239q-21 0 -31 17t0 36l253 448q1 0 0 1l-161 279q-12 22 -1 37q9 15 32 15h239q40 0 66 -45zM1403 1511q11 -16 0 -37l-528 -934v-1l336 -615q11 -20 1 -37q-10 -15 -32 -15h-239q-42 0 -66 45l-339 622q18 32 531 942 q25 45 64 45h241q22 0 31 -15z" />
-<glyph unicode="&#xf169;" d="M685 771q0 1 -126 222q-21 34 -52 34h-184q-18 0 -26 -11q-7 -12 1 -29l125 -216v-1l-196 -346q-9 -14 0 -28q8 -13 24 -13h185q31 0 50 36zM1309 1268q-7 12 -24 12h-187q-30 0 -49 -35l-411 -729q1 -2 262 -481q20 -35 52 -35h184q18 0 25 12q8 13 -1 28l-260 476v1 l409 723q8 16 0 28zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf16a;" horiz-adv-x="1792" d="M1280 640q0 37 -30 54l-512 320q-31 20 -65 2q-33 -18 -33 -56v-640q0 -38 33 -56q16 -8 31 -8q20 0 34 10l512 320q30 17 30 54zM1792 640q0 -96 -1 -150t-8.5 -136.5t-22.5 -147.5q-16 -73 -69 -123t-124 -58q-222 -25 -671 -25t-671 25q-71 8 -124.5 58t-69.5 123 q-14 65 -21.5 147.5t-8.5 136.5t-1 150t1 150t8.5 136.5t22.5 147.5q16 73 69 123t124 58q222 25 671 25t671 -25q71 -8 124.5 -58t69.5 -123q14 -65 21.5 -147.5t8.5 -136.5t1 -150z" />
-<glyph unicode="&#xf16b;" horiz-adv-x="1792" d="M402 829l494 -305l-342 -285l-490 319zM1388 274v-108l-490 -293v-1l-1 1l-1 -1v1l-489 293v108l147 -96l342 284v2l1 -1l1 1v-2l343 -284zM554 1418l342 -285l-494 -304l-338 270zM1390 829l338 -271l-489 -319l-343 285zM1239 1418l489 -319l-338 -270l-494 304z" />
-<glyph unicode="&#xf16c;" horiz-adv-x="1408" d="M928 135v-151l-707 -1v151zM1169 481v-701l-1 -35v-1h-1132l-35 1h-1v736h121v-618h928v618h120zM241 393l704 -65l-13 -150l-705 65zM309 709l683 -183l-39 -146l-683 183zM472 1058l609 -360l-77 -130l-609 360zM832 1389l398 -585l-124 -85l-399 584zM1285 1536 l121 -697l-149 -26l-121 697z" />
-<glyph unicode="&#xf16d;" d="M1362 110v648h-135q20 -63 20 -131q0 -126 -64 -232.5t-174 -168.5t-240 -62q-197 0 -337 135.5t-140 327.5q0 68 20 131h-141v-648q0 -26 17.5 -43.5t43.5 -17.5h1069q25 0 43 17.5t18 43.5zM1078 643q0 124 -90.5 211.5t-218.5 87.5q-127 0 -217.5 -87.5t-90.5 -211.5 t90.5 -211.5t217.5 -87.5q128 0 218.5 87.5t90.5 211.5zM1362 1003v165q0 28 -20 48.5t-49 20.5h-174q-29 0 -49 -20.5t-20 -48.5v-165q0 -29 20 -49t49 -20h174q29 0 49 20t20 49zM1536 1211v-1142q0 -81 -58 -139t-139 -58h-1142q-81 0 -139 58t-58 139v1142q0 81 58 139 t139 58h1142q81 0 139 -58t58 -139z" />
-<glyph unicode="&#xf16e;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM698 640q0 88 -62 150t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150zM1262 640q0 88 -62 150 t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150z" />
-<glyph unicode="&#xf170;" d="M768 914l201 -306h-402zM1133 384h94l-459 691l-459 -691h94l104 160h522zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf171;" horiz-adv-x="1408" d="M815 677q8 -63 -50.5 -101t-111.5 -6q-39 17 -53.5 58t-0.5 82t52 58q36 18 72.5 12t64 -35.5t27.5 -67.5zM926 698q-14 107 -113 164t-197 13q-63 -28 -100.5 -88.5t-34.5 -129.5q4 -91 77.5 -155t165.5 -56q91 8 152 84t50 168zM1165 1240q-20 27 -56 44.5t-58 22 t-71 12.5q-291 47 -566 -2q-43 -7 -66 -12t-55 -22t-50 -43q30 -28 76 -45.5t73.5 -22t87.5 -11.5q228 -29 448 -1q63 8 89.5 12t72.5 21.5t75 46.5zM1222 205q-8 -26 -15.5 -76.5t-14 -84t-28.5 -70t-58 -56.5q-86 -48 -189.5 -71.5t-202 -22t-201.5 18.5q-46 8 -81.5 18 t-76.5 27t-73 43.5t-52 61.5q-25 96 -57 292l6 16l18 9q223 -148 506.5 -148t507.5 148q21 -6 24 -23t-5 -45t-8 -37zM1403 1166q-26 -167 -111 -655q-5 -30 -27 -56t-43.5 -40t-54.5 -31q-252 -126 -610 -88q-248 27 -394 139q-15 12 -25.5 26.5t-17 35t-9 34t-6 39.5 t-5.5 35q-9 50 -26.5 150t-28 161.5t-23.5 147.5t-22 158q3 26 17.5 48.5t31.5 37.5t45 30t46 22.5t48 18.5q125 46 313 64q379 37 676 -50q155 -46 215 -122q16 -20 16.5 -51t-5.5 -54z" />
-<glyph unicode="&#xf172;" d="M848 666q0 43 -41 66t-77 1q-43 -20 -42.5 -72.5t43.5 -70.5q39 -23 81 4t36 72zM928 682q8 -66 -36 -121t-110 -61t-119 40t-56 113q-2 49 25.5 93t72.5 64q70 31 141.5 -10t81.5 -118zM1100 1073q-20 -21 -53.5 -34t-53 -16t-63.5 -8q-155 -20 -324 0q-44 6 -63 9.5 t-52.5 16t-54.5 32.5q13 19 36 31t40 15.5t47 8.5q198 35 408 1q33 -5 51 -8.5t43 -16t39 -31.5zM1142 327q0 7 5.5 26.5t3 32t-17.5 16.5q-161 -106 -365 -106t-366 106l-12 -6l-5 -12q26 -154 41 -210q47 -81 204 -108q249 -46 428 53q34 19 49 51.5t22.5 85.5t12.5 71z M1272 1020q9 53 -8 75q-43 55 -155 88q-216 63 -487 36q-132 -12 -226 -46q-38 -15 -59.5 -25t-47 -34t-29.5 -54q8 -68 19 -138t29 -171t24 -137q1 -5 5 -31t7 -36t12 -27t22 -28q105 -80 284 -100q259 -28 440 63q24 13 39.5 23t31 29t19.5 40q48 267 80 473zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf173;" horiz-adv-x="1024" d="M390 1408h219v-388h364v-241h-364v-394q0 -136 14 -172q13 -37 52 -60q50 -31 117 -31q117 0 232 76v-242q-102 -48 -178 -65q-77 -19 -173 -19q-105 0 -186 27q-78 25 -138 75q-58 51 -79 105q-22 54 -22 161v539h-170v217q91 30 155 84q64 55 103 132q39 78 54 196z " />
-<glyph unicode="&#xf174;" d="M1123 127v181q-88 -56 -174 -56q-51 0 -88 23q-29 17 -39 45q-11 30 -11 129v295h274v181h-274v291h-164q-11 -90 -40 -147t-78 -99q-48 -40 -116 -63v-163h127v-404q0 -78 17 -121q17 -42 59 -78q43 -37 104 -57q62 -20 140 -20q67 0 129 14q57 13 134 49zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf175;" horiz-adv-x="768" d="M765 237q8 -19 -5 -35l-350 -384q-10 -10 -23 -10q-14 0 -24 10l-355 384q-13 16 -5 35q9 19 29 19h224v1248q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1248h224q21 0 29 -19z" />
-<glyph unicode="&#xf176;" horiz-adv-x="768" d="M765 1043q-9 -19 -29 -19h-224v-1248q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1248h-224q-21 0 -29 19t5 35l350 384q10 10 23 10q14 0 24 -10l355 -384q13 -16 5 -35z" />
-<glyph unicode="&#xf177;" horiz-adv-x="1792" d="M1792 736v-192q0 -14 -9 -23t-23 -9h-1248v-224q0 -21 -19 -29t-35 5l-384 350q-10 10 -10 23q0 14 10 24l384 354q16 14 35 6q19 -9 19 -29v-224h1248q14 0 23 -9t9 -23z" />
-<glyph unicode="&#xf178;" horiz-adv-x="1792" d="M1728 643q0 -14 -10 -24l-384 -354q-16 -14 -35 -6q-19 9 -19 29v224h-1248q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h1248v224q0 21 19 29t35 -5l384 -350q10 -10 10 -23z" />
-<glyph unicode="&#xf179;" horiz-adv-x="1408" d="M1393 321q-39 -125 -123 -250q-129 -196 -257 -196q-49 0 -140 32q-86 32 -151 32q-61 0 -142 -33q-81 -34 -132 -34q-152 0 -301 259q-147 261 -147 503q0 228 113 374q112 144 284 144q72 0 177 -30q104 -30 138 -30q45 0 143 34q102 34 173 34q119 0 213 -65 q52 -36 104 -100q-79 -67 -114 -118q-65 -94 -65 -207q0 -124 69 -223t158 -126zM1017 1494q0 -61 -29 -136q-30 -75 -93 -138q-54 -54 -108 -72q-37 -11 -104 -17q3 149 78 257q74 107 250 148q1 -3 2.5 -11t2.5 -11q0 -4 0.5 -10t0.5 -10z" />
-<glyph unicode="&#xf17a;" horiz-adv-x="1664" d="M682 530v-651l-682 94v557h682zM682 1273v-659h-682v565zM1664 530v-786l-907 125v661h907zM1664 1408v-794h-907v669z" />
-<glyph unicode="&#xf17b;" horiz-adv-x="1408" d="M493 1053q16 0 27.5 11.5t11.5 27.5t-11.5 27.5t-27.5 11.5t-27 -11.5t-11 -27.5t11 -27.5t27 -11.5zM915 1053q16 0 27 11.5t11 27.5t-11 27.5t-27 11.5t-27.5 -11.5t-11.5 -27.5t11.5 -27.5t27.5 -11.5zM103 869q42 0 72 -30t30 -72v-430q0 -43 -29.5 -73t-72.5 -30 t-73 30t-30 73v430q0 42 30 72t73 30zM1163 850v-666q0 -46 -32 -78t-77 -32h-75v-227q0 -43 -30 -73t-73 -30t-73 30t-30 73v227h-138v-227q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73l-1 227h-74q-46 0 -78 32t-32 78v666h918zM931 1255q107 -55 171 -153.5t64 -215.5 h-925q0 117 64 215.5t172 153.5l-71 131q-7 13 5 20q13 6 20 -6l72 -132q95 42 201 42t201 -42l72 132q7 12 20 6q12 -7 5 -20zM1408 767v-430q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73v430q0 43 30 72.5t72 29.5q43 0 73 -29.5t30 -72.5z" />
-<glyph unicode="&#xf17c;" d="M663 1125q-11 -1 -15.5 -10.5t-8.5 -9.5q-5 -1 -5 5q0 12 19 15h10zM750 1111q-4 -1 -11.5 6.5t-17.5 4.5q24 11 32 -2q3 -6 -3 -9zM399 684q-4 1 -6 -3t-4.5 -12.5t-5.5 -13.5t-10 -13q-7 -10 -1 -12q4 -1 12.5 7t12.5 18q1 3 2 7t2 6t1.5 4.5t0.5 4v3t-1 2.5t-3 2z M1254 325q0 18 -55 42q4 15 7.5 27.5t5 26t3 21.5t0.5 22.5t-1 19.5t-3.5 22t-4 20.5t-5 25t-5.5 26.5q-10 48 -47 103t-72 75q24 -20 57 -83q87 -162 54 -278q-11 -40 -50 -42q-31 -4 -38.5 18.5t-8 83.5t-11.5 107q-9 39 -19.5 69t-19.5 45.5t-15.5 24.5t-13 15t-7.5 7 q-14 62 -31 103t-29.5 56t-23.5 33t-15 40q-4 21 6 53.5t4.5 49.5t-44.5 25q-15 3 -44.5 18t-35.5 16q-8 1 -11 26t8 51t36 27q37 3 51 -30t4 -58q-11 -19 -2 -26.5t30 -0.5q13 4 13 36v37q-5 30 -13.5 50t-21 30.5t-23.5 15t-27 7.5q-107 -8 -89 -134q0 -15 -1 -15 q-9 9 -29.5 10.5t-33 -0.5t-15.5 5q1 57 -16 90t-45 34q-27 1 -41.5 -27.5t-16.5 -59.5q-1 -15 3.5 -37t13 -37.5t15.5 -13.5q10 3 16 14q4 9 -7 8q-7 0 -15.5 14.5t-9.5 33.5q-1 22 9 37t34 14q17 0 27 -21t9.5 -39t-1.5 -22q-22 -15 -31 -29q-8 -12 -27.5 -23.5 t-20.5 -12.5q-13 -14 -15.5 -27t7.5 -18q14 -8 25 -19.5t16 -19t18.5 -13t35.5 -6.5q47 -2 102 15q2 1 23 7t34.5 10.5t29.5 13t21 17.5q9 14 20 8q5 -3 6.5 -8.5t-3 -12t-16.5 -9.5q-20 -6 -56.5 -21.5t-45.5 -19.5q-44 -19 -70 -23q-25 -5 -79 2q-10 2 -9 -2t17 -19 q25 -23 67 -22q17 1 36 7t36 14t33.5 17.5t30 17t24.5 12t17.5 2.5t8.5 -11q0 -2 -1 -4.5t-4 -5t-6 -4.5t-8.5 -5t-9 -4.5t-10 -5t-9.5 -4.5q-28 -14 -67.5 -44t-66.5 -43t-49 -1q-21 11 -63 73q-22 31 -25 22q-1 -3 -1 -10q0 -25 -15 -56.5t-29.5 -55.5t-21 -58t11.5 -63 q-23 -6 -62.5 -90t-47.5 -141q-2 -18 -1.5 -69t-5.5 -59q-8 -24 -29 -3q-32 31 -36 94q-2 28 4 56q4 19 -1 18l-4 -5q-36 -65 10 -166q5 -12 25 -28t24 -20q20 -23 104 -90.5t93 -76.5q16 -15 17.5 -38t-14 -43t-45.5 -23q8 -15 29 -44.5t28 -54t7 -70.5q46 24 7 92 q-4 8 -10.5 16t-9.5 12t-2 6q3 5 13 9.5t20 -2.5q46 -52 166 -36q133 15 177 87q23 38 34 30q12 -6 10 -52q-1 -25 -23 -92q-9 -23 -6 -37.5t24 -15.5q3 19 14.5 77t13.5 90q2 21 -6.5 73.5t-7.5 97t23 70.5q15 18 51 18q1 37 34.5 53t72.5 10.5t60 -22.5zM626 1152 q3 17 -2.5 30t-11.5 15q-9 2 -9 -7q2 -5 5 -6q10 0 7 -15q-3 -20 8 -20q3 0 3 3zM1045 955q-2 8 -6.5 11.5t-13 5t-14.5 5.5q-5 3 -9.5 8t-7 8t-5.5 6.5t-4 4t-4 -1.5q-14 -16 7 -43.5t39 -31.5q9 -1 14.5 8t3.5 20zM867 1168q0 11 -5 19.5t-11 12.5t-9 3q-14 -1 -7 -7l4 -2 q14 -4 18 -31q0 -3 8 2zM921 1401q0 2 -2.5 5t-9 7t-9.5 6q-15 15 -24 15q-9 -1 -11.5 -7.5t-1 -13t-0.5 -12.5q-1 -4 -6 -10.5t-6 -9t3 -8.5q4 -3 8 0t11 9t15 9q1 1 9 1t15 2t9 7zM1486 60q20 -12 31 -24.5t12 -24t-2.5 -22.5t-15.5 -22t-23.5 -19.5t-30 -18.5 t-31.5 -16.5t-32 -15.5t-27 -13q-38 -19 -85.5 -56t-75.5 -64q-17 -16 -68 -19.5t-89 14.5q-18 9 -29.5 23.5t-16.5 25.5t-22 19.5t-47 9.5q-44 1 -130 1q-19 0 -57 -1.5t-58 -2.5q-44 -1 -79.5 -15t-53.5 -30t-43.5 -28.5t-53.5 -11.5q-29 1 -111 31t-146 43q-19 4 -51 9.5 t-50 9t-39.5 9.5t-33.5 14.5t-17 19.5q-10 23 7 66.5t18 54.5q1 16 -4 40t-10 42.5t-4.5 36.5t10.5 27q14 12 57 14t60 12q30 18 42 35t12 51q21 -73 -32 -106q-32 -20 -83 -15q-34 3 -43 -10q-13 -15 5 -57q2 -6 8 -18t8.5 -18t4.5 -17t1 -22q0 -15 -17 -49t-14 -48 q3 -17 37 -26q20 -6 84.5 -18.5t99.5 -20.5q24 -6 74 -22t82.5 -23t55.5 -4q43 6 64.5 28t23 48t-7.5 58.5t-19 52t-20 36.5q-121 190 -169 242q-68 74 -113 40q-11 -9 -15 15q-3 16 -2 38q1 29 10 52t24 47t22 42q8 21 26.5 72t29.5 78t30 61t39 54q110 143 124 195 q-12 112 -16 310q-2 90 24 151.5t106 104.5q39 21 104 21q53 1 106 -13.5t89 -41.5q57 -42 91.5 -121.5t29.5 -147.5q-5 -95 30 -214q34 -113 133 -218q55 -59 99.5 -163t59.5 -191q8 -49 5 -84.5t-12 -55.5t-20 -22q-10 -2 -23.5 -19t-27 -35.5t-40.5 -33.5t-61 -14 q-18 1 -31.5 5t-22.5 13.5t-13.5 15.5t-11.5 20.5t-9 19.5q-22 37 -41 30t-28 -49t7 -97q20 -70 1 -195q-10 -65 18 -100.5t73 -33t85 35.5q59 49 89.5 66.5t103.5 42.5q53 18 77 36.5t18.5 34.5t-25 28.5t-51.5 23.5q-33 11 -49.5 48t-15 72.5t15.5 47.5q1 -31 8 -56.5 t14.5 -40.5t20.5 -28.5t21 -19t21.5 -13t16.5 -9.5z" />
-<glyph unicode="&#xf17d;" d="M1024 36q-42 241 -140 498h-2l-2 -1q-16 -6 -43 -16.5t-101 -49t-137 -82t-131 -114.5t-103 -148l-15 11q184 -150 418 -150q132 0 256 52zM839 643q-21 49 -53 111q-311 -93 -673 -93q-1 -7 -1 -21q0 -124 44 -236.5t124 -201.5q50 89 123.5 166.5t142.5 124.5t130.5 81 t99.5 48l37 13q4 1 13 3.5t13 4.5zM732 855q-120 213 -244 378q-138 -65 -234 -186t-128 -272q302 0 606 80zM1416 536q-210 60 -409 29q87 -239 128 -469q111 75 185 189.5t96 250.5zM611 1277q-1 0 -2 -1q1 1 2 1zM1201 1132q-185 164 -433 164q-76 0 -155 -19 q131 -170 246 -382q69 26 130 60.5t96.5 61.5t65.5 57t37.5 40.5zM1424 647q-3 232 -149 410l-1 -1q-9 -12 -19 -24.5t-43.5 -44.5t-71 -60.5t-100 -65t-131.5 -64.5q25 -53 44 -95q2 -6 6.5 -17.5t7.5 -16.5q36 5 74.5 7t73.5 2t69 -1.5t64 -4t56.5 -5.5t48 -6.5t36.5 -6 t25 -4.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf17e;" d="M1173 473q0 50 -19.5 91.5t-48.5 68.5t-73 49t-82.5 34t-87.5 23l-104 24q-30 7 -44 10.5t-35 11.5t-30 16t-16.5 21t-7.5 30q0 77 144 77q43 0 77 -12t54 -28.5t38 -33.5t40 -29t48 -12q47 0 75.5 32t28.5 77q0 55 -56 99.5t-142 67.5t-182 23q-68 0 -132 -15.5 t-119.5 -47t-89 -87t-33.5 -128.5q0 -61 19 -106.5t56 -75.5t80 -48.5t103 -32.5l146 -36q90 -22 112 -36q32 -20 32 -60q0 -39 -40 -64.5t-105 -25.5q-51 0 -91.5 16t-65 38.5t-45.5 45t-46 38.5t-54 16q-50 0 -75.5 -30t-25.5 -75q0 -92 122 -157.5t291 -65.5 q73 0 140 18.5t122.5 53.5t88.5 93.5t33 131.5zM1536 256q0 -159 -112.5 -271.5t-271.5 -112.5q-130 0 -234 80q-77 -16 -150 -16q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5q0 73 16 150q-80 104 -80 234q0 159 112.5 271.5t271.5 112.5q130 0 234 -80 q77 16 150 16q143 0 273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -73 -16 -150q80 -104 80 -234z" />
-<glyph unicode="&#xf180;" horiz-adv-x="1664" d="M1483 512l-587 -587q-52 -53 -127.5 -53t-128.5 53l-587 587q-53 53 -53 128t53 128l587 587q53 53 128 53t128 -53l265 -265l-398 -399l-188 188q-42 42 -99 42q-59 0 -100 -41l-120 -121q-42 -40 -42 -99q0 -58 42 -100l406 -408q30 -28 67 -37l6 -4h28q60 0 99 41 l619 619l2 -3q53 -53 53 -128t-53 -128zM1406 1138l120 -120q14 -15 14 -36t-14 -36l-730 -730q-17 -15 -37 -15v0q-4 0 -6 1q-18 2 -30 14l-407 408q-14 15 -14 36t14 35l121 120q13 15 35 15t36 -15l252 -252l574 575q15 15 36 15t36 -15z" />
-<glyph unicode="&#xf181;" d="M704 192v1024q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-1024q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1376 576v640q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-640q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408 q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf182;" horiz-adv-x="1280" d="M1280 480q0 -40 -28 -68t-68 -28q-51 0 -80 43l-227 341h-45v-132l247 -411q9 -15 9 -33q0 -26 -19 -45t-45 -19h-192v-272q0 -46 -33 -79t-79 -33h-160q-46 0 -79 33t-33 79v272h-192q-26 0 -45 19t-19 45q0 18 9 33l247 411v132h-45l-227 -341q-29 -43 -80 -43 q-40 0 -68 28t-28 68q0 29 16 53l256 384q73 107 176 107h384q103 0 176 -107l256 -384q16 -24 16 -53zM864 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
-<glyph unicode="&#xf183;" horiz-adv-x="1024" d="M1024 832v-416q0 -40 -28 -68t-68 -28t-68 28t-28 68v352h-64v-912q0 -46 -33 -79t-79 -33t-79 33t-33 79v464h-64v-464q0 -46 -33 -79t-79 -33t-79 33t-33 79v912h-64v-352q0 -40 -28 -68t-68 -28t-68 28t-28 68v416q0 80 56 136t136 56h640q80 0 136 -56t56 -136z M736 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
-<glyph unicode="&#xf184;" d="M773 234l350 473q16 22 24.5 59t-6 85t-61.5 79q-40 26 -83 25.5t-73.5 -17.5t-54.5 -45q-36 -40 -96 -40q-59 0 -95 40q-24 28 -54.5 45t-73.5 17.5t-84 -25.5q-46 -31 -60.5 -79t-6 -85t24.5 -59zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf185;" horiz-adv-x="1792" d="M1472 640q0 117 -45.5 223.5t-123 184t-184 123t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5t45.5 -223.5t123 -184t184 -123t223.5 -45.5t223.5 45.5t184 123t123 184t45.5 223.5zM1748 363q-4 -15 -20 -20l-292 -96v-306q0 -16 -13 -26q-15 -10 -29 -4 l-292 94l-180 -248q-10 -13 -26 -13t-26 13l-180 248l-292 -94q-14 -6 -29 4q-13 10 -13 26v306l-292 96q-16 5 -20 20q-5 17 4 29l180 248l-180 248q-9 13 -4 29q4 15 20 20l292 96v306q0 16 13 26q15 10 29 4l292 -94l180 248q9 12 26 12t26 -12l180 -248l292 94 q14 6 29 -4q13 -10 13 -26v-306l292 -96q16 -5 20 -20q5 -16 -4 -29l-180 -248l180 -248q9 -12 4 -29z" />
-<glyph unicode="&#xf186;" d="M1262 233q-54 -9 -110 -9q-182 0 -337 90t-245 245t-90 337q0 192 104 357q-201 -60 -328.5 -229t-127.5 -384q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51q144 0 273.5 61.5t220.5 171.5zM1465 318q-94 -203 -283.5 -324.5t-413.5 -121.5q-156 0 -298 61 t-245 164t-164 245t-61 298q0 153 57.5 292.5t156 241.5t235.5 164.5t290 68.5q44 2 61 -39q18 -41 -15 -72q-86 -78 -131.5 -181.5t-45.5 -218.5q0 -148 73 -273t198 -198t273 -73q118 0 228 51q41 18 72 -13q14 -14 17.5 -34t-4.5 -38z" />
-<glyph unicode="&#xf187;" horiz-adv-x="1792" d="M1088 704q0 26 -19 45t-45 19h-256q-26 0 -45 -19t-19 -45t19 -45t45 -19h256q26 0 45 19t19 45zM1664 896v-960q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v960q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1728 1344v-256q0 -26 -19 -45t-45 -19h-1536 q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1536q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf188;" horiz-adv-x="1664" d="M1632 576q0 -26 -19 -45t-45 -19h-224q0 -171 -67 -290l208 -209q19 -19 19 -45t-19 -45q-18 -19 -45 -19t-45 19l-198 197q-5 -5 -15 -13t-42 -28.5t-65 -36.5t-82 -29t-97 -13v896h-128v-896q-51 0 -101.5 13.5t-87 33t-66 39t-43.5 32.5l-15 14l-183 -207 q-20 -21 -48 -21q-24 0 -43 16q-19 18 -20.5 44.5t15.5 46.5l202 227q-58 114 -58 274h-224q-26 0 -45 19t-19 45t19 45t45 19h224v294l-173 173q-19 19 -19 45t19 45t45 19t45 -19l173 -173h844l173 173q19 19 45 19t45 -19t19 -45t-19 -45l-173 -173v-294h224q26 0 45 -19 t19 -45zM1152 1152h-640q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5z" />
-<glyph unicode="&#xf189;" horiz-adv-x="1920" d="M1917 1016q23 -64 -150 -294q-24 -32 -65 -85q-78 -100 -90 -131q-17 -41 14 -81q17 -21 81 -82h1l1 -1l1 -1l2 -2q141 -131 191 -221q3 -5 6.5 -12.5t7 -26.5t-0.5 -34t-25 -27.5t-59 -12.5l-256 -4q-24 -5 -56 5t-52 22l-20 12q-30 21 -70 64t-68.5 77.5t-61 58 t-56.5 15.5q-3 -1 -8 -3.5t-17 -14.5t-21.5 -29.5t-17 -52t-6.5 -77.5q0 -15 -3.5 -27.5t-7.5 -18.5l-4 -5q-18 -19 -53 -22h-115q-71 -4 -146 16.5t-131.5 53t-103 66t-70.5 57.5l-25 24q-10 10 -27.5 30t-71.5 91t-106 151t-122.5 211t-130.5 272q-6 16 -6 27t3 16l4 6 q15 19 57 19l274 2q12 -2 23 -6.5t16 -8.5l5 -3q16 -11 24 -32q20 -50 46 -103.5t41 -81.5l16 -29q29 -60 56 -104t48.5 -68.5t41.5 -38.5t34 -14t27 5q2 1 5 5t12 22t13.5 47t9.5 81t0 125q-2 40 -9 73t-14 46l-6 12q-25 34 -85 43q-13 2 5 24q17 19 38 30q53 26 239 24 q82 -1 135 -13q20 -5 33.5 -13.5t20.5 -24t10.5 -32t3.5 -45.5t-1 -55t-2.5 -70.5t-1.5 -82.5q0 -11 -1 -42t-0.5 -48t3.5 -40.5t11.5 -39t22.5 -24.5q8 -2 17 -4t26 11t38 34.5t52 67t68 107.5q60 104 107 225q4 10 10 17.5t11 10.5l4 3l5 2.5t13 3t20 0.5l288 2 q39 5 64 -2.5t31 -16.5z" />
-<glyph unicode="&#xf18a;" horiz-adv-x="1792" d="M675 252q21 34 11 69t-45 50q-34 14 -73 1t-60 -46q-22 -34 -13 -68.5t43 -50.5t74.5 -2.5t62.5 47.5zM769 373q8 13 3.5 26.5t-17.5 18.5q-14 5 -28.5 -0.5t-21.5 -18.5q-17 -31 13 -45q14 -5 29 0.5t22 18.5zM943 266q-45 -102 -158 -150t-224 -12 q-107 34 -147.5 126.5t6.5 187.5q47 93 151.5 139t210.5 19q111 -29 158.5 -119.5t2.5 -190.5zM1255 426q-9 96 -89 170t-208.5 109t-274.5 21q-223 -23 -369.5 -141.5t-132.5 -264.5q9 -96 89 -170t208.5 -109t274.5 -21q223 23 369.5 141.5t132.5 264.5zM1563 422 q0 -68 -37 -139.5t-109 -137t-168.5 -117.5t-226 -83t-270.5 -31t-275 33.5t-240.5 93t-171.5 151t-65 199.5q0 115 69.5 245t197.5 258q169 169 341.5 236t246.5 -7q65 -64 20 -209q-4 -14 -1 -20t10 -7t14.5 0.5t13.5 3.5l6 2q139 59 246 59t153 -61q45 -63 0 -178 q-2 -13 -4.5 -20t4.5 -12.5t12 -7.5t17 -6q57 -18 103 -47t80 -81.5t34 -116.5zM1489 1046q42 -47 54.5 -108.5t-6.5 -117.5q-8 -23 -29.5 -34t-44.5 -4q-23 8 -34 29.5t-4 44.5q20 63 -24 111t-107 35q-24 -5 -45 8t-25 37q-5 24 8 44.5t37 25.5q60 13 119 -5.5t101 -65.5z M1670 1209q87 -96 112.5 -222.5t-13.5 -241.5q-9 -27 -34 -40t-52 -4t-40 34t-5 52q28 82 10 172t-80 158q-62 69 -148 95.5t-173 8.5q-28 -6 -52 9.5t-30 43.5t9.5 51.5t43.5 29.5q123 26 244 -11.5t208 -134.5z" />
-<glyph unicode="&#xf18b;" d="M1133 -34q-171 -94 -368 -94q-196 0 -367 94q138 87 235.5 211t131.5 268q35 -144 132.5 -268t235.5 -211zM638 1394v-485q0 -252 -126.5 -459.5t-330.5 -306.5q-181 215 -181 495q0 187 83.5 349.5t229.5 269.5t325 137zM1536 638q0 -280 -181 -495 q-204 99 -330.5 306.5t-126.5 459.5v485q179 -30 325 -137t229.5 -269.5t83.5 -349.5z" />
-<glyph unicode="&#xf18c;" horiz-adv-x="1408" d="M1402 433q-32 -80 -76 -138t-91 -88.5t-99 -46.5t-101.5 -14.5t-96.5 8.5t-86.5 22t-69.5 27.5t-46 22.5l-17 10q-113 -228 -289.5 -359.5t-384.5 -132.5q-19 0 -32 13t-13 32t13 31.5t32 12.5q173 1 322.5 107.5t251.5 294.5q-36 -14 -72 -23t-83 -13t-91 2.5t-93 28.5 t-92 59t-84.5 100t-74.5 146q114 47 214 57t167.5 -7.5t124.5 -56.5t88.5 -77t56.5 -82q53 131 79 291q-7 -1 -18 -2.5t-46.5 -2.5t-69.5 0.5t-81.5 10t-88.5 23t-84 42.5t-75 65t-54.5 94.5t-28.5 127.5q70 28 133.5 36.5t112.5 -1t92 -30t73.5 -50t56 -61t42 -63t27.5 -56 t16 -39.5l4 -16q12 122 12 195q-8 6 -21.5 16t-49 44.5t-63.5 71.5t-54 93t-33 112.5t12 127t70 138.5q73 -25 127.5 -61.5t84.5 -76.5t48 -85t20.5 -89t-0.5 -85.5t-13 -76.5t-19 -62t-17 -42l-7 -15q1 -5 1 -50.5t-1 -71.5q3 7 10 18.5t30.5 43t50.5 58t71 55.5t91.5 44.5 t112 14.5t132.5 -24q-2 -78 -21.5 -141.5t-50 -104.5t-69.5 -71.5t-81.5 -45.5t-84.5 -24t-80 -9.5t-67.5 1t-46.5 4.5l-17 3q-23 -147 -73 -283q6 7 18 18.5t49.5 41t77.5 52.5t99.5 42t117.5 20t129 -23.5t137 -77.5z" />
-<glyph unicode="&#xf18d;" horiz-adv-x="1280" d="M1259 283v-66q0 -85 -57.5 -144.5t-138.5 -59.5h-57l-260 -269v269h-529q-81 0 -138.5 59.5t-57.5 144.5v66h1238zM1259 609v-255h-1238v255h1238zM1259 937v-255h-1238v255h1238zM1259 1077v-67h-1238v67q0 84 57.5 143.5t138.5 59.5h846q81 0 138.5 -59.5t57.5 -143.5z " />
-<glyph unicode="&#xf18e;" d="M1152 640q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf190;" d="M1152 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-192q0 -14 -9 -23t-23 -9q-12 0 -24 10l-319 319q-9 9 -9 23t9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h352q13 0 22.5 -9.5t9.5 -22.5zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf191;" d="M1024 960v-640q0 -26 -19 -45t-45 -19q-20 0 -37 12l-448 320q-27 19 -27 52t27 52l448 320q17 12 37 12q26 0 45 -19t19 -45zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5z M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf192;" d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5 t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf193;" horiz-adv-x="1664" d="M1023 349l102 -204q-58 -179 -210 -290t-339 -111q-156 0 -288.5 77.5t-210 210t-77.5 288.5q0 181 104.5 330t274.5 211l17 -131q-122 -54 -195 -165.5t-73 -244.5q0 -185 131.5 -316.5t316.5 -131.5q126 0 232.5 65t165 175.5t49.5 236.5zM1571 249l58 -114l-256 -128 q-13 -7 -29 -7q-40 0 -57 35l-239 477h-472q-24 0 -42.5 16.5t-21.5 40.5l-96 779q-2 16 6 42q14 51 57 82.5t97 31.5q66 0 113 -47t47 -113q0 -69 -52 -117.5t-120 -41.5l37 -289h423v-128h-407l16 -128h455q40 0 57 -35l228 -455z" />
-<glyph unicode="&#xf194;" d="M1254 899q16 85 -21 132q-52 65 -187 45q-17 -3 -41 -12.5t-57.5 -30.5t-64.5 -48.5t-59.5 -70t-44.5 -91.5q80 7 113.5 -16t26.5 -99q-5 -52 -52 -143q-43 -78 -71 -99q-44 -32 -87 14q-23 24 -37.5 64.5t-19 73t-10 84t-8.5 71.5q-23 129 -34 164q-12 37 -35.5 69 t-50.5 40q-57 16 -127 -25q-54 -32 -136.5 -106t-122.5 -102v-7q16 -8 25.5 -26t21.5 -20q21 -3 54.5 8.5t58 10.5t41.5 -30q11 -18 18.5 -38.5t15 -48t12.5 -40.5q17 -46 53 -187q36 -146 57 -197q42 -99 103 -125q43 -12 85 -1.5t76 31.5q131 77 250 237 q104 139 172.5 292.5t82.5 226.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf195;" horiz-adv-x="1152" d="M1152 704q0 -191 -94.5 -353t-256.5 -256.5t-353 -94.5h-160q-14 0 -23 9t-9 23v611l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v93l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v250q0 14 9 23t23 9h160 q14 0 23 -9t9 -23v-181l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-93l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-487q188 13 318 151t130 328q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" />
-<glyph unicode="&#xf196;" horiz-adv-x="1408" d="M1152 736v-64q0 -14 -9 -23t-23 -9h-352v-352q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v352h-352q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h352v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-352h352q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832 q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf197;" horiz-adv-x="1792" />
-<glyph unicode="&#xf198;" horiz-adv-x="1792" />
-<glyph unicode="&#xf199;" horiz-adv-x="1792" />
-<glyph unicode="&#xf19a;" horiz-adv-x="1792" />
-<glyph unicode="&#xf19b;" horiz-adv-x="1792" />
-<glyph unicode="&#xf19c;" horiz-adv-x="1792" />
-<glyph unicode="&#xf19d;" horiz-adv-x="1792" />
-<glyph unicode="&#xf19e;" horiz-adv-x="1792" />
-<glyph unicode="&#xf500;" horiz-adv-x="1792" />
-</font>
-</defs></svg> \ No newline at end of file
diff --git a/docs/theme/mkdocs/fonts/fontawesome-webfont.ttf b/docs/theme/mkdocs/fonts/fontawesome-webfont.ttf
deleted file mode 100755
index e89738de5e..0000000000
--- a/docs/theme/mkdocs/fonts/fontawesome-webfont.ttf
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/fonts/fontawesome-webfont.woff b/docs/theme/mkdocs/fonts/fontawesome-webfont.woff
deleted file mode 100755
index 8c1748aab7..0000000000
--- a/docs/theme/mkdocs/fonts/fontawesome-webfont.woff
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/fonts/glyphicons-halflings-regular.eot b/docs/theme/mkdocs/fonts/glyphicons-halflings-regular.eot
deleted file mode 100644
index 4a4ca865d6..0000000000
--- a/docs/theme/mkdocs/fonts/glyphicons-halflings-regular.eot
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/fonts/glyphicons-halflings-regular.svg b/docs/theme/mkdocs/fonts/glyphicons-halflings-regular.svg
deleted file mode 100644
index e3e2dc739d..0000000000
--- a/docs/theme/mkdocs/fonts/glyphicons-halflings-regular.svg
+++ /dev/null
@@ -1,229 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
-<svg xmlns="http://www.w3.org/2000/svg">
-<metadata></metadata>
-<defs>
-<font id="glyphicons_halflingsregular" horiz-adv-x="1200" >
-<font-face units-per-em="1200" ascent="960" descent="-240" />
-<missing-glyph horiz-adv-x="500" />
-<glyph />
-<glyph />
-<glyph unicode="&#xd;" />
-<glyph unicode=" " />
-<glyph unicode="*" d="M100 500v200h259l-183 183l141 141l183 -183v259h200v-259l183 183l141 -141l-183 -183h259v-200h-259l183 -183l-141 -141l-183 183v-259h-200v259l-183 -183l-141 141l183 183h-259z" />
-<glyph unicode="+" d="M0 400v300h400v400h300v-400h400v-300h-400v-400h-300v400h-400z" />
-<glyph unicode="&#xa0;" />
-<glyph unicode="&#x2000;" horiz-adv-x="652" />
-<glyph unicode="&#x2001;" horiz-adv-x="1304" />
-<glyph unicode="&#x2002;" horiz-adv-x="652" />
-<glyph unicode="&#x2003;" horiz-adv-x="1304" />
-<glyph unicode="&#x2004;" horiz-adv-x="434" />
-<glyph unicode="&#x2005;" horiz-adv-x="326" />
-<glyph unicode="&#x2006;" horiz-adv-x="217" />
-<glyph unicode="&#x2007;" horiz-adv-x="217" />
-<glyph unicode="&#x2008;" horiz-adv-x="163" />
-<glyph unicode="&#x2009;" horiz-adv-x="260" />
-<glyph unicode="&#x200a;" horiz-adv-x="72" />
-<glyph unicode="&#x202f;" horiz-adv-x="260" />
-<glyph unicode="&#x205f;" horiz-adv-x="326" />
-<glyph unicode="&#x20ac;" d="M100 500l100 100h113q0 47 5 100h-218l100 100h135q37 167 112 257q117 141 297 141q242 0 354 -189q60 -103 66 -209h-181q0 55 -25.5 99t-63.5 68t-75 36.5t-67 12.5q-24 0 -52.5 -10t-62.5 -32t-65.5 -67t-50.5 -107h379l-100 -100h-300q-6 -46 -6 -100h406l-100 -100 h-300q9 -74 33 -132t52.5 -91t62 -54.5t59 -29t46.5 -7.5q29 0 66 13t75 37t63.5 67.5t25.5 96.5h174q-31 -172 -128 -278q-107 -117 -274 -117q-205 0 -324 158q-36 46 -69 131.5t-45 205.5h-217z" />
-<glyph unicode="&#x2212;" d="M200 400h900v300h-900v-300z" />
-<glyph unicode="&#x25fc;" horiz-adv-x="500" d="M0 0z" />
-<glyph unicode="&#x2601;" d="M-14 494q0 -80 56.5 -137t135.5 -57h750q120 0 205 86.5t85 207.5t-85 207t-205 86q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5z" />
-<glyph unicode="&#x2709;" d="M0 100l400 400l200 -200l200 200l400 -400h-1200zM0 300v600l300 -300zM0 1100l600 -603l600 603h-1200zM900 600l300 300v-600z" />
-<glyph unicode="&#x270f;" d="M-13 -13l333 112l-223 223zM187 403l214 -214l614 614l-214 214zM887 1103l214 -214l99 92q13 13 13 32.5t-13 33.5l-153 153q-15 13 -33 13t-33 -13z" />
-<glyph unicode="&#xe001;" d="M0 1200h1200l-500 -550v-550h300v-100h-800v100h300v550z" />
-<glyph unicode="&#xe002;" d="M14 84q18 -55 86 -75.5t147 5.5q65 21 109 69t44 90v606l600 155v-521q-64 16 -138 -7q-79 -26 -122.5 -83t-25.5 -111q18 -55 86 -75.5t147 4.5q70 23 111.5 63.5t41.5 95.5v881q0 10 -7 15.5t-17 2.5l-752 -193q-10 -3 -17 -12.5t-7 -19.5v-689q-64 17 -138 -7 q-79 -25 -122.5 -82t-25.5 -112z" />
-<glyph unicode="&#xe003;" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233z" />
-<glyph unicode="&#xe005;" d="M100 784q0 64 28 123t73 100.5t104.5 64t119 20.5t120 -38.5t104.5 -104.5q48 69 109.5 105t121.5 38t118.5 -20.5t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-149.5 152.5t-126.5 127.5 t-94 124.5t-33.5 117.5z" />
-<glyph unicode="&#xe006;" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1z" />
-<glyph unicode="&#xe007;" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1zM237 700l196 -142l-73 -226l192 140l195 -141l-74 229l193 140h-235l-77 211l-78 -211h-239z" />
-<glyph unicode="&#xe008;" d="M0 0v143l400 257v100q-37 0 -68.5 74.5t-31.5 125.5v200q0 124 88 212t212 88t212 -88t88 -212v-200q0 -51 -31.5 -125.5t-68.5 -74.5v-100l400 -257v-143h-1200z" />
-<glyph unicode="&#xe009;" d="M0 0v1100h1200v-1100h-1200zM100 100h100v100h-100v-100zM100 300h100v100h-100v-100zM100 500h100v100h-100v-100zM100 700h100v100h-100v-100zM100 900h100v100h-100v-100zM300 100h600v400h-600v-400zM300 600h600v400h-600v-400zM1000 100h100v100h-100v-100z M1000 300h100v100h-100v-100zM1000 500h100v100h-100v-100zM1000 700h100v100h-100v-100zM1000 900h100v100h-100v-100z" />
-<glyph unicode="&#xe010;" d="M0 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM0 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5zM600 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM600 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5z" />
-<glyph unicode="&#xe011;" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 450v200q0 21 14.5 35.5t35.5 14.5h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5z" />
-<glyph unicode="&#xe012;" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v200q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5 t-14.5 -35.5v-200zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5z" />
-<glyph unicode="&#xe013;" d="M29 454l419 -420l818 820l-212 212l-607 -607l-206 207z" />
-<glyph unicode="&#xe014;" d="M106 318l282 282l-282 282l212 212l282 -282l282 282l212 -212l-282 -282l282 -282l-212 -212l-282 282l-282 -282z" />
-<glyph unicode="&#xe015;" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233zM300 600v200h100v100h200v-100h100v-200h-100v-100h-200v100h-100z" />
-<glyph unicode="&#xe016;" d="M23 694q0 200 142 342t342 142t342 -142t142 -342q0 -141 -78 -262l300 -299q7 -7 7 -18t-7 -18l-109 -109q-8 -8 -18 -8t-18 8l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 694q0 -136 97 -233t234 -97t233.5 97t96.5 233t-96.5 233t-233.5 97t-234 -97 t-97 -233zM300 601h400v200h-400v-200z" />
-<glyph unicode="&#xe017;" d="M23 600q0 183 105 331t272 210v-166q-103 -55 -165 -155t-62 -220q0 -177 125 -302t302 -125t302 125t125 302q0 120 -62 220t-165 155v166q167 -62 272 -210t105 -331q0 -118 -45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5 zM500 750q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v400q0 21 -14.5 35.5t-35.5 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-400z" />
-<glyph unicode="&#xe018;" d="M100 1h200v300h-200v-300zM400 1v500h200v-500h-200zM700 1v800h200v-800h-200zM1000 1v1200h200v-1200h-200z" />
-<glyph unicode="&#xe019;" d="M26 601q0 -33 6 -74l151 -38l2 -6q14 -49 38 -93l3 -5l-80 -134q45 -59 105 -105l133 81l5 -3q45 -26 94 -39l5 -2l38 -151q40 -5 74 -5q27 0 74 5l38 151l6 2q46 13 93 39l5 3l134 -81q56 44 104 105l-80 134l3 5q24 44 39 93l1 6l152 38q5 40 5 74q0 28 -5 73l-152 38 l-1 6q-16 51 -39 93l-3 5l80 134q-44 58 -104 105l-134 -81l-5 3q-45 25 -93 39l-6 1l-38 152q-40 5 -74 5q-27 0 -74 -5l-38 -152l-5 -1q-50 -14 -94 -39l-5 -3l-133 81q-59 -47 -105 -105l80 -134l-3 -5q-25 -47 -38 -93l-2 -6l-151 -38q-6 -48 -6 -73zM385 601 q0 88 63 151t152 63t152 -63t63 -151q0 -89 -63 -152t-152 -63t-152 63t-63 152z" />
-<glyph unicode="&#xe020;" d="M100 1025v50q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-50q0 -11 -7 -18t-18 -7h-1050q-11 0 -18 7t-7 18zM200 100v800h900v-800q0 -41 -29.5 -71t-70.5 -30h-700q-41 0 -70.5 30 t-29.5 71zM300 100h100v700h-100v-700zM500 100h100v700h-100v-700zM500 1100h300v100h-300v-100zM700 100h100v700h-100v-700zM900 100h100v700h-100v-700z" />
-<glyph unicode="&#xe021;" d="M1 601l656 644l644 -644h-200v-600h-300v400h-300v-400h-300v600h-200z" />
-<glyph unicode="&#xe022;" d="M100 25v1150q0 11 7 18t18 7h475v-500h400v-675q0 -11 -7 -18t-18 -7h-850q-11 0 -18 7t-7 18zM700 800v300l300 -300h-300z" />
-<glyph unicode="&#xe023;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 500v400h100 v-300h200v-100h-300z" />
-<glyph unicode="&#xe024;" d="M-100 0l431 1200h209l-21 -300h162l-20 300h208l431 -1200h-538l-41 400h-242l-40 -400h-539zM488 500h224l-27 300h-170z" />
-<glyph unicode="&#xe025;" d="M0 0v400h490l-290 300h200v500h300v-500h200l-290 -300h490v-400h-1100zM813 200h175v100h-175v-100z" />
-<glyph unicode="&#xe026;" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM188 600q0 -170 121 -291t291 -121t291 121t121 291t-121 291t-291 121 t-291 -121t-121 -291zM350 600h150v300h200v-300h150l-250 -300z" />
-<glyph unicode="&#xe027;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM350 600l250 300 l250 -300h-150v-300h-200v300h-150z" />
-<glyph unicode="&#xe028;" d="M0 25v475l200 700h800l199 -700l1 -475q0 -11 -7 -18t-18 -7h-1150q-11 0 -18 7t-7 18zM200 500h200l50 -200h300l50 200h200l-97 500h-606z" />
-<glyph unicode="&#xe029;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 397v401 l297 -200z" />
-<glyph unicode="&#xe030;" d="M23 600q0 -118 45.5 -224.5t123 -184t184 -123t224.5 -45.5t224.5 45.5t184 123t123 184t45.5 224.5h-150q0 -177 -125 -302t-302 -125t-302 125t-125 302t125 302t302 125q136 0 246 -81l-146 -146h400v400l-145 -145q-157 122 -355 122q-118 0 -224.5 -45.5t-184 -123 t-123 -184t-45.5 -224.5z" />
-<glyph unicode="&#xe031;" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5q198 0 355 -122l145 145v-400h-400l147 147q-112 80 -247 80q-177 0 -302 -125t-125 -302h-150zM100 0v400h400l-147 -147q112 -80 247 -80q177 0 302 125t125 302h150q0 -118 -45.5 -224.5t-123 -184t-184 -123 t-224.5 -45.5q-198 0 -355 122z" />
-<glyph unicode="&#xe032;" d="M100 0h1100v1200h-1100v-1200zM200 100v900h900v-900h-900zM300 200v100h100v-100h-100zM300 400v100h100v-100h-100zM300 600v100h100v-100h-100zM300 800v100h100v-100h-100zM500 200h500v100h-500v-100zM500 400v100h500v-100h-500zM500 600v100h500v-100h-500z M500 800v100h500v-100h-500z" />
-<glyph unicode="&#xe033;" d="M0 100v600q0 41 29.5 70.5t70.5 29.5h100v200q0 82 59 141t141 59h300q82 0 141 -59t59 -141v-200h100q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-900q-41 0 -70.5 29.5t-29.5 70.5zM400 800h300v150q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-150z" />
-<glyph unicode="&#xe034;" d="M100 0v1100h100v-1100h-100zM300 400q60 60 127.5 84t127.5 17.5t122 -23t119 -30t110 -11t103 42t91 120.5v500q-40 -81 -101.5 -115.5t-127.5 -29.5t-138 25t-139.5 40t-125.5 25t-103 -29.5t-65 -115.5v-500z" />
-<glyph unicode="&#xe035;" d="M0 275q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 127 70.5 231.5t184.5 161.5t245 57t245 -57t184.5 -161.5t70.5 -231.5v-300q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 116 -49.5 227t-131 192.5t-192.5 131t-227 49.5t-227 -49.5t-192.5 -131t-131 -192.5 t-49.5 -227v-300zM200 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14zM800 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14z" />
-<glyph unicode="&#xe036;" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM688 459l141 141l-141 141l71 71l141 -141l141 141l71 -71l-141 -141l141 -141l-71 -71l-141 141l-141 -141z" />
-<glyph unicode="&#xe037;" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM700 857l69 53q111 -135 111 -310q0 -169 -106 -302l-67 54q86 110 86 248q0 146 -93 257z" />
-<glyph unicode="&#xe038;" d="M0 401v400h300l300 200v-800l-300 200h-300zM702 858l69 53q111 -135 111 -310q0 -170 -106 -303l-67 55q86 110 86 248q0 145 -93 257zM889 951l7 -8q123 -151 123 -344q0 -189 -119 -339l-7 -8l81 -66l6 8q142 178 142 405q0 230 -144 408l-6 8z" />
-<glyph unicode="&#xe039;" d="M0 0h500v500h-200v100h-100v-100h-200v-500zM0 600h100v100h400v100h100v100h-100v300h-500v-600zM100 100v300h300v-300h-300zM100 800v300h300v-300h-300zM200 200v100h100v-100h-100zM200 900h100v100h-100v-100zM500 500v100h300v-300h200v-100h-100v-100h-200v100 h-100v100h100v200h-200zM600 0v100h100v-100h-100zM600 1000h100v-300h200v-300h300v200h-200v100h200v500h-600v-200zM800 800v300h300v-300h-300zM900 0v100h300v-100h-300zM900 900v100h100v-100h-100zM1100 200v100h100v-100h-100z" />
-<glyph unicode="&#xe040;" d="M0 200h100v1000h-100v-1000zM100 0v100h300v-100h-300zM200 200v1000h100v-1000h-100zM500 0v91h100v-91h-100zM500 200v1000h200v-1000h-200zM700 0v91h100v-91h-100zM800 200v1000h100v-1000h-100zM900 0v91h200v-91h-200zM1000 200v1000h200v-1000h-200z" />
-<glyph unicode="&#xe041;" d="M0 700l1 475q0 10 7.5 17.5t17.5 7.5h474l700 -700l-500 -500zM148 953q0 -42 29 -71q30 -30 71.5 -30t71.5 30q29 29 29 71t-29 71q-30 30 -71.5 30t-71.5 -30q-29 -29 -29 -71z" />
-<glyph unicode="&#xe042;" d="M1 700l1 475q0 11 7 18t18 7h474l700 -700l-500 -500zM148 953q0 -42 30 -71q29 -30 71 -30t71 30q30 29 30 71t-30 71q-29 30 -71 30t-71 -30q-30 -29 -30 -71zM701 1200h100l700 -700l-500 -500l-50 50l450 450z" />
-<glyph unicode="&#xe043;" d="M100 0v1025l175 175h925v-1000l-100 -100v1000h-750l-100 -100h750v-1000h-900z" />
-<glyph unicode="&#xe044;" d="M200 0l450 444l450 -443v1150q0 20 -14.5 35t-35.5 15h-800q-21 0 -35.5 -15t-14.5 -35v-1151z" />
-<glyph unicode="&#xe045;" d="M0 100v700h200l100 -200h600l100 200h200v-700h-200v200h-800v-200h-200zM253 829l40 -124h592l62 124l-94 346q-2 11 -10 18t-18 7h-450q-10 0 -18 -7t-10 -18zM281 24l38 152q2 10 11.5 17t19.5 7h500q10 0 19.5 -7t11.5 -17l38 -152q2 -10 -3.5 -17t-15.5 -7h-600 q-10 0 -15.5 7t-3.5 17z" />
-<glyph unicode="&#xe046;" d="M0 200q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-150q-4 8 -11.5 21.5t-33 48t-53 61t-69 48t-83.5 21.5h-200q-41 0 -82 -20.5t-70 -50t-52 -59t-34 -50.5l-12 -20h-150q-41 0 -70.5 -29.5t-29.5 -70.5v-600z M356 500q0 100 72 172t172 72t172 -72t72 -172t-72 -172t-172 -72t-172 72t-72 172zM494 500q0 -44 31 -75t75 -31t75 31t31 75t-31 75t-75 31t-75 -31t-31 -75zM900 700v100h100v-100h-100z" />
-<glyph unicode="&#xe047;" d="M53 0h365v66q-41 0 -72 11t-49 38t1 71l92 234h391l82 -222q16 -45 -5.5 -88.5t-74.5 -43.5v-66h417v66q-34 1 -74 43q-18 19 -33 42t-21 37l-6 13l-385 998h-93l-399 -1006q-24 -48 -52 -75q-12 -12 -33 -25t-36 -20l-15 -7v-66zM416 521l178 457l46 -140l116 -317h-340 z" />
-<glyph unicode="&#xe048;" d="M100 0v89q41 7 70.5 32.5t29.5 65.5v827q0 28 -1 39.5t-5.5 26t-15.5 21t-29 14t-49 14.5v71l471 -1q120 0 213 -88t93 -228q0 -55 -11.5 -101.5t-28 -74t-33.5 -47.5t-28 -28l-12 -7q8 -3 21.5 -9t48 -31.5t60.5 -58t47.5 -91.5t21.5 -129q0 -84 -59 -156.5t-142 -111 t-162 -38.5h-500zM400 200h161q89 0 153 48.5t64 132.5q0 90 -62.5 154.5t-156.5 64.5h-159v-400zM400 700h139q76 0 130 61.5t54 138.5q0 82 -84 130.5t-239 48.5v-379z" />
-<glyph unicode="&#xe049;" d="M200 0v57q77 7 134.5 40.5t65.5 80.5l173 849q10 56 -10 74t-91 37q-6 1 -10.5 2.5t-9.5 2.5v57h425l2 -57q-33 -8 -62 -25.5t-46 -37t-29.5 -38t-17.5 -30.5l-5 -12l-128 -825q-10 -52 14 -82t95 -36v-57h-500z" />
-<glyph unicode="&#xe050;" d="M-75 200h75v800h-75l125 167l125 -167h-75v-800h75l-125 -167zM300 900v300h150h700h150v-300h-50q0 29 -8 48.5t-18.5 30t-33.5 15t-39.5 5.5t-50.5 1h-200v-850l100 -50v-100h-400v100l100 50v850h-200q-34 0 -50.5 -1t-40 -5.5t-33.5 -15t-18.5 -30t-8.5 -48.5h-49z " />
-<glyph unicode="&#xe051;" d="M33 51l167 125v-75h800v75l167 -125l-167 -125v75h-800v-75zM100 901v300h150h700h150v-300h-50q0 29 -8 48.5t-18 30t-33.5 15t-40 5.5t-50.5 1h-200v-650l100 -50v-100h-400v100l100 50v650h-200q-34 0 -50.5 -1t-39.5 -5.5t-33.5 -15t-18.5 -30t-8 -48.5h-50z" />
-<glyph unicode="&#xe052;" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 350q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM0 650q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1000q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 950q0 -20 14.5 -35t35.5 -15h600q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-600q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" />
-<glyph unicode="&#xe053;" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 650q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM200 350q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM200 950q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" />
-<glyph unicode="&#xe054;" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1000q-21 0 -35.5 15 t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-600 q-21 0 -35.5 15t-14.5 35z" />
-<glyph unicode="&#xe055;" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100 q-21 0 -35.5 15t-14.5 35z" />
-<glyph unicode="&#xe056;" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM300 50v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800 q-21 0 -35.5 15t-14.5 35zM300 650v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 950v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15 h-800q-21 0 -35.5 15t-14.5 35z" />
-<glyph unicode="&#xe057;" d="M-101 500v100h201v75l166 -125l-166 -125v75h-201zM300 0h100v1100h-100v-1100zM500 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35 v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 650q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100 q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100z" />
-<glyph unicode="&#xe058;" d="M1 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 650 q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM801 0v1100h100v-1100 h-100zM934 550l167 -125v75h200v100h-200v75z" />
-<glyph unicode="&#xe059;" d="M0 275v650q0 31 22 53t53 22h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53zM900 600l300 300v-600z" />
-<glyph unicode="&#xe060;" d="M0 44v1012q0 18 13 31t31 13h1112q19 0 31.5 -13t12.5 -31v-1012q0 -18 -12.5 -31t-31.5 -13h-1112q-18 0 -31 13t-13 31zM100 263l247 182l298 -131l-74 156l293 318l236 -288v500h-1000v-737zM208 750q0 56 39 95t95 39t95 -39t39 -95t-39 -95t-95 -39t-95 39t-39 95z " />
-<glyph unicode="&#xe062;" d="M148 745q0 124 60.5 231.5t165 172t226.5 64.5q123 0 227 -63t164.5 -169.5t60.5 -229.5t-73 -272q-73 -114 -166.5 -237t-150.5 -189l-57 -66q-10 9 -27 26t-66.5 70.5t-96 109t-104 135.5t-100.5 155q-63 139 -63 262zM342 772q0 -107 75.5 -182.5t181.5 -75.5 q107 0 182.5 75.5t75.5 182.5t-75.5 182t-182.5 75t-182 -75.5t-75 -181.5z" />
-<glyph unicode="&#xe063;" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM173 600q0 -177 125.5 -302t301.5 -125v854q-176 0 -301.5 -125 t-125.5 -302z" />
-<glyph unicode="&#xe064;" d="M117 406q0 94 34 186t88.5 172.5t112 159t115 177t87.5 194.5q21 -71 57.5 -142.5t76 -130.5t83 -118.5t82 -117t70 -116t50 -125.5t18.5 -136q0 -89 -39 -165.5t-102 -126.5t-140 -79.5t-156 -33.5q-114 6 -211.5 53t-161.5 139t-64 210zM243 414q14 -82 59.5 -136 t136.5 -80l16 98q-7 6 -18 17t-34 48t-33 77q-15 73 -14 143.5t10 122.5l9 51q-92 -110 -119.5 -185t-12.5 -156z" />
-<glyph unicode="&#xe065;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5q366 -6 397 -14l-186 -186h-311q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v125l200 200v-225q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM436 341l161 50l412 412l-114 113l-405 -405zM995 1015l113 -113l113 113l-21 85l-92 28z" />
-<glyph unicode="&#xe066;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h261l2 -80q-133 -32 -218 -120h-145q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-53q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5 zM423 524q30 38 81.5 64t103 35.5t99 14t77.5 3.5l29 -1v-209l360 324l-359 318v-216q-7 0 -19 -1t-48 -8t-69.5 -18.5t-76.5 -37t-76.5 -59t-62 -88t-39.5 -121.5z" />
-<glyph unicode="&#xe067;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q61 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-169q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM342 632l283 -284l567 567l-137 137l-430 -431l-146 147z" />
-<glyph unicode="&#xe068;" d="M0 603l300 296v-198h200v200h-200l300 300l295 -300h-195v-200h200v198l300 -296l-300 -300v198h-200v-200h195l-295 -300l-300 300h200v200h-200v-198z" />
-<glyph unicode="&#xe069;" d="M200 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-1100l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" />
-<glyph unicode="&#xe070;" d="M0 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-487l500 487v-1100l-500 488v-488l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" />
-<glyph unicode="&#xe071;" d="M136 550l564 550v-487l500 487v-1100l-500 488v-488z" />
-<glyph unicode="&#xe072;" d="M200 0l900 550l-900 550v-1100z" />
-<glyph unicode="&#xe073;" d="M200 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5t-14.5 -35.5v-800zM600 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" />
-<glyph unicode="&#xe074;" d="M200 150q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v800q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" />
-<glyph unicode="&#xe075;" d="M0 0v1100l500 -487v487l564 -550l-564 -550v488z" />
-<glyph unicode="&#xe076;" d="M0 0v1100l500 -487v487l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-500 -488v488z" />
-<glyph unicode="&#xe077;" d="M300 0v1100l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438z" />
-<glyph unicode="&#xe078;" d="M100 250v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5zM100 500h1100l-550 564z" />
-<glyph unicode="&#xe079;" d="M185 599l592 -592l240 240l-353 353l353 353l-240 240z" />
-<glyph unicode="&#xe080;" d="M272 194l353 353l-353 353l241 240l572 -571l21 -22l-1 -1v-1l-592 -591z" />
-<glyph unicode="&#xe081;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM300 500h200v-200h200v200h200v200h-200v200h-200v-200h-200v-200z" />
-<glyph unicode="&#xe082;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM300 500h600v200h-600v-200z" />
-<glyph unicode="&#xe083;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM246 459l213 -213l141 142l141 -142l213 213l-142 141l142 141l-213 212l-141 -141l-141 142l-212 -213l141 -141 z" />
-<glyph unicode="&#xe084;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM270 551l276 -277l411 411l-175 174l-236 -236l-102 102z" />
-<glyph unicode="&#xe085;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM364 700h143q4 0 11.5 -1t11 -1t6.5 3t3 9t1 11t3.5 8.5t3.5 6t5.5 4t6.5 2.5t9 1.5t9 0.5h11.5h12.5 q19 0 30 -10t11 -26q0 -22 -4 -28t-27 -22q-5 -1 -12.5 -3t-27 -13.5t-34 -27t-26.5 -46t-11 -68.5h200q5 3 14 8t31.5 25.5t39.5 45.5t31 69t14 94q0 51 -17.5 89t-42 58t-58.5 32t-58.5 15t-51.5 3q-50 0 -90.5 -12t-75 -38.5t-53.5 -74.5t-19 -114zM500 300h200v100h-200 v-100z" />
-<glyph unicode="&#xe086;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM400 300h400v100h-100v300h-300v-100h100v-200h-100v-100zM500 800h200v100h-200v-100z" />
-<glyph unicode="&#xe087;" d="M0 500v200h195q31 125 98.5 199.5t206.5 100.5v200h200v-200q54 -20 113 -60t112.5 -105.5t71.5 -134.5h203v-200h-203q-25 -102 -116.5 -186t-180.5 -117v-197h-200v197q-140 27 -208 102.5t-98 200.5h-194zM290 500q24 -73 79.5 -127.5t130.5 -78.5v206h200v-206 q149 48 201 206h-201v200h200q-25 74 -75.5 127t-124.5 77v-204h-200v203q-75 -23 -130 -77t-79 -126h209v-200h-210z" />
-<glyph unicode="&#xe088;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM356 465l135 135 l-135 135l109 109l135 -135l135 135l109 -109l-135 -135l135 -135l-109 -109l-135 135l-135 -135z" />
-<glyph unicode="&#xe089;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM322 537l141 141 l87 -87l204 205l142 -142l-346 -345z" />
-<glyph unicode="&#xe090;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -115 62 -215l568 567q-100 62 -216 62q-171 0 -292.5 -121.5t-121.5 -292.5zM391 245q97 -59 209 -59q171 0 292.5 121.5t121.5 292.5 q0 112 -59 209z" />
-<glyph unicode="&#xe091;" d="M0 547l600 453v-300h600v-300h-600v-301z" />
-<glyph unicode="&#xe092;" d="M0 400v300h600v300l600 -453l-600 -448v301h-600z" />
-<glyph unicode="&#xe093;" d="M204 600l450 600l444 -600h-298v-600h-300v600h-296z" />
-<glyph unicode="&#xe094;" d="M104 600h296v600h300v-600h298l-449 -600z" />
-<glyph unicode="&#xe095;" d="M0 200q6 132 41 238.5t103.5 193t184 138t271.5 59.5v271l600 -453l-600 -448v301q-95 -2 -183 -20t-170 -52t-147 -92.5t-100 -135.5z" />
-<glyph unicode="&#xe096;" d="M0 0v400l129 -129l294 294l142 -142l-294 -294l129 -129h-400zM635 777l142 -142l294 294l129 -129v400h-400l129 -129z" />
-<glyph unicode="&#xe097;" d="M34 176l295 295l-129 129h400v-400l-129 130l-295 -295zM600 600v400l129 -129l295 295l142 -141l-295 -295l129 -130h-400z" />
-<glyph unicode="&#xe101;" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5t224.5 -45.5t184 -123t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5zM456 851l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5 t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5h-207q-21 0 -33 -14.5t-8 -34.5zM500 300h200v100h-200v-100z" />
-<glyph unicode="&#xe102;" d="M0 800h100v-200h400v300h200v-300h400v200h100v100h-111q1 1 1 6.5t-1.5 15t-3.5 17.5l-34 172q-11 39 -41.5 63t-69.5 24q-32 0 -61 -17l-239 -144q-22 -13 -40 -35q-19 24 -40 36l-238 144q-33 18 -62 18q-39 0 -69.5 -23t-40.5 -61l-35 -177q-2 -8 -3 -18t-1 -15v-6 h-111v-100zM100 0h400v400h-400v-400zM200 900q-3 0 14 48t36 96l18 47l213 -191h-281zM700 0v400h400v-400h-400zM731 900l202 197q5 -12 12 -32.5t23 -64t25 -72t7 -28.5h-269z" />
-<glyph unicode="&#xe103;" d="M0 -22v143l216 193q-9 53 -13 83t-5.5 94t9 113t38.5 114t74 124q47 60 99.5 102.5t103 68t127.5 48t145.5 37.5t184.5 43.5t220 58.5q0 -189 -22 -343t-59 -258t-89 -181.5t-108.5 -120t-122 -68t-125.5 -30t-121.5 -1.5t-107.5 12.5t-87.5 17t-56.5 7.5l-99 -55z M238.5 300.5q19.5 -6.5 86.5 76.5q55 66 367 234q70 38 118.5 69.5t102 79t99 111.5t86.5 148q22 50 24 60t-6 19q-7 5 -17 5t-26.5 -14.5t-33.5 -39.5q-35 -51 -113.5 -108.5t-139.5 -89.5l-61 -32q-369 -197 -458 -401q-48 -111 -28.5 -117.5z" />
-<glyph unicode="&#xe104;" d="M111 408q0 -33 5 -63q9 -56 44 -119.5t105 -108.5q31 -21 64 -16t62 23.5t57 49.5t48 61.5t35 60.5q32 66 39 184.5t-13 157.5q79 -80 122 -164t26 -184q-5 -33 -20.5 -69.5t-37.5 -80.5q-10 -19 -14.5 -29t-12 -26t-9 -23.5t-3 -19t2.5 -15.5t11 -9.5t19.5 -5t30.5 2.5 t42 8q57 20 91 34t87.5 44.5t87 64t65.5 88.5t47 122q38 172 -44.5 341.5t-246.5 278.5q22 -44 43 -129q39 -159 -32 -154q-15 2 -33 9q-79 33 -120.5 100t-44 175.5t48.5 257.5q-13 -8 -34 -23.5t-72.5 -66.5t-88.5 -105.5t-60 -138t-8 -166.5q2 -12 8 -41.5t8 -43t6 -39.5 t3.5 -39.5t-1 -33.5t-6 -31.5t-13.5 -24t-21 -20.5t-31 -12q-38 -10 -67 13t-40.5 61.5t-15 81.5t10.5 75q-52 -46 -83.5 -101t-39 -107t-7.5 -85z" />
-<glyph unicode="&#xe105;" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5t145.5 -23.5t132.5 -59t116.5 -83.5t97 -90t74.5 -85.5t49 -63.5t20 -30l26 -40l-26 -40q-6 -10 -20 -30t-49 -63.5t-74.5 -85.5t-97 -90t-116.5 -83.5t-132.5 -59t-145.5 -23.5 t-145.5 23.5t-132.5 59t-116.5 83.5t-97 90t-74.5 85.5t-49 63.5t-20 30zM120 600q7 -10 40.5 -58t56 -78.5t68 -77.5t87.5 -75t103 -49.5t125 -21.5t123.5 20t100.5 45.5t85.5 71.5t66.5 75.5t58 81.5t47 66q-1 1 -28.5 37.5t-42 55t-43.5 53t-57.5 63.5t-58.5 54 q49 -74 49 -163q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l105 105q-37 24 -75 72t-57 84l-20 36z" />
-<glyph unicode="&#xe106;" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5q61 0 121 -17l37 142h148l-314 -1200h-148l37 143q-82 21 -165 71.5t-140 102t-109.5 112t-72 88.5t-29.5 43zM120 600q210 -282 393 -336l37 141q-107 18 -178.5 101.5t-71.5 193.5 q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l47 47l23 87q-30 28 -59 69t-44 68l-14 26zM780 161l38 145q22 15 44.5 34t46 44t40.5 44t41 50.5t33.5 43.5t33 44t24.5 34q-97 127 -140 175l39 146q67 -54 131.5 -125.5t87.5 -103.5t36 -52l26 -40l-26 -40 q-7 -12 -25.5 -38t-63.5 -79.5t-95.5 -102.5t-124 -100t-146.5 -79z" />
-<glyph unicode="&#xe107;" d="M-97.5 34q13.5 -34 50.5 -34h1294q37 0 50.5 35.5t-7.5 67.5l-642 1056q-20 34 -48 36.5t-48 -29.5l-642 -1066q-21 -32 -7.5 -66zM155 200l445 723l445 -723h-345v100h-200v-100h-345zM500 600l100 -300l100 300v100h-200v-100z" />
-<glyph unicode="&#xe108;" d="M100 262v41q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44t106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -91 100 -113v-64q0 -20 -13 -28.5t-32 0.5l-94 78h-222l-94 -78q-19 -9 -32 -0.5t-13 28.5 v64q0 22 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5z" />
-<glyph unicode="&#xe109;" d="M0 50q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v750h-1100v-750zM0 900h1100v150q0 21 -14.5 35.5t-35.5 14.5h-150v100h-100v-100h-500v100h-100v-100h-150q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 100v100h100v-100h-100zM100 300v100h100v-100h-100z M100 500v100h100v-100h-100zM300 100v100h100v-100h-100zM300 300v100h100v-100h-100zM300 500v100h100v-100h-100zM500 100v100h100v-100h-100zM500 300v100h100v-100h-100zM500 500v100h100v-100h-100zM700 100v100h100v-100h-100zM700 300v100h100v-100h-100zM700 500 v100h100v-100h-100zM900 100v100h100v-100h-100zM900 300v100h100v-100h-100zM900 500v100h100v-100h-100z" />
-<glyph unicode="&#xe110;" d="M0 200v200h259l600 600h241v198l300 -295l-300 -300v197h-159l-600 -600h-341zM0 800h259l122 -122l141 142l-181 180h-341v-200zM678 381l141 142l122 -123h159v198l300 -295l-300 -300v197h-241z" />
-<glyph unicode="&#xe111;" d="M0 400v600q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5z" />
-<glyph unicode="&#xe112;" d="M100 600v200h300v-250q0 -113 6 -145q17 -92 102 -117q39 -11 92 -11q37 0 66.5 5.5t50 15.5t36 24t24 31.5t14 37.5t7 42t2.5 45t0 47v25v250h300v-200q0 -42 -3 -83t-15 -104t-31.5 -116t-58 -109.5t-89 -96.5t-129 -65.5t-174.5 -25.5t-174.5 25.5t-129 65.5t-89 96.5 t-58 109.5t-31.5 116t-15 104t-3 83zM100 900v300h300v-300h-300zM800 900v300h300v-300h-300z" />
-<glyph unicode="&#xe113;" d="M-30 411l227 -227l352 353l353 -353l226 227l-578 579z" />
-<glyph unicode="&#xe114;" d="M70 797l580 -579l578 579l-226 227l-353 -353l-352 353z" />
-<glyph unicode="&#xe115;" d="M-198 700l299 283l300 -283h-203v-400h385l215 -200h-800v600h-196zM402 1000l215 -200h381v-400h-198l299 -283l299 283h-200v600h-796z" />
-<glyph unicode="&#xe116;" d="M18 939q-5 24 10 42q14 19 39 19h896l38 162q5 17 18.5 27.5t30.5 10.5h94q20 0 35 -14.5t15 -35.5t-15 -35.5t-35 -14.5h-54l-201 -961q-2 -4 -6 -10.5t-19 -17.5t-33 -11h-31v-50q0 -20 -14.5 -35t-35.5 -15t-35.5 15t-14.5 35v50h-300v-50q0 -20 -14.5 -35t-35.5 -15 t-35.5 15t-14.5 35v50h-50q-21 0 -35.5 15t-14.5 35q0 21 14.5 35.5t35.5 14.5h535l48 200h-633q-32 0 -54.5 21t-27.5 43z" />
-<glyph unicode="&#xe117;" d="M0 0v800h1200v-800h-1200zM0 900v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-100h-1200z" />
-<glyph unicode="&#xe118;" d="M1 0l300 700h1200l-300 -700h-1200zM1 400v600h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-200h-1000z" />
-<glyph unicode="&#xe119;" d="M302 300h198v600h-198l298 300l298 -300h-198v-600h198l-298 -300z" />
-<glyph unicode="&#xe120;" d="M0 600l300 298v-198h600v198l300 -298l-300 -297v197h-600v-197z" />
-<glyph unicode="&#xe121;" d="M0 100v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM31 400l172 739q5 22 23 41.5t38 19.5h672q19 0 37.5 -22.5t23.5 -45.5l172 -732h-1138zM800 100h100v100h-100v-100z M1000 100h100v100h-100v-100z" />
-<glyph unicode="&#xe122;" d="M-101 600v50q0 24 25 49t50 38l25 13v-250l-11 5.5t-24 14t-30 21.5t-24 27.5t-11 31.5zM100 500v250v8v8v7t0.5 7t1.5 5.5t2 5t3 4t4.5 3.5t6 1.5t7.5 0.5h200l675 250v-850l-675 200h-38l47 -276q2 -12 -3 -17.5t-11 -6t-21 -0.5h-8h-83q-20 0 -34.5 14t-18.5 35 q-55 337 -55 351zM1100 200v850q0 21 14.5 35.5t35.5 14.5q20 0 35 -14.5t15 -35.5v-850q0 -20 -15 -35t-35 -15q-21 0 -35.5 15t-14.5 35z" />
-<glyph unicode="&#xe123;" d="M74 350q0 21 13.5 35.5t33.5 14.5h18l117 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3 32t29 13h94q20 0 29 -10.5t3 -29.5q-18 -36 -18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q20 0 33.5 -14.5t13.5 -35.5q0 -20 -13 -40t-31 -27q-8 -3 -23 -8.5 t-65 -20t-103 -25t-132.5 -19.5t-158.5 -9q-125 0 -245.5 20.5t-178.5 40.5l-58 20q-18 7 -31 27.5t-13 40.5zM497 110q12 -49 40 -79.5t63 -30.5t63 30.5t39 79.5q-48 -6 -102 -6t-103 6z" />
-<glyph unicode="&#xe124;" d="M21 445l233 -45l-78 -224l224 78l45 -233l155 179l155 -179l45 233l224 -78l-78 224l234 45l-180 155l180 156l-234 44l78 225l-224 -78l-45 233l-155 -180l-155 180l-45 -233l-224 78l78 -225l-233 -44l179 -156z" />
-<glyph unicode="&#xe125;" d="M0 200h200v600h-200v-600zM300 275q0 -75 100 -75h61q124 -100 139 -100h250q46 0 83 57l238 344q29 31 29 74v100q0 44 -30.5 84.5t-69.5 40.5h-328q28 118 28 125v150q0 44 -30.5 84.5t-69.5 40.5h-50q-27 0 -51 -20t-38 -48l-96 -198l-145 -196q-20 -26 -20 -63v-400z M400 300v375l150 213l100 212h50v-175l-50 -225h450v-125l-250 -375h-214l-136 100h-100z" />
-<glyph unicode="&#xe126;" d="M0 400v600h200v-600h-200zM300 525v400q0 75 100 75h61q124 100 139 100h250q46 0 83 -57l238 -344q29 -31 29 -74v-100q0 -44 -30.5 -84.5t-69.5 -40.5h-328q28 -118 28 -125v-150q0 -44 -30.5 -84.5t-69.5 -40.5h-50q-27 0 -51 20t-38 48l-96 198l-145 196 q-20 26 -20 63zM400 525l150 -212l100 -213h50v175l-50 225h450v125l-250 375h-214l-136 -100h-100v-375z" />
-<glyph unicode="&#xe127;" d="M8 200v600h200v-600h-200zM308 275v525q0 17 14 35.5t28 28.5l14 9l362 230q14 6 25 6q17 0 29 -12l109 -112q14 -14 14 -34q0 -18 -11 -32l-85 -121h302q85 0 138.5 -38t53.5 -110t-54.5 -111t-138.5 -39h-107l-130 -339q-7 -22 -20.5 -41.5t-28.5 -19.5h-341 q-7 0 -90 81t-83 94zM408 289l100 -89h293l131 339q6 21 19.5 41t28.5 20h203q16 0 25 15t9 36q0 20 -9 34.5t-25 14.5h-457h-6.5h-7.5t-6.5 0.5t-6 1t-5 1.5t-5.5 2.5t-4 4t-4 5.5q-5 12 -5 20q0 14 10 27l147 183l-86 83l-339 -236v-503z" />
-<glyph unicode="&#xe128;" d="M-101 651q0 72 54 110t139 38l302 -1l-85 121q-11 16 -11 32q0 21 14 34l109 113q13 12 29 12q11 0 25 -6l365 -230q7 -4 17 -10.5t26.5 -26t16.5 -36.5v-526q0 -13 -86 -93.5t-94 -80.5h-341q-16 0 -29.5 20t-19.5 41l-130 339h-107q-84 0 -139 39t-55 111zM-1 601h222 q15 0 28.5 -20.5t19.5 -40.5l131 -339h293l107 89v502l-343 237l-87 -83l145 -184q10 -11 10 -26q0 -11 -5 -20q-1 -3 -3.5 -5.5l-4 -4t-5 -2.5t-5.5 -1.5t-6.5 -1t-6.5 -0.5h-7.5h-6.5h-476v-100zM1000 201v600h200v-600h-200z" />
-<glyph unicode="&#xe129;" d="M97 719l230 -363q4 -6 10.5 -15.5t26 -25t36.5 -15.5h525q13 0 94 83t81 90v342q0 15 -20 28.5t-41 19.5l-339 131v106q0 84 -39 139t-111 55t-110 -53.5t-38 -138.5v-302l-121 84q-15 12 -33.5 11.5t-32.5 -13.5l-112 -110q-22 -22 -6 -53zM172 739l83 86l183 -146 q22 -18 47 -5q3 1 5.5 3.5l4 4t2.5 5t1.5 5.5t1 6.5t0.5 6.5v7.5v6.5v456q0 22 25 31t50 -0.5t25 -30.5v-202q0 -16 20 -29.5t41 -19.5l339 -130v-294l-89 -100h-503zM400 0v200h600v-200h-600z" />
-<glyph unicode="&#xe130;" d="M2 585q-16 -31 6 -53l112 -110q13 -13 32 -13.5t34 10.5l121 85q0 -51 -0.5 -153.5t-0.5 -148.5q0 -84 38.5 -138t110.5 -54t111 55t39 139v106l339 131q20 6 40.5 19.5t20.5 28.5v342q0 7 -81 90t-94 83h-525q-17 0 -35.5 -14t-28.5 -28l-10 -15zM77 565l236 339h503 l89 -100v-294l-340 -130q-20 -6 -40 -20t-20 -29v-202q0 -22 -25 -31t-50 0t-25 31v456v14.5t-1.5 11.5t-5 12t-9.5 7q-24 13 -46 -5l-184 -146zM305 1104v200h600v-200h-600z" />
-<glyph unicode="&#xe131;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM298 701l2 -201h300l-2 -194l402 294l-402 298v-197h-300z" />
-<glyph unicode="&#xe132;" d="M0 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t231.5 47.5q122 0 232.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-218 -217.5t-300 -80t-299.5 80t-217.5 217.5t-80 299.5zM200 600l402 -294l-2 194h300l2 201h-300v197z" />
-<glyph unicode="&#xe133;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600h200v-300h200v300h200l-300 400z" />
-<glyph unicode="&#xe134;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600l300 -400l300 400h-200v300h-200v-300h-200z" />
-<glyph unicode="&#xe135;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM254 780q-8 -33 5.5 -92.5t7.5 -87.5q0 -9 17 -44t16 -60 q12 0 23 -5.5t23 -15t20 -13.5q24 -12 108 -42q22 -8 53 -31.5t59.5 -38.5t57.5 -11q8 -18 -15 -55t-20 -57q42 -71 87 -80q0 -6 -3 -15.5t-3.5 -14.5t4.5 -17q104 -3 221 112q30 29 47 47t34.5 49t20.5 62q-14 9 -37 9.5t-36 7.5q-14 7 -49 15t-52 19q-9 0 -39.5 -0.5 t-46.5 -1.5t-39 -6.5t-39 -16.5q-50 -35 -66 -12q-4 2 -3.5 25.5t0.5 25.5q-6 13 -26.5 17t-24.5 7q2 22 -2 41t-16.5 28t-38.5 -20q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q12 -19 32 -37.5t34 -27.5l14 -8q0 3 9.5 39.5t5.5 57.5 q-4 23 14.5 44.5t22.5 31.5q5 14 10 35t8.5 31t15.5 22.5t34 21.5q-6 18 10 37q8 0 23.5 -1.5t24.5 -1.5t20.5 4.5t20.5 15.5q-10 23 -30.5 42.5t-38 30t-49 26.5t-43.5 23q11 39 2 44q31 -13 58 -14.5t39 3.5l11 4q7 36 -16.5 53.5t-64.5 28.5t-56 23q-19 -3 -37 0 q-15 -12 -36.5 -21t-34.5 -12t-44 -8t-39 -6q-15 -3 -45.5 0.5t-45.5 -2.5q-21 -7 -52 -26.5t-34 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -90.5t-29.5 -79.5zM518 916q3 12 16 30t16 25q10 -10 18.5 -10t14 6t14.5 14.5t16 12.5q0 -24 17 -66.5t17 -43.5 q-9 2 -31 5t-36 5t-32 8t-30 14zM692 1003h1h-1z" />
-<glyph unicode="&#xe136;" d="M0 164.5q0 21.5 15 37.5l600 599q-33 101 6 201.5t135 154.5q164 92 306 -9l-259 -138l145 -232l251 126q13 -175 -151 -267q-123 -70 -253 -23l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5z" />
-<glyph unicode="&#xe137;" horiz-adv-x="1220" d="M0 196v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 596v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5zM0 996v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM600 596h500v100h-500v-100zM800 196h300v100h-300v-100zM900 996h200v100h-200v-100z" />
-<glyph unicode="&#xe138;" d="M100 1100v100h1000v-100h-1000zM150 1000h900l-350 -500v-300l-200 -200v500z" />
-<glyph unicode="&#xe139;" d="M0 200v200h1200v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500z M500 1000h200v100h-200v-100z" />
-<glyph unicode="&#xe140;" d="M0 0v400l129 -129l200 200l142 -142l-200 -200l129 -129h-400zM0 800l129 129l200 -200l142 142l-200 200l129 129h-400v-400zM729 329l142 142l200 -200l129 129v-400h-400l129 129zM729 871l200 200l-129 129h400v-400l-129 129l-200 -200z" />
-<glyph unicode="&#xe141;" d="M0 596q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 596q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM291 655 q0 23 15.5 38.5t38.5 15.5t39 -16t16 -38q0 -23 -16 -39t-39 -16q-22 0 -38 16t-16 39zM400 850q0 22 16 38.5t39 16.5q22 0 38 -16t16 -39t-16 -39t-38 -16q-23 0 -39 16.5t-16 38.5zM514 609q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 22 16 38.5t39 16.5 q22 0 38 -16t16 -39t-16 -39t-38 -16q-14 0 -29 10l-55 -145q17 -22 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5zM800 655q0 22 16 38t39 16t38.5 -15.5t15.5 -38.5t-16 -39t-38 -16q-23 0 -39 16t-16 39z" />
-<glyph unicode="&#xe142;" d="M-40 375q-13 -95 35 -173q35 -57 94 -89t129 -32q63 0 119 28q33 16 65 40.5t52.5 45.5t59.5 64q40 44 57 61l394 394q35 35 47 84t-3 96q-27 87 -117 104q-20 2 -29 2q-46 0 -78.5 -16.5t-67.5 -51.5l-389 -396l-7 -7l69 -67l377 373q20 22 39 38q23 23 50 23 q38 0 53 -36q16 -39 -20 -75l-547 -547q-52 -52 -125 -52q-55 0 -100 33t-54 96q-5 35 2.5 66t31.5 63t42 50t56 54q24 21 44 41l348 348q52 52 82.5 79.5t84 54t107.5 26.5q25 0 48 -4q95 -17 154 -94.5t51 -175.5q-7 -101 -98 -192l-252 -249l-253 -256l7 -7l69 -60 l517 511q67 67 95 157t11 183q-16 87 -67 154t-130 103q-69 33 -152 33q-107 0 -197 -55q-40 -24 -111 -95l-512 -512q-68 -68 -81 -163z" />
-<glyph unicode="&#xe143;" d="M80 784q0 131 98.5 229.5t230.5 98.5q143 0 241 -129q103 129 246 129q129 0 226 -98.5t97 -229.5q0 -46 -17.5 -91t-61 -99t-77 -89.5t-104.5 -105.5q-197 -191 -293 -322l-17 -23l-16 23q-43 58 -100 122.5t-92 99.5t-101 100q-71 70 -104.5 105.5t-77 89.5t-61 99 t-17.5 91zM250 784q0 -27 30.5 -70t61.5 -75.5t95 -94.5l22 -22q93 -90 190 -201q82 92 195 203l12 12q64 62 97.5 97t64.5 79t31 72q0 71 -48 119.5t-105 48.5q-74 0 -132 -83l-118 -171l-114 174q-51 80 -123 80q-60 0 -109.5 -49.5t-49.5 -118.5z" />
-<glyph unicode="&#xe144;" d="M57 353q0 -95 66 -159l141 -142q68 -66 159 -66q93 0 159 66l283 283q66 66 66 159t-66 159l-141 141q-8 9 -19 17l-105 -105l212 -212l-389 -389l-247 248l95 95l-18 18q-46 45 -75 101l-55 -55q-66 -66 -66 -159zM269 706q0 -93 66 -159l141 -141q7 -7 19 -17l105 105 l-212 212l389 389l247 -247l-95 -96l18 -17q47 -49 77 -100l29 29q35 35 62.5 88t27.5 96q0 93 -66 159l-141 141q-66 66 -159 66q-95 0 -159 -66l-283 -283q-66 -64 -66 -159z" />
-<glyph unicode="&#xe145;" d="M200 100v953q0 21 30 46t81 48t129 38t163 15t162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5zM300 300h600v700h-600v-700zM496 150q0 -43 30.5 -73.5t73.5 -30.5t73.5 30.5t30.5 73.5t-30.5 73.5t-73.5 30.5 t-73.5 -30.5t-30.5 -73.5z" />
-<glyph unicode="&#xe146;" d="M0 0l303 380l207 208l-210 212h300l267 279l-35 36q-15 14 -15 35t15 35q14 15 35 15t35 -15l283 -282q15 -15 15 -36t-15 -35q-14 -15 -35 -15t-35 15l-36 35l-279 -267v-300l-212 210l-208 -207z" />
-<glyph unicode="&#xe148;" d="M295 433h139q5 -77 48.5 -126.5t117.5 -64.5v335q-6 1 -15.5 4t-11.5 3q-46 14 -79 26.5t-72 36t-62.5 52t-40 72.5t-16.5 99q0 92 44 159.5t109 101t144 40.5v78h100v-79q38 -4 72.5 -13.5t75.5 -31.5t71 -53.5t51.5 -84t24.5 -118.5h-159q-8 72 -35 109.5t-101 50.5 v-307l64 -14q34 -7 64 -16.5t70 -31.5t67.5 -52t47.5 -80.5t20 -112.5q0 -139 -89 -224t-244 -96v-77h-100v78q-152 17 -237 104q-40 40 -52.5 93.5t-15.5 139.5zM466 889q0 -29 8 -51t16.5 -34t29.5 -22.5t31 -13.5t38 -10q7 -2 11 -3v274q-61 -8 -97.5 -37.5t-36.5 -102.5 zM700 237q170 18 170 151q0 64 -44 99.5t-126 60.5v-311z" />
-<glyph unicode="&#xe149;" d="M100 600v100h166q-24 49 -44 104q-10 26 -14.5 55.5t-3 72.5t25 90t68.5 87q97 88 263 88q129 0 230 -89t101 -208h-153q0 52 -34 89.5t-74 51.5t-76 14q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -28 16.5 -69.5t28 -62.5t41.5 -72h241v-100h-197q8 -50 -2.5 -115 t-31.5 -94q-41 -59 -99 -113q35 11 84 18t70 7q33 1 103 -16t103 -17q76 0 136 30l50 -147q-41 -25 -80.5 -36.5t-59 -13t-61.5 -1.5q-23 0 -128 33t-155 29q-39 -4 -82 -17t-66 -25l-24 -11l-55 145l16.5 11t15.5 10t13.5 9.5t14.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221z" />
-<glyph unicode="&#xe150;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM602 900l298 300l298 -300h-198v-900h-200v900h-198z" />
-<glyph unicode="&#xe151;" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v200h100v-100h200v-100h-300zM700 400v100h300v-200h-99v-100h-100v100h99v100h-200zM700 700v500h300v-500h-100v100h-100v-100h-100zM801 900h100v200h-100v-200z" />
-<glyph unicode="&#xe152;" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v500h300v-500h-100v100h-100v-100h-100zM700 700v200h100v-100h200v-100h-300zM700 1100v100h300v-200h-99v-100h-100v100h99v100h-200zM801 200h100v200h-100v-200z" />
-<glyph unicode="&#xe153;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 100v400h300v-500h-100v100h-200zM800 1100v100h200v-500h-100v400h-100zM901 200h100v200h-100v-200z" />
-<glyph unicode="&#xe154;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 400v100h200v-500h-100v400h-100zM800 800v400h300v-500h-100v100h-200zM901 900h100v200h-100v-200z" />
-<glyph unicode="&#xe155;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h500v-200h-500zM700 400v200h400v-200h-400zM700 700v200h300v-200h-300zM700 1000v200h200v-200h-200z" />
-<glyph unicode="&#xe156;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h200v-200h-200zM700 400v200h300v-200h-300zM700 700v200h400v-200h-400zM700 1000v200h500v-200h-500z" />
-<glyph unicode="&#xe157;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q162 0 281 -118.5t119 -281.5v-300q0 -165 -118.5 -282.5t-281.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500z" />
-<glyph unicode="&#xe158;" d="M0 400v300q0 163 119 281.5t281 118.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-163 0 -281.5 117.5t-118.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM400 300l333 250l-333 250v-500z" />
-<glyph unicode="&#xe159;" d="M0 400v300q0 163 117.5 281.5t282.5 118.5h300q163 0 281.5 -119t118.5 -281v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 700l250 -333l250 333h-500z" />
-<glyph unicode="&#xe160;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -162 -118.5 -281t-281.5 -119h-300q-165 0 -282.5 118.5t-117.5 281.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 400h500l-250 333z" />
-<glyph unicode="&#xe161;" d="M0 400v300h300v200l400 -350l-400 -350v200h-300zM500 0v200h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-500v200h400q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-400z" />
-<glyph unicode="&#xe162;" d="M217 519q8 -19 31 -19h302q-155 -438 -160 -458q-5 -21 4 -32l9 -8h9q14 0 26 15q11 13 274.5 321.5t264.5 308.5q14 19 5 36q-8 17 -31 17l-301 -1q1 4 78 219.5t79 227.5q2 15 -5 27l-9 9h-9q-15 0 -25 -16q-4 -6 -98 -111.5t-228.5 -257t-209.5 -237.5q-16 -19 -6 -41 z" />
-<glyph unicode="&#xe163;" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q47 0 100 15v185h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h500v185q-14 4 -114 7.5t-193 5.5l-93 2q-165 0 -282.5 -117.5t-117.5 -282.5v-300zM600 400v300h300v200l400 -350l-400 -350v200h-300z " />
-<glyph unicode="&#xe164;" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q163 0 281.5 117.5t118.5 282.5v98l-78 73l-122 -123v-148q0 -41 -29.5 -70.5t-70.5 -29.5h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h156l118 122l-74 78h-100q-165 0 -282.5 -117.5t-117.5 -282.5 v-300zM496 709l353 342l-149 149h500v-500l-149 149l-342 -353z" />
-<glyph unicode="&#xe165;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM406 600 q0 80 57 137t137 57t137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137z" />
-<glyph unicode="&#xe166;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 800l445 -500l450 500h-295v400h-300v-400h-300zM900 150h100v50h-100v-50z" />
-<glyph unicode="&#xe167;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 700h300v-300h300v300h295l-445 500zM900 150h100v50h-100v-50z" />
-<glyph unicode="&#xe168;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 705l305 -305l596 596l-154 155l-442 -442l-150 151zM900 150h100v50h-100v-50z" />
-<glyph unicode="&#xe169;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 988l97 -98l212 213l-97 97zM200 400l697 1l3 699l-250 -239l-149 149l-212 -212l149 -149zM900 150h100v50h-100v-50z" />
-<glyph unicode="&#xe170;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM200 612l212 -212l98 97l-213 212zM300 1200l239 -250l-149 -149l212 -212l149 148l249 -237l-1 697zM900 150h100v50h-100v-50z" />
-<glyph unicode="&#xe171;" d="M23 415l1177 784v-1079l-475 272l-310 -393v416h-392zM494 210l672 938l-672 -712v-226z" />
-<glyph unicode="&#xe172;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-850q0 -21 -15 -35.5t-35 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200z" />
-<glyph unicode="&#xe173;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-218l-276 -275l-120 120l-126 -127h-378v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM581 306l123 123l120 -120l353 352l123 -123l-475 -476zM600 1000h100v200h-100v-200z" />
-<glyph unicode="&#xe174;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-269l-103 -103l-170 170l-298 -298h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200zM700 133l170 170l-170 170l127 127l170 -170l170 170l127 -128l-170 -169l170 -170 l-127 -127l-170 170l-170 -170z" />
-<glyph unicode="&#xe175;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-300h-400v-200h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300l300 -300l300 300h-200v300h-200v-300h-200zM600 1000v200h100v-200h-100z" />
-<glyph unicode="&#xe176;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-402l-200 200l-298 -298h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300h200v-300h200v300h200l-300 300zM600 1000v200h100v-200h-100z" />
-<glyph unicode="&#xe177;" d="M0 250q0 -21 14.5 -35.5t35.5 -14.5h1100q21 0 35.5 14.5t14.5 35.5v550h-1200v-550zM0 900h1200v150q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 300v200h400v-200h-400z" />
-<glyph unicode="&#xe178;" d="M0 400l300 298v-198h400v-200h-400v-198zM100 800v200h100v-200h-100zM300 800v200h100v-200h-100zM500 800v200h400v198l300 -298l-300 -298v198h-400zM800 300v200h100v-200h-100zM1000 300h100v200h-100v-200z" />
-<glyph unicode="&#xe179;" d="M100 700v400l50 100l50 -100v-300h100v300l50 100l50 -100v-300h100v300l50 100l50 -100v-400l-100 -203v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447zM800 597q0 -29 10.5 -55.5t25 -43t29 -28.5t25.5 -18l10 -5v-397q0 -21 14.5 -35.5 t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v1106q0 31 -18 40.5t-44 -7.5l-276 -116q-25 -17 -43.5 -51.5t-18.5 -65.5v-359z" />
-<glyph unicode="&#xe180;" d="M100 0h400v56q-75 0 -87.5 6t-12.5 44v394h500v-394q0 -38 -12.5 -44t-87.5 -6v-56h400v56q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v888q0 22 25 34.5t50 13.5l25 2v56h-400v-56q75 0 87.5 -6t12.5 -44v-394h-500v394q0 38 12.5 44t87.5 6v56h-400v-56q4 0 11 -0.5 t24 -3t30 -7t24 -15t11 -24.5v-888q0 -22 -25 -34.5t-50 -13.5l-25 -2v-56z" />
-<glyph unicode="&#xe181;" d="M0 300q0 -41 29.5 -70.5t70.5 -29.5h300q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-300q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM100 100h400l200 200h105l295 98v-298h-425l-100 -100h-375zM100 300v200h300v-200h-300zM100 600v200h300v-200h-300z M100 1000h400l200 -200v-98l295 98h105v200h-425l-100 100h-375zM700 402v163l400 133v-163z" />
-<glyph unicode="&#xe182;" d="M16.5 974.5q0.5 -21.5 16 -90t46.5 -140t104 -177.5t175 -208q103 -103 207.5 -176t180 -103.5t137 -47t92.5 -16.5l31 1l163 162q17 18 13.5 41t-22.5 37l-192 136q-19 14 -45 12t-42 -19l-118 -118q-142 101 -268 227t-227 268l118 118q17 17 20 41.5t-11 44.5 l-139 194q-14 19 -36.5 22t-40.5 -14l-162 -162q-1 -11 -0.5 -32.5z" />
-<glyph unicode="&#xe183;" d="M0 50v212q0 20 10.5 45.5t24.5 39.5l365 303v50q0 4 1 10.5t12 22.5t30 28.5t60 23t97 10.5t97 -10t60 -23.5t30 -27.5t12 -24l1 -10v-50l365 -303q14 -14 24.5 -39.5t10.5 -45.5v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-20 0 -35 14.5t-15 35.5zM0 712 q0 -21 14.5 -33.5t34.5 -8.5l202 33q20 4 34.5 21t14.5 38v146q141 24 300 24t300 -24v-146q0 -21 14.5 -38t34.5 -21l202 -33q20 -4 34.5 8.5t14.5 33.5v200q-6 8 -19 20.5t-63 45t-112 57t-171 45t-235 20.5q-92 0 -175 -10.5t-141.5 -27t-108.5 -36.5t-81.5 -40 t-53.5 -36.5t-31 -27.5l-9 -10v-200z" />
-<glyph unicode="&#xe184;" d="M100 0v100h1100v-100h-1100zM175 200h950l-125 150v250l100 100v400h-100v-200h-100v200h-200v-200h-100v200h-200v-200h-100v200h-100v-400l100 -100v-250z" />
-<glyph unicode="&#xe185;" d="M100 0h300v400q0 41 -29.5 70.5t-70.5 29.5h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-400zM500 0v1000q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-1000h-300zM900 0v700q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-700h-300z" />
-<glyph unicode="&#xe186;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" />
-<glyph unicode="&#xe187;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h100v200h100v-200h100v500h-100v-200h-100v200h-100v-500zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" />
-<glyph unicode="&#xe188;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v100h-200v300h200v100h-300v-500zM600 300h300v100h-200v300h200v100h-300v-500z" />
-<glyph unicode="&#xe189;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 550l300 -150v300zM600 400l300 150l-300 150v-300z" />
-<glyph unicode="&#xe190;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300v500h700v-500h-700zM300 400h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130v-300zM575 549 q0 -65 27 -107t68 -42h130v300h-130q-38 0 -66.5 -43t-28.5 -108z" />
-<glyph unicode="&#xe191;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" />
-<glyph unicode="&#xe192;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v400h-200v100h-100v-500zM301 400v200h100v-200h-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" />
-<glyph unicode="&#xe193;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 700v100h300v-300h-99v-100h-100v100h99v200h-200zM201 300v100h100v-100h-100zM601 300v100h100v-100h-100z M700 700v100h200v-500h-100v400h-100z" />
-<glyph unicode="&#xe194;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 500v200 l100 100h300v-100h-300v-200h300v-100h-300z" />
-<glyph unicode="&#xe195;" d="M0 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 400v400h300 l100 -100v-100h-100v100h-200v-100h200v-100h-200v-100h-100zM700 400v100h100v-100h-100z" />
-<glyph unicode="&#xe197;" d="M-14 494q0 -80 56.5 -137t135.5 -57h222v300h400v-300h128q120 0 205 86.5t85 207.5t-85 207t-205 86q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200h200v300h200v-300h200 l-300 -300z" />
-<glyph unicode="&#xe198;" d="M-14 494q0 -80 56.5 -137t135.5 -57h8l414 414l403 -403q94 26 154.5 104.5t60.5 178.5q0 120 -85 206.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200l300 300 l300 -300h-200v-300h-200v300h-200z" />
-<glyph unicode="&#xe199;" d="M100 200h400v-155l-75 -45h350l-75 45v155h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170z" />
-<glyph unicode="&#xe200;" d="M121 700q0 -53 28.5 -97t75.5 -65q-4 -16 -4 -38q0 -74 52.5 -126.5t126.5 -52.5q56 0 100 30v-306l-75 -45h350l-75 45v306q46 -30 100 -30q74 0 126.5 52.5t52.5 126.5q0 24 -9 55q50 32 79.5 83t29.5 112q0 90 -61.5 155.5t-150.5 71.5q-26 89 -99.5 145.5 t-167.5 56.5q-116 0 -197.5 -81.5t-81.5 -197.5q0 -4 1 -11.5t1 -11.5q-14 2 -23 2q-74 0 -126.5 -52.5t-52.5 -126.5z" />
-</font>
-</defs></svg> \ No newline at end of file
diff --git a/docs/theme/mkdocs/fonts/glyphicons-halflings-regular.ttf b/docs/theme/mkdocs/fonts/glyphicons-halflings-regular.ttf
deleted file mode 100644
index 67fa00bf83..0000000000
--- a/docs/theme/mkdocs/fonts/glyphicons-halflings-regular.ttf
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/fonts/glyphicons-halflings-regular.woff b/docs/theme/mkdocs/fonts/glyphicons-halflings-regular.woff
deleted file mode 100644
index 8c54182aa5..0000000000
--- a/docs/theme/mkdocs/fonts/glyphicons-halflings-regular.woff
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/footer.html b/docs/theme/mkdocs/footer.html
deleted file mode 100644
index 923ace519c..0000000000
--- a/docs/theme/mkdocs/footer.html
+++ /dev/null
@@ -1,113 +0,0 @@
-<div id="footer-container" class="container">
- <div id="footer" class="grey-body">
- <div class="row">
- <div class="span2">
- <span class="footer-title">Community</span>
- <ul class="unstyled">
- <li><a class="primary-button" href="https://www.docker.com/community/events/">Events</a></li>
- <li><a class="primary-button" href="http://posts.docker.com">Friends' Posts</a></li>
- <li><a class="primary-button" href="https://www.docker.com/community/meetups/">Meetups</a></li>
- <li><a class="primary-button" href="https://www.docker.com/community/governance/">Governance</a></li>
- <li><a class="primary-button" href="http://forums.docker.com">Forums</a></li>
- <li><a class="primary-button" href="http://botbot.me/freenode/docker">IRC</a></li>
- <li><a class="primary-button" href="https://github.com/docker/docker">GitHub</a></li>
- <li><a class="primary-button" href="http://stackoverflow.com/search?q=docker">Stackoverflow</a></li>
- <li><a class="primary-button" href="http://www.cafepress.com/docker">Swag</a></li>
- </ul>
- </div>
- <div class="span2">
- <span class="footer-title">Enterprise</span>
- <ul class="unstyled">
- <li><a class="primary-button" href="https://www.docker.com/enterprise/support/">Support</a></li>
- <li><a class="primary-button" href="https://www.docker.com/enterprise/education/">Education</a></li>
- <li><a class="primary-button" href="https://www.docker.com/enterprise/services/">Services</a></li>
- </ul>
- <span class="footer-title">Partner Solutions</span>
- <ul class="unstyled">
- <li><a class="primary-button" href="https://www.docker.com/partners/find/">Find a Partner</a></li>
- <li><a class="primary-button" href="https://www.docker.com/partners/program/">Partner Program</a></li>
- <li><a class="primary-button" href="https://www.docker.com/partners/learn/">Learn More</a></li>
- </ul>
- </div>
- <div class="span2">
- <span class="footer-title">Resources</span>
- <ul class="unstyled">
- <li><a class="primary-button" href="https://docs.docker.com">Documentation</a></li>
- <li><a class="primary-button" href="https://www.docker.com/resources/help/">Help</a></li>
- <li><a class="primary-button" href="https://www.docker.com/resources/usecases/">Use Cases</a></li>
- <li><a class="primary-button" href="http://www.docker.com/tryit/">Online Tutorial</a></li>
- <li><a class="primary-button" href="https://www.docker.com/resources/howtobuy/">How To Buy</a></li>
- <li><a class="primary-button" href="http://status.docker.com">Status</a></li>
- <li><a class="primary-button" href="https://www.docker.com/resources/security/">Security</a></li>
- </ul>
- </div>
- <div class="span2">
- <span class="footer-title">Company</span>
- <ul class="unstyled">
- <li><a class="primary-button" href="https://www.docker.com/company/aboutus/">About Us</a></li>
- <li><a class="primary-button" href="https://www.docker.com/company/team/">Team</a></li>
- <li><a class="primary-button" href="https://www.docker.com/company/news/">News</a></li>
- <li><a class="primary-button" href="https://www.docker.com/company/press/">Press</a></li>
- <li><a class="primary-button" href="https://www.docker.com/company/careers/">Careers</a></li>
- <li><a class="primary-button" href="https://www.docker.com/company/contact/">Contact</a></li>
- </ul>
- </div>
- <div class="span3">
- <span class="footer-title">Connect</span>
- <div class="search">
- <span>Subscribe to our newsletter</span>
- <form action="https://www.docker.com/subscribe_newsletter/" method="post">
- <input type='hidden' name='csrfmiddlewaretoken' value='aWL78QXQkY8DSKNYh6cl08p5eTLl7sOa' />
- <tr><th><label for="id_email">Email:</label></th><td><input class="form-control" id="id_email" name="email" placeholder="Enter your email" type="text" /></td></tr>
-
- <button type="submit"><i class="icon-arrow-right"></i> </button>
- </form>
- </div>
- <ul class="unstyled social">
- <li><a title="Docker on Twitter" class="primary-button blog" href="http://blog.docker.com">Blog</a></li>
- <li><a title="Docker on Twitter" class="primary-button twitter" href="http://twitter.com/docker">Twitter</a></li>
- <li><a title="Docker on Google+" class="primary-button googleplus" href="https://plus.google.com/u/0/communities/108146856671494713993">Google+</a></li>
- <li><a title="Docker on Facebook" class="primary-button facebook" href="https://www.facebook.com/docker.run">Facebook</a></li>
- <li><a title="Docker on Youtube" class="primary-button youtube" href="http://www.youtube.com/user/dockerrun">YouTube</a></li>
- </ul>
- <ul class="unstyled social">
- <li><a title="Docker on SlideShare" class="primary-button slideshare" href="http://www.slideshare.net/Docker">Slideshare</a></li>
- <li>
- <a title="Docker on LinkedIn" class="primary-button" href="https://www.linkedin.com/company/docker">
- <span class="linkedin"></span>
- LinkedIn
- </a>
- </li>
- <li>
- <a title="Docker on GitHub" class="primary-button" href="https://github.com/docker/">
- <span class="github"></span>
- GitHub
- </a>
- </li>
- <li>
- <a title="Docker on Reddit" class="primary-button" href="http://www.reddit.com/r/docker">
- <span class="reddit"></span>
- Reddit
- </a>
- </li>
- <li>
- <a title="Docker on AngelList" class="primary-button" href="https://angel.co/docker-inc-1">
- <span class="angellist"></span>
- AngelList
- </a>
- </li>
- </ul>
- </div>
- </div>
- <div class="row clearfix">
- <div class="span6 pagination-right copyright">
- <span>&copy; 2014-2015 Docker, Inc.</span>
- </div>
- <div class="span6 pagination-left copyright">
- <a href="http://www.docker.com/legal/terms_of_service">Terms</a> &middot;
- <a href="http://www.docker.com/legal/privacy_policy">Privacy</a> &middot;
- <a href="http://www.docker.com/legal/trademark_guidelines">Trademarks</a>
- </div>
- </div>
- </div>
-</div>
diff --git a/docs/theme/mkdocs/header.html b/docs/theme/mkdocs/header.html
deleted file mode 100644
index 6622f93301..0000000000
--- a/docs/theme/mkdocs/header.html
+++ /dev/null
@@ -1,50 +0,0 @@
-<div id="topmostnav" class="topmostnav_loggedout navbar navbar-static-top">
- <div class="container">
- <a href="/" title="Docker Docs Home"><div class="brand logo"><img src="/img/nav/docker-logo-loggedin.png"> </div></a>
- <form id="nav_search" class="navbar-index-search pull-right" action="/jsearch/">
- <span role="status" aria-live="polite" class="ui-helper-hidden-accessible"></span>
- <input name="q" id="tipue_search_input" type="text" class="search_input search-query ui-autocomplete-input" placeholder="Search the Docs" autocomplete="off">
- </form>
- <ul class="nav">
- <li class=""><a href="http://www.docker.com/whatisdocker/" title="What is Docker">What is Docker?</a></li>
- <li class=""><a href="http://www.docker.com/resources/usecases/" title="Use Cases">Use Cases</a></li>
- <li class=""><a href="http://www.docker.com/tryit/" title="Try It!">Try It!</a></li>
- <li><a href="https://registry.hub.docker.com" title="Browse">Browse</a></li>
- </ul>
- <div id="usernav" class="pull-right">
- <a href="https://hub.docker.com/account/login" class="btn nav-button2" title="Lg In">Log In</a>
- <a href="https://hub.docker.com/account/signup" class="btn nav-button1" title="Sign Up">Sign Up</a>
- </div>
- </div>
-</div>
-<div id="topmostnav" class="topmostnav_loggedin navbar navbar-static-top">
- <div class="container">
- <a href="/" title="Docker Docs Home"><div class="brand logo"><img src="/img/nav/docker-logo-loggedin.png"> </div></a>
- <form id="nav_search" class="navbar-index-search pull-right" action="/jsearch/">
- <span role="status" aria-live="polite" class="ui-helper-hidden-accessible"></span>
- <input name="q" id="tipue_search_input" type="text" class="search_input search-query ui-autocomplete-input" placeholder="Search the Docs" autocomplete="off">
- </form>
- <ul class="nav">
- <li><a href="https://registry.hub.docker.com" title="Browse Repos">Browse Repos</a></li>
- <li class="active"><a href="http://docs.docker.com" title="Documentation">Documentation</a></li>
- <li><a href="http://www.docker.com/community/participate/" title="Community">Community</a></li>
- <li><a href="http://www.docker.com/resources/help/" title="Help">Help</a></li>
- </ul>
- <div id="usernav" class="pull-right">
- <ul class="nav user">
- <li class="dropdown">
- <a id="logged-in-header-username" class="dropdown-toggle" data-toggle="dropdown" href="#">
- <img class="profile" src="" alt="profile picture">
- </a>
- <ul class="dropdown-menu pull-right">
- <li><a href="https://hub.docker.com/">View Profile</a></li>
- <li><a href="https://hub.docker.com/account/settings/">Settings</a></li>
- <li><a href="https://hub.docker.com/repos/">My Repositories</a></li>
- <li><a href="https://hub.docker.com/plans/billing-info">Billing</a></li>
- <li><a href="https://hub.docker.com/account/logout/?next=/">Log out</a></li>
- </ul>
- </li>
- </ul>
- </div>
- </div>
-</div>
diff --git a/docs/theme/mkdocs/images/arrow left.svg b/docs/theme/mkdocs/images/arrow left.svg
deleted file mode 100644
index 4754eddd99..0000000000
--- a/docs/theme/mkdocs/images/arrow left.svg
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg width="21px" height="32px" viewBox="0 0 21 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns">
- <title>arrow left</title>
- <description>Created with Sketch (http://www.bohemiancoding.com/sketch)</description>
- <defs></defs>
- <g id="Page 1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
- <path d="M1.30859375,2 L19.3085938,15 L1.30859375,28 L1.30859375,2 Z M1.30859375,2" id="left" fill="#000000" transform="translate(10.308594, 15.000000) rotate(-180.000000) translate(-10.308594, -15.000000) "></path>
- </g>
-</svg> \ No newline at end of file
diff --git a/docs/theme/mkdocs/images/arrow right.svg b/docs/theme/mkdocs/images/arrow right.svg
deleted file mode 100644
index 481d9f6927..0000000000
--- a/docs/theme/mkdocs/images/arrow right.svg
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg width="22px" height="32px" viewBox="0 0 22 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns">
- <title>arror right</title>
- <description>Created with Sketch (http://www.bohemiancoding.com/sketch)</description>
- <defs></defs>
- <g id="Page 1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
- <path d="M2,2 L20,15 L2,28 L2,2 Z M2,2" id="Path 1" fill="#000000"></path>
- </g>
-</svg> \ No newline at end of file
diff --git a/docs/theme/mkdocs/images/docker-inc-light.svg b/docs/theme/mkdocs/images/docker-inc-light.svg
deleted file mode 100644
index 0c4564de9b..0000000000
--- a/docs/theme/mkdocs/images/docker-inc-light.svg
+++ /dev/null
@@ -1,74 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
- <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
-]>
-<svg version="1.1"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
- x="0px" y="0px" width="785px" height="122px" viewBox="-0.87 -0.967 785 122" enable-background="new -0.87 -0.967 785 122"
- xml:space="preserve">
-<defs>
-</defs>
-<path id="docker_1_" fill-rule="evenodd" clip-rule="evenodd" fill="#E6E6E6" d="M374.431,93.576
- c11.391-9.763,22.772-19.532,34.126-29.336c3.879-3.344,8.134-6.812,11.987-10.336c-3.091-3.887-8.25-6.696-12.636-8.368
- c-8.848-3.371-17.569-2.235-25.687,2.446c-10.619,6.13-15.15,15.9-14.751,28.054c0.159,4.784,1.445,9.395,3.988,13.47
- C372.351,90.94,373.354,92.29,374.431,93.576 M387.607,102.827c5.58,1.951,11.945,1.673,17.675,0.675
- c2.925-1.245,10.42-4.512,13.176-4.038l0.435,0.075l0.392,0.194c1.682,0.817,3.288,1.972,4.148,3.682
- c2.012,4.015,1.042,8.048-2.897,10.323l-1.315,0.764c-14.55,8.399-30.026,7.233-44.534-0.611
- c-6.935-3.748-12.237-9.317-16.153-16.103l-0.915-1.583c-9.343-16.176-8.08-33.196,2.456-48.581
- c3.635-5.317,8.386-9.427,13.944-12.638l2.104-1.214c13.708-7.91,28.393-7.371,42.47-0.427c7.564,3.734,13.694,9.301,17.918,16.617
- l0.762,1.315c3.068,5.326-0.907,9.957-5.012,13.126c-4.764,3.67-9.572,8.094-14.138,12.033
- C407.942,85.226,397.782,94.034,387.607,102.827z M496.64,29.228h1.521c4.601,0,7.675,3.103,7.675,7.678
- c0,6.352-6.069,7.978-11.321,7.978c-6.895,0-13.467,4.168-18.222,8.843c-5.923,5.844-8.514,13.316-8.514,21.54v37.136
- c0,4.26-2.661,7.677-7.062,7.677h-1.21c-4.412,0-7.069-3.417-7.069-7.677V73.133c0-15.081,7.341-27.385,19.578-36.025
- C479.327,31.95,487.69,29.228,496.64,29.228z M305.441,55.586c5.957-5.968,11.939-11.921,17.988-17.792
- c1.683-1.636,8.063-8.566,10.574-8.566h2.752l0.309,0.066c3.503,0.726,6.126,2.941,6.126,6.7v1.523c0,2.563-3.008,5.546-4.663,7.301
- c-3.526,3.735-7.234,7.348-10.844,11.01l-18.529,18.81c7.975,8,15.948,16.005,23.865,24.064c2.188,2.229,4.379,4.462,6.537,6.724
- c0.757,0.797,1.887,1.798,2.525,2.908c0.686,1.044,1.108,2.219,1.108,3.474v1.579l-0.092,0.367c-0.861,3.5-3.083,6.325-6.962,6.325
- h-1.22c-2.538,0-5.405-2.875-7.141-4.513c-3.582-3.378-7.046-6.931-10.56-10.379l-11.775-11.562v18.481
- c0,4.25-2.665,7.671-7.066,7.671h-1.212c-4.402,0-7.06-3.421-7.06-7.671V7.977c0-4.258,2.657-7.666,7.06-7.666h1.212
- c4.401,0,7.066,3.408,7.066,7.666V55.586z M255.675,45.196c-2.307-1.083-6.646-1.442-9.147-1.538
- c-12.817-0.483-22.091,6.734-27.534,18.04c-1.876,3.898-2.729,8.029-2.729,12.344c0,13.141,6.895,22.34,18.627,27.949
- c4.282,2.043,9.812,2.433,14.494,2.433c4.119,0,9.94-2.521,13.595-4.258l0.633-0.297h2.833l0.314,0.061
- c3.494,0.728,6.124,2.938,6.124,6.69v1.521c0,9.336-17.071,11.48-23.586,11.929c-22.982,1.593-40.17-11.03-46.729-32.952
- c-1.139-3.81-1.65-7.59-1.65-11.555v-3.04c0-16.633,8.251-29.811,22.521-38.286c6.643-3.94,13.975-5.918,21.683-5.918h3.041
- c8.175,0,15.708,2.321,22.457,6.934l0.56,0.383l0.344,0.574c0.729,1.21,1.359,2.609,1.359,4.048v1.519
- c0,3.917-2.931,6.02-6.468,6.702l-0.292,0.048h-0.905C262.929,48.525,257.726,46.16,255.675,45.196z M115.797,74.355
- c0,11.659,5.728,20.236,15.579,26.268c4.619,2.833,9.713,4.114,15.121,4.114c11.518,0,20.031-5.839,25.964-15.567
- c2.827-4.634,4.104-9.728,4.104-15.127c0-10.848-5.221-19.124-14.15-25.128c-4.893-3.293-10.337-4.942-16.229-4.942
- c-12.855,0-22.104,6.491-27.65,18.028C116.655,65.898,115.797,70.037,115.797,74.355z M144.666,28.619h2.126
- c17.775,0,31.29,8.623,39.857,24.141c3.425,6.206,5.258,12.98,5.258,20.074v3.044c0,16.628-8.2,29.882-22.534,38.294
- c-6.643,3.893-13.979,5.907-21.669,5.907h-3.038c-16.633,0-29.85-8.223-38.292-22.531c-3.918-6.642-5.913-13.969-5.913-21.67v-3.044
- c0-16.63,8.254-29.815,22.517-38.299C129.617,30.593,136.955,28.619,144.666,28.619z M15.337,74.355
- c0,12.016,5.824,21.04,16.353,26.806c4.254,2.325,8.876,3.576,13.735,3.576c11.789,0,20.535-5.561,26.567-15.555
- c2.802-4.647,4.114-9.733,4.114-15.14c0-10.413-4.933-18.54-13.324-24.571c-5.085-3.666-10.813-5.499-17.061-5.499
- c-12.852,0-22.102,6.491-27.655,18.028C16.193,65.898,15.337,70.037,15.337,74.355z M76.106,40.073V7.681
- C76.106,3.424,78.764,0,83.171,0h1.219c4.407,0,7.055,3.424,7.055,7.681v68.197c0,16.628-8.217,29.861-22.531,38.294
- c-6.639,3.9-13.978,5.907-21.674,5.907h-3.041c-16.63,0-29.847-8.223-38.287-22.531C1.992,90.906,0,83.579,0,75.878v-3.044
- c0-16.63,8.218-29.855,22.526-38.301c6.645-3.922,13.97-5.914,21.672-5.914h3.041C58.497,28.619,68.051,32.981,76.106,40.073z"/>
-<path fill="#E6E6E6" d="M569.769,119.69c-2.094,0-3.893-0.739-5.35-2.196c-1.456-1.457-2.196-3.256-2.196-5.349V36.028
- c0-2.093,0.74-3.893,2.196-5.35c1.457-1.457,3.256-2.195,5.35-2.195c2.093,0,3.892,0.738,5.349,2.195
- c1.459,1.458,2.196,3.257,2.196,5.35v76.117c0,2.092-0.737,3.891-2.196,5.349C573.66,118.952,571.861,119.69,569.769,119.69z
- M569.769,20.359c-2.571,0-4.795-0.92-6.609-2.735s-2.735-4.038-2.735-6.609c0-2.572,0.921-4.795,2.735-6.61
- c1.814-1.814,4.038-2.734,6.609-2.734c2.57,0,4.795,0.92,6.608,2.735c1.815,1.814,2.736,4.038,2.736,6.609
- c0,2.571-0.921,4.794-2.737,6.609C574.563,19.439,572.339,20.359,569.769,20.359z"/>
-<path fill="#E6E6E6" d="M670.718,119.69c-2.094,0-3.895-0.739-5.35-2.196c-1.457-1.458-2.196-3.257-2.196-5.349V73.636
- c0-4.146-0.793-8.092-2.357-11.729c-1.576-3.649-3.768-6.895-6.515-9.644c-2.748-2.747-5.994-4.937-9.644-6.512
- c-3.636-1.565-7.582-2.358-11.728-2.358c-4.148,0-8.096,0.793-11.729,2.359c-3.653,1.575-6.898,3.766-9.644,6.512
- c-2.749,2.749-4.939,5.994-6.514,9.644c-1.564,3.632-2.357,7.578-2.357,11.729v38.509c0,2.092-0.739,3.891-2.196,5.349
- c-1.457,1.457-3.256,2.196-5.35,2.196c-2.092,0-3.892-0.738-5.349-2.195c-1.458-1.458-2.196-3.257-2.196-5.35V73.636
- c0-6.24,1.204-12.193,3.581-17.694c2.363-5.479,5.621-10.317,9.683-14.376c4.056-4.058,8.893-7.315,14.376-9.682
- c5.506-2.376,11.458-3.581,17.694-3.581c6.233,0,12.186,1.204,17.693,3.58c5.483,2.369,10.318,5.625,14.377,9.682
- c4.058,4.06,7.315,8.897,9.683,14.376c2.376,5.509,3.581,11.462,3.581,17.695v38.509c0,2.093-0.74,3.893-2.196,5.35
- C674.609,118.952,672.809,119.69,670.718,119.69z"/>
-<path fill-rule="evenodd" clip-rule="evenodd" fill="#E6E6E6" d="M743.675,45.196c-2.307-1.083-6.646-1.442-9.147-1.538
- c-12.817-0.483-22.091,6.734-27.534,18.04c-1.876,3.898-2.729,8.029-2.729,12.344c0,13.141,6.895,22.34,18.627,27.949
- c4.282,2.043,9.812,2.433,14.494,2.433c4.119,0,9.94-2.521,13.595-4.258l0.633-0.297h2.833l0.314,0.061
- c3.494,0.728,6.124,2.938,6.124,6.69v1.521c0,9.336-17.071,11.48-23.586,11.929c-22.982,1.593-40.17-11.03-46.729-32.952
- c-1.139-3.81-1.65-7.59-1.65-11.555v-3.04c0-16.633,8.251-29.811,22.521-38.286c6.643-3.94,13.975-5.918,21.683-5.918h3.041
- c8.175,0,15.708,2.321,22.457,6.934l0.56,0.383l0.344,0.574c0.729,1.21,1.359,2.609,1.359,4.048v1.519
- c0,3.917-2.931,6.02-6.468,6.702l-0.292,0.048h-0.905C750.929,48.525,745.726,46.16,743.675,45.196z"/>
-<path fill="#E6E6E6" d="M768.339,112.19c0-2.073,0.732-3.843,2.196-5.307s3.23-2.196,5.307-2.196c2.073,0,3.843,0.732,5.307,2.196
- c1.465,1.464,2.196,3.234,2.196,5.307c0,2.076-0.731,3.843-2.196,5.307c-1.464,1.464-3.233,2.196-5.307,2.196
- c-2.076,0-3.843-0.732-5.307-2.196C769.071,116.033,768.339,114.266,768.339,112.19z"/>
-</svg>
diff --git a/docs/theme/mkdocs/images/docker-top-logo.png b/docs/theme/mkdocs/images/docker-top-logo.png
deleted file mode 100644
index e48626b3b2..0000000000
--- a/docs/theme/mkdocs/images/docker-top-logo.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/images/docker-white.png b/docs/theme/mkdocs/images/docker-white.png
deleted file mode 100644
index 3513b55016..0000000000
--- a/docs/theme/mkdocs/images/docker-white.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/images/docker-white.svg b/docs/theme/mkdocs/images/docker-white.svg
deleted file mode 100644
index b97d1f8724..0000000000
--- a/docs/theme/mkdocs/images/docker-white.svg
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
- <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
-]>
-<svg version="1.1"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
- x="0px" y="0px" width="507px" height="122px" viewBox="-0.87 -0.967 507 122"
- overflow="visible" enable-background="new -0.87 -0.967 507 122" xml:space="preserve">
-<defs>
-</defs>
-<path id="docker_1_" fill-rule="evenodd" clip-rule="evenodd" fill="#F2F2F2" d="M374.431,93.576
- c11.391-9.763,22.772-19.532,34.126-29.336c3.879-3.344,8.134-6.812,11.987-10.336c-3.091-3.887-8.25-6.696-12.636-8.368
- c-8.848-3.371-17.569-2.235-25.687,2.446c-10.619,6.13-15.15,15.9-14.751,28.054c0.159,4.784,1.445,9.395,3.988,13.47
- C372.351,90.94,373.354,92.29,374.431,93.576 M387.607,102.827c5.58,1.951,11.945,1.673,17.675,0.675
- c2.925-1.245,10.42-4.512,13.176-4.038l0.435,0.075l0.392,0.194c1.682,0.817,3.288,1.972,4.148,3.682
- c2.012,4.015,1.042,8.048-2.897,10.323l-1.315,0.764c-14.55,8.399-30.026,7.233-44.534-0.611
- c-6.935-3.748-12.237-9.317-16.153-16.103l-0.915-1.583c-9.343-16.176-8.08-33.196,2.456-48.581
- c3.635-5.317,8.386-9.427,13.944-12.638l2.104-1.214c13.708-7.91,28.393-7.371,42.47-0.427c7.564,3.734,13.694,9.301,17.918,16.617
- l0.762,1.315c3.068,5.326-0.907,9.957-5.012,13.126c-4.764,3.67-9.572,8.094-14.138,12.033
- C407.942,85.226,397.782,94.034,387.607,102.827z M496.64,29.228h1.521c4.601,0,7.675,3.103,7.675,7.678
- c0,6.352-6.069,7.978-11.321,7.978c-6.895,0-13.467,4.168-18.222,8.843c-5.923,5.844-8.514,13.316-8.514,21.54v37.136
- c0,4.26-2.661,7.677-7.062,7.677h-1.21c-4.412,0-7.069-3.417-7.069-7.677V73.133c0-15.081,7.341-27.385,19.578-36.025
- C479.327,31.95,487.69,29.228,496.64,29.228z M305.441,55.586c5.957-5.968,11.939-11.921,17.988-17.792
- c1.683-1.636,8.063-8.566,10.574-8.566h2.752l0.309,0.066c3.503,0.726,6.126,2.941,6.126,6.7v1.523c0,2.563-3.008,5.546-4.663,7.301
- c-3.526,3.735-7.234,7.348-10.844,11.01l-18.529,18.81c7.975,8,15.948,16.005,23.865,24.064c2.188,2.229,4.379,4.462,6.537,6.724
- c0.757,0.797,1.887,1.798,2.525,2.908c0.686,1.044,1.108,2.219,1.108,3.474v1.579l-0.092,0.367c-0.861,3.5-3.083,6.325-6.962,6.325
- h-1.22c-2.538,0-5.405-2.875-7.141-4.513c-3.582-3.378-7.046-6.931-10.56-10.379l-11.775-11.562v18.481
- c0,4.25-2.665,7.671-7.066,7.671h-1.212c-4.402,0-7.06-3.421-7.06-7.671V7.977c0-4.258,2.657-7.666,7.06-7.666h1.212
- c4.401,0,7.066,3.408,7.066,7.666V55.586z M255.675,45.196c-2.307-1.083-6.646-1.442-9.147-1.538
- c-12.817-0.483-22.091,6.734-27.534,18.04c-1.876,3.898-2.729,8.029-2.729,12.344c0,13.141,6.895,22.34,18.627,27.949
- c4.282,2.043,9.812,2.433,14.494,2.433c4.119,0,9.94-2.521,13.595-4.258l0.633-0.297h2.833l0.314,0.061
- c3.494,0.728,6.124,2.938,6.124,6.69v1.521c0,9.336-17.071,11.48-23.586,11.929c-22.982,1.593-40.17-11.03-46.729-32.952
- c-1.139-3.81-1.65-7.59-1.65-11.555v-3.04c0-16.633,8.251-29.811,22.521-38.286c6.643-3.94,13.975-5.918,21.683-5.918h3.041
- c8.175,0,15.708,2.321,22.457,6.934l0.56,0.383l0.344,0.574c0.729,1.21,1.359,2.609,1.359,4.048v1.519
- c0,3.917-2.931,6.02-6.468,6.702l-0.292,0.048h-0.905C262.929,48.525,257.726,46.16,255.675,45.196z M115.797,74.355
- c0,11.659,5.728,20.236,15.579,26.268c4.619,2.833,9.713,4.114,15.121,4.114c11.518,0,20.031-5.839,25.964-15.567
- c2.827-4.634,4.104-9.728,4.104-15.127c0-10.848-5.221-19.124-14.15-25.128c-4.893-3.293-10.337-4.942-16.229-4.942
- c-12.855,0-22.104,6.491-27.65,18.028C116.655,65.898,115.797,70.037,115.797,74.355z M144.666,28.619h2.126
- c17.775,0,31.29,8.623,39.857,24.141c3.425,6.206,5.258,12.98,5.258,20.074v3.044c0,16.628-8.2,29.882-22.534,38.294
- c-6.643,3.893-13.979,5.907-21.669,5.907h-3.038c-16.633,0-29.85-8.223-38.292-22.531c-3.918-6.642-5.913-13.969-5.913-21.67v-3.044
- c0-16.63,8.254-29.815,22.517-38.299C129.617,30.593,136.955,28.619,144.666,28.619z M15.337,74.355
- c0,12.016,5.824,21.04,16.353,26.806c4.254,2.325,8.876,3.576,13.735,3.576c11.789,0,20.535-5.561,26.567-15.555
- c2.802-4.647,4.114-9.733,4.114-15.14c0-10.413-4.933-18.54-13.324-24.571c-5.085-3.666-10.813-5.499-17.061-5.499
- c-12.852,0-22.102,6.491-27.655,18.028C16.193,65.898,15.337,70.037,15.337,74.355z M76.106,40.073V7.681
- C76.106,3.424,78.764,0,83.171,0h1.219c4.407,0,7.055,3.424,7.055,7.681v68.197c0,16.628-8.217,29.861-22.531,38.294
- c-6.639,3.9-13.978,5.907-21.674,5.907h-3.041c-16.63,0-29.847-8.223-38.287-22.531C1.992,90.906,0,83.579,0,75.878v-3.044
- c0-16.63,8.218-29.855,22.526-38.301c6.645-3.922,13.97-5.914,21.672-5.914h3.041C58.497,28.619,68.051,32.981,76.106,40.073z"/>
-</svg>
diff --git a/docs/theme/mkdocs/images/external-link-icon.png b/docs/theme/mkdocs/images/external-link-icon.png
deleted file mode 100644
index a38f55283b..0000000000
--- a/docs/theme/mkdocs/images/external-link-icon.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/images/external-link-icon.psd b/docs/theme/mkdocs/images/external-link-icon.psd
deleted file mode 100644
index e71ec10fab..0000000000
--- a/docs/theme/mkdocs/images/external-link-icon.psd
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/images/footer-links.png b/docs/theme/mkdocs/images/footer-links.png
deleted file mode 100644
index 2d13b662be..0000000000
--- a/docs/theme/mkdocs/images/footer-links.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/images/fork-us-on-github.png b/docs/theme/mkdocs/images/fork-us-on-github.png
deleted file mode 100644
index 404c6849c6..0000000000
--- a/docs/theme/mkdocs/images/fork-us-on-github.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/images/glyphicons-halflings-white.png b/docs/theme/mkdocs/images/glyphicons-halflings-white.png
deleted file mode 100644
index 3bf6484a29..0000000000
--- a/docs/theme/mkdocs/images/glyphicons-halflings-white.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/images/glyphicons-halflings.png b/docs/theme/mkdocs/images/glyphicons-halflings.png
deleted file mode 100644
index 686433b297..0000000000
--- a/docs/theme/mkdocs/images/glyphicons-halflings.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/images/homepage-docker-logo.png b/docs/theme/mkdocs/images/homepage-docker-logo.png
deleted file mode 100644
index 4f4df6a479..0000000000
--- a/docs/theme/mkdocs/images/homepage-docker-logo.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/images/page-blocks_03.png b/docs/theme/mkdocs/images/page-blocks_03.png
deleted file mode 100644
index 61eadf7dde..0000000000
--- a/docs/theme/mkdocs/images/page-blocks_03.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/images/page-blocks_03.svg b/docs/theme/mkdocs/images/page-blocks_03.svg
deleted file mode 100644
index b2e682ecc2..0000000000
--- a/docs/theme/mkdocs/images/page-blocks_03.svg
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
- <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
-]>
-<svg version="1.1"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
- x="0px" y="0px" width="110px" height="110px" viewBox="8 12 110 110" overflow="visible" enable-background="new 8 12 110 110"
- xml:space="preserve">
-<defs>
-</defs>
-<rect x="0.5" y="0.5" display="none" fill="#004B95" stroke="#000000" stroke-miterlimit="10" width="300" height="140"/>
-<path fill-rule="evenodd" clip-rule="evenodd" fill="none" d="M9.138,23.852h43.307v43.307H9.138V23.852z"/>
-<path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M44.871,26.241h3.296v34.747h-3.296V26.241z M38.555,26.241h3.425
- v34.747h-3.425V26.241z M32.239,26.241h3.422v34.747h-3.422V26.241z M25.923,26.241h3.42v34.747h-3.42V26.241z M19.607,26.241h3.422
- v34.747h-3.422V26.241z M13.417,26.241h3.294v34.747h-3.294V26.241z M9.945,22.772h41.692v41.691H9.945V22.772z"/>
-<path fill-rule="evenodd" clip-rule="evenodd" fill="none" d="M8.856,67.693h43.306V111H8.856V67.693z"/>
-<path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M44.589,71.97h3.296v34.747h-3.296V71.97z M38.273,71.97h3.425
- v34.747h-3.425V71.97z M31.957,71.97h3.422v34.747h-3.422V71.97z M25.641,71.97h3.42v34.747h-3.42V71.97z M19.326,71.97h3.421
- v34.747h-3.421V71.97z M13.135,71.97h3.294v34.747h-3.294V71.97z M9.664,68.5h41.691v41.692H9.664V68.5z"/>
-<path fill-rule="evenodd" clip-rule="evenodd" fill="none" d="M52.529,67.777h43.307v43.306H52.529V67.777z"/>
-<path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M90.15,72.054h3.296v34.747H90.15V72.054z M83.834,72.054h3.425
- v34.747h-3.425V72.054z M77.519,72.054h3.421v34.747h-3.421V72.054z M71.202,72.054h3.42v34.747h-3.42V72.054z M64.886,72.054h3.422
- v34.747h-3.422V72.054z M58.696,72.054h3.294v34.747h-3.294V72.054z M55.225,68.584h41.691v41.691H55.225V68.584z"/>
-<rect id="_x3C_Slice_x3E__3_" x="8" y="12" fill-rule="evenodd" clip-rule="evenodd" fill="none" width="110" height="110"/>
-</svg>
diff --git a/docs/theme/mkdocs/images/page-blocks_05.png b/docs/theme/mkdocs/images/page-blocks_05.png
deleted file mode 100644
index 3b62ee05ef..0000000000
--- a/docs/theme/mkdocs/images/page-blocks_05.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/images/page-blocks_05.svg b/docs/theme/mkdocs/images/page-blocks_05.svg
deleted file mode 100644
index e049763d88..0000000000
--- a/docs/theme/mkdocs/images/page-blocks_05.svg
+++ /dev/null
@@ -1,63 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
- <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
-]>
-<svg version="1.1"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
- x="0px" y="0px" width="110px" height="110px" viewBox="11 12 110 110" overflow="visible" enable-background="new 11 12 110 110"
- xml:space="preserve">
-<defs>
-</defs>
-<rect x="0.5" y="0.5" display="none" fill="#004B95" stroke="#000000" stroke-miterlimit="10" width="300" height="140"/>
-<path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" stroke="#FFFFFF" stroke-width="0.0476" stroke-miterlimit="22.9256" d="
- M41.574,50.073H43.4l1.185,1.004l0.184,1.917l-2.009-0.274L41.574,51.9V50.073L41.574,50.073z M76.12,41.057l-1.456,1.455v1.591
- l-0.27,0.864l-0.047,3.636l0.5,0.819l1.545,0.818l0.455-0.908l-1.682-2.091l-0.136-1.819l0.41-0.272l-0.091-2.364l1-0.728
- L76.12,41.057L76.12,41.057z M73.438,32.782l1.181-0.045l0.864,0.818l3.773,0.183l0.138,0.863l-0.729,0.818l-0.317-0.955
- l-1.408-0.227l-0.227,0.455l-0.728-0.183l-0.59-0.499l-1.412-0.045L73.438,32.782L73.438,32.782z M61.639,37.802l1.161,0.181
- l1.022-1.138l0.658,0.091l0.318,0.524v0.798l-0.796,0.636l-0.659-0.204l0.182,0.547l0.159,0.91l-1.455,1.274l-0.159,1.503h-0.569
- l-0.021-2.847l-0.228-0.636L61.639,37.802L61.639,37.802z M43.675,64.132l0.09-0.866L43.034,62.9l-1.323,0.684l-0.593,1.599
- l1.368,0.045L43.675,64.132L43.675,64.132z M46.502,60.572l-0.91-0.274l-1.007,0.547l0.046,2.556l0.502,0.183l0.184,0.914
- l-0.503,1.095l-0.639,1.598l0.73,0.457l0.639,0.867l1.323-0.684l0.915-0.915l-1.233-2.28l-0.365-1.553l-0.137-1.324L46.502,60.572
- L46.502,60.572z M32.992,47.517v-2.282L35,43.134l1.461-2.646l4.199-2.191l1.733-2.1l4.84-2.83l1.643-2.375l0.913,0.548l1.279-1.096
- l4.291,0.183h3.012l2.008,0.913l-0.273,1.186l-1.278,0.729l-0.456,1.188l-1.553,1.278l-1.276-0.09l-2.009,1.733l-0.183,1.37
- l-1.552,0.091l-0.549,1.552l-1.826,1.276l-1.186,0.549l-1.188-0.549l-0.821,1.279l-0.457,2.283L44.859,43.5l-0.912,1.187
- l0.638,1.186l-0.455,1.005l-1.097-1.187l-1.553,0.366l-0.546-0.914l-1.279,0.914l-1.369,0.09l-1.095-0.729l-1.917,2.009
- l-1.278,0.548L32.992,47.517L32.992,47.517z M69.729,111.151c10.419-0.97,19.778-5.622,26.775-12.645
- c4.926-4.951,8.682-11.078,10.81-17.926l-1.315-1.195l-2.03,2.319l-0.291,1.353l-0.675,1.209l-0.096,1.354l-1.307,1.352
- l-1.258,1.646l-0.723,1.931l0.193,1.693l-0.726,0.917l-0.868-0.146l-0.532-1.16l-0.823-1.789l0.097-2.175l-1.403-0.434l-0.675-0.723
- l-0.871-0.098l-0.53,0.434l-0.438-0.82h-1.012l-1.063,0.531l-0.921-0.531l-1.257,1.256l-1.256-0.049l-0.288-0.484l-0.582,0.484
- l-2.369-0.097l-1.256-0.58l-1.16-1.063l-0.579,0.533l-0.919-0.097l0.145,1.304l0.484,0.097l0.242,0.434l0.771,2.272l1.597,0.387
- l0.386-0.771l1.594-0.726l0.678-0.482l1.498,1.063l0.725,0.384l-0.484,1.161l-1.11,1.353l-1.789,1.499l-1.79,1.353l-1.498,1.352
- l-1.208,0.242l-1.353,0.098l-1.16,1.304l-0.484-0.29l-0.966-0.046l-0.145-1.258l-0.389-0.87L75.5,94.898l-0.145-1.208l-0.437,0.436
- l-0.916,0.337l-0.243-1.836l-0.725-1.45l-0.967-0.918l-0.966-1.015l-1.498-0.096l-0.049,0.965l0.338,0.581l1.354,1.403l1.403,1.835
- l0.772,2.127l0.628,0.967l1.931,1.691l1.257,1.354l1.498-0.676l1.79-0.05l0.434-0.821l1.064,0.096l-0.482,1.208l-1.257,1.597
- l-1.738,1.499l-0.774,1.159l-2.031,1.063l-1.739,1.159l-0.967,0.92l-0.096,1.836l-1.305,1.21L69.729,111.151L69.729,111.151z
- M27.944,45.445c-3.773,6.484-5.938,14.028-5.938,22.077h0.001l0,0v0h-0.001c0,12.1,4.886,23.053,12.783,30.983
- c6.267,6.293,14.43,10.681,23.552,12.225l-0.29-1.425l-0.87-0.485l-1.016-0.82l-0.916-0.677l-0.968-1.885l-0.532-0.146l-1.016-0.919
- l-0.046-2.367l-0.822-0.966l-1.112-0.243l-1.402,0.243l-0.918-0.967l-1.451-0.775l-0.771-0.046l-1.5,0.096l-2.031-0.531
- l-1.739-1.063l-1.692-1.255l-1.401-1.355l-1.064-1.69l-1.498-1.017l-0.386-1.062l-0.049-5.896l0.29-1.888l1.499-1.399l0.965,0.097
- l1.258-0.822l1.305-0.774l0.677-1.547l0.533-0.049l1.256,0.727l0.434,0.338l1.498,0.049l0.533,0.24l6.281,0.098l1.354,1.401
- l0.244,2.224l2.609,0.918l0.098,0.918l0.725,0.146l2.125,1.208l0.677-0.049l1.208-1.98l0.871-0.049l1.788,1.208l1.307,0.387
- l2.222,0.145l3.432-0.097l1.014-0.869l0.291-1.305l0.532-0.58l-0.532-0.918l-0.917-0.34l-1.257,0.146l-1.112-0.482l-0.677,0.386
- l-1.016-0.049l-0.868-1.256l-1.112-1.16l-0.389-0.772l-0.82-0.097l-0.773,0.918l-0.29,1.691L61,81.801l-0.192-1.256l-0.725-0.533
- l-0.146-0.87l-0.629-0.773l-1.982-1.74l-0.821-0.821l-0.194-0.726H55.25l0.145,0.822l0.434,1.643h0.726l1.209,0.871l0.772,0.674
- v0.534l-0.532-0.048l-0.24,1.208l-0.822,0.191v-1.739l-1.887-0.917l-0.966-1.112l-0.917-2.079l-4.012-0.049l-1.353,0.531
- l-1.79,1.355l-0.675,1.062l-1.016,0.388l-1.69-0.049l-2.176-1.449l-0.098-1.208l0.485-1.209l0.146-2.61l0.628-0.386l0.435,0.338
- l1.933,1.595l1.693,0.096l0.434-0.627l0.048-1.789l-1.644-1.788L44.325,68.8l0.629-0.097l2.078,1.063L48,68.655l1.98-0.194
- l1.354-1.159h0.579l0.725-0.484h1.208l0.243-1.594l0.966-1.062l0.436,0.772l-0.068,0.714L54.9,66.167l-0.179,1.267l1.717,0.631
- l1.805-0.452l1.355-0.091l2.169-0.361v-1.536l1.538-0.453l0.721-1.626l2.53-0.091l-0.091-1.263l-0.902-0.362l-1.537,0.454
- l-1.175,0.269v-2.078l0.724-1.355l0.904-0.452l0.181-1.535l-1.809,0.09l-1.175,1.897l-1.535,0.902v1.447l0.904,0.815v1.084
- l-1.627,0.088l-1.264,2.802l-1.716-0.271l0.27-2.619l-0.723-0.724l-2.169,0.994l-0.812-0.724l0.271-3.795l4.246-1.534l2.351-3.074
- l1.535-1.083l1.899-1.538l6.233,0.181l1.718,1.717l1.988,2.169l-4.429,0.543v1.446l0.815,0.721l1.896,0.362l4.518-4.155l1.625-0.453
- l2.532-1.084l0.453-1.625l0.812-1.176l2.26,0.271v-1.083l-2.439-2.169l-0.093-1.176l1.625-0.36l0.363,1.715l3.073,2.667l0.091-1.49
- l-1.448-1.177l-0.723-1.626l1.446-1.896l-1.716-1.084l1.356-1.447l-1.448-0.271l0.272-3.612l-1.897-1.899l2.801-1.175l1.447,1.164
- l3.253-1.447l0.327-3.267c-6.958-4.716-15.347-7.468-24.372-7.468l0,0h-0.001l0,0l0,0c-9.982,0-19.183,3.366-26.536,9.031
- l1.852-0.276l1.891-1.413l1.051-0.797l1.596-0.434l1.161-0.501l-0.136,0.409l-3.099,1.527l-1.459,1.184l0.044,1.642l-2.302,0.98
- l-1.617,0.957l-1.229,1.208l-0.184,1.051l-0.592,0.432l-0.366-0.502l0.616-0.798l0.479-1.026l-0.274-1.207l-1.276,1.89l-2.119,3.146
- l-0.071,2.099l-2.552,3.373l-0.114,1.322l-0.296,1.004l-0.319,1.161h-1.071l-0.068-1.139l-0.273-0.435l-0.114-1.8L27.944,45.445
- L27.944,45.445z M65.657,23.401c-24.309,0-44.024,19.79-44.024,44.192c0,24.403,19.715,44.192,44.024,44.192
- c24.31,0,44.025-19.789,44.025-44.192C109.682,43.191,89.966,23.401,65.657,23.401z"/>
-<circle fill="none" stroke="#FFFFFF" stroke-width="1.6526" stroke-miterlimit="10" cx="65.662" cy="67.348" r="44.307"/>
-<rect id="_x3C_Slice_x3E__3_" x="11" y="12" fill-rule="evenodd" clip-rule="evenodd" fill="none" width="110" height="110"/>
-</svg>
diff --git a/docs/theme/mkdocs/images/page-blocks_07.png b/docs/theme/mkdocs/images/page-blocks_07.png
deleted file mode 100644
index ee31fa0273..0000000000
--- a/docs/theme/mkdocs/images/page-blocks_07.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/images/page-blocks_07.svg b/docs/theme/mkdocs/images/page-blocks_07.svg
deleted file mode 100644
index d7e74c0a87..0000000000
--- a/docs/theme/mkdocs/images/page-blocks_07.svg
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
- <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
-]>
-<svg version="1.1"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
- x="0px" y="0px" width="110px" height="110px" viewBox="12 12 110 110" overflow="visible" enable-background="new 12 12 110 110"
- xml:space="preserve">
-<defs>
-</defs>
-<rect x="0.5" y="0.5" display="none" fill="#004B95" stroke="#000000" stroke-miterlimit="10" width="300" height="140"/>
-<path fill="#FFFFFF" d="M20.464,79.442c0,11.663,9.437,17.089,21.099,17.089h49.874c11.663,0,21.101-5.426,21.101-17.089
- c0-8.958-5.583-16.593-13.446-19.662l0.018-0.479c0-12.18-9.879-22.06-22.059-22.06c-7.711,0-14.483,3.953-18.435,9.938
- c-2.13-1.439-4.7-2.265-7.461-2.265c-7.425,0-13.428,6.003-13.428,13.428v0.346C27.904,60.49,20.464,69.104,20.464,79.442z"/>
-<rect id="_x3C_Slice_x3E__3_" x="12" y="12" fill-rule="evenodd" clip-rule="evenodd" fill="none" width="110" height="110"/>
-</svg>
diff --git a/docs/theme/mkdocs/images/social/docker_social_logos.png b/docs/theme/mkdocs/images/social/docker_social_logos.png
deleted file mode 100644
index 5bde456365..0000000000
--- a/docs/theme/mkdocs/images/social/docker_social_logos.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/images/source_artwork/banner-frontpage-usecases.ai b/docs/theme/mkdocs/images/source_artwork/banner-frontpage-usecases.ai
deleted file mode 100644
index 8aee9f447f..0000000000
--- a/docs/theme/mkdocs/images/source_artwork/banner-frontpage-usecases.ai
+++ /dev/null
@@ -1,1340 +0,0 @@
-%PDF-1.5 %âãÏÓ
-1 0 obj <</Metadata 2 0 R/OCProperties<</D<</ON[5 0 R 42 0 R]/Order 43 0 R/RBGroups[]>>/OCGs[5 0 R 42 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <</Length 42468/Subtype/XML/Type/Metadata>>stream
-<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
-<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00 ">
- <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
- <rdf:Description rdf:about=""
- xmlns:dc="http://purl.org/dc/elements/1.1/">
- <dc:format>application/pdf</dc:format>
- <dc:title>
- <rdf:Alt>
- <rdf:li xml:lang="x-default">Web</rdf:li>
- </rdf:Alt>
- </dc:title>
- </rdf:Description>
- <rdf:Description rdf:about=""
- xmlns:xmp="http://ns.adobe.com/xap/1.0/"
- xmlns:xmpGImg="http://ns.adobe.com/xap/1.0/g/img/">
- <xmp:CreatorTool>Adobe Illustrator CS5.1</xmp:CreatorTool>
- <xmp:CreateDate>2013-10-28T18:49:06-07:00</xmp:CreateDate>
- <xmp:ModifyDate>2013-10-28T23:04:16-07:00</xmp:ModifyDate>
- <xmp:MetadataDate>2013-10-28T23:04:16-07:00</xmp:MetadataDate>
- <xmp:Thumbnails>
- <rdf:Alt>
- <rdf:li rdf:parseType="Resource">
- <xmpGImg:width>256</xmpGImg:width>
- <xmpGImg:height>76</xmpGImg:height>
- <xmpGImg:format>JPEG</xmpGImg:format>
- <xmpGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA&#xA;AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK&#xA;DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f&#xA;Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgATAEAAwER&#xA;AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA&#xA;AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB&#xA;UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE&#xA;1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ&#xA;qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy&#xA;obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp&#xA;0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo&#xA;+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4qlPmTzNp3l60gu78S&#xA;GK4uI7WP0lDH1Ja8a1K7bZkafTSzEiPQX8mjPqI4gDLqaTbMdvdirsVdirCdZ/OLyPpV7cWMlxNc&#xA;3do7RXMVvCzcJEPFkLNwWo9jmPPUwiaLs9P2RnyxEgBR80Dafnn5QuLqOA2uoQRu3E3MsKekn+U3&#xA;GRmp8lyA1kCa3ciXYGoESfSfK9/ueiZlukdirsVdirsVS+81yys9X0/S5w63GpiX6q4WsZaBQ7IW&#xA;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&#xA;XYq7FXYq7FX/2Q==</xmpGImg:image>
- </rdf:li>
- </rdf:Alt>
- </xmp:Thumbnails>
- </rdf:Description>
- <rdf:Description rdf:about=""
- xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
- xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#"
- xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#"
- xmlns:stMfs="http://ns.adobe.com/xap/1.0/sType/ManifestItem#">
- <xmpMM:RenditionClass>proof:pdf</xmpMM:RenditionClass>
- <xmpMM:OriginalDocumentID>uuid:65E6390686CF11DBA6E2D887CEACB407</xmpMM:OriginalDocumentID>
- <xmpMM:DocumentID>xmp.did:0580117407206811808380D9EE884C4F</xmpMM:DocumentID>
- <xmpMM:InstanceID>uuid:ea1f37fe-972d-7b4a-92d8-bf119d38176a</xmpMM:InstanceID>
- <xmpMM:DerivedFrom rdf:parseType="Resource">
- <stRef:instanceID>xmp.iid:0480117407206811808380D9EE884C4F</stRef:instanceID>
- <stRef:documentID>xmp.did:0480117407206811808380D9EE884C4F</stRef:documentID>
- <stRef:originalDocumentID>uuid:65E6390686CF11DBA6E2D887CEACB407</stRef:originalDocumentID>
- <stRef:renditionClass>proof:pdf</stRef:renditionClass>
- </xmpMM:DerivedFrom>
- <xmpMM:History>
- <rdf:Seq>
- <rdf:li rdf:parseType="Resource">
- <stEvt:action>saved</stEvt:action>
- <stEvt:instanceID>xmp.iid:0480117407206811808380D9EE884C4F</stEvt:instanceID>
- <stEvt:when>2013-10-28T18:47:59-07:00</stEvt:when>
- <stEvt:softwareAgent>Adobe Illustrator CS5.1</stEvt:softwareAgent>
- <stEvt:changed>/</stEvt:changed>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <stEvt:action>saved</stEvt:action>
- <stEvt:instanceID>xmp.iid:0580117407206811808380D9EE884C4F</stEvt:instanceID>
- <stEvt:when>2013-10-28T18:49:06-07:00</stEvt:when>
- <stEvt:softwareAgent>Adobe Illustrator CS5.1</stEvt:softwareAgent>
- <stEvt:changed>/</stEvt:changed>
- </rdf:li>
- </rdf:Seq>
- </xmpMM:History>
- <xmpMM:Manifest>
- <rdf:Seq>
- <rdf:li rdf:parseType="Resource">
- <stMfs:linkForm>EmbedByReference</stMfs:linkForm>
- <stMfs:reference rdf:parseType="Resource">
- <stRef:filePath>/Users/thatcher/Dropbox/FILE_EXCHANGE/mailgun_150.png</stRef:filePath>
- </stMfs:reference>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <stMfs:linkForm>EmbedByReference</stMfs:linkForm>
- <stMfs:reference rdf:parseType="Resource">
- <stRef:filePath>/Users/thatcher/Dropbox/FILE_EXCHANGE/mailgun_150.png</stRef:filePath>
- </stMfs:reference>
- </rdf:li>
- </rdf:Seq>
- </xmpMM:Manifest>
- </rdf:Description>
- <rdf:Description rdf:about=""
- xmlns:illustrator="http://ns.adobe.com/illustrator/1.0/">
- <illustrator:StartupProfile>Web</illustrator:StartupProfile>
- <illustrator:Type>Document</illustrator:Type>
- </rdf:Description>
- <rdf:Description rdf:about=""
- xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/"
- xmlns:stDim="http://ns.adobe.com/xap/1.0/sType/Dimensions#"
- xmlns:xmpG="http://ns.adobe.com/xap/1.0/g/">
- <xmpTPg:NPages>1</xmpTPg:NPages>
- <xmpTPg:HasVisibleTransparency>True</xmpTPg:HasVisibleTransparency>
- <xmpTPg:HasVisibleOverprint>False</xmpTPg:HasVisibleOverprint>
- <xmpTPg:MaxPageSize rdf:parseType="Resource">
- <stDim:w>120.000000</stDim:w>
- <stDim:h>80.000000</stDim:h>
- <stDim:unit>Pixels</stDim:unit>
- </xmpTPg:MaxPageSize>
- <xmpTPg:PlateNames>
- <rdf:Seq>
- <rdf:li>Cyan</rdf:li>
- <rdf:li>Magenta</rdf:li>
- <rdf:li>Yellow</rdf:li>
- <rdf:li>Black</rdf:li>
- </rdf:Seq>
- </xmpTPg:PlateNames>
- <xmpTPg:SwatchGroups>
- <rdf:Seq>
- <rdf:li rdf:parseType="Resource">
- <xmpG:groupName>Default Swatch Group</xmpG:groupName>
- <xmpG:groupType>0</xmpG:groupType>
- <xmpG:Colorants>
- <rdf:Seq>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>White</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>255</xmpG:red>
- <xmpG:green>255</xmpG:green>
- <xmpG:blue>255</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>Black</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>0</xmpG:red>
- <xmpG:green>0</xmpG:green>
- <xmpG:blue>0</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>RGB Red</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>255</xmpG:red>
- <xmpG:green>0</xmpG:green>
- <xmpG:blue>0</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>RGB Yellow</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>255</xmpG:red>
- <xmpG:green>255</xmpG:green>
- <xmpG:blue>0</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>RGB Green</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>0</xmpG:red>
- <xmpG:green>255</xmpG:green>
- <xmpG:blue>0</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>RGB Cyan</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>0</xmpG:red>
- <xmpG:green>255</xmpG:green>
- <xmpG:blue>255</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>RGB Blue</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>0</xmpG:red>
- <xmpG:green>0</xmpG:green>
- <xmpG:blue>255</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>RGB Magenta</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>255</xmpG:red>
- <xmpG:green>0</xmpG:green>
- <xmpG:blue>255</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=193 G=39 B=45</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>193</xmpG:red>
- <xmpG:green>39</xmpG:green>
- <xmpG:blue>45</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=237 G=28 B=36</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>237</xmpG:red>
- <xmpG:green>28</xmpG:green>
- <xmpG:blue>36</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=241 G=90 B=36</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>241</xmpG:red>
- <xmpG:green>90</xmpG:green>
- <xmpG:blue>36</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=247 G=147 B=30</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>247</xmpG:red>
- <xmpG:green>147</xmpG:green>
- <xmpG:blue>30</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=251 G=176 B=59</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>251</xmpG:red>
- <xmpG:green>176</xmpG:green>
- <xmpG:blue>59</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=252 G=238 B=33</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>252</xmpG:red>
- <xmpG:green>238</xmpG:green>
- <xmpG:blue>33</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=217 G=224 B=33</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>217</xmpG:red>
- <xmpG:green>224</xmpG:green>
- <xmpG:blue>33</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=140 G=198 B=63</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>140</xmpG:red>
- <xmpG:green>198</xmpG:green>
- <xmpG:blue>63</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=57 G=181 B=74</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>57</xmpG:red>
- <xmpG:green>181</xmpG:green>
- <xmpG:blue>74</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=0 G=146 B=69</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>0</xmpG:red>
- <xmpG:green>146</xmpG:green>
- <xmpG:blue>69</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=0 G=104 B=55</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>0</xmpG:red>
- <xmpG:green>104</xmpG:green>
- <xmpG:blue>55</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=34 G=181 B=115</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>34</xmpG:red>
- <xmpG:green>181</xmpG:green>
- <xmpG:blue>115</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=0 G=169 B=157</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>0</xmpG:red>
- <xmpG:green>169</xmpG:green>
- <xmpG:blue>157</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=41 G=171 B=226</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>41</xmpG:red>
- <xmpG:green>171</xmpG:green>
- <xmpG:blue>226</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=0 G=113 B=188</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>0</xmpG:red>
- <xmpG:green>113</xmpG:green>
- <xmpG:blue>188</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=46 G=49 B=146</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>46</xmpG:red>
- <xmpG:green>49</xmpG:green>
- <xmpG:blue>146</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=27 G=20 B=100</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>27</xmpG:red>
- <xmpG:green>20</xmpG:green>
- <xmpG:blue>100</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=102 G=45 B=145</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>102</xmpG:red>
- <xmpG:green>45</xmpG:green>
- <xmpG:blue>145</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=147 G=39 B=143</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>147</xmpG:red>
- <xmpG:green>39</xmpG:green>
- <xmpG:blue>143</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=158 G=0 B=93</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>158</xmpG:red>
- <xmpG:green>0</xmpG:green>
- <xmpG:blue>93</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=212 G=20 B=90</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>212</xmpG:red>
- <xmpG:green>20</xmpG:green>
- <xmpG:blue>90</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=237 G=30 B=121</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>237</xmpG:red>
- <xmpG:green>30</xmpG:green>
- <xmpG:blue>121</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=199 G=178 B=153</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>199</xmpG:red>
- <xmpG:green>178</xmpG:green>
- <xmpG:blue>153</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=153 G=134 B=117</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>153</xmpG:red>
- <xmpG:green>134</xmpG:green>
- <xmpG:blue>117</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=115 G=99 B=87</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>115</xmpG:red>
- <xmpG:green>99</xmpG:green>
- <xmpG:blue>87</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=83 G=71 B=65</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>83</xmpG:red>
- <xmpG:green>71</xmpG:green>
- <xmpG:blue>65</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=198 G=156 B=109</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>198</xmpG:red>
- <xmpG:green>156</xmpG:green>
- <xmpG:blue>109</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=166 G=124 B=82</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>166</xmpG:red>
- <xmpG:green>124</xmpG:green>
- <xmpG:blue>82</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=140 G=98 B=57</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>140</xmpG:red>
- <xmpG:green>98</xmpG:green>
- <xmpG:blue>57</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=117 G=76 B=36</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>117</xmpG:red>
- <xmpG:green>76</xmpG:green>
- <xmpG:blue>36</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=96 G=56 B=19</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>96</xmpG:red>
- <xmpG:green>56</xmpG:green>
- <xmpG:blue>19</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=66 G=33 B=11</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>66</xmpG:red>
- <xmpG:green>33</xmpG:green>
- <xmpG:blue>11</xmpG:blue>
- </rdf:li>
- </rdf:Seq>
- </xmpG:Colorants>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:groupName>Grays</xmpG:groupName>
- <xmpG:groupType>1</xmpG:groupType>
- <xmpG:Colorants>
- <rdf:Seq>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=0 G=0 B=0</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>0</xmpG:red>
- <xmpG:green>0</xmpG:green>
- <xmpG:blue>0</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=26 G=26 B=26</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>26</xmpG:red>
- <xmpG:green>26</xmpG:green>
- <xmpG:blue>26</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=51 G=51 B=51</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>51</xmpG:red>
- <xmpG:green>51</xmpG:green>
- <xmpG:blue>51</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=77 G=77 B=77</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>77</xmpG:red>
- <xmpG:green>77</xmpG:green>
- <xmpG:blue>77</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=102 G=102 B=102</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>102</xmpG:red>
- <xmpG:green>102</xmpG:green>
- <xmpG:blue>102</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=128 G=128 B=128</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>128</xmpG:red>
- <xmpG:green>128</xmpG:green>
- <xmpG:blue>128</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=153 G=153 B=153</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>153</xmpG:red>
- <xmpG:green>153</xmpG:green>
- <xmpG:blue>153</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=179 G=179 B=179</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>179</xmpG:red>
- <xmpG:green>179</xmpG:green>
- <xmpG:blue>179</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=204 G=204 B=204</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>204</xmpG:red>
- <xmpG:green>204</xmpG:green>
- <xmpG:blue>204</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=230 G=230 B=230</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>230</xmpG:red>
- <xmpG:green>230</xmpG:green>
- <xmpG:blue>230</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=242 G=242 B=242</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>242</xmpG:red>
- <xmpG:green>242</xmpG:green>
- <xmpG:blue>242</xmpG:blue>
- </rdf:li>
- </rdf:Seq>
- </xmpG:Colorants>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:groupName>Web Color Group</xmpG:groupName>
- <xmpG:groupType>1</xmpG:groupType>
- <xmpG:Colorants>
- <rdf:Seq>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=63 G=169 B=245</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>63</xmpG:red>
- <xmpG:green>169</xmpG:green>
- <xmpG:blue>245</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=122 G=201 B=67</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>122</xmpG:red>
- <xmpG:green>201</xmpG:green>
- <xmpG:blue>67</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=255 G=147 B=30</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>255</xmpG:red>
- <xmpG:green>147</xmpG:green>
- <xmpG:blue>30</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=255 G=29 B=37</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>255</xmpG:red>
- <xmpG:green>29</xmpG:green>
- <xmpG:blue>37</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=255 G=123 B=172</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>255</xmpG:red>
- <xmpG:green>123</xmpG:green>
- <xmpG:blue>172</xmpG:blue>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=189 G=204 B=212</xmpG:swatchName>
- <xmpG:mode>RGB</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:red>189</xmpG:red>
- <xmpG:green>204</xmpG:green>
- <xmpG:blue>212</xmpG:blue>
- </rdf:li>
- </rdf:Seq>
- </xmpG:Colorants>
- </rdf:li>
- </rdf:Seq>
- </xmpTPg:SwatchGroups>
- </rdf:Description>
- <rdf:Description rdf:about=""
- xmlns:pdf="http://ns.adobe.com/pdf/1.3/">
- <pdf:Producer>Adobe PDF library 9.90</pdf:Producer>
- </rdf:Description>
- </rdf:RDF>
-</x:xmpmeta>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-<?xpacket end="w"?> endstream endobj 3 0 obj <</Count 6/Kids[7 0 R 44 0 R 45 0 R 46 0 R 47 0 R 48 0 R]/Type/Pages>> endobj 7 0 obj <</ArtBox[0.0 0.0 940.0 94.0]/BleedBox[0.0 0.0 940.0 94.0]/Contents 49 0 R/Group 50 0 R/LastModified(D:20131028230415-07'00')/MediaBox[0.0 0.0 940.0 94.0]/Parent 3 0 R/PieceInfo<</Illustrator 51 0 R>>/Resources<</ColorSpace<</CS0 52 0 R/CS1 52 0 R/CS2 53 0 R>>/ExtGState<</GS0 54 0 R/GS1 55 0 R>>/ProcSet[/PDF/ImageC/ImageI]/Properties<</MC0 42 0 R>>/Shading<</Sh0 56 0 R/Sh1 57 0 R>>/XObject<</Fm0 58 0 R/Fm1 59 0 R/Im0 60 0 R>>>>/Thumb 20 0 R/TrimBox[0.0 0.0 940.0 94.0]/Type/Page>> endobj 44 0 obj <</ArtBox[10.4395 21.1074 110.0 61.0]/BleedBox[0.0 0.0 120.0 80.0]/Contents 61 0 R/Group 62 0 R/LastModified(D:20131028230415-07'00')/MediaBox[0.0 0.0 120.0 80.0]/Parent 3 0 R/PieceInfo<</Illustrator 51 0 R>>/Resources<</ColorSpace<</CS0 52 0 R>>/ExtGState<</GS0 54 0 R>>/Properties<</MC0 42 0 R>>>>/TrimBox[0.0 0.0 120.0 80.0]/Type/Page>> endobj 45 0 obj <</ArtBox[14.2656 26.2324 110.0 54.0]/BleedBox[0.0 0.0 120.0 80.0]/Contents 63 0 R/Group 64 0 R/LastModified(D:20131028230415-07'00')/MediaBox[0.0 0.0 120.0 80.0]/Parent 3 0 R/PieceInfo<</Illustrator 51 0 R>>/Resources<</ColorSpace<</CS0 52 0 R/CS1 52 0 R>>/ExtGState<</GS0 54 0 R/GS1 55 0 R>>/Properties<</MC0 42 0 R>>/Shading<</Sh0 56 0 R/Sh1 57 0 R>>/XObject<</Fm0 65 0 R/Fm1 66 0 R>>>>/TrimBox[0.0 0.0 120.0 80.0]/Type/Page>> endobj 46 0 obj <</ArtBox[10.0 25.1318 104.349 62.3301]/BleedBox[0.0 0.0 120.0 80.0]/Contents 67 0 R/Group 68 0 R/LastModified(D:20131028230415-07'00')/MediaBox[0.0 0.0 120.0 80.0]/Parent 3 0 R/PieceInfo<</Illustrator 51 0 R>>/Resources<</ColorSpace<</CS0 52 0 R>>/ExtGState<</GS0 54 0 R>>/Properties<</MC0 42 0 R>>>>/TrimBox[0.0 0.0 120.0 80.0]/Type/Page>> endobj 47 0 obj <</ArtBox[5.0 26.0 111.0 56.2861]/BleedBox[0.0 0.0 120.0 80.0]/Contents 69 0 R/Group 70 0 R/LastModified(D:20131028230415-07'00')/MediaBox[0.0 0.0 120.0 80.0]/Parent 3 0 R/PieceInfo<</Illustrator 51 0 R>>/Resources<</ColorSpace<</CS0 53 0 R>>/ExtGState<</GS0 54 0 R>>/ProcSet[/PDF/ImageC/ImageI]/Properties<</MC0 42 0 R>>/XObject<</Im0 60 0 R>>>>/TrimBox[0.0 0.0 120.0 80.0]/Type/Page>> endobj 48 0 obj <</ArtBox[12.0 29.0 108.077 52.124]/BleedBox[0.0 0.0 120.0 80.0]/Contents 71 0 R/Group 72 0 R/LastModified(D:20131028230415-07'00')/MediaBox[0.0 0.0 120.0 80.0]/Parent 3 0 R/PieceInfo<</Illustrator 51 0 R>>/Resources<</ColorSpace<</CS0 52 0 R>>/ExtGState<</GS0 54 0 R>>/Properties<</MC0 42 0 R>>>>/TrimBox[0.0 0.0 120.0 80.0]/Type/Page>> endobj 71 0 obj <</Filter/FlateDecode/Length 1870>>stream
-H‰œWIŽ7¼÷+ø¦˜ÜyõØðI0 ü€†—CË€¬ÿŽ\Èbj’1@£Š™Ì æV~yq>¾÷Ã/îöù\Žbpwüÿ÷ÛïîŸÛ‡—ß‚{|qAþÜ—ýŒG}¹}v$É•ìc*Ùò5„êŸnüâÓí} Ë'/[ìXÞ“§\Ý=ø70RwÛÄäs)Îd€zÄÊ =p„-Ÿ·âi¬}Šª§& ò)„&®>áL.œÃfÎÕcZ>,ûçƒih$üo;¬5oŽÄè©Çå `…K»BñÅÖÏ[™qa³üNÍ<^p:4êp*«—õ¸ýyûu»¥Ü}‰±¸8|ñ¸¤€Ç²Çœ_ ­õÀÁ:Aì[a¶ ³VJ”Á ÚBˆ}LüdÜSøŽˆi‚¨´…p
-’¯)wˆ9ÖWÈ
-CR%s-ë-I¢› Ñ';-]­äÎn*LóùŸD<o8L¡ËKÂèEèž…2æºÏ¤Ž„Ä-*9;Ž‡Dqfo½áäÍ4xƒÄ÷DB“×òKÄm³òÛ¹³¶Nêl@‘ŽØ›eC5O^&AY쳨‹ny¾p>eˆ„‚NIÂdd°ø) Ý Û«¸ƒ²Vx›"Ñþ\
-“2Ö (cq︜L¡(BaÐÎX1Æâ+ÆÚFX:ßeŒxúFrÅŠpÆ›œ¥ƒ³<9«ÂYÞ9Ëç0‹ÊYùÖ0ï5z,ÊÊNÙ™1%¬"ÆØŠ1:Ù·ÇØUqž¶\d(è¯sUâ±ùU®‚9˜nÌU>R8Ðï5:ÖjAý}Nˆ¹'E•·äR½3ï‚­ØÏX ¨RÖµª;Í6<žRë8i ö«ÔbKÚáa› ¾4. âwy8vÛÌÕ;ó$ØJ=$C—.ž=L'ßÏ8ÿu¼å_·HùÞ+œA}ø·Ü;y÷?îï*lùYûxz¶„Iª!^¿
-[4B)ŒÈO,Ðð×ø7[îf™6UÀân…åöpß|Ö³aÇ^ÞMòq”‹øÛMÍ¢§L ªÍÔ,§×ÃÔ⤟뇡u3´œ -NÞèAÄ‘!¡ç-SóÙTe5KZé;x½2÷§/ÿþ`
-H‰œ–yTSwÇoÉž•°Ãc [€°5la‘QIBHØADED„ª•2ÖmtFOE.®c­Ö}êÒõ0êè8´׎8GNg¦Óïï÷9÷wïïÝß½÷ó
- 
-V³)gB£0ñiœWו8#©8wÕ©•õ8_Å٥ʨQãüÜ«QÊj@é&»A)/ÇÙgº>'K‚ó
-€x¯Íú·¶Ò-
-¨ꇆ¡Ðnè÷ÐQètº}MA ï —0Óal»Á¾°ŽSàx ¬‚kà&¸^Á£ð>ø0|>_ƒ'á‡ð,ÂG!"F$H:Rˆ”!z¤éF‘Qd?r 9‹\A&‘GÈ ”ˆrQ ¢áhš‹ÊÑ´íE‡Ñ]èaô4zBgÐ×Á–àE#H ‹*B=¡‹0HØIøˆp†p0MxJ$ùD1„˜D, V›‰½Ä­ÄÄãÄKÄ»ÄY‰dEò"EÒI2’ÔEÚBÚGúŒt™4MzN¦‘Èþär!YKî ’÷?%_&ß#¿¢°(®”0J:EAi¤ôQÆ(Ç()Ó”WT6U@ æP+¨íÔ!ê~êêmêæD ¥eÒÔ´å´!ÚïhŸÓ¦h/èº']B/¢éëèÒÓ¿¢?a0nŒhF!ÃÀXÇØÍ8ÅøšñÜŒkæc&5S˜µ™˜6»lö˜Iaº2c˜K™MÌAæ!æEæ#…åÆ’°d¬VÖë(ëk–Íe‹Øél »—½‡}Ž}ŸCâ¸qâ9
-N'çÎ)Î].ÂuæJ¸rî
-î÷ wšGä xR^¯‡÷[ÞoÆœchžgÞ`>bþ‰ù$á»ñ¥ü*~ÿ ÿ:ÿ¥…EŒ…ÒbÅ~‹ËÏ,m,£-•–Ý–,¯Y¾´Â¬â­*­6X[ݱF­=­3­ë­·YŸ±~dó ·‘ÛtÛ´¹i ÛzÚfÙ6Û~`{ÁvÖÎÞ.ÑNg·Åî”Ý#{¾}´}…ý€ý§ö¸‘j‡‡ÏþŠ™c1X6„Æfm“Ž;'_9 œr:œ8Ýq¦:‹ËœœO:ϸ8¸¤¹´¸ìu¹éJq»–»nv=ëúÌMà–ï¶ÊmÜí¾ÀR 4 ö
-n»3Ü£ÜkÜGݯz=Ä•[=¾ô„=ƒ<Ë=G</zÁ^Á^j¯­^—¼ Þ¡ÞZïQïBº0FX'Ü+œòáû¤útøŒû<öuñ-ôÝà{Ö÷µ__•ß˜ß-G”,ê}çïé/÷ñ¿ÀHh 8ðm W 2p[àŸƒ¸AiA«‚Ný#8$X¼?øAˆKHIÈ{!7Ä<q†¸Wüy(!46´-ôãÐaÁa†°ƒa†W†ï ¿¿@°@¹`lÁݧYÄŽˆÉH,²$òýÈÉ(Ç(YÔhÔ7ÑÎÑŠèÑ÷b<b*böÅ<Žõ‹ÕÇ~ûL&Y&9‡Ä%ÆuÇMÄsâsã‡ã¿NpJP%ìM˜I JlN<žDHJIÚtCj'•KwKg’C’—%ŸN¡§d§ §|“ꙪO=–§%§mL»½Ðu¡váx:H—¦oL¿“!ȨÉøC&13#s$ó/Y¢¬–¬³ÙÜìâì=ÙOsbsúrnåºçsOæ1óŠòvç=ËËïÏŸ\ä»hÙ¢óÖê‚#…¤Â¼Â…³‹ãoZ<]TÔUt}‰`IÃ’sK­—V-ý¤˜Y,+>TB(É/ÙSòƒ,]6*›-•–¾W:#—È7Ë*¢ŠÊe¿ò^YDYÙ}U„j£êAyTù`ù#µD=¬þ¶"©b{ųÊôÊ+¬Ê¯: !kJ4Gµm¥ötµ}uCõ%—®K7YV³©fFŸ¢ßY Õ.©=bàá?SŒîÆ•Æ©ºÈº‘ºçõyõ‡Ø Ú† žkï5%4ý¦m–7Ÿlqlio™Z³lG+ÔZÚz²Í¹­³mzyâò]íÔöÊö?uøuôw|¿"űN»ÎåwW&®ÜÛe֥ﺱ*|ÕöÕèjõê‰5k¶¬yÝ­èþ¢Ç¯g°ç‡^yïkEk‡Öþ¸®lÝD_p߶õÄõÚõ×7DmØÕÏîoê¿»1mãál {àûMśΠnßLÝlÜ<9”úO
-¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=ȼÉ:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäüå„æ æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿ
-%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 15.0 %%AI8_CreatorVersion: 15.1.0 %%For: (thatcher) () %%Title: (banner-frontpage-usecases.ai) %%CreationDate: 10/28/13 11:04 PM %%Canvassize: 16383 %%BoundingBox: 0 -275 940 0 %%HiResBoundingBox: 0 -274.8926 940 0 %%DocumentProcessColors: Cyan Magenta Yellow Black %%DocumentFiles:/Users/thatcher/Dropbox/FILE_EXCHANGE/mailgun_150.png %%+/Users/thatcher/Dropbox/FILE_EXCHANGE/mailgun_150.png %AI5_FileFormat 11.0 %AI12_BuildNumber: 39 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 608 -296 728 -216 %AI3_TemplateBox: 16.5 -16.5 16.5 -16.5 %AI3_TileBox: 272 -562 1064 50 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI9_OpenToView: -709 527 1 2546 1232 90 1 0 7 129 0 0 0 1 1 0 1 1 0 0 %AI5_OpenViewLayers: 7 %%PageOrigin:-384 -316 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 79 0 obj <</Length 4115>>stream
-%%BoundingBox: 0 -275 940 0 %%HiResBoundingBox: 0 -274.8926 940 0 %AI7_Thumbnail: 128 40 8 %%BeginData: 3986 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FDFCFFFD0BFFA9FD13FFA8CAA1CACFFD15FFCAFFFFCA9AFD07FFA8 %FD44FF5A36FD0AFFCFFD05FFA1936F936E93689AFD16FF93FF9AC3FD07FF %52A8FD0BFFA8FD0AFFA87DFD13FFAEFD14FFC3C3CA8536855AAFFFCFC8CE %AEFFFFFFCFCFFFFFFFA168BC93BC93BC9AFD16FFC3C3C3A8FFFFFFA8FFFF %A827FFA8FD09FFA1C3A1FD09FFA87DFD0DFFC4CAAF845FAFFF7D7D52A8A8 %7D7D7DA87DA87D277DFD05FF9AC3CABC530F5A850EA8C8CFC8A457FFFF82 %82FFFFFFA16F93C3A1A16EBCFFFFA8FFA8FFA8FFA8FFCAC3A1CAA8CF9AC9 %A1CAFFFFA1B5C38427A8522752A827527D27527D527DFD04FFA1C39BCAA1 %FF7DA87DFF7DA8A8A853CA9ACAA2FFA8C39AFD05FFBDC43D603AAFFF7D7D %FF527D52FF7DA87DA827A852FD04FFCAB59BCABC7736FFFF5B36CEC8C9C1 %81A7CF7BFD04FFA86EBCFFFFA16F93FFA87D7DA8FD057DC3A1CAA19AA1C3 %9ACFCAFFFFFF93CAA827527D7D5227A8525227527D27A8FD04FFCAA1CAA1 %BCA8A87DA87DA8A87DA87D6FCAA1C3A8C3A1C3A1FD04FF655FBEA867FFFF %7DA8FFFF527D7DFFFF7DFF7D7DFD06FF93C3A8C35336FFFF3652C1FFC9C7 %A7827BA7FD04FF7D9393FFFFA16899FFA852FD047DA87DA89AA1A1A093C9 %9A99CAFD04FFBCA127277D527D5252A85227527DA8F8FD05FFA19AA19A93 %FFA8A8A8847DA87DA8529AA8A19AA19ACA9A9AFD04FF3A83BDA937FFFFA8 %7DFFA85252A8A8FF52FFA87D52FD05FFC39ACABC7E0E615A37A7C8C9C8C1 %FF8281FD05FFA86EBC9A9A939393FFFFA87DA8FFA8A8FFA8CACACAC3CAA1 %CACAFD05FFBCCA2752527D7D52527D527D52FF522752FD04FFCA9AC39ACA %FFCAA8FFCACAA1CAA8A8A1C3A1CAA1FFCACAA2FD04FF8B60407DBDFFFF7D %7DA8527D52A87DA87D7D527D7DFD06FFCAA1CAAFAF8485A9FFC9C9CACFFF %8282FD05FFA16E929392939293CAFFFFFFA8FD12FFC3CA7D52A87DA87DA8 %527DA852597DA87DFD06FFA1CAFFFFA1C3A8FFFD05CAC39ACAFFFFA8A8A8 %FD05FF858B83A8C4FFFF7D7D7DA8A87D7D7DA852A87D7DA8FD14FF82FD07 %FF9ABB93BC9AC3C3FD7AFFA8FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFF %FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFD17FFA9A9FD25FFCACAFD05FFA8FD %50FFCA8536AFA9FFCFCFCFFD0AFFCAA1C9FD10FFC3CA9AFD05FF7DA8FD24 %FFA8FFFFFFA8FFFFFFA8FD21FFCA9AC376375A377DC8C181A7FF82FD06FF %A1689392C9FD04FFCAFFFFFFCAFD06FFCA93C359A87DA87D27FD047DA8FD %07FFA2CAA1FFA8A8A8FF7DCAA8FFA8FD07FFC3A23B89A8FD047DA87DA852 %7DFD21FFBCBDC37736FF5B7DC8C99FADA7ADFD06FFA19AA89AC3A87DA87D %C39AC39ACAFD07FFBCA152527D527D5252F87D27FD08FFCA9ABCA87D527D %AF7693BDA1C3CAFD06FF8A7DA98BFF7DFF7D7DFFFD04A8FD21FFC39AC377 %3784377BC9C8C88281FD07FFA16EA068C3FD05A8C9A1CACAFD07FFC37DF8 %527D52527D27527D27A8FD07FFCA93A1FFA8A8A8FF9B9AA1CACAFD07FF84 %5F52CBA87D7D7D52A87D7D52A8FD22FFCAC3CB858585FFC9CFFFA782FD07 %FFA89A9AC3CAFD10FFCAA1527DA87D7D527D7DA852A8FD10FFCAFD0BFF8A %CACAFFFD08A8FD2DFFA7FD27FFA8FFA8FD46FFFF %%EndData endstream endobj 80 0 obj <</Length 65536>>stream
-%AI12_CompressedDataxœì½ùr#·–7øxÎŽ°¿iÒ $‹}c"¸ºýMy —Ý퉎Ž
-–ĪR["ëÓb_ߧŸ³`Ë…‹(*KR¥P%%ÁL$–ƒƒ³üpðÅÿõóëáø|óv5LGÉ@|ñÅôzµ¼Ý\3 ÜÁ÷——w7·×˜õå/_ ¤%pÓøûâ½ñ?V×7›õ7ø•¤/øô—·–·gV×_ ¾ü
-2½¸½\AöÛåz½º¾»Þ¬o?.߯†w7«³åÍêf´¼øʽÊ›-oáv™|­Š¯e:ò›D~þïX®ÿ\ÞÜ\ü ¿ÏÒ"…¼Éæn}~±~?Ùüó›A2ªÜ J °:ÿ~ñËê¦yƒ¥Êü]³ÍÙÝÕj}ûóõælus3Ý\n®o¾Lÿ^®?@=×·ËÁÿ·º¼Üü5˜\.ÏþˆY\\®n¾ùú·良]³¿ž]o>¾ÝüóëÅ÷¯æoæ¿Oÿ}üãw󯯖—ïïÖo¤IF×ï¡”ÿûÈÇß›7øfèí«å-töýø{©ÞLî..ϼ»z»‚qHKÌMßPƒ~»–@£ð³ó7ß_AÎëÕí-ô 4{â—ï&q'`waúò¿~Y½¿ R€áùï¯l±PÙ«åõðl–Яe6È^ÈŒïøuuõñ“z^f#3ÒïpiÐ=*Wƒ¡É ~¦&á¯Ãø¬þ¼XýõÍàÇÍzŽ0¾¾}ÍÔ u’ðoþæ—»ËÕõoë‹[¬f•Ü?lÎW—p¿~q¹¤æS’á7ßðëòúýê¨hsywK´^¸7@7¿Zþ½BR‘ü‚Ÿ>®Ö¿nþƒê8Ì“r`T…)£³T©”\6dªÒ¿Qú߶`, q¥ç02?ÃXýt}ñþbýÍ0-ô`˜r'ço¾»¾8£Xð/*pTDÿK÷Ÿk ¿½]­míx¦?DÔŒ~x ï¯Ï§›+ìýœk@k ËÍ{þÎ_Ó7ðøÝGn}~õóõÅË?Ò7Å›Ÿ/ïà«ï®7w¿_¿Ûˆ/™Ùüz½<ƒÛ?½ýŸÕÙ-p›®^ß]Ü®€U|üjgAЬëÕ€¿„‡é£û»ÿéŸ/—ëåõ€òá)Î|uñ'|³„†„rCÞþBg«w0Sóœ;_ÿ¹ºÜ|Œêês–ëóÁ.¯?P_ ÐaTº¥V÷7D_ð¢åí`«õù/›?Vû„óö—÷ú ©ïz0¹¾»ù0øu³¹ôÅV¿ò¥ÛlÊÅûŸÆ;~¦Ö?­¹ƒšo²7ÔßœçɽîÞþøò)—>]^^^¼¿^~üpqÖö‚–ïý›ø»ûÖßWo7—7Wž¢œŸ—×·g—«×ßÜ®®v•†½ñîb}„HÜ-ÔvsõÅ–ÁëË+*óöÂî|í 4o€Ç<v8j0YGø»ëåù0o¾~[¯—W«óÁ{›kìW¢5(æ\ü—ø‡P…*ÕXM MÕLÍ!-Ò’LaAKÓTC22H9¤R i i’N!Í Í!-t¢¡%$E ŸåC)£”C*(•âÿÌÇ&ö÷d>ÒŒÿ,è?¤EBIÚßr¡¢ß„½P•ß˜RHü[S2 M5XØ‚Oõ#îu3Ö ™CZÈDâ’)ô¡‘™Ì!²”c9‘S9“shI¢¤R04Ze MñèMí¨I;b™ *iˆfvh†¡Þ/õXOôLÏ¡$Õ`šMÍTÃpª©œ&“ Ål2L&ãI9)&ù$›˜‰ž¤@(r’Œ0\³ñt<Çå¸gc3Ö@j,ÇI¹(碜•ÓrRŽË²,ʼÌJSj UÊ2)ż˜ÓbRŒ‹²(¨DY9%¤5C‰h(åE :‡è3á1%ŠåΠ0M(AEü‚×AaÊ)e” %$Q.~¨•›Â|«Ž°Ñô)qÉâBÀ€¹4óijÓħ1&¨|ñfr Ó2©Âd9Ér¦HRöF©4 ÖÀ…¡î€ é/Yf ˆÂ}ˆÕ0É, ¼7')kru‚GŒÄ‡K™'.K£^ÀG]¸Ès˜àx‚BJ%~UìTBí&3Ï0K<Kª6&©*<¦ 3,d]ÌĘ¡ñ’(“²>àÀa"_œÂœ¯Dži)\xgâf²f’fbf23w"FE)õ‰‰_¶¤¤ö›¸%sMbssAìtfÏ* wbñx^Ι;ŸŽ+Îgæôv#¡Ùs`T`X%€¡W¶—§Ô»%õkf;SÚŽœÀ©ohæÂ\49ç4 qÞ•À^s`´°[ œENæÊEÌi Lj
-Ìj^,ʘ—‚ÔÀÌ2`j0·10¹)0»y¹'0 ¶n˜W,;N€KΠG“DÀdW@Xi,µ
-3<UÄÈYOÇ£àu]]–[%ÉÅòôõÍ`~þ~Å1à‘-™ðÚ”yd2‚é
-Ss€2LF9Ê€hÇû$…„º \1WÌÀ3pÅ \1[ tiÒB5'+‘Èæa¥Ù!7'«^(ðµK¤}¢òî³Èÿ¸Ú¬¿ ¡kðï×+P‚ÛrÑ0—;ΓÖꂤÔ/´5.Š4“‰-Hâ_ " e@=åÈïÂrwæíÀ׉«Oñ:ŸÓñt2M³xt:Ó33Ë!³ñ nžÍ`A^€. @~Ðs3Ï湘çóÂjGN'rÑÂë@NÅ JŽŽ'ARy|¦Žn
-‚Eê‹
-B ø:RÃæ^v éAXÑa ¥œRÉPÒsŒhiÂ¥”ž­öPþ@Ï`7èú¤ ¾É è)ò®l°ú$˜¦ Zð)ü™@ߎ§%ôq ÕThP¥Ii5¬× fú k7N¿a Çé8 åÐ28I ñèþòJ+Q®£+~@Óß”
-Ð^Yâ3û~ wák?¢íïÔ¾„´-ûÛé] Ò½ðj"@Ę’ÆŠXNÿ ‰ šD‘U2RË樘¨2!ͬ$Ý,'Au3EÚY"HA›“Ä3%ég rP)Ø€| Š¤¦ŒÍzzœÃó9ˆé0Q HÖð$[à¨eÓ C‘•YžHùD­……áƒüëžÁŸÄ$$챸WxqO³hm¾©€~FÕe>CR
-4(õ¡¼ƒÂ3JC%IG¨Í¡¨Á"ô‰§6¡ª*¡G°OæÐ#SÛ+¬¯b¿°ÎªK+eS@ÍuFš+vÍXூ2›°Þ) g’ziA=E4iû
-{ û Y‹†S¨æC-²¹€¹2¥‡€žË³Œú…4U“,¹Ä=ˆ´Ã½˜Û~ÔÔ“Ò
-Îs3`RéÎz‡¢žâtÖ¿Õ¸=³}ŠÒt.¬‚¬­
-ÌÊîÌê³,O›XšF½ç9N¤dŒ]˜
-èxTZ²HeA•p\QW¸“§V]ÉÉì É°P×UrAŠJèÜÄwîÔw/v0v1щíd¤6EF
-L‚ÿøôàqÔC¤p¤QR[Ò¶Ÿ¤™µg±%Í·¤Ykšbü§’&[ÒxK*ã$¢Å–”oIY[4àmIoIé–d‰DDôQMKª&ô v52j:³&6 kØt¦Í+’Ö¼©¼Òk•]áµÜ©µS/¬ÅSFVjVc}ÚY§mš Ól”6ÂÚ¢ o
-µg-l²B<?'’¬QTóOI‹'
-š˜2N‚$NM§“°KYÖ)À’Öœˆ½è`Aá%.–¹@ä,Vìš[—Á”È~LS  É'…©È]È80¤,wMh톅»R+v%$ªÎITE1e®"’¹J\ ±‰k Udy+‘À•°À´:¬•9ÙŠyù—$
-JmsW)è±dò)ù5 ‡xJ‹ÐÄ®9c覰ö`_àßÌŠg$?ˆÊú‘F¿yíÐPé°b¤•EBù¥!üöGâWð÷‘Ùò›*
-³¡b2**§â8S™ŒiöîgJify9È°ð’Ï46Ÿ§6iJ†R&X-c=nJ|hj•FæŽSû–)ÿ-Ã;V˜ìL´ösA¦ EF”ÌšÌA˜Hy&ã‡
-âóœ˜%sSì[Èv2l±•…•h™‘Xo€5¿Ÿ²&\&2öÃ/ªi›èìS›÷)J¢fGª§tOÒõ$jfgÊö$X Ä"ß‘Š©lK"ú0Þ“&կ̎-´0†:khÊEuî
-©3++,¬X%­¸ª¼tÁ²†qâ‡FX„-…•T&ĦVšåää›*»ñL‡%ÞêUÿýˆËTe‰ªhXqžr ©ŠV^·»µ¹¹f;}¬HÚÅ_X9€%§ª²*ËŠ®“$H{öcµœUv'Žp"È”“åSìHtl‰¬G:á~4ëxe¾%obPš±ƒB‚¤±B¤ŒH'>Ù‘$G– ŽãBcUd¬Ë‹Ui1C½4çB\ܦæäžyËQámGil=5WwÝzĶ#g˜ËHØKIxcM>2ß»r#¾3äKk=YxsþÜšôg~‘â%k,hºÕ¬ðf~gêÏìèVÄÔ›ý•ÇÐ8ó?¦¹°kìÌ{¦~-[Ÿ
-â"4Á -(sá2•‘O®°º){ìHÊJ¬+e,vﱫD+¿fìdŸ üO­ŸÐxØ’SÞJë[œÐ4µŽÇ9;"QX/ÉL©×í‚ÿg‡öìÎ}ÊüÌÑVãÏþ öŸ;] uúŸ¬ñJÏ3Yd»ï²:?‹Ey¤÷£¬3g«g È5VõŸXÕŸíÕÎZíLl¨v ¬…%$ÐýÑSÒ˜¸¿³MÇ´ä©Éš¤YÆ—‘ŒïÑ‚„|/æ[K´$O¡öfèÒÓ¦¹5CKoFè2Ð û¬ÉŠ¬ïüœü3¶‰eý™•ôÃT‹ÈÍ6"CJNº—ÖpÀ štÜhîù9´À6çFp8ÿ°t“Y‹Qamjo7ª[ŽØvÔf9"»‘°´3ñpn æ¶$ƒJaÀqg¤x^“ƒ˜‰Ô0g#€
-gVgnë«”¤MZPÔPªÆÙæíïÜÛɽi?G#ÿ&‹
-ºÓV‰È¥šL%e•Dbà?§²’Æ•4©¥°Ko*¢­zõ {•m{Í{Õ |~ŸPá'­$]I¦–²JÊC~cHe%Y‡o´CÞÃI¥ïtím+™ï¿ÒCK'~ÏâÜL©ya{¥«t¼±2ÞTo¨ô›)}x Al‰P‹‘ÀQ|"Á…GÈ=$µ$U²pÊveä*©¡êÌ‚-YŒSuHÕ ‰·3IÎIÄr†BE€”Ö@Æ­:äjá͆_yã!¤°@VgEDãà¬Њ¬¦n8ÐævˆaˆüÞÂÛqÓ& -†ŸÈÚÓ€eǨíØŽ³Û¢Ó`.‘å¦Å
-C>Éû«¬*>‹öb—v#Uæ•ò –‡mSUÕÄô­Úy«rîTóºbÎjùáAÊ~‘Û?Ô&gdVýNHf›°¤A²êÜ$“Í­Â]Ðö mUmÐÈ8oëq›zæ´¥£Œdœ~Ò[˜Ó$w–ÆGâ>””dd(C&rARKS;˜c`'S‘TÁ”ÃW1ì1Ep!/”¥S]9ÀF óݲÆAóæÏlOšîJ“Úî4Þ“J—D¸¬¥boÊÛ’ˆ>dõÄn¼"-‘³ŠS"-‘ŠS"-QÞ».ê“x#iÑa'¿Ùx"¿\lÙzøý¢Š×òp­©­V ÔRže,8«¾¯€°X‚XÖ‹LÆb:‹†[}¶Õ­N† aíc+;:·:/㨹ihçN ÝÛ|à·ð;~êkFœê[yšË‘_ªÂ6žx£ŽöÚMºcAl]@ã]^íŽuJë˜Fªfšž[§tÊi ˜1ù¢çÖ­- É‹Äþg"çv¶þfKƺ”ÆL¬ P°S jØ£˜Æn ¨˜§(\X!ÞTííSõ@VY¾GìUW‡xíHý¤ž¶K»ÊìÒ䥰k×Ä®e¼®-PÊ 9™qy¸
-¦‹w:ĨÇuŸ€ «bÑÉÜZVP]¥ÓL‰=§–î<²ËÚÿ‘çÄr§"MH5áÅ’º$^i¬œ>%uS™˜íR:Ëè3Ëþ‚Œ>¡3 ðä(6Ît?³îã ¡# t°2ÒÀbX³ô f’ÖxrRØ ¾ý¤°“r!N ;AOÛIa'¸RŸv‚Fùa'Îò2¶Ð¤8Õ­úy%Ug¨ÄZ­Æ[c®6c¯V⯆¬Â{8êÞªodZIu·Jär~;“KuM^IUWOÕ Dkˆ¼DUÒîÈ'Ugä¶-ÑMZ¢™XðíO{üœCÐew“z] {Ó½-؇­Û†»q(»VØ°¸ŠiTÃÞÌÈ3ãoâ ­.Ô‘ Ïjƒ³
-»ßáqZ#´úÄ.úpyØG¶1‡… 8ìißQyeØ‘k°XÏ=åM¼åšÈIxÊqT’zøžôÃ=À—öû“tßí]Êmâ NnË“ÛjåÔ6§m“)ì"‘øýT*ÚcöZ«hÇuõ/ëþÚ­Y’¼cóÑö,§>2ÛŸF›²
-+
-f“h ƒ¼Ù WN…têcæÝŠTFFÙXl›ƒV¹(pÆ⢱_¨h~)ª¸&ù´ EqJ`ª™ß .i®i™ƒV> oð™Ò"8g77ü—vK·²ÿS/@‡ÿš–Qƒ¶½¬ü?éÛÉà©-˜eqI¯óŽ>á·ó¹½7c¿‡/ìß«êó &ħ¡;íš*ýšÊÑÕv¬¨Ì¶Êš)$é1óëjëÊJ~¦¹å?À{Ä“Ș‚§Å+«‹ã5ñ‘¼Œ@Ç‘¼JAŽ*ÃN* m)­KJ‘Åyæw]¢‘@{ͨf±„ÃŽ;n¼Ó®lÄ4Ë©¯ÑGÇý›‰(¢YAn9ec÷q<3ŒÖ7§€sq4³Ë ÉÍ,Î;
-­¨‚+Dí
-q%QÅ ðÌ*tÂÚ¥=:sláò&ìe˜{»3«”~ñ‹ÔÉ2²,kÂÖ•É܉è‚ñ[UI'€{uÒúqd>iùùô²>s"»s°‹­Æ#ñŒb qž‘šu@œ—&CØÁ„å ‡
-5@Vx ÅC „ET7F¸hO•½û,Ó×€û×xõàµ#ìü4ÕECX3¡ŠV ^/m¸•ÂÙ cŸ~°Î,X*NýEÅ©_’i˜·ô*òd+Ñšóì´S›[~xjáýc: TÆ>ÞÄ^ø}Ã3»sÝY*sOVsÚ¤j±ÆU8A0V:S¥Û®J{[^6K|¨YµnU[ͪG†å÷5ªnsºï× ®h¬ºÛ]ïû­¸°øŠ=†Ü†¶iýæÞsûÎÃ.‘ØíU rïm,Iç^TÂÔ¸
-r²Z3¶PÚ¯(×EÂy#n…ßpèœ$>Ä@|vCK„2^ ‚&|€·¸¡~‚C_`æ}|õ°ÂZT 8wß´5º@Z‰.P9hÎ;.2a½>¸€W“«±r¯,;gàV§L»[¦á˜±ñ¤¼gFD®™vçL«{¦é i;2vÑ´:i¶¸i¶8jÚ]5gs½9ŧhÐyDƒpÆÓÀ3pÅ \1[ÌÀ3pÅØÓ¨r3Êiy:N­ÂAW§/šÎãz`±£‚OÐ*òpÛôdÕ­—kσÕOÕ
-IòO¨§Sê³Bqàñv|ÐõilÅH­âÃŽ/„åKM†÷¡P }:wGŒ•|v\°p
->MmóL%%\ÂÇúît5n)k]¯µâ0!¹àY’42îÈF üRó ÅcUʈwaÀOQõd\_ÑY’™¡Vs9Žré¤K¤åB¸$\ª‘’yÔk-èÁ=¤FÐïæ4=dË: ­• HtŽÒ‘I÷t´ÖVøij­p¸¸\=JM‘Ÿ°ÒͲ©Î¦
-º®¶ìmä`¢r¼Zmz0Ž¼‚$50y€“‡XŽÍ‘-©UÎÕÔï#`+\"<ÄÜÁÌhîÀæpî@çc=/=
-lÒ`5òK•½7>&;«Ä˜K¢·u* ¾Ü°GƺsEí0ì::ëöÀ¿5J>.èî]¶ÊÓbóœ¿
-5Š*Azt(EViR#¢F–ч:]Æ”ÙF›D¢F u•QÀ‡*Æ´Ñ«¨m“xÇ­„ÜHÁ”ú_š@N”$+¢šÊÈ?é@—(Ñf‘¢½÷V«ÛÃÒËš O©4=úðl‰¹iUâ•I+ó÷ø>²òoëõòju>xo³Dæ–L(?eÉù¢‰éŒ´…›ÂÁ 4µXT|[û—Æÿ7„҂Ũ!1Ô"D}t"‡|¹Ìrª¶´„­œ;–ïD©¶ãTçúHGŽÐ1:òªÀ4U¦±#4†¥¹Þ[Qi¢æ­ÓæѸ,ä>‰?ù–G£Ö÷>ÌK¡nógî#nÔ·q7|,°)¹™§fæÁÕ`ƒ¬CÌ/ŽÊÁ€kºNÉí‘ùß9žÐ× ´“(œÝԆ勤#¿JËŽʸú,jd]e‘èíö¼ÆñѪ³8L~8œºz|h|ˆæ–•os›ç¿QööӮ݄Zº£Ë0t?OœSnüDJà»×Áaâá¾9žúÚoÖñuü¡[³sÑÜ¡ãN׊÷è(áŽÔÚ
-;jÚ`Gx$üYm°£vàQ vÄÌ«~ÚSËNQˆƒö˜h!¸K¦%nYk²ã&¬ÑÚ§T؃–âÓÐT´É4ì¿ aBÕøÐÎxYI`[IAv¹2'Û6ð‹Ä°­®@{œ&«!«RIvÄ°*†õÁ±M¦yNÖ*™£/€ãJvƒñ3ä
-Š 26,Ÿ¨<v«Á:,Ù#Vrû`î%9•Úf3+-9í²ÇÃKz˜ Ò.‰€(’8Q™[þΰŒÁÏÁÔŽÈÍ<>½´!­…IDGáÆàçü¹¾jM‚’x•)|„„Eså‚×HoF,É´2·gw®ƒ­ÙlÏњǑ(ÖFö€ÏÍšZK &“Ř,Š¶ñÊÿaÊ@u«sËfg¯ŸŠH ˆ7<7·<W7=7¶=3”õd‘£8À·8Yܨ€¿€jÚíüi”b…9³(nU°nÿq†W—f‚f•“ucSÐ6ÛOPlòDÿL¢4‹’ãønïK*Jt$¢ƒfµß˜àR%RoyÕj×èYŸÏZÁØ Ì Dÿ¡! Õ¢*Ú¸-GÚoþœÚÍF6<íYæ=FøOhcíÁd>üÌoÈJ)üûŒ¶ba8Vø7‚f´û*¡ c
-÷®)æ=GyÏmMÈ\:¡- šN­˜Ó®×xÏ+Tá'¥qY!žOG›E‰Žqi¥˜
-áRÇbQá"b1!¸˜ »ÄŒVAC´B]ÈhŠuA#œ`»“ª;L ÏL¼èQ!æ'6ÜAlBžÕØçέ\ô(
-=)ô¤“ÂNð©´#èÛ]°pƒ©MB÷ -&lŸÀõŒsÏ´- †¶#è9ÂM÷üÃÔnÓ®vCvð·ôjw¯v÷jw¯v÷jw¯v÷jw¯v÷jw/`÷ºVO
-=)ô¤p¬Úýшç´§…L<RÖYàR@Íæþ
-—&j¿+­múWaðM <L°c°w…¨jå
-‘
-M¡m Åq2êl>dj± Æ2Wì^f¬|*ˆòç‚`âÔ
-÷©Å6fZé±_[]†^ §…¨ê9×®F?VμРØ1nX–>šB</ÚÁ‹¶ÁEÅCð¢­GSlÇ‹F1üã£Ç÷Dñ;ßÅŸŽÁæǧ|Ö¸ £Ækè<Õ‚„б¬óÅ¢'…žzRèI¡A
-q4Ó{:Q“‘LÊ8aíó-j‡JOF:-w†ˆî:Æ‘œ]û‡b¶³¢Õy Ù1fÛq5»Ÿïf뼚ÕÏ~‰çV4kûÜšò™êñÙ/uðÄž2fXÛù/MpÊÇ›hºUöÛG¾_m眛ueå0—9Ÿ5ÎN^ÑØÊXõêZ_.sEI|1±àÚpŸ”ÿ'Œ¡Ž®D=|C´m>Þ|‡È
-Âøø*6C% C-hðŸÑ~ZjÁŸ™jiŽÃ1ø€ ¢%"C3&Cå0˜ø8˜FX†±h³ãH˜Ú¡0ѱ0ÞvE.ô`¨ŠÊ•£aØOÂFñq”JŸÂžÏ<JY#šMÑFpP›FäˆÖØ[¢GÌâè"„ˆÒîø;#Hˆz‰CcHl‰"aOåùÈÓ(þGˆ2®šÈTA ’¦ä‹´ØPLÅŽ(]ô¥z€ó8ÐÄ b 0•2ÃØJj#¥ — + É(ú‚²áS ³=†Ôƒ
-y\¨Z1…Š …^*ôz‰öp–XXòቅˉ-h¹… <Ú‹r1<ṉßB
-ÿ2­ð¯RDXžàX©»]Ð/nœ;'F7Å`·8Èl—ƒÄìo¶éÂbœª­g¢(=„24>‚75N”SΩ‚pr€8jœœ£gîèAj:÷‘92Š\ŠÇõÌ)Ji543(jGöhwdõÙ3¶GöèÖ#{¦  'tàó5öô>ië‰ÕmT¶YÕn(Ú<r>¥*uˆbÇg ÔeqÈ(M35î´MÓ…ØÑ´x©6OvÄK½y<r'8Á&n 8Å 6qóÄ¡'ØT›×0Þ¤ Û/
- lD
-|Ђݺ^W—k¯ˆõ;
-v»†]mw®žQõêÂf£QÚÆ=ß{XqäÇ=D ƒÀ`O¹¸ØÏ„P²î$I–ó…!ÃOðÄ4/*4â!‰¥‰<N'+²-äþ 'òé¶)¢›F(Ùj„
-‡*ðOHd ðO`g`Ëÿ6è_ ¤$ZIÝÁ~ä×hÂÿv
-Kýã”äpU¡€ú ø 'ä`IøÆ'>‚…¯Ã,ѱ+ ÔY8WÅ-²¨»_Ue)}^õx–p Ÿ­âeÉB0ëÚCÕTý6>²…š/¸ÁvQì…ä'+$;%fAð˜ÒÔƒu@ÇArŒ{ï7k¡kf¢®
-¸™6h•Š¡Unã"Z¸ir#wžq3 ˆ*Q;ä¦ỹS@Uý”›
-šJlSmÙŸëTñîÜ€£²[üÂø,ˆ)
-np¬„?†@0º¯¦ù%iNîNŽb/l¡ø8È*4itÎßYÔüUEðÁE}2½Ð´É¼¦"óöGÐõGÐõGÐõGÐõGÐ}¢#èžÖÁj>4.ªÏƒKzÐÚ—µ­}YÅ"Ú¯}ýÚׯ}ýÚׯ}Ÿhí{ZkÍS[‹_ûò¶µ/ï·=à¶Üö€ÛpÛn{Àm¸í·ÏßkØ£,{RèI¡'…pÛ©cµ50Yq
-0aÖ
-²çz³÷im±v±qÚ‘…E
-Äœ=éx¬ÃhǪs<æx”‰×ŸIƒæ}oÅý´ü{êø1EÀ²Å‡³?pÞ<rß
-:7 uŠª70f±ªÔþW¶þ­ªZ6~pˆ \W±êêU}ÏTuË ùkE¤)-Tfl÷MM|(gN_`7™.¤û±›™H…Ö‚¤SNÀ³x’:T’²áž%}OºüÔã”R_"«æÚðfW~‡“ƒÝû8jtÛg}2µoé“°™ÝÌå¾Èýgþ[ز¹ßôµåþ¸@,Ÿ§ø)ã½JÜÛ`µ'œx˜¹ª%\‹åÒƒ
-˜¡8@ðÖÓé„?ž.PW=œ®ð3ßqÇtå”:{N¨UǸª&þ§ŽªcꈠÊÖÑ‚ jî©…Ø­`…jˆ!ÑØRß!Ò ½[Ý-RÛ3"ª[GâÅb‡¼ÍZ·óÌC¶þVmÔÈ×ÝÔQ$l?ûÃ!¸ —!ÀŒh"fž»ßwû¬ü®ž^ DSÿßn™lš ddU;Au7±IÌUìiXÃYnè[+ë£ðÈ\·½xê·»4±‘\wæP<~
-zp¡ðf‘…=!9µ=ô9;{ªFy¤ëW eEMš¸nÙ°)EÕÆáÁœU3Ǹ‚Ú¬Úhk±ñ…縻F:­ÁeÇGÌ[6tÂ
-£@û°~Zä®.‹$%ó–4ÚÿGÀ…‹$2o9¦ á‰Ê{,“d¼ùq³þùúb}{±~?F–´ø ñãGü&åo~^ÞÞ®®×ß ¾œ],¯6ëóÁôîíêæ+Qû<ÈFÖº”#5(Ì(Md1ÈË‘:†JßQÅíáƒßÿ¦ÿ.ÿ2ÿèÁƒÿúïdpNù¿ÿjE^…,[êàdÕÞTÉs¾j–†Yë–ǯüÀʬ©E?q„Ü”)º—dÊ©
-¬¡ éç¾.)4·‘Ý(»}ÄÚ
-¨×"”»•œZ›¾µ£’b„&,™[^noÊÛ‡ ,v¹NdYXà$­l¦:°4¥2Säµúâ¥
-ÓÈn”½sVT:óÊ–›¦ÚÔú'C"¥ªvÏÖZl©sxe<P-5yxGeFtuOLÇÛÝV±Ö²-»kŽàÕ¶f¿ö«ÃƒØ{QT¸l4ÇAì(ÒÌÎX¡UVÖgK³BK ê‹}몰¯¾¡uoÛ{{×슲£N’FB—z;¥V;éÁcØòÂz­ãê…ìjõZj¯GñÉT „U$ªƒ­ÖYKƸ¤¸Ð•’©+ü‰¬Ã1šðÀ–l'u%\ûžh4Q<êijl·BúŸBö«Z6°»LÙÜPF{®/bíúáóÚ÷T¨0Þ²T¤,€Znœ˜,ªgpežÙúëLêÚ½¡QQ©q&Õà¬Ñ-&Í¢Z*÷Uµœw&ªu wÆýï‹ltÀ™xwRRÎkjÃýH” ,Éôá¤=°%;²¥5*u¢Tˆ¿BÅ!;¦×PF{îãRq¨S…ŠãlOo=Ii2A£MRÕ b5Ò©T ŠwªÌQqÜ-žäB©1mº
-ÄTêîŒûßÙè€SSqq·hÀ@ŠùHê,¦â“¢Ïf÷T3'"àÐŒa– þ`8i
-½öÊ2£¬.»
-°5€V•‰r„Pë£rk|ŽU~ÌqÌñFzYz/+íâFLÏ£²™ºH|&b,¹GQ€õ㨠«KèT‡‘4N•J•ñ#©\¦Öyɼ”6ÛäÚ$Í~,×I7M‹b`O•ÑHJ§â¨Lû‘tk.™ˆ[ûàÔ#éÞXä¾~œ‘D·–²ì2—ÒÊ9@œM¡¬¼ƒ88àLY’í9[ÎB‰®¬?¡ƒ4µKfçįð i’Ú{ “L™Z¹Õ•[!Vké¦4H©‰±´¬%
-5dçðKW
- ¤r÷楳¢,m¦« ¤Ì¬È¬ŒŠ2uµÕVwÂÌ,%”F:ûDµ N<ŽÚ­'hÒ¬qDI M-݂Ψ¼åÏ´Ù«üh¼0¥]¹<kâH˜qž9;GêzþÌÞkdâ4—²p…g´™FJËZ¡^P¬ËV,,¡Š—I«L¸
-à®í*àé
-;¼çgÏ‚ŸõÚ3åg½€Ö󳞟õòÙóçg±ÓæM§‡ÆÖŽðáuÔÝÏÓ‡÷Œ¦MÞO›.§MGÝÝO›ûF”èpŠ8ÄÏÿ\]þ|¹üûÍSßÊòËáAP“éyUíÅq¾{„`¹^]mö…\x!X®WWËÛÙÁûÙ/Öç«wë‹®ìïQýŽžõ‘Yÿöâ#³Èû°,¶ïaaYîÉäæ#Æ2é¦e}$“J{d"»jÎùÑÌþ^ˆ}9ߪd üNðÿ[¸†¿ßƒ§Òq[>M´ÊîÎÍ~t€þ =v±»!ê«ß,ºbo0ÿ$.˜c÷šßÓc¶‘<7wY‡¼»›-I›«›ÐzºÛóÈéÞ.ž0uõú|B§‹jGì`y}qûájuÛŸëŠ-t?ºgÏ!v݇N±ŽóDZóê= ºxG ‘Ç6dc¹ó†èc² ×9i¥Ï} Ý ˜yÑ`»çªýÀÞüî䧦³w'NØ»“{wrïNîÝɽ;ù¤îäþ`ŒÞܹ;™D"t(«äÛÅ£Þ…üDܽ ¹w!W[Ö»Ÿ;8¿x÷ó?:8óç…9Y;ž‡ýÃ5nÖ t­m_G6ÌFåŽjâåÅû·PÇáƈ=°…¯./7uÓÌz@Ÿ¯ï²¼S÷Þk¸ü˜ëîú(x÷i[G¡«5Û½b͘˜_ÙÁî |½¯7ðõ¾øî³¼õV¾Û×[ùz+_MZêøüÛǶò±€ûíûëÕjý-è_«oa»x¿ùöÏ‹ÍåêöÛëÕù·›ëåú}GSî³4ÿ-ÿuquw»çÂ@‚EG¦X_­£Èpu ¹‡u)ë¨UQ½öIê¤n’¤þd±1Ÿ&„ü ³ÓÜ|\¼vý °ð]2€?#+†ù??‚Ô~¸=ª+}¿Q½® µ°fÑxÀÞצØÑ2ЬÞîÕൽ¿7ÜœrzÃMo¸Ù×´Þpsú†ö†›Þp³¯Y½áæ)n¬™† 7ÖŠCö›Þpó—Öˆð”a½ª·B= +T¿]þ¥EÏèÜÀöâ톻XÆSßÿû¨L¡[Hd?ãaŒáYBqÖpyqûóòbŸÕóIøŽÑU¤†GÑU¤†>vÆ¡±3ºjȳñ¨kç'ÓúõóAëg·ËL·Kgwê)®}Ü©§¶vöq§ú¸SOŠ£ö1§ÔècNE1§^Xžoþêöü¢}£óRùD¿#ÿ™íÈï( [¿#ÿ³…FoÞ½»YÝâ`^¯Î;ä Û;g ô­ëèðS¬Ïq ùû‰5äï}Óÿ'¢—':ñ?[àSÍâg£ |Bqë8¿žÁ€<EÕ쯋óÃáQ:ù¢›!µµ:Ší}XíÇ¥…&¥]5ÉUë8VÞ+Ðm
-ôSØ|¨È6”¦#*<Vh;Tfë®%û¤¶Þ¨qú5¶7jkÔÈz£ÆT{£Æ˜I5Š—bÔèª!½QãY.ì½Qã)®½Qãy5zu¹¦.ß.;C ¾Ho3~%½»^žÝ./Ü\tµaÃßúˆ{=Ïžº©åðóê: =¶ÔßÕ¸<P_¾¸=ûðëÅåÁÁ×›×ôLWZsT¿£Zøvy³Z\¯þÏÝj}v¨&Œ:Š{T«ÜQ \ß]ýlíσG°«GqÅvËK¿Þ]¿½»„>xnÊCæè¹…9ºÝÌ::ktìjÔGlâ%éEGlºÇ
-Öl:°} ØôîzsõÔD ®ÓQÍy¹ñ§×Ôq¸¦Óæ)-êÌÊ×Ç^yi±W:3GìµÂ>‘ýaŸÌÔz/üXòòðc5©ÇÐ loöìHýä†ÍC=ä]Ñác#ȺjÇKÄÝÃMq[Þ¶“â^qlWo¶&ñä%ÛÄ;Âþ<Q“x¯îõêÞ‘ê^wL½Wøz…ï‰4©WøGáëHÂè¾'ÖŽÏ\á{V¸´^åû|T¾ŽÂ<|¯£¶õ_¯ñõ_¯ñ=ϼ<¯³&õß 5¾ÿÜlÎß_/»bŒĈx)
-_w-y‰*ßÁ[v:Üàþè›v^ì‘*/7âEGªOñâ`†°q;þ_Kèãw<¾Ð%}¬†<ïøG-1_l˾ážÏÿæíåòìoœµù¸<»¸ýû›Î¬Š¶ÖÇ«1¡»;Dýh¾}¿]ËÝ5è°Ó%H=/g.LY7Gqú èëp#ï§ ¡ÓÛzÛÌÑ!ù}&¢Ü30g~×íAº½tωÓéð<LñášN7k:ÉþPWBGÊC½rG5ñPÇáüÙ·ð¯i¨×ïäùúly°îÑé Ž¶bÇÙìî®ß-ÏV÷i[GиjÍv¯V3¦åWv°_ª±žˆù©ÇØZþëâêîpWpÚ9ùjÕ¨Õ%Tä>‘œ;
-lÕkß !.ÿʺ´Ÿ"BáÔxŸÏT<êü(ë‰HŸ…üà†dþÏ›õêpA°#&Ò¬Þ %0„OS–oÖn÷jðÚÞÿYL½¼ÔËK½¼Ôã£??›yç¢à‹—p?7“ùÁL¡[›yW ay}qûájÕYXü®ËEJ^^Üþ¼¼Ø'ž? Í÷C§VG¢ÑÇΩ?ö(9]+CXŸã²Ôùˆèc²'\Yç Iûµó)É3ýúùÀõ³Ûe¦_:]:»Zq}éìŠQ÷Kç¡KgW¤õì—Î]uïOi|´åbo·c³Ÿ(ɼ´¥ûŒEGÃôRC}îg²ÿÚq à>ÆÒÎcéeGÕýÌOš{zìýj ßvL¤ ÆÞ5솯Õ¸Ùèyl*q0?$6µ]ùœnšíj¾OÑ»Ü\ÿà¦Í ៻àô̶ò÷!>^ÀTúT&‰ÇžK?}ò•cøb¢c ;R4>¿ð‡û?Õ\é±|G2íŽ%ñn86ú.ýÁ¹Ÿ³Oå1 ­û1éžÖ:ÚCÙµ¨-»:Ṷ{¾ýû»ÕõââºsËÐ^¾[Ø~½^®oÞ=»°­÷°ŸÞ.ßvES0ŸR-ÿã>†95èÈR_©ÚžÀ_wë³_^ïê©ìËQ>HO’ξëéì%Ñ™|¢ìlòYÀM±ã1½)äh µ[é³;©šéðIÊÕ/Ër¯‘!Þøòò)É‹ÆÎ~Š©ð°š[¿²Ç?}1þ^&oæës fÌyóãfý3Ôš¢Ý 9{²z±Ž¿?~¤24õúï«·›KñådyóÇêö+‘ Æðÿ÷¿Äø_wÐÎ|úI$£Ü$
-$¡Q–—Y‘ÒE¢¨z£2‘™¶h‹ß—"€0~ÿ>üo¸øÈúk ? þë¿“Á9–ÿ‹ªl”&2¨|T”zpE92Wz&£¤LÒÁPé‘ÊòlÊQQä
-2Ô(Érí3¦‚r²óJÐCYxˆJ•¥/>«²,Ü{¡ˆcŠé$M±ˆa[Vµº¯Ä;hÇLH=2JšLGR¥šás f*ÕiF²ÌÒ”|‡Ì ¿·ŸÏä:ËÃy­„¼úŽ©p9Êp½
-9к\Ñ[¨L¨.ÝáÞê>Ã[m½üºV‚®¾cÚh+öA
-¯I
-µßçØÚÃCRg¡½f”ò÷¾ý0@™I´ÏÉj%dµwL…Ë í÷9¶ö®L×:÷ÖÐ~W/—“ÖJHkï˜6ÚŠíÖ+weÙú±2Yš<löÁ«c"2ÖûqXýT ëu|eÙfø‚];‡Í®ðô÷Ô»sXïñi³åÔD‡•Þp9®D™yÔDš•¾`Ò,¢[t­ ]y TÆæDár\ \¡¾ö½Q7¸ª…[òZyå-ÓF{±þ×o8šY–&å@ŒÖ:Å~(€SÂÕPŽ²2W9V±e¦”ðµ‘Ö%3”À¤r`80ŒÚ˜¤ˆr°9i™R=]ž™¦ä ””²D&ù€^G}•R£ßAe«ÉRjü2K ¸é%©~„.Oò†øž|”§…²2û Ò´X¤,2zVa{Y"õÚrRû5¾Ç]á¦Eì)ž¦Ài¨’4“Ø^UÊ»°„©<hté¹OTyà¼j$ n»k,O¥‘2§§²´¤¬L™2Ï©à\°„É2MMI¯ÖðæF;K£ÚMETûW‚Û–ùœ¨ÝQ‡ÀCQg½q?º|Mã†`ÃìÚ hF¤)“‚–I¨¦Î¡™PFªìâ4Ò@TÀ< I°#‘­«2d$#-aÝ2þ©).”%ô /³)M ì\¥p;\
-cGf.pŒ`ÉFiðÊÊÐÀ(èìr@_èÝõj[ߪ”:7¶%mï&(ðèDQ§b&éGPéBÂ’«¸³aØAŠ5ƒÐ8¥PAi
-4ËI,­¬¬Þã+QNqõDεAáÐ°ß ®
-‰ÂíÝYëc)Ó@ㆃ>;âe“C_†cS–pé^ö@ùs{¿=† j[”œXm#ŠÏ@•à>È€äg!‚.6×½…³·pörçç!w¦½…³·p6$Îa›8ñÊY8‡EdâŒo;ÚÆéd#SÀ8¥²fæ²ÁQ·ˆy±Í¤<e²ª™sÈG|386ŸÍ³¼ò`o<öµ“_ r¥¢>­•skOö†Î'/e~f†ÎW«w·½ˆÙ:{ós8³ÞÐÙ:·ˆi#ø%þE»å
-YªËHp+¾û0ô_»g‡ø°+?L}J(® ݨøF*†\¶—/q×î;÷ <çJ¤âãFleK¨¥62óËV
-,%Û ŽÒƒHXWó‘ÎdéÖˆÝPC•ÁrZ¨$Åñ†甹ïY#GJ—5ÀÔ=_<9âÅÀwFy^_ÛH¾Ö&ËS‚–ç©‘ÉÖžù‰IÊ‚
-¿qEø ~ƒÿèkàŸÆúE4‹w££JšªÓñ•¨9W¥àHX—Ü¿+“ZE9®2¹«lÆKœ{Õ ßÆ<š=M‹î¢¨Ç¸÷Ùögî»›+W/nH}zîåY†Æ`dH–µÇœ¨q’篃»ÃÇWñÇ!ÞOUvTšŒU³°˜¨.§RŠï÷ßaTbøô*úäZPi_ H[›JÆ«Fµç4ô‹²d «ãá‰sGhjEMFãAh.ªè9¨ï(Øã§ÂŒ(t†£JqÒ#Œ/'ÍCé"q³-‘«äfÄ–xr™”i<;Sx 0¢3Í`™ËhŽâD‰'þTT&S4Mi¢EóÔôRÅU»º¸¹ÊLj§2A®Ô2áG(²‘¤úñ”Âv£B ëFB‘¢°WtÂ=V龩#óoé2—DáQws&XèuÎô]Ÿ“ –†®góÝžaÔÀ2îå”Í.ƒ”Ñ¨Ç †ÃŠ{^XƽNŸkSƒ3_Ù êF€2ãQà²C¯³rÁÖÍ‚¯~;¯Ý¸æÇ#À=ÔìÝiÛ\(2IÃñ›Œœl“•#ŽÚ¤F .W"£ðO™Ï1ϧ,hˆüuŸ±]îzè¾tÝÓ®|Ÿq&r˜²ZFY…1áºR\‰-öÚ}çž®¿À}ž¸k—à’õ(“—v#¨»¥ja”ä¸m¼{Ã~
-`z :ä²´Ð]7C]ä¹dݦP©ÁÂ¥cL2Ó9h+Șh’˜'Ž–ѺäG+ÉJ²‹ÒmUiŸŸ,ÓÌ eî.Scð.P«TTŒ¿­þ)žOíþÂûí>Ø"g(ðHW—H¿,”“±Ý-¡ -9©ô´›6žÀ®†p‘ׄ ¶~…UíìÅ+¼¼?(ºà¯žœõë°èƒfR'2Hɉ–R;ƒT
-OÒ§^®Aù‘´:—Á)ûaè¿vÏ’ÓÄË>ú”—ÖßB7Z'\£˜ø%õ¸á9W"»ß¢Fleý%ûQT^¦Á •³I1TðÊŒÜUÀÊ[1í`”^C1€PµªG%•œ»çi£É´©9WîûîÉ1ïut¤dÙn–ÊU’£—F¦(S+–J6>Áz
-UvEFãÃ9Ó¸:>—L£Ìz‰—VëX­b½Aõ •«ç½jë¿­™u±Ø®žìò®Œ -¤vçmn©Ó^¼Â ¦Ïø‚¿zr«©VÜɸ_`üÿÇv+=Âê¼Xþ¹¹ÆSnªëòÿ² óé±èÈE.›&#]ÚŸ‚{»,4‚âCiÆ<”¨f¤ !C ¤4*'QrÄm .)#œ!ÅøѬZ…ËÁ1Sä]LJr ç†gá :ËA–Ê9”1ø¹«Á®Øîæo¢RòÜ—BQßÝK8껯… /ét[Ó!5†rlc(L>¾6j1Ù©3Šn»eH=—šÐsCiýäè¾¹ ïï‚÷æ%j^Š‚Ý›¨èÏЦÇ7ØhÛî.,÷À‡ª&›Efa”¡en”1V!«@žSz#Ьyô^D>I™"è8!{ ubà†cêó )qˆQ‘$yáÊÒKhQZï—3¥ãÒ­á®l$- (dxJ|Ð@:Bó&=ŒTâ²yI‘‘Ÿ{”Jì=•0þs¨ØÂáè€)2ÙÁÐV%è-­b{k:@EÚȘàÐ,GÕ¥[´½OèÀRrÃ¥¤)eX²æ7q¤zKúYAúUUúªZ
-}¡5Ôb-ã&S¯èÐ+Øoyõ[c˜§Í‘åb¬×Ö‚m|Ø`Õ)ì:üMêSôu`³ùñöéG_ÿ÷ÕåÇúyBÉã'„ó\Ñ`ÒÎP4˜Ó
-ùŒøä_ ýFM*ÊÖŸÖ Åpþ†‰É£pþ³{&<âŠu¥ºwR=¨QNíæFiµ×Õ«Ó¬ñ;=&8ûÝ_èšã¤)š{èìÈÛÀÅ€(’+e ë·ë%"ð©¤ÃE —a­#&b3†>‡î&ŽsE}ÙîÅCªÌjƒyŠ&4žp¥EÅ6Þ]¯]³4«A-6ÆüR§)ZGòQÂÈ+XÂÊÏP%¹ah+9Š^E¢:¼Ar%]ž½R`è)
-Q’â¤%.ENª,ãîP£D§lC¤Ãuð‚…e‰sDòW¹ÄE­Ä¨QNé¼™”Ø:­ò„m­ÿ(fSÿàÑ@øx³–
-=WÀ+S-ù”:ز¡㺎(ý]d‡ÂÙªp©S!çLHZ©dÈR#]JÅ|Š×ÇW5n.†›ÎÒœrHÒ€nC¿ ÖÜg¸X@Çà¹M6 FÆÐÑ_®ÀjE¢:Öõ-¡)ß‘'%jÎÐ>W
-\5 :¾£î
-Úï;q à ) (ø*Ç+fž!ˈŠ]wΡބ7@©Xp*Â@OvœŒ¨úìfÀÀ“E´ñRË › ðKÉùÒy¶[·Š,¬,øg‰b%ßÍ@¸.Å›§çÛ=]³©FDËš‰ëÏ·%\NÀC&!hA•†#¤úf`Ñw12 Y¦Y`gRò­])™¬.2N¿€¼—N’›Ï¢‚Ø!­‚×Ê)0Ñ'Ò"Ô£DÙgµ
--ø†áwÆF3‡†>Šœ âw£˜vO¦?º†>‚—‘ÐP('\Â:[R‰zé°ØÓÃX=#°0³Ù.#J<x}ñÎFÜõµ=ÚÄÈQÁ†±
-¨Ä#¼ßU³ü8W+VÕUiÎ.3V¬[h†ÈÈ+c¾ì´v(@N-h§©‘±Í"YaãÎd;ôgsUBÒYîA•Ü'kÊåð‘‚øÅ^Ýe— ÔtƒÛwYÌ÷†([S{‡;Àíê…C5ÛUI&µ"ºÚ± ÌÎ色f™}FˆÝj9H¬ÞÌê×2A²+ÙPÛ íãè&r†…ˆW k>à±BÐ-TÈÄ$LÑÁ8 Þ
-æòxû6x©Ñ/ÏÁ…J Ü~àS´‚Ù˜ãÐ8QœÍzN¶ñáÆI
-d‹E`He Â=¨Æç3á­On–¨æ6
-Þi˜#ò!]d*$PWC˜ÌAô6Ø×#ðv"¼@^’á¸zä-no
-*$Á‘"·9ÉÈè–
-0áÝ
-;"ý«äã
-û¾Iù5—`É2™aÆ i§CL%¿é®&Üs8\ [p:ÈДEÿ£
-
-  !„è¨G¿v”¥%A< ú=Ë™ž ™ùϼ)$+à‡çñVHcÀ-Ex†Xœ0%–Eû öhñÚ8ª)ã.lŽK¨B’²W;›K*ÈbTÅÍ6N1cµ
-–¹ßÏEd·/ƒ,'™37ºUê«!‚i¼](Ì1¦’Å<2}`² ¦’ŒqxQEe1ÀOXÂZªÇŒðMOzÂë~"<j¿è”àÀ—
-=,dMrÀ
-àŠLŽs§¹á¢ÀÃSÇ|ͼ14ˆå% „ÆqÛ€0WËfeÔÙ:Žcè)¤¾ˆºâèw’ªä)Ës„LgFx »``s•ì?Ì7Þ=1¿ä¤zb)1ìlpþB®Áð ºÛŽ2ˆŠÁ{½$E¥ú¨ ÷DOX†ä˜<päÂzâTê;CO2]b¬HƒÍhx(¬Ø°Hm(ú‘
-7ZvÆþ@°ÊÖÜRƒØ;Œ Ã]r‰VÁ
-À†á 8ãM†haPB30÷…àJ3’F¾9¢žÓóOd™Ç¤2TFySÉ s`Ç}:®ã8•M/É4ò‹å¹±Ÿ’•‰˜Fö#2²Ÿa&Ì‹üTEdBæù µ_Þ;=¿Fûà%Mü½|/’VèY˜âqMp©yÈYÂô4 Hà—=Ðs˜£ÛhÈ_ˆ8†øOò,‚×B‹qsËt·€] ¡R%¸F²Q9¨›
-]"4éƒÇÀ@•.Už¾ PÁxSÐNXsÿJÄpL½dèš5ÎrÔŒ„2“ Ê”† DYZ‹§é' d°ÐKX9%0–z¸x0ñÉ(È3 IÀF$"õ|#ˆûamCÀ
-Û2„Á1Åœ¤ˆ¦ ôË ŠããP!¿ ÎIà 1¡=ˆXžº @‘âÓê ‰W¾
-ö:̬jž/2ò±ÄƒÊ®RQÉ’“Éòq¨À–x0öE~¶^ãt§ˆY´÷8üV£
-ÐEi e*F Êtg‰ç¨b¢±6­"©¦ÏA ‹3ƒI·40v¶Täp´º¤IU3š3yš¶I•†Þ` £å‰°A®ÆA´½j¶3bpa¨¸ï ';ÉX€Íúix,€ýÅìZÐÓó8<^ÌÜë…ðqàdÈu†‘øʦë24€þÁÓ‡d8‘ HD'B#§˜isæ¦'3 £“Õ‰‹™´M…¯ÒL"]‰Ñnb‚·Š£Æ ¸‰ÁI ò<±?iÂ×<îA¤,
-/DQ$°I°½H¨¾ÏÖ7^xÅË2£˜Þ Ÿô)èª*
-N.°25Rf„>çŒ39ªÈ~X»xçýæ'cÍêw)® ÕTâÁ
-n/3£Pðãæ /‚þ‡Ó
-gz¥©C6Ì[ˆåƒûß8ÁñÈþQ7ÇìN<9•—$Ê4 |š>Q"WˆÈý˜h°fÇɘ8âQ€}Ø)ˆø­[XóhÀB t+~((Kô„%N„ŽÏ
-/ª4
- ÊŠˆ”?®f¼j~‰KC…ã‰f;qû—q ;†|8n—¬c™† AÔFwÙEf…Úª™zFÄfý¤þuÕ £À¢~-Ø_;ÏVÔr0ËdËK`6é°ÿÅ8?1#ŠfÏ™%Ìæç#ƒ˜¸šeº£mÇÌÑôE1±Bl$‚X"ÚLCŒ¨ÕäZWª;'£™[M‘kKîºÁG„³”a¼EˆícqX܃äxˆf¦|-%MÙ<©ù]ÇßÛ5®|ؽ7¯;0×àù [l4Du”\…3D¥þ
-Jxhäe;UäÁ6ìg³ºmƒE˜Žž
-Út?ÐU`æœ x¢‹YÇ‚Õndx<°ÖÆ“ØÕQö<“$ä*Õ:%2ÛÜcØ·©G
-Ý+3‹"Ú†ZCiÌcÊaóBÄ´p8/CÆûOàqp‰‘AA=N‹Ä»ŠþnÙ] ¢YA‡ˆ …¡&¦ ÐcÅ¢Š"So•Y9ΊlMË,2ÉÎqÖÙ*2dc¯2 {c⋜ĀÙ)©¥€SÞ'°p’
-‹ÿî±X¤¡iÿÒ¤·¼®uJÕ‘sü~ÙAè‘5¬7GI
-`†Èg£sD
-d–àê°‘y‚ÂwÏÔlAK CÎû8-ÁG÷9v?0!à’ƒÛ¢`ÿN1½Ãã9D¨0=É7ÿ‡ìN‘i!„Y‚Ú
-測˜‡šœXXÁÔ' úsG‘ÓªùuÇŠ©`—³HYæ k˜,"ŠN+P/*p@Žà`QQD€—D†S%8%Ê¡* [¤< ¡GDƒ©
- “ÃzNÀ)¢(Iv‰
-2¯€m#…®™:ºá¬
-…žÓØÁ¢¤Ó]n Ï‚ §NÐ=fØ£¦Q€+úOÏÕ€8_pxÂIž¢ Á:§‡¸@x„}À5@°-—˜ƒ š#ÂCLh'è®–Íèuk"¬g<à
-Y%°1>|=‡›
- Ý™¡p<‡gbq’yé\0“±E¢iQoÅ7‹QQbð#ƒûÐG³YiÐ"x¹ˆ Ì[0ÌYRè9Zfæ Éxq'á9¬BÕYò“õ <çLÉð¬%FæÑ>kÂÓ`ôð,§þÈÓ“Oô’U¢o 2ðpNôRaŽ!æ
-Ò žÙ–}=¦‘Ñ®FáqÀñ‚Xb& (‡P +s,½¿‚( 㮇E½A0sˬ3ýI…3gñŠAˆËû9÷WÐ^ÈjFH/žÅkLxôƒgI‘Œû_çì!P€SˆXVñ<<ÑÅ­>I…óªm2Vë
-êo»£ =?ê]z!˜‘¨•P „…ì–,}iòdŸ¡÷—Å[¯“dÐ×ë~næªq7q·ILØivÎúw›‘MÁµdx:=ÝÆcU‰™r8¸eH¯"y´7¼0%˜Á –Æ ]¦ªDQ}ÿȘÚ`éýýÄgï‡!@‘†o§è»1 çáà“lÝ#±öA>‰ éÚ½R†«Äœ$šS ãÓS80)¾—èyª>§eep‚©ÆRï:<FÜMDܭûºÎÒG *lDT(¸ãzãRx‚ÉDg;WTÕé—³!¨Q §G¨bóè¯0ø6CQÇ|ÃA¸»:x—î¬ÝÄgïâ7éMòƒTðÖ–ìn=@%„£»éD0õuˆÅ<‚Ü¡ò…HÃg\„ã.¥Ÿ(¹‹†ð91-¤ÂÀ¡',ŒŒ´[–67<¨i´6îZHQ¸"ÕbõˆÌ’>)Š #P"·Êó8 žb.÷RJÌ .,÷ºÂf$W3NÙ¬e‡‰þ
-îØ‹ß~…†‹§Ù˜üåÃÍG‹?š5’† É* ŽK½Ÿ“>Lã²/NâgQ™S‡Ø$ƒAëx¥w„ ñË·;ˆÏÜJ϶£ÓB¦4usB[±tX ì–¡8¶ 5ŸL*[2ÔÍåÜ Žö9³Ðü5D± ðäåy)+£òR+/åy)ÈKJ#CòÒ]hËKyX^Zº¨-/-Ut@^Š£òr|Ѩ¼4³g‡IΑ—”Ά䥫Б—®/##mGF@päå ¬Ã30U^ÒS;]œÎìÄ»€ã
-V— Þ­’u•Qtô¬Ó+XÙ5\yp•É¦íi׌Œ´ì  `d笧Z—÷ šÆ%Ûè°ã>ŸäyHëÆ3·8c>hÇK.ÚÃãXeøªLÌG»dê×fmKüÅùÞ¾ã?Ò7XÀòÈvÍ‹íŠ0Ÿ ãA5ÔÄôáe*¬,Ðß ÝJà„àMÖìÀ ðÙSƒÓDÄn\P-"Àž%êpwqC;0¬7<ï¥Lmäé| "[¥.ð<ä‰àé9Ac¿á•F y"fê'>{?pñ6ž24D£Z2½‰àÏV•AæAÀ¶ôGèÊ"<>­\§Öê0"ZŒ´ûÅÜqÞ(ôM®Ñ'Ÿ_æhh¹/Þéw«¾#­¥=ëßI§¬wÂÓßùèË„ÖhÔÈêhWk%³fŒ~ÍÇùÚ½¨ïä›F~V%«ˆ4á®/N­?¦*6‘nh½7ëóXÿ Üüƒu±‰1È“>­KŠ£_b<i‘©­4×Z-½cÕ)Ã+lb°–{X&uŒi+Öéù\M$0X¼K€ŠÒù&20Û?™jʦ0òãÃHˆ‘€˜1ÈÔƒ“9x_,óïÔº½†ŽŸekE²VyRU~„‰±‡ãiõ>k&— Ã=±ðˆ×´Bb Cÿà“›2 ÚêÜYBØ5ÿI>4»eI·üÐyòŸ5`×?½_Šj“~X²ÊEËRu§6Ž¡S;§HfA¿ò’eŸü^$ÿÌ0ŽY¸(·BR\óYº­‘eý‡ÂÒ‡ôÈúµ€5Ÿp9Ãmh\mFö³†5‰w‚l³™§Í7'Ó'³•â8§| Œ-•×Iˆ?Þ”'>äŸ.$þ
-zPé+¥¬;·vØ2þjáў̫¸×Ž ÀD!Y‹Íê›n½]K˜;çéZƒàê'ªZ­å£h)uc¬™UV‰ª¶vQëÖˆ. Ž¶ïi¥ú;ZˆkÝZÉùœNz¾×1êºï¤RéêD„°“¿7?È4}Œæ4:Q­Ý&C¦¨%éæàCú²¾TIR»PëasöÓ8阕 €Ór×h5¡ʳ9šÏ.a”µ'ÁÑÈBÖºìEbxÕ r‡SK}W±™ãÛYêgYKê߆oÎrõ¦ˆ¡j+-§Í´º5²~ÚQ½ÉZ·ÝоÓG¨²áÃáú6æµNoÌ%ŒV¹_ëÍ2·SZ$¿ƒH¦Î´åÌÀûÂi§¤n«ôº ˆi‘ì kFÇ„¢¢QåL‹  Ô,9ïê©ozë¤\ž€é)èŠ7ôVùgá s6#²œá9ßOÈÜZêo½Ôð~;Ž7ù$¸9ÆãOŸÊŸÞú<Aqƒú<åŠÇ«$„.*ÀAœôJ3‰ƒØ\SýLN%xœÊãT§ò8Õ—çT¢Ç©<Nåqªq*–,+‚¨â©êœÈÀ+¾Îòã2=–õ–%y,ËcYËòX֟òdey,ËcYËúsX–â±,ey,ËcY
-Ë´ý¯Ì²>ÿ‹éͼھ
-ÍtŽ'€<¤Hì×@žøð\0“y&cr3øoÚç:ù1žñÅC«=¥uÔ_¬2ÙüpÆ¿ 'a3²·¹SDZh¥‘À}b’:Ñ_ y›_Ócü§­7OÛ}Ÿ¶û–ó¶ ðèVp_Dfñ
-p5¬mkÊmæ)<?‘Q}qßà¿Qý¤¬C})LŪ°x<¶¬
- Mj`¸ZÛãX?“cytx{ÿÖ3ŽßÌp?ÊÌaØáR~ùâ‰Sÿ.ãiE&kz+\µ"••án/¸q„c©R$p‚—éùÓV§£}÷íÚ?F«§5|w!Nο ÿQ,Ìóÿ®¥ÿuüÁT*:Z«[1:Íé"Ì®6q?ÄÕÐl{!ö zÖ—æúÝ!vôJƒÀ«q…צD¡{*Ý’ÖÐ÷ÓZ‰ˆX³º¹Ûbô´žþxFX¥f7?ð*©?wt}¨g­U6šµ¨Üb˜¡~rz§D/¼ÌûuÚµVΨѲá.ÜدšÆ7xÓ뎎äbp$&|“­µ(¨2çngßjG5Áiõ› £]Ó'î3ý8v.•ðí5Œ¿ð*M{lúdÓOçÓÉŽÑÎWµ²ñ×DFínj6N-Z\¦Øè#;ú•y3Ï¥eyp‡“Ù¯ÑÖJaJßÈØŠVÙd˜øüÜûÞþ/ó¸"ªžu_\ÿ¦7þcâgETü"왦>\4w´"Ô›ˆÀ¶fCŸ`+ZU
-{ÍUº=÷š{iõf]c¿Öp†ýe…ÁO¡J¬Ä«tåEEYd °cá×oÉÞûÓÃM'ÄÓD†ðó_ŒD§a‘!,×6ÃM´QN?í,
- qfí*g{qß™^6›f$–²=4WYz Ö¶ê^ë ‰¡Õ‰^- ªk¹8õö:ºÞ2«‰¬¬ò2¶Êr"¯ªöà¬Ú‰ïšU™pV ŽÐŽÊ’ÊJÖô2®ÊñFßB'©*#WÈÀކ©|¤=“®™õYI•ð¼UVT™ÇóJdmF’ü!‹u´9GÑÐ-slr‹UyßÞ¯úâ[‚h¡!ŸJˆbVàpË]æ9J†Q|¨¬•öÍ
-°o6Ëímq
-i–—ì)“IU<(‡Ì´ŒN@ÒKçšú ˆ¨²ÁhímeËi7"% # óTE”DÉœo…Lçø
-E¯¢Û…4‚ULÌ)²éKlŽÅ™ ÓèjNdÈ´¡Û•Á1ÀT3¼B‰Z(ÊæLËÓ$ª
-íY”ÂQ ÒöDœ…Ȧ-Y°Ä+hê²².BÊ“«@뀎ÀEX
-E>kÍ¡=:Óñ…Íð‚=8–µRô FA¨QÑ•(S°l#_K‚ÅÊŠ²ÅµT×!¡YÙÔçXê@V
-6$AË´’*@ÅqÖjRd‘G܈œ$ˆ6£Š
-9 <{¢–@ŶJ ]Ý¢€Ý3¼ "n†¬Qt €TÁªß²3™&diWÀñ 0d×d¾8<£€¢Èa‹, ±hQ=O[4©‰ØË06‘ŠAØk.&•’*Ç)@'‚à `”ƒ˜TÏÀ¢$Y)¨¢ˆ0‘“±CKU 0Y`ê
-¶E°€Ù<ÍœŽòaÚ¨ âŠ•D’L¹›Â«=N¢ÃÏqqp àÃî8×ì
-²L™¡L¤‘D¡Ìâ²”ÈÚF4r¬¬µ¬Ê~i«ˆW¹.]LÔ
-o¶=îØKͶ§´Ak)WkÕ}˜ÔÓx³w]h ýdÄ÷‹ ãþ˜þwëjéÞ×þ‚Š¤Ð^GûŽQϹçwY0Tp;´…'Ò•)IòVb§¨,.^b°TÔ™gêÿ0y,¤fËrI(·¡ÛYœ¸~EbŒ U9L% 4Ø‹hqiIäe”"ÑÚQ:(#§" "`¼ÏðÚ¨Œ 4lÙ惄“¢f ²°²á#ËØGd'Š&Áþã½ð7p)‹ˆp &*O„S¨¢û#‹¦·Àþa6Ì!ûC#…üm-SNâqu’UªPÞFDH¥'ÑdS¤HnáD%‰È
-'bƒ!—ä —j/d®© Û% ý0[”©¸CÅ@¶X‘ÂÆ‚:%ã‘7mQÅþcÒ#  .Lþ¶L¸-92‡HgD–%ÓH±`þaIs- _αšàÄ(´å8‘J\ë|orôÁ- • &–üm­­K½èK £CŒn£ß¶WÙûöÄ(¿äm}™³µ6¾Ùò àº@¥Å”º²%Ó9Ú¢E*TB,Û
-ÑÌ!éhÖ‰#§oæmtW ‡w€ ‹‘è€vž#ßlA°N •Üê…C:•­¥Ä‘•."Uq2 º—dÉÔȨ¬4IËmñ²ŠêÐKËÅm‡“åWr<MnÔÜq›:«ðå®ÊÖº=·¯ÍŽ JvÍ£=%~eÄc† ¼é43–¡¯òß›E£Íüos¡}£Id_h_o´É?q­[×Ö¼®@ †¿€A>†Îòy¨Òo´ù"D~"xNAÒø«å~Îê•÷çm÷SœHô¿´NÙ]–6:fÑI§uÐñDÞ÷zD`=sNAA+<¸^å{ZÇ~¢H hs£`2*͹O¥~Soõ’ZO› >®YϾu|r9‡É3Y°dqš»ZÕ§uzEƒŒÉWB†ÁúŠ
-¬?<xÑ}s¡ÅV÷ñ›ÖénL¨ê7ë€\`•ªµF¹£·hóEwài,ôß`K¸ØÐózïíA|õ©h¥º^~{.ZFKÿ¤i°@úÐÂ&“DæçðÖØŠµV™¼g?i|nÐÞAk_…Ôf÷3×ÅT¿IAŸÁÁJýnÏhþö±Á­û¢ 
-Ÿ1 ˜i¦z§kÔž[_‚æ\Ð|hTE­Tî@æ—²%Ü`}ŒÎ?_gÖ\Ð|LÓ{s4Ìg¬«¿?8ŒIÂÆFäsÄ÷µ„LòÍᬠ‚,©"Ç|­Ù0}hdýNããÊÏOBò¡±”ôF£ ÿÝËt÷ GÙY– ´ý•£†éCŽÙž‰ ž‡ÐÌq¾ÏŸ=B¨){ZçùgøR~ŽÂgó¡5õnW{~[ƒýœ!ÙÐ|hLZ£WО¿È,`Þ´DQ~ oþõ'À(ÁŽG¤«—hÖG!þÅ~œÙŒs£­·º=Œò,ô¯j¡CD‘g¡{ºg¡{ú×pæy6úØèŠÄs²g£{6úo¶ÑNTÇ Á³Ñ=ݳѿ¢ÝëÙèÿeý»Ö*ë“T?Ï@ÿ:$Òyºg {ºg ¿1Èýõ ôÙò‰ºÂðîèžþ{ tI”Ñ3ÐHåó ôñcò tÏ@÷ ô_c 7µZã¹? •ž…þ,tHV÷,tÏB÷,tÏBc4¢ÀzúµÐYNªó,tÏBÿ½º ¨²âYè?¤òyúø1yºg¡{ú¯±ÐËzmRº½gžóœU?eWÌ3Ï=ó|{ðÌó?Ç<‡£9=ó|ö|¦yÎK²ðf‘gž{æù4óœçàŽ Ï<÷ÌsÏ<÷ÌsÏ<ÿ²ÖûÌ'”)ÿ¶3Ê8Yˆ**÷)qã?ÅJ|[3(¬üoÑÍ?sz>ª¡^Ïh©ð'Úsm&ƒð×k£PÍ$¬òF¿SÒã` ¡ƒZxnŒv¯Ö¬ýƒWbæõœÿçŸûY©5ô´Ñijo³¹PîxO™Z÷gÓ¸Ÿ –[“6ƒéñç¯õÖªü⧽^GkuÛÁIém6þ)Œn¢‘\¹Ö«êœN8à —P°ÌgPÜL_«ßÄû}Þ&Cé3ò0\àü„i‹5žáF—js†í¨Z¥ÒïN6~ͺ
-”R¿i' ²¯XÇäÅ2Ió]Bk}Óºy‚ý¡ eXÖ—#üBï|Ó}ýïž/U®õ´bÍ‘k®Êùô¥/Ѩµ}ÃëôŠ†Ö1§ÓÚßKtŒv¬£k1B¦ßÆèCô²Zñ±dªÏ[µ¤5£Ç£šéZ$õŠÖoôœ:
-+‹>ü EdΨµz@ ¡³~CïœtjÏ5kªÀø"ªàªw¦7
-Æ­ƒßäŒn àÄ·œÅ☙?am¸©¸ÎÅÎl>‰xJÖºí†öýHëÔ÷‰øá>Ž•ñ)¼Ê¾‰–}N•Þ‹ >cgÿì ÉW2Úß?Œ)ž `&Lq
-óc˜’˜¯ªŸ@V‚"̆,SY<£~dñF–Ä˳!KT¸B– q_Y‡‘%I6²dNù!dIŒò9È"rÚ&ÊÂÁP[¢ÚG,õ~Û—ÕZÏ}íY÷åŒv¿mÒ'pŠýêÓ,Œc>"Á;Qü-Í@E^œ\—õu,EìÍš®Vmó3ÞÐõrV¯ô.FµDhÄ}–
-i Vöumåƒqô Õ×ÖÚz‡¼löZÒ@ ðöH/×úMß™Þ5}xqïRÇ!,Ý
-Á79aÞ¦qËJ…(–ŒÆ¯¯ˆ *ò$Á‚î hB“‘ëpÏÉ$h¢K  ˜Ëj­T5}Õ‡ú÷Qm,gÃrw Í¸À‡Ûœ<ƒØâÀ²ÖL |C%Bß ýo"ûŸ ›º“쨘_tPo‰|#Ý1Ohßa‚K0µ;ÐþNéž‹/«ÓÓ–¬3ô„ÛzÓ+½ÛëuË ©ülÑYNÃ,1Ä
-Q&ʸW_ºßhXªëiŠ@GÞN°m9èà„¢6iª×N…Äîê ÒÔp‚íZš²äJr4Õ4çûE²ÒÒê äºMP#[~¾Ö¼ÞØ×z8]*“ìº £ 5³FIk€Zï®ë®€Çå@¯ã¬S
-˜"Çì¦|‘'ü„ ÛÔƒ{ZchöŒ,™K~6&˜wCMdZ¥F¿¬û®Žr#« Þ“!Rð}„’+F£¬›«1TƒÒî€Ý‰ VžbhA}zße­U6þꎅÈ]¬ä¿ÇbÆ]éH+¹ìÌ¡·µ!_¾kF’ýv£V 0M$ý(®Wµo5c”#¡ï;q­TÐÒ‡GÍ N{ž4Gçô
-oÁca.¸·­’ßËPiþl/X?æɯÕcø:•¨u kðˆ€ŠÉèY¤K~DX|›NèWx<‡ÇHêiû5?4ò—*ƹj±ƒ8•@&‰Mç}:Q¹ßúGº‘ÚÕT±À̧7“ýX”Ïî,óñµH.VxíÓ©ø2GpºOÖo“•¥ý`ò°Ï? Ê™ü\‘¿ ø«\2ÃqÉ…Ûuæé‚=ûçŸÅöBgW’jÏR!r}Ã¥ü‘øZµ¹½bÍÇ\þÆ)†É;¯˜“·\¿¡…®· ‚šÀ<àyå Éפø€ séð×kVÝùu˜“Gò&sæ@+#µÄOó;
-we÷â×7g±³òÎb<µ
-ë”2ìJ]½‡å1z@zα|ß_]‰§¸Ê^ŒíDVvK؉Î'+‘;>?:ÚžR:—ÿ ÿã„Ùˆ?°VjúçËû/~òR 4ÛIøý;=€sÞœ«ðòý¼?||õê_^W—‘Æq^I sņîá)
-óti¬ìvÃÏ
-¼Š
-ó× iç.Ö˜ŸÌûç‹MÒse#ÃÍ×ÎIÍ@û~¾S2¤—ÞÒ¹˜Ïw‹ÂN5®/‘¼´`ùk% .ò+¥©u›O•ÀîÙËM y|pØÏ3é@ö²¾ÈÝ
-ÂËV$p/îÕö|@Ëi€þœo^¸Ã—¹` u–¨º‹±ç…ù“ÊÂÒjâyaåa¯ºÀl¾,ˆþóæ‚z÷øº°}Øö/$’ìÒÂ>‹,­\Š g«Ý­…ËèúÞÂÝÚEnA[Ü.TŽ« õ§n¡ÝÛ‹ýý­¹`pñê8\é/ÝÙc­”z±•àæñâv0ÎTòÁ½êi5xt¸æåènðz¾w|hÔ_ƒå—š|y|ÊÛ•RsÑ_Ö„Å¥zùt1ºØl/
-òüÆâzŽ½]Ü­ÅBsÁÅ=éâpñèªÞZ,,®n-Þœî5¦&,>ëâíb+y]ìG—K‹ÝËÈRD_»Z.î£K§wKñCCXÊœäËK¹»í¥ËZ¨½ôЯ-U¤ë•¥f6ó¸Ô«ïîþ·´½åE+êUHR¥õÐÖ‹Ò ¥ÒW¡#ÂC…V~1tw§•Båƒv6Ôˆ3R¨?œ/ÅõRx-±’ ËÙìvxç¡ ï½&»á\´^_$.ÃO†ÿ0\Û.^¯ E\&_W–£‹·eé>ùº¼³/Ô—÷ù}ùtÑЖ¯ ýa¹ØÐî–ëµûÛåžñx»?߯pŠñ¸²±?_\I>1••ãÕdcåò誳¢Íwƒ+/GJt¥7&ÏWCø*—ίnFŒÛÕT7][=)u«×÷9~µôħV›Åúed¾U¨G"Á핈¼‰Ebǯ—‘ÃFň\ˆw|äéîò(RžU#ýç&º¿=ŠJ‹ÅFt·Ú&½D/B—Ñ‹ìæBT;<ß6Zµù~s-rvV\SÊq-ÑßX;Yïñk7çk„ŵ×ÜC‘ …b› ¨3;¢–fz¹
-[ɹàÆÂaÃØ{édr©»QHÞg7Ê—K=¹ÜdBqs7ñRÛÌUK™MM¹ o¾Vnž¶";׉­íårxëX«–¶/·Ú"¿½ºwØÙÞJï·—3Û7Gdö·ÛµöâN$’¨ïlwîwNÚÙÜŽ–^MîtÚšº»v²·¶“ù¥Ý|(èß-7ëí˜ÿá¾ãµÛZ,U¾~Ž]>_Vb/KZ5¾´Y‰«§ýfü°Ítâñ½@¼Ý)­ÌÑãe>ã²Û‰|¯w¨÷.’ WýrR>9î&N¢Ñäýe5–l?åSk‹ÛµT\Y§Îïü±Tm¹y^º|é¦7ÖªjúX¯Ÿ§‹'½îž=¼µ'F”‡½Lø˜ô²w,í½®„;ûŒz˜ØOæ:õý«jj{¿¹Üxά·3±pø%s~[Jd^Ô½ÎA¸Ïl땃|¡zP½Ð·C'·Ý훇‹Ã3]S ¿¬õ²!¥sÝzäâsÁl~)¶œ­^ܾ…YÿÅÑv-ž8*œ×¸£—ø†ÿxE~®ǤÔíñ¥8>nnÞ%O¢Gé“äÃÜÎ÷WO^Sõ¥WÕ¹ÌÎ]?÷Ø{èúï+ýS%mÌŸž¨¡à\ð´²"…ÏBk9æl‡‘Ï.”µ³æñùA~M_<Ïï­ó'ávÁ?·RP
-;›…Üzè¤ðÜ«Ï—KóøíáúùM~÷ô¼Sب_ˆ[ìÅQuû袲˜z¹ ÇóÂ\ð2ö\9¿¼Q‚ó—ÊvêJÚ¿¹:Y m\=×J×+O òuòþ¼x}Ë)7~­V¹Y¯fwn
-«ëÆM3ÎÞ²•îòí!ÿüp[~(nß…·Jþ»D°vswWloßûsÁûãõâýùi>{oòƒ I‡ÿMå¡&/Ÿ?FÏÏS™+?–®ª+Oa!ÓJ´ØúÓÃm¯¤-dŠwÚÎîÅ¥v³›ËkýLî´¸q–Ë/ʹbg¹xVRŽ{sÁR¾ËÞ–ŒÃŒV–VŸ_ʧ%¦Sn^܆uá€õÜÖM\o$6Î*üþk©rryÕ¯Ô+»ü3Ïñ™ç“üâãs½kø«üik£š[k^TõN§&Ü…7j§çë·µÖq–hŸ/R®”yÉß­4_ÚÏ™­ººØ(×/’1¹Þ}ikÍÔ©Ò¸î³zsþª¹ÝÜÝÌ7›\ú µR—Z©%ö®UZc¶ŒU9Ú3öùK£ZÜÞlsÌI Ë?>µÿÁ\ðUyÚ_/3Ú|ÇÏGõÎnôþ¢ó¸,ïuÃÁŠú?¶-£™å\ö-Ýó%µžfn\²‚ãÑWÕqì¼mRc3kN¬ýZû¹Ya˨T¢ý®NšÇŒ!gû›R3jmFpQxb뮚¥æ÷ú »v¨b­ÕÓí}ÝÐy4õ]êE_‚è“þ»Pþò$wö}¬:Ò¥+©gXMòù°;Ä]¥Sît£¥~·g˜W …¦w‹õµVËpÜVt;h¤’µ£×‚aZ±ß*½QEoÁf—é6š/7è¿ÛÑÑ+Ž†*írÿ
-Ý·Z(“ç‚T€ ãéŒÖ7½Ó£[³Sû2k:á&7®&äG „ÇñÌ„šášö6öPÅë±ЦÓ?}òI¥®Þ¬çŠ®ZÕÊzGŸÞ^ƒ-á6ÐÔJw=£5¿Xgh;}B½–þ¬9¹*ÑgpàÎþþ¸F*­^´Û/v§ ª”íNÅ°Ä㨌Vs¸‚4ÝÀ,›Z‡ˆÂ,‹¸Ç;sõŽ³Û:CížÑž¹nC¯ ovOfñn¨g¨ÞØ#~«¶ õ u /—0쳨u¦7Ôƒ ´Þt²„ªmí™H™ŠñVÏ×H¦M³N”'¸¬W °ä/ØrŸÜä‹Q$ë¡×ÔÚÃÜæ Áƒ}¯{µž%òfù‚Š6GLNfvdÞ¨3 †ÆN}©SŽBÜJCkG¿ÍXo
-¶ Z¯Ö°£•Ç
-yR§[*µ¦1Z§Ý°îúddzYZMkèìoÖ«¾5ÆÎóÛx uÌvÆ ¨Ò6ó¦Ð_»jtþ1¥7©žÑ©½òUTjt¢vR±¡•êÓëZ²»m Ç+ ×t˜ï keºÞ5@­KÕd2±«ºtÆqª]¯{_S†Ëz·öÜz “ív'Š9Ó*U W ãäjÍV­ª¿ÁÓic¿
-%õ
-á`e_ñ»/Ù!R½óƒ!Ÿ;ó#Ã!dcx#©„±5ƒr”}£ò›òÈ®ù†,²ë9rh
-¤nœMÑ…´±Æ©R¦NS8*©ôãÛk˜ÕÛíò䮡šÙµ]o†–I]X– W"ü Á2Ñ;©åS¢õ-+ÆÌëoí¢VÖµ#£HÖæÆ Q:š¿N,Ö†ÜLzðŬÊ>'<p õ†ÔLåò¾,ÄÆ:=ŸÖ*Ótè‘ä÷ž3|r2“9cÖÙëhe`°Ø,Í×™dXØßÐŒžµ wƒ:„ÂZp¬Ÿ‰uòî0×Ñj˜ß0cxÏÜ1¼³deA SR±\Øã|±Ìòç«Ì0%âÈGïC8~2#¾)ØSÑ=Pe"¶±ÖG Lǵ“g×2œàa_­…AÚ AÌæ>š$ì:ÄFëtu¨8Å5»õZ›¨ ­úÌbÞÊ
-3qä}£1Í«ƒõÓGsoH|à>vDÎ Û90Šbq¸˜Î ºÖª7º=ÒWú¿ÿçÿó¿ÿ_ÿßÿù?ÿßÿõ\OǤùq·Ô©t^AÌ´êdqu{.èB±²QÔ}¹dÚ$'0/àà$ËAâ#cóÐW.¢“e•q/,w­qÑ”êpÜN[kYfÿ¸
-Ýf>dÁš¢ã$Å82
-“¤Ñ¾Ù8š ö–âà´ÏMº
- —ñ—ÆÒå\0YaŠc[ÕŠ|qz{+$¢“;u×[¿ßݬ§ïw×»ÑæJr5ØO‡öÊ•¹ "+ýDh$Y¹¿”!éàj½¯öUù†@ÇÓb²Äf_w7w–.i;änâáùÁ ¿_!oÁ(/ ±|$Т0\iåþ\P} ­”R%ñ4”¨
-›± ¿¸?^}‚„…ótBï/o_ª¥’V‡_µ•T%[¥=³Ìš&wj O뵇ƒr¼ÜYŠtVîú±l~ñàïnTù¹ ´qq¿k•–š+[Gkrón«6;±ÎÚ-–’Ý ‚6yI—/y¦¼^K¬id~Ù£­PdU7ä\“Žà:ÜMd6—©UUì’yÉÜJm9a<¬l^”o×¹bà›ÝnÉ€¶¥å
-V™ 2ÅùŒ€¿W¶Ó›æ¯ÍËÔ!­žXM=ÑƸk.CH÷ŠYÙÞN­rÉç-³Ë­ÍòËñΤ 0iï$.š½Jñ€{
-î^âz쬕?å{™fj%»|ÛHïªÁ¶eTœ…ã‹v¹-¼ÆNñè0¦vÕ@ ±@A ©KÙ7Jçg1ùîà,yÐY~×@LÜ¿ÏÄ/O‰žlBv¬ïuOôŽ©úe¥8ÛwQÛvˆN·¦[ ]X¶4&Ëç÷úa²rÚͯÕr·DmN½&¨¾Ísó·Ó¡‰¦Ð\Ðm 9
-C£öUì$|¹|LÔ^¤µJ3øLôÛe–àdûI–ÏÊ
-1ÇSÃí GÃÍžúÃwCF
-¥±”ÕíÓi²r¾²Gøt:É…Ë)ºÑR RÆõ°¹XŸ´®äôÃýr jõŸ¸ ÚTÌÙß\]X»UäRö ~šÛ%c¹n›~ÿ:;=Î_¤“á²õÂ!vc‘‘ëýbŽÉÛŽ<ìsànêd^Õ;ÿúÊöÞã£EY÷Q2ƒÑÃxýh…¨ö¹Š³f×ÁÓò¯s[~ç…í`ÖËÍBä°}ãx;ˆÅ7¦ïŸÝ3Õ”ŽÝK·=]Ù¹Ð^­
-òîÆáõ<1«þÁ¶Obù½ò ™—­·{îWqp¶B}N’«à ÂÇvªÝ>N²zJ˜*éåA#Mº©Ç6[ÜÝ8_ŠºœdœØ˜ß¨ôs/±Â¹vM:Xo0é»]ž@³±¹ó°c.¨6ÒFeÅ°vÍ‚µzÝ͸zy·Gqúúe8)¶˜,
-zþÍÕëVï3¡ät8×ØH'Åneûú~y´Å¬|W³Y×êg«ˆO2/ÛÒA?=+Gð˜[D¤ùt+aº ñEÚ¯F-¹vµ±kásI_«êO€Ï® Ü^rËä —["ˆy.Þ<Ù&Rl@ñ8â'}þ† ú¬›ZY–*.‰åÐ’´xUv×/_k•ýâóîúUÚÝåØÔvW‹sA”Ø›«×Ò>¶í’ÝfM&Dìô^‰ÌßÍFRoŸdQY!
-í¾Öv×ON8a.3BE¸?±Uºº%‹&y;+쾎ÒF ›¨muw×ÓAMÚ‘®ölj‹[;”Lù"oÖJ·ÉLé,.¹ÞÈÄ?üDx0§éÐÁNVÝ¿K÷L%ØœÄ(!´Ciãp!VI>îy½Mu¨¶ì4…Z4VÑ ºÛÍðBð¨{3U\»ijÞ2¥°¸O?ód|+w©‡—^ }£øÜ륊ñåÐ\pýh…¿
-‹þbÙÉØÍfM/•IYÊ„­Ç» ²H'b÷DEÜÍ\>–\-ˆ¶ÏB«Öc©BLVÏžUá)Þ$ƒŒ3«€ ÐÀT
-GZ«[=#VXáb§¾»¹Ý¾„SžZÌâ˜&ôx}©w®çÏ÷·î„¥™Fjªy­„¢wÐK=sLÌ”á^wÒ®Òð
-c›`—Ê`2ÆŒêɲÛrš¶R‘ì-‹o*áÛÎ÷[Ü€¹â’Z~ïn/¸w¯z©÷]•{Ùô=™ýÝTEpôdi÷(=©nº¨v[Z5ÒËáU‰¨AB˜» ÜlÜÐÕÒ…¹'œ»GêvAìpéÕyÇ€¡1·Øn—+éÐážêžd¤ÕÓ»
-½;;Ç÷;×-•H„P¨\ ik29=ò0â-/ß/þý»5¿´v³ý¾´>2RC3èÛî/ˆ5Z~ZëU=¯
-S%lÁÕ<?ùÛ‡þ&VVŽý½Ó嫽…ïK¿œ¡? ê.E³Â[šé”\’eZ‹Ò ™ «¿O¦_j [óÏS›oOqՠ뾘ÁÎÒuõòniìOåڛ˷ËÇ?×–Cõ$=² '~·†wÓ¥Êüx²Bd‹0¶uìí]¬VjK d–ÜŽcxr©ö¸° ÷çÞèâÝ—éIÉ $Zün÷cï&rÜ`j(Ýî[tFk c7SK¿4j)ßë—X–¸Û_Øyª_¸³/£wºÈŒ8^ž®/OüXyßµ"å,! îÞÓ?€±Ù—±õ¥«ÃÛ8m³«+GçÏD#Ãã“ùpq¤žpød­ß}Ý^ÖgHôÆË" IiG­í‘wÜOÓîþÖMNêþDmйy{gbi½÷§¡Ï€~6݃—Ÿ t%ÔëÞT¢íðáÌÅzüëqéçÓqR¥ê¯%©_ôQ;¼·òQ~>[Ø8õ£ÕG€áåë¾3ÿÛªØ ÄÄú—ÚùÄÁTb.a;{ËO‰k;ÞÎEõ×ïÚ0Z½ýØÞݕ…§—·
-zw|[úñç¨_·VG`jýò`3šLŒÞþw³6¼2X[}Å"¾”—ÖÇû½çû÷å뫉ô"ønÍIèCß.ü9òkÓ1M÷oþËÙäÇÂ^Õ;©ó$ìÊäåÂÓÂm-·"F¾Ìù±¿è=®í™K?~ý°@Þß½Ÿ¯¨Æ€^lÝÀùû3 Ž±¢Ë”K7rG*÷ ùso.‚_ß_a¬«XóbѬþé=†ó2>vý²d L>ÒõîôVÇL ú€Ýß¿ZAÍé )bÙ¯ôø°(ñÕ—Æh¯/0‰µà|ùñFŒáã4ÍóÅÛ_1SýV"—?’êV7>ë\x ^UŒÊøæÊwŸ,{z{J„?l‡Ÿè‡/bnï}û•»Õþ™KX®£ÙðWk|fÇýÝ;*Vgz'+ÃÀBÀá¿›îýzôNüþ?]ü,÷ŽLíöNl.õN›–Q™9¡îi£Ûö›õ¶ ƒ[ºD^ÌŠE_ø@ãŽÉÕ…ì9ѯÆêù-0ö¯¯³3W Ï_×ç7‚·Yuú{¹ötl,¿žKǵ£½ÚÌÂ̵9¶à=Ê^ÄÀöxurlú«»YÓå •E=@¦+ùPýíõõËÛt2±fTì]žF4²7¿ö~`=Ý 7C&õü-jöõ‡ñ6 mûã³+½C4qZ—¥»råÍ_±ý—/áëÊ=¼}´ïôôõÇæévz§+Þ™3µvVNíôlà+\»‰n£NÝ?+ƒéN÷Ž¼¾™ƒ¯én™§vŸ55uZŒº}žØœÌèÔù=r9|´œÞ©=z:>mýJŸi_íÌ. öï?ß×ÓæjÔ7æ3:uû_Gg2:=:3j?¿îF’jØíJïô¹~¾—Úéʪµ—‰^ëxvï‚:…½xµ_Óï°“O?fëØíh㪎‰“{s:µŸ¶RÝX”n ':uœ‡óç¨Óh's·ç¯?~?îet:ézµ3µÓ³¹‹¬NWé#_NÓç:Ýûã­ÿ÷íNz§ÛÕÑÙ—‡zZ§ã_î§f£Na]â[ilîxþ[z§öÑ‘Q Œ¯©öÕ~y;Ö·´NKƒFíÇZÆ\ÝþÁ»ÇÍjV§—ÆÊÄÅAz§+ÆÂðíˆwD–“~“MŽ$<÷Õž‘è]>½«Å:=ž6êÞ¤‰Ž%:- ¾õ­Þ>¹;—“të='÷oýäø2£S·ß»»©euºdlŽý¨SQãs]{™šÿûúu'µÓÝ/Ã"³ÓÛ]a¤uŠ”ß>™4vÏGûÒæúÖ·±zûõäxt$µÓƒáÇ_™îþÞ¾¸¢NKƒs=Y16ž§Ó;­‹ÁýÚüôLz§Ïë}iMÆnÎWúÞ3|òÍø>·±”ÞéæìòùÙö©þøv·FâýÒ8׿GÎM-£ÓSßøñv?™Þé׿Ïß_$:…^¨ÛóµÉÇL¿îŽ÷ftz´o,ÿyXOíÔÿ:Ù×;ÿcèt;õ’<4çÞ¹ìôJŒ&ÍèqýrŒ:µ†gGVã3­cS ØéDÔ)ô‚ÝB³_ÑŸyMvúö44#;}ŸOÌ´÷ôòd”;]<2×â„pâõm¶znËTim’æ
-VßHájŸËΙ“ B8ñlå›F LU7¨SìEv;ðúzyõˆ‰N__nŸÔþ]ïMtúæü’7ÍÜÔv9Þ¾§Û‹½’än/ÏÝø V÷‡Îž¦2=Ú6²~ým¬^ ~D¿6P~ ½KCoà WÕ¸þÞz‰_]ß<ß“¿¾Ýù §Ò}üÝw˜ö;Å­µ©ÓÌ_}klç"û×ß—gÃ!Æ_°†Ž¯3­?ÎYÙ¿^}ûù%ú51·ÿ[ßõÕjÆÛþêÐêôþÿúsø%H¼»?þG1§?;©Œí_­ï>¦ýÎTniüî5ó×ïƒW•Þì_O—¦fÆR~¿<ó2ýû¾õ¼šùëݵ¸ýÚ€±‡»ÚìYÖÛ0¤í/Næ¯ë–={˜±ÁëÇ«ÝzÖÛC½Ck§c™¿./l^ÝfþºnÍõ™Ù[èµF§2~uVå™15ç©‘/‰_Ç÷¶ßæä¯ÕòtòT®î]¬Œ-D¿ÛoöÄN\«7Ã'UI.ïñ×g)ŽÖÎ&=‹Oo_ùSŒŽYï(aV{'׃#0ÿîáŸ2Âj½K;Uüóä·Pzc!û»ÜYT”ïµÏžÙš”ôäœ?6Û/†áÅõ:(éh'¢²é?ƒ{ø¤µoúû9ö×_ù3s5
-Ô©oùõã¢<#·¯}¥Á¨[’t2:uûQÎ9IïÔ>:Îì.‘¿f‚ÓçJ’Nf§xå]guz£wjï‚Œ¬uë]ÜÕ:½ê:%î?ìT$ЋÜ8Ó•ûX§£G$½êÝÆ<cevJÜF§ ÷u
-s‰ÍõGf§€à7;»Säþ3;- "ÿÿ;}®Ó½å¼NëÙOuŠg?Ö-ò{±U½ T÷ôI.Ähõøæ¡ÈsgúÙÏxÒí9[>üÖô9ç·Üw’Z,ÂœO$µl8º#ˆMA3[ûx•Äehw>qâ+ú§&¢?³Ï#7{RXGšÄòþìóèôsØâ51¬ü¥QÌ+'K@¸.—±g‘&Ùýìò ü3±ù$; Xuò–0˜ÜÌ3?”Ð>Ù[¬ü¾] ÿìè³Ô™} ^Â^Vôé^¬ÏI y
-Y_&[ÚYѾŠÝȼ³VN_ZÇ|*Þ¹9–;¹cÌ[‹ÇÁz>ÞKÙÈŠ“žÑFÒs¶'="“ô”šmÝåÓµWácbÒ“Ž»3 ×RÎÏÄòÿ‘¸3Óqw4Ù›I¶³N%éãR§vÔ×úÔô[Œ&'æö6›¡zecHZR²4ž˜•~‹i³ºÝ*ÉÕo £ËÐËÁSKJ£0°w@œ;ÔpC}Ÿ_ŒÁà—2–iâÙ¼^¥1°ž¿MÄÙ·ôï§ñµs´LJôÆÌ¢¥5Ex׬<cçî²VôÜåŸ:¸+/û?rײߜØ7'ðÏɸf¤hØ@G–7Ò–0¦/(þÑ{æRÁƽñm;’6.šËûJêÈfW®Þ²&9oܾïW¸°Æ%‰$¾ÍñÆ%¹YiÆ…%=wþ[i0ób*À3F7sòžy-•[YßÄÉjëÜSÚÙ¿Y‰Óédm>EoÎÞçÖ3ïÊo;r<EX:R6C§–®4XlAÊÏe,šñü±|Ìe,ZX¿•­‡¨)ÞÉ4¶ûX`\p* 5¿PZ—²ðÊÆŽò…˜V&©sucìüµ‹‹S´Çõ×Ã\x¯ ‚ëûì[›ÜqÌþãYM³ÚÔ ÚZ<üÝÛ„Ži vú©|ŸëëÚ©\<|hMPf{lÃJ®¢É¤á%ñÖ±sÔ7TTøyË$vfßÂk¹©!1\M…ÔóÒ|™fßòE¼Ä@äNnJ*Ph Þ²=œ49öÚ@XFϸ¢~­¢êú¤™œ’q'£Ð·ÇúñvUÖÚði ÷ür d(5€ìÍáaRÉGÆYËg;Jƒ­ ª¿M§–xä~¼æ_ËE ÀZD
-ã)·¦ónœóánÚm·Š6ABcYúÖ4m+KYúVl¬…×./Á¡) vl¤ UË¿òJ…Û‰ ’­FÚĹNO ·J“Q+Š&·ÒNë÷^(ï§4³¶v‰ÆíƒÃÄ]LŒÄ9Î*¹©vÅÂP%çÓÒ`ócXàºÁƬrË6¾ &}9Ç
-¡Rc?§^b·X’¢½Ý6P´·»¤¯
-çüÛ{Úaf |kd;èm‰È–3Él›ÞñÃ|@²tLo‡AUK85eQ˜æící3[!= ´Ó¹ µ’!P',ïÍÛ‰Ý ª—S¬ ÔX7tÕ|ÂüÆ‘»ˆß†
-±»j%±—,‰Ö²\èœçXO«€ÏƒJŽæª€;]bH™;‚|{š¯äÅT-O6\KÕr¥\Yàb²o2Ýó²=×2ä}™U •×Õ[÷¼m¡±LÛM¨í)êP‰/õnhH
-—NǺ
-Gþü¹=Ý…K]—®‡Âµ¯·Œc,_voA®ì NÏADÁpÿ$.E«ðBáÒõcå³£<ÆP'zþä¼À§ß™¾ªE2ÂÇù±j¹‰XTÔÑ ›r
-i (±±ìÌv-ò0 I†[5.hÑèGM8yÙy”§]yQ/̓›“qu§™ép’—ƒÒŽ¦\ÑùŪqiýÉ5 —³ß~¯Ü\ž/õß|,ׂù³ÚÞìÖò|å}(moÎ;¢²áKÇ˯ó «îÞzu±|]­.V6°ÁŽïãC–§x,VZÔJI2Fé$;îÌßžÚÒ·W<ØíËõ·M]ù¬uêüœî}ÊŠ°³ó‚Ýn*™µ½Å¼»Áo6/³:½Èéte2Ð:MÆbM¿iZ¸d°›}ø»V&L„€õä»™åD§ñz|_²"ìÜþþ÷ã4+Øí$/êì!?Âîio/³Ó¡úíNoóëñmfwºüõd%½âËyV§Ûñ;ZU8°rÖôIîó©‚Ï}I{Žµ
-±'íÓz¡íÑ-~N^u7…ýª¤¤ÙÚÇ}òBÍÓp¹s°ã<—˜hkè©;¡=Í=T“Z“ì:V/†¤ÙÅrÕÌ9µ™ŸK¯Ý¬$—Vv$%§JíR^%¹–´p'K…]$›DCRNÈüúš‘Ëõë+¾Ÿš‘Ëœ_ZÝ·fÅFŠÎ¯y­ÂHoVg$‘K­ƒúqÅÏËÊmv!¢Lw×¢èò5½íDÓµ§‡i5š.MPµ8»MW0?L‡Ñti:Áäyé<š.-–®ÝÈÇìhº4]|º§}'Ñt1´È3›š¬£hº´¦šdi#š®Í¹Åhº4;MxWv-š.-–N—÷»M—KWз§…hº4]»ªÀÞ½hº´Õ%MoW£éÒ˜Ýw´;Ñti±tÙæ;ˆ¦kÒïþlN©Ýhº4æ´4Øíhº´õKñ†ê0š.ÙTÓšÂmEÓeñ–ݦ+Ž±N¢éM%mâ]Š¦k c-GÓåÆXu-š.=¶ºÛÑti @/]Ž¦K³–$|à»M—FâÒk7¢éšXFºM×ü~éF4]2"n¼[ÑtÍ"¹ºM—K—Y¯sp2
-Ýu\æNËsU%o§Ì]fu¹B±JËÜeEr ¤+ä ‘ïŸºël­VŽž‹T™ÉÕR*s×T£ˆˆé¸Ìäaò Ýu\æŽcßšº+f<zÞèBž+1·oæ/bñ8‹®¹(=oD,wÛ±<0µ™Ñ¢û3Óʃêšú6ÛŸF‡Âs®¾P ]æRóÃl'ŽÂñ…ÐKŽÛa NdˆLÕ_|'«°=÷'ã‰0ijæœÓrCeÙ{V¶Ú ìŠyCÁ¦jâ^Ø
-šjê?VØ
-+æÑïØL´¯+‘›B°¢`N:p¹úÛ)TÛ5­ͳk·'ZiˆdOnËN
-¬Íª‘ ¬Ý}l ¬Ý}ì^V@l¬+…ŒiÁh‹3ýîÊDå^*›Ö{Íó¡k4éb$^£u®$žåC}ûvוȔ0óqëœDcSõnU0„¶²MÄ…Ïþ~K…ª³¬oXx­cv‚[Éóêl¡.d àv:­VÍ­¨C˜–á°5_Õý -YxGÇSŽáA@†BøŽ+Ü©øʬwmÃçŠvëV·Vá./ò±ƒc¨6š¬pוJyM㉊UÊë4ž(¬”×ù1Ì©pK*ÒN…»¼z¯Xã®õ
-wE³šcôS絧/›“%½¬…Æš³9¥"Œצk/°6ùètª?ÂøÂÍÔpèÖò\Q;mÐ͆ØNWâ97b²XÓv²caAL¥fi&¨\^+ñíiALºU ÄDÃ1œi²ôZªî[Á0¦"ALÃ3gIIT»ÅŠ„1Å'ÙDw5®KfÓÔH¡õ\±=<•S#ENe‘ ¦á™Ç$óÝ®\yØRS–ÖN̹i[c e oYùŒaJ²ÄÃ#®Ñ×j9;«Ê/­V¤k©Ü#¡2›;ê^jª#²¾u)Æõ(35Uë<ÌÕ[Kå›TÊ«´ãªÏÐ £@ÔsóWRá¨ç¼W©Â…¨{éý)Ö#ÞVgö–îÌêbeýûRÿíúnipin|woæébÜ…O+[ÝW;<­ÝXó}K|ñjWÓËO± ¼¯s;z§±x¸Òà[ÿÁÑ–®ªŠ×a›ªžeÄÃfá½~\L™qšœÃ3ƲbÿÜþogôGVÞif§0—¾Ú³Èœ«±Ò¼ŸÙéðÚUùWV¶Ñ¨Ó0’+Bð–ciÆCÓÞ†½¡¨Ž HD9ŽŽÌܧuZD'kÎÅÂð.“±:z7¦·2:uûí¯K‘6wžÓéÊ€›ÝéÊvÿqZ§T÷Í_…V&;ÝÉ«#¸qÝéòò~-æÙÝàïá'„ù16S‰¯~Æs¢jd>§ÇWcS ZŸzz_Ž®I˜ó‘d:CcÔöÄ/ÏjŽž8¼è
-ºMRQ²Ū˜5wœ,p7CÛ3ÉÀ¦¦’ì¤FתÌ!áNÎTµHhSóÀ¦·nUf!…n“Ê,E5IKù®U™K×P™:ØmÅ-/ê.‘y²ƒ¨´&šŒ¥R±ý”0zµ:¿Pkqw-WYÌRƒ—Vò¼FzK^Z¥Á¼Aeë‰[PËl?-9žßعZ>‹¯—k¦´'J@ÛkR_7ÑÁž-w+yãÑdo± ‡¢‘rÕËE­<gËd¢bRƵì–n²n)¯õÙr›šåxMŒì4 mZ®¸Ìx±fRKc®¸(]?wI1±^ÖZªwMaj]“‘/kI
-Ó®Õ›î²Î1Y¬š—¯‹,©ço®²£z|™Zû¥ÁàÎmɨý4<s˜ml-¬¡žEeÙò#™ZŠ±
-ZÊs  )ÿr³’§;nÊdž¤¹êKkµvj[ ¼(Ê©ç¹Ê lVÒ¸ÉúE–÷›•æ:…7C¢®qj•™kVEg8]›ÓXâVé cMcyŠO2n¹ìcMëé´„±º}šÑXC¸pw(1Öf`ÑÀÂyH²Ä
-°h  žá°õ(À¢1€¤µn;
-0¶Ur$̤lkQ€Ec
-ÿ¤(_³ŠlÝ)ÊÇ1#ù JçEùJƒ)\a׋ò5ÖGþEù²ë#w³(_¡ú•åÓµ
-8(7sPEÍBƒ³«úužj½¹¡
-Öõ+”ªãº~ÚÔº*«®_k~JíÖõ˯ê×Vn¨”º~ùZ¡tI¼õº~é›/77TuýšïänÔõË÷ 5WÖõkÉÕ%…nnU¿Ò`K
-Ý̺~ùSKè.Ú®ëHCU¿6*€¤ÖõËŸPš‡j;uýRÃó²šGLáHÙÔ\ÐmÔõËÏüÚÄ;¬ë—{ÑUéëB]¿|µpK¨rêú勺©^ÐmÔõK “ŒŽ^gõøºóÞR]¿üVPÏߺ~ù•Ráv: |OF¤¶[×/…ÕÔªúéÕŒêú%Ž¡¯êËÙÕrxŠÖõk÷Ú•º~ùUýÂÜa]¿|‡k-"µ£º~QüVÚ^Lä¹j»®_>‰ƒíB]¿œ³öv'ºTo,¿•Âõøš”“+\¯£º~a+©Ç§ÕhŽ†º~9qM½mo[­ë—ÏÉcƃnÔõ˺Ã-‰íÅo`ç•%±Ù1lV×/ßÞ÷"h¿®_ÛIi±Ýz|­9id×ãëÂñ «úu^¯HS³ì ¾­•âKF¤vV×/¦Øn¨êÇC×õ C¥òêŠv\×/ŸÍÉØc-×õ˯ê×qÖ&YׯC]_Áº~â^»P×/¿ª_ËõøÚŠÂMPËƺ~íÃkUý´^:ªëרJÖ«úee9kµ®_¾{Wâk»®_¾£SB§Ôv]¿”uѪúåç…+^ׯ}½ec­Ç<eÈ•Ôõ‹WZU¿¶½uýrw„V¤³º~ùŒ!K¯×õˈ•7rÇuýâ“LVõkàÇ
-g²Š×õËf‚˜‡i’ɪ`]¿B<LÇuýô•l4àäD×fœÏôº~ù—Cng×bùÞ¯¤\Çy<Ú·ýtd^©ßœQ1qW4[µ›ïxŸ[Œí&µÇ"ëÍì̳Ϻ)ÙÕHì†,?Eˆ1*ßnÝŸ_c’hý c߬·ß½p­¬÷ŽŸ|0*‡w?„ñT½›³kecä±·r}òl‹×ßëµÙûÁöþØÈäÃèðâË¢±úëëBÿËÇ¢Û{zy#àÓÅü ãYÚüö²ã¼Ü”=§l_û›µÃòFùµ×©¯Ø‹;wûs7»›î÷ß{·_—ƒ‘ÛŸßFí¥¿}{;wS÷Ó‡O·s#/çÞËàëü£ûµ÷û×¹á1²âþ<Y[ýøÝb?ÞNɳO±³û{»½åñ³ù^ë×ËÁø´ž7j‹‹Fíçõº±âí¼¾^#¯oþ÷µ·þ3÷ê͹:Ù
-#-÷Æg*“ßË¢ô©°·¿•×·Ó',6ôslu# ‰Å—~9®Ÿ ×ÛÏ(P‡% ±žäÇ…98¶0__OC!¦û>„ë"z3çJ#—÷[ýÇ{³¯•Úeÿúè¿¿é½ÁHÒuÚû1ñlEµÍGŠIì]¨íí ·7$ïo=ÅYöçÄñ©mUµ ¹HߪM ÈZfÝÁêGipé¸v{H4«?Vvݯ՛¾ùÊûôú|åíæK-è¿ÛZþ>/Î
-oö”öâ~ãÅ[4´ÍJÿÛôøþ—Wwvßþºàý¸ÁS·hïöÒVAŒXáÂ_ˆéé‹ÚùèɆ5úqs§¦þ}"Z0kiu÷ô÷2£héxÍÄ‹|ÀZºþæÈO÷û–üôqr&yKkyôò\~²~9Ø„ÃMœÏc‹ÇeŒ×x²Îïë¿}þ±#Û¾= wÛ±¥æâËÍ_ú0vl‡§òJ›ËÅ÷Þ*Þ4_ÐMagñ¾üklaëúg}ic­w7"$¡1§*†4CdI\ƒk·j<?*4 1díÛ4Z1ôåÄ‘Ÿ–.ÿ„Ï ùÜÁÃBr4ߪ{?jK÷}× ;{§Ã¥Áå«ÉùïåϦ–’C¯Oé¦ï¸äK·ëØÚGïÄᅦ½g˽›ßKƒ½£_Gz'+Ãp#LmáݼÚ;1:·×;úç~¶wòqû´wüºàu46;Ī&G3G#4Ssùta)Ö˜:Ç»ÏJ W¹|™TDщˆbHdžѳô J˜}nu”.ê)è+ü9z*35žïýAkŠŒïÅe[?>¦×Ыóð½ÌKög®.diÄÀ—åõ4‡ û¾nð±ÿàûЋ÷Ú@A‰Dñʯ‘O¢Ô@7qd#Ö·«»Åû¾Çš9qæ…{Hæ¬w°Z½¸[¸NŸ%U]™ų½Iüì;Ÿ÷¹¹²?â3ŸìˆàávÏI¦›LfŸ§*’dʶo¡û›7hvÇ Gx&æö{?âœ`5’Þè~¼Ø7êªAyÙp6¾ê,Ûò™„içY»íX
-‡úÂ&©¯ÿÁ]û›K°Þ÷‘·°‰­†&챕²½ºð`Ü >.½¾Î<霕͞žTˆ°F‚#1¯Ì‡ .,©&®‡šX¬lF ˜µÃ3ä˜#åÚçÔËæcåÏìþ2q3¸Ñfi§+ØÁ‹‚½Vþ|{ˆm¹‹s¶G1óEЕvÆóR;ïU™8‚~YVû~ÿ«."PA`œÐÇÅ ÞgªÀöü÷±K8‹ã5®#ÃlÌIº>Î@k ¼ow’)µ>̈¥ZÞÈÕ÷áhŽâ):F#Œö>U–™ |]<:QüŸó»48r5°s
-GÅ^IÖµ–Å g:¬_Û!
-Žu$*‹Sé;@p°ÀÛŠñX•ñ …»!Gs—¬5•‚¹©»GBåîK”•žŒXdîTr´$ y(˜yW{ÿ£—P
-T¨L6›ÆåôרqroúzÏUm|y£ÈG%Š&5ðÖ·²º8¦¹;y/1Œ­,¾ŒÊ'kÍñ”„8rŸ_žw¸Ç€AélÕírfÑËmâlÞèt ÿél£ù ÐËm¢>>Ñtƒè 4lÒ3¯í±vVÃœø5S)ЀÔ]¤6oóãš7`øÆ£[¬­i
-`ÐåÝ¿ù2(çr÷๋¾ð¿Üžþ¬þvkßïý~_£‡|ö‡Oª k“´E)G@`îËÚy¹–›åýÌ0WÌy4š]šêÓMd±½¦[`í†Ñ8ïµ±ÑÙ/ÞÁdßfíbs0=£h¶4Çeú
-Ò™d^ö­ÒR
-©ÛT â\ZP ¶©ÄuiA5ئb°Ôšj°MÅ`xö‹©ÛT â\ZP rt`Ë~þ*•Ï¿õó§¢ ÓkÿØÏŸÜâ„ëøù£¶gÄ-‡Ò ¹òËFŒ}-KÜÀ¼Òÿ­|3˜>iDqeßR–­·ÿ=[úÄqÍ4Ï—otÛ_ip »·ïÏø€s¾xûëÏcýò¿n_KfÿgÀø× zLËï±¾8­_•FèÙs´§Ø9¯,¼¾/ý¹~ÿóôxùú_=S:ܬï¯-õLõð³çðì—žqOÃO£hp<7{*‹OO÷øËní{ endstream endobj 81 0 obj <</Length 21857>>stream
-Ïò>?½¾÷pó{O=ÕÝÝæÏüyûsu{f~^2zàÿ‡ÿ«ôAÿ}Àì–
-´jYe@ª¶,»XØ9¼8¦E;eŸÐ 0°,·ì
-z((C+ñdS
-÷|@êìá3ìDØêøüDW_õñ~mXHAž^QÀaÊKŽî»I×­í˜êâC 8´ßr¦‡”
-ŠPaa0% 3¢¨e1Zì´M‹?Òè±éƒ¤âX(×£ EìK ’ìPª !-JZðâÒŠ`(áY(dI¡…^M¡„ç ¼…ƒ°q¦qX™ÙÒÑ Ä§uz 24¯ÿEúf‚ÈÑ¿ÐHŒ¶ã`6 YDá‹o‚LŸóßj £²†@@Æ:¶ÜãbÁÍÀoÛ„ÉÀýA‰á
- 7‡²­—8QþÿˆÜþ.}/=¦_5š¨‘ l‡æ%©úM_£>©)©oƒÊCë¦ ˆä !0PPÿ5]Ĺä7`2o‹2@~BMiËÈtÙµ É|
-0“ŠÂ]"*]MáX•+¦˜dÒXب±ˆi5È^”Ô}(}iQî…h4ºØ)†‚Ô/ÁþdÌ>³ô‹et¦_,°Ý$JpØ- ;°…‰ ÃöɈàû@–ÐH’—M h‡
-N)e}´!_c£&¬\o!½¹–è¬È …]¡³"ƒE*ŽxG€0ˆØ5 ÃAB 2šM<¶aû üT•–BÀ¿Ba 5ˆOÈà©¢:U½`†ÂÒ³‹a1éµÝÀ“³©ÛPȬŠ ô˜
-ÙU gŠ†Ža:°`ù‰ñ%¯3i”"îØE2€ø¶E5䯆D;é¯f+5Wù«™Ê_Í‘þjf üÕ‚È_Ív¤¿š¼`Wâí3iã¥à™
-显Ԙøás ½Jƒî%‰üTMá;!ãDÞ ŸwBAÒ”¯]hnÛ7¤ÿ#JtG¾F\žh_@Šé½l#½3Ò7
-Ð|ôM u(f“‡j}<MI—Ò€l7•G_zÚÜ(A’>Å
-d­a§¹$hÓgRiNO#ú«)Kҽɸq>éÍ'½)HoÚU[2xþ²éæ‘1%¢9žá’Û² ²$ÙCP¡N:¦#,ƒ~R†›EâÒ  ƒãN!5“¶ËŠ¯†æ [¡ƒŒ²
-2®GúG%Á µ}^$¬N0 *‚Çw$ˆG4š£ÑËÄÆ0
-T«¹È!ù$/á´ÐZÃvc ¹.Y’%ShOyHgYZP¥
-òš÷áÀkOÁMÃă԰i›G éŠÜ£c¸Oz ºSOy¡÷½ƒN ¾±Ñra0a a¨0RzcVq˜DûM“ú#sK¹¦aÚÄu†O†$[¨ÐŽ£C|ö÷‡÷t˜oñFP¶€FW)¿G>9jYª)KgÀ3“] 'ÄJ?0ÌÃÕ@çtÀ5s\Ë!‚FÑŒ8)Ã$r/!8)¸<OÈ.:‘ßÆû!Ä3h ²»jÊZ#UŸÂû'©ÊöŠ„-ˆ2Fðð.4}â?"˜ÅÅáðeÔz£¡› è’S,äÿ4V2peð‡ºífz^æÉøq£ÙÑš
-§,$O ˆaÝ
-[P.ÁtÄá üë’³XÝH“#Ó_HÜ`"iX1h:’ EO¹?ŒÄÔ6B< ‚ɫö!,´K`[À¥ð\ÔJ Ä`±ä;‡G@Ì™‚à$O£=e*j'P›áê ›®O¯… ‡ÉB|ÇaJMù#håÜ€y"ß7ÔÀ) 6Ë£§|©á„eЛJƒ6ò`! 5Á¶E“³±ÅP*ýÅU°=ÓÓž‚•òí Ø£&ÜxÂ
-.W–LL>ؘBŠ5õnä@WÂìÀ6ã0­ø.¥ªäKßu"­¿@§3”¹4Ó
-¤K -aF`1ÌCâˆ[NÄŠQÿ‹§ 8nåô>e£XmJåªâ4ˆ6_ÃnÑ}] 9Â4ìGÓ•ßy¶¨zžl?@v£yù>Ó8{ª¦¬m=V”t?ÍŸÄ$ÏÒÙ±[‹åHÃÝç6Çú†0¥­³PK§ñs9FèÎ×% O§kÚS¶Ì•ž¹1D Ìꊆ9<œ¤Ý ÍÚA|;f¤$Ó«èO…Shz'WM™phmDm–c1T„0¥ƒDˆo¬¥Œ£¥£•Ä„ 8:§ìÏÔŸr%=±8`P½ñœä²#GÔ ñ™Ðaž"†äš©q£øT4ÕRÃäª)nÓù´>|§<N§c „ `Ç–þ>ùf!ŒÓ+X`ë£}vÊž(@À!’EØl’x¤ÆF×a¼uUœëë&T ,˜aó†Gž X­®Û*ÑÏr¬8ÌdNãä‰U—Ó"Ìd©;‹Þu”§C $,‘õwÓ`q4ÅÑÙ#ò©ûþ<뙺oÏä›{’txJ=äClWAêq©‚+0ýL˜|Ys'HƒP¼ƒÔR@ê½ÂMÝ6SÜÏVɽå”æ© „ÓtX¿A¶FN /<è£tÎ
-ŸóT¾¸˜6WóÐ¥‚¤Wh†> 1ˆcÂú„Ôr
-¨Ë}³Ç! õ4Ôe
-'à-zÝ—KhÚ¾­^wiû 2 éO¶ÃMèÑÅÐ<ßöC mP ŒC“=¶è¾Ë rl¤²Ÿ…#@˜çKÇ@Œi¤T3urú"dRI)¹6àØÙ„,"ÈEÔôTŠ %cÑ=ôH²%ª* Èò)ÁÆ-¢>ƒl "Û?·g‘½›‘e®=LAáXrwÛa' ^¼Á y\H«´Tœ‰^·m”ÃS½Î»–ÂvDù7h‡€Ôk†@zÙF9 F ÄÃ=çSÆûÆ­^MÛÿ-:7?sJ2ÿ´†TòÊyȺrléxh¹‚ýù¾
-ȉ‰ã¬¡îN‡/'Ì%i yUºò9:X:áDt}Ò`, 4ÑíÉ%†sú,zÐTÃö„¬×x{6‚Š“ú<|Ÿ‡¯ãzR™›¨’R)‡0ó¸¶Í!ÃdYŸAO¦{# )û¥cK•M][ž_òÞHÝ¿¬-…i¸áàS&Fø@U-‘‘‚{™þe~ѧ²•a>Ntü¸ÛC\—ÒnÇ_Äj&2YÖ¤G°-^·×çb¡>‘¥²«D#)·ßÿˆT÷²¸Ô'1ý$¦ÿÝêKuB›ÓKLaš
-k‘À€Þõde% ãíÑÍ;exÿ°ÖÜJ–xá‰R‚ì.à¡>¥É@)# ¦°D±ðŠØð)`“XÛHŸáÆBy}Ò1‰o=ªý×rŸ‹û4}ŒÇ3=FžâäÿúÌ%§>‰ó'qþïVr*Ÿ:gUúÿg—ŸjAŠIsHq34-©¹JfŠNê_¡âš©²t*¼áb†À±ú×djT0û˜’k Š²mbVü``ìHòM$þBÆe‚ØzR"ý-÷·X¬?TµR -£áøÿ3j j5¨2OÚ·2Tí3l-W¢jÖU;ŨZjóßÔ£j40<4D«3ÍÀ`…CLŠmD &Œ&Z(Ø8¦GRLÁÆFâPVÚluìŠYÏÐ6¨ã@Mõ˜¢ L(2«*OÒ{81µGªr$¡DQšÆ(æÜ0BãNªÅ' ,^¤ê“›ûäæ:®Sձ޲˥ªèH¡ ÕS¬c)•¦ãÚŽ< T¹‚Mð¦š`Óí²±6[,XÕöÅY°fUç‹ÐŲUl}wuëûƒ´¾»¹Öw×—@3óRì Ü¢r (<À”`cÑæŸÉmÇÙX_-½KEɘ5¶Ó\ GÌr-ˆ&ÇÞ3n¥ˆÕ'þ¤Ã×±úoF‡S ¯’C#"`w”ƒ‹ÇñBäßäF¾ÓSÒ–ÛR=«K†E6Cõÿ¨ªU#A|ÈÐ
-†‹"ÈpEH<!Ÿ#M+H Œ­¨¬G”!Èá¼8<>ÖVÀm¥
-’
-,^듾|Ò—Žë`ýsú‚¬¢éYš2ïAYb‡3j;^¨áóSTNš*ÐiTº¨T¬] ‰¯&{9›œqGMÑ@RÝòPâ Iwt!fôeË ¢<hH²œ<;J',Ó–X .’1íÊç(ü2eEªiËÔJ}¬ORôIŠ:.‘Õ>)*X%«E»Í?*”e"qH4ºãXPÂ÷=³‡@hˆ!Qˆ2Hˆƒ;
-,¨ò fP—w™!Ò0¸çÇžƒîY·‹ Ã1lI¹ai4 ( ~Qk]G(y۾ŽÚÄ+\*¶ FÏ9ÊBéجȧé4ì
-\ŸÔì“š5)Â…žÔɃŽTÎ=Ä€ ›â5Š rÂcݼg q¯Æ¥
-àY8*FãR…¡ÔxŠC` 0…Ó
-äG-€r¸Ž:bÒ:Çà¡Àa 7 ˆÜIÀ®Wþ¶*G" Ù\¾áMÎ3¥?!@°$‚Ç—ÍSÝ?Æ3ÿf† õò969·8ˆŠÉW¨M,ZòT Ú­Tèú¤>ŸÔçß鲄«´ïÀš¶M%2¦í5%3ebˆ$Nì"ù+à‡„Ï7~Á£ˆ[ÝúS¬½Díã1ˆƒ d©ðÍ¢­‡AÒ¸éqÞol^Ú?a4†ÏçØ'ËöuîE  gH)Œø„:M–«5 àjd8MJ1¥“¿Ð¯S'“ÀDZ%|ÎV¥QDgA\F²î¢ˆIs£çŒÎ#§,ÎC$ldE&Œ–¤aÂÁ*Ò8JY‚ç¦åÆØJ_Q?e_ ÄÕ2øÍèP¶x„¨¹:œ™ú´LɨÊÊ´˜COjA\vuEó‹td\C€Ïõh¯K!öÈ×MÑÅÒ¯«Œ# ÊÎ:K-°´ïÆžse:HbЩè¸pÙÜÍš ¼ìªiû»ž,^Åë“"RälŠŒq5&»ü¡ƒ‡ÁYÀ#òs.ñs˜PÊôÝL dfê±×SòˆÅ€(á’Þã|<E“•­F_[s¡ò¨#»ãY‰ç”Æà”ê”DHڒѧÆd’†Å"\yh‰~Ö è¸:ܨ?%Hªc,&ˆÄy·ÑvmÆDh[È a"’Ï;:áP¬ÐúTÆ@rh[²
-¬ÁœfÑ@§4Ë0cϹ2(š,¾£CÃÄÒª\'BÝ2ÅñaŽHñ‹ò) ¤’Üõ)ÙWH"a=´¹x MËQžwÌŠa…aÚqŽ º•sˆžfš‰eÈÿaÑ™ ”Ç·X_O{„46Éz€„_‘#²‚ÑÌjC¬ÑР6Ä$nÂ=§íÁ<¿r¸˜d5mO…º?ƒ³LÉ“SṬoÄQ’ÂuR»tˆÆ7†@ܨ8y¾JF‚WýäZï3| }3Of CŸ
-[hß$ÜȤjÄ£” ð9™K29”jVÉ^ùUÄÐF~S™“¤]–:u"V—ïœmÇŸ‹¦ kœi5mú-û$_ŸäëßÖ#ŽŠ¦ÑöàÙ䴆̒°- X' 'Óf»¡Ay]}eCõáÁôu6dȗàä©Rb–Å…@Q6 å’fz¬&„'ƒ„•ZTá0êÛƒ9zjØj‚¾
--Ö€Úë¤HwDÌÌ ñz*0Ž´`ñ‚cŸçÿóüç¨é]d}åLòñìbMP%j°ÊPú:½.íTé@íuu<Y@ŒÇ´ÕëF¨ñI†¯·Tˆ¬í8aÌF# °rŠs(S`lÞpõ®¼ú-AÕÈ8}¾áÆŸôŒ´ïÚlƒ²'3V¤ÑŽ‚|@ò•‹0¦7LõÏ”áªü¦«\åXÊŠXÊŠƒP]ȯR‡øð|å@J7kõzPRÓ Ã¤,Φ©ÉÒÏ<“/Ÿ~ätMù¦£c*\–
-5!ÌÆím«¶(YÓ$ú (ØX)Ž$ÃmÙ°y¯ 2È"£þjo¬tñ6F¸“YKE‹Â‰ñé7©`0OÙ„ !ç<•Î¾1ˆÈ "‚‰0»íƒaòD¢&Íö0à½âBÅÓlÏ–iE¶€‹¦:”f§(IÀ¨&—Œ‚R†O‘J Õi
-ÛU°·lOHñ›7šçrØÿ†vEt“Å:l èScЪË+îR,wVÎÕ ÆZ(Ø=Œ
-¨Â$CŽiE0;l¥G;Ò”`•}Ϧ—"1˜|ÑQÃ4s„Q$\_œ¬ú~@x¶'ˆ`u †bÅÌG0Œ.Àì…89JÎnŒäæ©6î§ðPÃä¬6 W|€»wš}Åé°êÉö™•9¢9³_½´!ì0eËDð”-½4°À¦†C<Ðz㧤PؽCØRÄh ý  ‹#ð±%¼xw"ƒe;˜ýÛ¢-„ý舜v£A<fŽ’&§ÄF$¤ÃŠŸ~«³Ó·'çD  •EØqDEáô™pÇÚÒ†!\Sz
-h$¬‹¼F Ø´€Z®þÎÏÈ›¸,–É^‚È®÷`œ­ `ãgbÙÀÀäÐc–N‡CŠ‹¢„ûFG!„#00ZkÅ`oùBÛÇPÑÕó©¢m0Á‘³£Þÿ˜½!ì+® 8uÍéO‘î—ZBÇDÂ…u##mâ],L$¯r°)èÛ¶ù’B%*"Ø@B°¿@^´áS0èSCä,+E‰±;ߦ$„¹H^1Í.¢ ¾DÛáòÑ!.›ê¯K1¥hŒA|Ànr m$ß'[føÅ‘»6ÊE”ÛÒÇu@'YÜP
-rM87Ñ>z
-7®U⨼5’Ç?¤ÖáZS<S`a@c¾´°\b×öMÙÁµ§ Œ‚k
-§Í[Ú 8q2/» ]]ñŠÄÝBYóÑ'ofÜdžÄ$Œw¥oÆ÷\‡¶0Çu:²ì
- Ë’¾|“ÊÛWGrVí!„ÚqŽq'†ˆÎ#@Âů$Nð$bÜK„5L*bѸ>–}weé¼è]=ÁL¼Ë'—,çS4_•) å«Â䫘§
-†" ySCåÔ 1ð5C”Æ28ˆm ‡û .Ò_àÔ\b,1–‡j^D MGÁƒ†8qBNÕ¹V( +‚aaXw¯)‚MSòá›&:«ùZã! âþ‹ozaC ’!j²ù”â))I+tÏàˆ)ÕBo´<32 _a¦Ã‰`bàn‘5±¹« Û½ð¹lS½Üœ‘:º|¼¹ýÏLîådv'Ãß`sáI°HËA†]Šä…ýivÕhn9d/§Ž'ÂNÍ [vçvÙ^Ö¼JBW gC Ù[ÔöØé¡$л›S`) @QRbSÜú•t ÏÙ¾ê ¹y!Hº¤bÜ"
-â(ò½R  
-o6g_Ðs¥ˆÍGÏeà•}EëmÃaÞ—¬0I8'y†Ÿ6z—H¦J‰÷y€é ˆ¦Á"QÎà:NÑkíÜ­#“?xÌO#ˆôýèš^µˆ.E9*Ìõ8~gjɼ­„obÙ.?Пóa6LøÐÖˆ¢˜28÷?â\ÒnÒ@è‚ ¯àN Lu‰a
-Þ5¸ü2¡™>mY@Yë1 Ï™3â@“5N¸fE…[§q‹UÓö]Hà'Ú{“ƒü\–¨U@œ!éD¢ãaÂv,=Cu$óS`&TVè±@øa£»ƒŠ¥1… í2ƒÕZ!W --*·|ÎV¥ÉÁÝ6{x+ ;èÚ.ÏØS"ºìq¡ƒpZ<‡ØôI"nÀH*¨s^ÇTëh!0#,špeÚ’÷èFÁY?ð D°@%©Ú¬‚ø(+÷†¡Õ*|“œŽ\:²2%!ƒ9Á<JÔ¨I¤”àœ#‡¨VL_—â@3 N=©$æÄ°øÔ>ÑTÙ³Ò~àìkÌùz”×`ʬjËäž|ÎÃ&R•Ð$èš^õ=‘xLEךÌé Æþ"ˆ“Ò ´
-j’ó
-ívÊQ-l™bƒ
-å#ÌcO26l€á7¢ÒGÔ»\pÚBÏ¥ÑÊüôèë†n8'•ïP‚xýD¢ž#3Ê9MÉã5ð× ›ªôØ0HkjØ:s÷Ú»Ö¹näú ú?ì;Ö}?ö›·×Θ} pŒAàŒ[ IÈ‘1’µv>ä·‡çÔóvÏhFÉV "÷^²HÉ*²hµmV¢ºcYë¢X§6ULw )¯E0u;Æ7“[cyTžrÂÞ¢æ'çÌ”¾a¹ÂÛJ #4’›- ÔW2 Äh¾‚e°›d£p ˆM;% 0$®bB. Ö]„ó†7Ãhê "îµ0ÎÑ–á¾Ä3äaç’L!ow<”!“_“ÃD˜Â½âJ “DóF±Êr°2x%%ÈÇ &9XÔ0r”Ôè8(¸~g;ÝpA=aØÔJ4õÝ&ƒxÎë{iÂCé0àfk/ãÉ:¬kñgòr]ÊDзÜFõ,nšFX)ØùÑïwx|ï“€†u#¶$z­ÑŒ¼….ëWˆËa±ÈXAê1lÐŽ—ÈÍPå˜âR¯I`~P f¸”sF1âry’ 8p¥ˆÇ¤Ø¥i¤ZM–‡(M%°Ógžò„6"¸Z•g/nJEkùV.ªÕùX°sÅjÃ:ÞqÖyD³‡XHsOÃQPf †ÂyXJujÍ`8Fu¼ñ¤Óð¬—Ü' ¯g©fÎ#ViôçÕÈÂØM¢¢D¹Z’¹¬¡f…àËÊ4·(ù|PHìÁ«Ê»…«Õ«íÊîìp.ûˆ7ÂÜxêù–å´ïêiS‹{z ´;Ëø ËY<ÞÙƨ’ "öA!ÅÔ B;yé‹rå¦ ¨nýi+"ܺÜTµ£íÛ
-Y඙og2WbŒ‹c€Ó
-î’2•¼E;xNP\i ¢W®°
-TÕ\ƒÌáŒP>mf»‡\Ër™"0’?ؽEúzTçeææÀ§£eTBÐ@ ûPNƒÏ¦fЉ‘k_˜¶Ìœû"€ŠèOS ¥Ý‹b°éíÊÛ> IJ\‚A$ê…!åK˜ªÈoà9A½0öoëɲ'1V4„x”jØP¢ê
-¬Ù$$‚_C#‡ÝÓ`§ÍÑSqÛCÍ’·Œ
-rÁôÐŽôr=•Næí&0pÊ0r`R¯¯;8΂'˜:Š›Eð*LÜh@ç_–ymY9aÒ¥–Ï2 kÅÂ*ÕÔŠ›]jOô¦I̱ó„Ar«qŽÄ§
-eJ
-72`B:·d:1ÆPZS=6ј"»&ðÖí^&o»|­„Õ$ž Ë„£zVzA¿Aµ,&6 ö˜È{ËrÚ'$˜4°QüœRM0XÅ*‰öÙfº+4À´žÇô%Â|òÙÓk$hÌ(š¼7‡ãpÇBõ¬j¡˜Â• ³7Ÿ©í8
-fô~ú—>^y NA@FfT¤=9ìÿ]Ãef†°Ä­ÛeÂð°‹ûä%cƒ¸`iyYc8PNS'~´ŽŠ§V $R©ÖNd¯Émo» ÌèZ2¦{|Ô>èËQÐ`Èn”F)ïµ×t8o·¢Pj"W<à>ç²`°Ù ûå$/@ê©Wð€PsdÇïäæ"J™ë ÞV†ž€<‚Á(£§Y]‘%
-*„¿Q>pãK_å²A±1f …—%œÙðQ%ÁXá+8"ºì4Oªâ5º#+Â÷³žóX/Õâ-„åL–œ+lyT¾Ak“†°ðRtQÕk
-J9¾W¿Vn1 Ñö—„Yƺ¹¹ƒøärê溕¸.Ž
-à0Ä»­(…ð
-cãKÆz^¼N³@³«¾·B‘>s‚ $­o*Õ‹NTäÀ`YËÓsgÉNVw`FAÒ½Î(e]‰šq‘: Vì0n\@¶YuÇÝm¬­A°BšEd¾gÓþY^‘|"ƒ·´ª@ò|;VK‚ pÀÀmRÓRsóÛ¹o©ÚÃ<3Aüï3Fõî1ŒwÙ›UJD¾Nì”—‚ :ߌ£¦Šsl!ÖÑAÌ0 ân
-{$ôˆáb÷ÇdÕ$ƒQ· Žˆìk³$_åwt`lgI"·-d5š<”q¸O“œ¥ØŸðÊdð ­²`
-R`¤ÚŠµ±}<ÖâX%¾”e‘fD#­J*aTä1œ‡©Qƒ¶yP \ Š¥¬;¬¡AâƬ¥€´=͵y<xgªFŽ‚u•Òxt“ôÁÚ
-ï¸åp®CE#Jù̳¸w`0ºFÍú±:
-³ô²Ù@qv ÙÖPyÙŸ
-ítðÚU±Y%çTY†Ø(È °7Õd VxOT‹+,ž}º¾~tÃŒÙD*ØD%t{ꈩ»ˆã†5DOÅÕ
-ÐШÏé„Œ@$‹C˜°Ic/¦r“…*‚ä[´P v’âAË—"C^›Q)©—÷y •úEÑáŸ!Ì+]”à‹ÑNœ Ð(Q•
-ƒ&Œåí<ƒx!o¤Oê‹ÔõØtDXHÝÂ*ŸÂ&a÷`+g: Åo!³p[a$dITV|ßÜA£}ÐÁРác‡vU® 1_¼.¬Áí&ƒ.0eP·¤Ô€í?‰ØÑÁQÎûé•9ÒûrÆzÚñ‘Ë ‘”È`ÂÑfäµ´ÜÈ“Òªy8¡èqï¥íÑî }=C‰Äu4žG$ÈZ$€ž
-×O¡mìjeÒ*ý%AÚIx]Ž@ªÎØe<IÂë0 eåa]zIÄÈÜ>¡áöCí :U+¡,0rF³æÀÄH&x¡Ñ™6Aƒ&Í‘ 4–Š¥}Ô&ïU?OÁûv6•Ð.o Q®×73ÙlMv–ßš«n»É ’²€ †‚ÉPfãj®ËêH'ˆÌ¢ºéz©r<u¿ª*Clr»É =˨G”·àç˜Óát¢ÖKE—¼ª ©ôœA},\dƒ¿]DHÅÅ7†|–*l¼”¦F¡WWS¯ËÕš¡@|¯qO•¡ÄÂSá0À#m«Û}3xKâ~Ckv{Œ ÓãÚw°GøY$éfÒø÷†-Ę4Ø1 tg&2à
-¬ Ê¢ÿç?´„ÈðÓ¯–³Ð‡•8Q³ÔX+U "]kØ^Œ*«ñÖp!ÆpM²MÁÖr€A†Ë€¢_P3÷s‚
-%xgM(örƒKÓ^›¦§·V·4ɶAòÄ.
- %"®$¬!æüDoÑ5Ä$!»ÍÄ{<Â}Cߣ‰¢p…p!»¢ó>ˆD·¬L!r•h\
-Áb’ Ä°²gݦÝ’PÝj<¯¡'WC†g€G¡zÖˆ ö@hÖØ&ä Ü$·xÚÊ€Ù™¼¡ç1uÎÇI
-$—
-Jðà`w§´X¶M«#Ð"K!mb–5D‹Ýf 2f ZÎýâ£I“÷þy•Æ¾«Ô7Z$Oñ€H² ~Ä7‹ŒpOÙnÑoì´²Àh.˜ê]ÐÉ0h›é5PVŒÆW÷¹š)7±‚@‰.@?SHòr
-mWÔ)(LZ·o@?,~E4‘!Õ2¨¤. ö&š°ÞŽG/Þtûñ?ï4S¾Ûâ*˜l*b­dH–2¨Gó²aR9vR ¾ !•EHTjõ·œ»Ê¿ãyjTž %b»É ’»€Ò­Ô„u~5f\ýïb‰‘öÁXþÈÓÑdLØNf“1'\.0b§ÌØ©~Ÿ¾öµ$±§é,Q”sÖ‰ÚJ è4ymNóaÏ„Å\K tvÅËØÓ™ïŽ|6NP<%°ï’\Y#S™Ûl|ƒ‡ s9Ÿp¯-AÑjºT›ÉP‡•î›ô’VYkþ
- Éu{f´dILd™ y³AÔ˜^.¼­T%‰-qsD³àí#ÉÜûÊ"gvž±NDVqí §ÈÓ”ŽÝñ
-Á8ŠÖèÑäX×kÊxÜÜP r±Hœ©IØyÂ: ØØv>·Zû1 ÷ešbä]¤Y =šÆþ ¬‡wƒó™(„xƒ_1`ß»Ýbf5;J o')+ ;qv´ˆëÈ%c¤8RÚÚŒr cÚ(aÒF. A;úÊìX§‡!BzU’w°ýcè<æ~kÏ@H%¬6ôŠõ½{$ŒbùÁ^+Ööy¤ÚHÈÃR­x˜¦¦ºž¾N1Dmkf{áÀ!žè‹cˆ–†l¸²i䢩»34Ç$ÐŽPN×'hÂnæ(sïz5Ø¥Þ!
-¢â(ïú¾2ûû6µÛÂl Ñ Šß¤R½æ¢Ê_bŸÇ¡^dJɬî“}ÌÛØÄ–wšuJ¾Ì˜&d:ÏØLËä¹Õˆ§’£ B D‹oÈŽ<%qÕ½âj4*4ðŸKˆO]` GO©Ý³zLúö†îÜWî}@$ýw}ç¢9‹H§æ~P3à?Tg2imœ?èù°õ]uPÒŒíw‘ÿ.æ¬a@ƒF´ÈV’ò­A}k”'tüùü
-ï% ÄÈå‡ïw»
-ä}6Õ8š»™•qéÄÐþ¿ùËoýó[¼DëGŸ_•ŠÎh&ªÊ8 ­ÿ{F«úJÿ½º¹"|ò¯û‹åÑoþþâéëçBjùBÁçûÏžkòúÑ“?¼|YÀ‹ëý…@•ÙŸ¾þóù×ûŸ^ÿõTþÊÿ(•hTõ³¨ög³~0t·ÍÌ“"ÓsY3ÚÜ«åÅnï,•üååÓý‘ÚßúÇÒÔO—ËUùóÙ…‡`× óW—û¸ÝÊáÿÉŸXJ K½¹X~Ôb’ÿüÚy«ÌÊõÅA»ç/–§×û+­¾wŸ¤Í;úTß@ì‡îKúà}ûòfýúóåų«O¢C‰šõêû‹Ý?»~ùãÕÓ»yïêåÕm³ù¡»—ÉzPÿž¿¼þŸOgÖ5êÕ×Ëýùe&Š”<¨/»ý²`'ÿêöô;»UÙ™ð1{uHÓƒ:>þgÇ={ó”y.ÿ÷ p¢õ°ýýâúÙþõ'ŠF̃zt¹õêâÙ݇Ö/Ó%§æA}ºX^}ñìé’ó»;ˆ¦ÄõpšoÚÕo¤ùÁû×ÿZÿi÷ôâõÅÙ«=¿x8ÅÝàˆß=èÏÆ')gÑQL¹týÉÁì_ÑOBc¹ESAÈš¥©$-è>ºÊËöW¯^™èvmeÚfüÔ´•D÷Ie9©,'•å¤²üúÈIeù°*ËÔ fáIe9©,'•å¤²œT–÷SYL1¹tU~Šö¯(*¡¼Üö¸ÒMeAãï ²üÌœº·ê+¢µwŸš¾bDŸ”•“²rRVNÊʯ/{œ”•«¬ =ŒÅOÊÊIY9)+'e夬¼Ÿ²b*É¥+)c×û¿¢¢„ÚrÛûJÕ}4e¿ƒ²âŽÕ·›ƒM5ƒ?~b
-‹;ß4–“ÆrÒXN˯/€œ4–«±tÓ<N'失œ4–“ÆrÒXÞSc1½äÒ5•¹«ü_ÑSBw¹íyeî?šÆ‚ÆßAcyzk:6è*퀘tŸ˜®"$Ÿ•“¢rRTNŠÊ¯/wœ•«¨´M=þœxRTNŠÊIQ9)*ÿ˜ŠÊù<¨ëùÅÏûë³³ÍãÇ++éëë‹ËþzóìÕÅ›ý£‹««—¯/^ï(yôìzÿêõËëý£WÏ_þHùÄŠ?~üÅ_¿Üüèf·· endstream endobj 73 0 obj [/ICCBased 76 0 R] endobj 69 0 obj <</Filter/FlateDecode/Length 111>>stream
-H‰» „0ƒû
-O.Ï–pBè„(
-H‰ì—Ñrä¸Cs÷ÿ?úVM×ît"KÐvÇ8¯I&Ñ•¯¯B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!ü^þ™rµ²ÂuÄB#q†ÂHœ!„0g!ŒÄB#q†ÂHœ!„0g!ŒÄB#q†ÂHœ!„0g!ŒÄB#q†ÂHœ!„0g!ŒÄB#q†ÂHœ!„0g!ŒÄB#q†ÂHœ!„0g!ŒÄB#q†xàq†ž~ãq†žsåq†žwçq†yèq†ž
-… Þö›¼¿¼éÒ¡ôÍðéV „°ª-]×]qeÈÈË}£´ÀS(…[Õg¢q»Éû³›m=I_M%ý÷
-” V³¡Çò^ › m ›cÿrßdIb?•T¯âH
-òÞØlòþäf{GrgSKÿ­¥‚•,·(,º ÚÆ°9v/÷ V5¶Ã‹d›ÕFÂG¼±ÞäýÁÍŸˆdý[ J«XìPZ t¤…¡sl^îÛ«‹l†—È7+„øÆr“÷×6Û|*’¸œrö·
-”V¯ÖŸ¶è"H CçX¿Ü÷&Él…XjV™ðÆj“÷·6[}2?rò·
-”V®Òžºè(ûÂçX¾Üw&êl„–WlV™ûþÅ&ï/m²ût |;JöÿJPXµìû7äÍ@÷}W˼Ü÷% íƒWnVð—ú‘M—_ ï¼Ì@•cåíÓW]a]
-9ê--À…öAŠ+ôg˜ûþ/õ›m¿Þ­÷®Î@-Îñ§F×}W“koLTÚ+­Ü˜4‘ú
- ïVà9
-R©Ç—ÀèñëgGR*_¸êØ
-Ñu•?CÛì<Ÿ#ëô ѸÃp¼Ìœ©…@\¯FO‡|2g©~éb´s£*öUÒJ…³ó<|lÿìB¡‡ØJ\õšÎZ‹¸^/ŒžõäL*Ü÷Q­ÃŠ¥‚ÙbG¯·«¿ü|HôQŽJ-¼¶µÇr`/Œšñ\ÖŠ‚âÉ ·¶/[QPË–äÞï·=ûø£,Õjµ´<&l…PÓ¥J[‘P½¹ò©á|­U‡¸ÚÓa³öÀòl3åêr°ê¨p\°BM—tn& 囫žMWZ5(Êe‹Rï×[-Ï.ÇA"­ ›ƒÇ5ˆ vB¨é“N%.h(ß\ñÒp²Òª=Y/[–y¿ÜyxwvYÆLjE.‡Ü¥Ý¡¥Q8“¹ ¢~t¥Cƒ¢¹:«*œÞ›9ÚØ&͘J/it±?\±BKM7óÊ]Q¿ºÒ¡aáLe]0[˜x¿ÜxÏ•çê­éoS ÷Ch)è.>,éXd®®pg`4Qe]„|+g`[g’9Šâ9ô6Õx;¸^6ñ–IÎO8»ÂáD•MY1[™x¿Zxrã—©†lŽªxF߮خ…•íxÍY4©œ}fh´¯¥ø\g˜}Öí';`ëÆÎ ·‡+öAH!e÷=çǧœ}fh´­§øFÎÀ6¶LgðBHáT³m¯ùñ)wGŸm«¡KfkãïçkPÙ÷U¶8ƒ\
-§šñ˜Ÿrwì•Áá¾”äSaµqµ3À¥P¢WƒšÄoéùIw§]-»ªP0>![~OoÁb­…ñŽFͳÁ•0šWsbcD)O;[$vU!΀æ‹3XÁ•0šWsbƒD)O;[$V«`ÐÌ–‡ß³;°ß*Ge<®«Ô.Ù.„мÓ¼Qü-=>éò´»Ebµ
-Ílyô=½[ðŒŽÊxG£öaIàBÍ‹-èñI—§-¼¨PtR4[}Ï®À<££2žÃѨ}X¸Bò¢Eº@³3ì'Ôï ‹Uc¸¿3TƒS:Jã96LK
-,„<o°§iy¡Ý^Sô>}œá0§£6žÃÒi˸ªÀBÉó+qš–Úí5EïÓÿ^gP“:Šã9,­öÌ«,„<o°¦iy¡Ý^Sô>}œá0©£8žÃÒjϼŠàBÉóùq†"LRVøžûþ(`RGq<‡¥ÕžyÁ…šçz
-ÐãÓn¯)zŸ>Îp˜ÔQÏaiµg^Ep%„æy‡«Fá·üø´ÛkŠÞ§3&uÇsXZí™W\ £yÞ"„gŸw©Ý^Sô>}œá0©£8žÃÒjϼŠàJ(Íó§1ðëÂô´ÛkŠÞ§3&uÇsXZí™W\ %zÞã´MøyazÚí5EïÓÇŽ
-Úå5E#ÊÖÀedË£ïë_lžÑQOaéÓ=,FLôyVœuí𚢑Ug 3²åÑ÷õ/6Ïh(M¤°ôé–#Æ0m*)̦„vxMÑH8ÃðŒ†ÒD
-KŸîa©0b ã&Râljh‡×
-Ÿí ö}a¶@¯Lˆ·´é•¥f1,ÿ§†ÙUÑî®)ª
-ÌÍ\‘w#L
-¤ÇB‰{ÆóE)±r¼XÚŒ
-o¤ »Ò°,$am¿²ÜÈy9âL‘8z(”°ç<`¨—!b-„ ,!ïÎ"¥ݳ4ä&®È;J§
- Ãae IÃN3¤hAçl}¼ \€¹·ÆóÝdP¸"ï( @¶¢ÇAI{Ê+Æ›&ì”!Dì#å1ƒpfäß›éu{Æìãõ¥ÆíŒ2¤aÁ
-ƒrBöh—lD0âìÓÂ'ª#!MiqsI„hòö§­Ð;̤ °¢ ”=òà*ච:n3B~mü d 9-®.‡VÞî°•zÇi"„o3JˆÙ£oŽ{1vI7üv*« šÓêòXSÁÕíŒZ¹wœfMó5#ðè4ë½gG|­[¤d'½.°X pRËûۅ϶WÚùG¼×1êæ$ ãö»OŸîÜk§•!æ‘BIuhçñFˆtÌÞI2Æíá µN 'V¢ÑeAèÀ³Š_%€šâÐÎ?â1A¨µ/i•Hï¢ù£ÊpRŠŠC;ùˆ7ÄD¡BÔþŒ4" 4n¤,iíßîá €;ù„7FÅ¡BÔþ”-и‘² |À—áûì ¬6¸“OxcT<*DíÏHÃb¸>ëFª‚
-KÛèäzo”ŒB…¨ýà5
-Ö@'8Þ\ö~4°n¾´²N.÷†ÙH TˆÚÿ¤F[è
-%VˆÚOX4™×4©Æ‚y£­—óf)ážôX¹40o‰\'y'3_„„’F+Díg,šÌyü\g‚¼á¾Ëúó‚T‚rUü$Ár\äÎÝ %VˆÚk¥òòÙÆx¦ËG`©ë¶Ø)ì‡Ëur‘7!{'”4Z!jo`9—Ú³ú2Æ u#ÆïW†õͽ(jÚß Tî‚N£tå’÷Ow›ƒßZ?–‚÷“…O€]FkÊV…¼R^Å{¼™(ü þÎÜÞèC±”†²|mã&èÖx-ÖÊPó¯S¤Æ=Ðñb¤¡à)^%H*в;ãÕˆHù1Î36ªÑÊð~8- §ù'ÐÊð†*ë=Ž’5Ž¡•á›VÆ‹™úñoö[vsü
-D6ù(­ ï‹V†÷DXÏr€¢ñ2´2¼)âÒ°÷2Åá¯û=»?~ €Ñ…_§0ô p“4ƒý¢7nw4¾ñ*
-ûBó¼A%TŸôÎòv@‡xùJô€¿ÁDoQ Ü7½w‹¼6&Y«Ý@ÙW?ÒI±¨Ä¿ÜG­ë‘ƶ'š„’üóúB±ç0×x=­ o|˜‰(J?ö'òÏgÄžÂ\æý°g¹´M;@F™‹ªä q×X¡¨<ê20ïçAžåâ>iì :Èl”åÎ üó²gP—y?×xŒ(î“ƳÌDaêÌÀ?ßq{ ~.É8Ñ•ó€2ÀõÒØ‚;Ã%¨Lœøç;–?™e˜èÊÙÊЈÃ{™°ó¦Å#Ÿ‹<~·2„~üÀ¡/|¦Y||â×Ý€ vô¬yeè+I$x*…‰kD—=6áÏ4‹ƒVè|ï¢ gfH‹$ʱ¶¯äa½ò±v1ÑÂàò ”¤Ì ª“Ò
-è˜Ã(J˜V#Ygär¬íKy8o}´cT´2¬N:†²tùg’uH2Çú¾”‡òܧ{FA+CȨC(LÖ·1Ëí+É: ¤NÃÖ¥1Þö:'_ó<ÏU¯¸¾ÌY´2Ä€Œ{¥©®k{†¥#ýÓMB‰.wž§z*C ±Ñ:$Ñä¥R>„u¨t¶g0Â:€Žëœc‘[ÄÉè Û!ô·ÃêÅQÍS=xŒv„ËþøéäðÐtJn|Ÿ+wcÜ—’R‡\û±PØý‡<9þ¾fnžæqŶ6þ×ýA@bS èlv7ÂòÍ
-³mű˜/ú§Acöµt½œéŸ³!³søÝCóŠ·À@!†I ël㬔‰fV۵ÇôBshe(…Ù¶âÀXÌΗ ýSg±;[º^ŽôÏÙYG™2HÃÈ Æ)¢ á‰5f|–D”Ñoa8
-³mű˜/ú§Îb·¶t½音!³Ž:eàKÃH çékª`eÐfÒ<“›ÃiL<šÖ…J˜mk уª ëÞ–®—ýs6dÖ1 ¿Âé&íÀ½
-S|1ž_ŠàCÄQ, @³¸ÐFfÛCôøÊ0¥4Ç7rLÖá*Ãs<\^1p(æðß³ô3¥€2Ls¬¬ÿ—FèÏ“iWS™ÕM60;É¢‡2OÕIÿŒ°ÏQžâda䤘¬£TˆÒ E—Ê þ½š,”a4º³ëK€ÜžwçôDè¯íåå6P˜½d S,r‹a/¾Õ<˜uXÊ4æ œqUËNC ®)ƒ>áãïzñÿ8²׳‡ø£ªðaðˆ°ÿÂZ!|Ö·ÛÀ`¶–è2k!›Q[Ÿ¹·¯˜) +zŠ2È_3Ο@e Iƒ{P÷ÿþëJBÙ–r 7­0nÀÏ°Ù?j`ö–h3sáô¦þ©q»~øQ bv»u(ßKD(Ú`DþŸab¥ÅežXCõÖ⥔áë·Ï£•³¹DŸ™‹Øx-k·òœÇÔúÒÙfke˜Í0eHKƒX âCûþ1l'Ùø+!2ئ¶­>_ÚÐ Ãl/¥Õ…Òžú§Bíd¥2(YØ?-¨uÈBLÊŒ2$µÁkLžb¡z8+üÔù7æÚvQyeè¿&ø0ûK´š½°ÿ·Ö?gj/-À𶆄Y‡>òeNÒàEÕR³P]ÖÃoù|ZQÍPû£¨ÁÙa¢Ùì…ý_§þ93{i) ªÅœ‡i·Ž±Í|6óêÔ¡¤€sžÈq æ!³fYlɳyʿά`QžÙò²\n#³Çì!šñâ§O”Ú¹n?Ën׺_qW‡„YÇ\ˆ>˜rÃ-ÔÀ>ü_­iqW§\ù±‚ñh²âçÑh¼êdáñŠÿj£ZÔh4V¨Ò…V†Fãæ(P…ÿp~H[ 6¨¢ð"´24 - FcF+C£Ñh4F£Ñh4F£Ñh4F£Ñh4F£Ñh4F£Ñh4F£Ñh4F£Ñh4F£Ñh4F£Ñh4Æ_Çÿ
-H‰ì×yTT×p†1²XWbTTÜãÒj¢•c‰µrÔ£Ç%¸¤ˆŠTÒh(AEMl5Ç=`¤:u©KÚ„¢¦=Ö¥¦šj4%ŠVS·¤.ăl3SF@–÷~÷Ý7ó}ßÏßïwïï÷îÜ/77
-$ÈÐâ§ËsJ‡B«ˆî©uÓàæ–Å:¤cbHàÕ-ö@±œT¨u#=¢•Ö½ë\?ö )A2
-åÂcŸÇ´Ôz"'u,¯
-k À0êc›’¹àðíêöZO¥;¯KJœ°É
-ˆ»1Õ õ¤:áo“8
-‘8$4b˜÷@á è­õ°:q–}ù"%Hh¨ÇQ¥ï?Cù
-O­çÕ…·ØÇ°Z¤É
-$Ô™óHù›/í³`­ç~öu(¤ßQ X’jù¨Æ½çðhžÖ£?û¢è×#Z€d€ÿ«Â¥ç´ÝKëéŸy[©woÉ
-»z$–Il›mTa[É _o²/¨eU u6îu\"ÒÔÙd@2è–÷9öõ¼ªÚÖîË,ì½ãUÛ8!ôÊ=›}93Z©¹{h>ssë+jn z•Ì¼š¦¨¼}«]Ìý‹BTÞ$ tj‚u1¯ôQ¿ƒ¸
-V—Z«ß0 ô©û÷¬k™íÓ=¼XÀêáO†¦è(H]òú‚u)ÓŒMÓE·+¬.Þhš&@’A—62n¤5^ÆBî£fþzíóþ¬¬æ´å #ùɨns’ÑGù`™C’ z4žq!-381 Û~®T¸ÀÝÜ S9×h‘Íè$ßÛÙùÀuHjw‡ \Kô~#·˜q©í·¶MöãYÇsc‘ W†× t(‹¾Œ%aõý×ü‡•
-5*ræùK¯eÜÁXb‚Ë£‚³ ú3•¾Š–ñ’Õ> ÏqÄBµ²?Ž1H­gÜM×ßòQd`p’AwÚÜ%o¢5Rª¸kÚ#î\x,ÿu/‰%MÙtõ&eFù º³¾ˆQ¥!{­òrÁá^|KöªžGÈZÛHÅÆy zFßáåìÊ s¥ü\p¸³ÈÄ\Ø÷"YzÉCÁÑA$ƒÎ˜òÈ[¸Yè\â\.8\ g®ÝåY¯äðÀÉ 3 É;xÌ“U~Ãù\pØבµúÐ2ª®°¢ã/$ƒ¾ø? ü›Œ2¿®åB•ï¢X}Í%ë2~UL!‘±É)›Ìæ­¢Fµ‘Wlì:î—‰>0›ÓS’¢Âº”î®Uÿˆ˜·S¶˜í%-˜0ÀKé ø(Ÿ þC¦,Z•šY5ØÆw㧠o«`³ÍQ簨߬JM7›ÓR““¢'öѺ!¶Ôy[F0ªFßv1ÛïÏØb Ue ìè›ø÷Fÿ]ß37€¯ÖwbÊ©âFý•|ºq’Ìp!y~ûãë‚puÏb…ßE“Á÷åµ9w/t/÷ðç”n»Y0½´æÈ‚w7wÝ+Í6ƒ,ÔyÇÒEîÉVªJž[ÃéM<ÏRUÙ
-ÎïElsjd¤ûÍÏ© Z´uýȃç’ÿSÙooþ‰â'lÊ%CH§ä¨üp\'š×Ôˆ òÃÜnû×Ê­ûµêøý»ó?DÎ)Wù|ºµ^ÿ?Áúš©³ï¡×“G ³nÒ½¥±–²£„®uŒ¶û®6 ­çŸzyWã}eR#ÏÙa)õðjñŽJ†ÅŸ—˜ËzxŠG£¢ª×˜†ÏÍ žËäoÿ½¬¦ž\Zï!÷iŸKä¹èæ÷¥\I4{¯=]sEjR96É¢©š®Ù.PåƒjŸ9Åî­,…üwgäaŽÙäjTDMEëÛ “ý”£\"²G*õ°Y¼'E’aàöRžÁþ—кAYõ`rÃå—PÏão‘ÿ½˜©'SëžùÅEžy¿])ù…ÚÄvP­N KFðŒÊï 7¹Õ_¨šÑ<³I&C¬ôô~”èÒÝ?â›ÍºÙ©ï»×Æ·¾Ýþý’ú^›{2 &o¸@aRýßÅÓš ÏÂ;oÁwþÕLýw‘%?cC;áLãoâ'
-‰’#<ÃI$C«½\Ýe ?žL‰\÷»Éb nã·K?®+mÞɸSÎ\öofÕýCût&ƒ!¦˜\û?Cø{TÝf¢É‚vTE„EƬœÎ“»Í§Jx>ÓÙÉpž³»¯‡7Z·ûi9ÃY—
-;cñxKnôÚRZÔ7çd0-“ý7åhÚâ§2üðêP<‡¿I•µ¥Îj&U¡F0Øíÿ¦¾ 'ˆ
-ú›¦3úÜæîÎ2µÁ²‘E2§û½‘û@ÜÜBód®îðEïšêfœ Î;1XqLÍgÃÓ˜ ¡×¹ç|R'秢¦$¢Á“¢`,ÿg´,g|ˆ TŠTJOÇJ†arÚ[\oÕåò&sØÍ}ÞƤ
-ùËWy4¹º¾Ù&ƒáWeN fϪþe<…É0Yö'R•}žü}ª¨Å=ñöl¡DÁ`¹.¹ýÍDl™N¬—‘ ÃÊkoAíšÆäVÛñî«=º¦3Þ›H¤‘"ƒ7¥Å0L[dÐŽèijÅ2míªS¯z´ãLé :t õ˜Ê˜QKªX3íhŒ(SµÚÕ’Ž`0^1!%A"rs“3qƒÜsïþý¾ïÜ{NÖ‘ýoöþíýûnÎ>ß¡šÖõv2݃ »6CÔ–€;é¹=|Í0M~EolµÅ­a‘n-ÁorA~ü¬œ¼yþÂ3ö:æ_ ®G7Ó‹AÓÆ• Ý`TXŽ÷¤~'³›îÁÆÛ6CócA,–×Ûñð5ƒ“"BŠ|P뎳6ÄôˆC2›¹®šœØ<²\R·Ó ·7ËõÉT"ä,‚?B¸Ù c }JxàJ¼;Ñ`1hÚ`‰Ÿ#¹ Ðéì­e×fèLÜM%áòÐ5Ãò¿Hoç‡)òI­Bm)Á_'Þê⊤(a³I_ ¥î^Ø52óÓ…û‘Íà/⇫qe— ,Ç8aÜ— Ü° ÆÚ³úä¹XÉ臭nË/ç‡âŸÊGµ q²üº˜þªh¥¢ÔÄÊ«ödò9½KÄU…ú±Dû  áÛêŽ×‚§;iß >bf¬›¡O0I9J†?dÍNEÊgµ¡ÄËx!¦·üÀy ð~Ï|&8‘øበr¾+ZÐÜfÐ~û”øâÃ`4v’3SQ€eå4CÏà‹¡ì–wžú‹ªw«
-Í -’Ïj q¬"ü€WÏ`—)ü}ŒØ±;ùJ+ÇX6 ³O‰ìLnwnPòœš\Öñ&…¤ 
-œi8$c¶XjÌø±LzVv$”¤cv'ÞÈnÍp:„ºÕzoØZß C­YƪޱŠ4ƒ»±|\ÓqFº†¸ágÉJ&v®•FÉ»P1“gó>vk­/Î9¡¬àky34ʳfo¨zË*Ò ¾kU&ZáDK ™<oÍ•€wØfr^~]$¿ÉûxCÍpÓÙ%rêõ0f‹#Vî€*ÀØêfpî4’° ØûT½§½›!¯H–yÆ)Ÿ×dGØq#r¨\Ïdº‘<’÷¡`5äG³.rÍPðÙÔ~ñeôا”=†»«›&÷n^¦~¤ÓȲäüÒ¹OÎéÂÇÓ$Ä”}Ô¨ÛaÈœO~4–SÎV7ÃX©d¥?üqrŸø˜²'!¼N»A³7\LÕ{Ú³òwÏÚ¥žç:Ùòé «$þ3»Ëç5øFr§ù‡èF¾N
-á¥!“³&2ÍðÃøÞ’¦+ uCzr¨·:49ƒç'”¯Èx«ƒÌÙ~ÆIàlq3<zYËý·ü~ïö3ŽXLÕ‹mØ îíÉÕ}…qÓÏ T‹äóš‹jø
-;r³¨ø3ö:DÍœ‡è!!w9ë!n†Ëãý.m]Ž U÷qòY?ËÐ%œâOþ!k_mï…ï–]׸d³*@nq3,†Ê™Û
-L“ ¹û‰ìG"ƒIÐ:’qˆ©%Qœƒ¨Rà,ú°@WŽ…„ëóܳëËN½sGðÇØù{©´
-ZÛ ›‰v4æû¹ÜåMÕ«lÖ ™MŸˆÏ9é‹òMÅ&˜&QÛÑ‹.ÂbîWˆyrûr‚fHóûú»‡xþžWŽ¤í{Œj/yÀfW}nû¨>¿T"®”–6C{>OÑ«¢½+%ö²w3ñ{è™ÁhWÉ6ašÁˆº”ˆþNjœ$·Aì4HÇðÍp¡)|…zðU+G8ó²[êÃm-xª†r ÞÃsM¦
-XÖ ±ä»æN0¾X<ñºñ@ÕsmÓ _ɺ£&Ü‘Ol¦Ã(ƒ_å²ñØvôIíÂc$g!êJ}§8¸fHóƒiÚGb5ùǪ̀à8/ÒÛÅþàî
-à[Ö £éY ¿>ʡꩶi†·eÝð¿õ]<"Ù4,I:&î?éáGèƒÒ´™Py’Ñó¾
-2[Ó[ÒÍ0OxBŽô&¿«×QÚÓœö´ƒö„ØÂÎ z ø–5ÃÇtŽv,禪zªmš¡oÐnZ¼|dÓ€ÿqc
-Î$Ú!]ì€@>º•Ü YdŒ-¶^LÕ3íÒ ¥Ì]V©äŒ¦ò‘MÃç(Hbî™áÇbÌ-rGÖÂ(‹ w`Ž‚Ìô–t34Ѥ¸´†X=‘_ªàl$´áb„È<r¢èV5Cz±—[l
-?ïs
-ÎÒáR˜„‡äH°­j†È…Ñíz©ê™vi†mÒn½Èä#›†ÿ¢ ß#f1b~‡ž$W¼‡Hõ8¤®Ì.9“Þ’l†Lñ 9~F®‘&¡îI‰óPj“p{)Ðÿe
-`[Õ ‹É2G±š©ê‰vi†EÒnÈ]å#›†\ýlÑ0r*šÙžÜð>àGf¤~
-˜Í S¥·$›a§Ä%k¤H¨;‘ê”Þ$E{N¢Úuj¤ØV5C¹Ø›.6©ê‰ÿg¿Ìƒ«ªï(~BBH Ád)Æâ)ˆLqZ
-:ÈÞ•A–öV˜±ÊUDa˜@UöV[–¥“Z@A‘V6A ²”MÊ"›,!$¼†@î}çüî÷¾—›ùñšóo>¿óýž_Þ;ï^]šAñ(ëP}ê¯\j‚ï£KØ®< yŽ¤ ‹”Wû¡Ÿ
-ÛÈ
- až&€}j†j4Øùðƒý‹yZvN—fh*žG=ò•KM²Üz’ý‘ç:š°XÏ¡sð¾S¼õ»<%m†Qn÷sK7Ùéž‚Ãü‡ YNK²Ö#ÌÓ°OÍЂCO‚BÍ^–.ÍPM>Žzä¥&¸È;
-4¿FVõŒùRRïfØL‘:’Dø¯L›a FÞA%z’yZv®¼"Ôz¸J+@&çAôD<õŽï¿í.0gAs¾FWv)…ºòÎÏî3Œ„6“.PdŠ*¤ÞÍ°„"]$°*^#ž&€}j†×h°×Âö"ó´ìm†­òYÿ×̀Û݈צ²o2òÃí'/]<¼~Fת
-,fö¾KYÙÊ??®ÚBïf˜L‘‰’X?až&€}j†¡4ØGá[À<-;G‡ïD®XÓÅ÷…Í0®²¡ãðÚÇ*E¾E7v'R}«²×»Qdµd
-kG¥è÷}Ž˜ÌðM¯fÀ¿-§ZŸì=>â%â°;‘j¦Ò_ïfhK‘ÜDɨÅÌÓ°OÍP ¦†›«6µ´ì`?Æ•£Ï'N2
-›!)îÒ±›ñÞWëEºyñ VJ½›á>«“dRÅ,fiÚ§fˆÉ¡Á†l
-›ÁØw‰Ðdñ#\¡ñ÷ìJ¤Ú® w3‡)3K2©µ4íS3°Ÿ’ y]•è¯ÔÒ²ƒ´‚ñâaÛ˜ÅëN2›á=¸Ër„&³ß€amÇ?@R ROмè“ð¬üSl×LjiÚ¯f˜E·¸f°¤ËÔÒ²“((“9Î,&8Éhl†çà.9•Ëò_ýq$Lf"Ö¹DõÍ›á7<Ù/%#B•D_&Ê´†ð`= ö<w´ìd+
->!“YŒr¢ÑØ ?ÄË<‹Øt¶úÁäðèÆLåç2BófhÁ“­•Œýê–m3<Ä×€¥îZÏ-;Ù˜‚¤ÃšR‹¾N4›Á8—ù3d?a»¯ ÷±×hÁ^Qä:áòÈ {3ÄÑ Á›Í%3œŠÙÁ/˼_ÍsŽ®‘/¦¿Ki<—³’)ø–tZWjÑщFe3àPY ˆå/o +„7½ÑYj)ÖónC4oc)Ï–)™áÿH—m3Køáû‹"˜å`s¸N:m"õˆÊfè…·éáÏéeÍ «á'Oú4ÆmŠîÍ0X‘.Œ‡†˜¯~&8à[3 ä{äÖò¬ñME0Ë`àåXḵtVŠÊf¨ž·É„p€^VpAEï³.…b¸ÒÐuŒîÍP[ñ‰ßàÚ{!꫺.ð­j+ù½ç\Æ2U0ËóïuKÙ´JW™Av•Í`ün“÷
-/±æ iß £/x}ì^¨¼/œð¯F+6Ù*}ª¿£ÊG•Á,nR2dK¬ÙÔ`QÍЯsÿã¦Ðû*x°àalõÅ
-'±>ŒÒ¾RT¹ÖÛ7ˆ~moËGük†zŠ÷¤àXO¹Œ¹ê`–W¼ø¶Œ«|™žGg3°/N'á7 fÖ–}ö¸ÊgÆ7ª¿–h‹è Fûf0–©B¾)™S¤9ê3ÁÿšÁX«XåF[/Áú©s…4C2G%Ï™ÆP~¾c¥Í0ïó¦Ûó+PÖ‹%#,UºìŒo-zÓØ$*†{ ø;í-yxkð­Ë•™àÍÐ[µË™åÁÚ~ïÌržØGÑëÜç%£Ço&‡ÐQÚ ÉBm0þ½²Bêãúô[+Cýo¾‘nÔS
-•™$ ¨3ÄìWåÌï,Ëiu¹Ý™ NùØ ñ§UËJ•kFÿ E²œGfqv¡ûÀÑüô®P:J›ÁØ‚ZéĽüÒ
-upDUÕ´´Ù¹./ÝÂ^p‚y¯Äóéß ÆpeÔë}dA›¸CY7ƒñªr›CueÁZžs f9ÏüB»VmÅKÙ´P<Z›a0Ù¨5Æ›]UÜy¡²ç?UŸM¶ÑíppÅío|Oõ˜}ä‘èh†ÄSê;/iÁÀwj“[2Á9?›¡¦úgàdsA.£³ë'4Cµ>ãÒHIÛ“ž 壵ªfãÖ¾âÚŠt~ÑÀ9Ž%>ñÊçyî'ÿ[㟶ƒC—Æ%ÈóÝÍ`üÖåVþVÝmR…ñ‚Ë-ófàæ·•;È-—÷† Wh3«ôždÕÄ
-ËGÏW =­Í`Ì!+µ#ü4ÅÅÝ¥¬ó~7¸{»@ Cïo/Ù+ùàƒW-7ò,fÎNø—x÷B3Tqyhï¤Ôl“‹Ám™à¨¯ÍPËíÝ13Õ%yÙuÈ
-9ØO…ï¬Ã'þý2ŠâÊÂøkv\
-r^gøPÓo¾@@ ô>&b† šWxW½^*ó®PŽ*œõÀ™ÏÅÔ¨aºv©âï¸êjdë h4FYæ=£j]ï[%‘ј±¶p¸I<¤ì»X×ê.=VJyìp¡×\ó€¢¾‚"šåJLˆ…LºS‡3 L¼åo˜2 "À!Ÿ è!Ÿn¾ƒUŽA FÆΠ;€WZîšämù+¡w`›þÉë - `Pþ^2ª0gj|;Þ\ý£ú¥dß–.ÒM¨Eçu4(ÊÜŠhÎàÖÀÆÔâ ~7ä̪LÎÕjdì (²DV‰oz
- <Ž;M\&3jN%΀ú(œ]Ö΀ lz©†QH쌔£:ÁØШ¬E`Hÿ)s5JYõ¦g@KŽƒ€,sgÐíaÓLUŒBÂ>²®aÒ”unЙÁûP–ùM0Æu¹âQWrÖQŠjœÁýˆÂ!Jceî ¨å*€QP8®È ?gvøÆWàxªtÖåü+Œ]kªq|Sá%1¨²wÔ­”M;•……×ÒÔ8í ´çÔÎàu*,GøÛÊJÇËJ§mãk/†­©ÇPçb…ƒ” jg@#Ø´S‰QX·áEzÚ@Ý9µ3ˆ¬Ýt‘¨†«ŽÛÂþL;S‘3 xÆ/Wƒ€¦=œÍaÓOF@7\?Ù ›sngЃ*3õ‹ë^6pùk3¶©ÉP¢Iá4Å1HÚÅЗ4ÊÏ=ýc„tãÊhóÌ„{sng@¯ƒ3¹÷ŠX\£åŠfÿË;¬S•3 w)XCæ!胀¢}œA·JiW—šýe…Ç*×µ°V¤7'wô8•+¢Q»‰çýxŽ7ó¾Ôå h˜âŠºýÐ_Aû8Òe(í+·%"pô¾R] ]EZsvg‚?É{‰‡Æ·<QJÓƒìЗʜÅ ³œ² 9¢3 4KQ_ÜψÈÐxå×°•bÆàô΀ÆÁ“Ù.:þ…pDö´Ÿd¼$QPûÙ.ÚR›3 ¨<Ù³¬äArTg@ï>SÐØ.Dè h`±] 3Åûrzg€/¡ümJòŒvÛ"ë|c†¿TÆðnG#åm©ÎP“r&YKm, ÔP—kÄeXßMd΀:ÿJ¬ËóxˆD[Nï è•x<+u’áÍRÏcÎúÙ–~—žÐ|þÉ3aŠ»RŸ3 ]2áÛu«5ÞQ5¶8OGÚâ ù“{-w1Jª+çw”,2 k@¨Ýçà9¬àÑÖ‘M0RµÊµ>}û5¥M©Ðø©S’s¬MÉÄÑë yHÐØù/¢Ié> ý¢Xá%ÙS=pÝn‘m”~Í[½þ*˜£xÿ¼XO¬4‘/BžSÒR©3 ×I²ÐɶåÁì (8[n_¦¥‡“Øj½K®®… o`´Tœ…Ü™Òv¼3ÍÓ¼OÊúÃæªÁ/ïübTŒ;n†è»•¡³qn+0êt~ˆe"‹Q‹'©n¡Žì õ>#§/îÔï*C8Bƒ®ÈÒå)ükÃÖg@ƒÄu¸©¬\ÁízÅ' Nˆ×¿Ñ¦‘¼2⊪ênö–]µ:BáëJÅ–£›^ªèØ΀\†^Äî«`¤K•HE΀ܒr±uyîýðú©΀2Äfu%Ü>E¼oª®{"HA2õ:Ba‹ ÅÖ£‚¿ÇT spgà½aà>¬¾®'U)(sÞ†ÅÒå¹jÀ~›ÕgðøIl\÷Þ²C nËkéæw"O£ÀZùîP´›t,BP°»z¯ÄŸKìáâÌŽ5‚¢!ÙP…pèáHáŠZ@ÏÇ?µä¦D_潃kY©3ðD/»-¡Ëóp]oŸ°‘ÐDä¼HÁæ'# S‚Egš&cbdÐ}2ˆµ¬ã0*|¡p¥»ÆøÕu„¸è—^†7Ú¡daº ]×î‹ÏšEöxîW}=©5éLôGmoÂV^/ìLæile×è‰ëÏ–ÖœIÑÁÅ°¯¼ŽIÈÐôƒE5ûº`q‚ð.Á S·éÀyÿ¸V;ͽ_ ºWiX™ ê \~/†ÚîsLîz†ºjÀíeýŸ“秭ÉÊú&íó”a=Cêº Z´è6|ÒÜ´¯³²Ö¤Í1 íÚ~’š3XiÐ.nì”ùi™YY™i ¦ŽïÛ¡1aõ†EâÖ`^Èì²Õö”ˆîá@V²*®3hÈE·Eܸ ݘ躥”ˆÊþÅDVC5샶Æøº®¬žàuDÂÌé>ôU»þ,¡Ê£/ªÁÈ
-GÃZQ³'Q¾t(ß1Ê…kH¡[„k ÷pû¸0Ì´î¯v
-?ñ®L{¤BŽ¥Ð,ÉÇ¢ØWâP܃ִ#QºŸ t[)×­!Í„2ü#Ìqy’:¸‰' xkæžb99/µ¶O§ŠÀt†½o²/Å‘8
--êH’l%Pº´ צ×m9ǘ§ôì·©ƒ;û×Jä¦3ÿ‡|™Ù¸~
-Œ®M+…9kç ¸ÚÂŽÍzhU3H²u7I2íÂ50_”GWý¸auZÚì…iéYßï9w«”$‹i¦Niý´9æÂ3`SöXWë/<gØÈ™þÔ}ÝöÔ´’M…Öõß$Ù¦ƒÛ$žVÁrðÈ 9ÓT(ŒU^>;g˜eI•mµ.,ghùœã–QQfG¢‰oä¸7¥l}À• !ÈvÌæð~ë¬ ¾§ì€“²¿%…â™9Cë2k®~–ßXΰ„æacÒÌð~`íi2¥tàÒ~"?Y(˜¬È…R½r ÙK~¼‰y–BeÁ™9C¢-×"Ëogð)²<4‰†43ºØzÚF+_.´¸gåçš î”Ò*WC6ºäÒNʹtJgæ ƒl¹fY~ã8CŠõñ\l»só³ ST#îV!ë϶¶ž6ÒJý ¸¼z¹©\þ æZH«\ "pBJçzR*Üæ ý¢«ÒŠFbßÿY›:Z~c8ƒÛu[gpóë­û)ª‹«õ§î‚õ÷h¥.ðA¹©Þ7K<­r5HРè¬ËâЫÔê¶9ÃËÔòU÷ˆãÊ>²þÄp†Ü^Üôuá ¨ý-þgµÔ-à%î//“î(˜©Ì—Z½"Lz`åm{h©àÊ<÷ÇR¼C³sÔü½¤Û/ g8]Þ]{Ììuâ ¨qâ‡1sŸùײ ·Ë>ŠõÂl²‰…ÚELut;¡ìÈcñ<=€fÍ ¡igè]Ñ_&fκqÊ|
-¯óZ9y¼óàDŸ°)½ÿ±jݵ‹–
-Ѹ©èÔcðö«<¬ªãŠÏYDTDK]ž¢‚[7ܵ(¦ú©‰J1¨qbõÓOÓCMÕhUêB4.‰uMó´iC·wQÜ ®ø@„(<nïœ3÷¾¹wï»ÈRðËùã½ó;gΙ3sg~3³¿KÍ–\O˜!]`iK}9Ÿ fè¢ñ¥c«g•zšŠ¶µSºRÜÍÐٿ뢯†)® ùÕÙ÷öäð€š.¸~0CT‘ ¿ õå|.˜Aã9!<Ð%ZcÉÔÍc¢/v¶¬N:k â>ï~5¶¾¦d…×|¹õƒ6ÑåFxå9ëÊù|0ÛŸû§:“ôx¤‘e|-U®”iØÙØ:é¬ÁŠGüõêì59Ø¿6ŠÕà .<hl»›V{ÌÐú m°›L¬ÂZVa'm™è‡k%‹}fp×ð52hEÏÇ_¼|Šf¬$Ýîi丣g«+°·€:鬋ÓèãÕ 
-ļ)Â撷DzãEb!çR‡rÛ±5„xße eßÌk·ôB¹Pza¹¿¢
-CÄ–«fáéÉdqx
-ú_ anx(1{nš!ÿ`b+ÎI›…Èýùæüôלԇ¾Nó³oÖ"&/™´2,°ŸÀ¶cßš!ëÑ3ã~ëeÝÄwðÄé±#Dõk\¥Ž•ó¸…MˆŸeàm¤â!j]'&Nîç`Õ6à÷ñ³'©tÈ#'ÍŒ‰ò“±CðØ„Ù1}4fµ>Kß4­Ó Šruv³Úª™¡ÈÄKuàQé³›•pÖH Iå ”Là2ô9'•Yœh€t&°¿OÕ,Pí0ƒûê?"j‹!O?ÎÇe‘‹òbf&!è δ˜.Ê\Âî~k¥© "$¾”²x®§ ÃRô“·M…(;2nxTÍ{(;ŸþÍò²`¼í³%ß9õ³ÔϬþÙi¹ƒU#Qæ–kÅ›¼ìÄ[ÉCüÒÅ¿`òNÊÅ\æüéÔýý묻CˆÎèðv =Ç…¢3¤ò®Í]A$¯œ%o
-GáÆ?²éßÑ–ëçÅ´Û,Ã÷`ð_sqÁª ®¾ˆgÜ Í®WŠ6´æÖ”=†SnBËn»æÃoQr‚?<å"÷Î¥¿&pèg†;JÔÚÂ:ÚÅùt3ÃL¾AH•nÑáVã¸×!™k+wU™3ãáh3C[åÍðV¨ä
-ÚÊñC…í!Ë¥
-[º 2^TÅÖ/ñ·õ¶PU)?š2¨QgîŽmLú^fSŒ ø
-Ô=Ž@80¸1i2òˆÔ \º™á0õy"8OAå¨Sa†Y§A=”••%ó:H«ñg°Œ×!„1CÑä&$ø$+°dfbü'¨Ù˜x:r†»÷ȃÒDÚT$ˆýdµV0Ãl³g¨qîµWû·.àbÌp!Ê•¸Î}•êð)ÔZ’\ÝøFo/)¤uߘõgu8™ªªH „2Ã_™‹“ô¸ðe*7h«-Ê^>&oåâõ¶Žæi!c˜ÿÐßÓ>
-†¦š*{U˜AÚñ^hÏÎØÅá€wÜ-í„Hªû²#ü5
-\®SµØê/ }){õÎd‚ë“›-ÞP0— g•uÍü'
-?ˆ@`L Fš†ŒLX¾=ãXîCéE[fº{1{wjrÜàŽu^Žf`«{€…ðX÷5G¸:Þ¶ìÈæ°jL ëd†Np¤î‘ñJÈþ²u1C*è}-I½àä9bi7í
-%â†É½´ƒzûGŸ>³N¡÷¬½!ý,Ï*v˜¡Ü^=y@C^í%.
-6Œ T}Ìà­r^ú3¿fp†%“§%Œí~…æ
-ZNÝNãЈѾH´fl‰>'•|ãP©NÊ6
-x„Ú2Á,Z
-]ƒL[é¸×ï OYÓÉç—¶,ïûKµÔ²׆÷ÉFÚ$ºÊ°Zú2g6¹µJ‰EUð^1à ”J^ÑÜ`FÑ#fêòÕžöQÀ3ÔFq„—z†xûÔ]0Ãï^v·=ÃR.]³ÙËnÊäRšÍ~=ahuÃe%Ê‚eû´œn²ûÿ§ ®8,.X» ×ç\Aß\:ˆ»P¤™4Ô´a¾b:Rhºz±$q¹h½hT_cMèJð{ˆR†ü’ƾIÏþdAÚ ­éyOZ¹éJ¡5ä·ñ%—TÁ+xÅ ÝQzIòêÏ f=aÃq—ï¶x¿0J¦mRz˜Ÿ¡€‹Érà¾8eŸº f (ùÓ‡ ­)U ·7…KÅÕä5±yÞÎ¥20D–'5|frˆÏsšî ÆÄ"Æb`chÆ:Eì{}J09§’&¾Ø¡¤¥Ö.H¬PU
-=‰Lñ>çIº·ŽßYRQ$¬¢‘ZĬé\zv!ó^ÒjˆN⺴ ¶ŽÖ®yçö-ÒÀMA¼ƒWÌ@=û<Ék7˜Qô„z`€Í¶X‡Ö?àŒ÷¹xÖ2ßÖR”ß!.fÉ—sËÃ
-k¤¿œ„ߢ5’”Kð, ÅÝGË8CEw•T(xÅ À{Sv=ÀêT+ŸÌ({ û0T”•^t”ñl.²¬€<qMÊ‚ò›rŒ¡Ú=nØïº f€,.èwÚŠ×qL*Ùuf¨ô€‹_KYÏÂy]¹X&f€¦'Yù`š³èZNϡЂ±
-Av`šû[]èU¿ˆm|Ù˜ª‹VÚ;ÜyÙið4K
-&Æ.
-¥1CL#µù€GÌNÖx˜æ“jFÍfX‹Ó{:Ø_³¼†
-ÕÚ‚.Ò”Óà–кŠ€{{½ñ%øx€w„øèã^±qc·œ†h2Ì×|êR5R7Þ-Jª™šüH¦!Æ»ÂóuƒOÂE!w³2ÛŸxÔ²ŽÖ¶¬b^rØžoízø•ø÷µwj`ëЖ×ßãEíöÈ\³®ú*P(gŒuòrmå1l&}=kú„ÌþfrÏ ñ
-zÒè0àw†pù†<Ö+È7lN¤,D~ÍòP»1-< BÓá¢+Å1uWÌ
-ûÁ‡ÊÊ
-¥€—ÌPï–3¹gê#G8Éê]y‡‹/ÙGÿFÎBä³Xì$u—ÌtÑ1€f<ì0ÿVs*;3@Ðjg‰xŠ£1.k9üF{†kÿXoíé“Ír4rfÄPŒd‹¾R
-<æœuÓm—œ*®” ÛþgH~Ô¤]f£ÀÞ¢a;öhé’¥_.ÿͱ_^C€Éöþ[4J‡øŒô¾âYu<‡—Ì
-V»wÌ
-²¦
-ËvÆ^‘gdb ¾º¥=Û¦÷¤q öÆóŽâܬäç .¥M¦!Ã:RB'ì¥6̼s®xµs5>Ìçσ#¥^±¶IdžûÔ!ç8a_z
-ÎjI–†ï§ý^Ý>‰Ø8waïÑ›;•¢¸
-ž!4Ömø@ME{„Š¿…#|ÎþKæ ©‰A"]v›q1Å6\le·r% ÓœÂÐG©Ý„
-ý>ʼ|ãäžéaúŒ 9?BãÉ;NÞÌ9•:]^Ê&[T‚œ(-’öž7gï™XG£ ½Rµb¤è¾ñË^6ÿœ‘Ò»¢d°ÙoMÇLÝÂØ3U:0Ýâpb¥R…cCëvÑmRÁ:6r:P¥e»ˆ¦’ !m:„["Q¦Z—â]ÅnjÃØΈaÑu ²%°éóm[êzH·(cÉy((<M¨?ù{Ïh!;9¢ÔÁØ}ÍóO埵Kt§dß}ŒK*(<¥h”¸#·dV(<03Òà>¶qçUeñ,+¦Q qI…§¦ÈÄ”Ì<g¤P|jÓÛ]ÊÖ/nâ¤Î嚨;l¢¬›<ÖEžjêw0%yåÖ´´ÿd}›¶{ãÒY‰=Zû?é¬J‡ÓH ¹³MQPPø¥£2µ ûŸt
-
-
-¿$üš˜aÑ“ÎCAAAAAAAAAAAAAAAAAAAAAAAAAAAáÿìÁ!
-ÿÿÿÁ!&dei endstream endobj 82 0 obj [/ICCBased 76 0 R] endobj 67 0 obj <</Filter/FlateDecode/Length 1856>>stream
-H‰\WK®$Ç Ü÷)ê]“dþ·~´à  ![‹ãÐí̬î'< _EåIƒ¬/¿~_~ùHÇ?þùqܾÝÒ1ÒažŽ;þÿÿ÷ÛoÇÿn_>þŽÇ÷#)ýŽõ{|`øg ÿ÷ûíÛaGŸÕÎê©eœž[>_oøz»ûiuâñ^ÎbÇóz?þ¼-˜ÎÚÊñ|Á\2§V>{Õswßèq»÷³`ƒ…ŸÄmŽkv?GÖì<úâ!Z+ì°iÄÚKrNï<°æFXÝ.ø¸mSÖ ]Ky-ˆ;ìÝ.„³û‚ùl]GçÓ8zŽZäÙ!ôãƒSÞÐà¿Î…uÎ êiÙ°é‚û>/HìôyÙ†,¿Ý¥œÞÆÛU`ÝxÍƽzŒæ:Þn²`9­e­´³”qø9-(úÜþsû×E®\¼¹!bõ"‰'ä3†ç™`wêz摳úB1+Ç@(úÑΞ ÏIw
-„°ÍRaXÃt\yœÙ
-VY›­òz^ÚôbÞ É·â+/0Ï¯Ñ Ãah?ü» °qÁ8Àᆠ¤n—a†ð´Žuõl0И [<÷Ïœ“q ð jÏ“:°¤LÀŒ.m ÷É×­2&81Ê°)_ˆÞã5Ú0J
-bcwG îóìò(ò#†z%IèYž9Óí^M"'ÝÚ® ̵óœc^ÿÌcëÑì¶Ìû¬ò ‰}AÇæ–DŽåøO1ú;çFfäL²ö&Jv&«Œ¶ë|©‡Q•€3¥®ŒÊÁ^”sÓ™•Ìl–à;|
-”NeÄÝâ™t*9/t-ŠzDñ£~6ãÊ>q=3ëHûñyûãËœ—¬ ÀWªH‡Þ‘H™áU€‘SÜYÞ¡”d(Å7Ë¿Œç ÑjòÆ8b2ØÉ‘7•B
-à•—«ghµ2)t@ Y¡E:¦§–Ǧd}nb7îëÚˆm@©Ö E¾Ï Ãø+kCÞ\D"z0–…Rº^ÈCâ-ù ¹&/ŒS"°Ö…úÈ"Al@ôYk¥oøÜüõqÁJe\|‡è=\'#RÊçé‰Ò}1±*_]ÞAâ1k EV’†”ä…efB"'¬„È
-”©=@Ó&®,¤µæým4™v2xP—™Bcu¨~ðQªÁLº¨éÉvù¼Cÿö ¥SûŒR¢©Á6E ®bÁâ`º³LJWº¤Ç2Õ4¥h-L•ÂÆõ·Ð¢ÔëFraB2îQXU(êh©ˆ{£®ÝUåÅÒ}ÏØ@iH}Ûƒ”[;ØkÖLaÀ5TΤ!ËÑ ñÙáÍa¦1'4È|8“…V¿ <nì´< ;MU„…°8nœÑ\ÀJÓ2BðqºV4tjWAeцëiuQ¾)>'½%Tu–õ†Žþ¹3.j9ž|d_õHÜJh™"ÕíÑCSÔá6`Yö–®Þ³ê·¥MyÄ‚†c¨1êÚŸÌùÞÛÆÏÀÊA¢SšÉOþª§‚œXÐ|†ôT°­U¶D'ªI,-]4k=knçýÐÃÕ¬ÞŠ…¢‹û³„ddVš—VwJ“äê!C,6yw>Ûf1»ðnæa”S{L©ºAÛË8Þ°•æÙÍÑûØ'ú…ÅëÎÞj½xòE^m¿VL$v´ÝL^qM¯®*C©—'œ})¤®4)V%Å)J¾ä®¸S z(͈â¬Ï&@zYP¡ËìŒ.©IŒ4à4Þµ\µq“çÞdYÔqOõ¹šH[ iŒ¨öº&ºý»ü’"—_ØD½‡
-™N endstream endobj 68 0 obj <</CS 85 0 R/I false/K false/S/Transparency>> endobj 85 0 obj [/ICCBased 76 0 R] endobj 63 0 obj <</Filter/FlateDecode/Length 2959>>stream
-H‰´WËŽ$·¼÷WÔt-“L¾®ZÙ>† ƒuoXÚÃŽõþ?àˆH²»§w 0Œ¦UÅG¾"ƒþöñøð×éøáÇÇåË%#–ÓqÅï¿ÿqùûñÏˇ?§ãöõHg-ÿ-þ§|_oxý¼þíëåËaGŸVÏ‘­5Ÿ¹§zÜÞ.|ñv±y›‡=ûñù’Ó™k#lÆ­bêÙŒã‰ì,¥·K¶³VÇ–Ý*gù™ºWLë#pÉõ¸æ3e¬ã§÷ITz~B]+¶r\ûÙ½sj9ËlÄ£ÌXÊË€íçè ¶ŽÚé6ã{LJ|€³>}ÐÏáAŃœaMÝpXÎõÀOï|ïgÎ8^>'×#œðÓ¥œ–Û™Jæì³ Ü8sàl¹žÓP‚‡‰š7Ì„;ŒGÇ’µ`*pq’<
-½Uµ“aÇ° V·˜^ó6•¦]Óét è(ú€^¯gI¾Tù®×¾&д~¶¶';®  ãÜøi¾ß¾OçHM?E? ac¶Ü.ôrž\¡§‚ìé§1–ðµ5,€Çî‚pp k;¬Qd
-Ü.„øpžÅ˜/4`ºe-Ã} §¯ ÒˈhKô#ìí5BÞ?ÀÀ–c¸?‰‰òS T䥙˲ñ7GIÐML•zi±^­Ü©‘¹Á§Ë¯—Ÿ.ÈvT
-$³Ö°¦jíQcŒ+Ì(wG…ÁÈŽOÎ8*r!³?On…5‘ƒW$}.‚ŧ FÏÃ` Ä<Y ˜è¤ŒI-â–²âæcj•”4½Ìy?ýO ’‚ã(ß œ 'íˆf‰Âü|Á kNÌ„âQúô@ù(å̅ۿǘËEð|®:.œ6µF²kôãÝ)nâ³/wÊ‚Ÿ¼)@£œR$ä>^cg›3r ÃÑ:Fâµ~9>üü)_?úåÃZ–H£1mqR€3okd€£p|Èý6P·@óLˆÐl“È*«ú=V6‚YƒX ýœˆ( Íqh_ )ÕãÝ)^ ‡S&Ê!ŽQMªÌ=|zôO5õa<DΣê`Ûpû¿þ?ú<ߘ}äIàrÎIö*µ08it¦-÷ï?zõKg¤„TаckìñÓäXKX¨²
-Q˜õ'ƃd›¡*èq{¥\ùxŠ«FÍO²FëåÇzÄ3ôÄj¥¨$TgzGºÿwz/-∄mT;÷½”å œz<n&ùlnôÁ@ÂX‡|;)\~Ùwu—+ʼnN(Å%YPÊ"yK”\l†² é¸N @•cý?Èÿ Èt"û–EãÊm´'¶'ÖwNDû`·ŽØÔ!-¯ =½l¬²ëº¼Ñ!!ZBˆR®™šÓ¾P‰Rmh‹J´ÀÑ8Z+e÷îÌrJ>7.|o)o¬¤m$**‡h¸ÌJ{ëÅeC’L‘­SyLÁɾ7üOйgFþS2æâ¬Ú|—e!šî*ÌZ¨®²q Õ5Buy¨._ªë×EJ¿‘eŒ,óáÏoéøñ_ß{nñ1A¡[1~ D%ÿÀ„Ò™Oz%)'§,FbÓNÁ(’JJ4$‘ÀÙ‘™Ô47‰ZöøÆô/÷WðKÔ$+%€ÁG¡²‰ tut‡qå7}³†Ü´3sVââÆ_™Õ ™D™¤e<âRV!@rõyœG_%z‚yË
-HAê¦Ñ`!®_£Ó I[))µ‰îq-Js£Û^r¿ ¶§%½1Ç-+îˆK¶Ar%¥ØjïÉüŽ&j×gD•·°ÑÛ†8^µ#$;£3»[Q+ë9¸!ç¶!û¤.}8jóÐí 2å£ßª5³uJDw=­o¤>šs¾¿9ÈæQçT•=ºhöãaw#i'Sð’œÊXæ
-[’â÷Z„¹‘KÍÖX‘ʬzê´„w‹úZVûÖ‰«Ö˜q]%4’ZZÇÊâùŸå z»/^/R©1fC¶ïÃäEÊtkƒ¼yŸÅÅüŠRMeWYc·Ï¼_UÝa¢ý-àºOâÀ 䢄ÈÛ6]œ¬<õýŽiZë…®Ža/+©ŸÖÅ‘-ª±94[PgèQà¬÷
-o—‘:ê²2·pëZÛ¬'co— ˜ t|à#(Ðc‘Ÿ¸|ÇãáIí¨Ôp†wvêØøŠš,Ç
-nØÆçqP.ëÞé’úXµ#
-ÅôƒnØZו¼‹h.µbVïÈ“Ru³Ðb3f7?Ï·1ÃÆ8Ð1G‡¸Û©h+ñ2;9 P{¤
--ð›vI¨;ÌE§ómGõI€ž œqk÷ÎóÉQYµ­(Œ~&9Ë~z,å¦u?ÏïÇøy 0
-/CS0 cs 1 1 1 scn
-/GS0 gs
-q 1 0 0 1 35.5254 34.3291 cm
-0 0 m
--0.003 -1.098 l
--0.004 -1.535 -0.361 -1.918 -0.796 -1.957 c
--12.531 -2.984 l
--12.925 -3.02 -13.249 -2.762 -13.309 -2.393 c
--13.252 -2.713 -12.971 -2.934 -12.628 -2.902 c
--0.805 -1.869 l
--0.416 -1.833 -0.093 -1.489 -0.092 -1.098 c
--0.09 0 l
--0.09 0.088 l
-h
-f
-Q
- endstream endobj 66 0 obj <</BBox[22.1172 34.3369 35.6152 31.252]/Group 88 0 R/Length 333/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 52 0 R>>/ExtGState<</GS0 54 0 R>>>>/Subtype/Form>>stream
-/CS0 cs 1 1 1 scn
-/GS0 gs
-q 1 0 0 1 22.1172 32.0664 cm
-0 0 m
-0.002 1.088 l
-0.091 1.096 l
-0.088 0 l
-0.088 -0.438 0.439 -0.761 0.877 -0.722 c
-12.612 0.306 l
-13.047 0.345 13.404 0.728 13.405 1.165 c
-13.408 2.263 l
-13.498 2.271 l
-13.494 1.165 l
-13.492 0.681 13.101 0.26 12.619 0.218 c
-0.885 -0.811 l
-0.397 -0.854 -0.001 -0.49 0 0 c
-f
-Q
- endstream endobj 88 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 87 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 56 0 obj <</AntiAlias false/ColorSpace 89 0 R/Coords[0.0 0.0 1.0 0.0]/Domain[0.0 1.0]/Extend[true true]/Function 90 0 R/ShadingType 2>> endobj 57 0 obj <</AntiAlias false/ColorSpace 89 0 R/Coords[0.0 0.0 1.0 0.0]/Domain[0.0 1.0]/Extend[true true]/Function 91 0 R/ShadingType 2>> endobj 89 0 obj [/ICCBased 76 0 R] endobj 91 0 obj <</Bounds[]/Domain[0.0 1.0]/Encode[0.0 1.0]/FunctionType 3/Functions[92 0 R]>> endobj 92 0 obj <</C0[0.53334 0.133331 0.101959]/C1[0.768631 0.219604 0.152939]/Domain[0.0 1.0]/FunctionType 2/N 1.0>> endobj 90 0 obj <</Bounds[]/Domain[0.0 1.0]/Encode[0.0 1.0]/FunctionType 3/Functions[93 0 R]>> endobj 93 0 obj <</C0[0.776474 0.219604 0.152939]/C1[0.53334 0.133331 0.101959]/Domain[0.0 1.0]/FunctionType 2/N 1.0>> endobj 55 0 obj <</AIS false/BM/Normal/CA 0.300003/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 0.300003/op false>> endobj 86 0 obj [/ICCBased 76 0 R] endobj 61 0 obj <</Filter/FlateDecode/Length 770>>stream
-H‰\UKn[1 ÜëºÀSDŠ¥mÝ¢« ºèŒ~N4@€Ü¾CI– @ôF_rfH?|;ŇÇSŽŸ>Ÿbx 9¶‰s<0þû~Ä¿ááô=ÇókÌ©õ†ÿÔ+þ3ÇøzÆêW¬þ~ /‘bÆE.‰
-·(-u!‰ççà ÏAgÁ—¥lñदë»&)Ïá0|è_6æTJ‹GIµ—ñ
-
-ˆ¤Q,©¨àrœi Äsk*V7:ZªÄþÌu‚4Y ¦¸Ÿ‘™Ÿª¼Ñ9¥ÜmO
-eh‰›_¾ R(&2;[ÈϲzúE6÷š²Þ&?;%²B¶‘Õ0ÄÀ¸“q§"FÙðC Tbà\ÝkÂuUuºn3æ¦ïô!^Oeˆ‡§2Ëžžkbã„épš
-Üûæ ”®Ã SRb—m¡·àœ´Û*tÑ:âª^‰ÛËÈ2ÂfL"nâù÷à¬J]ðJ ´Ì#‰ —ðgj 7AÚT›kÎí£ÞÖ“2.(;aþ-xöp¼ø'$§vëw–:º"×Rs-×2²j^ÅTÛ Âà`Æ·¯‰<™7Ì߉ª¸khŠÂtIÁ; 8±‹âÕ„ŠMv˜VÖláËÀJb{_áÔ £·€ëšÛ[²²ê%ƒm®â·Ìs’oYð )*Ê6¸KtM ¦ |ád5/uB°×4î4¡ïOÊžÈItTzïaA̾¦ÍwbDGzGËao` { Ê6„RÔò†ç™Oˆ^ªºw’÷vI &_dß+±:<ã%m#„Ü?šªA€
-C+2h d›J‘Œè KÀ´Ní²›Œ½Bu¬1êbÔ÷èkÍJ•pA!Xù†AR-Þ”á=Ù¶ÿòˆŸ±§ð_€
-H‰ŒWË®\·ÜÏWðæˆl6_[ËIVA`xï±µÐM èÿTUóÌÌ)‚!á‹äá£ÕÅÿø˜>üýcN?ýü1]¾\rZŽÿ9]ñûß]þ™þ}ùðñלn_S>Z­ø[âo¶”¾Þ0ü7 ÿñõò%•”ñ¯¤2ý(«×4ÊÑò˜éöváÈÛÅó1l¥z4/éóÅËÑ­öÒ“ÛáuÔ<“×dÇðžn÷Ãp˜rxŸüf><]ñQóÀkÎtÅ–ÝSËø܉æèwÔŽ¾
-–¶aéZÚ±Ìøñ<°Ùµô£ð<çðÄÏÚõâ(%¦—ËæÓ„~äâwìÞÖÆÆ­¢+âtø™àÌÇóqÈån—~xÁìV_Ÿ­4á6Zòcä5,‚ûÖ3Á·ËÕŽÊì]ñ)àôØŽ±Œæ*Ú¹y ÁF£Á¶}ðktÔW5n}-G6áVySMÀî~ðµ;pHÙRƹæc¥ŽácÏp΀«rÝ…æ:êðs\9ø38ŠÐÂŒ—Û…†¦Á±Ä€Þ.F A±‰{Ù-vmV`¡àÑZ,  ŒÃ2ƒ‰…Ó—vÁ÷8uŽŽê æQÒÕpѸ؋N]aè ¯TÇÎÀ!mÖè(  ´\G0 òsøÉè'uÐÒqL»qa:®2–´fpGC´-nðéòûå—KVÌ(Ba"AÙ÷”ukÕ*¶lˆ$®fp6¬<éYƒ’²6î‡äÃqû1ò9œÐ$ \‘a5
-¹çÃ_ßrúù?ßë/Ñu";y-)Ú¯QÍ‚D’„ˆ>9#+ªœžÌ®¢™'– 9 :‚‰š ßP…^YÌ=mÕ
-ïGïUï ¼"ˆù»ÎD!$ XtÂ.C†>GµrË|
-½Ýùè›QøL¤ÐÜv U¶u¶ ‹óN2aX‹ÛÁG¡,âR|‚E[Ô€ßp¨ª¸œ#ͱ^{ÄøDSI.à ¬^놩M™ÅW9-/¢ þ,ñÞÜ ¨`1| Aª™Ϩ-Œ”ˆÇÅsÕªSxc!c¤b| |ßm$‰Ö
-DÚ)äfé;DN¥mçÙ9—‘/4•åU(–{ÍÓjÎ7æà §¬÷y
-
-¯£*Ëf”èwú¤ôˆÀ§&Þˆ®h[ÖÓ ‘ÂÂm!á>
-ù”ë̸+Õ @¹gb
-†g 昉 Öl… fV„j%ù–=Vår±M»wÑZ»¯óH&›Üt£NžÈЫ̹8s› ò-µLÂ;:hµˆøo°?„šæ¿bê;E°"Qñ$CD|d>jïÚ"†ú]﮼©ñTÂò}WAá®7 •–©ºQ±þžíÛ¹à9U€e¤†Ü¯1yƒÂÝUç[xÎ’¥®;BÂîü% ‰´U,Ò²±Ønˆ³Í~ÆôÔ«
-žŠúÆȦ¬ðÞNHYaMjdÔPD”mwÈ°e­¢Ír:T{³©¢/rÃÛEŽzt`%ÓU´‘«~br`Þ¾ª×§bZ¹–'±TÛ·e¿s&…‰™GV²NPqJ® ð™+Ì÷#‡4Û†Ø;Ydõ-
-˜U™ë£è,"FŠŽEÁ‡¬Ê3ç®ük£0>lßl·1w|¯ž×Úo¾Š`jïx9ìÃ2ÈέZ±£«ú:‘Ž<ÂP%Á÷“JOóN]oc°vér-%/B£Jvd6Úqë÷QÆ­æZ6ÙÙmA‹ÑÊ¿,¨à!0)ÂûŠ‰ù@AÂ×ÖãÃoI>PºŸ< մуÿ£¼Z’#ÙqØÞ§¨ T‡~Ôç<ÞÖ›ÍDtDß~
-¸ÝPÔó[Ó‹u«´wdœcTÆ ŸÝAà¢shíM»2–
-äï¸b!©¡¦Ý<*–YaAá;Ü æëWß… ¬óÖ†í_«ñjß_€ßQ¿5à L?Õ§A#–†Ê’ߪSYKCö£ú*îtæùi +åöÄtIÛKÄã÷Õ› V·žÝíl3Í–½ðAÛRvß`Gqäë‰I¢ŠÌXÌo¦aÝa–9»
-zHjJ›Þ>yI†ÍAoýM ^Ôšœõò/wŽø£¼{ƒ6ÆöƷ馯“sméËŠú)•Õ¤jf¹÷x:ÿáÛêQÊïðâqc²¥¿d
-Ê<*¶j LË÷Ê‹XœKÒª*
-òç# 1³W6‡Ì' I|•á²VxŨÞ>¸
-S/`‰¨dE)¹| ¨.’8|K `­›CÃé¶^„üºÁ“¶ƒÌ™®¯IQns6ÔÄ¡Å=þƒuXÔR»Ä9 ÷€Bz»€ÍØžÚ6¼5¥w銪$?u¶xøžF<«FŽÕ’B¦jV©0Žž:®Z‡d½¤¤“§)4,ìR1¤CÅ1*“5¥þUfNT‰Œ
-û„Ûâ÷•Äµ,exâ,ÊÄ (B9<áóª
-è2[9/0m¢¯Ì<À…°™¦Õý£8T ž 8æZØJDÿý¦¾qp¡«K8IñÓzï¶ðá!+µº<ZÅõÿùP?Á2݇’r&æ£õ[–Ä–,¶§
-UJ~1'úõ¾û®ŒM¤ýHaf8xÐúüCmIØM`6E“ötÙØ€}›»ÜÀ ÒT#12/qþš¨uÙ¸‡XCuF;1“†SiÍ"ËE¥'žM-KB߆£ª&a ¡€’BàêÄ"†,ÑSLäsäöô@ì}šB8¬oàÖÛÎGŸbGEoëÀ&PK&ŒóV¯ 4<ºjóòÒûF¿?¦:‹€¯ ³tgC´&‰
-F×òvgßX ¶ÎY (læÀÂ;+©rügj0<¯àÅE›é£Ÿ&«É¬‘P1Ȇw0e…OeÏ–HÊÔËظõèç
- '
-›M#LÙ<
-1ˤl5\vE¥5îj"p@L >7ÀH„qÎÛÇ
-QáÀª2R˜€a5
-®q* D’œ#òy¾B­öÇ 3¦í-s£¨ÍŠžäÌÐ
-íµ~hJXäÃr©ÃdHíå5õhçùó£)‚lÇ8|mÈB$é¸Òª µCdvÊ>nà~[Æ “уA½‘_Éð®F23ylÊÖ^ÀqÞrâ‘nÖkÔPy Ð`+¤ÿÓ;R Š7d²É§?f–I­Yz@žˆiƒb=@óÅs„€'øCÒ¦Tã…Ü:_xJ±a#ãq±d3Ë íìiÉÓ™ÑÉ_²Ù•‘úÙ/=Ó 6¿Wwè`mv¿Ï Óà9>q`Ò0Yßm'*ÌPÉf%JË# 4†”{”ƒz³°I¾÷©â€«Å!qYt”ϲœ*¼¼áæ=U•y¼i¬/xSUùFØed3WâŠ}Ì%!Îáͧ9žb±O=cŠ_Œ¼¡cë>§ú(HÔ¤‚(kãÈnÖN0eÅ5‘OŠUk‘Š 8…cðV†4aBf³ß¦­q^¼(ð²ßS
-–!ÒŠ€Lÿ2Õ˜q„Iš8Ç
-ïž°\…„*,Ùò“WS¢¡D »ˆ§¤dŸgV ¡qË$ÑÊòçÝý‰¿xéÅZ×ï™C¢‰ "÷=¥þE­’~Mƒ‡fˆÉ
-óL«ŠšÞ«{ͪŒ¬ nŽ$×Kò䯷7Ö=KÙŽs‚¬Ò ¢ç‹7/½Q1Y’~Íyáââ»ßTP ï9ü ò
-W.Õሥ 죆@Ý"AÍ ZÄ]•¡¤*O‚–w‚êù )g•Ä¢§DpdùîµÄò¦e釖®Ãf =̱pq ÷A@KÒ¥ÙÑ>Ä#}0•ÜÛ¸¢boì AB»‚¾_àf´ÕGÂרtþô¹÷¾_œì{§ˆrªv‡aÀö ä£ås”jˆQ?g ¨ÃÄóë²ÊkçMŒ­l?^Šè|òzøØûÝ.Š9c°¨JRf;([³_ 1áÕÌxæßâ–ˆ§#Ç5µ\>X»åñ ‰Éô!Ž_’wÔ—ÀÍŽ0rŽ|!¨v/n„é3{ HQ$šÖ‘š/mÆñë`˜”å«êçÔ\‚±Jq/î Ë<$× •öâéG5;sÙÔàÕ+º¬ïJ’?GÍES¯xÞ«:â†êÃbšÂÉz±0A³=}àÆ|EôŠ D<%år‚¹½R‚Ó( ¹ËÊ!ÒÊäÉÌðJA‰tü’5Ésc¢)¯Ô(…¨ÛÆ£Ö(g}$ êCLP†½¥¶ñë`viý ¯¤EFVšØê{ÓÂ̾öÀ’ºÔ€¾å׆lTíÝùğÛX¶³—úß©öõ¶5y³=¬y¸±Ór©o㡼3|)©Äµ~ƒ(%bÜ„g¹» OnáÆF’'ä‰ÙÀä~öþÓ;ð}¿éH>ü/ìCYË´”ß+Éá™O$zz~¤ýðùÙÇyÿ:
-BʦÛó™Ã_ì$Lù‚Ô­vÛ€d­];Øâø<ꈩÙÁ¯“èn}“Ö¢úrÿyEÍçIŸþGšì›¸Æ· £dª"•Èå¡€g¹àñ€WÈãÅÁ)Ÿ—t¨¿]g+{Ž
-R“BV4Ûyº
-\ ¡û3~ šu‡Ú`dh:y(^Gø;èq|—%±CÎ#º`ánf³c€:‹¸Ýá{M
-­¶+N
-Â"ÕÏà<£-9‰éŒé'Æ|XÔ ÇMóßbmBPGK?‡`ûHõ‚:¤ÈýnAt½~ùüç)úúèÆb*üL‡Ÿ£/ z©e=öÀ@ƃJ.FŒDQûB.r.ªGädV›¤Lœ(`¿F5@# hüƒc`U_ l¬=½i­Ì¨É¢†y·PQ›uA€†¤õMÆÎ~ èo`[‹ÅÙï "·‘× “º™=såC9ëj¾oemŸÓHq!QDGz×nuÛ-Þ›­f«÷Vkg«³Õš[ÍŒV–ÑŠô×®aªT›ÑìÑMýEö
-®´XòÓÌbCf±“Áخƌû¹çîS#Ë_·W/(ýlïæi_‰³öFœi–ËñgsY¬ÊbÕ,ÖÞ3³X\«a6Íb Ü…Ù|#Ì’x³æa6^YÍìޅY=…Y»3³µK錱Œ<ò¹ÇŒ…ùÊXæÊXZbd¿iƒ¾"ŽÐ~o$%²ýžbvîJ¿àOT•’²ÄÑæõÈÓŽŒâ·‡üj_—PßÈ/JÓ-óÒ²Xîg‹O‡ü­KÉrRÒSÄOõt ö`v¦ÁV°ú‘‡/yßí›óuið˜¤ÿ''¦;'Ž;/Ϋ¼¢;øÓÙ‹¦YñÝë9ŽäZ–;7–wÝȺU¶þ¿„¦ÂŠñ †’åN´9ÎÈèº
-Õý ö_Q™Ò^à@4Œ Ç–®/ŒÚÜÂœŒ*:òS™˜ð¡¥žIûC9¨bÉF¤3EØJšÐ0I%[¸íô´YO¸€• ¬-f‡³‰Ž>™UšnUghñĸ.q Ú¾!¬W‘ã•8ÓàHév5V½P7!
-FEÔwj*Êš~8?:~Š6·É13žp;[ÓVF˜
-1Ää£Op[§@ SÁà tp™êÔ{¬¤ë¢)7@eÔ— ¯
-œ`|Å¢oèžlBæXéË.’ÏÈ Ž¦š7z¾Ð.5¯Q](:d
-ÐqÁÃzë=Œ‡¯‘FƒU‘¬&2Oìñ3o]ëÛ*ÄÆË6“[âvùݼŽÒ}ž!w|`H1LNa¸¤b:§m @!І*ƒìÃ^´3ÆfÃܘir<}€)3«Ÿ2„7¬Î÷dËvnÈñp/ ƒ[çMU9é~_ K+‹k E ÀÙ­» ,’†éSeÀV™Ä÷¢…8z&íV¼'r/Œ!Š¸\E~E4ªš!dïHÍàSb©£ÓRHÊ®3á’A«T\ž´>d4ÃÜñ¡•¼‚—8kÂå &0 ?¡kêE(¾ %}ƒ,MÁýJ|]¡L>û[Àþ4²9e:f2&Ýàwþ𺢔@ð%
-Á^䛩Ø4 j Êf/"o0â Ù\hV´’Œ·f¸7FûÌ©A‰*· ¹æ8aøœTê)£Yõ¶“àûŸ>]ñç
-8;YPg0lFl_%.r+N5R%;oqLcMuF'bL>knfL/IXpBC]=!le4Tt-cRRLDS+bBsDr(]i*
-2PMN`LCEPVKOf_bnT[CuT.l=k$^#i=_1B40kmYKt;;A]Mrl1ZA#Qc'b<ZuLb#N?UD
-b;rIAd$]K970<MHc"ZbAqG(6qX5Y&I^',`R+aidZ;+`^%FmfOd4)?4HT(L!p>ip<8
-Jo2Pn"%p+dZJ?X:)MViJHa:stl3CrG"0;c^5DG*MW]*OS")u>7"-IQ@g#Ypte7ia$
-"JiGd$<Qrn;W:"UF,@s.k^9mn-LtOR,J\Q$>&%$R"Ip0;9KG+V5#fI2Ijed6aWmE_
-@RZpLa7t,LDm!c!&`aVlG\<p`%67t6m\NZT.Lh#0T&IMPr+GdG!)(hNli~> endstream endobj 22 0 obj [/Indexed/DeviceRGB 255 23 0 R] endobj 23 0 obj <</Filter[/ASCII85Decode/FlateDecode]/Length 428>>stream
-8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0
-b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup`
-E1r!/,*0[*9.aFIR2&b-C#s<Xl5FH@[<=!#6V)uDBXnIr.F>oRZ7Dl%MLY\.?d>Mn
-6%Q2oYfNRF$$+ON<+]RUJmC0I<jlL.oXisZ;SYU[/7#<&37rclQKqeJe#,UF7Rgb1
-VNWFKf>nDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j<etJICj7e7nPMb=O6S7UOH<
-PO7r\I.Hu&e0d&E<.')fERr/l+*W,)q^D*ai5<uuLX.7g/>$XKrcYp0n+Xl_nU*O(
-l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 58 0 obj <</BBox[197.339 34.8184 224.688 28.498]/Group 96 0 R/Length 320/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 52 0 R>>/ExtGState<</GS0 54 0 R>>>>/Subtype/Form>>stream
-/CS0 cs 1 1 1 scn
-/GS0 gs
-q 1 0 0 1 224.6885 34.6367 cm
-0 0 m
--0.005 -2.255 l
--0.007 -3.154 -0.741 -3.94 -1.636 -4.021 c
--25.752 -6.132 l
--26.56 -6.204 -27.226 -5.674 -27.35 -4.915 c
--27.232 -5.573 -26.655 -6.027 -25.95 -5.964 c
--1.653 -3.841 l
--0.854 -3.767 -0.19 -3.06 -0.188 -2.255 c
--0.184 0 l
--0.184 0.182 l
-h
-f
-Q
- endstream endobj 59 0 obj <</BBox[197.135 34.6533 224.873 28.3145]/Group 97 0 R/Length 333/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 52 0 R>>/ExtGState<</GS0 54 0 R>>>>/Subtype/Form>>stream
-/CS0 cs 1 1 1 scn
-/GS0 gs
-q 1 0 0 1 197.1348 29.9883 cm
-0 0 m
-0.005 2.235 l
-0.188 2.252 l
-0.182 0 l
-0.182 -0.9 0.904 -1.564 1.802 -1.483 c
-25.918 0.628 l
-26.813 0.707 27.547 1.494 27.548 2.394 c
-27.554 4.648 l
-27.738 4.665 l
-27.73 2.394 l
-27.728 1.398 26.922 0.533 25.932 0.446 c
-1.818 -1.666 l
-0.816 -1.756 -0.001 -1.009 0 0 c
-f
-Q
- endstream endobj 97 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 96 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 95 0 obj [/ICCBased 76 0 R] endobj 5 0 obj <</Intent 34 0 R/Name(Layer 1)/Type/OCG/Usage 35 0 R>> endobj 34 0 obj [/View/Design] endobj 35 0 obj <</CreatorInfo<</Creator(Adobe Illustrator 15.1)/Subtype/Artwork>>>> endobj 43 0 obj [42 0 R] endobj 98 0 obj <</CreationDate(D:20131028184906-07'00')/Creator(Adobe Illustrator CS5.1)/ModDate(D:20131028230416-07'00')/Producer(Adobe PDF library 9.90)/Title(Web)>> endobj xref 0 99 0000000004 65535 f
-0000000016 00000 n
-0000000159 00000 n
-0000042704 00000 n
-0000000000 00000 f
-0000187913 00000 n
-0000000000 00000 f
-0000042790 00000 n
-0000000000 00000 f
-0000000000 00000 f
-0000000000 00000 f
-0000000000 00000 f
-0000000000 00000 f
-0000000000 00000 f
-0000000000 00000 f
-0000000000 00000 f
-0000000000 00000 f
-0000000000 00000 f
-0000000000 00000 f
-0000000000 00000 f
-0000185588 00000 n
-0000000000 00000 f
-0000186119 00000 n
-0000186167 00000 n
-0000000000 00000 f
-0000000000 00000 f
-0000000000 00000 f
-0000000000 00000 f
-0000000000 00000 f
-0000000000 00000 f
-0000000000 00000 f
-0000000000 00000 f
-0000000000 00000 f
-0000000000 00000 f
-0000187983 00000 n
-0000188014 00000 n
-0000000000 00000 f
-0000000000 00000 f
-0000000000 00000 f
-0000000000 00000 f
-0000000000 00000 f
-0000000000 00000 f
-0000047209 00000 n
-0000188099 00000 n
-0000043290 00000 n
-0000043646 00000 n
-0000044092 00000 n
-0000044450 00000 n
-0000044853 00000 n
-0000177996 00000 n
-0000185526 00000 n
-0000050192 00000 n
-0000047509 00000 n
-0000151068 00000 n
-0000047396 00000 n
-0000176902 00000 n
-0000176153 00000 n
-0000176296 00000 n
-0000186680 00000 n
-0000187210 00000 n
-0000143526 00000 n
-0000177060 00000 n
-0000177899 00000 n
-0000171863 00000 n
-0000174892 00000 n
-0000174954 00000 n
-0000175486 00000 n
-0000169840 00000 n
-0000171766 00000 n
-0000143284 00000 n
-0000143464 00000 n
-0000045207 00000 n
-0000047147 00000 n
-0000143249 00000 n
-0000047280 00000 n
-0000047311 00000 n
-0000047544 00000 n
-0000050266 00000 n
-0000050462 00000 n
-0000051586 00000 n
-0000055752 00000 n
-0000121340 00000 n
-0000169805 00000 n
-0000151111 00000 n
-0000169748 00000 n
-0000171828 00000 n
-0000177025 00000 n
-0000176091 00000 n
-0000176029 00000 n
-0000176439 00000 n
-0000176688 00000 n
-0000176474 00000 n
-0000176569 00000 n
-0000176783 00000 n
-0000177961 00000 n
-0000187878 00000 n
-0000187816 00000 n
-0000187754 00000 n
-0000188124 00000 n
-trailer <</Size 99/Root 1 0 R/Info 98 0 R/ID[<ED15E9BF076E4593A569604ADBB3F8CF><AA08E8EA01F9438CBAC1A56222B52B7D>]>> startxref 188293 %%EOF \ No newline at end of file
diff --git a/docs/theme/mkdocs/images/website-footer_clean.svg b/docs/theme/mkdocs/images/website-footer_clean.svg
deleted file mode 100644
index affc804c6d..0000000000
--- a/docs/theme/mkdocs/images/website-footer_clean.svg
+++ /dev/null
@@ -1,197 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="3069.344px" height="832.386px" viewBox="0 0 3069.344 832.386" style="enable-background:new 0 0 3069.344 832.386;"
- xml:space="preserve">
-<title>Layer 1</title>
-<g id="svg_297" style="opacity:0.5;">
- <path id="svg_298" style="fill:#E2E2E2;" d="M1488.561,98.234l-0.739-22.693c-12.602,3.359-25.19-1.68-39.472,4.199
- c8.4,5.879,0,26.033-7.56,31.072c-23.51,14.277-40.31-29.393-57.101-36.111c-10.92-4.199-30.239-5.039-39.479,1.68
- c-15.95,10.918-9.229,15.117-28.55,5.039c-10.08-5.039-19.32-6.719-30.23-3.359c-8.398,2.52-29.398,20.155-37.79,19.316
- c-15.12-1.681-5.88-22.676-21-5.879c-10.92,11.757-9.238,11.757-24.35,10.077c0-3.359,6.72-16.796,4.2-20.995
- c-4.2-5.879-24.36,1.68-31.92,0c-5.881-0.84-12.59-7.559-18.472-7.559c-6.72,0-6.72,4.199-12.6,5.879
- c-15.96,5.039-26.87-7.559-41.99-6.719c-7.56,0.84-26.028,5.879-32.75,10.078c-14.278,9.238-10.08,13.437-28.56,10.078
- c-12.602-2.52-24.352-10.918-36.11-8.398c-6.718,1.68-65.504,32.752-56.267,3.359c10.918-0.84,23.516-7.559,15.115-17.637
- c-9.236-11.757-34.432-10.078-47.027-16.796c-5.039,20.155-19.315,35.271-40.312,26.034c-0.84,1.68-3.357,5.039-6.719,5.039
- c-10.918-0.84-15.957-12.598-27.714-3.359c-12.597,10.078-4.199,20.995-22.675,4.199c-11.756-10.918-15.954-8.398-30.23-12.598
- c-10.918-2.52-22.676-12.598-31.913-11.758c-5.879,0.84-8.396,6.719-15.956,6.719c-5.879,0-9.236-3.359-15.115-5.039
- c-2.521-0.84-7.561-2.52-10.918-2.52c-8.398,0-5.038,0.84-11.759,5.879c-13.437,9.238-41.988,15.117-59.626,10.078
- c0,7.559,0.84,14.277-1.68,20.995c-20.996-7.558-43.67-12.597-63.826-20.995c-6.718-2.52-20.995-10.078-26.873-4.199
- c-6.719,5.039,1.682,16.797-1.68,26.035c-9.238-2.521-20.156,0-31.073-0.841c-4.199-0.84-10.077-5.038-15.116-3.359
- c-4.197,2.52-1.68,9.238-5.879,12.597c-7.559,6.719-18.477,5.039-27.714,2.52c-12.597-4.199-16.796-8.397-30.231-7.558
- c-11.759,0-24.354,2.52-31.912-8.397c-0.84-2.52-5.039-13.438-5.039-15.957c-2.521-5.879-3.359-4.199-2.521-12.598
- c0.84-14.276,7.561-15.115-8.396-17.636c-9.238-0.84-20.155-2.52-28.555,0.84c-4.197,2.52-25.193,17.636-25.193,21.835
- c-0.84,7.559,19.314,14.277,24.354,16.797c-12.598,5.039-5.879,16.796-2.52,26.873c-0.84,0.84-1.68,0.84-2.521,2.52
- c-14.275-38.631-53.292-21.55-75.468-11.227c-13.726,6.39-29.697,16.125-48.173,11.087c-20.995-5.879-14.088-9.938-18.287-25.054
- c-10.918,2.52-19.316,7.559-30.233,7.559c-9.237,0-16.796-4.2-26.034-5.879c-7.559-2.52-13.438-1.68-20.995-1.68
- c-12.597-0.84-14.276-3.359-24.354-9.238c-8.398-5.879-2.52-5.039-10.918-5.039c-5.878,0.84-11.757,5.879-17.636,6.719
- c-11.757,1.68-14.276-3.359-24.354-6.719c-5.039-2.52-2.52-4.199-8.398-2.52c-7.558,0.84-18.475,12.598-23.514,17.637
- C21.515,96.536-2.84,111.652-2,121.73l2.423,710.938l1493.817,6.719l1574.27-6.393l0.379-720.519
- c-9.959,9.124-63.869,11.612-70.51-4.978c-5.809-13.271,4.15-14.102-10.779-23.226c-9.131-6.636-23.229-19.079-35.67-16.591
- c0,19.079-17.42,29.862-34.01,30.692c-13.27,0.829-23.23-5.807-34.01-6.636c-7.471-0.83-9.951,4.146-18.25,6.636
- c-5.812,0.829-10.781,0-15.76-1.659c-9.132-3.318-9.951-3.318-18.25-3.318c-8.302,0-15.763,2.488-24.892,0
- c-6.631-1.658-12.438-7.465-18.24-9.124c-1.659,5.807-11.618,33.18-24.061,24.885c-4.148-2.488,0.83-12.442-3.32-16.59
- c-7.459-7.466-10.779,0-16.59,4.977c-16.591,12.442-43.959,19.079-59.72,1.659c-6.641-7.465-3.319-9.124-11.61-12.442
- c-5.81-1.659-13.279,0-19.908-1.659c15.76,24.885-29.861,33.18-29.041,4.978c-9.119-0.83-14.93-8.296-23.221-10.784
- c-5.81-1.658-31.521-4.977-37.33-2.488c-12.439,5.807-11.609,40.646-33.181,23.227c-15.76-13.272,18.25-32.352-5.809-38.987
- c-15.762-4.977-42.301-0.829-48.111,15.761c3.32,0.83,17.42,19.908,19.08,24.056c1.66,7.466-9.949,14.102-19.08,13.271
- c-9.949-0.83-11.608-12.443-20.729-17.42c-9.959-5.807-26.55-7.466-38.158-9.954c-0.83,6.636,0.83,19.079-5.812,22.396
- c-6.641,4.146-21.569-5.807-27.371-8.295c-13.27-6.636-24.059-5.807-31.52-20.737c-5.811,3.317-2.49,4.977-4.15,8.295
- c-1.659,1.659-0.83,7.465-2.489,9.954c-2.488,4.147-11.609,8.295-15.761,10.783c-7.459,4.978-14.1,9.954-21.567,4.146
- c-9.121-5.807-6.632-26.544-15.763-33.18c-17.42-12.443-14.93,11.613-19.897,18.249c-8.301,12.442-25.721,1.659-34.84-4.978
- c-7.472-4.977-5.812-7.465-18.25-9.954c-10.791-1.659-22.4-4.147-34.013-4.977c-13.27-0.829-9.129-2.488-16.59,10.783
- c-6.639,11.613-0.83,5.807-11.619,6.636c-9.121,0-26.541,1.659-26.541-9.124c0-6.636,11.611-10.783,9.951-18.249
- c-0.82-2.488-9.121-5.807-10.781-7.466c-17.42,12.442-32.35,24.886-52.26,34.01c20.74,35.669-38.979,23.226-40.639,9.124
- c-2.49-15.76,16.59-19.907,21.559-29.861c3.32-6.637-0.83-11.613-1.66-18.249c-0.817-16.591,0.83-19.079-19.897-14.931
- c-14.931,2.488-27.381,8.295-40.649,14.931c-14.931,7.466-10.779,9.954-6.642,22.396c5.812,14.102,5.812,8.295,19.91,14.102
- c-4.979,13.272-33.181,21.567-46.449,18.249c-4.149-0.83-11.61-3.318-14.102-6.637c-1.658-3.317,0.829-11.612,0-12.441
- c-4.979-5.807-24.06-1.659-31.521,2.488c-7.469,4.147-9.129,14.931-17.42,19.078c-14.109,7.466-18.25-0.829-25.719-9.954
- c-8.291-9.124-5.801-4.977-19.08-9.124c-10.781-2.488-9.121-5.807-21.562-3.318c-14.93,2.488-29.028,10.783-44.801,7.466
- c8.301,0,4.98,17.419-2.479,17.419c-8.302,0-3.32-6.636-4.98-8.295c-3.319-3.318,1.66-4.147-4.979-7.465
- c-5.812-3.318-23.23-3.318-30.689-6.637c-5.811-2.488-6.641-4.977-16.59-4.147c-8.291,0-16.59,2.489-24.881,3.318
- c5.801,11.612-38.16,26.544-33.189,0c-6.631,4.147-14.1,6.636-22.391,5.807c-5.811-0.83-11.619-8.295-17.42-8.295
- c-7.471,0.829-29.859,23.226-24.891-1.659c-9.119,4.147-24.88,8.295-30.689-2.488c-19.08,9.953-30.689,29.861-48.939,14.102
- c-6.631-6.637-2.49-8.295-14.101-8.295c-8.29,0-15.76,4.146-23.229,4.977"/>
- <g id="svg_299">
- <path id="svg_300" style="fill:#698E8D;" d="M1489.72,97.922c-0.239-7.564-0.489-15.129-0.729-22.693
- c-0.021-0.66-0.392-1.021-1.062-0.891c-13.38,2.557-26.358-0.103-39.47,4.199c-0.82,0.269-1.78,1.48-1.01,2.275
- c12.51,12.832-7.74,34.846-21.852,30.377c-6.398-2.027-11.688-8.095-16.09-12.84c-7.89-8.511-14.41-19.639-25.16-24.85
- c-9.59-4.651-27.88-5.514-37.27,0.003c-5.2,3.052-9.642,6.831-14.11,10.867c-5.488,4.974-25.199-7.745-31.438-8.98
- c-12.23-2.421-22.37,4.323-32.05,10.511c-6.87,4.39-15.58,11.557-24.262,9.57c-6.68-1.529-4.68-8.726-9.22-11.479
- c-4.29-2.6-13.78,10.866-15.38,12.601c-4.94,5.345-8.26,4.674-13.88,4.184c-4.75-0.416-0.83-7.793-0.312-9.38
- c1.04-3.144,2.932-8.364,1.12-11.682c-3.59-6.61-22.46-0.798-27.38-0.241c-8.7,0.982-15.21-6.052-23.41-7.652
- c-5.04-0.985-19.34,6.909-21.91,6.992c-9.318,0.301-19.09-6.105-28.26-7.712c-4.7-0.824-9.58,0.606-14.109,1.631
- c-13.431,3.038-24.041,7.658-34.431,16.594c-12.95,11.134-37.989-8.274-53.56-6.63c-7.276,0.769-15.815,6.564-22.506,9.212
- c-8.173,3.234-24.032,10.692-32.276,4.896c-8.88-6.245,7.571-9.968,10.396-11.903c3.146-2.159,6.354-4.487,6.722-8.661
- c1.678-19.156-39.275-19.553-50.245-24.573c-0.722-0.33-1.598,0.591-1.771,1.198c-5.327,18.663-18.159,32.418-38.54,24.836
- c-0.671-0.25-1.304,0.388-1.631,0.879c-7.467,11.2-17.824-5.336-26.384-2.6c-6.248,1.997-10.377,5.682-14.004,11.039
- c-2.785,4.115-2.675,6.487-8.063,2.578c-5.806-4.212-10.363-9.518-16.685-13.074c-9.845-5.539-22.634-5.521-33.033-10.59
- c-6.105-2.977-16.332-9.963-23.507-5.571c-13.797,8.444-24.696-0.345-38.208-2.021c-8.021-0.994-11.928,6.107-18.468,9.536
- c-15.381,8.064-35.829,10.43-52.646,6.464c-0.824-0.195-1.849,0.653-1.835,1.514c0.031,1.876,1.65,20.002-5.126,17.641
- c-5.317-1.854-10.73-3.453-16.118-5.096c-10.756-3.279-21.524-6.441-32.156-10.112c-10.742-3.709-26.758-15.087-38.005-8.029
- c-5.306,3.329-2.512,25.605-5.567,25.04c-9.831-1.819-19.997,2.098-29.747-1.077c-2.974-0.968-9.541-4.62-12.844-1.936
- c-8.808,7.157,4.767,16.368-20.307,16.946c-10.081,0.233-19.532-5.255-28.794-8.396c-6.885-2.336-14.634-1.372-21.742-1.145
- c-15.502,0.497-22.479-5.01-27.177-19.22c-1.873-5.665-4.087-10.972-3.628-16.999c0.314-4.135,2.487-8.738,2.097-12.854
- c-0.765-8.052-20.95-6.617-25.854-6.867c-12.076-0.616-18.613,4.591-27.677,11.573c-4.837,3.726-13.691,9.041-12.771,16.146
- c0.961,7.408,17.492,12.281,22.857,14.562c-8.697-3.697-3.95,19.666-3.774,20.194c2.685,8.043,2.137,7.003-1.371,0.227
- c-2.713-5.241-7.104-9.254-11.973-12.413c-9.181-5.96-21.337-4.67-31.438-2.535c-11.688,2.47-22.846,7.9-33.557,13.008
- c-11.139,5.312-21.435,9.982-33.951,10.508c-9.794,0.412-24.036-3.646-25.502-14.621c-0.507-3.796-0.963-7.451-1.858-11.188
- c-0.12-0.503-0.555-0.73-1.05-0.596c-13.847,3.768-25.356,9.255-40.165,5.975c-8.891-1.97-17.168-5.296-26.308-6.12
- c-11.72-1.058-20.056-0.271-30.489-6.644c-3.416-2.086-6.718-6-10.313-7.486c-2.534-1.047-7.815,0.39-9.968,1.402
- c-13.296,6.252-20.69,5.955-32.814,0.115c-9.981-4.808-12.924-5.854-22.889,0.893c-10.741,7.271-20.465,17.645-30.656,25.83
- c-6.08,4.882-13.72,11.144-14.341,19.463c-0.627,8.391,0.169,17.135,0.252,25.537c0.724,73.338,1.447,612.062,2.171,685.401
- c0.005,0.486,0.213,0.928,0.769,0.932c91.647,0.412,183.295,0.824,274.942,1.236c193.022,0.867,386.046,1.735,579.068,2.604
- c171.517,0.771,343.036,1.543,514.557,2.313c54,0.242,108,0.633,162.01,0.414c136.392-0.555,272.78-1.109,409.17-1.662
- c199.802-0.812,399.609-1.623,599.421-2.435c152.461-0.619,304.909-1.238,457.358-1.856c23.853-0.098,47.701-0.192,71.562-0.291
- c0.739-0.004,1.561-0.805,1.561-1.557c0.129-85.044,0.26-635.475,0.379-720.519c0-1.022-0.959-1.115-1.648-0.58
- c-13.602,10.519-59.86,12.522-68.95-4.951c-6.17-11.844,1.438-15.188-10.959-23.432c-11.41-7.587-21.42-18.009-36.17-16.763
- c-0.781,0.066-1.5,0.756-1.562,1.557c-1.871,26.499-28.899,32.455-50.108,26.482c-7.121-2.006-16.9-6.581-24.191-2.562
- c-11.129,6.125-19.049,6.006-30.5,1.98c-4.639-1.634-9.039-1.711-13.909-1.742c-8.609-0.054-15.859,1.623-24.619,0.043
- c-6.529-1.18-12.062-6.595-18.24-9.124c-0.75-0.304-1.58,0.571-1.779,1.198c-1.729,5.631-4.111,10.957-7.01,16.083
- c-4.16,7.37-16.66,7.016-16.311-2.507c0.049-1.204,0.108-2.597-0.48-3.648c-3.6-6.416-9.43-7.705-14.59-2.444
- c-17.209,17.559-48.631,24.975-65.709,3.301c-2.121-2.684-2.801-6.35-6.15-7.938c-7.35-3.488-15.541-2.129-23.461-3.258
- c-0.91-0.13-1.91,1.311-1.459,2.11c12.439,22.298-26,29.203-26.801,3.799c-0.01-0.34-0.08-0.801-0.5-0.889
- c-11-2.333-18.85-10.476-30.209-12.148c-8.75-1.29-20.49-4.076-29.23-1.601c-4.85,1.373-7.43,5.152-9.85,9.344
- c-2.09,3.604-3.621,7.558-5.49,11.279c-7.16,14.267-25.221,4.651-22.18-8.736c3.17-13.909,14.109-22.69-5.65-27.996
- c-16.489-4.427-39.26,0.864-46.67,17.465c-0.26,0.586-0.34,1.179,0.3,1.523c5.852,3.198,9.94,10.595,13.729,15.825
- c1.529,2.123,2.939,4.321,4.279,6.567c-2.68,11.631-10.209,15.062-22.6,10.29c-2.529-2.108-4.689-4.562-6.47-7.362
- c-10.659-14.068-30.521-14.582-46.5-17.769c-0.891-0.177-1.771,0.638-1.84,1.514c-0.49,6.615,1.17,23.94-12.729,21.128
- c-5.722-1.158-11.25-4.793-16.361-7.464c-12.779-6.666-25.469-7.859-33.379-21.479c-0.351-0.603-1.109-0.37-1.551-0.026
- c-1.64,1.277-4.33,2.77-4.31,5.353c0.09,13.075-12.67,20.101-22.19,26.388c-24.66,16.278-21.091-28.165-35.3-34.067
- c-6.989-2.907-10.819-0.399-13.58,6.274c-4.291,10.386-5.44,23.036-21.989,18.064c-8.109-2.436-15.841-8.553-22.121-14.144
- c-5.97-5.321-15.699-5.433-23.109-6.703c-9.75-1.674-19.48-2.843-29.35-3.646c-8.41-0.685-10.521,9.751-13.812,15.761
- c-4.09,7.479-45.771,3.748-27.75-15.143c8.75-9.174-0.08-12.268-7.41-17.396c-0.459-0.324-0.969-0.12-1.389,0.18
- c-16.842,12.156-33.16,24.765-51.961,33.817c-0.631,0.304-1.25,1.255-0.881,1.951c3.489,6.484,7.791,16.877-2.578,20.34
- c-4.471,1.491-9.91,0.784-14.41,0.05c-7.262-1.184-16.291-4.257-20.649-10.536c-8.439-12.158,14.399-21.263,19.209-28.933
- c5.791-9.223,0.149-20.603-0.56-30.706c-1.211-17.201-34.131-3.3-41.721-0.173c-8.42,3.468-23.84,7.511-29.271,15.562
- c-3.92,5.804-0.051,11.882,2.06,17.807c2.842,7.994,5.621,10.232,13.381,12.094c13.431,3.227-8.33,13.695-12.42,15.284
- c-6.472,2.519-13.539,3.517-20.438,3.575c-8.712,0.076-20.292-4.436-19.052-15.078c0.062-0.537,0.76-3.84-0.149-4.541
- c-7.4-5.689-18.539-2.5-26.65-0.052c-9.309,2.812-12.738,9.657-18.17,17.19c-16.779,23.306-26.619-7.418-37.738-12.084
- c-7.221-3.029-17.561-5.837-25.41-6.922c-17.531-2.422-34.271,10.803-52.631,8.332c-1.039-0.142-2.35,2.152-1.061,2.444
- c-4.318,11.423-6.068,14.356-5.261,8.801c0-0.519-0.119-1.014-0.379-1.485c-0.42-1.335-0.852-2.714-1.34-3.992
- c-1.84-4.84-8.812-5.891-13.281-6.567c-10.27-1.554-18.92-3.148-28.278-7.454c-9.462-4.352-25.431,1.17-35,2.447
- c-0.75,0.099-1.859,0.953-1.562,1.852c3.34,9.93-34.049,24.454-30.859-0.921c0.109-0.815-0.729-1.124-1.358-0.772
- c-12.092,6.746-20.172,6.511-31.98,0.076c-3.061-1.664-5.59-3.154-9-2.327c-5.75,1.4-25.229,17.517-22.36-1.124
- c0.141-0.881-0.738-1.033-1.359-0.772c-9.5,4.003-22.049,7.938-29.43-2.27c-0.302-0.425-0.812-0.476-1.261-0.219
- c-16.84,9.599-36.26,32.166-52.359,8.269c-5.602-8.322-26.83,1.133-33.61,2.396c-1.24,0.231-1.91,2.724-0.21,2.406
- c8.16-1.52,26.57-10.664,32.699-1.564c3,4.451,6.801,7.177,11.521,9.584c10.861,5.531,23.441-5.98,31.271-11.793
- c9.479-7.042,9.559-4.494,17.68-0.935c4.31,1.886,9.859,0.604,14.24-0.257c7.068-1.392,6.559-4.295,7.809,3.007
- c0.511,2.967,1.142,4.793,4.281,5.368c6.199,1.134,14.41-6.474,19.459-9.088c7.781-4.03,12.781,7.211,20.01,7.377
- c1.761,0.041,20.921-1.077,21.271-3.855c-2.103,16.68,20.539,13.895,29.289,8.055c2.881-1.921,8.489-6.17,7.028-10.505
- c0.33,0.991,23.691-2.849,27.16-2.972c7.031-0.253,14.941,5.469,22.021,6.716c4.729,0.834,23.938,0.697,23.938,8.655
- c0,2.387,1.062,6.259,1.619,8.908c1.371,6.47,10.291,0.191,11.92-1.959c3.222-4.266,3.431-11.291-0.618-14.871
- c11.799,10.438,37.989-10.603,53.549-5.495c6.25,2.051,12.262,4.254,18.78,5.438c6.41,1.163,9.841,8.033,13.8,12.488
- c8.069,9.087,15.92,8.389,25.649,1.832c3.131-2.109,5.32-6.426,7.33-9.559c5.201-8.067,11.471-9.585,19.201-11.403
- c2.52-0.593,18.389-3.592,17.449,4.743c-1.261,11.239,3.801,13.394,14.721,16.185c15.739,4.02,40.619-3.971,48.09-19.128
- c0.24-0.504,0.358-1.276-0.301-1.523c-5.449-2.032-13.101-2.344-16.562-7.442c-4.688-6.916-9.809-18.971-1.109-24.664
- c8.562-5.604,60.16-30.097,62.65-11.907c1.312,9.599,5.66,24.757-2.451,32.251c-3.77,3.481-8.59,5.937-11.897,9.924
- c-4.399,5.291-7.69,12.834-3.291,19.181c7.271,10.469,28.899,13.656,39.76,8.518c3.603-1.705,6.091-6.058,5.781-10.016
- c-0.281-3.522-4.74-11.356-0.461-13.417c9.43-4.536,18.131-10.545,26.66-16.541c5.688-4.002,16.938-16.411,23.909-12.506
- c9.211,5.159,2.99,9.945-1.25,16.479c-4.68,7.217-1.448,12.698,6.41,15.054c5.99,1.792,20.32,3.085,26.09,1.536
- c7.32-1.961,5.07-18.936,14.449-18.576c17.531,0.674,41.361,1.323,55.15,13.242c8.621,7.453,21.381,15.092,33.02,11.745
- c6.82-1.965,8.631-10.543,10.031-16.295c1.35-5.53,3.15-13.771,14.41-6.733c4.059,2.545,5.619,8.982,6.779,13.075
- c1.811,6.434,2.739,12.64,6.75,18.153c7.801,10.721,20.25,0.414,27.881-3.862c9.67-5.425,16.84-10.241,16.76-22.687
- c-0.031-3.82,11.59,6.921,12.279,7.288c6.74,3.585,14.09,5.721,21.02,8.898c6.49,2.976,21.09,14.073,28.531,7.986
- c3.279-2.686,4.309-4.839,5.42-9.009c1.93-7.238-2.441-13.312,7.58-11.488c8.959,1.631,17.74,3.284,26.26,6.574
- c9.359,3.613,12.369,13.551,20.68,18.297c7.369,4.214,17.66-1.707,22.642-6.891c6.32-6.566-3.551-16.045-7.142-20.81
- c-2.789-3.708-5.76-7.387-9.289-10.421c-6.342-5.459,19.101-14.447,21.828-15.068c8.922-2.029,18.33-0.81,26.861,2.1
- c10.65,3.631,1.76,15.629-0.689,21.409c-5.271,12.419,11.851,29.706,21.601,17.569c6.83-8.498,8.43-24.549,21.869-25.148
- c6.899-0.309,13.95,0.711,20.77,1.59c9.722,1.254,15.83,6.128,24.57,9.915c9.83,4.256,7.66,13.318,16.701,18.456
- c5.909,3.361,13.549,2.084,19.159-1.127c3.81-2.185,6.92-7.102,6.55-11.602c-0.601-7.284-4.029-7.41,5.399-7.222
- c13.51,0.271,15.812,8.316,23.83,16.089c9.271,8.978,23.801,8.594,35.41,6.07c6.811-1.481,13.199-4.864,19.1-8.444
- c2.632-1.603,4.052-2.968,6.24-5.068c12.51-11.997,13.16,5.23,13.76,9.458c0.972,6.767,6.851,7.736,12.449,5.075
- c7.74-3.681,11.791-15.362,14.562-22.742c1.68-4.487,6.95,1.705,9.721,3.406c2.959,1.825,4.629,2.399,7.851,3.579
- c7.76,2.848,17.221,0.43,25.149,0.043c8.67-0.424,15.029,3.696,23.26,4.67c12.439,1.473,17.199-5.935,29-6.328
- c8.302-0.277,16.439,5.067,24.619,6.064c7.471,0.913,13.892,0.422,21.08-1.613c10.82-3.066,18.75-11.283,22.649-21.539
- c0.49-1.295,0.701-7.057,3.451-7.288c6.119-0.519,13.709,4.34,18.469,7.315c6.609,4.118,15.689,9.696,20.57,15.749
- c1.949,2.427,0.529,9.962,1.65,13.064c1.539,4.263,3.07,7.666,7.188,9.942c17.222,9.535,45.42,8.859,63.121,0.732
- c2.729-1.254,1.408-3.582,1.398,2.016c0,6.032-0.011,12.064-0.021,18.098c-0.119,77.4-0.229,620.189-0.35,697.59
- c0-1.989,1.99-1.364-2.939-1.346c-4.621,0.02-9.24,0.038-13.861,0.057c-17.729,0.072-35.459,0.146-53.188,0.218
- c-152.449,0.618-304.899,1.237-457.358,1.856c-199.812,0.812-399.621,1.621-599.431,2.435
- c-136.381,0.554-272.771,1.106-409.161,1.661c-54.011,0.22-108.011-0.172-162.011-0.414c-171.52-0.771-343.04-1.543-514.558-2.313
- c-193.022-0.868-386.045-1.735-579.068-2.604c-66.175-0.299-132.351-0.596-198.526-0.895c-18.784-0.084-37.567-0.169-56.352-0.253
- c-4.976-0.022-9.952-0.045-14.928-0.067c-2.896-0.013-4.384-0.729-4.367,0.857C0.836,755.977,0.083,214.264-0.67,137.936
- c-0.047-4.703-0.093-9.406-0.14-14.108c-0.106-10.829,10.845-17.917,18.517-23.848c7.222-5.583,31.456-31.76,38.928-25.06
- c7.457,6.689,22.959,11.61,32.469,7.139c14.343-6.744,15.727-4.805,26.912,1.912c5.332,3.203,9.735,5.431,15.938,6.581
- c10.363,1.923,20.604,0.938,31.15,3.403c8.85,2.07,17.143,6.143,26.5,4.24c5.933-1.205,23.698-10.347,25.203-1.531
- c0.633,3.709,0.621,7.299,2.01,10.831c3.572,9.085,22.788,10.937,30.599,9.773c33.977-5.056,86.949-52.438,108.116-1.391
- c0.333,0.802,1.477,0.19,1.816-0.236c0.751-0.753,1.502-1.505,2.253-2.257c0.55-0.411,0.812-1.117,0.583-1.759
- c-2.64-7.42-9.351-18.925,1.646-24.922c0.718-0.392,1.543-1.796,0.474-2.286c-11.274-5.165-31.373-11.306-14.837-25.183
- c14.378-12.065,28.198-14.42,46.705-11.229c9.729,1.678,2.404,17.798,4.401,24.428c2.349,7.797,4.863,17.871,10.21,24.14
- c6.688,7.844,20.919,5.565,29.717,5.405c15.153-0.273,27.729,8.304,42.639,9.74c7.152,0.688,15.178-2.199,18.771-8.654
- c4.611-8.285,8.981-8.023,17.265-5.327c9.02,2.937,21.52-0.927,31.073,0.841c0.744,0.138,1.605-0.436,1.771-1.198
- c0.886-4.142,0.854-7.388,0.289-11.58c-2.686-19.995,17.52-12.673,26.493-9.058c20.811,8.383,42.666,13.622,63.826,20.995
- c0.738,0.258,1.595-0.531,1.771-1.198c1.821-6.949-1.38-19.674,7.754-18.303c8.691,1.305,17.734-0.05,26.302-1.6
- c8.216-1.486,16.093-4.426,23.46-8.288c2.26-1.185,4.688-2.978,6.435-4.802c5.807-6.07,16.021-1.077,22.275,1.254
- c4.926,1.836,10.454,5.406,15.961,2.809c7.127-3.361,14.694-6.343,22.375-3.297c5.639,2.235,10.903,5.447,16.508,7.808
- c8.907,3.752,18.657,3.407,27.216,8.223c6.613,3.722,11.507,12.904,19.261,14.344c1.385,0.257,2.418-0.925,3.246-1.793
- c1.274-1.337,2.092-3.646,2.987-5.231c8.719-15.386,16.998-8.686,25.492-4.349c2.739,1.399,7.896,3.129,10.747,0.585
- c5.131-4.576,11.433-0.791,18.103-1.193c11.375-0.686,20.448-12.297,23.993-22.089c3.155-8.713,14.104-2.275,21.622-0.819
- c5.09,0.985,10.051,2.165,14.979,3.771c3.178,1.095,6.082,2.71,8.715,4.846c0.442,11.784-3.523,17.679-11.898,17.683
- c-0.536,0.075-1.077,0.703-1.208,1.2c-4.932,18.862,15.938,13.546,27.107,9.917c9.381-3.047,18.346-7.252,27.42-11.069
- c16.33-6.864,32.91,10.948,49.74,8.511c3.33-0.482,5.42-1.528,8.029-3.545c8.199-6.336,15.659-10.836,25.689-13.945
- c9.72-3.01,18.729-4.658,28.851-1.748c8.75,2.516,15.609,6.041,24.899,5.742c7.05-0.228,13.43-7.627,20.59-6.229
- c7.72,1.508,11.9,7.356,20.33,7.031c6.8-0.263,13.45-2.192,20.29-2.407c10.76-0.34,2.12,18.321,1.45,22.335
- c-0.09,0.526,0.29,0.879,0.77,0.931c5.57,0.608,11,1.785,16.012-1.125c3.92-2.271,15.738-18.763,18.52-12.506
- c5.26,11.89,14.16,10.031,24.08,4.634c8.38-4.558,15.859-11.127,24.82-14.558c17.05-6.521,27.75,5.62,42.76,9.052
- c3.029,0.692,5.67-1.979,7.64-3.762c13.91-12.581,29.78-14.418,47.3-8.651c18.78,6.182,38.472,59.347,62.631,31.469
- c4.119-4.754,6.08-11.248,7.221-17.28c1.97-10.476-7.7-10.817,10.529-12.134c6.41-0.463,12.859,0.196,19.301-0.269
- c4.68-0.338,3.93-2.855,4.068,1.711c0.211,6.383,0.41,12.766,0.62,19.147C1487.439,100.276,1489.76,99.191,1489.72,97.922
- L1489.72,97.922z"/>
- </g>
-</g>
-<path id="svg_350" style="fill:#71AFC0;" d="M1717.629,185.222c2.191,0,4.221-4.443,1.432-4.443
- C1716.87,180.778,1714.84,185.222,1717.629,185.222L1717.629,185.222z"/>
-<g>
- <g>
- <g>
- <path style="fill:#88BABC;" d="M2448.95,68.241l-8.15,23.809l23.82,8.149l8.142-23.812L2448.95,68.241z M2443.469,90.748
- l6.791-19.844l1.879,0.642l-6.789,19.844L2443.469,90.748z M2447,91.956l6.789-19.844l1.951,0.67l-6.791,19.841L2447,91.956z
- M2450.61,93.19l6.791-19.842l1.948,0.668l-6.789,19.843L2450.61,93.19z M2454.209,94.424L2461,74.581l1.959,0.67l-6.789,19.843
- L2454.209,94.424z M2457.821,95.659l6.789-19.843l1.961,0.666l-6.802,19.845L2457.821,95.659z M2463.311,97.536l-1.881-0.643
- l6.789-19.842l1.881,0.643L2463.311,97.536z"/>
- </g>
- </g>
-</g>
-</svg>
diff --git a/docs/theme/mkdocs/img/favicon.png b/docs/theme/mkdocs/img/favicon.png
deleted file mode 100644
index ee01a5ee8a..0000000000
--- a/docs/theme/mkdocs/img/favicon.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/img/footer/angellist-white.svg b/docs/theme/mkdocs/img/footer/angellist-white.svg
deleted file mode 100644
index 5c52f3a832..0000000000
--- a/docs/theme/mkdocs/img/footer/angellist-white.svg
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- viewBox="0 0 612 792" enable-background="new 0 0 612 792" xml:space="preserve">
-<g>
- <path fill="#FFFFFF" d="M491.4,338c32.8,5,55.5,20.2,68.1,40.4c12.6,20.2,20.2,55.5,20.2,100.9c0,90.8-27.7,166.5-83.2,224.5
- c-55.5,58-126.1,88.3-211.9,88.3c-32.8,0-65.6-5-98.4-17.7c-32.8-12.6-58-30.3-80.7-50.4c-25.2-22.7-45.4-50.4-58-75.7
- c-10.1-27.7-17.7-55.5-17.7-83.2c0-30.3,7.6-55.5,20.2-73.1c12.6-17.7,35.3-27.7,63.1-35.3c-5-12.6-10.1-22.7-12.6-32.8
- c-2.5-7.6-5-15.1-5-20.2c0-15.1,7.6-32.8,25.2-50.4c17.7-17.7,32.8-25.2,47.9-25.2c7.6,0,12.6,0,20.2,2.5c7.6,2.5,15.1,5,25.2,12.6
- c-22.7-75.7-45.4-138.7-58-181.6s-17.7-70.6-17.7-88.3c0-22.7,5-40.4,17.7-53C166,7.6,183.7,0,203.8,0
- c32.8,0,75.7,75.7,128.6,229.5c10.1,25.2,15.1,45.4,20.2,60.5c5-10.1,10.1-27.7,17.7-47.9c53-151.3,98.4-227,133.7-227
- c17.7,0,32.8,5,45.4,17.7c10.1,12.6,17.7,30.3,17.7,50.4c0,15.1-5,45.4-17.7,88.3C534.3,214.4,516.6,269.9,491.4,338z M103,559.9
- c5,5,12.6,15.1,20.2,27.7c22.7,32.8,45.4,50.4,65.6,50.4c7.6,0,12.6-2.5,17.7-7.6c5-5,7.6-10.1,7.6-12.6c0-5-2.5-15.1-10.1-27.7
- s-17.7-27.7-30.3-42.9c-15.1-17.7-27.7-32.8-35.3-40.4c-10.1-7.6-17.7-12.6-22.7-12.6c-12.6,0-25.2,7.6-35.3,20.2
- c-10.1,12.6-15.1,30.3-15.1,47.9c0,15.1,2.5,30.3,10.1,50.4c7.6,17.7,17.7,37.8,32.8,55.5c22.7,25.2,47.9,47.9,80.7,63.1
- c32.8,15.1,65.6,22.7,105.9,22.7c70.6,0,128.6-25.2,176.6-78.2c47.9-53,70.6-118.5,70.6-199.3c0-25.2-2.5-42.9-5-58
- c-2.5-15.1-10.1-25.2-17.7-30.3c-15.1-12.6-42.9-22.7-85.8-32.8s-88.3-15.1-133.7-15.1c-12.6,0-22.7,2.5-27.7,7.6
- c-5,5-7.6,12.6-7.6,22.7c0,25.2,12.6,42.9,40.4,53c27.7,10.1,73.1,17.7,133.7,17.7h22.7c5,0,10.1,2.5,12.6,5c2.5,5,5,10.1,5,17.7
- c-5,5-17.7,12.6-37.8,20.2s-32.8,15.1-42.9,22.7c-22.7,15.1-40.4,35.3-53,58c-12.6,22.7-20.2,42.9-20.2,63.1
- c0,12.6,2.5,25.2,7.6,42.9c5,17.7,7.6,27.7,7.6,30.3v5v5c-15.1,0-27.7-10.1-37.8-27.7c-10.1-17.7-12.6-40.4-12.6-70.6v-5
- c-2.5,2.5-5,5-7.6,5c-2.5,0-5,2.5-10.1,2.5c-2.5,0-7.6,0-10.1,0c-2.5,0-5-2.5-10.1-2.5c0,5,2.5,7.6,2.5,12.6s0,7.6,0,10.1
- c0,12.6-5,25.2-15.1,35.3c-10.1,10.1-22.7,15.1-37.8,15.1c-22.7,0-45.4-10.1-70.6-32.8c-22.7-22.7-35.3-42.9-35.3-65.6
- c0-5,0-7.6,2.5-10.1C97.9,565,100.4,562.5,103,559.9z M266.9,572.6c5,0,12.6-2.5,17.7-7.6c5-5,7.6-12.6,7.6-17.7
- c0-7.6-5-22.7-15.1-47.9c-10.1-25.2-22.7-50.4-37.8-73.1c-10.1-17.7-22.7-32.8-32.8-40.4c-10.1-10.1-20.2-12.6-30.3-12.6
- c-7.6,0-15.1,5-25.2,15.1s-12.6,17.7-12.6,27.7c0,7.6,5,22.7,12.6,40.4c10.1,17.7,20.2,35.3,35.3,55.5
- c15.1,20.2,30.3,37.8,45.4,50.4C246.7,567.5,256.8,572.6,266.9,572.6z M319.9,310.2l-60.5-169c-15.1-42.9-25.2-73.1-35.3-85.8
- c-7.6-12.6-15.1-20.2-25.2-20.2c-7.6,0-12.6,2.5-17.7,7.6c-7.6,7.6-10.1,15.1-10.1,25.2c0,17.7,7.6,45.4,20.2,85.8
- s32.8,95.8,58,161.4c2.5-5,5-7.6,10.1-7.6c5-2.5,10.1-2.5,15.1-2.5c2.5,0,7.6,0,12.6,0C294.6,307.7,304.7,307.7,319.9,310.2z
- M380.4,474.2c-15.1,0-30.3-2.5-45.4-5s-27.7-5-40.4-10.1c5,12.6,10.1,22.7,15.1,35.3c5,12.6,7.6,22.7,10.1,35.3
- c7.6-10.1,17.7-20.2,27.7-30.3C360.2,489.3,370.3,481.8,380.4,474.2z M453.6,327.9c25.2-65.6,42.9-121.1,58-163.9
- c12.6-42.9,20.2-68.1,20.2-78.2s-2.5-17.7-7.6-25.2c-5-5-10.1-7.6-17.7-7.6c-10.1,0-20.2,7.6-30.3,25.2
- c-10.1,17.7-22.7,42.9-35.3,80.7l-55.5,156.4L453.6,327.9z"/>
-</g>
-</svg>
diff --git a/docs/theme/mkdocs/img/footer/arrowhead-submit-email-icon.svg b/docs/theme/mkdocs/img/footer/arrowhead-submit-email-icon.svg
deleted file mode 100644
index 0fc1e6c978..0000000000
--- a/docs/theme/mkdocs/img/footer/arrowhead-submit-email-icon.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" height="11px" width="15px" > <path fill="rgb( 168, 173, 175 )" d="M8.86300000000006,1.02799999999979 C8.86300000000006,1.02799999999979 12.385,4.77300000000014 12.385,4.77300000000014 C12.385,4.77300000000014 0,4.77300000000014 0,4.77300000000014 C0,4.77300000000014 0,6.22699999999986 0,6.22699999999986 C0,6.22699999999986 12.386,6.22699999999986 12.386,6.22699999999986 C12.386,6.22699999999986 8.86300000000006,9.97299999999996 8.86300000000006,9.97299999999996 C8.86300000000006,9.97299999999996 9.82899999999995,11 9.82899999999995,11 C9.82899999999995,11 15,5.5 15,5.5 C15,5.5 9.82899999999995,0 9.82899999999995,0 C9.82899999999995,0 8.86300000000006,1.02799999999979 8.86300000000006,1.02799999999979 Z "/> </svg> \ No newline at end of file
diff --git a/docs/theme/mkdocs/img/footer/docker-blog-24.png b/docs/theme/mkdocs/img/footer/docker-blog-24.png
deleted file mode 100644
index d04768feb5..0000000000
--- a/docs/theme/mkdocs/img/footer/docker-blog-24.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/img/footer/docker-blog-48.png b/docs/theme/mkdocs/img/footer/docker-blog-48.png
deleted file mode 100644
index efffca0ad6..0000000000
--- a/docs/theme/mkdocs/img/footer/docker-blog-48.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/img/footer/facebook-24.png b/docs/theme/mkdocs/img/footer/facebook-24.png
deleted file mode 100755
index f34d73c7dd..0000000000
--- a/docs/theme/mkdocs/img/footer/facebook-24.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/img/footer/facebook-48.png b/docs/theme/mkdocs/img/footer/facebook-48.png
deleted file mode 100755
index bb213a10dd..0000000000
--- a/docs/theme/mkdocs/img/footer/facebook-48.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/img/footer/googleplus-24.png b/docs/theme/mkdocs/img/footer/googleplus-24.png
deleted file mode 100755
index 535d879acc..0000000000
--- a/docs/theme/mkdocs/img/footer/googleplus-24.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/img/footer/googleplus-48.png b/docs/theme/mkdocs/img/footer/googleplus-48.png
deleted file mode 100755
index 002b3a9032..0000000000
--- a/docs/theme/mkdocs/img/footer/googleplus-48.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/img/footer/slideshare-24.png b/docs/theme/mkdocs/img/footer/slideshare-24.png
deleted file mode 100755
index 1734ddc7d4..0000000000
--- a/docs/theme/mkdocs/img/footer/slideshare-24.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/img/footer/slideshare-48.png b/docs/theme/mkdocs/img/footer/slideshare-48.png
deleted file mode 100755
index 3cdec03402..0000000000
--- a/docs/theme/mkdocs/img/footer/slideshare-48.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/img/footer/sprites-small_360.png b/docs/theme/mkdocs/img/footer/sprites-small_360.png
deleted file mode 100644
index 92af5c7092..0000000000
--- a/docs/theme/mkdocs/img/footer/sprites-small_360.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/img/footer/twitter-24.png b/docs/theme/mkdocs/img/footer/twitter-24.png
deleted file mode 100755
index 2acab394aa..0000000000
--- a/docs/theme/mkdocs/img/footer/twitter-24.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/img/footer/twitter-48.png b/docs/theme/mkdocs/img/footer/twitter-48.png
deleted file mode 100755
index 75509e9750..0000000000
--- a/docs/theme/mkdocs/img/footer/twitter-48.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/img/footer/youtube-24.png b/docs/theme/mkdocs/img/footer/youtube-24.png
deleted file mode 100755
index 3e100ed5aa..0000000000
--- a/docs/theme/mkdocs/img/footer/youtube-24.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/img/footer/youtube-48.png b/docs/theme/mkdocs/img/footer/youtube-48.png
deleted file mode 100755
index 3837d3d2ab..0000000000
--- a/docs/theme/mkdocs/img/footer/youtube-48.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/img/form/check-mark-green.svg b/docs/theme/mkdocs/img/form/check-mark-green.svg
deleted file mode 100644
index 4f4efc67bd..0000000000
--- a/docs/theme/mkdocs/img/form/check-mark-green.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" height="14px" width="17px" > <path fill="rgb( 102, 191, 105 )" d="M14.343,0 C14.343,0 6.375,7.846 6.375,7.846 C6.375,7.846 2.65600000000006,4.18399999999997 2.65600000000006,4.18399999999997 C2.65600000000006,4.18399999999997 0,6.80000000000018 0,6.80000000000018 C0,6.80000000000018 6.375,13.077 6.375,13.077 C6.375,13.077 17,2.61500000000001 17,2.61500000000001 C17,2.61500000000001 14.343,0 14.343,0 Z "/> </svg> \ No newline at end of file
diff --git a/docs/theme/mkdocs/img/form/padlock-icon-active.svg b/docs/theme/mkdocs/img/form/padlock-icon-active.svg
deleted file mode 100644
index 9518bc6059..0000000000
--- a/docs/theme/mkdocs/img/form/padlock-icon-active.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" height="12px" width="9px" > <path fill="rgb( 85, 85, 85 )" d="M7.5,12 C7.5,12 1.5,12 1.5,12 C0.67200000000003,12 0,11.328 0,10.5 C0,10.5 0,6.75 0,6.75 C0,5.92200000000003 0.67200000000003,5.25 1.5,5.25 C1.5,5.25 7.5,5.25 7.5,5.25 C8.32799999999997,5.25 9,5.92200000000003 9,6.75 C9,6.75 9,10.5 9,10.5 C9,11.328 8.32799999999997,12 7.5,12 ZM6,3 C6,2.173 5.327,1.5 4.5,1.5 C3.673,1.5 3,2.17200000000003 3,3 C3,3 3,4.93299999999999 3,4.93299999999999 C3,4.93299999999999 1.5,4.93299999999999 1.5,4.93299999999999 C1.5,4.93299999999999 1.5,3 1.5,3 C1.5,1.346 2.846,0 4.5,0 C6.15499999999997,0 7.5,1.346 7.5,3 C7.5,3 7.5,4.93299999999999 7.5,4.93299999999999 C7.5,4.93299999999999 6,4.93299999999999 6,4.93299999999999 C6,4.93299999999999 6,3 6,3 Z "/> </svg> \ No newline at end of file
diff --git a/docs/theme/mkdocs/img/form/padlock-icon-inactive.svg b/docs/theme/mkdocs/img/form/padlock-icon-inactive.svg
deleted file mode 100644
index 174434a3f1..0000000000
--- a/docs/theme/mkdocs/img/form/padlock-icon-inactive.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" height="12px" width="9px" > <path fill="rgb( 174, 174, 174 )" d="M7.5,12 C7.5,12 1.5,12 1.5,12 C0.67200000000003,12 0,11.328 0,10.5 C0,10.5 0,6.75 0,6.75 C0,5.92200000000003 0.67200000000003,5.25 1.5,5.25 C1.5,5.25 7.5,5.25 7.5,5.25 C8.32799999999997,5.25 9,5.92200000000003 9,6.75 C9,6.75 9,10.5 9,10.5 C9,11.328 8.32799999999997,12 7.5,12 ZM6,3 C6,2.173 5.327,1.5 4.5,1.5 C3.673,1.5 3,2.17200000000003 3,3 C3,3 3,4.93299999999999 3,4.93299999999999 C3,4.93299999999999 1.5,4.93299999999999 1.5,4.93299999999999 C1.5,4.93299999999999 1.5,3 1.5,3 C1.5,1.346 2.846,0 4.5,0 C6.15499999999997,0 7.5,1.346 7.5,3 C7.5,3 7.5,4.93299999999999 7.5,4.93299999999999 C7.5,4.93299999999999 6,4.93299999999999 6,4.93299999999999 C6,4.93299999999999 6,3 6,3 Z "/> </svg> \ No newline at end of file
diff --git a/docs/theme/mkdocs/img/icons/README.md b/docs/theme/mkdocs/img/icons/README.md
deleted file mode 100644
index 6bd32ae6e5..0000000000
--- a/docs/theme/mkdocs/img/icons/README.md
+++ /dev/null
@@ -1,7 +0,0 @@
-### About the images
-
-Generally the icons are created in .svg, because it is a nicer format. Then we can easily convert them to .png as required.
-
-Using imagemagick; mogrify:
-
-mogrify -background none -format png *.svg
diff --git a/docs/theme/mkdocs/img/icons/caret-down-create-new-icon.svg b/docs/theme/mkdocs/img/icons/caret-down-create-new-icon.svg
deleted file mode 100644
index a07012c629..0000000000
--- a/docs/theme/mkdocs/img/icons/caret-down-create-new-icon.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="10px" height="5.7px" viewBox="2.7 1.7 10 5.7" style="enable-background:new 2.7 1.7 10 5.7;" xml:space="preserve">
-<polygon style="fill:#FFFCFC;" points="12.7,2.4 11.9,1.7 7.7,5.9 3.4,1.7 2.7,2.4 6.9,6.7 6.9,6.7 7.7,7.4 8.4,6.7 8.4,6.7 "/>
-</svg>
diff --git a/docs/theme/mkdocs/img/icons/cloud-download-dashboard-icon.svg b/docs/theme/mkdocs/img/icons/cloud-download-dashboard-icon.svg
deleted file mode 100644
index 031da70972..0000000000
--- a/docs/theme/mkdocs/img/icons/cloud-download-dashboard-icon.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" height="28px" width="31px" > <path fill="rgb( 148, 156, 167 )" d="M23.86,20.961 C23.86,20.961 16.347,20.961 16.347,20.961 C16.347,20.961 16.347,19.801 16.347,19.801 C16.347,19.801 23.861,19.801 23.861,19.801 C27.147,19.801 29.8200000000001,17.171 29.8200000000001,13.937 C29.8200000000001,11.039 27.622,8.54599999999999 24.705,8.13799999999998 C24.514,8.11099999999999 24.348,7.99400000000003 24.2619999999999,7.82400000000001 C23.14,5.63 20.7089999999999,4.39999999999998 18.119,4.98899999999998 C17.833,5.05399999999997 17.544,4.90300000000002 17.437,4.63499999999999 C16.597,2.524 14.566,1.16000000000003 12.268,1.16000000000003 C9.20500000000004,1.16000000000003 6.71400000000006,3.61200000000002 6.71400000000006,6.62599999999998 C6.71400000000006,6.88200000000001 6.73800000000006,7.15899999999999 6.78800000000001,7.47399999999999 C6.81299999999999,7.62700000000001 6.77200000000005,7.78399999999999 6.67899999999997,7.90899999999999 C6.58600000000001,8.03399999999999 6.44500000000005,8.11599999999999 6.28999999999996,8.13799999999998 C3.37599999999998,8.54899999999998 1.17899999999997,11.042 1.17899999999997,13.936 C1.17899999999997,17.17 3.85299999999995,19.801 7.13999999999999,19.801 C7.13999999999999,19.801 12.783,19.801 12.783,19.801 C12.783,19.801 12.783,20.961 12.783,20.961 C12.783,20.961 7.13999999999999,20.961 7.13999999999999,20.961 C3.20299999999997,20.961 0,17.81 0,13.936 C0,10.658 2.35000000000002,7.81200000000001 5.55399999999997,7.09399999999999 C5.54100000000005,6.93200000000002 5.53300000000002,6.77600000000001 5.53300000000002,6.62599999999998 C5.53300000000002,2.97199999999998 8.55499999999995,0 12.2670000000001,0 C14.89,0 17.223,1.46199999999999 18.338,3.76499999999999 C21.177,3.31799999999998 23.826,4.67399999999998 25.172,7.03699999999998 C28.515,7.65100000000001 31,10.565 31,13.937 C31,17.81 27.796,20.961 23.86,20.961 ZM11.477,23.678 C11.477,23.678 13.833,25.996 13.833,25.996 C13.833,25.996 13.833,9.91699999999997 13.833,9.91699999999997 C13.833,9.58999999999997 14.102,9.32400000000001 14.436,9.32400000000001 C14.768,9.32400000000001 15.037,9.58999999999997 15.037,9.91699999999997 C15.037,9.91699999999997 15.037,25.977 15.037,25.977 C15.037,25.977 17.374,23.678 17.374,23.678 C17.607,23.447 17.989,23.447 18.224,23.678 C18.461,23.909 18.461,24.285 18.224,24.517 C18.224,24.517 14.861,27.827 14.861,27.827 C14.746,27.94 14.592,28 14.432,28 C14.432,28 14.429,27.999 14.425,27.999 C14.425,27.999 14.414,28 14.414,28 C14.2619999999999,28 14.107,27.943 13.989,27.827 C13.989,27.827 10.626,24.517 10.626,24.517 C10.39,24.285 10.39,23.909 10.626,23.678 C10.862,23.447 11.2430000000001,23.447 11.477,23.678 Z "/> </svg> \ No newline at end of file
diff --git a/docs/theme/mkdocs/img/icons/comment-simple.png b/docs/theme/mkdocs/img/icons/comment-simple.png
deleted file mode 100644
index 034b6ec465..0000000000
--- a/docs/theme/mkdocs/img/icons/comment-simple.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/img/icons/comment-simple.svg b/docs/theme/mkdocs/img/icons/comment-simple.svg
deleted file mode 100644
index d7c4206f79..0000000000
--- a/docs/theme/mkdocs/img/icons/comment-simple.svg
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
- <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
-]>
-<svg version="1.1"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
- x="0px" y="0px" width="24px" height="24px" viewBox="-1.061 -6.342 24 24"
- overflow="visible" enable-background="new -1.061 -6.342 24 24" xml:space="preserve">
-<defs>
-</defs>
-<path fill="#807C74" d="M21.878,7.515c0,1.639-1.329,2.968-2.967,2.968L15.2,14.316l0.835-3.803L2.968,10.503
- C1.329,10.503,0,9.176,0,7.534V2.992c0-1.64,1.329-2.969,2.968-2.969L18.911,0c1.638,0,2.967,1.329,2.967,2.97V7.515z"/>
-</svg>
diff --git a/docs/theme/mkdocs/img/icons/framed-icon-checked-repository.png b/docs/theme/mkdocs/img/icons/framed-icon-checked-repository.png
deleted file mode 100644
index 57dbeb94f5..0000000000
--- a/docs/theme/mkdocs/img/icons/framed-icon-checked-repository.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/img/icons/framed-icon-checked-repository.svg b/docs/theme/mkdocs/img/icons/framed-icon-checked-repository.svg
deleted file mode 100644
index 3598f1a67a..0000000000
--- a/docs/theme/mkdocs/img/icons/framed-icon-checked-repository.svg
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
- <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
-]>
-<svg version="1.1"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
- x="0px" y="0px" width="80px" height="80px" viewBox="-3.208 -6.686 80 80"
- overflow="visible" enable-background="new -3.208 -6.686 80 80" xml:space="preserve">
-<defs>
-</defs>
-<rect x="5.766" y="12.203" fill="none" stroke="#61594D" stroke-width="1.0106" stroke-miterlimit="10" width="61.344" height="43.301"/>
-<rect x="0.954" y="7.391" fill="none" stroke="#61594D" stroke-width="1.9073" stroke-miterlimit="10" width="70.969" height="52.925"/>
-<g>
- <path fill="#FFFFFF" d="M37.043,54.814c-0.42,0-0.829-0.177-1.117-0.499c-4.151-4.631-17.456-19.042-23.918-24.341
- c-0.462-0.38-0.655-0.997-0.491-1.572c0.165-0.575,0.655-0.998,1.248-1.075l11.175-1.459c0.065-0.009,0.13-0.013,0.194-0.013
- c0.45,0,0.88,0.202,1.167,0.558l9.429,11.666c3.822-5.974,15.658-24.065,26.341-36.076c0.285-0.32,0.693-0.503,1.121-0.503
- c0.013,0,0.027,0,0.04,0.001c0.488,0.013,1.225,0.016,2.044,0.019c1.836,0.007,3.918,0.015,4.915,0.131
- c0.585,0.069,1.076,0.474,1.255,1.034c0.179,0.562,0.013,1.175-0.424,1.569c-12.467,11.253-30.379,44.05-31.509,49.372
- c-0.117,0.553-0.535,0.992-1.081,1.138C37.302,54.798,37.172,54.814,37.043,54.814z"/>
- <path fill="#FFFFFF" d="M62.191,3c1.529,0.041,5.474-0.018,6.824,0.141c-12.833,11.583-30.78,44.561-31.972,50.174
- c-3.533-3.941-17.288-18.928-24.084-24.5l11.175-1.459l10.742,13.292C34.876,40.648,49.442,17.334,62.191,3 M62.191,0
- c-0.855,0-1.671,0.365-2.242,1.006c-9.825,11.047-20.731,27.383-25.356,34.518L26.468,25.47c-0.574-0.71-1.434-1.114-2.333-1.114
- c-0.129,0-0.259,0.009-0.389,0.025L12.571,25.84c-1.187,0.154-2.167,1-2.496,2.149c-0.329,1.15,0.057,2.387,0.982,3.146
- c6.39,5.239,19.621,19.573,23.752,24.183c0.577,0.644,1.394,0.997,2.234,0.997c0.258,0,0.518-0.033,0.774-0.102
- c1.091-0.291,1.926-1.171,2.161-2.275c1.109-5.225,18.753-37.474,31.047-48.57c0.874-0.789,1.206-2.017,0.848-3.139
- s-1.339-1.931-2.509-2.067c-1.003-0.117-2.74-0.133-5.083-0.142c-0.805-0.003-1.53-0.006-2.009-0.019C62.245,0,62.218,0,62.191,0
- L62.191,0z"/>
- <path fill="none" stroke="#61594D" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
- M12.959,28.814c6.796,5.572,20.551,20.559,24.084,24.5c1.191-5.613,19.139-38.591,31.972-50.174C67.665,2.982,63.72,3.041,62.191,3
- C49.442,17.334,34.876,40.648,34.876,40.647L24.134,27.355L12.959,28.814z"/>
-</g>
-</svg>
diff --git a/docs/theme/mkdocs/img/icons/framed-icon-empty-repository.png b/docs/theme/mkdocs/img/icons/framed-icon-empty-repository.png
deleted file mode 100644
index cb6cc59865..0000000000
--- a/docs/theme/mkdocs/img/icons/framed-icon-empty-repository.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/img/icons/framed-icon-empty-repository.svg b/docs/theme/mkdocs/img/icons/framed-icon-empty-repository.svg
deleted file mode 100644
index dc2017d9ef..0000000000
--- a/docs/theme/mkdocs/img/icons/framed-icon-empty-repository.svg
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
- <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
-]>
-<svg version="1.1"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
- x="0px" y="0px" width="80px" height="80px" viewBox="-3.207 -13.122 80 80"
- overflow="visible" enable-background="new -3.207 -13.122 80 80" xml:space="preserve">
-<defs>
-</defs>
-<rect x="5.766" y="5.767" fill="none" stroke="#61594D" stroke-width="1.0106" stroke-miterlimit="10" width="61.344" height="43.301"/>
-<rect x="0.954" y="0.954" fill="none" stroke="#61594D" stroke-width="1.9073" stroke-miterlimit="10" width="70.969" height="52.925"/>
-</svg>
diff --git a/docs/theme/mkdocs/img/icons/framed-icon-linked-repository.png b/docs/theme/mkdocs/img/icons/framed-icon-linked-repository.png
deleted file mode 100644
index cf804ae47d..0000000000
--- a/docs/theme/mkdocs/img/icons/framed-icon-linked-repository.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/img/icons/framed-icon-linked-repository.svg b/docs/theme/mkdocs/img/icons/framed-icon-linked-repository.svg
deleted file mode 100644
index fad0392967..0000000000
--- a/docs/theme/mkdocs/img/icons/framed-icon-linked-repository.svg
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
- <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
-]>
-<svg version="1.1"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
- x="0px" y="0px" width="80px" height="80px" viewBox="-3.207 -13.122 80 80"
- overflow="visible" enable-background="new -3.207 -13.122 80 80" xml:space="preserve">
-<defs>
-</defs>
-<path fill="none" stroke="#61594D" stroke-width="2.1617" stroke-miterlimit="10" d="M42.432,17.523
- c-1.643,0.161-3.166,0.732-4.467,1.608c2.182,2.011,3.551,4.888,3.551,8.08c0,6.056-4.926,10.985-10.984,10.985
- c-6.056,0-10.984-4.93-10.984-10.985s4.928-10.984,10.984-10.984c0.138,0,0.275,0.004,0.414,0.008
- c1.267-1.434,2.779-2.651,4.47-3.58c-1.535-0.516-3.178-0.796-4.884-0.796c-8.466,0-15.353,6.887-15.353,15.353
- s6.887,15.353,15.353,15.353c8.465,0,15.353-6.887,15.353-15.353C45.885,23.54,44.589,20.168,42.432,17.523z"/>
-<path fill="none" stroke="#61594D" stroke-width="2.1617" stroke-miterlimit="10" d="M43.388,11.859
- c-8.464,0-15.352,6.887-15.352,15.353c0,3.672,1.294,7.044,3.453,9.688c1.643-0.161,3.165-0.731,4.468-1.607
- c-2.183-2.01-3.551-4.888-3.551-8.081c0-6.056,4.925-10.984,10.983-10.984c6.057,0,10.985,4.929,10.985,10.984
- s-4.928,10.985-10.985,10.985c-0.138,0-0.274-0.004-0.413-0.01c-1.269,1.436-2.781,2.652-4.47,3.581
- c1.534,0.518,3.176,0.796,4.883,0.796c8.467,0,15.354-6.887,15.354-15.353S51.855,11.859,43.388,11.859z"/>
-<rect x="5.766" y="5.767" fill="none" stroke="#61594D" stroke-width="1.0106" stroke-miterlimit="10" width="61.344" height="43.301"/>
-<rect x="0.954" y="0.954" fill="none" stroke="#61594D" stroke-width="1.9073" stroke-miterlimit="10" width="70.969" height="52.925"/>
-</svg>
diff --git a/docs/theme/mkdocs/img/icons/framed-icon-normal-repository.png b/docs/theme/mkdocs/img/icons/framed-icon-normal-repository.png
deleted file mode 100644
index 801f530699..0000000000
--- a/docs/theme/mkdocs/img/icons/framed-icon-normal-repository.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/img/icons/framed-icon-normal-repository.svg b/docs/theme/mkdocs/img/icons/framed-icon-normal-repository.svg
deleted file mode 100644
index b4a8898107..0000000000
--- a/docs/theme/mkdocs/img/icons/framed-icon-normal-repository.svg
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
- <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
-]>
-<svg version="1.1"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
- x="0px" y="0px" width="80px" height="80px" viewBox="-3.207 -13.122 80 80"
- overflow="visible" enable-background="new -3.207 -13.122 80 80" xml:space="preserve">
-<defs>
-</defs>
-<path fill="none" stroke="#61594D" stroke-width="2.4057" stroke-miterlimit="10" d="M12.981,48.299l22.554,0.168
- c0.114-0.186,0.235-0.387,0.364-0.604"/>
-<path fill="none" stroke="#61594D" stroke-width="2.4057" stroke-miterlimit="10" d="M35.899,47.863
- c0.983-1.663,2.321-4.137,3.846-5.712c8.494,3.292,16.54,1.502,21.238-1.829c-2.895-5.689-3.551-7.998-14.021-7.794
- c2.274-8.456-3.161-13.591-6.828-17.14c-4.713,6.089-8.208,13.362-4.485,20.521c-7.006,0.11-19.571,7.109-22.434,11.953"/>
-<rect x="5.766" y="5.767" fill="none" stroke="#61594D" stroke-width="1.0106" stroke-miterlimit="10" width="61.343" height="43.301"/>
-<rect x="0.954" y="0.954" fill="none" stroke="#61594D" stroke-width="1.9073" stroke-miterlimit="10" width="70.968" height="52.925"/>
-</svg>
diff --git a/docs/theme/mkdocs/img/icons/framed-icon-official-repository.png b/docs/theme/mkdocs/img/icons/framed-icon-official-repository.png
deleted file mode 100644
index e60afdb858..0000000000
--- a/docs/theme/mkdocs/img/icons/framed-icon-official-repository.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/img/icons/framed-icon-official-repository.svg b/docs/theme/mkdocs/img/icons/framed-icon-official-repository.svg
deleted file mode 100644
index 8eadb6fe10..0000000000
--- a/docs/theme/mkdocs/img/icons/framed-icon-official-repository.svg
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
- <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
-]>
-<svg version="1.1"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
- x="0px" y="0px" width="80px" height="80px" viewBox="-3.209 -13.12 80 80"
- overflow="visible" enable-background="new -3.209 -13.12 80 80" xml:space="preserve">
-<defs>
-</defs>
-<rect x="5.767" y="5.767" fill="none" stroke="#61594D" stroke-width="1.0106" stroke-miterlimit="10" width="61.344" height="43.301"/>
-<rect x="0.954" y="0.954" fill="none" stroke="#61594D" stroke-width="1.9073" stroke-miterlimit="10" width="70.969" height="52.926"/>
-<g>
- <path fill="#FFFFFF" d="M59.302,26.634c0,12.289-9.963,22.254-22.254,22.254s-22.254-9.965-22.254-22.254
- c0-12.291,9.963-22.254,22.254-22.254S59.302,14.343,59.302,26.634z M37.048,11.228c-8.508,0-15.406,6.898-15.406,15.406
- s6.898,15.404,15.406,15.404s15.406-6.896,15.406-15.404S45.556,11.228,37.048,11.228z"/>
- <path fill="none" stroke="#FFFFFF" stroke-width="5.9714" stroke-miterlimit="10" d="M59.302,26.634
- c0,12.289-9.963,22.254-22.254,22.254s-22.254-9.965-22.254-22.254c0-12.291,9.963-22.254,22.254-22.254
- S59.302,14.343,59.302,26.634z M37.048,11.228c-8.508,0-15.406,6.898-15.406,15.406s6.898,15.404,15.406,15.404
- s15.406-6.896,15.406-15.404S45.556,11.228,37.048,11.228z"/>
- <path fill="none" stroke="#61594D" stroke-width="1.9677" stroke-miterlimit="10" d="M59.302,26.634
- c0,12.289-9.963,22.254-22.254,22.254s-22.254-9.965-22.254-22.254c0-12.291,9.963-22.254,22.254-22.254
- S59.302,14.343,59.302,26.634z M37.048,11.228c-8.508,0-15.406,6.898-15.406,15.406s6.898,15.404,15.406,15.404
- s15.406-6.896,15.406-15.404S45.556,11.228,37.048,11.228z"/>
-</g>
-<rect x="12.804" y="19.217" transform="matrix(0.9777 -0.2102 0.2102 0.9777 -4.8318 8.4803)" fill="#FFFFFF" stroke="#61594D" stroke-width="1.9677" stroke-miterlimit="10" width="49.352" height="15.509"/>
-<path fill="#61594D" d="M18.196,28.699c-0.248-1.142,0.21-1.924,1.31-2.164c1.1-0.239,1.843,0.28,2.091,1.422l0.809,3.706
- c0.248,1.14-0.21,1.923-1.31,2.162c-1.1,0.24-1.843-0.28-2.091-1.42L18.196,28.699z M20.14,32.232
- c0.111,0.509,0.378,0.653,0.734,0.575c0.356-0.077,0.538-0.32,0.428-0.828l-0.84-3.85c-0.111-0.51-0.377-0.653-0.734-0.576
- c-0.355,0.078-0.538,0.32-0.427,0.83L20.14,32.232z"/>
-<path fill="#61594D" d="M25.39,28.655l1.445-0.315l0.223,1.018l-1.445,0.315l0.642,2.942l-1.12,0.244l-1.555-7.127l2.963-0.646
- l0.223,1.018l-1.844,0.401L25.39,28.655z"/>
-<path fill="#61594D" d="M30.524,27.535l1.445-0.314l0.223,1.018l-1.445,0.314l0.642,2.942l-1.12,0.245l-1.555-7.127l2.963-0.646
- l0.223,1.018l-1.844,0.401L30.524,27.535z"/>
-<path fill="#61594D" d="M33.848,23.493l1.12-0.244l1.555,7.127l-1.12,0.244L33.848,23.493z"/>
-<path fill="#61594D" d="M41.636,26.477l0.207,0.947c0.248,1.14-0.18,1.915-1.279,2.155s-1.812-0.287-2.061-1.427l-0.808-3.706
- c-0.249-1.142,0.179-1.917,1.278-2.157c1.1-0.239,1.812,0.287,2.061,1.429l0.151,0.691l-1.059,0.231l-0.167-0.763
- c-0.111-0.51-0.377-0.654-0.733-0.577c-0.356,0.078-0.538,0.32-0.428,0.83l0.84,3.849c0.11,0.509,0.375,0.644,0.731,0.565
- c0.356-0.077,0.541-0.31,0.43-0.818l-0.223-1.019L41.636,26.477z"/>
-<path fill="#61594D" d="M42.976,21.502l1.12-0.244l1.555,7.127l-1.12,0.244L42.976,21.502z"/>
-<path fill="#61594D" d="M51.721,27.061l-1.13,0.247l-0.477-1.25l-1.374,0.3l0.089,1.334L47.8,27.916l-0.414-7.376l1.641-0.357
- L51.721,27.061z M48.672,25.358l1.079-0.235l-1.326-3.486L48.672,25.358z"/>
-<path fill="#61594D" d="M52.317,19.465l1.12-0.244l1.333,6.109l1.843-0.402l0.222,1.018l-2.963,0.646L52.317,19.465z"/>
-</svg>
diff --git a/docs/theme/mkdocs/img/icons/framed-icon-private-repository.png b/docs/theme/mkdocs/img/icons/framed-icon-private-repository.png
deleted file mode 100644
index 7b12785557..0000000000
--- a/docs/theme/mkdocs/img/icons/framed-icon-private-repository.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/img/icons/framed-icon-private-repository.svg b/docs/theme/mkdocs/img/icons/framed-icon-private-repository.svg
deleted file mode 100644
index e13fbbdcff..0000000000
--- a/docs/theme/mkdocs/img/icons/framed-icon-private-repository.svg
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
- <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
-]>
-<svg version="1.1"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
- x="0px" y="0px" width="80px" height="80px" viewBox="-3.207 -13.122 80 80"
- overflow="visible" enable-background="new -3.207 -13.122 80 80" xml:space="preserve">
-<defs>
-</defs>
-<rect x="5.766" y="5.767" fill="none" stroke="#61594D" stroke-width="1.0106" stroke-miterlimit="10" width="61.344" height="43.301"/>
-<rect x="0.954" y="0.954" fill="none" stroke="#61594D" stroke-width="1.9073" stroke-miterlimit="10" width="70.969" height="52.925"/>
-<path fill="#FFFFFF" d="M44.096,24.671v-7.327c0-4.784-3.894-8.677-8.678-8.677c-4.783,0-8.678,3.893-8.678,8.677v7.326l8.885,0.298
- L44.096,24.671z"/>
-<path fill="#FFFFFF" d="M35.812,51.088L16.73,51.456V22.442l3.781,0.129v-5.228c0-8.22,6.688-14.906,14.907-14.906
- c8.219,0,14.904,6.687,14.904,14.906v5.223l3.581-0.126v29.021L35.812,51.088z M22.663,45.409l13.154-0.251l12.156,0.248V28.583
- l-12.346,0.43l-12.965-0.434V45.409z M35.625,23.079l6.585-0.23v-5.505c0-3.743-3.046-6.789-6.791-6.789
- c-3.746,0-6.791,3.046-6.791,6.789v5.501L35.625,23.079z"/>
-<path fill="#FFFFFF" d="M48.436,24.521v-7.178c0-7.178-5.839-13.02-13.018-13.02c-7.18,0-13.021,5.842-13.021,13.02v7.18
- l-3.781-0.128v25.138l17.234-0.331l16.166,0.334V24.396L48.436,24.521z M26.741,17.344c0-4.784,3.895-8.677,8.678-8.677
- c4.784,0,8.678,3.893,8.678,8.677v7.327l-8.471,0.297l-8.885-0.298V17.344z M49.86,47.332l-14.008-0.287l-15.077,0.288V26.629
- l1.623,0.054l4.343,0.145l8.886,0.298l8.47-0.296l4.34-0.15l1.424-0.048V47.332z"/>
-<path fill="none" d="M44.096,24.671v-7.327c0-4.784-3.894-8.677-8.678-8.677c-4.783,0-8.678,3.893-8.678,8.677v7.326l8.885,0.298
- L44.096,24.671z"/>
-<path fill="#61594D" d="M48.436,24.521v-7.178c0-7.178-5.839-13.02-13.018-13.02c-7.18,0-13.021,5.842-13.021,13.02v7.18
- l-3.781-0.128v25.138l17.234-0.331l16.166,0.334V24.396L48.436,24.521z M26.741,17.344c0-4.784,3.895-8.677,8.678-8.677
- c4.784,0,8.678,3.893,8.678,8.677v7.327l-8.471,0.297l-8.885-0.298V17.344z M49.86,47.332l-14.008-0.287l-15.077,0.288V26.629
- l1.623,0.054l4.343,0.145l8.886,0.298l8.47-0.296l4.34-0.15l1.424-0.048V47.332z"/>
-</svg>
diff --git a/docs/theme/mkdocs/img/icons/icon-device.png b/docs/theme/mkdocs/img/icons/icon-device.png
deleted file mode 100644
index c45e0fef35..0000000000
--- a/docs/theme/mkdocs/img/icons/icon-device.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/img/icons/icon-edit.png b/docs/theme/mkdocs/img/icons/icon-edit.png
deleted file mode 100644
index f729982370..0000000000
--- a/docs/theme/mkdocs/img/icons/icon-edit.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/img/icons/icon-file.png b/docs/theme/mkdocs/img/icons/icon-file.png
deleted file mode 100644
index 80daf93297..0000000000
--- a/docs/theme/mkdocs/img/icons/icon-file.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/img/icons/icon-folder.png b/docs/theme/mkdocs/img/icons/icon-folder.png
deleted file mode 100644
index 27702b86c1..0000000000
--- a/docs/theme/mkdocs/img/icons/icon-folder.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/img/icons/icon-link.png b/docs/theme/mkdocs/img/icons/icon-link.png
deleted file mode 100644
index 60fcb2bc95..0000000000
--- a/docs/theme/mkdocs/img/icons/icon-link.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/img/icons/icon-minus.png b/docs/theme/mkdocs/img/icons/icon-minus.png
deleted file mode 100644
index 29b52ef468..0000000000
--- a/docs/theme/mkdocs/img/icons/icon-minus.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/img/icons/icon-normal-repository-frameless.png b/docs/theme/mkdocs/img/icons/icon-normal-repository-frameless.png
deleted file mode 100644
index 87c47a8b48..0000000000
--- a/docs/theme/mkdocs/img/icons/icon-normal-repository-frameless.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/img/icons/icon-normal-repository-frameless.svg b/docs/theme/mkdocs/img/icons/icon-normal-repository-frameless.svg
deleted file mode 100644
index 8084448f53..0000000000
--- a/docs/theme/mkdocs/img/icons/icon-normal-repository-frameless.svg
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
- <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
-]>
-<svg version="1.1"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
- x="0px" y="0px" width="73px" height="55px" viewBox="0 0 73 55" overflow="visible" enable-background="new 0 0 73 55"
- xml:space="preserve">
-<defs>
-</defs>
-<path fill="none" stroke="#61594D" stroke-width="2.4057" stroke-miterlimit="10" d="M12.981,48.299l22.554,0.167
- c0.114-0.186,0.235-0.387,0.364-0.603"/>
-<path fill="none" stroke="#61594D" stroke-width="2.4057" stroke-miterlimit="10" d="M35.899,47.863
- c0.983-1.663,2.321-4.137,3.846-5.712c8.494,3.292,16.54,1.502,21.238-1.83c-2.895-5.689-3.551-7.998-14.021-7.794
- c2.274-8.456-3.161-13.59-6.828-17.139c-4.713,6.089-8.208,13.363-4.485,20.522c-7.006,0.11-19.571,7.109-22.434,11.953"/>
-<rect x="5.766" y="5.766" fill="none" stroke="#61594D" stroke-width="1.0106" stroke-miterlimit="10" width="61.343" height="43.301"/>
-<rect x="0.954" y="0.954" fill="none" stroke="#61594D" stroke-width="1.9073" stroke-miterlimit="10" width="70.968" height="52.925"/>
-</svg>
diff --git a/docs/theme/mkdocs/img/icons/icon-normal-repository.png b/docs/theme/mkdocs/img/icons/icon-normal-repository.png
deleted file mode 100644
index 59342a674d..0000000000
--- a/docs/theme/mkdocs/img/icons/icon-normal-repository.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/img/icons/icon-normal-repository.svg b/docs/theme/mkdocs/img/icons/icon-normal-repository.svg
deleted file mode 100644
index 53f17d9ac1..0000000000
--- a/docs/theme/mkdocs/img/icons/icon-normal-repository.svg
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
- <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
-]>
-<svg version="1.1"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
- x="0px" y="0px" width="80px" height="80px" viewBox="-3.207 -13.122 80 80"
- overflow="visible" enable-background="new -3.207 -13.122 80 80" xml:space="preserve">
-<defs>
-</defs>
-<path fill="none" stroke="#61594D" stroke-width="2.4057" stroke-miterlimit="10" d="M12.981,48.299l22.554,0.167
- c0.114-0.186,0.235-0.387,0.364-0.603"/>
-<path fill="none" stroke="#61594D" stroke-width="2.4057" stroke-miterlimit="10" d="M35.899,47.863
- c0.983-1.663,2.321-4.137,3.846-5.712c8.494,3.292,16.54,1.502,21.238-1.83c-2.895-5.689-3.551-7.998-14.021-7.794
- c2.274-8.456-3.161-13.59-6.828-17.139c-4.713,6.089-8.208,13.363-4.485,20.522c-7.006,0.11-19.571,7.109-22.434,11.953"/>
-<rect x="5.766" y="5.766" fill="none" stroke="#61594D" stroke-width="1.0106" stroke-miterlimit="10" width="61.343" height="43.301"/>
-<rect x="0.954" y="0.954" fill="none" stroke="#61594D" stroke-width="1.9073" stroke-miterlimit="10" width="70.968" height="52.925"/>
-</svg>
diff --git a/docs/theme/mkdocs/img/icons/icon-plus.png b/docs/theme/mkdocs/img/icons/icon-plus.png
deleted file mode 100644
index 27c49e9f01..0000000000
--- a/docs/theme/mkdocs/img/icons/icon-plus.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/img/icons/icon-private-repository-frameless.png b/docs/theme/mkdocs/img/icons/icon-private-repository-frameless.png
deleted file mode 100644
index 999422bde2..0000000000
--- a/docs/theme/mkdocs/img/icons/icon-private-repository-frameless.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/img/icons/icon-private-repository-frameless.svg b/docs/theme/mkdocs/img/icons/icon-private-repository-frameless.svg
deleted file mode 100644
index 3f1d30ba97..0000000000
--- a/docs/theme/mkdocs/img/icons/icon-private-repository-frameless.svg
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
- <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
-]>
-<svg version="1.1"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
- x="0px" y="0px" width="45px" height="61px" viewBox="0 0 45 61" overflow="visible" enable-background="new 0 0 45 61"
- xml:space="preserve">
-<defs>
-</defs>
-<path fill="none" d="M34.125,27.253v-9.815c0-6.408-5.215-11.622-11.623-11.622S10.879,11.03,10.879,17.438v9.811l11.899,0.4
- L34.125,27.253z"/>
-<path fill="#61594D" d="M39.94,27.05v-9.612C39.94,7.823,32.118,0,22.502,0S5.063,7.823,5.063,17.438v9.615L0,26.884v33.67
- l23.083-0.443l21.652,0.445V26.883L39.94,27.05z M10.879,17.438c0-6.408,5.215-11.622,11.623-11.622s11.623,5.214,11.623,11.622
- v9.815L22.778,27.65l-11.899-0.4V17.438z M41.846,57.605l-18.762-0.386L2.89,57.606V29.874l2.174,0.072l5.815,0.195l11.901,0.398
- l11.345-0.395l5.815-0.202l1.905-0.066V57.605z"/>
-</svg>
diff --git a/docs/theme/mkdocs/img/icons/icon-private-repository.png b/docs/theme/mkdocs/img/icons/icon-private-repository.png
deleted file mode 100644
index 2eb26616d9..0000000000
--- a/docs/theme/mkdocs/img/icons/icon-private-repository.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/img/icons/icon-private-repository.svg b/docs/theme/mkdocs/img/icons/icon-private-repository.svg
deleted file mode 100644
index de0d91e617..0000000000
--- a/docs/theme/mkdocs/img/icons/icon-private-repository.svg
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
- <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
-]>
-<svg version="1.1"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
- x="0px" y="0px" width="80px" height="80px" viewBox="-16.823 -9.444 80 80"
- overflow="visible" enable-background="new -16.823 -9.444 80 80" xml:space="preserve">
-<defs>
-</defs>
-<path fill="none" d="M34.125,27.253v-9.815c0-6.408-5.215-11.622-11.623-11.622S10.879,11.03,10.879,17.438v9.811l11.899,0.4
- L34.125,27.253z"/>
-<path fill="#61594D" d="M39.94,27.05v-9.612C39.94,7.823,32.118,0,22.502,0S5.063,7.823,5.063,17.438v9.615L0,26.884v33.67
- l23.083-0.443l21.652,0.445V26.883L39.94,27.05z M10.879,17.438c0-6.408,5.215-11.622,11.623-11.622s11.623,5.214,11.623,11.622
- v9.815L22.778,27.65l-11.899-0.4V17.438z M41.846,57.605l-18.762-0.386L2.89,57.606V29.874l2.174,0.072l5.815,0.195l11.901,0.398
- l11.345-0.395l5.815-0.202l1.905-0.066V57.605z"/>
-</svg>
diff --git a/docs/theme/mkdocs/img/icons/icon-trusted-repository-frameless.png b/docs/theme/mkdocs/img/icons/icon-trusted-repository-frameless.png
deleted file mode 100644
index 83d927caff..0000000000
--- a/docs/theme/mkdocs/img/icons/icon-trusted-repository-frameless.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/img/icons/icon-trusted-repository-frameless.svg b/docs/theme/mkdocs/img/icons/icon-trusted-repository-frameless.svg
deleted file mode 100644
index 9ef96f7216..0000000000
--- a/docs/theme/mkdocs/img/icons/icon-trusted-repository-frameless.svg
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
- <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
-]>
-<svg version="1.1"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
- x="0px" y="0px" width="62px" height="45px" viewBox="0 0 62 45" overflow="visible" enable-background="new 0 0 62 45"
- xml:space="preserve">
-<defs>
-</defs>
-<path fill="none" stroke="#61594D" stroke-width="2.9284" stroke-miterlimit="10" d="M38.383,9.137
- c-2.225,0.218-4.288,0.993-6.051,2.18c2.956,2.723,4.81,6.621,4.81,10.945c0,8.204-6.674,14.881-14.88,14.881
- c-8.203,0-14.88-6.677-14.88-14.881s6.677-14.881,14.88-14.881c0.187,0,0.373,0.006,0.561,0.013
- c1.716-1.944,3.765-3.592,6.056-4.851c-2.08-0.699-4.305-1.078-6.616-1.078c-11.468,0-20.798,9.33-20.798,20.798
- s9.33,20.798,20.798,20.798c11.468,0,20.799-9.33,20.799-20.798C43.061,17.288,41.305,12.72,38.383,9.137z"/>
-<path fill="none" stroke="#61594D" stroke-width="2.9284" stroke-miterlimit="10" d="M39.679,1.464
- c-11.466,0-20.797,9.33-20.797,20.798c0,4.974,1.754,9.542,4.678,13.125c2.225-0.219,4.288-0.991,6.052-2.177
- c-2.957-2.723-4.811-6.622-4.811-10.948c0-8.204,6.672-14.881,14.878-14.881c8.205,0,14.881,6.677,14.881,14.881
- s-6.677,14.881-14.881,14.881c-0.187,0-0.372-0.006-0.559-0.013c-1.719,1.944-3.767,3.592-6.056,4.851
- c2.078,0.701,4.303,1.078,6.615,1.078c11.47,0,20.799-9.33,20.799-20.798S51.148,1.464,39.679,1.464z"/>
-</svg>
diff --git a/docs/theme/mkdocs/img/icons/icon-trusted-repository.png b/docs/theme/mkdocs/img/icons/icon-trusted-repository.png
deleted file mode 100644
index 54d83608e1..0000000000
--- a/docs/theme/mkdocs/img/icons/icon-trusted-repository.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/img/icons/icon-trusted-repository.svg b/docs/theme/mkdocs/img/icons/icon-trusted-repository.svg
deleted file mode 100644
index 8469763a79..0000000000
--- a/docs/theme/mkdocs/img/icons/icon-trusted-repository.svg
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
- <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
-]>
-<svg version="1.1"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
- x="0px" y="0px" width="80px" height="80px" viewBox="-8.53 -18.571 80 80"
- overflow="visible" enable-background="new -8.53 -18.571 80 80" xml:space="preserve">
-<defs>
-</defs>
-<path fill="none" stroke="#61594D" stroke-width="2.9284" stroke-miterlimit="10" d="M38.383,9.137
- c-2.225,0.218-4.288,0.993-6.051,2.18c2.956,2.723,4.81,6.621,4.81,10.945c0,8.204-6.674,14.881-14.88,14.881
- c-8.203,0-14.88-6.677-14.88-14.881s6.677-14.881,14.88-14.881c0.187,0,0.373,0.006,0.561,0.013
- c1.716-1.944,3.765-3.592,6.056-4.851c-2.08-0.699-4.305-1.078-6.616-1.078c-11.468,0-20.798,9.33-20.798,20.798
- s9.33,20.798,20.798,20.798c11.468,0,20.799-9.33,20.799-20.798C43.061,17.288,41.305,12.72,38.383,9.137z"/>
-<path fill="none" stroke="#61594D" stroke-width="2.9284" stroke-miterlimit="10" d="M39.679,1.464
- c-11.466,0-20.797,9.33-20.797,20.798c0,4.974,1.754,9.542,4.678,13.125c2.225-0.219,4.288-0.991,6.052-2.177
- c-2.957-2.723-4.811-6.622-4.811-10.948c0-8.204,6.672-14.881,14.878-14.881c8.205,0,14.881,6.677,14.881,14.881
- s-6.677,14.881-14.881,14.881c-0.187,0-0.372-0.006-0.559-0.013c-1.719,1.944-3.767,3.592-6.056,4.851
- c2.078,0.701,4.303,1.078,6.615,1.078c11.47,0,20.799-9.33,20.799-20.798S51.148,1.464,39.679,1.464z"/>
-</svg>
diff --git a/docs/theme/mkdocs/img/icons/official-repository-icon.png b/docs/theme/mkdocs/img/icons/official-repository-icon.png
deleted file mode 100644
index ccafcee156..0000000000
--- a/docs/theme/mkdocs/img/icons/official-repository-icon.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/img/icons/repository-icons.ai b/docs/theme/mkdocs/img/icons/repository-icons.ai
deleted file mode 100644
index 06cfeb4199..0000000000
--- a/docs/theme/mkdocs/img/icons/repository-icons.ai
+++ /dev/null
@@ -1,4237 +0,0 @@
-%PDF-1.5 %âãÏÓ
-1 0 obj <</Metadata 2 0 R/OCProperties<</D<</ON[5 0 R]/Order 6 0 R/RBGroups[]>>/OCGs[5 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <</Length 53500/Subtype/XML/Type/Metadata>>stream
-<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
-<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00 ">
- <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
- <rdf:Description rdf:about=""
- xmlns:dc="http://purl.org/dc/elements/1.1/">
- <dc:format>application/pdf</dc:format>
- <dc:title>
- <rdf:Alt>
- <rdf:li xml:lang="x-default">repository-icons</rdf:li>
- </rdf:Alt>
- </dc:title>
- </rdf:Description>
- <rdf:Description rdf:about=""
- xmlns:xmp="http://ns.adobe.com/xap/1.0/"
- xmlns:xmpGImg="http://ns.adobe.com/xap/1.0/g/img/">
- <xmp:CreatorTool>Adobe Illustrator CS5.1</xmp:CreatorTool>
- <xmp:CreateDate>2013-11-20T15:39:09-08:00</xmp:CreateDate>
- <xmp:ModifyDate>2013-11-20T15:39:09-08:00</xmp:ModifyDate>
- <xmp:MetadataDate>2013-11-20T15:39:09-08:00</xmp:MetadataDate>
- <xmp:Thumbnails>
- <rdf:Alt>
- <rdf:li rdf:parseType="Resource">
- <xmpGImg:width>212</xmpGImg:width>
- <xmpGImg:height>256</xmpGImg:height>
- <xmpGImg:format>JPEG</xmpGImg:format>
- <xmpGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA&#xA;AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK&#xA;DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f&#xA;Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADUAwER&#xA;AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA&#xA;AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB&#xA;UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE&#xA;1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ&#xA;qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy&#xA;obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp&#xA;0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo&#xA;+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYqxhPKmrjWNVv&#xA;f0xMkF/C8VtECxMDFaI+5HLiXYgbUwUm0bqWhald6Db6dDq89rdwiMSajGP3khRaMSOQ+2d/tY0r&#xA;dhompwQ6Sk+qy3D2BkN27A1ufUVlAejAUQtUVB6DGlTnCh2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV&#xA;2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2&#xA;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</xmpGImg:image>
- </rdf:li>
- </rdf:Alt>
- </xmp:Thumbnails>
- </rdf:Description>
- <rdf:Description rdf:about=""
- xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
- xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#"
- xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#">
- <xmpMM:RenditionClass>proof:pdf</xmpMM:RenditionClass>
- <xmpMM:OriginalDocumentID>uuid:65E6390686CF11DBA6E2D887CEACB407</xmpMM:OriginalDocumentID>
- <xmpMM:DocumentID>xmp.did:00801174072068118C14977817F3299D</xmpMM:DocumentID>
- <xmpMM:InstanceID>uuid:426443b9-ecdd-0243-a283-43cdc4abb981</xmpMM:InstanceID>
- <xmpMM:DerivedFrom rdf:parseType="Resource">
- <stRef:instanceID>xmp.iid:FD7F1174072068118C14977817F3299D</stRef:instanceID>
- <stRef:documentID>xmp.did:FD7F1174072068118C14977817F3299D</stRef:documentID>
- <stRef:originalDocumentID>uuid:65E6390686CF11DBA6E2D887CEACB407</stRef:originalDocumentID>
- <stRef:renditionClass>proof:pdf</stRef:renditionClass>
- </xmpMM:DerivedFrom>
- <xmpMM:History>
- <rdf:Seq>
- <rdf:li rdf:parseType="Resource">
- <stEvt:action>saved</stEvt:action>
- <stEvt:instanceID>xmp.iid:FD7F1174072068118C14977817F3299D</stEvt:instanceID>
- <stEvt:when>2013-11-13T17:19:13-08:00</stEvt:when>
- <stEvt:softwareAgent>Adobe Illustrator CS5.1</stEvt:softwareAgent>
- <stEvt:changed>/</stEvt:changed>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <stEvt:action>saved</stEvt:action>
- <stEvt:instanceID>xmp.iid:00801174072068118C14977817F3299D</stEvt:instanceID>
- <stEvt:when>2013-11-20T15:38:58-08:00</stEvt:when>
- <stEvt:softwareAgent>Adobe Illustrator CS5.1</stEvt:softwareAgent>
- <stEvt:changed>/</stEvt:changed>
- </rdf:li>
- </rdf:Seq>
- </xmpMM:History>
- </rdf:Description>
- <rdf:Description rdf:about=""
- xmlns:illustrator="http://ns.adobe.com/illustrator/1.0/">
- <illustrator:StartupProfile>Web</illustrator:StartupProfile>
- <illustrator:Type>Document</illustrator:Type>
- </rdf:Description>
- <rdf:Description rdf:about=""
- xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/"
- xmlns:stDim="http://ns.adobe.com/xap/1.0/sType/Dimensions#"
- xmlns:stFnt="http://ns.adobe.com/xap/1.0/sType/Font#"
- xmlns:xmpG="http://ns.adobe.com/xap/1.0/g/">
- <xmpTPg:NPages>1</xmpTPg:NPages>
- <xmpTPg:HasVisibleTransparency>False</xmpTPg:HasVisibleTransparency>
- <xmpTPg:HasVisibleOverprint>False</xmpTPg:HasVisibleOverprint>
- <xmpTPg:MaxPageSize rdf:parseType="Resource">
- <stDim:w>80.000000</stDim:w>
- <stDim:h>80.000000</stDim:h>
- <stDim:unit>Pixels</stDim:unit>
- </xmpTPg:MaxPageSize>
- <xmpTPg:Fonts>
- <rdf:Bag>
- <rdf:li rdf:parseType="Resource">
- <stFnt:fontName>MyriadPro-Regular</stFnt:fontName>
- <stFnt:fontFamily>Myriad Pro</stFnt:fontFamily>
- <stFnt:fontFace>Regular</stFnt:fontFace>
- <stFnt:fontType>Open Type</stFnt:fontType>
- <stFnt:versionString>Version 2.062;PS 2.000;hotconv 1.0.57;makeotf.lib2.0.21895</stFnt:versionString>
- <stFnt:composite>False</stFnt:composite>
- <stFnt:fontFileName>MyriadPro-Regular.otf</stFnt:fontFileName>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <stFnt:fontName>BebasNeue</stFnt:fontName>
- <stFnt:fontFamily>Bebas Neue</stFnt:fontFamily>
- <stFnt:fontFace>Regular</stFnt:fontFace>
- <stFnt:fontType>Open Type</stFnt:fontType>
- <stFnt:versionString>Version 1.300</stFnt:versionString>
- <stFnt:composite>False</stFnt:composite>
- <stFnt:fontFileName>BebasNeue.otf</stFnt:fontFileName>
- </rdf:li>
- </rdf:Bag>
- </xmpTPg:Fonts>
- <xmpTPg:PlateNames>
- <rdf:Seq>
- <rdf:li>Cyan</rdf:li>
- <rdf:li>Magenta</rdf:li>
- <rdf:li>Yellow</rdf:li>
- <rdf:li>Black</rdf:li>
- </rdf:Seq>
- </xmpTPg:PlateNames>
- <xmpTPg:SwatchGroups>
- <rdf:Seq>
- <rdf:li rdf:parseType="Resource">
- <xmpG:groupName>Default Swatch Group</xmpG:groupName>
- <xmpG:groupType>0</xmpG:groupType>
- <xmpG:Colorants>
- <rdf:Seq>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>White</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>0.000000</xmpG:cyan>
- <xmpG:magenta>0.000000</xmpG:magenta>
- <xmpG:yellow>0.000000</xmpG:yellow>
- <xmpG:black>0.000000</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>Black</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>75.020981</xmpG:cyan>
- <xmpG:magenta>67.968254</xmpG:magenta>
- <xmpG:yellow>67.022202</xmpG:yellow>
- <xmpG:black>90.164032</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>RGB Red</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>0.000000</xmpG:cyan>
- <xmpG:magenta>99.398788</xmpG:magenta>
- <xmpG:yellow>100.000000</xmpG:yellow>
- <xmpG:black>0.000000</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>RGB Yellow</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>6.198215</xmpG:cyan>
- <xmpG:magenta>0.000000</xmpG:magenta>
- <xmpG:yellow>96.514839</xmpG:yellow>
- <xmpG:black>0.000000</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>RGB Green</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>62.764931</xmpG:cyan>
- <xmpG:magenta>0.000000</xmpG:magenta>
- <xmpG:yellow>100.000000</xmpG:yellow>
- <xmpG:black>0.000000</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>RGB Cyan</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>51.793694</xmpG:cyan>
- <xmpG:magenta>0.000000</xmpG:magenta>
- <xmpG:yellow>12.539864</xmpG:yellow>
- <xmpG:black>0.000000</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>RGB Blue</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>88.366524</xmpG:cyan>
- <xmpG:magenta>76.916145</xmpG:magenta>
- <xmpG:yellow>0.000000</xmpG:yellow>
- <xmpG:black>0.000000</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>RGB Magenta</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>26.990158</xmpG:cyan>
- <xmpG:magenta>81.640335</xmpG:magenta>
- <xmpG:yellow>0.000000</xmpG:yellow>
- <xmpG:black>0.000000</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=193 G=39 B=45</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>16.961926</xmpG:cyan>
- <xmpG:magenta>97.897301</xmpG:magenta>
- <xmpG:yellow>92.724495</xmpG:yellow>
- <xmpG:black>6.744486</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=237 G=28 B=36</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>0.445563</xmpG:cyan>
- <xmpG:magenta>99.142441</xmpG:magenta>
- <xmpG:yellow>97.323570</xmpG:yellow>
- <xmpG:black>0.094604</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=241 G=90 B=36</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>0.000000</xmpG:cyan>
- <xmpG:magenta>79.803154</xmpG:magenta>
- <xmpG:yellow>96.874947</xmpG:yellow>
- <xmpG:black>0.012207</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=247 G=147 B=30</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>0.036621</xmpG:cyan>
- <xmpG:magenta>50.066376</xmpG:magenta>
- <xmpG:yellow>98.565651</xmpG:yellow>
- <xmpG:black>0.000000</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=251 G=176 B=59</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>0.021362</xmpG:cyan>
- <xmpG:magenta>34.848553</xmpG:magenta>
- <xmpG:yellow>87.130539</xmpG:yellow>
- <xmpG:black>0.000000</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=252 G=238 B=33</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>4.513621</xmpG:cyan>
- <xmpG:magenta>0.000000</xmpG:magenta>
- <xmpG:yellow>93.188370</xmpG:yellow>
- <xmpG:black>0.000000</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=217 G=224 B=33</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>18.896770</xmpG:cyan>
- <xmpG:magenta>0.039673</xmpG:magenta>
- <xmpG:yellow>98.233002</xmpG:yellow>
- <xmpG:black>0.000000</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=140 G=198 B=63</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>50.109100</xmpG:cyan>
- <xmpG:magenta>0.137329</xmpG:magenta>
- <xmpG:yellow>99.038681</xmpG:yellow>
- <xmpG:black>0.000000</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=57 G=181 B=74</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>74.615089</xmpG:cyan>
- <xmpG:magenta>0.000000</xmpG:magenta>
- <xmpG:yellow>99.703972</xmpG:yellow>
- <xmpG:black>0.009155</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=0 G=146 B=69</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>86.385902</xmpG:cyan>
- <xmpG:magenta>17.578394</xmpG:magenta>
- <xmpG:yellow>100.000000</xmpG:yellow>
- <xmpG:black>3.823912</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=0 G=104 B=55</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>90.218964</xmpG:cyan>
- <xmpG:magenta>33.475243</xmpG:magenta>
- <xmpG:yellow>98.764015</xmpG:yellow>
- <xmpG:black>26.065456</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=34 G=181 B=115</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>76.195923</xmpG:cyan>
- <xmpG:magenta>0.000000</xmpG:magenta>
- <xmpG:yellow>74.978249</xmpG:yellow>
- <xmpG:black>0.000000</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=0 G=169 B=157</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>78.442047</xmpG:cyan>
- <xmpG:magenta>9.085220</xmpG:magenta>
- <xmpG:yellow>45.755703</xmpG:yellow>
- <xmpG:black>0.027466</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=41 G=171 B=226</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>69.719994</xmpG:cyan>
- <xmpG:magenta>14.847029</xmpG:magenta>
- <xmpG:yellow>0.000000</xmpG:yellow>
- <xmpG:black>0.000000</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=0 G=113 B=188</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>87.536430</xmpG:cyan>
- <xmpG:magenta>52.645145</xmpG:magenta>
- <xmpG:yellow>0.000000</xmpG:yellow>
- <xmpG:black>0.000000</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=46 G=49 B=146</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>99.130234</xmpG:cyan>
- <xmpG:magenta>96.548409</xmpG:magenta>
- <xmpG:yellow>3.494316</xmpG:yellow>
- <xmpG:black>0.500494</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=27 G=20 B=100</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>100.000000</xmpG:cyan>
- <xmpG:magenta>100.000000</xmpG:magenta>
- <xmpG:yellow>26.251619</xmpG:yellow>
- <xmpG:black>24.524302</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=102 G=45 B=145</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>74.520477</xmpG:cyan>
- <xmpG:magenta>98.516823</xmpG:magenta>
- <xmpG:yellow>0.939953</xmpG:yellow>
- <xmpG:black>0.228888</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=147 G=39 B=143</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>49.558247</xmpG:cyan>
- <xmpG:magenta>99.191269</xmpG:magenta>
- <xmpG:yellow>1.370263</xmpG:yellow>
- <xmpG:black>0.109863</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=158 G=0 B=93</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>34.891277</xmpG:cyan>
- <xmpG:magenta>100.000000</xmpG:magenta>
- <xmpG:yellow>37.204544</xmpG:yellow>
- <xmpG:black>10.815597</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=212 G=20 B=90</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>11.844051</xmpG:cyan>
- <xmpG:magenta>100.000000</xmpG:magenta>
- <xmpG:yellow>49.250019</xmpG:yellow>
- <xmpG:black>0.872815</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=237 G=30 B=121</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>0.000000</xmpG:cyan>
- <xmpG:magenta>97.000076</xmpG:magenta>
- <xmpG:yellow>20.495914</xmpG:yellow>
- <xmpG:black>0.000000</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=199 G=178 B=153</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>22.854959</xmpG:cyan>
- <xmpG:magenta>27.426565</xmpG:magenta>
- <xmpG:yellow>39.942013</xmpG:yellow>
- <xmpG:black>0.000000</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=153 G=134 B=117</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>39.844357</xmpG:cyan>
- <xmpG:magenta>42.853439</xmpG:magenta>
- <xmpG:yellow>52.529179</xmpG:yellow>
- <xmpG:black>6.808573</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=115 G=99 B=87</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>50.399025</xmpG:cyan>
- <xmpG:magenta>53.136490</xmpG:magenta>
- <xmpG:yellow>60.897224</xmpG:yellow>
- <xmpG:black>23.593498</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=83 G=71 B=65</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>57.598228</xmpG:cyan>
- <xmpG:magenta>60.415043</xmpG:magenta>
- <xmpG:yellow>63.738461</xmpG:yellow>
- <xmpG:black>41.934841</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=198 G=156 B=109</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>22.671854</xmpG:cyan>
- <xmpG:magenta>38.394749</xmpG:magenta>
- <xmpG:yellow>63.668262</xmpG:yellow>
- <xmpG:black>1.181048</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=166 G=124 B=82</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>31.595325</xmpG:cyan>
- <xmpG:magenta>49.182880</xmpG:magenta>
- <xmpG:yellow>73.931488</xmpG:yellow>
- <xmpG:black>9.890896</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=140 G=98 B=57</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>36.234070</xmpG:cyan>
- <xmpG:magenta>57.402908</xmpG:magenta>
- <xmpG:yellow>84.057373</xmpG:yellow>
- <xmpG:black>22.613871</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=117 G=76 B=36</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>39.169907</xmpG:cyan>
- <xmpG:magenta>64.104675</xmpG:magenta>
- <xmpG:yellow>93.441673</xmpG:yellow>
- <xmpG:black>35.580986</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=96 G=56 B=19</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>41.538109</xmpG:cyan>
- <xmpG:magenta>69.994659</xmpG:magenta>
- <xmpG:yellow>97.024490</xmpG:yellow>
- <xmpG:black>49.155415</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=66 G=33 B=11</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>47.794308</xmpG:cyan>
- <xmpG:magenta>73.476768</xmpG:magenta>
- <xmpG:yellow>83.712517</xmpG:yellow>
- <xmpG:black>68.157471</xmpG:black>
- </rdf:li>
- </rdf:Seq>
- </xmpG:Colorants>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:groupName>Grays</xmpG:groupName>
- <xmpG:groupType>1</xmpG:groupType>
- <xmpG:Colorants>
- <rdf:Seq>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=0 G=0 B=0</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>75.020981</xmpG:cyan>
- <xmpG:magenta>67.968254</xmpG:magenta>
- <xmpG:yellow>67.022202</xmpG:yellow>
- <xmpG:black>90.164032</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=26 G=26 B=26</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>72.576485</xmpG:cyan>
- <xmpG:magenta>66.601051</xmpG:magenta>
- <xmpG:yellow>65.191116</xmpG:yellow>
- <xmpG:black>78.161285</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=51 G=51 B=51</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>69.481949</xmpG:cyan>
- <xmpG:magenta>63.179977</xmpG:magenta>
- <xmpG:yellow>62.151520</xmpG:yellow>
- <xmpG:black>58.361179</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=77 G=77 B=77</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>65.377274</xmpG:cyan>
- <xmpG:magenta>57.988857</xmpG:magenta>
- <xmpG:yellow>56.878002</xmpG:yellow>
- <xmpG:black>36.661327</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=102 G=102 B=102</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>59.728386</xmpG:cyan>
- <xmpG:magenta>51.235218</xmpG:magenta>
- <xmpG:yellow>50.771339</xmpG:yellow>
- <xmpG:black>20.132755</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=128 G=128 B=128</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>51.647209</xmpG:cyan>
- <xmpG:magenta>43.149460</xmpG:magenta>
- <xmpG:yellow>43.149460</xmpG:yellow>
- <xmpG:black>7.547111</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=153 G=153 B=153</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>42.636757</xmpG:cyan>
- <xmpG:magenta>34.787518</xmpG:magenta>
- <xmpG:yellow>35.315479</xmpG:yellow>
- <xmpG:black>0.985736</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=179 G=179 B=179</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>30.679787</xmpG:cyan>
- <xmpG:magenta>24.246586</xmpG:magenta>
- <xmpG:yellow>24.765390</xmpG:yellow>
- <xmpG:black>0.000000</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=204 G=204 B=204</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>19.366753</xmpG:cyan>
- <xmpG:magenta>15.005720</xmpG:magenta>
- <xmpG:yellow>15.533686</xmpG:yellow>
- <xmpG:black>0.000000</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=230 G=230 B=230</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>8.459604</xmpG:cyan>
- <xmpG:magenta>6.131077</xmpG:magenta>
- <xmpG:yellow>6.576639</xmpG:yellow>
- <xmpG:black>0.000000</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=242 G=242 B=242</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>3.704888</xmpG:cyan>
- <xmpG:magenta>2.508581</xmpG:magenta>
- <xmpG:yellow>2.508581</xmpG:yellow>
- <xmpG:black>0.000000</xmpG:black>
- </rdf:li>
- </rdf:Seq>
- </xmpG:Colorants>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:groupName>Web Color Group</xmpG:groupName>
- <xmpG:groupType>1</xmpG:groupType>
- <xmpG:Colorants>
- <rdf:Seq>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=63 G=169 B=245</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>63.179977</xmpG:cyan>
- <xmpG:magenta>21.942472</xmpG:magenta>
- <xmpG:yellow>0.000000</xmpG:yellow>
- <xmpG:black>0.000000</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=122 G=201 B=67</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>55.407028</xmpG:cyan>
- <xmpG:magenta>0.000000</xmpG:magenta>
- <xmpG:yellow>96.551460</xmpG:yellow>
- <xmpG:black>0.000000</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=255 G=147 B=30</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>0.000000</xmpG:cyan>
- <xmpG:magenta>50.835430</xmpG:magenta>
- <xmpG:yellow>96.163879</xmpG:yellow>
- <xmpG:black>0.000000</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=255 G=29 B=37</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>0.000000</xmpG:cyan>
- <xmpG:magenta>96.505684</xmpG:magenta>
- <xmpG:yellow>90.057220</xmpG:yellow>
- <xmpG:black>0.000000</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=255 G=123 B=172</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>0.000000</xmpG:cyan>
- <xmpG:magenta>66.173798</xmpG:magenta>
- <xmpG:yellow>3.277636</xmpG:yellow>
- <xmpG:black>0.000000</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>R=189 G=204 B=212</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>25.375748</xmpG:cyan>
- <xmpG:magenta>12.716866</xmpG:magenta>
- <xmpG:yellow>11.676205</xmpG:yellow>
- <xmpG:black>0.000000</xmpG:black>
- </rdf:li>
- </rdf:Seq>
- </xmpG:Colorants>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:groupName>Color Group 1</xmpG:groupName>
- <xmpG:groupType>1</xmpG:groupType>
- <xmpG:Colorants>
- <rdf:Seq>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>greybrown</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>50.390625</xmpG:cyan>
- <xmpG:magenta>44.531250</xmpG:magenta>
- <xmpG:yellow>49.609375</xmpG:yellow>
- <xmpG:black>10.546875</xmpG:black>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <xmpG:swatchName>greybrown-brown</xmpG:swatchName>
- <xmpG:mode>CMYK</xmpG:mode>
- <xmpG:type>PROCESS</xmpG:type>
- <xmpG:cyan>56.250000</xmpG:cyan>
- <xmpG:magenta>53.906250</xmpG:magenta>
- <xmpG:yellow>63.281250</xmpG:yellow>
- <xmpG:black>31.640625</xmpG:black>
- </rdf:li>
- </rdf:Seq>
- </xmpG:Colorants>
- </rdf:li>
- </rdf:Seq>
- </xmpTPg:SwatchGroups>
- </rdf:Description>
- <rdf:Description rdf:about=""
- xmlns:pdf="http://ns.adobe.com/pdf/1.3/">
- <pdf:Producer>Adobe PDF library 9.90</pdf:Producer>
- </rdf:Description>
- </rdf:RDF>
-</x:xmpmeta>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-<?xpacket end="w"?> endstream endobj 3 0 obj <</Count 33/Kids[7 0 R 8 0 R 9 0 R 10 0 R 11 0 R 12 0 R]/Type/Pages>> endobj 7 0 obj <</Count 5/Kids[13 0 R 14 0 R 15 0 R 16 0 R 17 0 R]/Parent 3 0 R/Type/Pages>> endobj 8 0 obj <</Count 5/Kids[18 0 R 19 0 R 20 0 R 21 0 R 22 0 R]/Parent 3 0 R/Type/Pages>> endobj 9 0 obj <</Count 5/Kids[23 0 R 24 0 R 25 0 R 26 0 R 27 0 R]/Parent 3 0 R/Type/Pages>> endobj 10 0 obj <</Count 5/Kids[28 0 R 29 0 R 30 0 R 31 0 R 32 0 R]/Parent 3 0 R/Type/Pages>> endobj 11 0 obj <</Count 5/Kids[33 0 R 34 0 R 35 0 R 36 0 R 37 0 R]/Parent 3 0 R/Type/Pages>> endobj 12 0 obj <</Count 8/Kids[38 0 R 39 0 R 40 0 R 41 0 R 42 0 R 43 0 R 44 0 R 45 0 R]/Parent 3 0 R/Type/Pages>> endobj 38 0 obj <</ArtBox[3.20703 12.0459 76.082 66.8779]/BleedBox[0.0 0.0 80.0 80.0]/Contents 46 0 R/LastModified(D:20131120153904-08'00')/MediaBox[0.0 0.0 80.0 80.0]/Parent 12 0 R/PieceInfo<</Illustrator 47 0 R>>/Resources<</ColorSpace<</CS0 48 0 R>>/ExtGState<</GS0 49 0 R>>/Properties<</MC0 5 0 R>>>>/TrimBox[0.0 0.0 80.0 80.0]/Type/Page>> endobj 39 0 obj <</ArtBox[3.20703 12.0459 76.082 66.8779]/BleedBox[0.0 0.0 80.0 80.0]/Contents 50 0 R/LastModified(D:20131120153904-08'00')/MediaBox[0.0 0.0 80.0 80.0]/Parent 12 0 R/PieceInfo<</Illustrator 47 0 R>>/Resources<</ColorSpace<</CS0 48 0 R>>/ExtGState<</GS0 49 0 R>>/Properties<</MC0 5 0 R>>>>/TrimBox[0.0 0.0 80.0 80.0]/Type/Page>> endobj 40 0 obj <</ArtBox[3.20703 12.0459 76.082 66.8779]/BleedBox[0.0 0.0 80.0 80.0]/Contents 51 0 R/LastModified(D:20131120153904-08'00')/MediaBox[0.0 0.0 80.0 80.0]/Parent 12 0 R/PieceInfo<</Illustrator 47 0 R>>/Resources<</ColorSpace<</CS0 48 0 R>>/ExtGState<</GS0 49 0 R>>/Properties<</MC0 5 0 R>>>>/TrimBox[0.0 0.0 80.0 80.0]/Type/Page>> endobj 41 0 obj <</ArtBox[3.20752 12.0459 76.0825 73.3145]/BleedBox[0.0 0.0 80.0 80.0]/Contents 52 0 R/LastModified(D:20131120153904-08'00')/MediaBox[0.0 0.0 80.0 80.0]/Parent 12 0 R/PieceInfo<</Illustrator 47 0 R>>/Resources<</ColorSpace<</CS0 48 0 R>>/ExtGState<</GS0 49 0 R>>/Properties<</MC0 5 0 R>>>>/TrimBox[0.0 0.0 80.0 80.0]/Type/Page>> endobj 42 0 obj <</ArtBox[3.20703 12.0459 76.082 66.8779]/BleedBox[0.0 0.0 80.0 80.0]/Contents 53 0 R/LastModified(D:20131120153904-08'00')/MediaBox[0.0 0.0 80.0 80.0]/Parent 12 0 R/PieceInfo<</Illustrator 47 0 R>>/Resources<</ColorSpace<</CS0 48 0 R>>/ExtGState<</GS0 49 0 R>>/Properties<</MC0 5 0 R>>>>/TrimBox[0.0 0.0 80.0 80.0]/Type/Page>> endobj 43 0 obj <</ArtBox[3.20703 12.0459 76.0815 66.8779]/BleedBox[0.0 0.0 79.9995 80.0]/Contents 54 0 R/LastModified(D:20131120153904-08'00')/MediaBox[0.0 0.0 79.9995 80.0]/Parent 12 0 R/PieceInfo<</Illustrator 47 0 R>>/Resources<</ColorSpace<</CS0 48 0 R>>/ExtGState<</GS0 49 0 R>>/Properties<</MC0 5 0 R>>>>/TrimBox[0.0 0.0 79.9995 80.0]/Type/Page>> endobj 44 0 obj <</ArtBox[3.20703 12.0459 76.082 66.8779]/BleedBox[0.0 0.0 80.0 80.0]/Contents 55 0 R/LastModified(D:20131120153904-08'00')/MediaBox[0.0 0.0 80.0 80.0]/Parent 12 0 R/PieceInfo<</Illustrator 47 0 R>>/Resources<</ColorSpace<</CS0 48 0 R>>/ExtGState<</GS0 49 0 R>>/Font<</T1_0 56 0 R>>/ProcSet[/PDF/Text]/Properties<</MC0 5 0 R>>>>/TrimBox[0.0 0.0 80.0 80.0]/Type/Page>> endobj 45 0 obj <</ArtBox[3.20703 12.0459 76.082 66.8779]/BleedBox[0.0 0.0 80.0 80.0]/Contents 57 0 R/LastModified(D:20131120153904-08'00')/MediaBox[0.0 0.0 80.0 80.0]/Parent 12 0 R/PieceInfo<</Illustrator 47 0 R>>/Resources<</ColorSpace<</CS0 48 0 R>>/ExtGState<</GS0 49 0 R>>/Properties<</MC0 5 0 R>>>>/TrimBox[0.0 0.0 80.0 80.0]/Type/Page>> endobj 57 0 obj <</Filter/FlateDecode/Length 1012>>stream
-H‰ìWËnG ¼ÏWôL«Ù$ûqõ&ÈÉ ò‹$:Xüû®b+¯I€ôØá É.‹éæ§Sºy{*éÍw§´ÝœnK:ݦ’½)ëÄ寮Vi)Ýž~Ü$‘ô Þ?Àû·‡­óáLÒóM{“¬fÉ4k‘ôû/Û-Bfé éžEk¢¢f›Ékžµ-·[I#¾wüàÖÏéÃÂt~HåøJçÛÇ$aH²’«·‘Üsóªé|¿ñÁý¶ìeàrÏV€å1dzy|ž·§;UóKGä®ñœÇ«óvùäU܉/~ÄïóV+pÛ“óýÓÚs›žæ³†¸ Ú‹'û«¸ýUb<ÞÑ,‡# ŒpÖ'À¾¼}òEÊ_·wÛS?¨ ϳ‡&¾ýÆÜ}Û­¹Ã¡9<À}ù¿Yÿ•f=·¡µlfš
-b•
-RI|E
-RxNPY"À0|êB/FM«äÑÕïXУΛÒ5*¸TEÅ0Mv¨Öž;`æÑMÁ|½ÔÅkÜEF˜£…Âg£^b‘¤Eꅸоä5R‰WØFXŠÊQ)¡†ÒAªÍ+V%Á–tòÏ‹~ ¬]‚Õ¿Ö/ÁÖ¿ ¶³e-þí¬„^͢ǡ¬Š±ÈqhtïpéWršAˆ(»ÚŠêË9ª%47­GÆ4 ”
-~n ¬uìKÿ*%Æî;$Îb0Ìn˜Ö4LÇA ÌÆ×øúþ-þõy·}`
-H‰””uTÔKÇtKˆ”ˆKJI,‚t(Ý‹»4ìKÇÒÝ%Ò¹´H—4J#‚Ò’‚(H
-w¹÷þqÏyïyßó~Ï3çùÌ™gÎ<3óÌ
-
-
-SÊhª¦›«·HhÀ´†t^ôé ·'0±ß…€Â™kYæX¯ØY9îYq†q•p÷ólÝ'äãäW°Œ£…z„EÎÅèÄE$´%D>,–ê‘^|t*K)Ç%/§`¢è¦¯\¦Ò«úùñ‰•:¯†¼&D ®¦“¥[«7¨¿dplDa5–|ªmbõÌÓ4Ê,óy•y‡Å{Ëe辶5• «­œ½Žƒ©£µ“3Üìã’âš…,t+w¯ñhòl÷êõðõóõA  ö½ î é m k
-¯‹xYU“›ï“€H„&%«¥È¤
-¥q¼ O'M¿zù3ãKæTÖ@v[NUnn^\¾o]¡a‘b±Tr£ä¢t»lºümE]e~Uü+¿jû×åZÑ:¶zª a·q®i ¹¡¥°5¡Íÿ};¤C¹S¤‹¥›¢û²ç[ï\_ÿÛ†w…ý‰þƒCa…¾Qº1¬±÷ŸÆ;>”L$Lz}4ÿ¤:%8M7ÌlÌŽÎÕΧ/ø}¶XT^â]¦X>\™Ym[Ëùâ³n¸!´ycsk«ûkƶóŽÊ·;ßöv{¿§ýpßÓßúIþsû ÷0ëÈõXõ„éäàôݯÔ3ós®ó‹’ß&—$—õWÆWW˜*ØÂ)ÁãÅ!è$Ü$Æ%¡!e$cºÁHNOAKIMEq“„—úâÖÍí ÝýÃâíÆ•;KLów§@˜‡YúX;ØšÙë8^Ý+çDspçñäðfßÏàKåOˆÅTC˜P°p J%†’D=ðè+å+íûÈO%$*©«˜¤”®œ¡’©šý8÷I¡Z½\£Z³^«U»K§_wLï“þ´Á¬á¼Ñ"dÙxíé¦Éö³]Ó}³£ç§æ–
-—üW´×÷‡3ƒgƒÿŽŸL¬C#u!ó¼áMîMáMéEåvAmsË”F‡V‘NŒž‹Aø¶£ÌGL’w…A¼Ì¬,ô¬äl¸l¿Ø¿s¬Ý›ááêænä©àͽŸÌÎï+€„‚!Bê²"¢¢<bÌâ4$’€äñƒÝ‡kRóÒ“†eúdÛåšäk*ÑJùÊY*/TS'<‰S‹V҈ԌЊЎԉÐЋÐ0ˆ4Œ2Š†ÄÇ?M4I~–fšŽù²Ís-ò,ó¡…°"+´u‰M©m™]¹}¹C…c…S¼Qæ\êRìZˆÌsËvé‘ê™èãîäëëçîGÙ˜i«„H‡Š„ñ„3GÐF’FaGDïƬÆÎÄÆ÷&´$V''g¥$¥F¦¼ðLG¼´Ë°Ì4Í‚dëçèäjåiækhêéCÐf%V¥NežåAq•YU¯ÚªG^/ÕÔՃĵ›šÃ[ŠZ{ÚVÚ±:˜;å»`Ýá=å½c}ûïnõK ˜ ¡‡‡FvÇ(ÞƒÇõ> 'R&k?¾ÿ´3?Ã4+:§6o¾€ü¾˜¾T²\·Ò±Ú¿6úåÃúÄÆøæÈVß×ÖíÊÌoá»ðïF?LöžîüT;:ä>¢::>ž:©;ýeqÆvx^saõ›òwÝ¥úåÊ•óŸï'_
-­*‰êÕãƒ'[j êão5[´ª´óuR1uà­ïh`f¨m$1æxJgBdrölÇtÁläy»y¥E¦e$Ôfe¥g-g#`ËdGbwj¿î0áØáTOC9;¸¸Ê ¹Ü¨ÜÎÝ¿xŒz6zåx‡ù8ùøIû³£ÈP‡ó=A¥Á±!.¡†aÂAxÛ‘
-£\®€l‹GâN‚ÐØ»ËÚæÐN´ÄÈa5€tÁ…N€ºzlÕß´ÍS<º°H6Ѽ¥*ôŠîÝ<’a|˜Çkz|C±VŽ²|šÇ|ƒ—‹·|IkžŠ‚|±Ru‰ˆ}26Ž‰'~2‹ÖÞÛF‘-†ËÆB…„°*ƒ„o™²‹üƒ‚ƒŠ­‚òjŒ‰‚ˆQ^ˆ£‚@5zˆI‚`Š˜ƒ†Ù³
-~æˆ2—êgK‡>•-N}†o’Ì2Ù†‘Á N‡%ˆÿÕ§±°ÇÀ›‹â¬
-‡0§ež†6¢çM …_Ÿ¯1… ? …—ˆ1Ó£ŒËÆǾ³‹ÀI©‰^º’ç‡ô´I|B†Ì¯dö…ܪwL‡…§e1$„¢¡: ®…‡æÒàŒrÒW½ûŠ°Êñ¨]‰ Ãá’1‡£½S{†z·|di…‹²ÇL „½®g0·„\ ð U„Ž‡©Ìû›ò{[¸“™G{!£ö–¸{ ŽÞ”`{&y’E{xbie{ùJrŽÚ|“/cŽ5}~
-~ÀË:šâ„ý·f˜#ƒç£•™‚üú“M‚Kx+‘CØa|ušI~÷.yWã ÏŽ›ƒÉәߎ­¶—%ŒÂ¡å”˜ŠøŒá’[‰‰w!^ˆT`ƒŽž‡^H˜*† -§ŒŒ† 5G…èȨ˜ç˜Ž´ã–=•Î §“½“4‹»‘rív†Žÿ_ÒRG±Œf‹û,ދ̋ͯŒ…ßÇ|˜,¢†³Æ•„žúŸ{“ ›¬Š„Ò˜ªtìŽÙ•ô^1“ Fî‹Å‘Ä,;‹'‘¾<‹!…‘Æ_—›¬¥²²”õ¨Yžl’~¤J‰„J tŽS#]¸Œš'FA‹4—÷+®Š”—;ÛŠL…PÅf—&¶ì±É”€±Þ‰’­ˆªÕ¨šs@å¤]Œ0¡E±Š´žÓ+:Š›ÈÖ‡SS 𧠨ŒêjVPp,<XQ)‚XVl€(Js•&ÂJ!ÒûK{é½@B€ÐEŠ. œe°íÙWqQ䆓³â½ý~3ßÌ7ßÌçF£HI^ý\¨¯§¬ÁïÓ¡ƒåœ+j&YÅöÉbƒdMLÅÑÅ{#©©úè÷)Fø£ÛAŠ;q²ïT0Œ±_à ^¿£9IݤšxÖº¶Æ¢YFh“9Õ…ÆhX;Jõ²Æl¬ äÀín+jÅÄ¡®(Ým,Ö¼Jƒî(Va÷V/ÀÈÄaØ‘”@ÈQ~.æ8_]±Èš7]ñÕÕÌÃãõÚgÕ|ÓFÕ) -—/ªºMH—|­Š¼øP´œ8™%èoFxàCÿ­<÷ªR×l® AÒ^«™ ÷QÊlÚÁzÙrJAUžUÿá™ÿd*ÿùüîNî$iÜÉ #Ÿv b7FÚ*4Þ‚÷ú¯
- Ëû§pv€iâxÖ–¼÷ŒÁIªão¥‡ìžËÝJÛ±á#ç
-í¾ËW—àh…Ô‰Šlý"ùkx wVjGá“Dzˆ–ç*¸ÇßœxŸWÁŠ:Æ©d¿ÙPÀîæ$¹üΠjÀ4W·Mž¨[ÎÝ,]¢Ê«$ˆ–ÈWæî$I×&®åNˆ¬‘}ì7¨ sØþ»‹1@À9‡TÉŽ.íEÙÓzN¾Dfº*uwr þ„úØ ˆ *ª#Øùòë­,¥hØ…Ãð"ä8=”³NÍ ¡%ƒ=(‰p¤â…QuÃ9søLÓ“(î&Ãâˆwì¥Ú¾õ?±‚ER AHi.RÚ~ Ô„Ë6õ ØÑâ¿:Ò*tД3*»–¿Û±ôx#ç‰m?r~3×û2ÿ+Êwù‰¾šp¸ÞÇ6‹yXaœTOÃ#Œã
-U‹Â¼<·_)ÂIø(»Œ}¹ÓW2SÎX U€àwü õ¦ M¨–f›_T‰)•úà“Ÿ?k–YYF…ôK8ãÁu;J$óÀþ*1T…
-µ´.—÷Jl6mçHj†uÁ,béU6£+s©ì ýhܸdœ-Ê¥ª}…wi
-{;SÂm¶`vâîØ¿`~È?g¥a.œ
-3žÃŒì{§­Çæ†L¨^–»¡¦ÔÅåW€ƒ¹¾ÍY¥eÆ4õ‚]¸Lû<pqÞ´…Ž—§´Îá‹÷åkêñÕ!ùÊGø”]µ l
-ì%€üÎÓ‚æB®sŠW’îÞÐÁÄ[ÇØ~á}F.+}W—ÅöötÕ=¥Ž
-é‹õKÏe&ÓÑ,Û^çÜ-¹œv«a¡(0¾Þê… ·t¯tzþSûœúwÂ0D¿6jäã¿tlÔÞ.\ÑlVÕ¤©í—äã)žÌ-gØ [Ñ­š'’Ïxí|Ú|D­D”ßµ£ö÷øáv••wi¦Ù×8”Æ°=×Ý‹¿bY¨õ
-¿¤ïTC7jŽKIžùšXš7
-æÿÏù_L‹
-u´®Râ_,^V¹àS&åaR´~PfÄÜLL_Dw¸ž*Ž‹`\Í-¦9]qîõ®¯¡ ¦Ý –Çô¹T¸Ií6)ÿ>u6 DÝ`eÍ¢/»–¢xq¶Y%¤9ÖÛÊœ¼;«Ã¥Oêd\˾ÊP…&eRËzïç;¡]¥¹‹é.íRµ<oªÊΡù]öP{?¯:¦ r̨\˜µÝÊ»b õÒ¤â3|ª×íâm ¨s¢ØŸîÛÖW°9¢¨ñµæoZt]Rn“ÏÃ…\½c…Wö#+…n•I&õgϽØÝy¸œAjsÑN‹06”HiD­±¸È'@ÿ¥ðõJ+¦ša5V~€cRˆIµõÌ«ïvwtUÓc[3+?F|l(ÑÑiÆÚU—žøô¥^+O—?Rí°Þs©šÿÿ—
-ØÁ1¯B›¹vÑŸ¡®nÛ˜F/±ã BsßG³åÄÄÃMœYø«ëç9>£Ü–3……È—qIôƒ Ú£±¿5ƒµ¨ÕV‡Ü_À1È£¿Î²œåiÃñ¬JiXû0ÛWV–ÁîH[8g„«
-n3¥ `€ ¤Ðþ38A.|«f|ј0Iõ½6Öbå v«%Ó&ý ;Y®ýã¿œÕÒ„#
-¨ýQ<ŸÁÑÇ
-›˜;/¹¥Ô±ìJB"¬‘ü7þØtÍšù©,mºóXdÚ¾^ë;ì´žŽñ&sà`«YÑ"à놠ÑYŸüŠ™¯{>ÆŠÕ.õßÀz^48¯‰e!¹ôR‘6}ØõvcûöìÆMiŸozî²Úoñ0¢'“=˜~µ¯Âi,3Ã:?-‹©Ý?oS,Ùõô9áÎüwß¼„µ¹þ#îÎRçOaƒìÙü£˜˜—ô;Æ ?àþäïŒåpïÍBäÒ­À
-±ÖžI̼üO´ ÝŸ÷e#}Ô¯èN$í\êŠl?¼],÷ý Å·y,ÜÑ>&РôŠîä©øq]Âyhâ0AqñâK)ÄBÍF¶“ÒcH:ñì—-h-ñÇŸcȵêf)¯K9T£ã127]çÑä÷q·EjLˆâí•<>hÁ‹;ù|ãU
-Ÿþ¼ø×à”dÜp‚G
-Æ«½`¹&!…Ïä8aðÉlû³›`83>Ì.‘òq„ŸÉ‚ænç…ŽÚÀ¤Aß9
-;èœ ï ¡‹­ê`¨¦H†ÚBÕyåg¼ Þ KBý ¯*kïã°—2fF„=#Ÿ OMã· éeT?
-m­òTmê_¡å“ãOBÛŠV
-wnKÎÜ‘QVñBá"ÿÃõý×Ô½pü  *Ö+ت€ED¯ È*  ¡¶ˆ©(¨Ê²o B‚'{p’œì½wH؆ʴ*JѪmA-n¬¨WjGE­íùÞ¯çy~ú~?rÙI^WOåÔ@÷«Ÿ´¼l)ÎÝƶ±WïògiX¾›¬"æC¯#ÌkýànA‰Šæ¸ §Ë»¤rî¥ó)bÈ!¢UýÚ²I’ƒb=³>Ç0ãžß´©ãŽy}ĸB)Hä[èöžÝðFs´ ²òV¡+Ÿ±ò̯+Y(IŠ•™(º³‘Àx&Úá9JAIìÏã'tXmyœGÄ=œX[8éTK³)¦2œí©“<ÇTSRüv¥x£ã€lÈ“GO¤|Òg‚/÷{Ø>ãºÑ4Öù/’gËRçáŠF–ȶíà&æAÓ5”š2Ü uЯ*B<óiòë¾
-ar†Žæ>Ý>Ƶrn®[É­äF
-p†-œàú1ÏÝÛz(þ=Ôf)
-‚vŠë¦Ä›9øØ¡Ö2ƒ w uûþç…¼çïתÑõ#è…­Á{P6„+DÉËq3HIiŽû·Ù%„ûBóC‚’b¨!ÔÖÔkc5‡&U ):X®$ÜŽ–ºˆ[®Èb‰2¤*@ÀPkcÓ˜‚dÓoT©B_L1Uwi"É)ÉÌ=2#ù‹˜pI9, RêO>‡T@>è;¬bn¿Ðø¢€DÈþPuCý«ë›ŠfkÚéã^´^ü°\ÀŒG~•  »o—LÃRc¬HqÜ®=-8^5OÅ„µy*9‹û:-\òg8:T<á?*ÞýŽ´C;¢¶[‚µ·y¿XªÍïµ+±•ÙÊI©;÷lRLß­“$Dõ‹vYþTQ6üDyƒ€VmÖÛfy%/sIsƒ†mXP1ªLռȭ’¥«òvow)„QBµb™†ÐÀ_
-Ùÿ®ß[Ak]Ùíûí„åJÛó‚͆áVBÆMí"{íNrÜòãæùQÕ¿òih
-ET9¢¤Ù²FÞW¬Àc»ƒã¹ám$úµ="G
-}KÜe‹š6±~Ö”G_å³ÒìMËDÔ¿µs`± gî]£v¥p-9§\Nôžd{:´:Žgv¶HÖ_3fC;}ÐÆ“ 
-œ¯è‡-£"{â ‡TZG ôˆRØ,†ÍɇjࣶZw8j ICFöêÕ:½b [ Æ\+å?ˆ
-èþ™oA n'a
-
-ÚôO¦j0ÀÕä`ê%µ|¶^é/si×_¦XÇ£ýLqiÔw]–Iç©Î­÷D"J¤î‘!y½!ñÔ¶®nˆ0²Rá zå WC¯³câcúh™üÈÅ«KÒ_R [úÓ*)! OSo‘©u©µ¶OÕ·ÓÜŒWÖãíze¯WÞCΓña½²¼ìÈÏ’Lê·Í÷/ÏQB´o³_“£kÇ/cg£ªÊ&MV?ÇÿÖ«5zõÝ !gÇôÌë"?wœ–PÍš—IÏQ"´Î§ÈP­AdtE)q4þ±jŒðúGÁsƒÆÕnñ»{"” ‘óí}e®ÔUMÑrkÊùzvi89C}´ø®XóLB1W¾".ê•^M ”ÔûÄût?WK¢LÛwÕDP]t£U‘æŠ1r»J«ð·ÓÕ¸KÎÿV¹—ÈÿGM;phÌÕ·m æ‡v>èÀ-wgØõ©ë¡FNý ŒÊcIÜPþ#q‡òW• ŽÐËI –˜;ÇNáÙ¶þÅAÐ)ŃÞH~¡7iÛ tòhlƒ~ýÁ~dz²YË CûþåÎxŸ2>*c&Ÿm‰b›‰­ä{9f¢1X*²L˜ ß#>àíú
- V@÷…¤gè’¼]7n249=MÅÌÞìK% ¬;™’,ÙÓéœøFÎ\j˜ ð1ÅÑkl·Zå‚i¢×ÓØŠ’áíôœ²Î¡.|Q¼…9˜ŸÐ°¦$_.!“Ë;¤Ì¿¼l€ÎôEË,€ž²ûÉ¥Di­ùõ‡´¦êŽ}D‰É3^Êa`Y5Åg{J=mãìɳØéËyž3¸¢‰C¤M'¼jMê£-iŒÐ¦ÑmêÜ »n5? ÌSJÙE+U~ ô;·ˆí™Åq.t¶Xd÷¤Þ~œ˜Í~p*QÐeS¯¤%·.‘ŽÐ‹œ"Æ°ºöBs¡ª…ZÏ6-çîøÄ•6[\d;¤^z4’`;64è—¸ùú¤æͱw¶àô;ùŒÝ|ì+&®A©f¬LUàŽ3¬å¦åŸXòT»ßm°åô–¾)lãFí'l óVæɺÃgcGÙObßbÉœ9ª;v \ºCƇL,Ž >B?ÝKGC¬·e"°z -@¼E´É£³Hûù»</äsˆ=/Ýá‘Y¡Œå{øûPü®w\Lí1A “|U{‘_®
-ö\®€wçJ¹çàÊ»³ÜuY/|Ï•d<w›àΤc¤~ÏŽéÀ¢êñx¯Â¡ò#d£ g3 ‹ÅÓð~è÷ÂËgŽÂ‡ó‰ xT2íæȵÉ’6s3Äi75À‡Æ»íZÐE\1Æ\éɺ¶W†A' ײ¿Š M }?;Ê‚È8|RÊ0SÁ#⣓
-£5„æù Elœ["Þ,0Ê eØòµÙ[Ozò‰Ì0~lúUO¤›+ùÓÚë&x£ì®kPù²c|uÉÙ$kþ.™?Ý{Qp""kÉí÷óÃÊrš6ÿisVûa‹ÄÏ=~‚@Wí_®
-.<Ë7ª
-­Å2Ë#h?c~¥m'r°ÕEÂ_ªxs…ë6‡ò¾øÍa»‰¥ÝÙü±¶Gµ+øš¶K 1¢þ4Œªä‰L^kUpø^^ù•_–ñ
- Kû*ÃË/@hUvŽ„«…‰¯$÷jœ!@ጠÃvyבmŠû´,W²|-Í¢ –^¥ Õ~€Dô„²_Áô†­’"Æüĉâºàø#cØ禘Ï*íX/‡¸Ïœ“e>Ü|õXHÍù;û:˜Å)Ý÷‹d9gÆ–â4àaBŒÈŸÿQ4
-Û¯B UÊ#à>ÉSV§$Lì-íÏ5gˆV ϯ*¢BüüÂ#‚ß}¶ npþÒtd½­¼ U˜$Dõb&$^¡\^Ò&Z"/˺+Ü-}¼Ò%è‚Z眅:}ðû9•‡ÆA‚ºYu§À æírTÜlP0Ô"šî·â~! ÎÍš*@5Kâ?óß«Zæ-â¿PÍó÷˜³µ=jô³>—܈¬[üO?)¼a5û
-®™›÷ñ?é¯ÆWóÓÐUs»ù‘°yÌ5^(ge›${C­‰âÏm>² "¤éÝG¸Õ£+Ú$Ø踿©—Ï«&¼æ XwÎÝÍÓêÆãÊ8?´Ígž‚,'Å=Ò"‚·—–/xÕúÏÂNþƒ¦îM)üïê'Ôòöº–ÌåÍEFÆÔq§rfÔ CįQ9ZY‘$r!ñ¤Òê6m<YZС.©<š©V^«z{UÑS=ìP
-køX%3Öxúõfj¨îŠn%^‡ý¨·«ið´µ»Ÿ«´s—Íô±3ä0ý—àqŠhÆ$¬Ý`kܯÐD&
-è2ø»Ì#œsL4õjñšÃ&ÞD•Ÿîi¾b&,ÜA‘ýMS’ÖÝUµD£à9åù yà
-vÁþÀ98ÚßÜášÍj‹c7MI·~¬(‘sL#ù}Ò3†¬´(Mˆ^
-´ãÙO²ají×X†_84ÍV(N“à-{D)´éF¡0«$½!àoJþÃdv/_øõ(ÿÇ€ñÚUØH8ÞB
-Šlz&,f^ª_! ì?ãlâÛóŸÛ2x2¦X’yÎèåÅ„Ü3Dó㌼)Ø\
-™á´øEˆV¿D<ŠO0ä‰Vbj&¦¾mLBÎ2Z܈öb9êðU¿È;nµ©â6L0 ƒ+–êoˇCrÑE.~µ>TüSØ“Ô7X¬³‰®?MMå!ö½†Ô¼u–Oèôt›ñ’÷P Cbt;´·ðièñÈ•Þ°Ìãaøº@gWÙÛ#Û@ë¼ô4cœ9.Dõ¦æo‘ z2>M÷5¶þi—~Òu0¬ ¶qºsæwî®´QÃ9çǸLt–ýì‚Ÿ‘Mz)>©ûßkÉ£ûËI÷;º”îioï"’²›U
-ü\Y&kñâëVÉî»x—ë…£3ª¢9µô1ÙµqQ±=ébÃeMq\—Áª¨¯Žêî©`/nņ|ƒËþ2†ðÍŒJkz¦DºmÍ«ŒIR4ü\~5NlðÔÖ…›ôÇKÉZ]TÉC¯3ål•Ì…©…Dî3jSS©)’tÍêWw$IXß[›wºV Ÿ
-WT™«úUòŠw^PÙeU±‹®ô‚hÝWEµ^Ø“~WÓcÊhŽÿ¾s ±s£õI›g‘ù¨ƒ¶`Šÿw…¶gäs (€5£ªè
-xÆ}ÃЂM0Sõ,r„™ùV+ K¿×O&ÿƈ´`¨;­E{irf0
--°•cœ8òC¹êÌj¢L=L«Î1þTDJ—º»7ÅÆë>©Òê²Î)BHå*£cúHY}~ñxI,{é©Æ7‚W…îûjWÖÞ§…ʇçãh¿g»_óÀ·YovÜMKiÖN>ü”˜ QÕÖRÒÒòǧ}È¥Aû–Qžj^¢©G ¿s› yJG"ñ?txt,LýÕ>«Öp°±_‘˜>ÞPo$¦Õ^<…%}¨ÊØK¦D”ÔS4¥
-·*S’<Ü–Òyñd;’šÔéIJ»Ó~J®Mn>ÉÌȸcI6ðu¯¢†É–Ú˜€åä©Ši77Ê_’5WŽ2' 9­øtÆ^}/ü˜8%wdáÉ
-¤A h­ämŽ4™5
-à lÙƒÄ=ô3¹þ»_2~”–­OgP³¥s
-˜C¢‚þÕÔcº¾ÆdÚú²[ÚaÚÛ’{<Ð¥ùƒjÔA {! ß²Û“¬Èñ;O'Èá9+wEHŸEÞÀµž¡&†J¯ÒVé?fáiÓº j0¢5瀶bhW”ZxÝo=”¥Æº 0–ˆÂz‰äöhK5å’m¢ä•oçÑv (Y€Ouô±óà¿t¹;‡ÁËe=¾ðRÉ*ÍïyMVõn²,¡$v:•ÄQçÚ³EãÔ.›yŒVlò;æsvn·Ö,ôõWi.[¡÷ÂÉ¢@•¦­„¤34SüD_!“ÔMú›ßF‰>J柣ND ü»@$ÊYÀ~³-³’µïCÎMu (+lBpБÌÈ^úâ#$œ~÷2è /@Ì£ë6 3nðhÛ
-ž;÷ª¡û‘Ûª.âþ—«¬æÞæŠ3F¸¿q3ã™Ü\ÙŽvÞZnþZ"/ËvNF”ÜüÖNŽJ2V{œ#ΚV¹sØâÏÈe_ì‘®àTˆöa“8C¢°!ΗÌ÷>FîÎL¡ó\ÞþM{û—ü5®ìeH~7;FÎã Ù ²AäúÁ³»¤—B?³ÿÈV¬ùÂYš=Û©‹»Q i9ÌJ.sÓ¿c%–è•FVb‘dÕ¥iL–º`Ûa)kD麛=W®Á³Èœ¸œ‚ãÍ \nÀèçÃeÕ>ŠN¸X7Ƒ†2Iª¾Yf-Òto7±¶«/®~ÁòUýè„as[š†`W›®*v3_”`~©û‡æ:kêÌâ
-*Š€‚
-è´¢e)DDIØÙss³Ü,÷f_n6Â"¸€Š:hm±h+Ô]Aqñ•ÑQq¡âSaž¤Àç9ï{~8ç|³~bÌh6âG«îíZÄ ×N\Èh´ü+„Ë(E3§0ï~Ýùô–ÞÀ†kô–T‘MGºÎ²¼èüÎ1ü:zk›a'LáøG‚±¨‘2‡>ˆºýÅ,
-ýœ¸ˆ=@€ÆIhÆs¨ˆ²á)H…ÞU§OeX^mÈÁ7R7Ê~Ë,ñûê,é ñ\jí´±»¿J„ÔŒfÌͬíÝð¥ð8!*¥]˜JR:æ‚öWâRÖ]ÓMˆÉš” ‹PöœZ«ð;¨¸JÃNÞ.8ɦ®ÏÙÆÀ,Á[¶r*ýΑ¶]MˆòŒM"waX)Lbjd‘`ç>:ÿ?ü¾íù|:?uƒ>^ÒÏGÁ©û$˜ÖfaŸâ.Š
-Ê¥_àƒS‹ø%²EDð–´8½ ¤J¶Æ=£Ä•K¢Àâ©{ƒ·À´Ü6r zþGÄãGêò«‰  ‰Þ óÆU‘ií<‘‚—ÄK’gçå"÷¦¶^ €qŒ
-ü£ôùI6±°¬±vP¦¶‘éWÜy^,š†u¯c/
-ƒŒÂÌ÷pt¬ +ü°;Br\Ü•ì'> ¬Þ-övø÷C¹NeÊ”Ûô²ÈL-ÊŒ•qÔçK×H½”¯r Ä7ÉIÐ d<òŽ¤ù¤BðgNelB^ÖƒRγF2èÒAÓqCR€&ätŠƒô³7ß„ü´{" D9š·Þÿu)—òCð­’w²¡æ1úˆt³}?"þ¥¾'Ç[Ý7oÉÌ©«~ž1…{Ÿ>Rìu*ô ‚íÊ–dÌCãôlÉÈÁuøtqf‹2[ÍlÒ~{S4Ã>±J$Œ«÷÷.nQ¸nlåPÝ#ü
-ÔDæQ§žd¶¡‚‘V„Óídè24¥Œ±ÄKªGÌMËv«ü˜U35«˜KJ~Ù4
-§;•^§ jÆ㛑Qõ`ØexHý³;±JË\*Ë`lú¬Ë´KÄh¦×k
-&”ƒ–ñtùˆéF|(²Ý8VÇ¡‹Ü·ÁR×€§:ϳû´oÛG*UjSKk¨ÌnR¥“ï±gl¸ ÷ÛÞ…-‘6¹ûÉ&¥±NÅ—´ÍÇÇÖÄ7Oâ4”ÑrGm´òO[du_T’×vYÖ{‚ ÌIyØ\ëaR Ky¶¼&•Pï7ݪJ)éløƒ¼"—Wÿ5Å{K¤å åÓÚS_õ¥àå¦j
-W>èÇ/wÕͺÍhú4EèõkÙ5Ë–’<1òU‘¼Î[¦táþÝD°Å>îQ!˜.kR¿Ï涧ä7˜uÆ
-lûªˆ/ûüi^¸á3;i÷°š‚éÚÝ0ƒæsÜèÁôÄ€­˜ZÛnÃSÆ
-¥»ÀqW7ÏN³“p:ó([ˆ½Ý5Ì6‡8·½„Vùi•AFÞœì~h¹9£PÚldüjì2îdO
-²+íÄñŸ¿6Âü1Ÿ--üß1Eú×üwvø¦ þ=JCH«šW¼3ž’4Ü&ŒxÝñ½8,¸Ëà&ºëãÐÔ#RcŠ3Dåvzý6‘…RS„¨yuè´_N/nm÷ÙƒØÐvTÖÃàòÖ¥Y˼?êåRF×°KzÁnª¡9ó¯ã•ÉþQ®æ4ùgœC×^Ù5l`ºP\ܲº€âýG£&ÿ¦¡Þ«`÷² õ±9ÏP¨ÒñÔÒžÙ²XÜÊÎrÕ6Ô«Œ
-V4,ùÖ{²a Ø„ÑÖý\tcY`]lÎÇ¿Ô¾¿a®§°r‡é´¯Ø=bèÖ!ÁÊ&ÖÉûYÃb Ó^[\ºaYt­$w
-¥êø[ÝÄR¨)¡§§iÛìº[ô{$™ì7f"¥˜o ŒÓò“¢X‡‚p
-»Àz¶BzðÎÒŽ'hºO|ÅŒ4ǧ|-•jáÂ
-:ž•É}Ì´a«
-ªUé6§DUÎeõ"udPO:ª¶Ç]£x+¿ì ¶GºÿB½®˜]´€q:óÊ¥—'ý:¶-ML3\ÑF$ç7…Kà3ê
-Ãœ3NÝÃ|›ó/Ð'ëèO¬-R_—1Vh&׺ N’Pz8de™ºî å‹ŠZTH;X‚†ÐåŠQÊ6Æ}™ñ˜+°¢ 'h´Ï_î
-[•¤YmÎ Ê~uå8Áíp`6*I ß•Î`S8‚Ì»8s™nŽû9O3nX¬OE /7f•^ê…lËbNÖ[®PBµF¦O¬‚.Ü9¬€ó·ïZç¾_.Í5¡>¥F ›õ S¹µÌ‰µR×'}ΪѬ`_dÿXš|ê{´dâÐHXÔ¾3šQlZe7Pã©R¡ªq¸Ø´³O5¬ºOkZþÏrx5u`a
-DPQÊ®²²°dß“——¼ìûJÈŠ ƒ£Rk=H+
-*­#u)£èèh§Õ) …Á)B§6ü¿sï9ß¹çžøïHªZGòµzçG’†ÍTø"9ªÕ3hŠD×ͺ ³Ïs¡îr|ÆÅbã4þÅy ¤$”õTK ºá•"ù$×IÚÖ~Î$v(ˆBìÖ#].²ïqiÁ?­C°¹N ù–ú¯ñ~úÞ±Ë|ìíÜ·àLcOÀnÎö¯T~ø³ÜýäþvxjºÀ̦5<.ïÇf\K<ÏÞ2pô:CpËõá•Sây,66‘ê>|zŸC
-Œ“¨ë
-T
-®†Šï!Œàzõœ@#(˜ãóT ¿œ¿6ªŒ ^ó¢ð!§R S”¼#Ð>E/áSÁq9¥z_ /G%Óˆ0Câ9Æ[Û¼‚@”(Ù©”ÝP•é À, }ð¾XŸT…Ok‘‡p¼µQÈ«U¥G6 ª€ ¯x2¿e,¸Ú>
-ÖgS'µ"b'zL=Nª)c¨‘s×*æÈ÷“bä¿Rˆ¡ëä÷)W<ü#–S ²µç™›)Kê÷Ìý £ª
-&¡ô”âLã¾\¹Œ9WËtÌW!Y1󲫬å«ä7i*ø%”ÕþêúwJ_°½ä¦Ü îÌé–¥ñnÁWJñ„!pÉåþ³ä-0éT`¿:K6BÆ+»¥SõÅzÉl‰¯L,~“³J#ZL´HBEeÛ߈E÷q1
-Ú¸¬ÂTD}é­bB;º*OÑTCÒnÕlŒ$OYŸ¸Qœ®0m·‰z7ÝoŠ„9NÅ» |hý–DV¤[V¢’eÆÖ©b7É£Y¯ÅZÖ¥H¦Çlþ¤Ûä~Iè)Ü»¬J•5§ø¤ÍòoO–ÕÝ‘ù´©%(ûŽ,¾hÞZ°GøÊÒ¼mR˜d´¹ë!¤ð/NEWutV57z;ÂjôÇÿj¬s·ý»^’^lDçǾ0-a®û­_a®ÏLíØŠówÚûö44ç°b^³ppi‡úÌúô&nÓXì ã¾æûþuÆ»-«Ý‚ ž-cÎY4Œ½_Œ´¦¶³šg ?ÚjºGìIãfHõ±ú ¤%ÿÃJÒ‚[ö%Ï©¨C6Oz
-Óú°#ý‘Qî`”Kõá¶ò|ͨ%cï˜j¨Í/&\™Û: [­øFƒtû^Z
-ªžw" ~><¡Ã óŠ8Éièú½µ}×XåT8°Ç³QÙ†VY<…Ä<ÏJ=áÀEÀÛ7G8v6Á¼Z:¢%¿·¶hBòò94^™Ô¥m!1¼ˆOD>íp%¬HüÙÞGè‡ÙðÄ/Û`rqÑ;¨±N…mï~MýÓñs§\©‡/žˆ¢Zh:•(¶í¦¥…MXžÐ°^FÛ.꜋‹.–Y½¬þÏs}5™`a
-õ“|ï°i-‚¿0ÐWs…÷
-Q_Gå½pRjŠyÓ0˜òÑ׿’t¶©¤øj²ÑTÌŽóԊD1·ëÚ…”Ú›NÊ:ka? ¦øç7•eê“棆k–Ø_µ%]a;ëזו¯F«=Ë9™Ô-b= &¿óMm0-­vDÅ'^Çj´Û+µ¡/5(erÀ^õ+E·çL F1ä$¨1KŠæ•×WE|fÔ×O£õFMK¬º¡¦ömèí:ƒ:1`»Ú¥fÂóƒŠXýЩMÕ*i€9ÈÊ
-l?+Lw?-NxÕÃ͈Ôwɳ\C0–óÙ瑃f ÎsÒŠë·M;iÄ‘`°Ê$èöµµO»“0zúÁ*RÙ¹œB9é@Â"´k¬5ÏÚíÛçvÀü~•.lð³B?îu
-^DMk„œ,2ý.#£÷ɲÝ\õ³Ò!{®^âƒI4ßÔˆåµ.~°Ã§ælDc‹BU\bò«"c äj¤Ûvý‚ÊÃöJGÉ|ÏH`_ÕÈ2ÜrÔÜÉ넧ëæH»³Ñ¥ä ¸§tøŽHH®†BaGŸ :‚ú‹ýBÖfšó°{–'ñª9
-[ˆj¥øaЧøñe
-&hè´°z6FdÄy?¢>g¦Û‘x&él$¦ŠÙÜ^œåÎ:¬¶Áæ³^Šèøn¶‰úŽx-'-µ¸’û]èO 5×⽜äØÛÎ@Sä UÞÚy]°Tu à_,zŠáWPT„|BJ,É•}`8Çß´y?pŸ7gË¢uóŠÏ\JO(_ØâŽvOUue4•öÙ+Q±¸Œbi²?A.jÞÿ´Cxy“˜´R¸ÊÖJì駥þPÕÝt㸲rðƒTôúfd½d$ÖºâFR>Pâ¶aºL·ñ'î´ˆv÷¥¥äê2M—Òë*‰¨×µ¾TÕ]`WÖÝ*ßcDÜ*åûhøA¹e#ï"ûɆKO9öJ“ùíKL‹Ò2š¹JÍñçø( KgK3jÔ‰f¬Z¶÷nLåå5‹ýo•‡M(½_ø¸×>éFO‡‘—ÚÓ¹Gi}<´ÃÄ@w¶¬#Ndº­áÙhoo4öYÜ Ì¾¨FÙ¸2¬…—ºÁYÔAƒšz$ÃW±„Öœ5ÃÃCoplâiÆÂ\ ³ˆÞ3Ä2‚l„;…òaá¶<;šSç?
-Úoe¹*óë
-°pù‡²}¸÷²äœ%„á
-Kö"G²*æ yE™%ø¸S\ê¡#§‹áVï9¿ ¬Û¦2¦4=µâ¬ÙZH…W}dÃñUU¢ù$¤UúÇ>*;ÿ$;Éd'=–NYÝÌ ,|ܶ3Û4§¾”ù±q¦T˜=©ka%â´õ™h±s¤€ä¬ººÖU¯X7Fl«”[õå oµš1apuxf¼9µäQ¶Gk4³;e
-˸€7è‡ß5ôîxB:¤y¿î¡¬Zd¥Í«,¼`2²—?_Ía[0Å~9iY Fs®3öÿ˜g¹× ¸Ã‹9u¤¾ ò<,yxí87¼þ© ´1‡‘‹¯¨JaÆ¥¢,O€@/g½½ÐOÙã”›Ñ94 ð|.]»1÷6ýè'Å^Ô
-.´¥2…}”´"!<ý4t¢H~(®-rñç2¢æ5DºH@ùÜlÚÀ"K”»““îæ¿£,“¼/S}ÊëÓÎÒÂÊ"+ ïÅ~w ¥™«£—F}V dRz™,¸¨:Èw&?­ÚC~Fq¨ôJ}JÝ¢ð‹˜¢ÊJý’i¤´ÕrjzEÒgUÿ#±Úp]ZFšÖã%‘Õ+Èþ [íPj
-D¥¸àRNXAÐ\0JSŠ¤£H‡é30ý½7åÍ›7½3 C•Wc+–ÅU#Ær# aQOL4E³Ñ™?às~¿{ïïÞs¿I§èªÖyô?›y>ßÒ’LŽÔÖ¸Kd-Þ£J1Êv
-%sdŸRÛ”eï[þ$z,¨åZù2ÁH5ŸÿˆÊ[&Ht LÁÑ ‹UàOà ì·¯Ë<Äu–ºÉŽrEðá¾€{i¼,8+ןwM2ßÀO–œ\ŸÏ7I8Ïùi’l»2Ýewkv"9kÔr6±ªŒU\¬RšÍ*¤q¹oäGCxxy¨‡„;€:j™œY°E)a»Ô²Î°!Xidÿj¸” q(ú ¸8ÎSí“Ð=œ÷Úl(ŽPíø9Iueé&¾åk)«­‰W1Éþ¬Ñ=k˜Z¦b;8˜zBÈCŽ³ùƒû4›«Ú•a¾vþÀ?àsuú¯UuPÝæŠ\Vf»>+›5Ð2ÁŽj&…PØ6»šuR»É®Ô!
-aÑ+árù‘Òkô!¹o©4 í«É`¡ÌÜ—ëP)fíô%ù¬VñœôQñ‡T™èFÂ(ZÖ]sŠö‹,”ÔTR‡|O)O?‡¨hŸoÑ# ]¿6yÄл£)ôéOçU ,FœéÙ ¯´›ÑE})gŽsá©ÚÙ´GðyÖÒ˜p/kw~Ë–»¶I'Y¿Ù;TdÀÜg‚YÉUž•Ò'áñƒ‹I8ÿ@Fâ*ð‹ ”8 $¸I¸à+A2((²+yª8O¬æÏ‹W‰»È—EÄ {Õ¢ýbÚWÕ"@œ}@‰C׌Štâe®Y¢¢gv…Öˆœ•üHáÅùoÂfE`áea±<o§V¸ µFÍ CÐÅk2…ÿ”ýèê* ]v%ë…¦LËy|è–KJ‚´ú3…®PºnWê(¤ý<Š
-²°2«G®’2Ñ›Bjx$Z-äúµ¢aV#s¨/³h"õ¬ÂK6WZ,–ɳ–¢ñÈLü9ˆ0Ã~GÞ"~4äƒ5"[à»âKåè4Ôh¹öû’q§¹‘É•áÕÿŽ÷Fˆªãa¥Ò1U¸_´K¥Äªá)„âP åÁ ?Q΢9–Þ’"ÙîzÜ®i$×Æ5I¥Æ0ü]xÆðoܬ¿UJ&²]ñ:QS{%KÖßz³øÒ×<° –~m댋„/7®Æ£ðëi_‰ä˜y
- I<G®dk~°÷xÕkÛÛ’øÝ1¥e'w¦7¼¯˜Û²ÄòàüÔU·y­·Êª¯ý•¤\‰ŸöP”ÊxÛäV©©ªnL"Ð N6tÖĦ>±gbN›_¥ÁÇÌ4Ê!/¼e%¥³ÁÐO;m¯ÅÈht§ÄWv6¨º·ú›´[©ÛÌiô¹˜¦åÌÅÁyF˜yÃËÓ4Ê”aêt V„]ÑÍ auãƒõ ¬#ùëÌÎ쪭QÏYm3rMè/q{Ž~äÁtjÈüD»¢ ×7†Š•fàiÓƒ¾É· ‹Á„èºÀê ¶. =[ôn`4æŠêÈqSháæBéžrÐx_º5wÔ Ï%ÇènÀQˆ…ó‚ðš~x“'G[ ×`+qb«]Q›2Ô¸²iÃ=UGnŽ~»òç¤Ú‹JÏ(¬†£à¬ýAݪÈôd«Ç ȉE7ªÍKÊz +MÿÊ]¡ã’ˆš!}ïæ j–nh-CÕ¦_èé­º¦Ùç䃊ûíŠò›a¦Ù­¬DÙfrÎjï6–$-Ó4ôn®UõZ×F)¯Zpï•×ux'º@ü]U•ïÏ/ìÙ³¢Û¿Ø3íUg`iUì¡}…åÚ°ßÛUÖL¶»W©–Îuœ¯òù+ëÕSïØUå‰î[¸Ýû;u•¯ÓÌû¨„žXJP“v§åOâÅ€©–{$•KFÛ,qƒQÏÕÞr¨uÏHìÝ.ûúÈ}iÞmõ”×ÛfZšh~a¢æåtŸ€ÛM—訅BÇb0*€ÛiW­ÎÌC䶧µ‚¯jZ®×mÙÆn¬›[nKfi c¬+.º&oV.£ô
-Z§Ä>øÿó\ßoMŸkÀCZ8à)* µ€b
-êðùå~®ë~ï7¹<Nözƒ©QöÒÉTî!wò¾ýðÅB,þùC)kªÝòE‡¼+ç½ ÷+ŸÌ#¾6å-÷œ)£çpê*ãªA õè…™¨Ao…˜cŠªc~­\_xbï5Ó¼þ÷Àž²z¾gQªïuÒ}Þµ®zãGeª¾X~ >TÕSîs¦‚V6·÷¸ÉÏØØiŒ1=2J眆Jhê@ UÍ•æu¤;·¶7!³0
-ß½Ù\Ó醮õý¢ý¬—«±ƒ%-;Øþ=.ÒÜeÏ/©TÖ7DŒ$v°{·.Ê«“‚–µÂ|ÃZÑ®³mcDÖ²+-C¤Åu_Ïï{¯>ë1H±1]ÿ"—D^n×R¾ ÞÙº“:êëÖÜE3ƒ[²h9¶»¬ÏèÂÅ ‰Ù7–TJOW+3 v«ÂœLimc @ï6'³é[Öcì`Ǧ8v§­ª!“ó÷b‘RÝ{•Ð1Ï_Óµåòu‘¶Íoù³PµE°2Øð\@;4"›mOÕÙ §Óÿüm{·Ä ߺE1Ñd‘ÄA‘¡’}C=W²¼®¾B¶}[3']\PJäG5ØV¯ò‡mnY¡G XyÊahdÃ'J„[U~ v¯óWæÛ…WoÌ]¼Wn÷G¥n½R°¶²9H7ÑѨÔ¡Au Ú1¢v£ö‚ëÛZmˆ]lU§rñÏTØV¨A
-sjÊ6lŠhm,M†Ôy•4Aˆ–À’*0¤æ¯ÂÛv”J–²RÈ?¨ï ˜Ä´>ëîÄ2C!*Ë#±q0êMJ!:ÅÖCö‰ÜÂÀRÇ|ÿdüF¿a?Àµ2ÎÝ‚ÅcÙh3¡«dBš‘z¨ŸSIÎt?¸%‚Lý›mïëF[ÁAÚãxÁY‘GâÒ0mê;GY1űh%[Ÿsጒ@×9é q·_8ùG>r˜ íWó¾nêå¦Ü)jod€E“…z¤Cö.qúJviN&¶IfÅÔð8b›øgŸ
- ñŸv|ïs÷‰d¡ò©%:uTÉÓÛfü‘û—è&òL®ˆ0Ñç~–pï¢èÝË.(R½ŸâU
-; _)§w%$ò‹Õ/à÷ Ýt#é«
-~ö#œu`u[ëwø.–¥qÜsï“¿Æ‹ååYìü_•-þ‡Ç*'̳ɩåßk/§––)2* iø9¤¼$é°7fU‘zÏfl¡“×cô9}£]´
-ú</ÇÓBིY%õV(ê¿q/ܦ,Ç— ‡9(B¿è0jtI4 ÓS:²q¡Ô™ì1×Köh^š”ChhCȽFÈõÇæ( ¬|¿|y0%o:TA— BîQ–ÉyPI\¹;hVÊ“×ã2J
-Ä¥[‘Qºr…º_k`ÞÇ9h”ˆ "?7æ<18ϲŸ”ª~éþˆÐ©þ t]Z*7Ö¡Ò^™¸%A™ÇŒ#òµ¨ðÒ7L{Lu‰7Â7]ÄŒY LêŸîL¹;
-ô i›\WkIý±Sœ•¡©y!KC:›31hZÅPf:¶ß„ùŠ„0’ƒC>C¨{Þ¶$tR:(Ï­uO¹ÖR4›ÞÜâ$=ðjl¥÷¡Äuq—1?פþç9î”ùSèi|cåõqÎF!¨_z^žSÂêK}¡Ÿ`d¢%DÎT íwVŸ>Å;
-5€'”\ãGBŠ „ć…ÓÉÎdƒ^u•ò¿x +•¢ë[¨^Úá%e¸‰ ¨Öªúp»«xEÀò
-À œ6…%!ItãÞ¨@ò•Ò¾
-nñÖ#ܼ°ë(a¡«ºFìqì&mqü3%—\g?ñ%ÙÓ†ñÙM5«Ÿ¸”ø¶X‹D3‘b$ÊW×ö Ÿ‹¡öÆ¿‹5&Í”D4Ó®Kƒ°ãc²Øአˆ.
-úë1Zëšo
-^`ú~¿`Ç6z ëq¯©Â „ãaX‘Œø½Ç°ø)±ýӼ܄'À¹84 n"Db.ƒâÊ
-Ú¸»hè>¼¹ôwMv^ cö¦8ÞIÆ»õ(~óÆj?¾’¥
-eðo²®y†¨l/—‚Dl5¯€úžãŻרãpùy1œùÎܣܵü‡«´Ü^004€{ ñØÃïí.™·%CÔA2¼ù2ë¡dÿWuìõ’šœQö>‰oÂkL<ÒÍßòò‚Å5.Å¿È iñ”f¦¯fh³7S­ñ-ßÉ|¥^–³Š…T¡jX[•wCòY©*¸sG^1­VeÖ—ä+À˃€˜…åó·L³²·3“ —â/2y†èà{Œ†¹ì+ò½.Å;Cçt‚äJ ¢}¢þ Ðáô-³¯>Ù«y6q<ƒÁ³Í ý–<bØsä
-—bk*ĉÔª_ÖVƒè¡âêˆúŽµ«Tÿm Œ}£ÎÇD5ï1o¾øU³
-0Cî¤l…ËçÓ];¤S¥k)ÃÍ=RZ@Õ[É·ô5…ù‘¾JBe„Ç$ÆÿNi"ã0 -úìR4HœÅ~€9.☫|DϸahÑ
-QD~Ÿ0Täæ.¾Œ>"x*õO¼>é…§…ã.Ey+HVy55R”ƒ•Ws•éùÑÐEk*êPxEGBü¦ß;(J³ Xâéµ(8h©iqãmh¹‘^™ Í0`óö€}ú´”_APWµDèÒüLü£Z¬‹]Š<–·4âÁzGÖ¦`Œíoy©üZÃR|½u^ŠŸg™ôCð˜F#ÌnŸr)ÜÌVaåô5ëƪwˆ–Ššó9³­nój®yIÃÁÅtó¶Æ
-xI«®1bªIyâ>}•‚›-A–ðÚ¯ÑÁæõOShãšìKF¦xµŸá6xq†qQ
-Ž3“°SóU„‘›\kaÆþ椚̩ÌDi©~ ·?{‘>¾J¯3mátßÈðZƒ„øtªÝÔ»]ªY §‘N¡ju]äÉ’ÍÚï©QYílZZÂsˆNÑ´Ñ·À“´Wé>Sã§Ý¥0ÕBÌÂj»æëËâõ+Ö7ëºÔqìÒ„fU7û»ð™ªmì ¸·ºœÝ:Õ8ŠÁé¿^Ó;õ#ðeÕ¿Õ+ ‚â*,Ä_ç©ì†ôñCÊY3ì®â´õMåÿßSšªU*™¶ªLùXÆ.jQ†È–g²_I¯ÅWËJ5a"9Rª†'ÈC¥\y׳qH)ÒåVÍUü¢-Z®Ö.Î\+ѤÆ/—aÕÃenš/|F¥[•¯?S âPk
-^”YÊ×>”•˜ÝVŽH9 &yaŠòùI‚ÖxýQÕ<èzU1\–µ¥
-Ù½þl§*7ù}ûô±hu;Twfa^Çåúcn²Îü†YS q;)oZ¹uÞG!öuTÕU¬Orþ§›lk;ÛHF´-Àx/,uþ sÔm¸í>fdêä}é+]
-U×.oÊ.ýÕˆù=·Ûq»-y¶]†[õÌv¿iáR»ßçîgëÄÿk*ï`/p©êþ¶LBuéû±+çºÍAº²ßÚ@‰Â[»)‡î·&P®¸ÇYQÃ?æù˜iåm/¤‹K,¶Y
-Çàâ¦Åå&wó«òïa7W”ÆAÆ«X…æÏU÷î²Ûr8„Î+}E)ÆoV¦ÓƒIÃŒ}ÀqZlúÛhˆ<Ëgw®
-àˆ¹Aæ°ø?ï=‹ê$ù6-ÁÞ¡|,)!<¥*‘ǘ*z!­•³8í߀ϸu”ùPpÕ
-E© ºÖ»qd{qÕ׉Ï;’
-²N­Âæô‘–¥„ÇYH‹d×fttcâ– Çì»â#&®vŠPótQÖÚjd¡©‹ 1ùo˜ øù­ìR)ʽ@}”Áï<7õ ç³&—ßè8³w¯àyóyÒb¢ÌH¢¦04·èôÍ‚@>ð
-¥EJ…7ˆTöÏæ¶Ù|4ëê'¥r41—œ“„ãæžâ¬ nÏsÆÌ#?ÊCÅ›hkòº6¤/Ï»¿¬——7›n Œ áHIT¶ƒ¡‚c6èß±=ðzz!ñ?z·¸_)þºc¼)¯uÚe‰T»®}nSê3ÒØ&iq4r¾‘¬ŒE¥UÂYÑX\ùKÔ¼ì—88IXú`}7yIi¦×
-¢ôSëÕiG›¼‹r3æ8EiÖ…ú$f ú·ÚÌl+n º.¶’ð®*d}0QeÊó:FŽ¨œœSµ¯S”í†Éô°Ö¯äSȺ–8æÔ~‹%;
-$ mþ:ð¤è@®•Ïöl¡ÆÚ(蕉9 Ea,·_ÜŽiàÇ€/O IýÂ4ÂaÜßS8!ûÙ%UJ’õÍý«à8C¢(”&2¥J:ð;{»ÊMጫ~J¸ÂÃådméâ«rFW øjg°Yý?ªë;®©s8Ò€€Ò´Š€Z6\Fq€D,²ÃH Y'{“ÍÉ$a@QÜÞkÕ^½÷ºÐ¶ŠÕrõªh¥Ò"jÅ}+ˆmÁjÂôßóy¾ŸsÎû¾Ÿçù½Ó™Mµƒ°D]Å_CJQw’)Áê/ʹÀ5õ®¬×´2µsµ7§v†½¡}§Þå7Ä TëVÊÓøS¯†€6~Gú„”oLF¢ø YHÀ©²ŠKmÖkÂv»õ¿~öUÝô.+ýjpâo8Ɖ$Â5û)Ô\R‹‘¹²´¾(ùàgÝ–H¾m}ìw”5jœN)
-+¶¢£‰›„ÛïüŒp·vO[n™ŽHj©ÍŒ%=hº• ’Ï4‡^"‹ýl’q:iƒ“Òç%S,˜ŒPîÀûË=ªÆ‹äG°±›²Tü²åï” ‡B†ULR8LW÷˜äêÒÏ$GÅxLcLSƒÀ},ù?þEÑ;ð8Q¿±Eª$?\.”e£!&¹õ¬KKûç¥øJ¬øÛéG„‹È7°ˆ|_ ÿÒžl8!>Ë8Žè“(Y«BæIúY·`[å}ì®.úB”Áõb ѼT–²ú$¿=U8OÉŧ yˆPá¿-x¯ð$¶]ú¥0Æý_Âù¬
-ájûˆ(³“sO¼¤À‹ûH|/=wKRŸØÁ—ƒÁ•¼ç`ì p±túl>f*ºÓ¡œþuU‰þ<‰=¬T­§s®(·&zpK”½A?sLÊo`N0M¥q+~*m¥î-¥‡~F7‚^ÈôÓ5惬H]ò${žö|›-Ò¶9Y&í=X'¸V£u+^°Ï–Eñ m®ÿ²
-¤·Y/ç0ŽX® c˜ÍïøAæùdPcÜü_X˜ª ™VŸRx­6²ŽÔb¯|Cã6‡å‘éÚÆî´^FeC]¼…¡oÀ-¾F?f7Á˜ Q3éVÌ>Íy­Fsõ•£y]ŸÝ¯M©F®½¥íÁÍŠ¾£kã^NÕ¶¾¿I¥’¹öë#F›Z‡.À7¨¿Æ†–Qêfã®eÏ«CJ×n®;AjˆB JFÀ€æw
-îýmÔ—îê6êÕt¢”Žã(úI5¥beE‘•¨l ²×X•ôè¨Q•…´¨ÍŒôõ™û i,)…6QS ƒ1zJŠezVBfžì Û¹ú¬œÊ¹•/¿Ëí HQ8¸9ê…SnE%Šoòþ‡-“4ðÇŠ±`¤`,£Ü)ü~u¸tŽÈyQŠ“Nˆº]çvØ­
- ‚Y¦ÞMÐä• N­|ÙØÏÒ _ÏTd'wa£}†Ó0Zð„÷“ãî¦ùü<ûÑä9|•Ý3Áµ¯†Ãé–—3~o=§ØY>Ûú¬l0Wb=P1‰ÜjmE ‚¬XòR[lÍo¾uv:.öC=æú;.Îa.©œBÅ™á˜S[þnºWƒJ3ÇŸNì1='\XrÉü–8á»Û²Ÿè:KìX÷»j¶6â‰e †g΀aépÂ
-áéS­Ð§|NüWP´ !€ì¢o-t_àš Šƒn…y­úV|¾Ø¤ö“è³êe`HÊêE =>\½
-­@Ô?¦ý^f›E¿ko¦oó\fyÉÜíJ×Óó«8Åz‘‰ÊΰÒXmi Ëö¿– -NwØ}‹…‹„OYÏpz&˜@>ÚÕg¼ÝªHcþ‡ .«Ã «×]7MŠü£¦z‘#Œf¢ŠàÃæe"“g¦æÎ\ÃÂaã°ì@Ö\ãqyºJc™\„¨3Ü”·‡Á Íò½ðý†r«'W§QVüEá Dè|¦ÉP½L½­‡sõ\h_h—í…#ôÐ9ÏZ-ÍTúdóÊL´>˼!õ„îWS/bžn­iAè3­ÖÑ.1Fx@Ç §3UNåN^nýPOZñ¦dÚ t<¦jGLyÁâs=‚Š³>»vW¾O&-8ךs§»hvöö‡eSȉ•`wPU_´cÛaÌéÅ™Ý=Õ·}öm`«<<ìƒ$•+­»UV×6Ì6dòÖìÁ¤oº88{ÔÝηµçºzkG}Ú»®Š<<ê7Ó\õÒÓjvg!5M×Á!®wž&—GmpfS¬ÙÎg€·O3x?Ì÷Ø
-wZs«LRûqê/ë~lŸK]QÓVÉع¿õ:ÓoÑïmùÌ<Që'ÌÃÆ R]çAMXyÀu¢¨ º^¨ƒÈ©¢€œá ä$÷}ß!ä 9LHÈÁaH8«µh¥¥Ê¡rTtD-Å*ÐífY]]wu¤®Š¢²®u[bgÚÿßg޼ߛ÷û¾Ÿ"î÷ÕȹÚÔ I7ù•ŒØH”R·7ŒH§B—Hðu»£d¿të ÷*µá²²=e¢ JŽ¯t­jŽ|먾 á¹#T­¾•ÎIõ/¨¥W?þ{úÎ¥¯O»^ëŸÆ'º`ú·‘£õv½'$»^®óEÖ=7¨IÉÜßÖTF×2˵”­õ7-¯â^Ô'Zú"[x ;ìü“Åæ[U‹7ã–,©”þQyWrrÛ9†õE†—6cày'I§ ÀgIR“mŠ 2›¹¯
-ç{0K”,è^ÊH©/>€>G’@l`á—Tîë=FZ‹àÓðnZ¢H ¨Ñ³$mžÂ¯鵩K¬AÝ3D;w³¨Å×7⾎ԫÅw·‘^J<á«È`i$ M_¤xÐò8w¿ˆU-,ì/h!Ó»pbPê÷ 1²ª|*¾k _U¾;ì
-¸àØA™>Ê¡ <¿*Ùgü!½°r)JÌü‹¼;ȳ–&x§K0äNÁ\“úB¼&æ­£Ô³¶‡ùï$¥bÔ7fùp¹è¤t(Å0ú±HÉ2Š€—ª3¤Ó²G1d?źµûè
-ùbßVÖ†|­°®ÿ­\[æ†w+™tj§j?b7–¤öÏhÄ«§wJñCmÐmê#Íb.^V÷äBõ–ÂDR¹bÑ8¥¡E]4œJ… 7LGÏc.Xd£°à¼/ÅaÏ&ÚŽè ù@›é¡¢«˜zQuÖˆ4TÒq¨i˽èèbË• 4ù3˽Ê~,ãyýmoθ³[ü 0þ ˜
-€l«} ûÞTóCÚuäLõBt 2¿úZÐò¬ã°WÙ>¤´EhÃ@+[‚Řüê¦yŠµÈÝ0=
-ósç¦U"r]á;îû]÷(üºÌ{…Ó‚®¬eù ÃE=œm˜òa^2þ'FKv¥~.ôОmŸµ0O­j(›eñs¶ßº´€ ÕPk*!“þ3ùIËBЦŠñs4å{^§|{6ÏÆk\* à}XÌYž¥Ç å©ú‰DÆ=A %ŒÍ$’hǹW‹øŒÇ‚ORV°Ž‰ü· ²ÜâÖUB›øꯪ¢¦rÏç+C°a6¯‰ ¯ ‘ãK‡ÀÔ£eàä :ZÚ¿u6&»à?ÀWË&ïk‹).”Ù]%¯ä]Ü,l”b7MX]Þ[H"}ªìØWL)RI·rÉfõr?Aâ­ÆYÈ&íI¹~_ÂIBåë$Ø{XŒîlÿZ·°·—X¯E¾&|¯wø#ùºßþ؆û`ˆ¥_vºß¢fã–õØu¨·æ3ù—°füÞõømæ¨È8—9Ç?ÿ˜9ð£
-ÌŸ¯ë”NûÕŽ²º`çjz1*äÛêöüíè.Ç@’ë爎܋¹ì`øoåÙ’¼J_™·±™+-
-‰‰ÿQ¥ÁAÕÉÜÓ%ǃÄ$Ìû[H~‡}{†1Øf½KÔÙ²Â:HmWS
-µ¥Ã«d}Ð2w7ñÔõá j¾¾‡­<ø ½O¯›Œ­Æ7ÖiÂ2‰GêÖ;SW•Ý’Ê!Ø@YâsœZ~ß*âî¦ÞPÆ6îx¤QþÜ¡Ž§/9iø7cñGªöHV‹fÑ3ÌáR>K•ÌüŸí2jêZãxH"Z‚"²)ûvH€Dö} ‚@ز} YÈJ64ˆT(P_Ý(*¨C]žŽ¢mi­öéSžJq·OZÑg­Aåé(nœy8}wν3÷Îÿ7÷œï;ó?߇‹*x"Dü’Ö6²Hae¢Z
-Ä5Kü e
-tE=H÷º·—±ÿš\Æ’·W¢8 Žù7¹¡2ƒy÷èm¡ü]L´ËŠyô‹ÚÄ ªß1N<å8͸@û±û±“ù:ï> Å>›Ë6p·„ü›ãÈÓ¹à¹<ÞAÐœš*ìµ®‹5M
-àåN5Ðøƒåg¨Á³Ü¿ÑÝ]7ïcðDþ!\Æ÷¢ÖO¢Û6Nê(©·•bž¯‡H´õ‰éÖ²r¯t1gž‚“u¡ÿNÝ'w„ߢËeÎGrºÍuŒbÞJ1îÖaÔ#øgøiõ|™ÑGcŸƒ"½ÐÀÐ á'xù¾&ÚYH;£¡Ùª4›T1}‹Ï®;cÚV*¯‡™Ü²w¦f”™´Æ|œH2;ÛR±Æl›Õ{í‡ÝKÿ²*²óGÜùZPgìÖ׸z *Û¿ù©?Ê—ÖÁ
-¦×“:ÌN£”Íæ9u¼ö”•¢L7Ûo©­¹Û|jëBñjEV—QRªî!Ū¢Ú;~;ÔZüZûËÚÝxÙ²ž
-ì(Åñ†œ¦qìƒê’ïªÁE蠟ëV¥‡Éñ7å:b¹Ÿg3ìh\yˆœ²¬gå.:OšîÇé«ðÜ0ˆ7ºÒ¢›¦bÞ4=¢Nø¶Hdto{¥<ƒî¾¬çWZgHåNR•üRZ\á¨às†W*Zxˆù Æ»QÍ®ñ™l<ÆI³‘Ts|—õâX)‚…c?®€p \BÁ —ÉK‰àuðç¢eüÁ|0|/aì½hBÈ|樕ª—ÐsEG±¶ÌMâÁüs¬Mâdû‚Ä?ê*G,õ°ïHÞÁæ…ýRÀg®[)|å3…¬CëQÌå{0b•‰Iט%9*–ùXÙáÝÌôR‚MñÇU)+ë^Ü ¹P,¤põy*šŸ~uR½Hw,r„~L×îõ;í_º“°vN§øˆ"¹í¿—“‡Û¿Ê]¤ðÌ//S{Ì‘‘êͶË^¨Áæ0X 7Õ4¼’ªžÓ㊈Å#úÞ’{Y´<mg¨$…Œµ5`·ÊVs-*l¬Û»¬gÆùr¯’iŠË•[ šÉÊöL¹–X#DEhgq!N-_׸Îêc YP‹a ˆ!wÖú¯Ê|Emí±"¬ÒŸž¡PþDŽOUHSðr5¸a»+[ý– m×þ•
-äWh¥*Â¥{I/1YwûôJyõ׸jùkú@p[³†ñÈåzó3*RÝeñŸñµRXwq3¯0´©Œu%­BÍAÅ’%\NÐC)šWí’'5ð꡵
-&ð™F+U,ŒŒd5ò…gR "JãrØVDB‹SDO]V‰[EסdyVÓƒ•1,+åIevù"þŒì`Ê‚WrwÄKa¯œ¸Gø…|—óÞÆ`¹Ú%+TˆVR¥C¸Fœ÷œ{Ys*¥š÷Zó5â
-ÅÉöjáQA¬4Ó‹<>ÇÆô$ù.7Ã$C$p¯ç¹ãçõ¼Aã)h©ì„îéJªè¹ewáTÑÂ*Fmž´èK™g-‹ØlïŠm„Ê*{íö{•¯–ºÑv\ܲžsØJa>3_*Ý‘¹ÙüÛ>ÑîVµ5ü|»¦æœWG_Ç>ÁâR÷óR_YL¢!ì´R…Fã›jz†§ Sû5fÚO›2Í’<ï¶Þ `¿¶}I\:ÁõXêi Zk³R–—H*‰Ñ4„‡Ùè[(ßxúÔX›á$u|I9̺TkV—ÿ…z––œ×l£_‰×¼g¢C½µ%¬*íw¬XR ‘õnY)
-¿SU÷.nkç.ü«°“„ƒÞômâc‡Å®)RxØbÛ
-ΆÓBL¡ûÃ.„?Ž\ÃD˜‘C±ãq÷ãߢ7nŽO(Mä&™“¿JO½Ÿ¶á˜š•™ËiÊÝ–w0ÿ¿
-    üóæØÌÖÞááßÛÖ Ñ!Ë"Ä#¾$¸%³&®'ª(¦)¢* +ž,-š.•/‘01‰2†3ƒ45678€9‚:;~<|=|>|?}@A‚B…C‰DE’F˜GšH›IJŸK£L¦MªN¯O´PºQÀRÇSÎTÕU×VÙWÛXÞYàZã[ç\ê]í^ñ_õ`øaüc
-“ú”é•Ù–É—º˜§™“š€›mœZHž6Ÿ% ¡¡õ¢æ£Ø¤Ê¥½¦±§¦¨›©‘ª‡«¬w­o®g¯`°Z±T²O³L´IµF¶E·D¸E¹FºH»J¼N½R¾W¿]ÀcÁjÂrÃ{Ä„ÅŠÆÇ–Èɥʭ˶̿ÍÈÎÒÏÜÐæÑñÒûÔÕÖ×*Ø7ÙDÚQÛ^ÜkÝyކߔàœá¢â¨ã­ä²å¶æºç½èÀéÃêÔëåìõîïð ñ,ò8óCôNõYöc÷jønùoúlûdüVýDþ/ÿÿÿ
-R e r xzzzyuph^RE7)4=@?:4 ,!#"#$$ù%î&ã'Ø(Ì)Á*¶+«,Ÿ-“.‡/|0p1d2Y3M4A566+7!89 :
-¤ Ÿ “ ‚p_L7! ðÖ»Ÿƒ}tfUA,
-bÊ€ä}àS™÷ÛWôö¼?»®ò™æ€üCN÷<üÞ-Yô4ˆÈû³£ ²ŒÊB€Ûé‘ÊYp«z–S–)j"¢Ø{%î>6ìÏ4àø;ç>ý¿FVWíñÑm¬Ž
-Sý^ÖD±iéÀ*÷¬bPk‡ÙÙà†ÔÀpØ©È?³%"È1ˆ#!ϼK`ùµŽL±<ín-eª2*þÀÊ+Ý) X䥂C@µv2l Q?ñþ‹í(=ì0Éqåç½ Mzï«ÇƒIãz·¶¹¤7MEïY;ª¦ä Yµ¥@K (×-ì
-ÉXÞùJ4†^¿Æ¬w¤ï¤/€ûI!5
-Šbnñ#ÙF§Œ‰Oìüý
-)ýÝ¥q A߀«½O’°kðVÂô¬Ã^B™Ûï ™f8KĈza>p-Fð„þOÚJ*€ŠÆÉYr(º—¨".À°Ož˜'š±ýºqÚ䦨ÚéfÕårC¡üRJ'–dc~¤‹híÕ!€Î?‰`ƒÔÆ}WÑzBd;…hѲG¯„ϲåm½T •ÖSAi©j9š<î „
-ߨ×ø%É@`æÅ8xL¢®T­qÄ—=¬,Mk $hJÔü®ìöd˜ôÓþ€x_§r¢Ì°gʱÀ­ht­G,ÒK±ÝytomVK0õ¥¢¼XÇ?R<¬J%žämq<UG]IÀX©½'tè9E¯Ç
-$VtÙÖ
-ÝíF§øgml0L×1¥, ©œ—¯Ïy¤+•HuÑÌ2‘‹f;Ë[¸T½0BEÍÊ{Ž:‘¯Åqn¶ø´àõtoÑT†]o®´”•–úkI,
- „îLgV_R:­KÏ‹0¢dêP?= ËÆv¿ÀEÌ·Öƒ(M4èm”‹šÖ\—ùT·k׉o–ƒ´”‰,ôHœ§=³Ãù”‡¦Þïé¤Zµ»w/³®E½Iñ-LQ¦ÿµ¢[ú©ùÇ ¾8¦F/˜gÖ–'$‚?‡[òçu~fÄgõÔîhÜXÒjšñÝš-³ VIñmíK˜ÂÕ€,%išbÁŒQŽþç*e9à7‡·ˆƒÀ—®ÏèWK«‹üÜM™YiHtÑXÆT÷¤ÅBUD”ÚúwÜ-Å4ïþ9#i¯Ô—/ñr]£hGÞˆÕ/¤
-
-lD2 h§Â‘Œ%TTòT*FÞÃédw">ö­âGüðY?é"ì°Ï[f r5ˆÌÊŠ4€Û`ÝùTAoº‡4H5”rWôS¨8ÂÖXy˜ ;$YrŒÿÜ'‚q ævUPñåV&Š×çèÌ4mù/5LJ¸òEÊ:•ªSË7Æì’HvŸy..ø› ø
-Ȩ,eª‘: EÁ$@B’KrÉå².!{A$AÂ,ÈCåY[EA;|Š TJkU>°ý¸4í1aÕÆœdžcT.Ð×ÿéîUs Rã&ùBc±h»R¢)¿‰’¥Ä
-† Pd;‘ÆÝÊŸH«b¯‡ŸÄl?1;_Ñ:i»^«½mùMh9Óœ+,—xê+(‘‡j3ö=P6uü>§¯a}Ú&¨‰¿bß (ƒúÒ0ô€®=ªá.À<ø’2&îmÎ%ë…u9¶’_ª~z¼Œƒ•­L½å!îS`(ð6ÍŸ>Õ©Váú”l¼ûW䨸¤m5y‡pgó!ì2¾·<îÉ PêR%wCý>èÅuþb€v…Õï«bšFñ.0¬¯ÃUKÒ$áK¾;¤Ø‚ÿPà,ž!ôrAÔ5­Ñ%\×ÚvüÈò"Ú
-[2Ég”wãõdx©ŽJú±æ“:”_Ú'ßEÚš_+^CÚ˜ÌÜ íŽÞÂI! vüÎ,­¶V7—2UJ§¦÷Œ÷ìL­‚N¨ITUÒK×ÉŽIy/R+“=+(Ö¨§°Œ²vÇð6™×â°Èø·!Mܨ²ñ ¼‹@P¶B‘%…R-›—-â3’ì|4Ý-ÊÆþ”ï˜)#Í¯Í Òwòƒ¨á.ËܘŒ<Ç;”ü b»ä#‡’;*œ…>$eó†˜G£Èì
-º>à3ÆêïÍñæ"íÙˆ~A•ÉZ¡±Ë$xOU¼¬x›ä äf𜓜x;Ù¥QùÐ h XÅ(îZ”¦·–ã²x=É`dšàÆ 8…b‘†i¿•dç, ÏÉÄ!îenZ
-b°èî /šÞ²ÔÔІ‘þ ßÜ2ÁôPß0~‡ “+µ›1ÙbâaŽŠkÜþtT
-$Iâ·±d­`UÄ+¸ƒíæßzÓ3„Ó 8"}×åY\úE^û\Qñ¼íܵ‚³¦)<&uZ«!FM)V×…"çÚŸ}ÎÃçˆ&aÌ€/éíÎå Ķ» ‹­¶5ÄÏ Öÿ¬›O546ƒPWä눤0ð ÒfŸGlEýbd¼c ­´'œÆªžrûŠÓ¬[©ò{K(ÔÔ"M/y%•“Á0=²Ÿœâ»zFŽBx}霚{w6{Y5¹í0Ëóº%,ËÇ4ù0œR}Ô“´vTôp>¬K@¥fùR¡$Ê7HìU( ¸ÞÅàªÃ/1¹¯0’f<,È÷1äB§S>¨ý˜Ù¨RI3#&ì&ÿÿ´pßaÖ5j¬àé•Å1€Ð9#yTõ®õ±H†9cùIÀÏû[ßÎÕ§Œ©jÙ¨’UÌŸÃ~á¡?óýÄÊÖ À+Ý7ÀÞNŒzMÕ`k†|-ækËqJÞ}(Ò˜2¨œçþÊSØÁaÓ¼Gài¿ æ;ຠíÊbË:`uǤayU“}T“€ 2÷ÉûòFtmâÌ”%OpuDìÁ‰›ãU0m~L-_°¨·±µ:ÛqÞÒW¥²gÜ0~æhuwÞ-] NVº‰rPå =<×]x;Y×ýÎ1Ëiw@á­í8,áÝÐnœù™«\(zºÆq²¸ö‹ø˜„b“ !$zB³§&5d©øníÈ6ç1Q&ß &ô «ÊC¯Àu÷ÐŽy#«À†­c%$7ý]w'z\½‘×0Lük{8<Oz †ßð¤o%4üP¨Ë—õ
-¨9hz»‚ÍŠ°ž$ßLØmxEFGOª¾$»…DcõóÛíðnò:0td#û*¼v–ÕTöâ2¼.q0û³6·Òævêg€ûÑï•AÔ¡n‘3埯ØlŠ'¸í¿±H:<@âIËžõ¨8!èmR¶SÖÆæ–sÂ^½°×U¦g„¼f
-~”t-"XÏnÃv&Ãô­°ç„?úøÍÀVAìG³˜+¿‚™¢Ï7¢WÑûÑh¤KüµDâYùèZÄ%4YF¶g£[öÐ äÄC_ÔMæ6Ð…LJ®¥!˜¨)¯9ÍÕ!6ÔÛ-²‡l?¯@œ±W …Ÿ³?‹t`k¦;Ýé½ýæpŸö}ý
-P»ç†À>Šf†{Ë’i8DbÒÃ̯Mp/Ų›FñÊ_<`w½[ßUèq®°. ÊÏËY!é'i7ÓL'‰ ƒRüz$û‡§v]²cÁ-äÞ©%HYÙ~“Ù•­ªç Ï鞀ws{)WðaÖñ˹ÐúÔ‘`è¬ÊùØ{¨[zÀÎ ö¥ä“Ï¡•ö½Á¢Z¨& ­èËz
--ù† ƒòU‰Ï@uÖBP.8›jz …Bä£{G tϤ1˜Þ•q# Üßò¸^×oÍ2†ªN*`®D—èZçm錞cß@QYîÕ@ÕÌðÄOàÉÁùžy`þ†Å•^ £Í)ÓH¬?€?˜Ês %Àý¢ðÀJð@öf»à-ëÞHˆ%ª{#}Å™ìPK
-­¦Æàè‹ÏÉ'ðÏ玣· +¸ÅvO@¾Ù%ö7_ß*Z-r*Çé~z Õ‘ê 4ˆŽ!ñøwÄBp‰°ÂõG-q.Öa+Ãî¡cÃÃ"wmqk=½¨ÞWfB +k^ƒ²«0‡ø¤>n‰puŸ5à
-¹1ë°Í9ö~±(Vì¶ýZQjsf¶ü•b÷5~Nlï, $LAE ¾±Æ\ù–ÝûY†vÄø¡‡3kŽô"³*ÆÆIežö´¦.²gj4uœä¼D•’k"Õ*TÜ~~ˆ¬œgˆ^– ò›~½¼<|ƒ1â­c©Px7 í‚kFÔ84‘K(/AIƒ\
-Ôè¸Z¯J¤äAÔFqµŒKšqÓ$5„GT´è#.öa<±ñC]”s¶zOŒ£9ÇÔÕÄ@yQÑ’í-–D¥RPÒÇÉßGªD{˜Ÿnš¦ªùoˆ«^Â7é°PµëvU±vºƒ²ôT_F"éT‹Øeâ Šñˆ^‘9ùì¡^‹9®¯É(Zi•í*³¢”JŽ|1¿"Ë]º˜ýœ.˜g:±ÆE¼TIÄFzNõË÷%T„|ƒk&ñJ´lÅÇãIùõ3ÊŒª+År^¹qfŠ”SNM‰‹òX»™eÝÆ $’vî{ò…ꢫ?I¬Bð-”º-Oi×0iX’oª Èè‘šT\£¬Å.%kR&-?(ümš¥=ó€Ôþ?~3ÂJncu ¦/·mS<ìøÃ,»ÙLeØH:ëi¢_+MSVüaù kò@
-ô4€–9"(hÂd}+É—½7Œ°)T« Þ b¹ÇªÔªhmõê`Y­Õ»÷ÿ ís<ª†-´,@˜­Í‹ÀŸ‘þ¸ÏSCg—ZwÓñN² CUëcªÜWš’š¤Ê-JGm\Q²ìA]Q†]Æh&D‹¶0±íÐZvnw %’õÎá0†°zºÊMT“XÈI¶ÂÉò:¤Ól¿ŒÅ<›7åaÍ` çù™5æP` ±Ý°Dh“k?Ø(ªbþø Ÿü?²`Fº‚gÝÏ—ñÖűàîy¬¸À=î‹4EJ‹í­ú0 GvQ³O4À©W²‘Šd SAšnMÿCäÄí€
-Ò±|`ïŠ7ø_·ÎvY—£¦Io©«ÙRÅyYqE¨,Dò;É&Q‰\éBÑxWì¡rÀ‡­v tÑ Û[€¶Ë\"]£º©ËU¬ÐØË‹¥ ʤÅâwÒ髱<¶ |Mc+…éÂåç ÛZê¬9Ú(WZ¦Ê³Í°Âäf“ïø¨t‘Ž~X)†Uái—á?¤m±<P€¼Á– ¦;×ëG½ï-_k&ÚžI&”ÓMƒL¥<º:žŠ:͹‡7Š·éÓ°KÆ’ÀÍâKX² ¸ÙѪçöW[’5P7W’«ttbþE6Õ¼šz ý»ýÁ¡‰~0¢iÑðWêűÛi4 [$¨k›üšûi´lç$öÙ×VRc4Ó«–ÆêGk~Ê¿¤YQ·:Ù®HbÔFßG™X ~ÏNuã›.±kf÷™c`´m ³·f¥é4óê±³ºqVP~š:‚U›#/bûE7K*ØW0ûá]œqÇ=$Ü­ù¼ñ‘ X×òÿQM52ymÇB´S<lÞU
-÷ZÒ¸LÌeD׊=Ü B¸ç°kLBR³¿Y„^Ëä#z«A¡%¥Ú¥`r^Œ’'UIoîFgˆ>ð;1 pš't.t-SSUn;Qñ›à¹Y(sÑžè§Ð*ÊMº8=÷œâ
-BHZ# ƒ–GcDáSŒ¬ä{d'Ù,UÚt†£‚lÓ=í´,}¼*–¯vËcrÓ+Ð]‰(_ý1rœÃ˜@?A[ã˜ã±K£Dl¡v'”oî>=¦ëÔ’‡ÕÔÓ•[‹µ¨?úQÔ ¤ô
-]è·7E9!À¡7ùëÂ;aˆ—¢ÕuŒ*Àñ­8Y?ÃäÒ¢Úã#ö
-Ç"ôŸàù8Ûº?pGªZ:ÜOÈ¿´ú7òÃä†ÂT•ÅÔIÐéÔ ¹¸J±A¼éºÈÜð‹xß¹rxýŸn?(ªŠØ
-•«–æ>~÷oîß\Ƙa3Ƹ2Œ«è@e»ÔæU*Tl©çm«cÕÓ±½ý¾Ÿï
-Fvz|"ïÆž¯¦Ò©n2=µ3[ï°"s¬¥ŸÙtÕ ù}Nâ8«”ûž`†ùñÒÌ1`X¼iý]àx¬£½(®U2\o[v1·d%JOO&rØ—´ß0ܵ9³YxÅݨ \–´€¼D‡m§¹ÖÄ]=Hßjíovfd—¥˜)Ì:ÓtíbèdH9\”ØÏ›®YÉ?«8°Þ <%þ}ÈçdV‹Û•hšÁnuŒÓ»kV˜¶3+ª¥(+µ$ŠÞÁ-¼›¸Š‹ë¼#¯ð£Õ‹®‚QÒ°ÁØì·ÚåЖžÙãX@ßâh-NdðëÜ$Ìa«š>•M3¿¡q—œ"yÿÕè$À[YÚ@S¶õšgÏÓ=ÝŽÆÚP‡³±˜1·)L<Æd×"´döìrÕ•sÎÈÝñžW¬í ˆìDJÿ
-tÃýbêÆ µcèj¥è*º!®Aq
-hGÐ|î3j zŸO‰ôÀ¶
-»°*ªÏ€› òÂÓðÔ%2#ÐÇ“™H¼7!¹ ;v¤¡‡
-ÿAr3vŸ*>¼õö§ð>É„½x\œ+¨0lk¤àïôçÍOðÔ¼`Å
-û‘kH¦éÍ>*çÚ²éÈ1ùö£ ¥wÏp5õ´Èê…êQº¶àªÝŒß$Š;¬ÌÛòLvvJ1ƒóf¯›ÔÊ3nž*ÙäøTŠg@oO#9|}•¯ª˜?V0Mù5.‘Û€zÆ{" NÖK?C”_$ PÑ&B̆e>ˆ(q´ªIÁu›‹ò¨`«þ£|oùb|ã_²0l2©Wê‚ßsCü¦Ü´LT÷Iæa?µf(/+¬ŠP¹Iw‘¸B WÊhÿg°ÌšH
-¢€®‹¢" À
-"(®H2™Ì™™dfrß $ˆxàZEP>ŠÅ£ŠºµúéÖóC¬ÔÇÿáû~ì׋EÎF½:}< ï\{
-š„‚ƒ¢%“àø± rHÐ6N$(ß«Ná·˜_%ó1š¢«ƒÑ]²2Î:$ŸÈÜØoƯ-†8È¥ I-qt;ù'kŠã¾TjJW^Â}ôkÀôŽfQUr\ùuî¦lôƒNkHná«‚æH¾‚÷õ*‰W¶ã¯ø¦˜Æd6™¸M2 *{¶®¼`ÌV%¥…VR£oJJ‰²À÷`+"èyO|s8ÙÎÃñ®6ÅVÌËy8‡ µ:+¿‡˜;ÄÐ9Ýî´ɨÒ=Ú.q“qŸ‚›Ñ=¸ôàÉ¥­ñ¨^Óöw÷ld¯‹ÞGÁ­å;<¡bShÚ ¨ˆ®
-ë(¯ÿ$Ëp\)9D$ZYÙr|§¾öçç(¨4DÜOÊH¶»äʳ ;Ü«òévÛ±j‡xÒLr_rû µµ©;Wi·Ô nV¨|ªRé›üu«ÊdܦÂ
-éÌM]4ãǽ•íAî…ß—n„×°Q‰ÔˆXÝtGdñƇšD¡\wQy­R¤>Ál-ÌQôÈïnJ¦úȲ¸cä/øÓðËø14™µÑC:Ã'K£&‡ŒÛÌ•BOÝJ{ß´z‘fŒsWñƒÊ|F-§Ùq2˜ì ?Š¯Á}Y[pXdY<\‰ävÃ+ÇM{Á¶i©rš¼8µÌ~í£LJÞ¯´ÇŨ ávlL:ÀÚ ?@Ö¢ÌoÓ[gŒ`¶²}ý>?Ur‹Ç›I2¾ËL•k.Æ}GpI8‰QäRV%Ü‚L0/PU³ ûEÕñ ?´É¹TÙÂcÍÛ¼Ûf¢HÓësÖÄ^QMò½C!º¤)Ã$ ‚; Òej¸ íuIy õWïêîË6„ÏÏ#LÜÆMi9ºÄ¦Í±å«æšPœ*ŒøHˆÊ˜…¢FÉgˆ]Ÿm¯¾ßnÝ+|“·ÄX$Z6K'Ú»OñQÔJÊq Üþømì(B~—ljçÀSu‡Z áÅ¥–bhW®ÓP"¹žz@³U’»V±¼JÈ΂\ÿ,<\H»¿Až ö·5’çë¶
-ES!.?Ó”ø¡#ÔðCí:[˜6¨$ß´Rµ2G [ÍD§ÜU…ÈcbÆé™Dx(M<Åù¢}°‡|ÜyÚá%î¶Úµ³­}¦Ñ’¿íº©œHm‹zyŠEy€)Œ9Didh(Cp½ÿKôoð¹ÊYÓ9_\n¯i¿QsÆš×úÓ®kÆX3¶í£6R7‘ÂU&ª"c´T4E„ʈ0éXÀ,t ’Ÿ:žTÙÉ/>UÝ®¸xà7€óÌõªF›õÜ>QöóL‹ª~:Ê¥ÿ#ï]ð[eTSì2»Œ%…Ác• žüÔÆ~EWמgØ9ÌÌiíå÷%¾3W4ÞŠ: }Þ¼0Ä_ÁX|¡¢-ðƣ鵼‡„‚ÿV”u×8H{»àßYêF¸"qÄ”-´F95E!L¸èŽ/ŸÈÁ3z„—óLw@éå“"‰œÒF‚Ÿ²Rm¨O´·éQ&õ[Ð#¤ŠÎ¿ö–ZÅO¡î/©xðºË¤Öró~9žT0ä0b³³Ü¬ ò4±ÁPß‹bÔ>_nMFY%÷ý<ñip
-Ê;R¯xÑðá@ý¤|‹ëŠüqj#ßlºjù?Ape¢
-ÑsäHýt-bM—#¢²¥t8fÆÜß5ó}sßcÌÁ0†f0 CcB¤KèRê•mc³EÑíµÕÖk÷ýÿ×¥ÿJH×[ÅۢŚ<!)´Nñ‰oòOCÜç¼ùöI}5£ûôâ2—‚å Áš”œÝæ0•9¥Ü¤tMب÷’Œ©ûÄ7B»ùÂ0¾Ø‹×ηç×ø0äÍzÃDþ KƒÉYe²è¼RˆU§J›–«”‰Ñ:N::,#ùÛD~6·Å¾²žË4o1ÊlÙ`ÌÏq5­¨X–’U5Gû"Á³ì«êZ4¯tXÞú»Ü ¶øßøàò áÄcV÷u–{«_<9·£Äà“¬©S¸Nó}hýµª%Ì{ÿnÔ¾‚"V}V”"Càw}ùt¡¼ë)ýbî3ÇzFj¦oKÓ¨ÑÄýj2€'¢þQ9
-]òÐ\BÈ«r1.8C|œÎ.x8÷~ûßpG¦§m<Ï°Œ"i¸©SÈ˨µ¬Ú  u[æë)«E• k¯+WE8x–ÃéÊ5µ qæg<k~€™ñ[ëÛ0n²& ËŠÚ®·cÙAúÒaŒí Jú€gçþ¿"Ä:©"].fïæfô5 Rñ¡uõüBÜTu6Ïu¸|ˆ;4Rú ÷'ßûÒhNpõ\@I!´£Bq"—Ö:*«ÈpX'%Oð¾µýâ$ÜK#(¼•}ìvW¥ñ&ýü$§¹§€Æn®ˆàï˜Öxä·®T•eØ­k”‘øUµ^²IÜûªkK”¦l·ˆYÒ+Hõ;"ÙÌË”Ý^†\‚¯#G_KmáèR2Úyêø•fbIîª-òب:Ý$;8³$N(ñÓ‰ÇxŸ¸Ëa
- ž™1–æ"¶¿*.d8>éžãýMOÔa±î†N¥$Ê¡Ë–~ &(Ÿ‹$~çÅ>ø°žü–tÕBM%^i¦Õï3®¢Ï§Ef8UB
-†ˆÓ¯_–ùw•CÕ„YK/¼–Ô¨ 佨/²“êY0ƒ¼£ý–yŸÕ̸7Í.]Â*ѳ°þÚa Œ!ëd™[ëm ˜9­„Â#{-ô;˜Wà[¡¸Ìï ·›UŽ$‡mb?ciŸ3¸Ø˜s’™Œqê6ÿÄ‚TÀ tù
-`,ä g6ô$cNúŠæ!LÄp©<Šb<ïÀ™Nz;¶0y%€ )°è"Î «DÜB@Ž ;€.aÿÒ$G=ØW+²ØïØvÑFöv-­‹ý…Ý|d%ºŠÝ¿ÇîgOŨÐÔ;$KF“»î²lbšu#«^$(ŸbÕ ¥‚,‡ ”jdMð[sÃÙkx÷vÿ͆¹ïc–³?sÝB–¡fl¶S ¥ÿkø€ ªMe͈Ly˜i’Ã3òTZuøgÖvñàî#¬áøV'{ÿFð,ºË8+„5Žå%\©ŸÑY`kY o¾­ÙC¾ˆ,VQÕ"˜B½k”5WjØšÃê aëx·­ÐhÝkË"è© ÕA³Æ›Ü/ðŠŠd˜XöÃ!xJ±ë(}¶~ÏÚ&¹|–ÊÿËé íh‰®?í·¾Ò.„òê¸ñøÿÁXS
-jkÅuÖjµ­³ˆV´JE)ž­£Çý¿swmºü^ ´«VQe¢’^*ð…¡7”cô¸·Su›5Ô.›:’Õ5!{3°A/—ýu@vÉ?êaD§åUNCþkùŒH2)ú 1¡z%­9ì­Ué±›ý»éÐÊçvò¹°—Ë!ÆkšÕ0>][#À?¬wÏsb‚÷Ä,4U²á¤_ fà)…ýEêÄÛ* uä6Go7°6ɵêèù¦{¹¿ Èæ'C¶É‚Ga‡â+Á¯ðRUõA=±@ù¾5_ªrgs1OU¸ŠGÿ£*ŠƒÊšëO¨&øÂQÍ¡Á4ÒÜ%¸¥©×€°nl¡c=ú%Z¨ ÷v¥Y ÿZe‚ëà¨4í‹? eC‹ƒÁ—`…àØ Þ_‚ªÙwvĦ10áKÌB/§ê*BrâvÎ4ÏŒwMèñ  0ù›à¸rë“ ó³–`ø¤ñ$½Ðï’÷C‘ÜŠGàa6;g-N_&É° .` ¸`ß0üØùM/s\¢Pœ’MƒfóªŠ`p‰¾3ÛìåÖÆå
-TYRJ¦€3éÝøO )*+
-¾«8"ӽ΃ǫöLúÁ¥ì"êHï”Úü°k›è:^Ö–T¢Ïm©©éÈÆøÏÂ
-›ÁKX_ÿt+ ¬ €=‘çÐ#¬Ø«Líø³
-u¶uWçKìñ¢Ø̹– u)±F£@Œ†´ó»ïû…jÔRÎý_$ Ð®ÝYuBÅ›öGõbQl+$Ö»·,o8“qÜl¸Åègš!) ÷ÛÁˆnî2QùãήÒßUÎ>YtÍwŽ(Ùþ¢^ëù'Y¦ÝòÑغŸ!…Ú %à—GËU¸û9¼·ù
-qÑÔAN?!9NxlÅbÀO°¹Î{ìeÙi‡Y“Q½Ì¶>S¸Òô€ZŸîª‡ .&ŒsÃÞ¿búÑj?1_ñ¡Ç¡P´ÃékœåÙŸè¿°x²`дY»!í¸n”ù6f®VJ•?ffãoýš‰n”ð0¡‰°šÒ6l¿)ó±7ØB¹u‰yMAƒÑ¢˜&×mæ>>ÃNjÔÁ#4J%ûÄ&|žÇòE]ÛŠ:íÒiû2g¢0ÀÒio*ð6zXŠÓÂø†¬h +æÒ‚÷Ò3;üšñ1"Æã2ÒÔ+Oô?©ˆ¨Kܳja½÷´ðÿ
-w%5»”,xë+ zî!Ί}|%­¿w¬pÈ©™xe¥Xx|Y üy$Mœ}yòA—Üzè5À“{ù+=Ž}5"6‰~‹{άq~„p^¨Q~Md¨¤~*XŸÄ~,L¹›U~S@é–Æ~“5½’ ~å+f2T"ˆPÒ{p«U…Ip
-‘®zÄ W‹W} q(·¢vsf€²ÊvÉ[º­°wLP̨OxE뢳y
-;NœÞz11c–Ò{v(_•|è ׊b~mq¶C|ÏfL±o|¢[y¬[|™P£§|ÃEÒ¡t};O›²}›1…•¼~/(¦~ä!E‰§pÞµƒf&°B‚p[Q«/àPt¥ÛgEÁ S;Pš¦€è1£”Æ€Ã(ãŽÄ€·!£ˆÞ€ºp¸´,‰Rf¯Oˆ6[Bª5‡Pc¤á…õE°Ÿ`„ð;U™·„1¾“ëƒ*)Ž‚^!ðˆH§p—³y`f ®‹È[>©fŒ P[¤ŠAE©ž—ˆŒ;Z˜ø†é1Ù“0…U)FjƒÒ"0‡Î‚op~²õ•7f ­ð“![B¨¼ÀPY£_ŽEEŸé‹Ü;T˜\‰…1æ’ ‡C)kŒç…"d‡jƒpm²–šÙf­r˜=[M¨,•1P\¢Ç‘üE£SŽÜ;`—ЋÔ1ð’'ˆå)}Œ„†"‡ƒ›Î¡mfú»ènìi=¨µp­kq”êr^mœ€µtoÎlVuÚrX w¿tDyßw'0É|Yz>̾j´qźjlÁrä§`n­t“¾p‹u0¤rnvgkbtgw³WIv~yCtxÏz›0b{x|bÊùh§|~¸´jÒ|¥èlä|’^næ|¶~ppò|ój\s}AVtu[}–B×wÚ}û0z¬~lÉ;fׇ ¶øi†
-¤9kD…ëmh„5})oœƒviNqê‚¿U¥tX‚BEvÿ=/·y÷€VǧeP‘{µqg¦‹¢¶iåž|l‹»{õno‰èhLpãˆ(Tâsu†SAÁv@„Z/ryX‚Æ_d›Ö´2f}™¡}hÆ–ŽMk“/zámtLgdoþjT3r²ŠxAKuœ‡I/8xσ´Å[c&¦³5e¢[ }gÜžrQj.šxyýl¥–†f¥oD’ˆSŸr Žd@êu‰þ/x\…Ä™bp° ²vdÜ«Ÿ²g%¦”Œ€iw¡„y3køœyeøn¬—bSq‰’@—t Œo.àwý†UÄa÷¹ë±ôd`´RŸfŸ®W‹Øhè¨-x‘kk¢emn)›ÐR§q•\@?t@ŽŒ.Àw°‡ZÀ‚tÿf4¯uþh¦åvÿjõ‹xxm0xŠyosekz.qÐR|{itP?Ä|Öw-Ó~zK¿'rÈp{®sÿqÔœãu#sŠ„vFtgw£wtu½dx¾w*QÏz%x®?E{Äzb-Ž}¯|X½¯pÑzŸ¬êr'zò›ssj{@‰(t¯{™vxv|c£wy|Qy
-}>ºzÓ}œ-R|ä~H¼(o„™«Yp‚ƒþ™éq݃^‡Ûs=‚ÁuPtº‚;b°vS¼PPx <>Ayû€¶-|0€º»mŸŽ{©øo˜p‹‹z†r
-“o¤_ý%ÄÅ{"bHkí&9q\¥œW:Æêˆîr™ò‘&ÏGˆ%2.i6þD±1ô%~Fù‡¿+~ZýÉC„?‡¶8‚ŸV†Ø
-ð2•#ƒâ®ª“ŠÓØ ui^#v
-ðNLÁƒ¡ØàS¿ÛØEèñ„Z„Ln©Ã–`®áè=l‡vaò;(‹>̽…èp ʠÿ†¶£½~íè[ô‡Ë@›šQd€³F!•œ7•ŒHÙÙ$‰ÌùŒäÐÑ Žˆ…Ú#—Èd¿Ltæ!BOáKš*áŸÌG-i°ÙäC–ÃrƒBú.ÒUålmO¼>Æ †,Bæ2Wü<+Õ3¡6¹7¡›µß›íÐ@µÑ ´)¤Û &KO¶ 0Þû
-/—hw{ìûV³\lÞs—ýT¾jçgæ?Ò›¾ú¼â©ÛŸÔu «ê¹®¨D­}û”.ƒ5ïʺÄ(wM’ °ýÒ±=ÉL·üÄÎjúe³o(u\ý›» yÚPµXû³üžæƒÆ¢8ùp2¥¶¤©23Î2"uhì0
-¿P7÷½DšgÛÄ3Iœ33D_Âè«ôºâ)ÔJœQNdOÌm2‘tØa':‰=ÂûÄJÜê.ÆÛ±¡
-sÞ`d³é+úuu—-Š ǵ‰i—ȵ\L
-±kw„á/iƒð®&GÜ1|91É:Hÿ^ÙÈ£gWü¢ú@-µ
-‡â}~s¬¥<xÑi'¡Ôy?^WžLy¹SVš¢zOH-–Ü{=:’þ{Ö2î|¼)pŠý}Á!g‡ ~Ós@£ö|hÀ —g]ðORí™r:GA=‘ï^2쎅)–Š$¾!µ†Uÿrá¢û†hnŸ ……]£œ„ÏR£˜y„G¯”ƒZ<øÿ‚¸2ì3‚ )´‰hŽ!÷…¼r’¢7Œh/žÛ‹u]j›RŠRh—ªˆ¦Gv“ú‡:<ÙA…Ù2ôŒv„ƒ)҈ƃ*"-…=árY¡™’Ågûž<‘"]2š¯$R1—ŒöGD“TŠÏ<©«ˆ¯2å‹ä†¡)ðˆ?„"Y„ׂ™r+¡0˜ÕgýÈ–½]/š&”R–`üG;’¦Ž <´‹42ö‹^ˆu*‡Ú…¹"|„…ƒ/j ²×cj_ü®èe©U᪹h K°¦$j›A€¡+mX7‰›èpM.=–tsk%½ÙvÓ ‹\z`i˜±òj@_×­ÒkËUÖ©im‰Kº¤±oxAœŸ®q›7¹štsó.…•vp&(y(6Š0{õi[°„pÂ_“¬`q»U¬§òrÛK™£5t7A’ž<uÁ7Ë™wz.¸“ÇyQ&‚Žc{V·‰+}di$®ùw_OªÛwƒU_¦vxKk¡ÈxßAvœáyÐ7Í—Òzã.Ý’Ÿ|&Ì\}[ 'ˆK~ªhê­¢}9_©‹}AU-¥)}TK4 }wAd›¨}Ä7Ζ°~..ü‘—~§' Œv6 …‡Êh·¬™ƒc_
-v|@Uvõx±.Áz={9¿)bØv®"e†v·œ•hwlŠEj›x6wm0yd±oæyüRrÄz÷?Ìuç|.ye}S½i`°€Y¬jcƒ€šêf6̈Ýhã–vRk©yc®ngQNq¡Y?KtøS.Jx¥L»Ï^ÙŠŒªæaɉY™qd›ˆ%‡vgf†ôu/jO…Îb¼mf„»P›p¥ƒ>Ùt(‚o.wþº]^”«©©`c’—˜CcHl†Vf+Ž;t)i0Œaèld‰çOþȯµ>tsw…[-òwn‚¿¹w\-ž¦¨®_A›®—Mb0˜‰…ke#•SsShA’!a7k‘ŽçO|o‹’>#rሠ-Ðvö„0¸±[D¨n§ð^a¤Œ–‹aS h„ªdLœ%r›g{—ç`˜jå“ŸOn‚-=ÜrfŠv-µv’…m¸3Z¤±ê§p]­ •û`®§Ü„c¤¢r fØC` jR—ëNŸn’b=‘qþŒŽ-ŸvB†wµ~o®`^¥£q&cc•rfBƒÇti qõu£kÚ_ôwInÅN1yqØ<¸{u8,-}py´mjy¤”nÎlp”ptnR‚Þrp/qsÏr_;u¨tMžw§v2<Tyéx‰,|~{6²™j¿tn¢ül¦uf’­ntvT‰pEwFoür+xF^Jt8yZLâvkz;Ûxà{Å+à{¦}6± h¯~4¡lj¶~F‘(l¦~L€Fn™~Qnßp°~e]erê~†L:uM~­;swô~ß+Àz毛fê‡á  i ‡Òk†<~ÿm*…RmÞo_„n\qǃ˜K tU‚º;w&Ï+¥z@€É®oe~‘žêg²àŽ¼iÑŽ}økùŒ:lðnHŠ[[Õpʈ~Ks€†™:Ævw„+Žy²‚Q­dXšùžfš˜×h•Ç}jù’ð Õ‡_S
-§žˆx§ç+Úûþ‰O±¾pOé¢T±ò£Ý+ì˜æg‹ŸŸxjZà@›™Žc}9`k`cTnwó?í+ò^5ú¢²‚¯j³ä¤¢¹’“T&ïo
- Öl±×øEùæx9ø {óXföPg@C_®[ÇG›=/¬5éÏgš4ÓêÊ¥^E×*ízªþ¡´ÂÏ ø³5È#´p½&ŸåX÷ÿs–Y>€ãû>ƒŸ@?ÈnÀíòC)…HKÑ#èEu·ä$þ%à펭û¡`^>[»
-ø(?`~¤^x
-±ÒÓþ5ç£2[{Fõ;‹On·–çÛúݦÛà *Cæª{2H<¡è¬N-ßS´º2ÍUråÓu÷UKm¹³5ųBuœ•
-}£·ñÏÄ3À!ãJ÷H$‡œ#h^Qv¾0ªqÓUô·ºY:‘Ê«ªa¯Z=V.ˆ¿ }VÒZ¦Ÿfsôy îå½ÝÃÖ§¹MîßÑP¬8Û:Æx-kîÕ¶(+’rÞ©ãªGãSµIå²Ð­€¥øºO ø¹ùw÷ðiιþ9јy»¸—€³Ÿ’—&÷†z8,kÊ.$†äxì=rmRMêï¼ÎRŽ€Øíu×Mb;d—íw0yÁ â2Ö¤˜Tý{¢œ¾§—¨WÆŠñ6m|ˆ+±8êEC`ð òGd]íÄMm²µ"ˆæWürS禜D¿ò²~AêÿSƒ‹‚»° ¨Ä+ïG6W#èÿjnA>p€Õ
-
-èshø]T4ÚIÏÌ ƒÿDµG§Ã£TDÐ(2BNlz9“eB_ Ý«.ë#­J³UÿÒbGŽ³ºÐôà¿É°€Œ¯¢ú¡ îPÌc36õ ûèß…!Ø3Š¬ü•?ào
-¨0”\C"‚°ÉdhK>Ù…¶‹ÈŒ©Ù¸Æ:IF“qž\BVhFˆ'$—[Iœ&3’—äæ°B¢™tÙâK\ DåÄ'â`;™I [¿"–ð%„#þÖôNã‡÷š\÷¾ÀëI
-|?·a×ü8+ñÅŸ3"-AûöשÕ_ZZ„K±O%u6`·îÄÎX{cçͯw1Ø ÞÙÿ$¾Ñè+ÊÁO±M{›'±øšEØ],¸j¹z6¶¸¼+§ý°~¢ ›Qœ½k a=â_ˆµò/E ¸—q¦ÀŒ¿bVškÐÞ&S ß7<R5 |m[NšSµ<ñ T[Æ'ö¿öcžÖ"16`²ªñfˆi+mÈÔ‚Ò§ìEžýhîöÌë6©Ì=¶Ï2%w ýÉ\W´Íw3/VWxúG€­kÌÜ (œ+îÌK6\°Gå³òk6ygf¨¥«p86×,W C ~­¦Â×Ù8 ¸y†q' Skî±õˆ3½ÑvIùýˆÕª*•/°ÄkffÔ›]´æ˜_MãÀÊÐ5ÆŸô·$Ϲv°Ñ3š­‡ë\—2èe*Ëò^\?ÃüÐÀ|Í_Óÿcj†„1ñÆxÚ¶+œžœemÈ[Ï8¦›ëš@ßŃÈr³1¼ ×ä3¦4¼6=Ø‹ãvã׶Á¬+©fŠ‰5žRú‘æj¢WµÄïËuêÚM!\„ì7c
-¨ —È}ÈýsüÜ‚â-j©³»Öü–5+Ú²kE™³Z5׺ֵÒÚÞ›c„Á¨–[GS±J–©oÓŤÞ—¯
-»Ùñ9y<‹i;M½›¼ÏB¯]
-—šüYÒ5SúA*bPW#ÊXš~$u2Ðξ/1×a£¾+ºßÀ` ³¾µ®cv&ÛL/Ù0¸Ì°›û;t)HÜ„|©E×òß9ï1îÑÝŽçÌjÂɆ'u/ŠðÖqvC¦Ï|ˆ›™\l´ðWÃÙúja©ËçCšm’^~nc÷=í¾=…7E˜m+àO^± |™Óvádò—†,ñ<8L«O…j³%=ŸÔ Y0o—}·Ä¶ÅvCBÀW[ÞK&šçI>füg\"Å&]ÐÇKOÑ:´ %ije¿B>ä%¼à™j†:l=®ºT1e~ ª/ðߪg¸ ‹”ƒI0^YÕV) <õ^ÅÏ‘ë%
-·Õ¦ÕQS-WõÓGpaθDû8¥ß 9•DÖ‘ÕƒðXM'Ð
-ÕóUÊÈJ•]Iå"­—mtª¿euuE²)ÓÌ-3`ŒÒŒù SoOŠÓÕý
-ßÔ¼‚Ñ{Ä!`åD}°üÂK_á4ˆ
-‰!ƒ¶ªQ\üîHÒ½¼ÏzÈ”ôHçNÚ>«uA-^á²°²bg¦¹%+kÌ5‚ž°8ýWâ #ýwi+‹¯öqéÇ0ÞîŸk…hcûuTT™[ÀÖÁÎ`î5ØZ[›`ËJ¯ &º¶œ-áêvÍ**–öcs0”®Î
-Rr_´ñT—Ó'›Uät£Kyγ•zØa“L™= z”s#k–)Æð|O¿ŠèÄ€ŠÜ‡­ý:aúxÓim&ò™ã¼&^c½®†ÂŽoIÑ“`
-‘¦îWÊñ8Ï2K/ÖױϬ˽ßòŸñ^º¯i©ÁùÊáp‘u£€óÔO£ßè:JD­:WtG<Z2µë]uyy±+–ü–0¬¾H5W²?16× ~u´[4')BÝæ—rjâXâ‚GØÔê‚>±Š<Ü8YJ]
- Õ„Ñy¬iZPí-|xm«4×Är¦Qe¼`þdZ´H ;4°SÉìí¹X1Ìšå`¯±wªŠªŸp¼u>Ê7<dE,]Ìÿ5çJÝ!ù˜óT¼%"Œ•ø7%:ã -+Ç6\Àw‹Š÷•Oêç1=ä’zsùê[ITNXí‰)bOIUq~‚JYéþì÷À鮦Òt ͆/?¦•wãU[j«Ï+Ï–Qz•UÙRÆÅ'd(Û_ÑûƒX±qïÃBŸy ³g5m³¢ÊVÆeüq}£»J©ûsg[\[Ÿõš>¢ Hô²2
-à%ª;†8;2¶/+BöM˜ƒqÿvs$`Ù‰öY4/á\ssi iUcdæõ”U›øóˆa¬û§fhð6uaÉPëÚÇòõ&>ã%¡C‚d>«zES³?«É+éæ&ÓÎeð{™\ÄQ>‡Ý+)ú ”^T9ZîPàäåF­ê†ëü«‰
-r‡3„„“L2÷$“™$ €x ¸¨ë‚Õ*,^-àÚ·[]ëù<**è–R®ÚíßðýôIˆ<E‹|Nù
-!fÓç¥üÜ#ƒ ÞäA¶É§oÖ(u´
-gį›Vgæ”·ÔÏçE)Õ?nî/Ø  bd£éSûu3ßQ·¼Q¸–ùI»B`×\áC!ž’ÄdÑ
-ÙPÜ,ÎÀˆ2QC³—ë[PŸ¶å‘Ò»µnª`±žRŸ”ºƒ£šXYUé^í”Ò'ý,|Y5G 4-}Ä<¸Ÿí«kÀC÷ûÈfÞŽoÊÛ†3
-¬wo²¦ß¿“ÙD[D$ú”<ÏÞHÜ×½k”¨ÕUÞÒ*Iï#;He6Åi*µø80C¥¤
-î”P&ÒÍÇàÓh_2ˆnÁnm½‡MsC¯?’™¬…ºÿê¾wø
-õ¿Â/8*ê;,Óï‰aøÍ8sÀk¨ ïÖ~!¯!Ö@)Å¢Ö§ï&Ñs<-ùsZ«•œ2ýEbÆõTçb~AãðA¤}Däʺ0ˆ¸S”‰{‘ñ{GðaòoqBÍ$ëF8¥ºûz±ÿ*ˆòd¼á¦¾ƒ¨™:ٟЕLza:JÏìeaûéæø¼æq— ³œTÝ*Ã1ÿ"}µ!‡@¸ýk˜ÇÚ˳á߬ÎB/älEyÚ~ôeKüìŸæ¥\Ÿ5¾ä$ÓçOè=h­áßZ¬îÔí©Í“Þ‚9 œðíªæ´`ä_ö¦¸‡˜»ÕÉÝŽç[ê9±Ä¤‰ô¯×u2Bƒ\s¦ù ®u5=•–@¹ÎŒ‚õp@™z tˆ;Œ*+¿ã.ÆîZæ°‹ùƒÿa]²1ÀlùRÕSëó‚¢o¬á‚ÀÜÉ
-‡ÐšrÕòHòYìK„¬gÓ<³`ÖÏ7/Õ|ë+4A÷àû*òKÖ¨8–‹Â1‘»%¤ Ï-1w”‡¤”˜Ë?Æ–šª€éˆ)ÓrÍÒõ~ÆK0é;h¬Ã±+fé€g:"&›6)†rúÃÀpòcúyìB£›6 b”„Íë#˜&lõ:w¦†¸>fިÕyL/Ø\ZÌüŸáúðjò@
-Öÿ$f»‡~ ^¬Í„:¡)É]È•}‚pèæA(žŸ+…R ©´X¨
-*XcÝZ3}E®Ù“DÅsj…d9FªKŒä›‰JÈ š ¤I1{ŒV!xnK®-e>³ÆëÒ7n·×…¬§á ô_Qg1ÃR2Ǽĸ:@“nè\ÖKžXù¦å°Ÿ)Â'€WIØC0hݤù!XL}†¾»É4œ‰l5É Vh2–°,ú–?ƒžbLb#(sÀyÌtk]:ibP _"ÏÈ2S&‚FþŒ ߆*:Ü/~‰·Ù5ülÒ6ÄÄþfÝ»¡ ²¯Ó óð¯©vÍ<NÎE¶¡×"A¢MûBÛáˆI܆=ôžäÓ°D!5¹ŽoÈG³]ëÒMl[UŠôZ~$g"þØHäUø(ú>ô(l1‘Êïu’™;8ãíŸqžµ·ŒóÒi¿7mœL[Ú@¨ÅWxlâ<R‰s\Î]1Ç^¢>äg™ÑñË íY<€#nMDý«yYùZOÃEÑXê;/C<_í•IfG‰ªuÛúR›äÄOè…M­++cØ7šS«ò
-4ÆŠaZ²÷é­ÔƒîŠœøÍÎuª¤í¶ Mߊ]–>]o°¶ÓÐ/ôm^&=ÂNhÌ•.®g*>d_ò$«¥
-]ókÜñßÙoj-¤½Ö]ºŽwðzýí`ùg`¹@ÝXRËê¯ïÖÐèžSZ^6Ãu¸VŸîø^×ïo«×ÿÔg±„~X—ñQðô Èæ¿®¡ïa%{s Tú·Æp4{®³ÖHLydWû)YUÀ&R?î
-âS0᪄ïg :¤poÊ›)·-.XF:€eÙæ
-t&8…3µ¯Bõã-ã(;û^S‚éeÚÙúdSyÂ7yG^íH@¶Es­¹7<ëA–³Q|•áh“[ß\j‰²–eÿÚZŠÒŽy1|iÂ-—Þ<C^ow¡³Ñ5–Ãè¢pcŠ ÆP_¤ªâ<.&nýŽ;ËŒpa‚…[y«yŸ$Û«j„ãì!É Ñ«Ü$E³42éËšvå‰?Ý´öé^ãwnYg?GÎç9c¹÷ËKŒ+%¢<qWÅ”˜Æz^}NV–ã”]QvS{Ôqš8â‡Ú·u)? WVÁí³Ì1lâü%õWy¿ÈÑjpÿÿ‹0#º©>M»']£ý‚š¦|§k!¾¨õ3h{ß&«Õm¹›5&[K¨iªƒK%Ú}UEüÞÚkÌ€Êåu hTñô[Ÿ*îF‰÷´k
-?µí;”A¯34VfO× –ý–ßæ 5âœÄ*DvƒÿUe_ÑRqr…_ê°ü¨«pMv–‡]€ö½{ûÒ›[;¶õfÕ4¯( Ìc5Ú‘Gìùõ÷d›xþµ±…»EÒjOª˜®ü-n
-|âš ë†g8žî KƒöٶŲˆ]ï{r3ÚJ¨(°ù?Ò±’µq…lá÷u;S7¢êÇqWA}ÅÇ°³†ÃÎé=·Åo
-¢nÉœxgº|ŒGCT˜pŽT§aHžìÓÍ—O¥0áU`llÚ¤»Cçltîî0Ájþhý~±¯pÚ±Yú_é,xü'ù,ÉIU·jnÁ\Í[Møæ z©ÎóÆÈDBéb<Ô¾Ó]ò«ÜT7S0CùoÛ}ñ2õ%ýsÙF͘¸MQ«óÏ Å›¡!¤7füSÑ•&.!m›àôéFk´¼õ†(+OÐ ãºóâOÈ¢í@ ê•Wª1ù¦f­ÙôG Û0J¸èZ¬’âî-#¢=¾ÅýÄqËb>@@Ñg¤IxFzŸ|˜û½âÅÞ´\“E=ˆY®g6ÒatÀÒº*ÿ¡SYõŒÝçô5û—T9vh÷ øŽ Æ%2{}n€ü´}Iò90Ýv zRf‹¢›Ð8kOËʼ™¨jV‘oõ:*¡xÚýH3Ê_ 6ˆWWxç4Ç\;“5juÙêèK:«ã:iì²7‹rʶ‡»YAd§«~XÃâõ×:J1<Œœ¥²;îäeªî
-(ú;èMÙsºÅÈrlÚªÜU[y5ÿ»¶ýävw‹(k
--Í×Olí—ÖHº«¢WeGã£ü݆L9s›¸ªè‚ŠFp6§ i&xëÁÙИp0üC2}ÉTxmÌCûÀôH#îѽZy—Ú‡†m{ìç+ËEŠAaî­ö‘ìWÏÓd¼V¨Sy%ÛÛ®™8bôש"SLL„¶òé1å4Ø$B
-]õ@‘äV9È9'ç¹Ò3Õ«Êè ¡Pç?#Ü0eDãaã¶ÃÕSœº†#Ö[%ëÀó™µLYŸø”‡Æ‰U‡U•_n¸¢¥ÊFÀ†η4FÙ/V[ØäŽ&+‡;Õk¨+å4e[D7\ì~YCm[†D¹¯úÄ·æÏÊó»ë4MÑn/ýé«9Ó0ÌÑéÆ:/[Òo¬¥`ŸK½Ó˜Ž(Öá
-™ƒT™Þo…Ír M­8«ÍæFECw…LhT¯–l¿…ç¢ÂíÈ ¥;=í×ÑL×t¹Ì^r%´¢Ë|ÊTXN©£dñR3O>¢Ö«Ä^º°¹àž¡Gû)­ y®·¯ýÛ‚„2ãbþ+žPgˆDWŒB¤Á;TäÑ+ô4Q”v—¡§€¡{ˆ§…À9è¼µ;Œ¯°!f»é6~/Ä—|@Ír~’½EÃMíŠ$,<ª²`ÿ2Á‹¦+ù´oM­Ò¿$ȵk뤆éÄÆ)<$‚\nnu|”LX
-$EVDĶ¡¥Ôt o§Á \~6-s‡ð/€/²›‰EÊÔä 2<뤪tñ ‘Åù:¨ÝÚmb“Õp®´V÷±ÊçÈn(Q®7: ÏziZ¢“îàN½l*é3ÄÔmôiИ¥‹`® ß sµ‘ÒnX
-ýUœ‚\ПÈb¡i0™¤Ä^Kcà=Ÿ!!{pwp y€ÄK´™H´ö&ôȘ/ùU¯DµáÆgõ#M@’êÁ1“¦¢“¡&®ÓÁyf_s‘IrÈÚùÚÅ”\ ýBcŸ×¨7¬H˜eßxÔXl¶Åtbuæ!†ÿhI
-&)¥å Ö©êršbp›s³˜Ô;î²Cu GFæqÝ~~c6RbOŒñ 'l—"<Í–¼‹üÃz [ª”TÿÏ0}°5y
-¨åÅAK]מ ñq\k‹P­µžU´"ÎJÑ»÷?¼Wåù¶{¥¯j#¬'rG”^–‚ô$U¤Ù)~VÓHDäÎTup©áéæ7©ðe’ÖÊ⚊–˜R³"«I˜›^Çw0Ó^Ô+m¯âO©ïX¾‹ÖiM£Ái†-T‡ß5È°©'ˆ†œNÙ]¢~{e‘œ
-ÂC²½ÙlÄ]œÂEškoÆ% ¾õݼ§è„¦™“‰õ
-ü‚CÁ_"ý>“h0š[[¡ÑãˆtVÛƒw,ÑíÇU™£À^|}²X?†½Šõ4:a<X… sšá%˜Ã×Ù‡U)¦Õ<‹@Z§Q›/ç[µ6ÓóÌ Ý.ú ÿ0A=¹fˆ œxãIÒ—³’Q¾lä3\¨P©BoJ]Ô´ã\>[3Ô²õ­ö‚­Œ?,·ôÆЛMOyIÆOi>§ œ'»|“àÄ2ÓökŽ¤x¥Ío»ç6‡–<Jßc¹^|5±Ü²Zz;*Õ,”1¹—M;]¬åôU÷º «¸¦DQ$6*Ú“óÈXz#ÝËÔUáèfZ,kŒâÐuŠõÜ)jF¹ÀR6í:ƒò*‹hyYÍ”­pÊI ~©êK³SpMnÂQjm-+òy²žÉ½MÊ4q,œÜt0L$t®h!f«³ ‡‰_åyb qº¶Xð– •@ÂFb«ª/r„àhf¹ÄZ`;kð4<aÜ%â KùEìb}°ä9v_Õ“ý ö³ÆU‹kñw±3À¢Hõÿ/us¿ÆþkÌ`Ç™;3—Ã÷ÊÿŠ¼æ$B4\+;ÝjèKDóŒñ Z FFŠÐvˆÁE§áu¬{qcÊ°S¨«TK¸àkø
-rS4‚,FæSˆúQ¼?’‰†D »Ñ"îuä%ºíŒZÑiæ^,[U6Pw ª¡ãÔ°¨š§S7ž$¿ Î!îE.…ÏÜãHþ˜ý7ä^üˆžÀ”u‚ö¿¬Çm[E^Ÿõï)@Yæ¡MSP‡)'b^E»qÂäc¶?¢'F™¿¡¹xûŽûmñä¶îÖuym.͇$|¯¦O‹Kbˆ´1ôcû¥ªwWlnŠÝ~B ª¢½XfO yDzæù2çMÓ…£B QWê´ù¨ci¹2æ’Ý [êb},ÿ1ðµEª¼éwÈô^»Òk˜¾bÈ)Ìk¬,]—ÃwH¥ß¦Ï4ÄU’›£mϪKc`«C!åÍZ¸ÊŽ 5¦IõC¿Wô ÷fQýÆ9ÉQû|U«¸Ëάþ2=Éæ-ŸIºd™¯‹ˆ 2_ªïåM˜º4Ü /Ú¨»åB†>oy
-çaG»ð•˜-?”J1§ˆpŠmšÈÓòÄ"âõ2ºŸ§Vñzð|Raw‰~ÿlÌ8 áëÅÓÿ4‰ý„öÎüÜøó»™Ã‡‹ÎE°ZßKݸÅÍáUGÙ|‡B1ŸÙ&T6›è;wÆæW§ßÙ]8ÈÏÙXâ÷yÛWÒîðG-««ª¸%…r9›¶ŸPvø”X7iÞx*ÌLƒ(Þu¶¸==½ãϲüÍ“m qqZe¢ð¡&¹ƒ›ß°§nž=jc¨iŸoÌÓ@ŒçýÌx/{Y‡¨¢/írÛpÕ“Í-×k²b§›(n‡«™J;7ÃöN]Äž²Ó |ט 9^Rê”,²¶qäýi-Çj5I›~WfÇ’Ž;*~x†ý˜FÊMµÚuûÙoÌ€~Æ7“ÎS.0.rm«ú¿4¯P¿MÚÙX¦Ä
-dºðõ6±žÁ͵¤N|b*¥¾4uvõv#3‘Ö¬Þ¦q½V`i2d%‰Æ5±žö0ãµðÖð7Óœ õÄÐjxÀ÷9‡ôx磨!KÐhFÜ bLb4¬EzcláÈXØ>ò’eÒ¢ü€(j =äû™‰~ðn$¢± Y9P²KàÚÐC‰/íq䢘Ö¢&lÁŒâr³èSøÁ
--ÀbY@ªX?(Ûe±92í"Õ¯)fÃmˆ€6@>íÄ_æ|ÓXȼ ½ÿæL N§+VJ2¥v&¿Áœ’Ç‚•ÙgÕa:yÊ*=>ˆC¦,ê½……zq¨¡©øwΣa™çáVîbP$©àßÔ†3H¦ ‰ìµ*
-|™tšc^Œ7½Cûv›ó¼fÝC¦›ïºUʆNì\ƒAœ X)ŒM¢×ÈŠ¬ÅQËr’K{¥ãÄFÛeÍ"jùó%§§h·¥C¿ŠùÀªi¸24¿Ô.$ÛÒ²–ɹ™DÑüÓ®Â?2ª»ðÏ]HMtî—Ôa¡¥»PZé¸+CØÍ9èJ*™á_r%QNÊH®4Òrõ{W)þ |Õem}˜^…e «ÎÙ»
-¶.év–¬ö_.e'TÞ)ñV4û¦(FéïoÉÿUgzfðÓ0Õ=ÛrûºÆ£Õ[(hÃØGjKÝÝÒ¢žÚy‚}¬÷¡%ë€]ÁÊŸ%ö€(yì­¬À¿0Üóæ·àÒL1Á½™sÚR1w^N³JÛO÷7ö „ÌÙ†yÅoxõ™”OÅãÕ`òi0) Â¿6Tù„­@JŸ­ŽJL#†Ù×´©²C
-ê5\1(ù¢â¡<U~¼¨
-ÖBÚ2iªNÿø…í›ÄŸ¡'Øï¸:dÈa­¥Ö9Ò<oé­=’Âð:ÚO8Ç
-ÑcÞEÃNéO‚ri@ñDüœ¡Ž“ï¤úu{Aî6.ѱ>1óáë_Ù:,¡ ƒûJf?È/•Lèí¢CòNÉNÙç*E]Ù­!ç½×ø ämqú=pñ)²¹¿Ýî
-œc«F±M¼Hõ´Œ?¨£b;t•%› 7órÁ~ãû´£ÎL&ž3>µÅï°žÁ~6slD'9ã?´ÿ6š‰T­æÏ™‡¥^ 5÷;Õ
-k[ }€Î»ágX0^h™q$WâKJm3ÖqV/fÔÌ”¿Æ&„í|ª}3ãø¶½1—ªèsÌO[­9ï¨"6Á‘εñ6 Ç9àK¦ÿæ+´|dÔøæjÒ8aÞ&Ák ËɈŒž=9wåUžÍ©ÏÔ?º¯ƒ®Û¿Ó|ÍáµÒÔ0,Œ’«¡lug™³z®
-ÓC‚B¦´'ÌøL†HÉ?— 6¦û¶ÇZWzªÍjxAñ|õ+cs£hi„#aÝ43¾ü ËKÑZr?Ú'H:‚µmø2ÇèAŒÄ½ ÙešÐ­d€cÐM^ðkÃ^þCÖj#,®¤ž@DòL2Ëâ
-„"pÄpß„CH„æ I&Çd2÷LÂ)x‚ʪ­°*j±XEtJ×J]«EZ_=@±XžºY¥¨íî÷#>§(§Uûª÷TªÊ#tgåÛE Àíª¬ÌU¦O4E±Á]cD®•ix`FfÁ¬åøw0b(½”ÑU
-Õ•Yâ®ù]sAˆêvjßfh€w@A,búÆx#‚iù”ðu+•ÝE¹†Ì_÷X™¯x˼U-ÆEŸW'šÒ_ë½@ÿØ
-¬`V´[@-k…¤b½’°nÎ_PëáÅéeÚ:øÿ60ŽŒ„š³Ðñ€èl–u-'\õåj|Dþme;±®tHÞGDæ˪&ˆø´‡Õ¡D!ߪ¿@Ðá—M…Ä?Bâ=ër›äéΕt<‘GHß8šJd öÿlûM¹×žiÜlv>Swžo2ŽYê©!Ö;DL…é¢Å¾]²¡ò®†’±ŸÖ˶íRÔÖþœ¬f;Ë·¾Ò-rü®0ÌÛ첸ÛR}Ö"‹¨?5#ðÍmk+3§(¸¸­(.ÏõÇRÄÝÉxP{K$ ‘™ê~?uXÅ m‹ÁµÒÂ(U$C[Kží·–Il9v˜®ŒLæ"çF¿À«]C2qƒ.ÍOI®6Ž1žQÐçªxã É1i™QÑZxlµe_³Ì)O&uZõê±èCÈj7$6ôøÕã} âA~««8zXþ°ÜÓÀ¯âm¿b|®nÍ^i>¢]œäfQêë¢ùÖBchÈJDj^ðû k‚æ½]èr¥ou‡ö#I¸î”îšh
-8ЂTc£1)±Ã¼ßüWÞ+Ë-Ë*îkxƒuße´I÷~€ßÁPEŒ:À¼±LR] &‹‚t-¬^à*$MŒ4-µb¼› îãÎB è¿Ÿc˜œéŽ³ñA9ZµuÿKíDÛ„§«§Ñù¬T}–•pËp;dz›…x0w
-ú Þï7 ? r™©ØâŽlJÁ§ûÄÑU/è3B®¥K3hÿ f@ jçm1©¨Rî×–D*Øï¿pù–©ÁÖ“ƒ2ÃÿOö(VvÔÚ
-n¨‹œd¦³úmMAOßëˆá¹;í1ÜS`§Mà÷Òú-a6 —)²ÂNßË›,ž£_
-ßl[có.HûÑ–%¶Å–Ø´+#]l‡åcÙ¶ŸÕã¾ö$ ÒsÔ~’&ªÂÞbâ~In^™Yö6-Šìª¸ÊŸ£–É/FŒRˆêa` ýŽçÛEi|à•o Îò$Ô³¬¥h:)=’kÇZvö¥6ãÁŠg|V'E´Úë;ÈRèûˆÊ¥^ýt\"ZWÉÊ
-Y°»ânN'⢒¤ü†LiøKÑ[ºž!6bؘƒÿjnf¯$= + *™.Óƒ¹ÆöK›vIöchP÷*%Õz˜ÙÚ‰,1-ŠpGsÀ¨ÀDì8D±C7x†¡&µXš¸Ó8e¸!j5kLÌì4ð–Y›ü Ä·&Xqˆ¾
- 7épÊL=º³#.´®[ÑÌCjϨŽ†^wÖUOl’Õè€Tv·CeúÚû¤½Êöè¶Íÿ]òŠj2Íã0–uuFfÆÕ±®ŒÊªè:„AƆ"E©*‚±S¤¤'_
-
-•B©PëàT;üê}ú *~>22
-EOL¼€º_½~ýæÍ[¨ýý‡““Íý g ,vó˜,òcy]âzFÞþlç(§‘}FVÏPÕq㫪¹ØÚJ6©AÅ$µ*ŠH¹·$ÒÏΡ™ŠÙÁì`v0;˜Ìf³Ã—9¸zL2¼‚ÆÙžQC|¼QàM5ð±›x§¤zA¨R+Œ­Ô” k*x½ŠGj‘sH%Ť^VaÒݼ¼´û¦r~…LÈ¡Ø3hœã5$Ø‹»#òÈìú2›…'$ ’ó
-,ª¼F‘P].ÁÖˤV!‡ØÉfoÒèDc&2`* ÷_'ǹ{# Ý°w%{2º¥>ŒÙaQ“*Xª¯ SV*â5r1V/‚¸\‚¡ˆôä2·Òèd£©L9¸x~dºŸœà»E ‹]0ý
-çôÕ^z[ÙAKm€°º<¬L!¯‰± |±¥˜tä³®,&p#…Aºe* ×aʽ'pBàré±Ì }¯Ü1µ·zw¾AçÁÒj$ª²°
-±,¾Ž9°KÍ…| -—‹7\cÝÉLâ Sy r฾íRꈼ_½blØžÝÒ°—U¡KTáU|YB[ŒÓ3„@S¾
-æ Ðz•Oh'óˆ¦ò7Ã@önOPàðJ¾-äyõæ¸áV;Lg·]f¹Î“'¨R±”‘j†^[(ÅëòÄ€ž
-y¤C”B I@l3o?å ÜqìM™Ãù±zÛ¨{·6ÀõöT©Ö‡Ï*?]FW^VÓˆš|¾.Gè2 T¡!YHl" Iͦ
-~œ]ž tË‘·Õ¶Á:6^ìüm5ºÂàÃÕúò +Ï)ó”ÑU¹
-¤&GŽ¯Í’êÒ¥ÝU ¡>ILÔŤSKì` `›;¨‚m\¬oÀêœöÞjœ¨c{.]wˆ{]}Až][žUŠ¬ÎTà5×ä„šT9±–"#Ö‘¥$-QJÖ™
-(²…R;×7µë¼îõ®òn^¢°§ìœ†£¬ÌÚaº:VžVT¥•áËST@e²’ &—«‰
-’PkL”l‚ëvw¬ØÙ6´Ô·ì¹U8{`>§Û5#½õ8-EʦhcÉ5Iƒ–jŒ ¯ÆɱUxº(EU•¦Ê×ÃÆ–Ùu=X°U=±ôï¹uxî}{tjŸG
-¹ó•Øš4Çaã™(=œ¨Gràõ(n‚Ë×âøqZ¼ÀTÞi–­ííÿvUíè‚Âɇ F7†¤ :&|ðؾ“ôÐôĮȬ8CLNlG\nt{BÞåvx~T2?²]ÑŠ¡™Êíî¹?Öÿþí:éäB':¸ÚÿÚ û³¤§n‘èA¿øýSè+ý€Ëw.‘"nG%…÷ÅPBûâRBz®^ìML½p‘zþ&*ÍT@æ–õ ÝmHÛïÿ®hÿÙæ؇¬ƒDcññì΢³¬&Z¤T_
- Ç ÇÒ»Eèâž/Åì`v0;˜Ìf‡ÿË¡pŸß;†Ï™Ö¾ØA΂‘}„ÚUÌl¦‡Kôô8¥¶SQC#kÔדtY”FUÚÕVErºAF̾!ÆÝâb7¿”ÏEŸ|üÞ{ŸeûÄ òöw¸þYÝì“ŒæE‘¾8¦TË@VÔ4U4²®<7©I™Ii—¥¦öˆ“²û¸š‘A(êýRþí@÷öûƒý: j:¿ã8þ¸öÑÎvÚî´®ug–±«Ö*t´âE@EQ‹€*—r 럄B’î;ä !„rI†C@V@Å]Ý_³¶µÓ‡äQøàýü5ßù<ùnˆÒ.>—¥UßWÃ/)³aÅYØ/-Ry%•F·¤Þ2"Æ  InK/iÜÈ"‡tôY£{¦p—8dþ|´Q\Äx
-–ö`'ªyM>¤ a¬ATçm#GÑ’ZVZãÆ˪ݼÊETDèÿÃÖõ‰_l ®}²mð»Ï’do¿8Ëz¶»”¶–PÝÎÂcò)¨ÙÒVdøjGÍT ³*„ì¾:YϪ ¢z*‚Mìò
-yOC¼Å»Øæ”ÃRéeb &Ùìl§[GhmÃÃÍÔí¶b9£ƒMð˜%ó”>]8îóˆ!pÒ€Ÿ~æ{áñ’g¢¬ëkâlÂ’ðBÇ4ï2?È©VŒ±õžn¢ÙÙI³Ž´Òí6
-Ãe%2G-8¶o
-Ÿ²Nç–aìÈaâ½Zfk@ÞÎ é¼0›,œî"IBL’tr³AlÄ øˆ N9õVžrñ…:õÚ#ÝQôª1ƒºhÌaÎ x!c¹ÄoDªÜjÔ€E‚éã½òš_ÀdLqœi&]8ÓN“LµS¥“›íƒNI’äSÊä‹/µ)WÒï˜ÓÉK–lÆœ5==\[jTv]½Ù¨@(…WØKñsØm!fwO¸)œii“LÑÚ¤¡Íö?é‘“ª#¯tÉ•OLÔ=ë?Ù¯“¨¦ï€ã‡9Íë,oÚ9̳³´tž‡Ú2ÏâÀ¨UAÙÅPÙ×@C6²‡¬„-!d!ûž@ BB6²BØÄ‚QDÁŽˆk«§ãop¦Ï9ÿç4Ÿû÷úM§Üre²—½9ó¾*¡ßÓš›†ûŒ—RMð‹dÔ0WÜ:ËrçBÙ5*G1GëRÎBd; âib"P'dþh8^øý`Bõ–5yÏ•J\ ž¡¯L¶Î„*nWÎ2Ò bÞß­¦L¶)˜3tç*E&' ”sd¾r* ‹Þiˆ²„@sìì?ûâ/=:Vùh,~ß—‚½;{–´ôu15®àÛÆkµ}6¸EnA;øýxo‡bhéS$uÇ,N%œÃÉ•³8©jª· òã'€îè™×q/¬qåO=Ç`›S)ˆÛËçг ù,÷T™Àì­×¨ísïÖÞ=@o5’-zê$^ËšFk¸3(l¥UAä?5(ã€!ö4°ÎÛv¹ò(_uw1­fáf:Þw-»}hâŠXë©ÓKvz†q¶®A²›ÙOñQŒÔ NÏœ@ë:&‘zá$B/† Èÿ$Gc€*î8è?”ñÚz0û;ß——î]/ZZ‡…V’É#sY]°X&q×zlK×NC»™ìd P<dÕ‹ïcø1ƶ
-[°†ÁÜÆâòoðy«DÈÂs?ÿ™íÎ{hÀowóÁÇ1,°÷8 Äf L?ßðCVAÕ÷yE%Ï
-K.?)-¿ô¨²²àamUÞÃúš [5¹[ðÚœˆºœȺìMtýùMì0¨€ðo»
-ËÛy0Á£wõA6kÀÇloáŒzˆ=vVätbd.RãCô{,“Ç„4¹¡
-”)ÙÛšô+Ou§`÷õ™Ø;ú\ú mqׂªZ4+‡+'Å8ƒ¿‡bqu2Ǭ¬NÏ ­ÇßG‘†t$턧â ÞèƒôFïÂ7 ÉG€,)¨’³·µ©ÅO 'ë6ûÎbîögSoö¶/+øWu²°£÷ˆˆ–Q.ml°½Íc`rjš($oQM
-ˆš0¨rIF?ÿiˆ¢¤#@ž˜ÔIç_éSŠžõ¥×>8Z7g‘W-[—ÌåÜ«½ J?&Á[Ìü–1Ck\ÕÖ°B†"ÌmÑ„;[ô¡Žƒ
- þ©¡7q§áD
-Ð$fýØtù;SjÍ–%qÏzŽ¸fÏg,ÛË;¦-°^¡Q`-}"Ò˜ŠG÷HºÚüvÞ—- ·35Slº.ÔJ7 øoÉÃ@‘ þÅ5pŸNgÚmwº³ÓÙ±•Ù™mu»£ë±*ꊸ‚€Š¹/#7H äNH  Ž@HB€„\ä$77!áP¡ˆŠx
-Ź½Åm°Šôzw…,³»FžÑÅp h9àäûvoZþñíÂͯwÝx´ëpçËïüoÇð—=3éÎb¨³—‹
-ï$”çßʨÁŽåÔ!G‘lø0–›3DhÌvøYv² s°¤)ÝF¦ÚhÍ)Õ-®
-Õ`®FmË5©{òÌÛökï ÿ· ôÿ5„ÿ·!>s™™Œ^ ÃÈsUXÚt™9UJ厓«šÞ7ŒàYΆ™-PØß7 $*gƒz0W«î‡›Ô]yÛ÷¡él`\:XA>€s9ø7<î5'&c™E=ffÎÑÓ•DædyiÃx M8ZHë¥<WaÇT6T‹Ú†”hò”º¸AgEt€º LÈ1Àô ÁAïCc×#ÓV¸ñˆEvrÁ}fNùt –1I#7ܤ– G‹«Û†
-˜r;£´aùšt«®)ëèChôH½^ê0¨ÑÛê uΆº€c€pð.]ü˜ ~xê ^LÞ“(qžUv‰¬ª&roÒ(ÂJe›ƒÌP Ùê<_ׇé{Q
-c7Rg4 tFZg”a¶ïCC½³¡þâQÀ½xð! )(ú04eµ)
-þTÿ 12ÃÎ¥ßfà8ãÕE‘òò6G ½ÝVÀÒôøú^ŒØ؃R™(E…Ö˜¥­Y„Õ™¶ °>6°.¼à"4F½m IzÙžó¬9ÿ°)©d¶1»ú źŠF+)mjuû@a½¶7Ÿg°âDfFiUcÔR¬ÚÚŠÓX„x­i»>6|XþGÏß/@@+$âßâ k¯ÄaÙÏÅÑØQbÑœ0ƒö/¯n‚MàÒ‹Åí]%µ:c!רËZTxY§ §êjq4ÖF‚Ö¼]XÎöywÀ?çþÃ=5a'
-oPùE¼i„­·„ ×Ô‘9Ôq‹Í©¬[ üq)Q<\UØh.gêºY}‰°WS(35Qû•EJÖYj)zS µÝh/PókƒÈë¨ó<”^~ É'ü­Ú?aS„|¢‹ ¬´AÉ :8}F/¿RŸ+¶ˆ¨Ý|š®­Œcha
-Œ 4±Y^¬´H‹´ÖjªÖZU 7
-Ûûìõ[C­ç1 ?w¨<}A‹wØ{­_ÜKýyÄ“ŽðŒû]Pâm¢p\‹+¿Ø-¶ T酟ˠäðŒRVYÄ[…tõ
-šÝ½Ö#ø]‡wÌ‹ž€¤Usri07mN¥ w¢ËŒ|­®!W¥’Q´RQI§°Šcä fWlerUôòÖ:Gg¡³õ&{ýÖ q?
-”n. ÅÍ ´¹½éòŠ|fò0–rg$uÍšB¶ö 8†6œ¨¥9»A®$µVËŠ:¹bVoi ÏLŠ,EUŠ‚Jí@!Og)ªÐ›íõ±áÌ@êv4œ>4§=A‡[À+£gøÚ $fy4"nv,9r1™ÔgJcë:±5J-AYÛLÔð
-:J匞Y¹‰*©îÏ—È­y­5¿Zg!WêÍöµ¿6ÈήÎ@çâºÎ@6,ÁGüÃîÎD†OMBÓ†F`ù+¢´Ù˜^-íÄ+*u¹j¶š¢/i¢u‘UcnC¥9K)ëÇ7hú³êÚúsÅz³½€ØÖ ²5È]ÍÎN ÝÙí­ÑÅûÙ°;äÁT
-g 9yNºnZÏ®^sw¿sâ9µqq.Þ5ŸÛ4–̨½œ&¨ÂJé‚ŠlÊ×d‹Ú2zYéÝü.d—¸ÑÕØ“j0t£´=ö’#Û€Øå{ :y´?ö¶ï¸ÓÚˆ“óâ-w§©»ž~—îB =wBÐêÙ(¢ôz?ç1GÓE—²äÄAR#ÁR¤Æ™™Úô¾Š6TŸPŸf¬kG5ú”^C‡½€ÔÖ sÚš€Î#?­9zïú ‡é%g×á· žû^‰ê»œt!„Ì›a2¦Rx…c˜šü‘,iöp¾?T¨Â ЛÐVN ÒÂW#úEšÔ~¥Þßj7 sØêïZ‡½oûî_;°wfÑÁáÒê ÷žÇ.áêUÉ/¾™ÜÅ`
-cÊ(¸¯ N`+³G³Dø+ùÌå‚:ô%Z}ÚE–2u¨¼>T©J”4& *íêo‡w‚Î}»Ÿ ïÙuóö?¿»¼zðXï‹cÞêçΑ’ggS¹+~™ô¥P2u.ž–÷3‚M˜ÆVà&³éãÄ*ä¥1Z,‚_eˆ“¯°%I#\iâˆP–pYRg/Pphý×ö×ýßm¿sãYÙý}ïÆ~'õkGˆä•s4÷ù¹Túj`ùÞ…¼ÜX~>­3‹e¢n؈™¼2ø4¹"yª ›¤ñ'™‚ø‰²Ê¸q~t¼Zh/ Úû5èÚùõƒkùòêƒoþfÜصOýa¿‹8ús߸FÓ_ø$“‡¦ç¬@3qË°<ôR ±€¡Âïd%Íç'ÎåÓnQéq·Š±³4fÌM+úçòÒ¨|¶½€îÛÏ׆·n›û|‹qý›íj°ëpå‚ChïÝ#È/ⳟ_€c×bQˆG0lÊ
-û%=+á>>'n9;7ö^^^Ì=1ú.5?j©ˆ¹D'_X,¥D,–QíµnúòÓÑñ?ýÁtÿ‹/ÔàïßJÀžÃ\pø œò&ï ìw!‘˜×‘±©±0Ø‹¤”øgˆTèStZô*j€Ž|œ“ñ˜ˆ D„=¢bCáBÒ3‚WYx{oùÄt}Ë5›[ÿ,ÛwòÀéÀñ$ ¸Í4LBÞA# oaQQÿ…Ç\x„†¿ÂÄ…½Êˆ}IHÙÌNÞÌK ÚȇߠÀ× “ÖK’íeºúÙ'­sŸ}*_}Å;vÐÁ¾½$pâ¸;¡€ï™$pþ\,÷Ž1~ Á?$Äù €
-
-˜à
-9¡~òÂ|?Â}ÞSíØ·‚R—€éwpƒÿøá^@òž—·YH{ÊÆVDòrqQÉ"…Åž'VpoåTUÞ$ÔVÏdÈD×±Jñtz“t
-Ý*›Bµ×M"{ä“i–ú1äÅúËèa¹=~oø½áÿض†R[ßÖ ó•Q!ïñq/¹ð´§e˜ÌUV.y™VH[(`²çIåÜÙÜʪY¢š¼L<SJ§0Mu“èVùª£~Ù«˜@(® ‡Céö[ÇÖÀñ=ç€0Ä#‚?¡±/0ÄS.2s•C -3)´…bgŽÂáß$ò…395µÓ©t2C!ŸÀ6+ÆÓµÊkhCÃ5”Iuý?Fç;ªé;
-DF$L„@ Ù;½Ç/‰d:!á¢Zu]õ{©øwþøüÿT •*Üï
-hc“^ë3~1¦Ü3ÁJŒE¨i¢é¢¸†ÒÏÆr!:Aj$“Uê†^Nà›ÅMr›
-Am-[[‹Óêþám@¼¨ChØ[kdì†+>é~rÚÂ`vöä¹Sˆ!ËœCƒìÐËkØÝB¬DÈÅ+Y]d=­“a&Óø¶JD ˜„;Dlw؛ɛ7
- y툈zÜŸ°6š’tk4 6Ö—è³7Z åí*Š-–ÕKØ¢&%ת#qèfB׆cÊ¡¦Â2 GƒìMT‡ÍÂC?€žƒ».ÈX¿è [Ž‹ZžH™¹œ‘5:˜Wît6è­¥d™¾’ÅU¡EôîFIҬŋ(¦ËZÇ—ØkxZ¨šÙÑ,‡­žé´z0=¦ç >ø=PØŒ~„?‹Y˜9=1žžy~4§ÔÚ«t–V$“a¨¶i°Ýx%Aé!jäLs¥LdEÈÔ¶r™ÃV!tZQ<§Å Ës`ú
-gèSDFîd{Wöƒ5ÁãdŽË¸ã:nú8ä ð”¾ÿ
-oÕ´äßĶå^Ƿî‘:²f©ÔŒ&íä Ÿž6-ïLÖzH|ÿ ›ÿúbð«?ÍÝùâÓ‘uŸ¯¡—[}U¯ö
-^ÆÐ^…¦_Æåb6’‹QëYˆÒûù¨âU8úÔ2“¿Tݘ³ˆi‚-4á3ï4Òo“‰'çiÍ©·ºZRn
-Z“oÊHÞ
-‚bˆï#’1¯e¡ž§”nÀŠ ”æ?‚#s"*a÷Q¨Ì{u5ék µi«xtêJK}Ê
-“¼LÿËjHºË÷
-0}ùÉì…Ïþ0:÷Çÿ³[gAM vÇít»v§3ítÛÑ™vZuÕ®]ïÕu‘Cî;r†CDD @ !`BBHHBî„r;€ \BñÀêZP´X‹ŠnÅ‹uåß Ý÷ø؇}ø¾f~/¿Ÿ÷¾ùô76Ø°Q Û÷ˆá@BbhŸ\ñ™Y²œu¬èun^þR!êø lQöwLÖs6ó—±H-M{ÊÀ#ŸÖRŸpËRžÊ’KÊ“ÄéÖ7k׌MürMßô'¿°Áï?ÕÂg›Ä°kúS!"œ q8@&¡ ™ûþxæ±w¨¬¬ï‹³3–KsÒÞ–G¾!禼®:‘üš–—ôŠ‘Ÿø²® á%§àð’
-(Dh>¤FåÀ‘Ø,ÈA¤C~ÐI)€óžo|J"”§&
-¯8ç-» ý‚QMxFeU>¦ðiHRæ|™Šý
-‚„½ N ÉÑŸH]iDç¼åâÑ/XÂ"IY¨æÑÿE–°æ‰Mœo®Ô(¸‡µ
-g‹]âYt·d¦¨_6]8ìí‚|ªpR~ =)›ÀLÊ}¬UÃz¨ÚÂÃ{@† yf4HsRAŒ:öVPRô¢¾‚°X[CY qè«Du*ܹr­à.Þ šÅY%3X—lsZ~= œ*UN^išÄ\U^,¾Út{ÅgPç5Ôy ÜÈ- AìEr
-ÉI§¼I0k&K;tWp}­ØQýhéý þ‚¡§ì¼¡³ü¼ÁEôp¼Ž× Û ªèÐë­ˆ0Ð'#@Ÿ‘þ®%'÷¥U¼¨Ä‰ÉÔû<FÝt]ÿ]"½JQ«ÆI†æóeöV¡ÛèÆŸ5 ÆL§ËÇÚ:ˆcmvÒ˜ÉRá»U×o=HB?Mäh‰>
-žR¤M¥L”pü'ʸ~ãµ<ÄxNPm¤¯¹µñ‹Žö zÍc×\ýcÇæÊÓ]ªOfyŸìlÅŸ]]¹à‹H€àêG$ÿ;…þ‹zO'D¼Mˆ {“BYL§½Ñ²èþóy Ä\Qœ¯FÅôÑ”Å{ÏV%è²Ü°I¯½e½ÞÝ'ëõê_eP†[OûsÁÊ,ŽrÁÝ1Fà
-ú+&àwÊo™F|ÈÄø,ea½—rq^ï‹ðžïTwg‰ºtÜ\«w»Õ@¯~`Ý`óúSðÃ6ìß%‚#ÿ䀣ÜmIàëˆ`×(@z†Ê;¾@ñóF
-;»œ("½Ëa¼¡)^STÉó±çSæ• ¾–7‹½’ö
-Ó˜>ƒ¾ÉŸAµdL£ ¦búcè!Á3쨠÷bUÿoø³¥m`kRŒ´S2i€ÈÂí@Šò
-1¡+¹dÔ)“ôVÀaÎsÅìYV.o*¾X0N?'£TgÄÖå<'ÞTôZsŸ{óZI=yw)=ù?SŸ4О\¥¯¸ÚžÕÛ …ÎÆpÊã
-Q#eÇMeX¿qåiÃÉJѳøRéSF…¼‹z9·ÜXÐFR¶’º”w©O”M´nåUzwÑOqÝÊKqOV<mCš¶!Ûv9î•Û~(õ>güþKx}E5åqcuÇî(ƒ:ãŠÊ¢2à‚ R¥‡^Œ´P)R @JHƒôC¨"BE0 A\а ¸êèg–ñnÖ‡}ŒŸ÷ï9÷üï9? ÷^Çÿ!HŒyY“‘ô”ŽÉz@-ÄüF*#ÜÂ1KÇóøcH9}¡b_ÉR×h2/s/gÜàõfÝ䩼 97y¹7¹ HóþßPå´ðÝö‰ça ÷±Š
-ràì|ôh%‰x…\Né/bÒzð|VVÎièø-¨¡
-5(n@éÅ
-Œ^$͉°¡k˜
-÷­$»€ub»î
-wk <sôS£ß‰÷MAn¯š#¼ž6ÇÝkH‰ž”fÃǸÔƒH¼TA¦t•VUµÕ°› b®²@)¬Å¶‰eØK ö†D˜¯“ð ôb.n\ÄÁ ÍùÜPbj¨þßîu±µn@ãiÛÅf‡?Z_üõxÜçw»))J_›‘zUˆB]ªÁ;éÅ”ÖòŠªF2‹]Kð¤D…HHh‘ðð½R~DVMÐIÙD„IÔ‹™Äq‘9 ÈÔ@>¶ÔßdÎßz×ý ÉÝf¡ÍËîú¬ãóî0×û]1>“­ç£F•é)Ò\d7KheR«¨UŠr:[Dáòx%2Q5I%euÊè¤aYI+£‘tÒJ’^ü%Ÿ(G-
-q˜êôëJˆhMIîlÈÊm–£ðµ"YÄ+¦qªËÙ &‹WQ%‘+ë¤Å•mò¢ÊËòÂʲ¢
-­”T®“Êõbs@±©¡ÂÖ¶‚º»@³ÓžEµËoûÜ­Ÿùº-Ð~b0üÌÕÞøð‹ê䤶挥2'‘ç—rÄ…• >•UÎepKªyÂB–B‚c^å3ûäX–VVÀÐIqUz1þ >7Ðþ±ˆí·
-Ó?Õl·u©ëØö·ûíÏô?ovµÔßô9ªÑ†¸wŽD«†Î%HúS2ª{31ÈÂâö|
-®µˆ†n)c!š˜5é*!/µQ)Hjì&ª†…I AªÂ €Ë |s
-vŽ0™š†žÈÎÉ2`òRõüy=¹0^G/‰Öñɺz*T×N Ók¨¡ã·©a#3åÐá™
-s
-¨­V¾»ºeùÌÝ Ë´Ï÷¬œ?²¥sÎiŸê™Ç1ñß“¬ÇA¾Ô‡a„ñqèûÉI™w3ÓSY*v†œ5Ã(€Îð¡³õ„àY51讆toŠ4ý¨0xòQ‘9€ûírÐlµ|±ÓWÓ†uís‹¯^ïY§~m»³á•ãÑKwæ¿|NQ^ùáç#B‘óqÑés‰ç’æÒ“æi1s¸Ìˆ¹’ìÐ9ZnÐ0/GûÏ·`üæ{ò|ç®åùÎßÏó{úcn[:6-›º¶2vk-äò»oV´÷ZÔm-…FÇC £ûq²Ñ÷Þâƒ4F¥cÉÑqÆ´ø(c jÄ&†‹Rß•¥ž}ËLó{#Èð}£Èôù½9Ëû÷®,¯×W²Ï¼3 ¨, Sý«!×ÇVCúהּ}ؼªîþMüG¬è‹N‡K?z8à–üOæ.{—Âý`Ÿbc?ø[BD/b¢>býÿSç»P™àýoö9¯¿„°3)Î{þ©J<ý¾#Éã}Yw:W@F4« ÇWAZï­Y¦
-]
-­àÕzÜHûMQà´õ xì¿Ýþ²ÇÂözAÔ¾“€ßïDkW p†¤ƒNÀ8t8‡@`s$¶Ç@fkèa;P±­Ylµèöë€én "¿b HäQƺˆê<v°R# 9÷ªžø;¹´’PNù@<G{w>ù¡…±Œoc.᮳cºÙ‹Ñ÷9 Ñýܹè1î¯1“ܸ—ÜÑسþ?ö` vë€5ˆ}w
-È+¤³Ô÷ñ5ôwqŒåØ桽ˆ»ÁYˆéæ.Äôð棇x¯cÆy/q“¼1Â4o(v†7÷¿kHÆx®– õÞAûAn8ìx‘|Aœ
-<A$°ÓñŸ“5ñ©y‰KiïªËÄFÖb\ gÐÆ]ÀßàÍãn§¼yÀŸyÊŸÁMÆ Süḗü‡Äi9ÀÄXßÅd^Û Ü™gìAãñ¾F /¸þS•°B3QßSJèËä*æbBgx‘7Û–ò–Ð)˜ÃßÎá
-_áž‹&¢â”ðQüKQO”Ø`}¿˜vëAäl žÛ!˨OÛ*Ê2ã| v$ðS ŸØ™¤•d}Ò»¤"ÆRb%{TÏ›¿ÈŸ‹kÎÆÞÍâï‰ßà%S„1É(ñ…äqü¤¤7a2õù…Ô`c ,¬Aâø (=¶æÔ  =ºH'P¼AI#DB§” Ò–6i™^À\¤–sçÉuü¹„‹ÂYb»øMì­Ôׄ^é aTúŒ8.}œð"­‡4Ü!OÈnQÆe]f|i`Yi'¾l÷m㻌Á¶` w=ÎÔ A ¤‡Dxø÷"„´ÈSÑÞ²L¬7ôRÞ+jp†Ü$y™ð“t2¾3m‚x#>‘õ“Æe=ä1ùíıô.êóŒŽ$ó€³{5p°¹Ã× qÝ
-&+ȶü0È‹9 †ø€55l eãæÔ„ßÄJÚtJ{’UÈK®?Mj>¡´"ƒäkò>ÒíŒG¤>EOâsE7åÚ™ôý+í©ò2Ý<àb )‡×ƒâØ×ãòä{ÅA¡øÌ1(Šrû˜ë·hH<=«fDÏ ÂøH:í™XÃNÉô±KS2jd¿Ðš2îSBïQº”w)½™ÝÔÑÌë´‘¬6úHV+c$«‰ið°í:ÈÄþÕFç-Pä½Ê¬¡,ÔþSY„Ër Þg¶€2m¤GŽkøq#(BíC²8Äzáý”Bé]NEz7³½•Ü’ÕI¿¦ºN¿£î ©/3†ÕÍÌau#kX]Ëy¢2x»VƒèÐ:ȶßyΛ¡Ôk”ŸÚ•Á‡?T†9¾­ˆ>ùk1`¢0)쉑Kx¤’P{
-Î]D#ú›Ø„t
-J2:xÕ™íœ&ÕV›¦•ù³ö"ó_ºóìëê8CÚj7¬1R°ÉÁuØÓ²
-œ6ÁYÏPå»÷sM ÍÒ¹½>÷×Éj‚ïèYÊéÇù,BOŽz;[ÆéRd‰:½¬MR h–g7óë5¼V]=÷†¾–{__ÍЗósʃºbÁÖàc ÒkA‡í½ENßBv?k¼÷|¬ó?0ßj7Óá8ÞH89PE
-í-aàoç¦Poꤜ«Y¨ø²B#k–å¢ ©¥ÙçÄ5Ú*a³¾\pÕP&¸k,ö
-Eú|ñ€>O<¨3çKb½ôXC‰ãŸ¡Êm+Ôyî~Þoß›æ`›©–°££b<Ö&„ü£œŽ»UÈ¥\5Š9—´é¢¦¬lY€VÉ‹TgÓ*uÅ©ç ’6cž¤ÛdJí3¥ýFƒt@Ÿ“6˜cv®ùþµ`°Åö^GK¨qÝ;—š}¬^]
-´žh;c;ØåÞÛH é®NÂ]/eS®ä Ù ˆ¨V«”UfëÐRe¾ª ã¬Î$¯7èe—MZYW®Fþ0W-ï3ªåý•|@oΗ† lÇ1a ØœªuÞü©ÉmÛü%¯]ÓíþVÏ;B=ºévïB\pW-%¦½‚™Ø\Ìg×åKE•R¢S£y*“ÊUªÓ(ϲѓíÌEÑ_0}&í7¢Š½9 ÄÐÖ@žÍŸ 
-›SõŽß®\tùn¶ÍcûÔu¿O:ƒ>hpý{+!èZ#9úRM2¹¡œÇª* KòåHž)ÍÑT*m‘N©®6¤«šM2ÕµÜ4Õý\DÕgB²û²¬½9_2÷®›?Bõñ pÞÁòÝ%ÇM¿u¸mžøÙwËÀ­€ÿ¼îÒuØÖLŠºÐ@#ÕÔp˜¥åBA^ ’–S¨Tü—Ï:§:ßã8þ³·iQªi£mŠŠlY"ŽÝYÇYœÅ9Ž}Ï^ãPd9(RÒ6¡Å ê–D©)L¥í†I3ƒ %Í8‡îÜ)Ûûž¿îüñüûóúãóø|¿'r2$E9)yçó¥W âro•¶?(}S—Ó‘ŸÕ) âÖ© CO§¶ÏÇ¥]‹ðãî%c7M–5Y,íi±Yñê!iËãF²yÃ-_RM-Ï»¢RÌ?{9,¤èRlŒô|RRF©$5õtÖÑäâYqE¥ÒèÂËù…7  )¼É<Þ‘×) â Y4P¢¸SFš“5;Êî/x´W³û©åòg-ŽÍÍ^f7ï2œ®ÝâÒ.ÔŠ¸ÅU!AyW££2*R/}8éBfzì¹üc¥%9¡gÊ¥AgjóÄ¥:ó‚NwJC‹ºrgƒECîzuœÛ6W·ÏûzsëüáæmsûÚw©¿~a®ÝòäÀ¦†Ç¦5ÍôeJÉmNÁ qæõȈԪ¸¸Äk‡Rb®‘„WH•Ÿ:&*»”í_V“Ë/»ŸË+ÿwŽÿÅ_rDgßfÏIkU¯«†‹[4Pe 1vGO}°MOµ»Ó@íÙ›½K›_Øo¼ùÔmÏ•Úþ³Yž'î ˜Yw…’úðÐÄÅFÇÜHN«M?x=Gâ_sò·úb§º:“Uݔɬy•É®|—É­˜¯RA‘b/+ôÕ¦êtUÿ|¸J¥÷Í
-¥W¿mR}Üm²øN§ÝúªW®ÆÛ)6'Ÿøºå´ð|Òð’„ŠcîÇ„…6%ňÓâw³“ýŠ3ï\HeÜ©’Ð%Þw_Jè·{Òµ¿§1®Ï GV(£d2*uTþnÐVîy¾€xÕ«E´ôé«5öš.¬ýÝvmy·³áéN²¥ô5ƒ”þÒ’Ü.bÆ< á‡>‰üœÊo“DrZ³c}[‹âè-¨­U‰”ÖÆ$rÛËDòãþ$jÓû”Ù {™.¬TBí2¥·æ/^Ï#.SjПS3°giù{Ý’>'ÃüOó£¿Ñ’ßqÜbº…´Ð_B˜]Ñ\~g¢Ý‘&ftä{wœ £t\ ÷ꨎðèlŠtïzáÞ9éÑþ)z68±D W–oæÏZç?uÎ#ꇗ«T ,¸ôiÏÊÓCÖzÒNFé<,’iöQL— ¾—°?ЛÛéËìO`ÓûS¹Ôþ,W¡Ð}àœÈuàšØeð¶Øy°ULúÐ+véûSìÒ;3œÕ$~­S'žÞÓ šŸj·ÞÍ#*eß©]”o^T,7Y+·ÑO“;'Ê=Ì#e4Û@Ó‘/ã¹rdbO†,œB“ô&ËùxÈúºÊóY¤Ñ¶ãh™ŸÃØu®ýX#wÿ—vžÝ—
-C3ê¹¢L<»­FÜ{¨FÜx©A\ÖT:÷Ï¢¯Û´²¿š®‘|³ÕO'íŒw7S­xã [Ö×>!r¢L„:{NF»ºN&º“&%ž¦²ÉöS…»é³T›éË´}P<4ÓMt«éç
-/fô¢V™¸wW•¨kS%*º4ˆÒ©ÅÊÇ¡;÷ µRa¾:6Ãp`«®F~ ›0àcFÇÒþÖn´uF¸#ÚÛ#ÅÁG÷!×É
-E$Kœs¶@…‹9ª]ÍÐ0«û·”‰ÚÊDù âT‘eÊØ8çv,ŽÉÊ`X­`¿ ¤ÍÞðØîÚN70Iàî>
-¬WSà ã— $xé9À[ßLkp·XB¸ÕAÛ̾ݱ†{´c7$;ŸC#äí@±±!ÎïšMùOŠù/ âX/A¤bÒAh)c¥Š
-ãEî0Ó"ÁZÛ+làò<W™ƒºz/kLÀ^»üuÆé!Xw"u ·~R6lEÚÆÍ8¶Ñ
-…¿'jïp1ÿƘ0oÐE¸×¨*ü«¨Fⲓ<‹è£Ì ~¥L!f(#Q¿Q‡P/iý1sôkè9ú•Ø9†= nÀmqœíŸ©ÿbø5Ð_ 4!Û€ú¼?PÄìÿ(Æ}ÏcžyËJ MKB¾$¥¡gãsâf°ü³Ø2ÒdLeÕNµE÷ÒF£ïÓ£žÑc~cÜDϲº1³¬ì vKœ}
-Q§˜o\J¸˜hæ”KóÙ²ÖU¹‘}_žÉ“¸6HϵIÓ¹ã{
-lLjüÉwxÇѬwÆížÀòÝ‚Å{ÿ«"ÐûYMвÖž\;TêwÓ}°Ë„ nʦDÖ¤³cËtB¢5YN7)S¸92½ Cš'NÃE¢EŠ¨C™,PªGI‰£ò¤Ä1YR¢ ²PàÑJ [ïr¿¬»çÿYöý¹š}‹'}ùKý±5Uçvö” ´Y°§/ç‘Ηg1c­é|‚I'¥SÔCRšà‚Â(N‘Yd*¨R!‡Z•2¨_Éž*!hTAc2™ÔÙ¨pƒx¹3H]çò}=@‘ŸçÛÊ]ó_ÔïY0Ö¸è^ÓÑÕ}µgwt•# cOU™ E¹ttAVÁ¨Óô©JŽN«¨S²ÄrµY&U•+UÍJ¡ê†Jô¾ŽÊEÊ1™Haƒì´UÎ@ú5¼÷ÂóiÞêþ¿Òí¯kwxN·ìö|Ò¹Çk°5ÈçzCÈö¶êóûëÊÐ'K­ñáÍÔ˜œ<^Ÿ-¢j3äì$½†/K5ˆu&ˆ¯-Qp5 J¶æš’­Qr4£rnò˜,AmƒìŒ•Î@7dÀïìK[Ü>TluÙ°Õ}¢s‡ûëþ oýtxÕ•–`ߦËû*«P'¬¥¸°¼B2Êp‘¯5 (ª\ˆÕ<afº(Á+eé‹ät}‚ªïVR ´ôQ9#uLÆÔÙ {
-§OU+æÚ¼Gû½†î®r꽳ݳ­ÿÒšÇ7õüèŸÛy(½¬n‰€)(A=Ç®’¨52:¡ZÃÆVf$ +Ì‚èŠJ²¢]„¨¼#Š¬˜EO‰PÖ)¡=@ò…Ð/qÖ¯ßÕ/qxÜãépoÈÓ¡ÿÞrÇΟ}=ê¼KŽ®+èñ3ôF¦ô NȺãÎ :ÉVMiçãð­ Ó’LC5˜ˆævDS7¬©Ú<
-È*›¬²dý’/ûFI¡
-¢ ÖâÂŒb­Ö#ngT-.uGÜ·ºÎ0µn€
-£BŠ€„
-eq¤åqýu1ÛSÀÛË
-c‚rY3aÒaH @FVÒ–ECþm<$›’ ü1Ôn&xÙ k¹àž&Áiàƒ}ƒV3æ ëêš#¬~Á
-ä›™üÄhÂÃÔ'ê¸à#¿NôwY<LÞ[ȧ’ò¤ì—¼¥Ì’vÁ ô±È"k[ä6ü™A>ŸŸ3ò‚Çaù¢)X‘<Åä,“úa©&Fc42‹Q–ò)mkD±’í¦,’B³øgñ€ð´¤_Ð íÜ’½£ZäÝT§ü OÖ.Pü&6+%ƒª_eÕ- Ÿã
-‚Ô Ò›R éÉ—’ ÐIh’
-8ÙáïæLAöȲ5ƒ…Ç,á2§õ_*\7ÿ»Â{û|ùŽ³%a?<Ë=õˆ?ÿ òJI ¾ÃäEÞ¢Ĩȥ˜¢Û…oÄwà:ˆ­Øäfì0E¦4à(²¤7”*ü²„°HÅÿw #­•jcç\ —Ø[À•§¾Y’ºX-Tylý­Ê×fº"Øn¢(êäƒ<¬Û=Å·?|#åjd7+'æT”ÐJ­À5‘k‰Är¡‡ZC¸K«&<¦K‰:Z%IO‘¨¥ä7Ù8é+ê6¤9‘³(8°.?b¾\å°ú­ì̺ù:·M/ê¼·ý, °Õ”]r`\ûsH¾×3A]iœÈ¶+üØ&vAB£,IF¯"I©rj%¥‹^N€Ê(ãP)õ5TLÕÑ…4=M@[ ~̦#½™¾Ãî3…+™}‘·Xlp\óJá¼~ZîþÝ#™ÿÁ‘ʈê’¸sªB<º+‡Ôš™)¿šSËÉM¨J)ÆW²Å¤2f=µê€P£
-”0"Ĺ©1eY¼af>?½ŒœVMËä63®rz™\Î?Yî BËàr´—££s9zš!p2;iÎk#¸|·ñrÝ“ß[þaò[×!Óg=Ç,Æ®¹l¹×‚Þw³1øXWÍeçf Æ«VDÓÃË)ÑÂütL^Nn?«„”ΓÒ8™rFJF7‹q—ÅÊxŠ˜g°3´PrºŽž|UO3& ³S¿5‚ó·¢`±Ñ—ƽÆúŽ}Æ/®0~¬²_5ªtÞ<Ðá³··9ðh[C䙆šxO©$É_TN –²£r‹Ò0<AvRZ¾t%OLcå4@Pv'“–­fQr³¨9Z-K Ñù::Ä×Ó IÈ=¤mBÁ‚Í(¸j;j©y—ÑkåNÔômÔxßó¡ëg¾íSzíél8¢hŠ8]ÓëQ.Ãù «È¡¹bæåÌrN<·ŒK..$2ŠÊ©TATØÁÀö3“Z¡@‘òô4R®a09ƒ +\Œì!ÛŠzÛnzycøY½ õ ÿ™ºÏɪ÷ºÇîVåÅÃuíaŽâ–èóÅòÄ yõÄàLÉ­¾Ë–d$Ò+óñäŠ22^$£%ŠÚ LY/C¼¦'”êiØ"=+4 †¬÷¸‹6‚?­€^¹ürnj߳F ݵ[Ù§>µ¡ó–»\åg'í9YÚåšßŽAóZð-œÕ˜M«¿O¬ÍÁád%LM59¦º…U}ƒv¹ú!â5Jº@©X Ä–¿1f¯GÁyëP°døв<S­÷Vû#›ÁÀðAÓž!‡u̓nÛeý¾¶¢¾àãªKÎüž8/NWÒEÖ5JµIhãÆ$¶dcâš‹°QMR|¤¢‰¦P‘B›F/‰¡òEbD-BfÌY‹‚…kÁ'Ùj0uÍŒ÷™ƒÑa3pG³¨4ûLÚÿ¦~ÄźrÈg¿`0ðh–:‰{;ö<«ëC½IòÇ«! ×9‘1=üèKݸ°nIB°R‘¨ìÅtßGÌaý»ÞáÛÞâ‚Z ƒ3×
-úM@ϘhŸZ Ùi$:d^üÔicÎ÷iý°&Cì)Q'q㘳ñ?Ü¢~‚¼"Æ® C4<¿
-ûËcKà_¾Ûüà >pÄ.O8öûó0vï9˜´ßf< smOÁÙvÿc»ÎÃbÞ÷8€fZˆpµ(%-Ú$TÔ,ÍÚ,5ÓìK3Í4íëHDuQ¤P"KÙ—déZN<¸9–ÇÅå\—ãv²updi“ä}Ïý{žïóú>¿ç÷Ïçýûþþù¾Q㊆€ œ– `´á>á7«ZN‘HM‰ùí$RåC©¸Ã†´ãGdaªî”øÙ+2Z‚ˆ±BÐ'pÁ™Ä‚p2ñS£ š¾úáHr]ŒŒ™¡°Ì
-Áj· ¬›€yhðôCÓ_œšãƒK^Þh³êàybþ5bþ=©è‰´lО”†±# p¶QÁ•,Á[üí8XàG*èc–‚íÁ¸E_
-bƒí u€:Ò ZŽ34b(µ¥ø@¼,
-À{*DÌ¿Dà[‘!Þ‡·-Ló쑾h ²h‘Å›ôøÙHÖú 1%:Kè°º8|H±!rPº…6 ÙÉèïcöÆa‰=Íù,ºÀý(¼Îëþ“÷^ø‚×%ìæ½~åwÇBx/¢[bëëE†Ü‹=!ÕÏ9¡£a‰š
-Ñ;óæÚ¢0xŠÃÇ¡„á<TãÚ[(ñìÎ×Ì{›“ò*#7ü”UÔßMk™O UÜGº:þÍnÑ=uSÜ]å É-ÅyéMÅ5Y»â¾ìšâüŠ¢GqI9¤8§R6k†”'4C
-k %º•èœ„åD×+t@Ùâ1Ãë¨ûÖr¦w—ƺw­VútƒÏË {”¹œz?µ„u7iC̯ÆÑ? õâë ñWµ‡åmšÓŠKšËª ê[êVõ곚êfí æ˜nPs8aPݤ·râ L®dä½³ÈSæo ¡Ž_+—ŽÿXÉœüçzkg™lΊôA
-RÃîäåÑÚ³V±¯¥—ñÛR6Æ^JÚÿwcƒü\â~åýqusB«öd Ýñ„'º#ú÷ºCúݾÄÝ^ã€n·ñ«Ö¨fÙ ™è{¢ëÌ&c½¯íð¦‘=ÕáNïªé_læN{Z!ñ¼¿Fx«Èv½ ‹Öf)`_È)œË\×’¶Yz*e»ò¸y¯úˆé°î ±EÀxÅ°ÏxßÐhì2ì1õv&õéëÍý uÉÖA3Ó©Ól°œÈQêfƒJoÊ`MýÇÚEŽoê"Ç=ßÆšü°*ÖãözUÀµ5ÆÅ—‹Ò©­+,ì–e«'sËÄG³*e3¶ªö§5hS$ìN>™Ø|Ѹ#ùŽi{òKcmJqkjobMZŸ¡:­Oo tÄ÷gw%Ñ;×yª¼È}µþ¶ïw,pèÜ>ú·zºóÝ­B÷›äþ¿”ë/M¡6å°­\!8´¼D¼ß²^¾7§ZÕU¯«ÏüÙP›q̸%½5©:½=iszGRUÆgÓÆÌcefobEf¯Áâ
-bƒ,g¬":ïz×ÄÕÃæË_Jמ Ûç¡#ì¢Nº¹ïv¥F:¯u£náérsÔ±ÒLvSQ¾ ±pµxWÁZy}þ&õ6K­®&w¡*ç°©2û¬yCöõäòìgæu9ÝIër¿˜ÖæöËr{­A"ñrˆ¾YLtÞŠ#¾os³éÞåeórŸùÉ`‡»{£&^ßÉ›u±6ÞïLµfáñJSdSy:«qM¿¡¤P\·ºT¶ee…ºª`KBE~Cbù²¦¤2Ëis©åjr‰åqòÿؤϷ&Ó,
-ãö"g«f(š`¾’–*`ŠžTÝ=ª»ðœš.În×Áe‘ä4.ýÛ
-†ðÇÍà‰ò„3ªö¨)fº”½hH1E3ªZQõÑN|:‰ë »¸6úоÃ@š&†ÓÔ1FB “$T0®ŒùtE,£+`¤¶HÊc‡HèdHA'S*z|,hègKÇ
-|5;ÀGk ¤:{ðnq
-Ÿ,
-(wúĬÁMÒ›\?ÐÚñþ'÷¾ó?ëö–zÙí uðš:Lów¥~v¡Î{ SÀó‘?xýJ¯;ôoe;ºêºÔ5C¶B„ý"ˆÁ/ƒoSˆ¢¯ŸlþKlñYk3)N¶Ÿd;¾åáÆ9•®¯Øuøÿ´ºtž3{ÜŸ1þN|ʸIü/ã‰ÇïŒWŸ¼ÐçI÷èàs‹ >@þe@³Ð>ê™AængkJ—¥ ôX©ÛO]û%–³i2BúÓŸ¡‘Ö¯eìǤ鎣â—§Â2üøÕ„!nñ §Ýó1»Ûë!«Ïûk€tõÀçkÌçkÒ÷:Kç7ÀJ?(}\ œ[
-h¯eó-/©ƒìú’#{(ܺÉžq™äö ¥5ªŒ~4¢& A~”]ÞÉ­ ;˯
-»&¨ hÃ'ø‡Ãçøeòy^©|ž[ñ-¬ÓƒHÔ7“PïÌ\¯§ÓlÒ›(Ý¢÷¢ÂJÿÊ]‹î•»w£ˆºár>×¢/Kj{FîÜ•·÷XR¢gk‚šÜ´?—ZWL¯‰©dUE7p´QÇøå‘=Â’È_DÅ‘E…Qo……Q3‚CÑ:~A´ŽW=ÿ ¢ü1¨ï%£Þ™³û«höF»IïiÍV½ÖØ Vº™\-ó[¡ýSO¾xgWV¨S{zôÞæT¥gƒ*•|$1‹Z•pˆqXq˜U_Ë-ŠkhbO‰òc/‰scˆsâ^‹r⦅Ùñs‚ìx!„Þ!n꽫QßZƒM•}½üy6Tÿv¿n§áõjüŠþ
-òºÞÒ€­' …;ŽåË›³#ñõû=ªÓT>)éÔ2U>£(±”¥I¨ææ*›ÙŠ.Q†â¢$]qW¢V¾«•S¢4åœá§)u߀`”_vP¯Â@cŠMjM±çµ¦Øã¦õØ`£áÕ:×åç«IkOk[Ž—
-lZ
-÷í®Ï—ï©Î‰#j3I%éi”Ci¹ô¼ÔbVvr/]Õ$8˜Ô)NI</Q%JTIc•ê³H•4+T%Í þ× ½CÂJ 2‘¢•ØD• 6Ò¸{в»Ñlep©·¬·Öëû®ŸiæmZžuC©Ô¡º(ÌU«‰!–ä%49©”ÜÌ,zfF!+M]ÁMNk$ì'¤ž“(Ro"£ÅÁ"ÅÁY¡2uN°£$~‡AŽ ö©t6td)ö¨yv·Í hÛfp¾ÅyééFO³cµþ›Vs¬ŽTHvU”‡¸””D¹k
-Þ9šd¿ôü Zj®& )û07!«NŸÙ.ŠÍè•Dg\—DgŽ “¢èÌYaLúœ v¹ýG ò–c£ZcìqÝì^ëìf‡)v©ÃB¿·ÝqɉâêÖ&Êuu¬m•5"ûÒ*N£pË.÷J/MòM)Vû'æ1šRNlÁ~T~›PžwF–7€ #ïEáy³ByÎœ
-®U†Q¬£P°È (
-n Å PÄ µî#¨ŽöŒÆZ§*‚K•MžyOçNzñ;ßåÿùÞåâÕºTÔÄxl¯6yo©š°q×Bi~ÅWŠ5å+Ôy;ÖÍÎ)-4,Ý^»h[E|fI­)£øxÒœâöä9Å?“ï[bØ”Q4’˜±u,̱,°„§%4xPÉ„ÛµL¸RÏ„¶ã6pê„¥þ˜³æ{é„ÊzµSÙ{ëÁaamš_þ¾ÌàÕ{—Ês«–«²w¯ÕfUnˆ\ð¢èŒåÆôûãSÊ“Ë/˜’Êÿ•˜TÞ“˜ôݧ„”²Ñø”Ò±0Ïú6ÑáQ þ¹‡AÞž 8×H‡¦&+hhq¡h2ªNÛì8¡r(jŒr+lˆãåקŠV™¸üP–tÙÁÅâÚÕá™5söm‰L­Þa0UWÇ&ìm0Æí=gÜ{Ÿè6÷ ãv£1n×X¸† ϶Ü« ’{@ƒóõ4h:A†Vl›{Úx´ò³ã‹Ï(&njÑM]ßë±êd²ðëãs}—[$^ؘ-×°24ýh¾*¹~³6¡®Lg¬Ûsä¨ÞP×fÐ×uôGº Q‡ Q‡Ð ?8ÖPÀ£m
-T^e@é­ PtËRxˇ±î¦ÄzÅð‰Ù×õ΋¯%LŸÿC7ýj¦ ùÊRŸ„˹~ÆËë 훂#Û·KuíU2M{\ÝÞÞ~—x%W]ìW(/`˜ò<*¿ôï€ëU
-8ÁÚ|Zîƒ Ö²ûa¶ ïÏž”qÏè”Ú™2ÍÔ9בÅéXÎêøÆK×Q(Òvló ïØí¯ì¨ ëh TtÞ Pt¼
-½Û$¿3,»ƒcÜ®
- aÈPÁ” ÆBŒzV
-¨<Q=0€ÊƪÊi®¨¢¹`Í 4L OÂtº=.¦Ûa.ÃÿÊ°Á"¢œaÕDíìCE©ˆ†Š™4TùÓQÂDU8 Ãc¬P™f‡Š¬É([åˆÒ .RìŠÁn(®žŽA‡ØÔÀÆÀSîxÖÛÉX·9ðøxG r09£Äçÿã¢ç—þ˜AæCú„Ú—ŽZ1µJj Ö¨I±Gբɖç„ò‚©8«hJ¿›Ž’*²µî\ïÁ'8(>M\ä¢øñ£'ŠŸo<GÅžÃâQî§`䊑Gðûÿ†BÒ't>tŒ b`”‚…‘‘Ö8ÛdÚLTíŒÊõ®¨ø;YúR6Ê*ÝqÖ~œu˜ƒÒF.J›=QrŽ‡’ˆNÞ¨äþ°¤›?(éãõKGy½Rä” àƒ…ï$èõ%”zQQÅ£¢ŽGC½Ž1þ Œ•±0VgÑñö•á€º¯œQ»f†Î@e‰;†íä b/CxbèQÞ¨ü$DÞ*ø,¿,’ß È ûä]Âß彂wòá9zõÈЧ[†¢—ò±0”OE-‡Šz cÉ ¾ L”Z`¢Æ
-ãcì16Í£³\0j…ê
-Ø#Ú­œaM™çzo0|?@uDЧjö*[¼>*/x}PÞô~¯|èÝ£|éÝ¥úèõBùYôß0œù< }Ÿ…¡ßc%ú •\*ÎfS1–¼wM\¦’ýH ¶Àt¥¦èíÐdrÏtŠÍqˆþƽ7j÷Cd ï½n§à]į7¼{´G}^kNútiÚD/5×D/4D¿j=Õ|ðýfØÿ‘~Rcà5ÝýÛuÕÔ™ÇqüIDÅQ‹¸âŠˆȾCHrsH Ä’
-
-#x Z¤Ê´êiëÒZëÔ±u´ÕZÛ>sûxñ9ç¾|Îïß|ƒ–ƒûñŠµnø.<ŒÙo
-àilƒ8¬÷¸Ø;2-
-^S3R2Y db`Ýû‡Ô<)2÷µkÀÝjcp³~#˜ªß‡©µ7¬òÚÐ]NÜÖ¢ Ù]_B?TUo«-à8”(x.…r‘‡"'×'GZ-ÑEY ˆ@܉òÅC4žhš–.þó35]üš.†ž"KÁlƒ ð:×|£2 å«Á\Ý0£7ãú=¸¡F;£¾:õmÕ‹Æ
-Ú®ê²ÈƒZuì±û¤²(Í9O™é!Í—údå)2åeAüœ:rš¬åÊ.R“¥S4Žì>æ5YöM–AJŠ"KA¶ €Â5à©î© Áí*#p£ÑL6¯#-»pͶ†z7Ó¦ú
-n˜
-®\÷+‚k—{'à«B
-× ‘Z×À‘V7á«n7áË÷ìÅïp;¾ƒ¬8¿á]~QB–‡™úiÈ8êŠ c>H7Æ'´ã""zBJ*'T¤ü­–"}k „CŠ]dRƒ!—EöBXd/€•4øÂß8p¡Ü‘Ž~pÖ‘ ÍŽ,xðžñÜx¡5—qþuœoC(ç'u"4cŒŠ´à‚¢Á )…d $L„‚„‚ÄË.9t¤?$’\0Qü ›Â‚ŠÌ·£C™|nç ›©ðÕPÝ «}Ïfü>­Çù×Þågµ#”Ð…f
-
-WÞ(Ï
-ÌWR`H€ýR~“ç«E$ÄbºP
-èev0CK‘q'й@Ì7ˆþ«'¨þæ Ê- ˆÜîŠr\Ã>&ȳ@~ «aƒüÖÌ—ÛØ£òö+ù
-<<©r€ûU˜Ûò`³E)Õz®ì¤ÃLiâî Å,·a>Ûc €çÕË)õëÌ“´å*‚u9‚6»¨Éˆ¬Ïœ ×e^£*3W¨ŠÌuZMÖ?©ÕY¿Pª³2Š´r}ÿìm€ð¬àob øZfkÕVðPaå~ÌRM é|%Qz|Ǹ$~÷(ŵO˜íÞ%ànãûê
-%ZnU°šSOP嵕¹½¤jö8¥’=G«`ß¡ËØ_Ò¥¹¯hÒÜŸ)Ò<„üÒfA®%¼˜Ãz¹)¬UšÃ#¥%Ü«³ƒe•f¡îˆÉeE䶉ª˜íò3»úÊ.â ÷ÖÒ¼ÃMB¾¯Z Pñ+‚•¼Ú°ê¦9·›$åŽP%œ+´2Î-ºˆ³%âþ&âþDqŠ¨
-BV­–˜®ì&¥*Æ)LÅU*CqÆP|CeÔü›Â¬AÈ¿!m†p
-oá€s¹+» kå †µ„c®L“V¢-ãïÆáãî&Ûž¼Ë²?f`;Dx;£ e»¨†jg²A»'Òз—h˜v 7|âfø½køg/] ·ÿëz Ù¿Õ¯{x¥`ÝÁ®)
-Avd“¸à‚qÇÚ£cÕâR·¡BQ,r° î€V+Å]ZÆ¥Ö­âˆ+‚ È&•g.gúA8ýð;ç~ûß÷Þçýp+Y²'õ,YÇU–GGËãñ;–´}„-mÿhö©Cc3X °ó$Àrþ+Ï“~ éß
-ÅÀlŠÂ¥àzb'±¨&jÆA©'…^R
-½¥4TxÑP®¤£—†ŽžQ ôHÕGÉ</c¢h­ºm6F·Ý&èVjŠÂrâ
-µlž&š‰âñœèe
-‡Ù#nÈ#DÎÐÿ™
-e¤¯SèëNC¥áCCß@:*"è=S½æ ,ߥkŒPºÉ%;LQRÌB÷ýlt¯$jÌÐý„Šˆs_%nsFÅœ÷ÎûÙ€ÍÞ»£9ÁísG^Ÿx<”“¾RH¡?1YLÃ)Þ„šŽþÓõÐ/A}u¨øܽW™ ×W¦èµ…žElôÜk†²”UGÉ·Ô›ÊΘ”]2‘ÝàÉþkÞ/ë6ë9hÞã‰Ü72´è–!¿K†–¡ÏXß™B51UHC'áOÇÀªcõqJ:ý¡ß2ST®e¡o¡ÙGŸœ?}ŠÍ?(ös‡•Ü!E oPq’7 hä½W4óú­¼^Å#^·â5ï•Ï€Å Z>W ÕSo<U u‡÷x¨ëO¢Pã@aY‡’¹%3¡ÆÀàH}Ô$31p®ñÈÔŬá€ÕfS6pÞOÞÆíó/â½õ/åõªX¼QUñ»UÇø]ªSüNÕ9þ+U ÿ…ê!¿Ã¿“ÿXÕoÕ¦Bë‡~hûÀíîwýÐþS8e¬oKúÖFu”ˆÂhrQ Õÿ0=ž9 Í2~œÃê ZÎéÒ¬åvN+ä½ Üañ|j1ÿÙÔ2Ëu¥Õõa«Çê:«võYA›úŠà¡ú¾õ]õ+ëßÔýv×Õ£­8é×
-ÈlÆûÑg齎bvE¦¿ Ïf?›¾˜ó$t5¯=ä+~[ðVË?>Û-¸Tj}'¨Ü润Êö–æ¸Ý M£ýuÍyûVÍM‡– g—ƒú/hF›5èÒDœÓ ëDdEa0–˜$
-æÊ©ßgêý[at5#‰}!UgÑ”¼Pp6i‰íé„Õ ñëêã6»ÔÆ-‹)‰>$©‰®“VG7yTE_—UF?—UÄôËÊcPö=±LìxIÚ ¦€dsØ0<Ÿ¯Z@{Ž-ÜΑR¿.˜Â¸œjøóì8ö]ºECF¶ .-×îDÊ
-Ç£É_:NÚ ¬NÜ&ú!¡È½2~Ÿ´"¾RVwÌsÜ^ûâZä¥qOä%ñïäÅñ(ß“€òoÐk"Œ!ídc@1ŒÌ3ÞE¦ð4—wóøкXD]Êõcœ[lظ †]—lq|ö,ëú…öÕ™ùŽ3
-\+ÒÖ¹•§º—¥ìîM.‘}7ó€×ž¤ÃÞEIÿRìNºì³+©ÍgÇÌ^Ÿí3?*¾IÆ1Þ„üS8ÄÌ!9&¼Î1€¶<&Ü_b7–ráÊ2Wªi©½1_ìÍdÍIäUÏÏTfgÛ˜“ëT6k¹ë^ÝQIæÉ·Û<þ™^äµ3­Ì{{j•Ï¶Ô:ß-©ç•…©w•_§u+7¥ønJGŸé¨˜ãÈ=èCÿ<´çÒáÎR}¸¹ÂZVr y•œ^)§×.ŸjpdI«*/ŽWñyš`ÿÂÙv¥ósœŠç-q-š[ Ú5gdû¬BÙVÝ.¯ÍY¥ŠMY•¾2O(×g6©þ‘yKµ.«ÓomÖåZú>a"“Ü^.ø#ŸNúzðK\ü‚ g×8@ýž´£U+´¦Ëb¹eùÉV%y:»¢Eówåä¹n_°B´uþÿÈ.Ϩ¨Î<ÿîÌPDš ½H)#LQA£, "  t¤ÃІFpFš ‚RDŠŠ *‚1XÝQp]÷¸fƒ%'nìf‹‰=Gß}ýæÃsîÇçþÛ=÷WâR™¤à*êxåñ-^òønAIÜ°8î¼·4î†wQüSQQü;aQPø_B6ª€Ä1xüCÂÂTßÉT0^ª…¯Ë,p¢Ì•Õ_â­Ú-]©ÙQ¬×šnÜ”m^Ÿ`U“™fW™žë¤H+v)O­à–m«áÉRš½Š’»I¢¼¤³Þ’¤)ŸÜ¤ÇÞ¹ÉoE¹ÉD˜›BþLH$ oA÷€æ­26.Ê98»]æ¨pfõnªt–.ŸÛ*[;¯©h½Q]Á&³ê¼8+eî6»òœlDz¬BY¦œ[”QÅ+Hoò’¤u²SûE™©g|2R¯ù¤§>ôÉH{-ÊH#BŠàKÈ&àE20\—ß–±p¾‚QÅ )qXéÄt)ø*û+ü4öÈWëÖ•†VË"ÍÒ­ ¶&Û–äg:Jóò $¥\IîN^vNƒWFv» -ëˆh[ÖiŸ”¬ Ÿä¬Q^‰R²ˆ"ø<LnÑÜyµø3ýí:£dp¢R ýÕ讶gÚ«<9Í;—ΩW¬Ò©.1PÈ7šÊËb,e%‰6EÅéyR‰sN‘Ì-³PážVPï™’¿_”wH” ñŽ“\ö‰“üDùM/!BŠàKH,ðSC!pYœW#4{ ԲѻKu¶LË.wvC­¯zMu€¶¢2X_®Ü`,Û±Ù¢°"ÞZ²=Õ>Kž³0½T꺭¤bQ’¬Ö#¾¸•¿UÚ+Œ‘‹¢¥ñÞ,½ï-})Š.ú$Œ)"
-&¯€{ÙÀd1pqð5õ¯£¹k7ÐÙ¨‹Ö&+46rÙ5 ÞjŠúšò:±^qí:£üê(³œªX«Ì)¶©Ê,ÇdE¡Kü9wkE5/º¼ÙsÓönA¤ü„p£ü¢h£ü}þOQöQQFø_ò,…ÞÕ2ÚƒJàõ÷Óüw ™fÏm4¶š£¶Õ…¥lªÈ›ý5¤{Vëæ5…d7D˜¤ïÞb‘RŸd¸+Ã>¶6Ï)¦¦ÔuSu墈ª&Þ†Ê.Ïu•Cü°Êq~hå÷üÐÿá‡)÷
-S’ÏxÎägz“7è.^ú܃Zàõ÷ìZiÜÝ>5ÆPt:2e^iûRuIÛ*­¬ýÒKÝn”Ôm¿7ÞrKsªÍæ=¹ö‘M2§ J—°ÆnHC§{pà OÜpÁCÜpËC¼ûßâúâ:ÂïšÍ=zW?÷ 
-¦þÃ-4ûµ ]@e*Ê{磤ϖ)ìsgçö.VÍèY97¥[¬“pp½þÖ®(£è±f‘)–áÙÖë:¤v!í;ƒÚê®ikwýªí¨ÛªýçÜÛnºî{áØúžØBþÀßé.^RÐÔÓ=¤õlöRMPz”æ¿A]H-‘uÌ•IrýÕbVÏ>ªu4BcÿÃuG’LBŽdš.X°æP¹õW‡vÙÚï°¢¯ßqyß7Nþ}7ý{Ÿ;úõ¼sòë& ýÎæíÁ9:ƒtþ½´þ}ºC@Å
-dŸ.‘W€à)6nªcémm,¹m
-ßï°øŸ<xÿ°¢é
-¬¸ÅÀgZü‡Zð|hÞC+¸?r÷±'ÜûÂåÉJ8?3NO×3ŽO£ûgÉ,Ûg–Íór–ÕóFö‚Ýl‹§Øæ¿LP°Íž¿d›={?‹6ºÿu´ÿòÓ@îõGýS€ø&àÝ=`Áí¥\^êÃéWs8üj»ß\`óÊÖ¯¼±àµ?,^¯†Ù›P˜¼bŒÞ&2ïr™ùïËý÷MŒÞ‡Ö¼#,Ý߯PîSžÍb÷ PNë—Pí}$­}í-Àoàÿ¸þ 8¼ì>iÀšèb1„91‡ ±q‚áBŸð¡G|¡KV@›ˆ¡EÂ1—ÄaÉ‚:‘3j¤Q!9N¹À°ÉÄ,vP>õ'SÔߨŸÖ¾ŒÖîù
-Š(‚
P눕¢Ï±´Úê+•ê‡§€â
-8b¯µ3þ7*ðý5€®3â5Á.ClU4°-¥§B 8Û°::pöaÍØQpÚ±³X'v“1Îée|â 2F9ï#¶ôa[ †lA{ˆÌ·S
-"_ †h€@ª |9 fæÑ€W¬¼2:p·b5 àîa|áî'&¸Gˆqî bŒ{šø̽D|ä^'F¹‰aî
-¸áoqŸ‰áy¸-¤‚ žÇüpÍ1q¼Ö‡oÒéïçä3†go7j¿qÞÂ|í\Ã|åT¯ó©IgÐéˆÎ€Së¹Ó9Ö3§«¬~çVŸó3^ç¡iœÆõî;þ¯N0½Ç ~™âŸþ.ÆÜ,²À+çâ‹wÓ{>uÜË[cÔ}™æ[ŒÖk×ú —•ÄÀµö³ùk™ýó*tžÎ«f=ïbõ‰tÿÔýS|lÚù§ÙÌídߟ{‡Ý#î×»-š~C<fx] FÝb0þY &]SüÓßc:ÌßÁŒOù8›2¼x!õ•o€æ¼#´ú%0ú<Óµ{=òtº¯fÝ_¸aÚon›Ù=nÛõîºîÖ¿íÚ4ý–ëƒ.í×]: ¯¹\7úٵרÓõµñ%×O¦®`vÞÌÏag§€…¼Ùôãz¹9 ±CCË…”Áày”§K}4z—Ó~÷aôø%3ïø*uoú¨Ø×½Kô»m4èòª4¼êµÃ¨Ó³Þø²ç“‹­¦<N›÷øÉì¬Ç¯æ§<Ìðµló«ãØ1¬u
-ð½ýX¸¿.‚P\G¢‘H 41=w¢üêN½²„vcY$ÑϺºDÁ¾­Ñ_mر¸Ôèœ_¹É¿­¦§|kÍOú6X´û²lói·:îsÁºÕç–u‹O¿Í!ßN³/pöû‚m>§Ü;çÞP‘,ôIÂF/£ PŸÄÝ“Ð-‰ µ;j1­3"”¸Ã:’¤wjY†ÁÉà<㶠U¦Ç—®3k]RaÑXmu8 Îú`À~ÎÿVÛýþgíý»íÙï xk¿;`bÆ®@°ÿjç°÷ƹ7‚ÞGhPªþ–²ÐýXCt3Ž‡ºbçR/IÑÎF?®ˆÒm‹Œ×o —¶„)M…ªÌšCŠ-š–o°Ú·¬Òfopm}Pƒ]]Ðá;ƒNrkƒ~âíú·-è¯*xŒ·5x[—wË@à; ¡Mô4Vý;A Ý“è¶Lu%Ù¡ IÎÔÓ2Z{| Ñ* Ó=ó­~st’QãŠt“†¨óúµU]x©Íΰïmw„UÛo ÝÍ­
-iæm ião¹ä°)ä‡ïCÊC?ñË€¿1 fNKhø(h?/½2*êI¡¡[©tÔÊF6è´\DiKuÕlIò#šeËYñý=±ñFuR¹imŒÒbGtUµd5gëŠ v›£*gTDÖòÊ#ù"Ž ÖGœ'×FÜ"K#Ÿ“k"?J¢Àáÿø“A0M¬@èiB÷SpîUh îtº’®‹ÎdX¢¶L’Ò’>_³YáÍØ—ÄÚ©W›(5ÜždZ—nQ›cU!-ä”[j¿!¦‚».zûÌ5Ñ{Š%-d‘äŒp•ä_ŽjI¿£:ú½Päw1 À§Ãd_ŸØáh„áÌwWеL*º¢ÔDç•:臕fèèJ>¥Y)ÖhÈô¢×¥êÔ(ÂôªSc +“e&Iró2™Òj}‚ŠS_l_WÆ-Š­âÆÖ TÒCÂ|é)Ç<i·(WúD”;☠dn¦‚P„¤=Äwp3¡«+)¨#‡ŠNåèXž1:”Ç£4æÎÑØíNß¡ôgVe†°7¥¯0(WÄ™¬—§˜—¦fZ'çqŠ’ŠìՉ빉[øy²:AvB³P™pR”•Ð%ÊLx$Ê” ;fʾ3e@b‚É ¡gx¿ÉqÞR"tgÏ3ÔV@G‡U†¨é;{T¯r¦Öä»iUåú17eO+SFN_—%5.ÉH4+JO³T§åØ(Ôv¹òµÜìÔÍü¬”Z2#e¿cZr»HžÜ9Kžüç,yÊ[‘<eB(OR‘‚ɾD!ôD†ç€sgWÎ|*œ7ÔUk¢…úhï*[´s•ˆZ­v¡mRùho,Xª»6/\¿8'ƨ0;ÁL¥”[æe)m²3UvYk¸é|Ez 5­Ñ19í„(Qqy–,íöF”˜6.LLaR“½Ã»ðW2žCBWòñàß®8{\MA Ål´«Äm+R7ϧ•-"Ö²V«CõÕ*‰Q~A¼iN^Š…27Ó:#'ßV‘]ÌM]Y>3I¹] Ü'ŒË:&ŠÍº(’fÝÃ^ãzL›dÜ/ñ.<Às¸–ý?¶ë=Ê|ø÷¹ ƸŽËLÌŒË3bf0F‘QœPI…’.Š“­])’ˆ)¤èB[(%]ä²Û•êìn‰v·­Dm¯¶vŽT[ÑUJ—ßù:ûê¼´¯óÇû5ó×|žßç÷{žy¾
-É%Ž!9ŸkųxÏá)-v€ùû¶bE8{⺮`u©¬,“ÀÒ=
-*¡ÌƒŽ/óãÅ–éÅ”„ f—L7ŽÚ=[¹+Î"|W‚hÊW+­Bw¦K'çÙÛý­¸’ ,:Áýˆº¹€í}ò€mD°õs—±ƒsë±ì¾×^RŒà(’shRÀ’X\)‚øƒwPCÅTŽffUò¢*'êEL;mV1ß$´b¡Ù„ýË-‚ö¥‰÷m´W¾Câ_^!S~\æ[~ uI}÷¼’ù–ŸÒÿ²ý¤q-v P…ëß»`G)@N9@ΡK
-³km ºN3ê<©ˆ:fjm0orm˜îÄÚüÚ¹‚ñ5ñ†5KŒÇÖ¤˜úUkÍ|ª·YxWï³ü¢ú‘WõE‘×ÑNѨª—âQ‡?ó<D¬†:‹{P‡û_ù_a~þ~€ŒC8âúå×8ÿá,~Ú
-n Ç7Ld¦±c¢uübu}øÞ É¯úõžõF#ë÷¨¯5v¯¿`¬©o7Öœ~aâvò½©Û "DfŸ/
-®=á@ fG|rÀïG<¯òaÄ5Spo‘€¦ÅÜ®k@}Ý\[À¥u¨Ú"AÙC9ÝXD9ÞXE9ÜÐÒò›E´ýÍC´Ý/gPm{ã1mÛöš±i%ìPå˜_„ù9˜Ÿz ±`Þw˜Ù!?
-¶£À¦Ód@úïptÍë®Å`u/Ä÷r)Qw ey¿†²¸ž2ð;eÖý”2ëøÌNÌÏÃü4Ì_r`þyÌ¿|À·`Ä
-B_ ¾ |ozrü3Ä^AÎá¬k«¢ˆDC+_ŠˆC(b9&æ±41[Ba
-ÊBùh;Úö¢JT…¾F§Ñ·èt“þ 즄Ïé~á
-`ÉTÀRi€¥°àyòFxºsî³.îq|þãr·‡Ûµ„÷¶ÕyÜßÖêyo«Õë­}Þw8Ã>·9û|nrŽol™ö½¾å„ïÊ–Òµ-ˤeÎ=òUΧ䋜o)‹Ìƒœç`ó¯À¶£ì"Ê&¡#Þ3©ð<#¾äÆ“´ÍðQZ2î½Ô\ü½äbÂ$•ÇÍD½×õÞ+ mÄk ݾKñvÒÕxùrü~¿Kq”·âf(âÎø/Ä]˜»p6âŸQÇÿ4ÿñ3ë` (;Å eû
-Wã})­†¸˜j&-¤ZÈó)=”³Éýþg’GN% <‘4IK:4›t!x&i5äXÒé䧡G“HÆÂ\È‘5)XèKX’7`\wÀrÜáß>xÃ> ÞçÁ]á¸.äà–©øKü<÷ ¹Å^ó9e>gx:ÒÉ,£ßñÌfÿÙŒŽ€™ õMî`Ð×ü‡tWèDúL˜+ýípúí`úýðé_„ïãþ+ÂÉÅÂÇÑ5ÿ‡¥ |¾ ¾Uˆƒ‡"wxPä w‹`EÄ„+â͸EQ"þ\!ÏýdA¡×œ°”8#P“§ó ”É܆€‰œVê‘kð¡ì=!ã¼½aûyã4gÖTøhÖ©È‘¬ËtGÖ]úïú ï;z6¶&Òþ
-,}²sQçDŸö‡%¨óIÝà¶ÔV%~pYJ‡ÙFÜii~NÂu?V,ðš•'Š”äÃZÿñüÚÀýBsS` ô„9øƒ´¡¼}yt{Þ\T_Þbôî¼›ŒÞ¼¿1zøßDwó±5Q]‚ŸÑ_Zûµ|#x„~s÷Kn)ñ°¢$ÀU9 ”48UöÌ*·â§å©„‰Ò\¯CÒ"â’R²³Xí?"֋ꃋZBû ­´¾‚=¶‚zOþᨮüFgþyfGþ*Ë’ÿV{Á3f{ÁOŒ¶BlMôzà 4ƒe¨ë Îµ¢FO‡ å>pZ³`JýÞUžD/ãy:ùĽr y¨´Ì¿_ª Ü#© ¶•˜C{Š-4k±-¢C<L·ˆÆ£ÛDÓÌÑYV“èÛ,úmÿù‘e*Ƙc½Ÿ×A ð@på/U¢Þ«8[é ³Z*LéØàÒnÆW&Æ*2<j¾Ï€JLê+“SzÝrCpgiC¨¥´•Ö&ëŽl‘D™¥û’IV½ä4»N²c”¼S+}Šü‡U+Ř¿`¼ô‚ö¢íÀ*Ê¿¬G½×
-¥S­
-´¨tA­*chsY3ͤìŒlPØ£ŒŠ1Fü(Ë ?£—_‰­’ßÕÉ¿Š©RüÀ®R`,„¹Þ?ó>FûàêË(±õ^Ô½fjpp´–Q0f|7\»ÍÍ^âa3d{wUåûîÒ•øµi•M Õ¤© ©¯0ÑŒê]‘Õå}Qúò¦NåbWªŽÇT¨.ŪU÷¿ÇV¨^°+Ê1Â\ïË"€”hÐü¯ üù:Ôùеg=Õ“ÁÙŽÆ×pö¾·>ÉÝjÌô²Ô
-ˆ-Õb²Ù ÷oЫ©Æ*CHµ®¦×µGhµ¶(M¥ƒ¡®<ÌRifc”š‹±
-Í;Èç±JÍ¿ÙJ ÆZS¦Á˜/}ŽÎÃtÝZE3¸ˆrÏ î7ƒ®€.ôÜg&£) ú›7€­é÷x«9Ðnâz67äMõEäº:™±œª¯­
-ÖÕÔ…ijZ#Ê«»ée†!†BUªŸ‰‘êc%úÛÈgèý{¶´
-cɪ0æzO¤
-m1«hfZ<‘f À4K8›j‰eÉ–)B’e†8Þ2WkI—N*Zd]´\Y´N^´EZøzBáA»àÂjrÉ.xÿ» }Ï5AùÜ~¸JÚ(?wjÅ6å
-à]ÊžQKù @Ä Ê?›ÜÏI¡oUÂ鲎Wôp¼ê‡«ã »6DC{=ö7fÁþf:47—BsëÏPßÞ uÛ~¨Úª`ÛvÊÛ?ÁöÖ lo>månV•
-¤ §äÜkSþRÚsïÓš¿Esž@Ùa”=î2`¸8·öí”ÝȨlñ3€q}ÛðJCè÷Hb >$˜L$)„^Šœ>Š8ͧÍÇéÐqZt^ñwKÆÐ-¨×uô·÷×D‚«'3®šÅ¸2qŲ’¬'›Év’A²—ç‘BpùaRNªH^É›ñB~ CòôËðXÎñHÁñPÁÙCåÿãnžànðÑDOµŒð£ZÂÀu TÏ Æ5ï2®^H–“ÉF²•ì"™$—°Wêì…º„=WÅ3užª›Ð¯¾ŽGên<P÷£WÍYgÝÿ¥á¬kîáîáJÓHÜ܉ÍËš—ªgãŽswøqÝ2²Š½Òm`/t_°gÚílH›Ážj³Ø€6õk‹Øm1{¬­`µ5ìßÚFö“ö
-ëÒu²uý¬Ý³»\¸ãø?mÃp/ð±#ÀÇ8{QciMƘ¨&3Õ“ >j6{é’ΆF.fƒ#W°'úµì‘~#{¨ßÊúô;ÙýÖ«Ïe=úÖ¥?Ä:õå¬CœÝןd÷ô­ìöÈNvÃ¥_¸âÂ…VW.ºD.ºrñ…a¸åûêh+iÁýœ ­‰ß8ú†—ÞñôJc=ßa} X¯aë2¬b†õì¾ak7lcwÝ¿fwܳØm÷<vËÝÂnJÙ5C•pÅðƒÐj¸(œ÷èZ<žˆN{rñ)O.iôäÒ¼ûQ¶¿¸ICÛÙмyá™É„GþQèõ›‚ß9ìžo:kóYÌnú,g׌kØeã§B«ñKá¢q‡pÞ¸[ôOcŽè¬±@Ôl<,:m¬5ëÄÆfñIŸ»â߇Ò:ßW²_nsügÇ|¹üÜDùAJðPx8Õሡ°Ñè 1¢#8mAq¸”†ÖÀwعÀB‹i©pÆ´RÔdZ+j øL|2`‹øDÀNÉ÷{$ {¥õEÒÚ€RiMÀ1Ùñ€FY•é¦ì¨éÜjz®(3qeÉÏŽ Ãm)_
-%§#m‹—ÑôE9¢= ×#ÆãBdZ"§°S³Ù‰ˆùBCøBQ}Øïĵa”T‡®“ Ý(û.t«ìÛ]6•!YòŠ|yyÈ!EiH¥²$¤AYrIy0´Û¶(ô©ª0”NPWï{“›ðÅIÐ'ÇýIj\™è„³1ÞhŒ Å÷± ¬66M8ó¶èÛIˆ+'.––Gÿ^Vý'›’¨õòâ¨MŠCæmʃæ [‹9WUh.RD–©÷™kìòÌ-v{Í?j²£úí³¢¸ý7$ó <’Q>ЗH=_2p5Y‚‹Ir4'jqb²j“Q•<‰ULž*”%Í'¾'9”°@f‰ÿȦ0n…¢ n2?öÛ¼Ø/T{cvØåÄdj²bòí3cŠµ{bª´1§t¹£ÛûØaG,wøŠlãºáx0”
-•K»<×­E¦÷hJ3y5¤YxS}k¥]|‹tDP%VHçEféu±Iúc‰Qú™Ø˜úo‘1•}¼ä‹ºêÁc%õ€¼ïª–ÞÙ9ôÎUs0“í…cšÓlÆfÓ§çveÅÙ·©¤ŽÍ™.J[}FG]z©—%½’W¥¨÷­PtðÍò!A™|BT*ŸË—$ùã
-ŸìÂ~VA— ³`T”¡;!Vè.J亻rÝ'Ä?$
-Kß±¢åü–îá!Ýýu=Í"åŸ!ÿ<J йÃd&³7–¯€¥|#*Ê·1ÆòPn‰9Ú^oJt,0ÉœóŒ*WmY®Gv™Þ+«ÔÌS–ôK/i÷—¦O‹¥† ’ÃûÄÇÄßèóER=ûáK>¤{¸Ks°HÏ_[p¢«"çª$ï¬bP[í‰*‹æšõ(« b –ÝœBË~»üêxmuªSv•Ò%«2ÇMYYè™^aô–•×ø¤–·òS̃‚$ó¤0ÁôŽ(Þôž8Îôq¼éKQ¼ñ[Q‚‘&”½â'à]êÁ%3í£…¼³¬Z‰Z:WtCYƒ?Š֠Ⱥ…ÑYwr´ÖpnvCŒ}V}²£²^á¬8¨v•Ìw—Ö•z&×Vók›}ãjúù15þ,ó‚(Ë-a”åW¨ê/ÑUÏ V]Éú¿äÍÿuºÿóTÿ©zò>+ÐC4å¤Å-Î(lõA~Û*hÛ7#»};£jåd´Eqm‰öim2Gi«Ê9©%×5¡Åà×\áy ÙêÕÔ볿é¨_xã,?¬ñ:_ã/øaÖÏùa ÿá‡Õ³ßãõ`ú>GùSÍ´ -ä]­ä=mä]]@^7š^/dõ‰‘Ù¿éýAõ‡0©ýœäþXnbŸÔ>¾/Ã!¦WãÝ[èÙcv ï©÷Ø×Ýå¹·û°÷îî³¼î%Þ®îŸòB:ŸòB:žù„´³ß㦉f‘z~š²tÐ.tVÊ.ïòÉ=ŠQ7¤ñ![äñ@$ŒoGÜx(3͉OäFŽÉì"ƲìÃÆòöŽ–9í­uÞ5ÚáºctÔmûÈi÷m#‹Á#?r>ô÷àáo<‚YÏå,Ð ÌQý“”}¨hï§Pv e猲c@¤b¦¼=%FÔô:ìŸÞŠˆ™]› gBgb˜=3)œ™ ÎΙîÛÓ»mÓUö?˜nqxkzØqëô §7§/œÞœú³Sàñ¯'X—Àc¯¸@
-v’ê§ì>ʵ’šº sH:D’&îuÃî9_ìš[‰s°c>oχ`Û|‚mq²¥2oÙTÌ›Žh3q6٬ܶ~î¶I»õ¶‹vël÷íÖÍ?á®ýÊní9Ö~íÙWœ¥ücÀÐíÂÀ2 N
-ˆï®ƒèîïí€à^üïÅ‚_¿û9ð}PŸVð Áûá)x=¼χÂëÁ_áuï¼î²ß1>F»H}o ÚM³´€ô+@Ü°ïå¿ lzxý> þ×õÕ¹Åüﶰlˆe£ DË‚((`¤W%ÑÄØ 1`A,H @DņŠ(Š< âàC‰-ŠO1D!âŒODQDÄ‚ŠÑïgã0¿¹³;Ë=ç;{÷ûÎ9ÍÁ¢F Õ9ÌêÔPÔY“Þ0­s C ¯Y½Ò¿#ÉDHþN„øb:Dó ¼X
-AC¸†FrŸ<û(g3Jßù,Zû”=ÀXŠ=æOZÕÿ8àðÐû `] hêÅ%Ò+"ˆ6ª!¸j°€&;àÚ@à:5¨Í£©1Š
-}k7¡Ýj æíöGK(þœ]À4ªû8Zw }Äë0ø`Wè.
-:U3ñP•„ªÅ¸§Ê@»ê7ÜQå¢M•‡Ven)wà¦rš•{q]yMÊüWÕŒõCÔkºp^øZsÆ{¯æ=fK±m•`½‰­éf£ë9/ºÇcë
-·®Üõ[¾Ìu_êò£ Äe–p§K²°Ø**2,m7¬Ö›l1l5)0ü.É7TJ6ª¥ W¥ë\:dk\^ËV»2YîgØ`ÚÚ(vËšùFµ#9œ.Æ % ï‰}#úcÏw”ðåJFsÅÃcøíž…žS…[†Å‹6›-Î÷X Þè‘f’ç‘%Yç±ZºÖ=_¶Ú½X¾Êýßò•U¦9 ¦¿ »§ÈÖ¥ÈÆþÏtÙ'˜+m¿¿‘¶÷Z#PMŽúñ88Ê>Ö(óÕc§ŸE¾ÞÜVß
-™$Y'MN”'-PÌ J7›˜£JÜ ž¸Ã<>°ÂâÇÀj‹¸ fòÄ<.ˆiÞSÐæGßCp"
-80(§Ù¯˜®[èu^”¹ÑÖȉé‡Ì˜AȈñäÒ¢}ùÅQ‚…‘¢äˆXqRÄ÷’9áÓ¤³Â–'„ÍSÌ ûE–­Š ]¯™ºÝ|jè‹)¡Ç»Mk"-&‡1s¢ùT‹?pžjPEq÷§Ðì·®ÇÒ¼3NŽå±Z,û¦Ò¿qBj¬;·(vŸ<.@0wl˜pvLŒ8!f‚ÉÌè)Òøèxy\ÔÅô¨åÔ¨Lõäȵš" ÿÇuyGEu¦qøwgfd`€™ÁÅ.誈Ši*e60ƒ U‚RUZbì2ÇXYKˆ(nŒQ@M\)GOÔ-–h²®kÁ²nŒQ¹û“ã9ùã9÷Þ9s¿ç{ßû}÷¾¯ÖÙìbˆ<Õ31òŸ=uO\u]ÚD¨1èDõ[~:s[<ס='ËyÜÄëµú¨ÖkPž0e £P”0I(ÐûHòôÒœøy2sœÎ&3.Nž›Ô#56CiŠÉuXSìhŒ©vNŒÞ ÖGïÔÆGp‰>Ñ36úoäÏ_kã¢E Q¿åŸÃYÆ|Œñ7³ìjdÿYÏc¯?4Øb¥Ñ¥IýQ˜4ùI„\ãtÁlœ-É4„ÈÒ 6)‰1òäDƒ")!ÍÎcŸ /TÅë+bõëÔÑñÛµ ã›\¢âÛzêâ/“Nž¿ÒFÅ‹¢~Ë>‡Ó\Ÿ3þ¦T`'Ù”¬âuy²%&G,5õE^ŠrRÆ!+ešaò—¤š‚¤ÉÉa6IÉѶ†E
-ý¢»¸$³}LÒRÕ¤r'±Vaܦ 7îw 3wY`¼ä²ÀðÐ%ÌðRf5áQý–‹|'€Ã&`_°Ô¥³ïå<JÒ€‚täfô‚9c(23=–9Y0eøJ’2æJ óeúô(Û¸ôxyLZr…i‹•‘©ùá©+¤¬už—bQ‡¦ìÓ†¤|¡ NùNlº¯ 1½Ô„˜Duhò;¾æZleÌ鵚¹²Ø÷.f½ŸI?9YJ,6k‘–=¦œQX”ã%rfúœÙ’¸ìitv„MTv¬m¤Ù¨7§ÛÍÏʵÍ*U/^å¸x«óÜÌ=ê€Ì£š9™ß{š€Œ_Õ¢: ]t~ËY¹‰î]°ï%Õ9@!ÉáyFž¦%ÎHÊïÄwè Æ#v©·]à/ÑI#
-ÂdaùÑ6óóå¡KRAKrìææÛÏÉûP5+w³£®ÕÉ/÷ˆ³on‡³ßwÉ/Î~9¢“ö;N1‡óÞ\ö,¿k–
-]c‹À'ÔöÅœÚa˜Uç™u“áW矺9Âûuó„éu:É´ºÉ”ºTé¤Ú\ÙÄÚå6ãkkl=k·ËÇÖ4Ë=j¾"·äkž)<V‹
-UÝôxÃAæÜJïÖ
-îGRRÉÐLwL {¯õÀìM€ïV{ÌتÅôú˜VOL±LÅ$‹¼,˜h Æ[bOË"ÁÃb–Œ¶IFYVIGZ,Ò–&™»å¤Ì­þ†ÔmËS™Ûæ×6n›ÄßÙÇØ·Ó»žmX½ùkØûÕ2€ˆ-À\¶ª>;€I 2ŒÛ­‚çî^Û8cGbtã8Œ²NÅŸ¬þi ÂkÜ­z ·¦a˜5_b­[7 ÿ¼W`=.¸Z¯
-®׆—×]âï4T[è]MoÉ:À¼‘ë`+×ÀÇ@È.Àß
-LÞ Œýp? ÇÐf' iî…A̓0ðà 8è ׃SÑÿú
-Æ{‡tè{È€>-fôn)EÏ–:¸´4@Ûrš–o¡9tšæÐ…·XÖr0ߌy ÛÑTÆ»˜Oï¬&`ÛRÏÀí3`àQ ÷19´­*hZ] nu…sÛp2Nm“àÔî U{0‰‚C{2ìOäAy¢
-víõP´7AÞþ%¹ÉóÇP´ýJ^u³qW×ó}@w&cNÜ„7sÞGè§×í80 èu
-p>-ÀþœŠó*ÈÏka{¾lÎ…ìÂ(H/xArÁ‡A$üupÓupÃ}ÍDwPÐÁA;Îñú6yDžt³Š±3çæ=€ñSîþ-€ÞiôŽ¥w8½ýO.¼Õ±°û]’°è°#ŽÀ÷Zàr_àÊ`àêHD€¼)PY^ãKø:_À×KôõFà»ÁÁnÜ ·»)kàûp°ˆ9×}Î5ØÊøOô= ¼G¯æ;Àá ¿ÿ„·ã¦ø¡pKŦ@ üØ‹…©+pÇ ¸ëÉBy:ð€óxÀy<äK°“¾“Iïd²;ÿB¾$gºÉcîM|Þ ¿
-íO4~‘¥à%—ï¸<¼àJðLR§’j|%©ÅcI=r øׂÜ&|ÉíÀ\þÎÄ]î8îp½¸%½‰²'¸.ÿW.+\òÒçE¦‚0TI¹ðÄ
-8Kœ!N˜×>ÞC”ÇðøÙ¾<O}'ãá iøÇ dÜ”Ž[ƒ¸á[„k¾å¸â;—ü¡Ï¯Ÿø­ÆE¿f\¼ ½ƒwâüàNœrg†œÅ©!×pò/Ñ3ô¿Ì94L`º½ô"Œ"}*/¿–â§@%žSüßÂçþãpkØû¸6\‹Kø8†ÞNœQ‚³³p: 
-§jp2`9N¬Å±€õè ØÂÙÎy€éy’9ØÇt>`:G}ËvŒúƒm›Þ(/»½cH?ˆ®5•¸'ã©ôIp?P;¾¸2z4.Ž™„óc§á´: 'Õi8¦¶ã¨ÚÃêèVW0Õó™.õbf¿z³WÝÈtª[Ùõ¶=h/ÛÔÃî
-ºÀî ºÇn{ç¹h˸_E›Æ â¼´zy¥ÿ’ÊÉ“ÉTb5À­É ®OàÐ7®?ÎO‚ßEOH…hq`âtì ÉDgˆƒé)`ÚCʘÝ!³Ù]ÁÕìŽàZv{ð*vkp³hsðѦàÅ­!‡ÄCΉׇÜ7OüZÒ4ñgIÃ{ÂÿYûÂ*w¤}? ¸Aåµ/‚zýPg&óè™2ÝSÕØ:¡Qh MÂÎP3³}ªÙ:5Ù<µˆý@SÎnÔTŠ6hŠZ4uâušq“¦UÒ Ù%Y£éâVkNq+5W¥õSŸH—OýQZ*H—yYêå‡ITꩤމ&ý8šùbiÞ¡'çH¸ûÃ}Ñ1
-»"'b{d86GjÑi`6D¤3-vv]„‹m /­ Ÿ%^^%^¶DR¶’[ÖÂ- Û&­ Û+[v\^Þ'_þH¾ â{BWG²7ù&”ž3Ò¿|œœ º)Þ-F{ô
-[–jfKS­¢âÔ\q¡©Ë7•K]¦*™Ó´Ì'×Ô¤È1nåíÆ}ª,Ó)âF?›é?ôý•Ï2 J/ŠWü<¿h¦³Hú]ÙÔçSÛ³žâ5iÔ禋P“ÞÕþ˜›1³3߃'# e1LIF"[”nd Ò3Dîô±Ó’/ɵ”Is,sevK­O–¥AaMÛÂg¦uªÒ-õK·\'žQü ŸnøŒ4AùšÛ´½´îÒï̶Ø&ŠW‹)—ù6s²†`VÖÛ˜™ŒÒ¬PeE1ùY ŒËf`ól‘Ö-¶Û\’l[)g³Î‘eZû¤[×(Ò¬›xsæUªõ„Êd½ÚÏdý·Ê”ù3Ÿš)¼BùšÏÈó³¤uØ´çÑÌ™KP\Kí×|ÊgvŽå9~(uŒD‘c<
-r5påF2y-ãp¤°v‡Y”å°‰­9y’ŒœbÎ’S!3ç,’›ì«F{«Ò`ÿ×Û©Rì—‰§*½ý'^Ÿ-(_aðr…<?Eë>袙“h!êÔkS.s(§™N9Š]Qà—;yîIÈq‡#ÛËØÜIl¦ÛĦ»3Ein‡8ÕU(1º<Rƒ«Z–â\á“ìÜ Ht¶)uΣ|‚óñ¯ËûQ©Ë”º\A‘èåòü8éí/ ûH4Kóiæs“>}‹
-$pöGn‘?ìÅcUkÉûÈ(‰b,% Œ¹ÄÀšJ,¢éÅv±¾Ø-I..㋪¤ Euòø¢Ÿ¸ÂÝŠØÂ#ʘÂO‰Çʘ‚—ÊØA›ÿ'“GHo­ÅtˆEÄ,¢þ9g0°—ñ°ÎŒŒò@X<ãaöh`òDÂèÑ2O
-“â1³I›HçqŠãËK%qå•\LùRiÔÿÈ.ó°(¯+ÿ¾Ù„afØÔÔaQA¢â׺<ØTµ5Ú¨E£A¶ ¢ÀŒEE†qA&.TD0j]S4‰VmšX×Zc4DMòõ'á±>éï3ÌÂ}ï9÷ÞóÝ“Tà84ɬŒOÚOZ”qIÿPÆ/yªŒ_,*ã‰Ê·º8Âì¥o{PÄë÷z’NóýÜØ÷-gß‘¢ÄÔn˜’Ú“Òô˜ñé1—>cÓÇ £Ó§#Ó% iïJ‡¥-”¾•–,‹KÍRĦæw‹I­pˆ^±—4;D­¸éòÄ!:ùg‡èåâk˜{ëRž‡eÜ‹$“$Ó»0˜•
-Lg«6)CŽ·×8cl¦7FgaTV?ŒÈ„„ìx Ï…¡Ù„øìéB\ö,IlÖ|ÉଥҨ¬Õ²Ye‘YÛ䙵ŠðÌ&rM¾æ±"<ã'"*ÂWýB[ +X—IYIoRðºÙ¢M^ËÞs=£ÂÐ\wÄçõD\žCŒáˆ5Æ`ã0DÇ"Ê83…ƹB„q±fL—ô7æJú·HCóvKCòŽviHÎ#iȆe!ëÅ×Ô¦°.e°.¯²I
-ÿ^˜ ̦{êö~F`8[Ö˜B99c@±"‹uˆ(AxI$ %±è_2ýJÞF_ÓT„šf!Ø´
-º»PrQÐ?
-_H
-Ä×ì\ la –›dð5i÷!݉tOÜÌø‹ØR r+ZáˆàJWô©ìŽÞ•èeE9æXèÌ 0‡¿eü,sÐò¾–Õð±äÃÛb—å ´–3КïB[Ñm¹(xuQù!ëbÏ#IÉåYØÄ}X
-0^-½z»½ò~I8m|E¾&ߦwŽÍœ<P]€GžÀcæä;=ð=›–Îã>Ÿ³>çáÁ½ñ‚‰ɤ¿¬ëDtò…Ø­;D¼¢éM"ÉP2ž$’ydIÆOÈÀK¬Ã äáä£Åøex†J<E¾ƒߢÿÁ'x„“xˆËxÀÉÞã7wñ3ÿQã Qé Qðà;þ@b CÈ2ÞßÓ¹€¾¥t¥q´L<Áz<†‘®ºLtm£ËB×.Ž»‡Öz¦ê8SvŽ©û'nñ×79û›ñFïBtq‡¨v…¨p(á\àGBHI {ãû-c›G×"º–ã>VÒ“…;Ø€ÛØDW!-¥tUÐUÅñ­¸†Ü2Gq§ñ?¹Œãžã"G½@οèêÌ\¨!ªˆ“Û/ë"éÅo™ã8Æ9ŽÎiôͦë=z–ГÂQ3pk¹Mrpq«ÓUF™ŽjF¿g¹§ÑŠSÜÄmå$3Ù‘O"š%ÿCôpb.Ä‘h8®‰ÒÏ!x ‹Â×ÒÜ’NÂuY"®Êæào²…¸$[Š òTœ“¯ÆYù:œ‘çáSùfœ’›Ð*/G‹|š6üEÑ€&E Ž:´ãˆã=Ø~@ƒJDý¯½dœ j¥|å<\5x¢ñÄ]•7•\u‚Kª18§ú ΨÞÁ)õ<´ªßG‹zšÕi8®^ƒ&͇8¦Ùˆ#š"Ö”Á®ÙŽFõÎõ8è|\Ú±Ïõln/`uQã.b÷ˆ>ôûòØ<Þ·=¸Í||©ñÂE×>8í6­îÃpÜc<ŽyLÇaÏÙ°{þ ž‹Pï¹ =Óq@›‰ýÚ Ø§ý{´&ؼ*`õªÆnï:T{7a§÷ETùÜŧ•¾¢PÑEy"rËÊ]–¸½Y‚t.ú:ଗ+Z|p¬GØ{Æâß(ÔùMÆ^¿DØüÞ…Õÿ=Ôø/Fµ2vù¯ÄÿlTùçb{@,e¨ ¨ByÀa›î°P¦;+”~#˜‚ž ÅA¢PD
-ß@ dü!ôXjYî?e©=¡—¢)PÆ ÔõÆž>QÓgvéÇ¡J?ÛõïÀ¬Ÿ‹
-ý”ë—`«>eú ¡T¿NøX¿I(Ñ›„¢`³Pl67HòCNI6…Ü’CŸHrCEIίx̲\fimc™?Æ×Æpöž}aëçêþ¨2„ÁlˆE¹a$ÊÂ&¢4lL†Y(6ÌC¡áOBa©oø/ÓåÕ}†ñç\öì)A55ŠJ ²Â.à®{]8ÀËîÂ.Ë.·]n r[‘ÛŠ(—­Â%Œ¦*X“èèÔ±mSÓ¦i3¶Î´vò!m¦Ó´“t2M3Mš¶il¶/2füð›ÿ9çËó¼ïùßž>f&m˜™J›`O¥fO¦-±'ö_æŽï¿É…÷¿É¥¿Ë¤ ©¿"¢Ü±Çø˜jÿ}6p/¸{ˆòVp¼\ÉàqéÀzœÏÜŠ5)˜Óhð¼FÓ+" ÓšjLjÜÌIMs"³•ÏìfÙ!v43ÌgNsC™óÜ æ"Ò\ç4wýY¿Sôe}¬èÉ~@DùÇùPCÇéÿÔ
-§xJpˆsÊjqYeoªªÄŸÇT‰ïŸÓsT¹ŠMŒ
-«Ü§9ð:éÞ¨¢ÿ@WYºöL’—1êÇQòÒ[‹`Ù´KÛRÐ,e QʃO2¢^*bê¤rÆ%ÙÙZ©ŽuJÍœC
-òÕÒQE•4!ÈÒ¬²Bº¨*—¾#Io"þIïQeyÙC„UîQßïîÕjàœîùäåy9F¾zÉK°"­• h‘·¢Q~^Y |nù0je ã”ˇlcªek“9Yîà+äE¹<.”Ég•¥ò•(ß ÞŒ)–ÿ#ÊŸ©Äʨr•’ʨ°ÊϨÖ×HûŠXtÐ<´SÈO?ù’Ÿ€M@Su<¼Õ›á±ï‚Ëž†G6ª°9JÙ!3•Ž¶ÜácËìm\©½íaE‘ý´`µ¿¤´Ø¯«
-í?&Þ#>UVG•–5„U~BµÞ$íåZÊœ5”·ˆ!òÓM^Zé{£“ƒ§&®ÚMpÖî€Ýµ6W&dw*Ý&”»‹É]Á”º¬è®g‹]Îêêá ]£
-³+"˜\ç”F×5¥ÁuWep½«2ÔþCi¨ýJi¬‰
-øÕzÃE{Rp†âÀqb€ÞÛÉS#uôÝé‰EuýS¨ònC…wÊ}j”ù¢Ôw¢Ï‚b_cõÙ˜BŸ›5ûšY“¯‹3ø†x½wZ¡ó. ‡¼¯
-ùÞוyÞw”ùõŸùõÿy¢_s‡j½J`‰˜&FˆÂOÔy]Ë妔7¯Giófˆ-»PìO…ÕŸ‹ÿ
-f˜"Œ™1j½¿‘=äïdóüƒ\®’?è_Tä´¼¬Ènù"Ûÿ[ÿ®Èn~ ÈiŠ~Í-ªûJ#0GLÞQ;‰ºŠ;Z€Š
-dÄ!st#2ƶãÀؤ¥c8ia=RÃ|+,a_؉”pö„ƒH0»Ã§™]á ÌÎðM&)|IûIù7“4e“†Ö¸LZ³Äq¢h릶´Åc€qÈ=dL
-П²fIH^¶6]àp)ñË D"ž\Þ¸•½„ßXÑ"vÅŒu+žX©EÌJ
-à}œ£óæ@»›R;àNlÌØ_¦ËlL:X;¸ù:8Ñ ²ƒu'íäF7yÛ€´Ü‹û€o
-¹*_õ¾6®™ßX°A¶æE—•Ûl–ïÐÇ÷<˜ï²ðßÍâŠsÒÉDwî' ®óL7Œ;á
-<'b¡g$ò<c뙈ÏTažW–í•'dy•™^kÄ ¯Jq¶÷q–÷)Íûœ”:úŽ”2ú‘Åw¹N½³Ôo ö
-Ñ¡IBTh†0=4WŒ -‘¦†®•¦„mSL
-«'-Šˆ°kzaøù–ÈR“ÈYÎA#[Œ]dóû¼ëÐK½ä3Ùô’f€´ ¦Hž0‰$h\§ñF¬FhM0¢4ᘮ™ŒiáÑBdx¢0%|–09<GŒ/’>_#Müë2‹ºÌãøç73Š¢(à‘Bj‚+Š7&‚‚Š
-"Ç
-Å0=}ÞíÉ6ÑOÖ¼@¥åuRʤîJÎÔ¸ü(%æÓXg‚Æ8“5Ú™©QN‡F:§ñÎYFœs¡i˜³Üë\oŠqî2u1G;Ï™£ó¿4ÍÿÞ<t’ÏÓHžÏ|íyÒZÆ€2X
-úkdA´F¸F(Þ•¨8Wº†»r뚬W¡íšo q•ƒ]U¦(×NÓ ×!8cTpÓ4hÚwà3EM}È~Zÿ-謄%P3 2þOE¿€¹‹Q)a†¿FÌ R\aˆ††)¶¨bŠ¢4Ô=LÑî q×ãn›»'i{ººKŒþî§~î5F_÷v£û€é~ψ,ºnDþÓÔg¦ïj 7 UOÁl¾€ÃÅÌ3CW(š% ›ÛLÑÅmôxI .骨y=5p^ ˜7Dý=ñêçIT_OºúxìŠôLSoÏEx¼êéY¥žj#ܳNáó®á% Fx±ÏŸûø¸æ Îð@!ß'£=¡ˆ¹o¶4šñh¸‡ÙkÔ‘¿ú”)²´“z/ŽÔsñ@ýÊ£ÞQ
-÷&+ÌkSwo¾óªÛ’…겤Rz_P¨wŸB¼'á²BJï+tÑO
-}Êg4² ­g¡怋Ñp"Úh'2Å3®YŒþR)¢Ì¬°gôXy°º•‡¨Ky˜­ˆThÅ …TĪsÅhuªLÓ#•¹êXéR‡Êyj_Y¦àÊõ
-ªÜ£ Š7Xñ±‚ž¹« å¼œi¢Ì§ª¹Ôâi>ïEà,‘²Ñö¨%ÒÐeÒ
-¬Š‚áj[5Vm8ìªòպʭVU‹å_µZ-Öm—ߺCò[[7ä·¦A-Vÿôsèy¡\ÄÛ¾HJÇç1eRl¥4Ý^kЯBƒÔn£Ôfs µªn£–ÕíÔ¢:D~Õaj^)Kõ`™«ãeÚÊổÃf+]M"«Ë·ìƒ“4(…Ûð-ÒwZ^ÊÝ…Ä;ÿiöâr) Ÿãž“¢ÐínwFÔÎ[¥àèï’Zîi&sMk.:ƒšâ½B8ô‘jiÊj¹pk¹xjÙäµu-‹×âHíN~sÎñÜp¾ÑRb]ŒÏÓ05g9à§#ž§Ñ܆þ‹èïA¿V
-xEò{M\0pÈ°ãvÆŽÃ4äGÂhˆ±ã á1.ÿ:û:6zI®Ã¹:bQG,Ž½Á ¸¥…Ïr/¬’òÖ±Ë>¨¦Ðí[#…½Œ>šA‡¤VG%ËëhŸ€·š8Ùœ¨Íh[ém†“ÓiÊhÊßmlÒ‰GccPÏ¡_ONêIt=‰­ß.ýœâ󸤹ë9_ ñ9é%Îtz²ÎuR šþ¤Ðà½gàl€óf1Ñ3¨] &;Jw•>é%}Š—iB®PWf2ÄPäWIðU„®Ì«8rõ´f`ÖDböª4ò05€nt;¡xZjñ~“ÞyÀlý þ—€ÒÒ§p>³HŸûK×o“[ÔÈékòrfä>Ï7vßü’Ý@a5쇃L½í ¨‰Ð úB,$B&äé'fÝš¥ïåÑ¿´Hßêi5¨\÷µB÷˜u¿Öz}¥Mº£íº­=ºÅ¼û¥êtCïê:Æ~ή±Â5Vûìÿð)Ú@
-ð£b4èoØñ‰–‘š
-R´
-*Öߨ´ÔíÑ9½¦z×û¼¾Ë“ïµÓxö6*§àí&|ææ¼ÐøÞšXáoýC½ñ1ßHw*>M@'_\h¸Ñ(Ac«{)ÓezO•è<‡ÆzÖ߬“ÄâM½¬7tT¯£~ kâÍaý
-~ÁºŸ³î‚(ëzBðÔÇEtäIÛä2µöStÌ,R–CÛ‚5˜ÎǤ 9ØUP„Q¡ #ÂJ «±ChÁ °ýB7ú„>„¶÷ ¸}=ÛÇÑ]8ƒÎÂc,PxuÝb¾¢Ì'úký…µ‰¾&Ñÿùˆj~GIÿ¿‚F²(£}‹²LÓs™1ì.ŠÃ¨( Qvˆ 0 .EŸ¸!q‚bzŠëÐ]ìBg±âNt÷ÁW2Š¶’)ÖZ²À¼¥çXKéMæ–¼C~Êš%Ÿ‘¯X“$º¢™|@5ï©—É)p¸œêS–=eÀå‹”®Ç d#ú$éJrÑ#¡K*C@Z¿Ô
- °WzPWÙ [å
-`5”À\­@mµ¦j#Œ5u¨©iBuc:ãNVeœfZãq¦1^áTïr*LÉ#N…ñKúåTÖ¬`o+&à™&£¤ŸîuÒóh¥<Í”«ÑƒzS<l¦-0›²`ªÍ‡±VŒêZ æ
-èÍèÌVTYœÐZÚ ±ô ÒajË~¦²,²rË%¦´Þá(¬? ¿ã(-I”)ÍQVNîZ¨/™#d’DH´S–fZèse5ÌÖ8m›QmË€ÞƇ®®Ú: 4u*TÖëPQ_ u½*»åö.(ìCÛ'™Ì¾ÀÊì˜Ô~›Iìï“OèóLZeÒº(+#¯ÙhÕ!sd7$]ÄC«A]m4š›ì Ç ¨jH„¦!•<¨  r£Ü©€Ò©Âi„ÜU™Ë ©Ë‰k
-ÒöX”ú6¢¸# âD(ò£Ð¯Àv¿B¿ ‚€ù/ò½È ì?0‹œÀ2²¯€x€mŸƒçÿ¼Ž¯Y¶/ºâýsdœêõ?q»éð
-¼e* {a˜Ü
-#åZØ~/cÑ`¹Å˹h²œŠfɱ¨L…52î–}Á'2|#ÃœïåÿLyV-J¡! ’‰wìdb€ö›éR,)r¦–'¢?WòXÀXb''‹³-&ð–ƒ%PKGÙ[̲³ô–­¥¿ZZF¨…%Y6– 5³Ì'áÕRévvÌ’+4Ä»ðxªB✓ÐM˜JÌÞÎ&øl.@ÝÀ…è—¢¿ýå’c…­l+eSÉ0º’w¥/qÁƪxø«hòU4–jŠ«:•¿q¢jŸÙû>ç¼€ÍÍi06“»@¼ÿ0›{€Ï]1½ºK%ï’‰5Õe•dX+µ¨aXo/m` ßàÆ£ËP¼;61”Ö2üÔòð×Ñèë†@Ì:X»vò¹ãp ¾ã{”•KO"Þ£ó¥˜br€Ï¯.–ÂË¥ *ôÑ4­—œqÁ~³d³%dÔ³Õ³|à$í$;‰GƒñØ=€‡g~IÞƒs{ˆEc¿ÿÄïÓpnk*>'Í“†•|þ]%5ˆ¹!èúðqw4ê¥V èîBÉB%}lÀN:èÈPÎBpØ$aIø˜¡øvg9Îãs‚Ë~‚DŸDè$Á<É'ø¢ =óâóëïQµÜÁ÷%_BfjD¿d{
-²¾ä4cÇþi3TÃÚûBl)Æ–žá¼
- 6oRŒ¹Q1ѧš ŠþkP´õÌVbÜÙ
-UPs ›Qlz4³>¶¤DÙ(9ÊI‰Q&1·S¼9DqæpÅš»jdt/ î«aÑ44zˆ†tÓà®cÓ-Mƒºåh`÷yн\ÿgºÌ£¢:Ï0þŒ+*"àŽEP”E†a†eXT7Æ(
-.Çšb´¥š&Zš¤q_cÆŒ5Ö¥1Ñx¬ñXÍÒ¨ÑZMÒäD§? æøÇï\†{ï÷¼ßû¾÷Þ÷É0¾¬tã^ƒÍø>|ß‚ûšñ3ÖÁs°æ1þTG9y™%ÑÝ41ÆW…1~¨ü˜PåÅŒV®1VÙÆ$Ù6es”[ ŒØ2¥ÇÍ”-îWJ3-Wª©AÖøMJ‰Ý`‰?f°˜¯r¼îŸ1¹ 6Ó Œk`TÃþ7ƒ8¦“bŽEqgò–ÃÔO9¦Á²›†+Ë®ŒøhÙâÍ`Uš9K©æq²&”(%a†,‰ó•Ìpœ”¸F‰IÍJHÚc0'…+ð ¸ ‰?ó:cx#Ô%S˜3ù=•|K!1å'tTN¢—쉽•‘è/[ÒP¥%”5)J)Iq²$[”œœ¡¤d‡-“”`™.sÊ\ŧ<+SJ½â¬MŠµî2ÄZŒÖËïbS‚»•žIÆð•°ªÀ ¥ÄQÎg[Ú)#ÅSi)¾²Zýd±Q²5D‰©‘JH5Êœš¨ø4›Li¹ŠK+R¬mªŒ¶9Š±-QtzƦoÔ˜ôТ¨ôKïjŒí0­¥¹µÕÊ;1Uªe ¯†
-˜Êï‰üßv~§Û˜7m]•œî­ÄŒ~2g V|F°â2Û-c¦Y1YVEgÙ56«@cì“e¯Ðh»K‘ö•Š°oPxöv…e†
-³ÿGáö
-Ïr+^eý†ti)̇Œâ¥ ÀÎ߶L<G3·½“LÙ^ŠÍé­˜Eçiln¨¢r£4:/N‘yEäe*Ü‘¯0G‰F9žÖHGµB+’ÿ’Fäo…CžN#w4"ï'…ä¹’ëV3u°J˜ŽE›Hg$OÉ•ÌØ¥Øüv;ÎSQã}9¾¿"
-V0\£
-Â5²0F¡4NHašFæjxÑD•kXÑ -ªQPÑ
-,Ú¬!Eá,ÜV`á
-,`r…õè¬È¡0 &£É2ÊF75ŸýC¿ß1A
-Ÿä¡Ðâ
-)î­á%þ
-. Ò°’P -‰RPiœKS4¤Ô®€ÒB .›ªAeUzªl©üË~§e¯j@Ù~ù•~ ¥75 ä ,v·²–±)̃r4‹!ÝÌñRr¾ Û:¶ïW†÷™Ò^AÓ<5dº¦÷Ó òÁzª<XþåaÈËd€3A~N›ú;êç,U_g…ú8—¨·³^½œ›ÔÓù¦|§ä[~]=§¯^ÓÜ­Ô¡µK8¦°ß"ÈE; ms‰=Š˜&(—ŸÆUtVÿ9^ê7§§úTú©we€zUŽ€õ¬Œ•o•E>UvyWMP*§¼ªªÕ½j4ʳrºUS·9×ä9û¾ºÏ~ înÕ¢µ
-Â.úÏ•ú.|«»¨‡«‡¼\½`€º»åé
-Q7W”ººâÕÅe“‡+_]“ÕÑ5W\ËÕÞõ¢ ‹0¯‹ËP}A†…·Ônáwð“ž)¥a¹ž9Sè´ãÙsÔl)´
-}tŸªFÿ×è?‹\ÖI]j<Õ±ÆGíkú¨]¿ 5|èkøØÖòr¯åÅRKS?Ú`íLàÆÚ5œ…¡`?àu—]§ ¾´<Ï„2G¾3ÐND;zž4j¡4t1úèö].ù<‡þJÉ£®ƒÚÕ3
-ÇG fó:GMÎÑhçIòù ÀâçÞ†ã* ß¿ç]ÐÈ{€Ý.ù¡ëCûvy¬ùHç8œZZgÚ8 ”Uçàø|J}®Ð'×|¤/ü¤¯‚¥ëFé„›ÔäkŠ~‹»E’o#v{n¯;tkÃü`Œ3¤ãóõ?M—NñÎÒ=üå]üå|îm-Ó-­ÐM<æ ­ÕW8Ë/ñ™Ÿãt?ÓºªÃºBà—9sIߦ»•‹m|Òêy= Câé­‡
-ÐÉFý¯{ùoèk•ê:þòKüåçøËkÄñOâ¸B—õ<õº u:¯ú˜æ=KÑ[Dp\§¹êÑŸDáÄœlAOЕýúpå@öÌÞF½=+ä¡1ɤÞI *ô!q|@#ŽÓÄq’8þªÕ´Ç‹”¯™–ÙB)÷’‰½Ão“±ƒdõ
-$¡&!Is±MÒ4I›&kÔf]zd=Uu«¢®«¶µÓŽvÕ6µÕ¤ýQ©ÒºNÝ:mk·UíŽvÞ·d­¬Þ÷÷Úz¿ß÷ðó{>ÔI}ÎRþ’/Öÿ‘xW¼%^Õ½ø¡îÅ‹º7ÈÓZÊ¥c×:š´ŸæïÖü\—Gåãù¸&ßdQû¤qXóžÔÍ<¯pz…ËúÕ}šá^íÖÝóÚés:ñóÒþ’DÁïv)^‰VˆY =·HÓ¨5¥K¯H:Ò©Õ »¥Ñ. fƨ4&¹$åã^íÇöKcEÿ’»ô¹Äi¹;¥:©Ûp\'zL»}Lçñ5iÉÞÞTx{Y<¯ðò”ž¯+ì='Í$éeK«D³Y¥ãäž5ίéàî¨ g£85Êé¨0w®½•“k8¾vÇ¢±}'G×ÝÃáuW9¸þIîXÿûc~ξ[Þc_ìÇ,oˆ°÷ÿ¼£ÐúS…ùçÅã)z­(Ä]Qxùº!šË·¸'&™s±yÜ[Æ© ÕœÜØÀñ-ÛØÉÊÆŽÆ p8nŒCqSÜ7ϸEöö³l8ÆÃyn7<ÈRüìŠÛâ_gaÓûì4~Êcä+ÞTh)çæ«æê_ÊÔë4î’·3 1œŠ7r|S+Æ"-4:8àbBË ~ö&ô²;aˆÛÆYLœfWâN÷²#é(Û“Î2—t…ÙÍ×™I¾Átò«L§¼Ç¶”O˜J|ÅkzýÂÃJA.©=«çyJ-ä爼J6p 9™å”\v§˜XJ­b1µŽÛR›YHõ²#-Àö´si#̦M2“>ÇtúSé gœb"ó㙲5ë;Œeý„Ñìß2’ó±ˆ|Å+
-çO›ôúçÄ =.VÊ%?{åewV,‹Y ,de°#»ùl3³ÙÕÌäÔ3ãa*§pN7“9Œçnekî4£y Œäíg(ÿƒù(¸FÁsôþˆPá;„Šþ."7)ŒðR¹î .‹ÓJÅŽ¨].ƒ%ùY—ë˜Ëg¦ …m¹„ K˜(¬d¼ÐÁX¡‹Ñ¢V†‹ü õ2X4Lq˜¾â턶ì¥GIP°äݦ‡è2=K ôeñ6þÒ¿‰ˆú7¹Q×¾H¿”úÔ_ÒØNy›•—™’5„Kâ/Ib¬$“SC¦rM6úMNúJÝô–úè)í&X:@wÙ8]e³øËo§³üæs´[®â³<ƒ·ââ7âCñ_Ák‰ðœÒ«6Ý¥Gı ±Yy™Ò¾Lh_Fͱ ™ ˜Óè3çÑk6´TÒmqÐeiÄoi¥Ó⧣"D{Å(¾Ê¼U»h­:D‹õ,ëxlOá¶}ŸfÛ¯Å_Õÿ\DVyFšW”fœ•/ªÛäk\û2,ªÖªŠ'X•L—5¿µ˜«™v« ŸÕI›ÕM«­[žêaÜÕS4×,Ðd¿—ý Ž+48ž/QïxKüEýÏDd•'¤{©VwQiÆ>± fô<¡ñaùë¯QÍS³–@M5‰øìxí´ÚKñØ+qÛ4;\49ÚpÕvÑX;HCÝ$õu;p:÷Sç<EmýýâqõßÃ^ÿ†Ú?‹ÿàpF¨ÕÝLÅWêuJ…·‹°ú£ë— üøõ_ÝÚœF<ÎTš¹49·Ðè´ÐP_C}}ΆêüÔ6ôãhÇ®¥ÆµLµë$ÕM—±5} kÓwůğĿ±¹"«\“æ¹FýÅ¢Ky¾ƒzÊK§¾÷ªïqÅÐ䊧ѕL}SΦBj›Êp4[±7×QÓì¦ÚÝÍÝ‹Õ=F•g–JÏ*ZŽci¹O<†¹åÊ[~¡öñ/,žÈ*JïŒRðÍ:±M%Ò¨Ú>Ñ©ñ6µn5z¢q¶¨mIÄÞšNuk>¶VÖ¶JªÚT¶¹¨ðz±xƒ˜½#”ûf(ó-Qê[Áä»—’öGÙÒ~C¼Îß(ñý“7²Êý_”eJ¿÷¶À¼˜ƒ"(¼¢YåRƒÒâZŸòþö X;ŒTv¤PÑ™ƒ¹³˜òN3eÕ”úë1ù[(ñؤ80EQ`…#.ßõ°xž¼®×È ¼O~àS
-ü‘U.¶ê.HgIÜ*­1Ñ'üÒô´ký*•j;Á€Šîʃñ”“(éÉ`KO>Å=&Šzª(ì­¥ ·™üÞòzûÈ MÚIvè Y¡»É =DFèÛ¤‡~&~OFï'döDÈwKë ´Ä”ô†DP´K·IºN•®ÕAé÷‚©?Š¢ ÉL!w(‡œ¡"²‡Ìd U“9Ü@ÆpéÃAÒ†GI™#yd›GΈ«$ ?KâðÅ»$ }ÌæÁÈ*wJkY©ÿœôÆE¿H·M%ZcØU¶V¨ö‚¢QÕ[cȘ06‘HêD:)“y$O–°y²‚¤ÉZ'Ý$„ýbcxšMáÝćOb_O7ù²xÃÄGÆ?#~<Š´µÎi1"ÍÑ¡5»UžÕI»JåQÙ˜ôUžä†!}z I³±$ÌmÂ8·™Ms™ÄÏ`˜/6âæØ8ïeÃ|/±óÄÌßÆúù£¬›¿HôÜu¢æ^díìDÏ~@ô­ÿcºL ¢<¯0ü"‹"2 
-*ƒ ²ˆ5®"(Ȧ((ˆ² (8*
-Ž+¢ŽË©â‚©1n&ÑDŒQc“Ô%§iŒ[5±Ç¦­MjÔ¨IÛ4©Ñ4>99=žÇ™ÿgþûÞïÞû}ÿ½ßÁTÇ:+Ñ+„HÏ–s©Ã<r0KŠœÍì5}ÆÅ€y’o•Ô£ÚMƒºYŒêjñ“«%H.–r¶D©‹…CÖÂf²\ °”Á2`]x
-½"˜éÒ„9Ôa 9¨ Hx< ý:ôW0ƒ®–\h„×Ñt6Ò|6Òˆ®ï)mÀ4yéÛxéÙ8Øl›…Ù0fãa[oå·çàÏ=‚oU†fdïIÄ;¶’}ÈšÃMƒÑ àQŸµ’'Ëèf“ºRšgxšðmîÒvühÂø±?váÇîp©™—MÇ᳇BÛC,š1Ø̬ÛÜÂßÉÇnò±ësøZsI×tâJ¼ãkج9r9úkÐ_/7K4Ýv »' >Í'ì'- <hiÊùH‡ýiŠð£?:^ˆmä¤k#m«
-õy…d_µA½zNÁyeçrü·Ã÷r±^_Öj`}ÎíÍs‹Ã _â2|WáÜ€›NÒ'ÔërÓ1¼|Ì GÞã¥ð›ïþ|`Áö
-û㱟ŒýLV˜ý<½HîÁfüØ…;ñ£I+µÚøÿoå—[°²‰ˆm${•»ž
-_v£ƒ'ý l©SŽ#§º8ÈiaìÓ
-ö3¨¾l4ò´?6ᇼl >UG$Öòo‹Vãá*V°‚Ì[Éèrª¹žª«cÇÕ£ßÁ_ºKïs¬œ4 Íg [{/Ç^³º£g¤ºÐ A'
-áhŒEc)hd²²ÑÈcå³Ñ)E£
-»‹µŒ«ZV¾„È,""[Ã.¨vº­ê._iós°wr#í ÇkGý>>wp½•ãe³‡³l®­wòUƒS Vw ÕJçhYG¨Þ%Vu.‰ZꚢZ×L-qÍÑ"×|YÜŠTãV®j·ÍïZ¯ª®ªèÖ¤yî-*s?¦R÷wTÒýc•x<Q±á9Ø;¹Ä‘zœã½…WMظnà¸
-Vz¹iew/Õw÷ÓRþZì1HCŒFªÚ§†$Í÷LU¥çUxæjžgÊ<KTâ5_Å^K5Ç«AE^ÛTØc¿
-¼_Ó,ïw5Óû¶òÿ€ÁÞÉÛ}yñJì'm‚Õ|¯ç^-þ,â¨]dt×Bo£x¨ÒÛ¤yÆ•‡ªÔ8Z%Æx'jŽOšŠ|²T蓧Ÿ"Íô­P¾ïbÍè¹JÓ{nUN¯½ÊîõŠ¦ùS–ßMeõþ
-~{''y­0Ñ
-@Cm ŸŽøøS‰/óü]TÞËK%~½4ׯŸŠüÌ*ô¬‚ÞÃ5³÷Xå÷NPž²¦ûg(×?GÙþšPª¬€MécUfßMÊà%˜ئÔÀ³J º®ÉAá°sm×±´¡Ä€6lEë泊ërü)Æ—9ø2;ÐC³úú(?°fš”®œÀeTVÐ8M JÔ” TeôËRz¿<¥õŸ«Éýç+e@’lФàÝJ2…ÓJ4]QbÈ—ðì\ÛÕ†î.ÚÆiTC×s¸_€/ùø2#¸«rƒ{hZ°Ÿ¦÷Sfp¨2LQJ7 Sªi´&›Æ+Å4IÉ!š’«¤³•8°RB—j¼¹QñæŠ ;§4.ì²Æ zÏønçž]‡ÑÜF«±f°´*`núÜË£5Ì!.Yfe†z*=ÔW©æ>J1›”l×Dó%™G(1,V a‰–¦øAÙŠ /иðrÅF,Ö؈‰lÒèÈCuR#£~÷ùþ=Ø;iAo mÆ
-Úá…1Ä
-ùžÇ½lü˜Šé09ÂC“"ŒJŠè­ ý•ªøˆ(ÅEÓ¸ÈÑŠ¯±Q)5U£çkTt©FF[4bȽ0d»†Ç¼¤a1íó|Á÷§`×ð!víòS\7”yŠa&äpo
-K#.Éø“ÝM Ñÿ£ºÌ£¢>¯0üdQv•MvD}†}GEepcÄ `Ôˆ\
-`²’Ò§)1Ý®„ŒEŠÏX©‰gÞ­Xóš`>·xÿ7Åe8Ù†V7ºm\›3¤™0*ù»òùÌÊë¤ôÇ”‘á.S†R3Æ(Å<NIæ(%š'*!3Uñ™™š˜™§¸IeP§XËM°,TŒ¥Sã³Ö+:k—¢²+2ë,Üàý=E[ƒl"þ*3ûkÔ6®Á5¼–C!X!“ÿ¥Yð7%ey)ÁjP¼5PqÖpÅZ'hBv’b²Ó5>;[Ñ9%ŠÊ©VdîLEä¶(<w¹ÂrŸWhÞËpH!y§áºBsïÂC…å8´§ÑhEcÖhTB ä‚Ù*™¸'cWòœ—|_/ðWTAˆ" ¢Q¯ðB£Â
--
--,THQ•Æ5(¸¨YAE
-,zNÅ;àuù¿§±E×ä_ôµ
-¿Q`¡CßE§ùèÌĪÖB9‚Ýô<îü\‰ã±*1ÅÃU2Rá¥Þ
-+3(¤,HãÊ"\« òd–›Pž'ÿò
-­˜¦1M]Ñ&CÅ3ò«xQ£*öÃIùV|ªQåwäWþ@†2‡ºÑz­¹hÕçKUPy0 íÔ"Ö_‚÷Ä:FbUB*]4ÅSþÕ¾[=VcªC4º:Z†êxù1È£j¬ò­)ZùÔ4Ê»v±¼j»äY³~ šð‘<«¿‚ÉkŠCè,d³¡½
-(„ìbjP*%•ã;&KQS¤Ð)°N2L!ßz/ùØü @Þ¶0yq yÚ’!S¶¹Ûª4Ò6Cn¶¹Ú:åb땳m¯†ÛÞÒðú÷å\ÿ%Ü•ËôjGëqÖÙ€^5”Bkž„vj%Þ{]+…amÒè’ÏlyØ=4Òî£öÑr³ËÕ)gûD ·›äd·j˜ v~dŸí°VjĨ6bØÏ3|øÝ9wàZ„V#5ž“YoX«Øh'²æ¬QXúØÅÑè7IžÍÃå¶À]N ¸ì´øú–P›ƒ½•­•ÖJ[)^ëlX =€ßmÁ¨¶œâ|!ü3ü]óùÚ ¨rÈ£Þæ©ìƒzf`¦>}t Íè·à±j®Kœ4l)w)·‹W—že 7Úv2ílí {Emgíó¡6Ãk|÷m~snãžæ²Öé0Š(…z§²æ8»E B×°Hò~Rr_&¹,çÒK8­p.£+©Å*.]«¹ðtqáèæÒæ‡Ã­‡Aïaa=°§ èGϾÓÏw1«]_ð»¯5 Í©PFŸs([Ú\ö!kŽ\ˆ>ºZéõiÄJÉ©mì*si-ñµä±Ž<ÖS Qòè zt!êãaØGOú¸>jÑÇbúº`;Ÿ’6úÑ{[ èV‘fõ6S²DÖEÊÁèV¡¿Fr{Íõ° ¶À6xh¯¾ç$íà2þóÞÒ.æc}ÙËÅc³±žìcÈöÑÔ}ü¿¾ǹÀ}
-ûá
-ü‚þ\eN>aF®Ñ—ß2£×éÉglø ÛM†ëæVéżu§õØ ïuÈ <ÀÆÁ=”wš'-Õ]UëŽêõ'üÔmüÔðu¿Ç×}›úœr Çuvxaù”Æ}‚kü˜‚}¤Ó¸Ý_ëC<ÞωüÁá <Òÿ74}t÷WEé/JD3½|t*ШÅ-6¿‘ø¿•øKˆßAüNâwë}üÝeâE|æy\ëY"ƒ·qyW(ãõ®Ð2Ç9ö?9<„{Î=õ;ô™Bõ¼î¯¨ÅDz¢QDüJÊ^GùtŽ<ÎÇ)òø)y¼‹³|‡<NàBi~Ìê×NªðCÚÙÛ<Ï8Ý$£û´Øñ 蜚ÔSú%^÷
-^÷µ8×=£t2ÐÈa$JÁ*"Öéy¼I_k±[ˆ½X¯“Ç­ kã z õ*C½—o¼B„ݺª](íDu€—‡x8¤}h¤ÎÈ™Êy²kÑŠ!~2ùf²óˆ]ʶ¬$v±mÄž­=j"öâ.f ·k‡Vj;Ù‹ôd*[Èj37Ñ¥^}©ú':Ù<¹¨ù£ÑØZG·áH´|è¦?ñÉG|#ñ-t9إĮÔVæ£9ݬYÄžK¼Ä]B'žÒóêbB×éY¾ý ‘z¨Z7“ÑÅD­fÚV£ý-7м8´Í=»¨Åvj±=²EÁäEü⛈jaêò‰_BüJâ×RùzâÏ"~1[¨ÂR:Ò©§ùÆr²|Š.t}«lcŠ—ê+ø78¹Âñvœce¿+Ú¼¾ÀßQ蹡åMEÇ ‚F ñµJéÄÏB!_¸I4&£QKêјÆ<vìT£C‹Èê "µRÁú±€iOÇ›ÙÕÍìøfô8Í‘vˆãu¿>XËû5î<Ò\‡iÕ0w´|ÑòG'X4’ÑHG# |4Jô’Ë=¶Í« ãOÓÜ»¶[;iì$Nb'Ž'±sqb×±sq“ØiRçÒÄMš‹Ó6½¥Zï:íÒum·U¥]K+T(L\¤Mh  B€6þá&B Ć m0Ú‰3?Ú?~:ßwü}~Î{ÎùÎû¼˜ýŒcûc/ßËÔVˆ0³î¬–Ö]ÔbÎ -ä|Qóë_‡75—ûŽæòþ©¹üO «op”}ãý©æœãú$Çì1Æs´4WG
- :œkÑ¡\»öçÕi5Ï«½ù~íÎj%?¢LÁ€– F´X0¦…Âií*œ×\ÑŠv­i¶ø´fŠ/hGÉ‹š*¹§É’×5Qú&¼£”á>dò
-éö³e¤E¬ÐãïÇi׸?€-Ye,«Æí-5j¥ÔªåÒJ-–ºµËЬyC»æ =ÚiˆjÖ׌!©Æ”¦iM—5a<¨íNjÌÄ®1]ר鞒¦×”0¿¥ó»ð‘F,YÚ¬^F÷ºƒz¯’ø«Ð§ÝË}†c~‘±,lZ§s±æLf¥Íåš1;5mnД¹E“æ¥Ìam·ôiÜ2¤1˘F-ÓJn\ÐÈÆU c>¶nzRqëU ZïjÀöuõÛ~¤þ²?ÂÈ>ä.š/8™lجÇ>Xæz{˜f,3ŒqÚ–¯)«Q)ë&Û³ÕiÔæUÒÖ¦„-¨‘²ˆ†Ê´µ,¡xù„Êwªónõm~LÑŠÇÕk¿¢ˆýsÚâxUaÇà
-WÞ§ÍÒÇy…ÞEÒüi—tÈ-­À<×3ôM2¶s3îÈÑ6{©’f ÛË5dw*n¯× Ý§G»ú=Š9bŠV©·r\‘ªYm©Ê(T½¦žêO©Ûù¼‚5wÔUóŠ:k¾oÇÜgòZçIñǘìè"Ìr=Iß8ce^F˳HƒÕÔ_mUÌéPÔY§^g£¶8[®éR¨&¢žšAu׎*X;­®ºEuÔT»ëŒîËò»o«Í͉[ÿ=µÖÿ–ö¥?«kh=îRü˜‡io¤Þ¡˜yd,}®<E]E\…]›ÕãªVÐU¯.W³:Ýíêp‡Ô^ߧ@}Bþ†Iµ5ìR«g¿ZOÉ×xQÍ·Ôäýš¼ÞïÂo¸þ;|BVWÐ9‡æ4ãc@
-F¹jÂgò{¶xrÔã)QÐcR§Ç¦vCOÚ<jmlS«7¨oT¾¦!57¥ÔÔ<'oóª}'äñ]Pƒï¦ê[¾"wËwà×\
-ZU´«¦»VÎnª»ÛTÕTeOLŽžÙCSª-isè°ÊCO¨,| ¾$[ø[²†&[è=•…>Vy¹ý54–ИÁVˆA: …RÅÛ#Õ‡¨}Â…rn1ª*bQe¤\ŽHµì½nUôú´¹·Ce½Ù¢C²FSÚ]€CÚ;'KìªÌ±{ðM™b?‘9úWY¢ÿ’¥7«3hïÇzÏ£3N Að£Û„%nˆà»£RU_®*úKT>`RÙ€UÖA»6 Öjã`#øe É)>s2Æ÷Ãâ/À]•Æ_SIüÇ´ïÊ0ø
-Emæ$PÀf>ϳ‡Ë?åÝ¿À}í"Î ô´JH†ï%æ:bvÌ ®™RÑ°$®Hë÷®ã@ÁøíÃpíÇìÀhĈ²ó‘‘`Ö¼>¶5&ym xyõX{†g(b᜾âÝ5‹Þ s/w¦¤æ)ö
-ž£Oán1°¼Ã.¶þ̓¾ÙŠ×¼
-¨‹U2 E|ñÄÏ$¾—èEÄ/×"|,ÀÇ||ÌÃÇ\òq7õÑ˺½‹§³øÕLÜOgTÓáT2ÝCe÷èOð…ºÑà8[ÚS6óú[÷³Õ.çÙR^‹Ù/i8:4ðìD# <4ŠÐ(G£J3ð1y™J}ôP§Ý\M曓´„»ÕTÌ÷p÷$™:¤ª½ƒ¤ùè`vàá [Ù6¶÷ ¼jV˜Ïý^?½á!š=8-:qèØÑHCÃÍhóÐ(f…–£S­‰wÔ«óŽMÔ¡öAS4>ä. Y¤ÖÁ«Ô2øa Ý©æЃj
-=©Æ!çÔv®A@{ÐÜÄql5[ê=0f±ÍOã5Ü3\ê6„ª;Ü IC¢tg˜UaÉšæR{X¶ÆõiÜе ­Tkøhµ„7ª9|œš†u©qØ 5D,P}ÄJÕEnÔèȪ‰<¨jÃIø\ëÐhn8zŒ`üÇfB7×]<ëÄK^:ŒCÕn0jœ!F­†x58ÔlÈP“!G†1”ªÞX¥:c½j­mœ¨êáÓUeš¯‘¦ûTiÚ¨
-ó•™ÂI•šß‡ª4êkîÙ#Ð[c#;zyÕöÀ\·s,kã³¼4G‡¨Ù¡F“I æ8Õ™íª5§j´9KÕf¯ªÌÅU¡‘Q£UÕ¬òè•E÷È3G%1ËTlùŽŠ,ÛT{
-íFùìÑʳÛäµ'+מ®œ¤le'ùäI.“;¹FY)ÍÊLéT†c†Ò‹”æ|P©ÎÍr:Ÿ–#õx>“3õÏzÅhÎL§9þµeHcø_#yV†—òRùŽ!ò: Êq˜åqÄ)Ë‘¨L‡SÎ,¹œyJO-QZZ•RÓåLï#}šR\ ”ìz@I®GeÏØÇ•˜ñ6|ÊõW<h5ú Ñ›–É<ÀXŽuPÅu9~Šù¬
-Æ*º KQ½2.‡ïÊT¸ ž—±ð—^pQ¦‚C@KП‰ÞDÚ‘±P •P>È…LÚÇÔ|ô}ô^…ƒd+
-W\±Q–âhÅ”X]’¤¨’tÈ‘Ù_$“4ÉèŸ(cé,J—*²t=ìT„ÿ°†ùOÃÇ\ÿK‘%7´±ME£F4ª¡ Š gžÿR]æAQßg¸Ø]w‘EЪ(*
-È-,»¸‡«» ˆ
-BÁŒmªÄƒÄD3iÔFƒ¹¦Ui;1&ͤšÄNk’NÇcšÌ´éL56iµÓÖ£­c³ý,îdÒ?žY–ýýÞç½¾ï÷}øÌF¦L+ƒ¿‚Ý©`«ŠWJµQ‡Ødv|dÉäÈ•ÑQ ìJvú”ä\*ƒ³C Î~Å;·+ιO±ÎcŠq¼§XÇïç¸þ¥^8V±„ÕÛœ`>(ù §Ý÷”*i¢ýådÿ_+³;IFYIžñJôdÈàÉT‚'[ñžÅy*ãu)Ú‹€õ®ˆ'/Ñ‹pð| <è<Ï_h¾Ûê&¾åðáq;(ó@1Ï„;³~$Jš ~d›Ù«äʼnJð›°**À@0àô
-PHÌ9ÄœEÌ“}èO?üµð/¿QŠ_ƵœEgKO ËF+—k+:w%—KƒµÃÖF.Ú(\/¶Q¶u`;Ï°-®D¸µþ°M·ÜT\~àvPBÌsˆy&1O Â_?¼æf4`‹‡9†‹V§AZM.ºð£?ÖP“Ãpxøs {ÈEÆz–êÑ3ÈïÏñr [d÷§àïªç¨!måÄ\@̳p}jƒ”Ϋ)ðšÚ$C‡Ý7¦XÓlàaüX‡ëñ£?X†6N`àÂÝLM6s°6“‹Íôæ¦U|RM»y†žØðSp‰w®+§TQç"Í¡|™ÄÌÕ«^3uK a·A?À ¹XWY<Á£Ôe0þþ":„ÛÈÇò1Ì%7ÌÀ¦é‡ p£;q|'õØq¥…žØöøL~xÔ¹”|çÑÂÓ‰9c5ü=’‘Æmˆp>
-¶‚í‘Åûqð„î/âO=äärò, êwéÓ}øq€Kù
-~±O
-y‰À.þ…¡¯!˜M÷ÐwÿAÏÜQ‰þ¡jÝ@Ç|ν†:¹Šª+¥OQ8¿ç|‚¢»Œ»HÓü–â§I~E?"ˆsp‡Ïè×hºë¸Bå„p;ÄC¤-ô>ÜU”n¢3o ï>×$}†ž¹ª|ýQúX5º€Î=¯:ì7j öÀ~ö{°¿û›°=Hj¶“¢=¤k?
-óUxŽ“Â3z]WÀ]R¢tè+päk>ü\P\fýFi¤3®Ò[G¥P'Ø^„ÿuz›|¼…Â:êzö:~üùCüE©Õ0-³¥{/ŽÑJ'iÙ : ÓŒ‡Aøó ¸ïßƸE¶¤Ÿ+Z§d$†üŸˆý,¢˜ƒß%ض㷋–\D›ÔêôåK¨ÉèË”à!ØAüøž6“­Ÿ]Täyï«xs‚cuåù9ú/Ÿ¡¯pÞ#­ôN¤õŽÈÀ[f|·a
-Gböó±]Šm;V]Øöa;ˆíl/Ãn«vãÇSø±‹º<Φ7vÀ²·#‚­dr ´E·Aè+|2»ðòþ‘;ú1Ø7bÛŠítìf‚ÙØ.Àv#ÊŽíØ^ˆí
-êrz³™SÓLõ›9ñÍð‡q,ŠøãǬƒ`#£v£¿—ÿ÷pFØH±oÅ~:ö§b&'2ŽB".ƒ£
-Ž8¼p°Ù@w¬àÔtÒ±kµ„ªÔÓuÔ£–jéö §.¨¿‚»€3ÂHÝÃxßÂU3
-DeË=G‹£‹´(º\¾˜jycÜòÄøåŽm+¶U5qÝrÆ È?¤êø½²'¼¬ª„ªL8®€›ª4ÜÓ^ø¶°zô¥¿íþJÖÄßKXkñ'€/S¼üIF-6Xå3¤Ék˜,!K.Ãl-HÌWMb±œ‰óåHªQu’Oö¤zU&¯Ðüä.UûUfR©q¯JL/«ØtBE¦Àp |©'áú6¼½\³pÅ-õÀÏõïãÿ^~w[¢å6ä2™UcJ‘Ó”®jÓTÙM3TeÊÕ|S¡*Ìå*7W«ÌìU©¹VÅã–«hÜjͳô©À²Uù–½šk}Es¬o*Ïú!¸îð=¤pmÌ`­cmázk
-‹Må–I*µNS‰5[ÅÖ¹*²«ÐZ©‚—òSš;¾IyãW)7urR¿£Ù©O+Ûö’fÙÞÐLÛ9pÜá{HCð÷ÁÙÁ
-ØÌúU |ÀÅwä“*ñ¥_ÊñµÔ– ’T“ŠRST˜:A©“575Ksl¹Ê³*×V®DÐì´EÊž°T³ÒÛ5#}­²2˜.»5-cD™Ç55ã,øß! ¿Îö°4`õò$“|ÿÓeÔä}Çño…Jx  b I€ðä5AI*‘ˆˆà;–ùÂœ¢ÎVÛYKífµn¾”Vúb»›UQ«óÚy­UÛÎÎÛº›uÕ¶»]ﶹ—ž]·›×énÝÖ9ö d½÷½'yÂóûþ^ÿÏïÛÀýz|©Á—*|­ÌW…%Ye–ty-Y*±ä©ÈR O®GîÜr¹òjU˜×(§µEk‡
-&-V¾­_vÛÙl»4É~PVû÷•g¿~«<ÛmYm£ÚÇj8! :œh0 LõÜ«æ·Jü)çÿJA±Í Í(·Í¤B[Ž6p©ÀîU¾½JöüÙò§kRA»¬Ž…Ês¬R®ã~Yœ;•ã|Vfç)e;ßוí¸%³ã?ÚÇ
-øzXûÚ]ô ›p €îUò[(Áp9&ÊéHQ#]vG¶lN«¬N(V^¡O¹ˆS‹kšr\m2»{”í^¡,Ï&ezvÈäyFž“à¢Ò=¿V†û¯2¹ïhöï…¯‹•oh*¢ÿ¸ÖÉøSJøÝœ|ÎwÇÉæI’ÕcTn‘I–"‹rŠòe.r+»¸\YŵÊ, ÊTÒªŒ’ùÊðö)Ý»QiÞoÊè'”ê}üÜ”±ä ­ÅöRøæSp’ Àµø@)>”߬È8Ki‚Ì¥©Ê*ËPf™Y¦²IÊ(/Tz¹T) ±j¬hQjE'èUŠo@ɾA%ù†”è;ªÄŠs2T\åú©’*>W?öa;‚íæR©ÔƒÉ|ǤJ€ pÏŠ|³THÙ¾x™&')½Ê¨´ªLiØÔªP¤”*Ÿ’«ýJªnRbuD†êÅšX³Fw×lU|õ^ÅU¿¨ Õ¯+|þDñU·µûݬ¼mØo  ø¸W
-<ÀÉw›íƒLÈF¾™jâ”V—¨ª’üJô›eðÛ”àwi¢¿LñþÅùƒš@ÀØ£+¢,€Xð#ü,ç~o?Ûcý-õb¿“Øfªä6WBQ9(.îåÃW -üõRZ N)S 24¦êî`ºâ¢‡Xƒ$HÓ)ZBh«B6„€ ¡)B›
-<|.¨¡HF3Å„Ù´F4P(N†iÅOç;J˜N3‡X3ÃÛ.ká¡–&€˜lAĵ )š³0‚(Ìö4ýà–æÃ1‹ø¦
-Á‘­Òa:tüPu¸V·ƒŸrŸ4ò›°%Æû-°ì‹ñ|Éé4.ÎF
-ô4æGªÖ5tÌ»jÂÒLý?~„ʹˆòy -óJò<Cs?ÎÒD¯¢P@“¾LÃœÖó:Û ’t k#DwÆÃQ}‚;1î?ƒëà¹ø™Rà1‡<eد%íSueô2~œÆS(­“X'P–Ç84Fðã~¼ˆßÓ6ÚfÐs0>Cá†ÑxЙOEµØö‚ÛðÞã±—öh­4¼7ÓjvP„}¶ëhÅ©øß„ÿ3ô,jñiÔÞ0Úî)á“(Ò'´
-ÛØÞL5¶ÓÒ{ðä #uŠÌ¼M›ß`”ïpEW€íàãhë€óàT¬ÕŸW<~§`;Û¹Øv0‚Å´i%ëômüx}¹ %ùêrǘªí¢ as9ÇÆjÆj=ÇÈ7ø{L`e º¬RÒ5ã:ú%.ÇZ;ÚöÏÅÆ}÷ØQ`ÀO#6³€ÕZˆm/®¤ÚuØž‚í{°ÝŒíVlE°Ý¥ø±º è«TeÇê Ÿöе/àÙi²ôŽVÒ›«àŽbõXŽø÷öØ1¸™\ÜG.¾®tìš±k.l{±]‰íZŽÐ쇰ÆV+¶#é]LÊb¼ø
-YÇä<H×îäÎ0ÞgšÞ×Á?ø>:†ã1~6âžÍktv Ø5bׄE ÈgÜØ÷ª?–áÇRüX¢ aì¶2)sèÒnþ–áM?Ó³‰ŽÙ®:e•Ž05&9¢ÏÀ(÷F©ýøñ»•ãdè}¼{¹·”\,æ¼XH. &=ôFóÚóñc~tªŽ
-Û§áÜÐ:ÛÐ\G8N
-6
-CÜ÷C7Ç]'±´c«aV«£DY»]-v§ÒöJ¥ì~%íuJØ£j²§w´)æèUÔ±@ Ž1EÊ×(llV±G!ã~Õ*h<§ãG
-W¹^‡kú›Ð[í›KÍBzøßN<YÞµK3±¤œ…JV% ‡â†K1çF#¨#¢ˆÑ¤°3£zg·êœC
-¹–(èZ¥÷çpïVµû>UyŽÉç9-¯ç²¼îßÃuùÜ7µ ;Ð\MZLÊ3 ÿ¹v@–giÞ%‰§‰r1OÝ5¸m
-» Õ»+rW«Ö]§ 'ªO³òWäT]¹HU•+äóÞ©Jï.UøØq}Èíû¶\¾Kry§áïr{oj'“è“Ž@.Èpmƒ4ñ$x#–FÊEˆ¥Þ[¨×ª ×¡€×¥j¯WU¾ Dä«JÊ[Õ¦Êê~UTÈãŸÛ¿A®Àçå |EFàpJå‹r®ÈáÿPåþOtkÑ#ÝZý!ú€kRÄç]„‰'DÙü~‹ªvy†*ªøå©©—»&.W0#g°GÎÚ…2j—«<4)Gh§ì¡/Ãò…žRYè¼–­öcm¦þÕè݆]‚hƒ44O#ïÂ"ž¨âYe¨PžP™\u9ëÜrÖWɨ¯Uy}£á4tÊž'[d©Ê"kdlUidJ%‘#²DNÀ *Žü\Åád ¤Ô¿½EسAè‚,$!†=ˆð®‚P •<wGÌr6”¨¼Ñ.GÔ){´R¶hÊ¢aY£ •ÆÚT%¶Hű•*ŠoRaü^™ã‡dŠ?¡‚Ø*ëû*ˆÎèvtÆ#ì ¤œýÐihâY#Ô£Y ~î}<÷`áœ1³Êã%²%m²& •$=²$«Uœ¬SQ2&sªE¦T
-Rø«^³³Ò¼›{õÔ7ä;IÆ”|f´–º—Rïü(ã
-l‚3AþŸ4ËÞlQi‹MŇ̗
-²³ ™ÁÊh6x¼VLk+yt+^³oÓJf%—Îb2¯
-Ö3ë¶oíc”e}~–Œzõ‡ÊÑÎ.hE7Á5LØÚ\=5Ð-C·h,¯I5$sÔëo%{sIߌËF¯Mı…8¶17v0&;XÔÛØíTºàï¢ð¶½ÒVæÄæåfÖç¦ÔßÏô¤H3׆Aæ
-ñk”yRÚ{žòÓ꣯³ŒsŒ"!Úì¥ÍíµRÜt{^sk^ën¸h
-Æ‚zóÉ8K!LŽt?Iñ!ÒÃÄq”8fe‘ep¢ò#Tx÷p˜lþöªC¯©ƒþN.a0ÆU´ÙX‡þRÁÖ|ûîÉëíÏë¼e€ø>oHº–Ô]Ø)aþ0K$æÇ›“¬—S¬•gX'Ï0ÙŸ¦“Ÿ¢qßÚ%=y„2¬ãçÕ²œ1@Û¶k#ãÏVR°+¯{ ¯ù@^ëëy3òxޔͺT'áé¼Y{.o¿?$Ž ôÇ%ýKŒÉE&Üúâ<{Å‹ÌÍsì™gŸWí Ú´mlé¦}y³õ`¾}ò{ÞÍš¢çó:Lmý`VKs†‘%OÊ,ý~¿€·ˆcš½cšú·l:Wè‹ß ú{Å›4ì“d÷ºÅ§pþƒ·úOó/yÉþCú/s ü/dì"oGñGçÛ,’ßá~®à§~ͤy“IúKÚëL–WéÀW°ã^/ë¡}_%Ô¿é,jgàœ€'à¿èÞ€ üUf½§yw?ó6sZ)ý
-—ð:â§Äñ2q¼„¹„Óº€{‘Esx–ÉûqœÁ­~—Éó&̳ÿg¹ÌcÛ¼Ë8þõmÇ~í×v|Åñ;Ž׉8i§¹ê´Mš£é‘¶ëµµ¬´)ëF‡=¦±C¨¨Ý Ó$@ •c“ÇL †´ILHC‰Cô©ˆCêÚÁ„Ð$PøäPõéë÷}ó~Ÿç÷{žßï÷<$ÈËé%<ù¦þÈt~´nû+ký|>Äî¸ ¿Ýœ¾7å¡3 0†(_fôѯ¢=„öÚM´gP^ <ûÐ?ˆþQRã$úgH“GH—‹X†ô¹¡xú< rõ/0Òç°{ >OÃß°y Þ†×áûë!·ã»Ý$ð=‡~7óVÃÿ!Rd ÝíŒcºsŒe Ýe:Ê#hŸ$…Ïêª>‰+xñyÒëKÌÊ+Dègtž·á°Š—«ÌØ*s½‘B?ØLm* ô×Òу®_×éu¯ÑÛ]Sµ2º5t·âÿ¨ž¤›ü,Ýßôv“#WÈ‘Ëøq?>­2ãSü{Rý#Œâaø¼ÞÕCdÚCØþ¬À/6Óük›Ëà*< 3—™‹‹ô˜ÉÏ‹J³\;Ñ-£[Cw‘6Ð@wÍY4Ù:0 G‰ÈÇtš7òå)T 2÷ÅdÔ ýV×9ßÝûµÍ-hm[¸°¹=c¬0g‰ÉÅ!´ËX¨¢=ÀˆGÐG¿‰æ š‹x°Ìl'[Ïp¼<ÊÝSxö<üÙó:GÏŸá#~¯®Ã)Ê|¯{Ã6Û¾o 'äàhò¢€VtaEÐ.“‰UôÐF ½&™1KT–ðä0{Šl9O¤.óô:¾H½¿æøÿ€ëê:7°ÅŽ¥µ­ñãëv9Vá ì—]7Šº&DÐnƒ,úÍãÇnõ¢_G½q´§É9þßGÇ5Å,NÁ 2iœxŒù1öŠ1vœ1v¥q|X‹ÿc3g9òŽ³¥-s]‚yŽãÝlû³äÅ.µ íG;Qô“ègYl”±QÅÆ
-6Ž`o‘Rc%ñ A÷=øRæ] _ºL‹:M»ò~·ò†O9_@Y_X_\i#¥”‘W»QVÒèW›¿¡¸Z1ÿ’¢cŠÎ)l^QÈ|NAóð#™_Á_ üK§±q{sQrr¸P後/EÞuâK²!›ÒA§R¦Gí¦¡dÀTÂŒ(n&3;5KŠkj Ž(l*ZT0tDfhEfø’üágᦌðk2BoÉzë?u
-°7K©3A)<}Pᾄ/¼ë€ þ´·ZÕ¶+r*ò*ò«5R8W(œQ0Ü¥`kÌÖ­
-D¦äÌË=$#zZ¾ØcòÆ®ª%öUy¢ß“;ú&Ü’'rW÷£¿{;iÇ`R¸Êµ |Éñ.íø“ˆZ‹Ú‰ÚŽzŒ2cAbQùcíòÇó2âeùuØ&o;KÛ~yÚNÊ•¼ gò9’_–½í;²µý\¶ÄŸdOÜÑ1ô±×¤5j@*P„<þdy——6ˆÅ-ŠÄ­
-%ì2“.ù“>í¦|íayÛjiÏÈ“*ʪʕ‘3Ý”=½$[愬™‡eÉpf(HÓiúÍÔàŽcc{S”àÃPƒ2(ÿ:xž†$¾Ä!š´(œ´*Øn—?í’/ãUKÖ/w6$gGLŽŽ”ì²æ*²äè)r“ „F%Oƒ’§9Ès*ä© r¯
-AÞhߌ‚M-]N9K-²u³Éma©°À*$MG+],ljèjùž@ÓÔÃiÜCeP¡–®P où)àCù®Ðê$PƒnèÄNÏS€÷!ž6Jô@e«œ‡¬½4U6ó]?MÅS'hu>ªÓ[Õéwë4quš˜:Õ@z¾ŸJ¥Ÿ†¤Ê±†µ{š-´hAz Äï<Ï2ØLrr®YÆ~û´°ÎšEÖ~ÖÚAœ!–aüh„66˜“×@¬A<ã0Ç€fq„&mø&Ð ýŽឦ ]ú` ta/Çç)®qîà ÇÄ®Q“<HrÈ2Ä?B;ê¶q¸Ž3ÄdŠ¹h’Mæ¢Éä5ù°I<š4”Ûɉíçø¨Iš´ š£ñwáž&ÛV¨B{Æ›ášè!©‰]»îaÉÞÀö6˜€)hâÇüØéÞ8ðwû7¾6òb, ðŒxÌïe’säånÓYúÝ™w¤]w4ÊøêÕ*a7Ç5I{áS“ñØu“ÞÖÉ5›@ŠQ4¡L±)tö—½Äe?~,ãÇabrÊaòâ0sqÇÍq8S¥$'–ÉˬÏ}¿„¿j¸Nk»®)ÆeÌA>óa×E{HY´a“¥Na·V䡇6 ¿ÿ3]®ÁQÕg6{ËîžÝì9»›½d7›l²’˜²„[ˆ Pb F
-*Ãe(P*ˆS­S
-J‘Ò/PÊ¥j-2È Ê´:ÓÚ±jõ 3öú¥H«m-Óéø¡ÛßÉžét˜‡äœÍ¾Ïûoÿ÷¡ýµ’el?VáÇ~¬å‚YÇpYKb×r 5ã c̉ջø»c,NÔÑÕÏY{àÄÏ&ÎœâÌ&¡38¯Ïæ]ìp~ÙᣴX¢±á,¿kÀ:gÞHL6³˜}?¶Ñ¯Ò'ÒÔÛ ðv ?€±m÷I[ÉÇýÌË-¨š¯¿¥~x;g’rœ!Öq68¯w©sΕΒmó­QQ]·Ú˨#r–s[ ì 7»é—Çðc?}²&{Œ€ï‡€¹‡Ïî—v±ÍïdVí¸¬ÉÄ»H˜²Œ³Ø"òÏ8ñÜíœs­ÃIKiø&xÄA;Á.GÙâd¿#’#¶h¡^Ÿe~œ WN0?H“ç°ÇHæ3î(ýqe3~VípçáNÀÁEïj'®[œóÙœ;ÀnGˆØ<¶$”¬êضH9®ªX< žWU¸Ò~ºH<^£W^ef\¢.‹ ÷euîqDæIàNÁ…Û¿Á‰ïÃï^pÐá³¹ŽýÏU‰6×Kà<`ìˆ,®D$ô+ð5ò>õñµñ>ïÉ¿JŸ¾Kbß&¿>Âf-ý |
-þþ‰¶º…Îü”ÝùïìïOl¿ÝúÛûïØð¯£.> I®Q¬¿Aa½M¡¾…2zõ÷ øüó2zâ’àÖQÜ{uõºÎ¢k~Šž8Ž‚Ãà p Þ¿‚àÏà÷àºz]uq-óÛù›lð¯£$.ãÇ%ü¸Èî~Åuž¦9Gñže‡m÷~<GÁž¡HOQ0'HÜqþožÂûqtæx€=à;àÆÿxÅy¤ŸƒWÐVÐwçÑ3çÐv/¡!^D-<‡š8~8‰Ú9ÁÀ:ΰz–Aõ4
-ö)šwœ&ú>~|?žDë~—bz‚":À©÷é'¤ö—ð~BiUhŸ
-^VˆXe‚û]ðš“ÚSNÚŸ&ãhÝq4æ8Zæj%vآljÇ~†ö>ö^çôån†×.×NÝC)­¦u¾†Ž}€vÝ×!¸~D‰_Òvý·<¬ÐâmvÙ\p¸Ç²ß;Ñvâd`ÁIЈÝ"v;±;»eZu&v‡°;»#”óbl/£"VÒÎc(¼Íp<¤ 4ïz"µŽŒ­%³kЙcp¯_/;muÐi÷Gœ–Ü:ÑžµØŠ
-®”š]9x
-ðLÂf·]eå\s”u¨Áu§2®U`‹Ò®tøð<xüÜÒ}FuaÝ⪈V¥BÏí¼/|)n5…|j
-”÷jôEÔè5•õ&ÔàÍ(ã̓¢ÒÞN¥¼}Jú¨ß|°T ÿ½Šû7+æT–ÿ°,ßYÞ˲<×e¹ÿ¦{áXß|xgqÍ÷ƒÉ ”xW
-* +ˆ*°TH*È*((lW,8EVp†¬Ð<™¡%ŠLc³"Æ£à°Â¡3àU…ƒï›Z‰ýEð Ûò„5´ÜÚxná}dñ#­QªÎ£úˆ_‰H@ñpH1#,ˈ‚¸L##3ܤ(B¬1‰ÌT82,‘Q7ªPÝ&ë¾­@Ý“à´j#—ÀUù#7´Ž/À7ï4äIhEÐÌ»Ÿe@Ò¬QÂô*õËŠdÖpE©³Ž¦@£Œht)d–4oWÀ\¨Zënù­ òYß’×:(uRnópE5æ -Ãþ|ƒ¬9ýH“.Ð
-<7ò¾¤ð%a¹³¼²L¿¢f@ufPa3$Ê(d™
-Z b   ÚX‡üñ>yãƒò$î;±B5‰ur%X|Ü –±øE€ÎŠ}¤¥ṗs&ëo/èEÐÌ»,HãK}Ü¥xÌ#+æ“iÕªDbñ ‚‰°jë£òÕÇä­OË“ÌËlSMªG®;lq’fú¦¹Ò܆i–ßÔ €I|HÞÔbx†SÈGdQh- Ï»|Iñy"Q£XÂ+3îSD~õµ
-&ƒò§ y2Õ4Xr5ðÇ 9œg—Ï¢)²ˆ¥K{¡caÍq+æX³ÜÔY–φ«$ú/ú"\C¬Þedj(fžsø‘I>'ݲê=Š&=Š
-æÜòç½r73D ÓV£:HJW §ÛØãÛÐxmˆÇ¶A€ÖlcŸoC•¸%Kˆ"›K+>´|¢¹pNç+=`hi¤y×€)üˆóÓÞ…ÿË~™F5}faüX5 àZÜëZ«"ˆ
-nUƱ®3hÝ:£ÕŠ­Z+neœ¶J;š=ˆ²HYB6BIH€@€°„PÙ !Ѻ/ÓÅNíT;Õ¶ÏK2çÌx:Ûɇù0pÎ=!üïóüÞû¾ï½ø?}fÀé^”÷LÌR³pÐφŽ¹`@Vr¸¡€ñ…@¬GæÝ ôòAÞw"0<¢ŸŸ‡A!
-€ÔYð;¯ãày8ûÂï0ä´Ï_õw97º= Ec‰g»@Ò€î“=Ð Ñбõ¹¿QøR$Ή ´{P»1¨îj§æÃëÜù`€× ð<z ö
-€š¢F¤Ø³Ù¨ )êSÃ"ÌŒ ¨tNÃT—ª¤f`Ç#÷Hä¦Ï8Î00â˜;çIw>Bà΃í…VÝ•‹ ‰Y”k`Õˆö¢°õ(,7U
-UØ+Ø'F|`—€…
- ^›EMBîÑðÍ@n/âù›+iúQ¾ýÃ'B/ p¼aT‚/DŽ;—¡C!ÈàXŽ¨BÔ"È0‹cˆr¢>ºQ8ô8/l0ÝŠûÃMÄÐ?þxy~nÈ0áë7|ä¨ÑcüÇŽ›0qÒä)S§MŸùâ¬ÙsæÍ^¸(dñ’¥Ë^^±2lÕ/W¯Y»nýÆ_ýzÓæW·lÛ¾ãµßîܵ{Ïï"¢ÞˆÞûÖ¾ýo|çÐá#G½ûû?¼÷þ§â>üãé3L6‡ËÄŸ=w>1)åBêÇé™Y"±D–-ÏÉUæ©5ùڂ¢âCi¹±¢²ÚTSûÉź†Æ¦f‹µµÝfïpvv]êé½|åê§×nܼuçî½ûŸ}þÅ—_ýùëoþòí£ïþúý“~üOüÿŸû÷D%–}ày1ý<\'¶_ ¾gÀøKÄù<b}¼‡óˉû_Àþ+Äÿ
-§°zûÌÞ»»Ÿ}Ã_>xðŠä뇿ïo=züø;xÿþÉ“§Oðßk¡M¼×ê·ü¾uDT_“_²¥ba~CÙ–sñªJÝÉ:CÏR¬àÚ ³¹Z ¯G#â÷©³â¯æe&\Wfœ¿©HK¾ãi hÐ0 a@À† 4ü·Ñ wÛ|—Ýk…†fßdKe°¦¡üUhØ_ݯAųès¹ö94H¡AÌïSe ®*…g¯) A–žxËÓ€† · án›_To‹O²¥*HSoÜTb.ÙW]¡û Þ âZŠ A ùР†%4(„ñײ3nˆ¡ÃÓ膆ëí>Ën·ûEõ´ø$YLó !Ü`*Ù_mÔ¬/Qs­…Р… 4ä‰y—"þy–àSIfüuaƹžÑÐgc,»ióê¶0’,5šºŠpCuñ~S9Ñ riȇ•”Û+á]–‹xW¤Yü«"¡àZ:êÂÓ¸d¥Mèµ3–^µûDv æ9ùŸ7•V0•éN6CC4¨åœN¥ŒÛ#áöÊÄÜ>1tdBG*êÂÓè²ÒÆ÷@C¯Ã'Òie$5›çhÍÆÍ¥Åo×t§ôРÍåØUrŽS!ã\Ê–rz$N¯:Ò #{ÄÓ脆îÆ’n#¢ÃÊHi¬ Кʷ”õkJ´§
-¡A“˱)sØNy6»K"cwgIÙ=éÐq:E‚+ž†³•6¾ ºœŒ›…žZg
-ÔU•o-/Ó4CƒTРÈa;¤rV§(›Õ•©Ð‘„u9'æ_ö4­ôqÆb§“Ùf¡¥Õš‚ *ʶ—ô‡Ì…Ú¸Æ|5Ç¢T²Û³,»8‡åÈ„Ž¡#Eƾt^Ê鎗ò{<Ž6úX‡“jwУ-VZ†©zQQYÙkF}QL­V× ††œ<V›Dɲ ÌŽ´¦#EÎr&ÊÙg³9]|ï’§ak§ûÛŒ%mú[ - ‘±j©¾¤tg…¶èp­Z× Ô°›e*–5+Ù–¦d¶§ä2í‰
-VG‚‚íäp\9Ïéi´ÙèÏ·9éË[ôæ¦á2CeX‰Ö°»RUt¤6· ®N®e5Š4Ì–t5Ó’¢b¶&‚I‚’Õ.Àúps¹6v.ÏîiXm´q-NzX½ƒS^ï¯Ð×”†ˆJ¹þ¨YVwQ¢cÕgh™òY͉VK‚šm x*Ž•­â¶2óøG“6±¾“¾ºÆA?^T÷‚RaÜX*+ª5‰Šâj……¬‹©¬º$«!AËnh9¼|N'ŸÛÄÒð›ÏhG]Ç°©æ.Ú†r'ý=UûØt±i½.³4ºâ'öë$¸­ú€ãøl'Nb;niPÚà
-˱lpËûð’WDLÒ|rÊÍáV\„`Ɖ‰çÈмVÖêmÓ°iØ4l6 ÿ†m†Î{†Pdžºg0|ÇûÖ0þ­aÚÍåV]Ö‰ç¡F!ʺ[KnÛ¹–lï¼{ž`¬¿¥²¦?Ã)`èŠo”èh@†½l‚îǧÜ"¢êäsf\Þ¼-R¸tÉŒ)êíN²¹m-¹³ónü‘ëá=Àð
-•5¿çeŒ'#1=0h±tH…ŽùhÉ#EËîA¬âìÇg"²F ¸‹V®hÅ•­èIÅb½mî0;;×6 ‘ŸÃËö¬ùÀð7`ø2>¬ÇÒA :æS¢ã´vI±‡¯QÄ¢UÌ]1‹„W Bé% O±Xo·™æ¶ÛL[çÄn`ø «`ËQ/c×ñˆÍµhÞ«F'ÜJ´â”cs”_´‘+æ!Þ£DtU3(½¤Ë—êí³µívjÃððáÕáÇYyÛ`xN
-¦Çª°ž¨»ÚhC˵ÂÖ}×ò;Þ¼–kaOÙFƒ¯º#£}š±ƒ‰‚óT”YØ¥A {\,|4É1Áe¼¼W؈×ÝÜXÃŽ•RÓϾ*m;øÏBóÅRôq }¦ýŠZ鳌ÉÙÑ9 œ‚bIlì¼ØV¨ÈµB%Ò—0 2Ž˜ÑqÈŒOÔ[u¬aûÜDãÓµé¦7æ&›¾(¥Ú-ÞÈk~«ïÃýiRëîN©œPF
-ývhT@Ac<
-Ê“6¸€ƒ;BÁ?[±"ÛŠ×ÝT¡a[¥ÜødµÚôúädcW(¾Çi  i}EUžóq%Ý”»¡Ô pP–ç€s¤Îávdµ£c…ŽA>ÖGùz›(6lœjÜ;^i<”)7²m©}UðÜÿÉ°Ìw>&õtÇ%4”»a†ï‚Sœ&œHs¢ĉe!–e;ˆl¯ƒÌÕ[±Ô°¥0ݸ/Wi<ê™kêQ•ž– %ߤCüç£ý¾®X¿Ž <p‚C#I‚FÌ2ˆc`7žb»‰TŸ‹Lõº8u—›xp{¦Òðlh¾ñ=ÝW-—Ôöà‚‰ß ñrïë¹É“wä͉ôúð;ˆá0@"l?:ÜçÇ¢àëHéö‘±./§î˜òí#3>o¾Ñü¶üÆ®O„W÷}Ž/€áê>{âcI_ᜲkôsíÅ,Ëp!Ýmú,Õg9Ï@ÖOØv.‰Rg“u6AØÏ$Ⱥ[µ5¯‡éX÷=õÚšëWǖͯðsòé´ül€‘w‡rl$&ÅÑ"’Ù—;$øù
-¨e;©Ž²5+ƒ»j¦K×´4Å’’ª^S5óx{z¶µ~q_=°a8ˆÞ £ie‡/©éÅ´„xX§ýj(ïQ@Ó¨š³‹áʨ€V³ò«f÷ =[rSÉPÔ¤tuE‚hÊx{~¶õñ {¯»¶/¼ÉÍ©0ƒêª/©½Šé‡â!=”ñk¡¼[Í8åPÙ&…­ÚªYÌü âÝV $7¥yMÄRU„LMoþgn`†#˜á#4­n÷%uŸ…b†DÈ@ÉøtPÁ­f*haTI­™åÈš^ʸ¥’°þ,—Šo‰„òe>OUåqÕ xà -"ßÝ÷8¸çøºgÿƒ3h.ù’†ÎPÌÔ—™€ŒÏMºôЬ] U,*¸¦WPWÕ2ÚM©”~K(ãÝÈd+\‘²Ê¨+x{ÙòÄÚ^o_=ŒN£iÝoÒØŠYz!ËpÆg†'ئ³b£
-ZÒ(¡e™^Êik{£¬°dÊE–DUÁÛ†áaä…}B»Ž­{_k_¶ý”—ÓœB3†sÞ”åJ(6úy<d#dÜØž²À’I .h5`U¡—ÄJ¨ÆUPW˜
-]É_f¨•‹t¥ª‚·Ñ--¢Ïï}Æ ¾¶×l?áå´mhÆtÆ›²]ÆÑk1¿m(ë´@SV#8«×Sæ•ZÊ‚DC©òÕà" » ¢Bj°Š]ƒÕâ*¬QTðv?ÚÚr?¶mïÃÈÎcëþ´×oðÇõ¿G³#'=cî3þ°«#î² åF-à¤ÑD™Q€’LÌ u@™ƒY°BÕP« †Q4¼
- -àí^¬uó½øÖ½÷£/[|¯½æ<Ä7ÿÆ‘sp%'ôZÒf#ä,ØÆÕš¢ÂDžɳ\ÌÂÔSæ8ëà2 CÊÃ:v™¤ãáîëDËæoßÙs/þÒ{롽íK®ý‚¼ãmÛxô¨Ãïû8dG»R!k¡L¨¬ä‚ÄBžâ›ÉE¶ ˜¦)3Tì}@ì¯Z‰d`”ˆîî&›7ÿ+õÜžõä‹ï}}¥}Éó}áTäUK8ü®Ûî=1£Ÿ% vBFcr²Qò„p„œçXÓL"Êl‹ *’ÍÔ"ÉDŸ&š¸[K76•Ù²ûŸémï~Ü~y5µ••Lìu?ô=ç£Z×ç µ“8¦°‘ Èò0 k§cw¡Ž€y‹b…ód+µ@²"¢•Ž»¥LCÓ‰–]î¿g·^š)5Ahì€Ýø]@å½Q¸»ã2””8ߌ±”4ÃNÉÐì`¶YÈe)68G¶Qs$’#Žâ¯œmh\œlÚùåtËÛÕró™èB3lH¿a”ûO$Þ+a‘çFTè&Ä.J‚ƒR’L,Ä ¦¨N(;¡1Ð QÔ1²ƒ–v iÒ·¨4Þ°inºé¥ò|óÑÔbó¹‘Õ-dYñÇ~ú·FN좃ºîaûƒ/aºÁÝÆi.(»àˆÂI
-JM(-9Œ"IJO¿EÅ|Ã3ÅÙ¦íÙJÓ/i=«¸½½‡½ô#)}ȧÎÈál‡ë1S#ä8ÁNŒ’œ„Œ
-&dp$&¢Å#|$b32A:3ç‡9>
-¿à%‹¦<$iÑCPM»‡ôÓöAcqdÐ<‰§ºk[cÝœûÔGÞÄ ¿ê«ÈÛ¤Yѧ®´¤Û—’‚ 9J©‰°6ä"Y?“1ᣱ&=·è„3.’tÖET•ì]ÉJ0L ¦)<Õ݆˜áuÌp¤í®á—} ñ'®´ôº/% Æ”hT'Ãbj&À§ûØHÁCgÝ0g¥æœdé¼sX]¶’´sF’aFG2Má©îÞÚP÷`3Œn»c8Þ¿ ?)ËJ®¸Òò._JÑŒ«È±ˆN…¤pÖ/¤æ½\Ú”›IŸAi¬9Ä_°S¤Õ²ªb$kçµdýŒŠlœÂSݳax3¼öÄ`<Ö_Vœ”夗]iÅ5_JÕûovç+¸éÀãøµ 5R!¬äÚƒBÒ¦nñu\¹#ô.Ò@33lpŒ1–%Y²þKÛÖ´¬½÷´öÖ_Ë[¶lË6˜$„Ù4é¥ Žö_1®}Eo}ÈÃ÷å÷ð»O(®ìˆE”"9_72èáÓò®NƘƒÉž°Ñx%+,™ÑCò’Tå ¶ õ#•„yž{hXûÈ`{ë‰a¿4'ùÄ–7øPeK(®"ÇÂ*$Ã}ÞxØ-B
-N½hã°J&.¹ªFä%9¢*J`mA ëG*é‘ÁûâZÌýó‡Ü]ýŽÇi­;­8ëEUÍ¡˜škàt@ ÷{dðˆKŒŒÙ…´) 9kìä~¦a÷ÌÉ™ò醪(¢k Bš~¤’þgx¥lØ‚»kØN(Ê?åd'Üiåi/ªi
-Å´„xX ¦ýjx W:epÑÚC›1u3¯éD¼r~Ïœ¸K6-ä('ø,ÍeS—¯$̻챡·l°o~lPì•åäÇÜuÕÅôøxXOÍøuð`¯.8”ð¤YN›ÕJ×dbö=ñ5P:Ãã)'»º4c]¾’|kˆ—ŒÛEåû²œâˆ+£ýØ‹êƒ1SK<l¢¤}FdÐ¥ƒ 5<©S 3rrETvp%¼9®T:ËéVL²ê1O;ZIÿ5xÊÇ›¸;Æ­„¢ú=iN…seôÇ<¨ùT0nkŠ…íÄ´Ç ÚtPÁ †ŠJ%4%V@3\í
-Kƾ”wÏ0åŠ)Fzœ.Ò* ó-ù×” k0ç&ÜÓÛÄ¢ö]iŸögÖ|°7å8áOôžú섌әôШF ŽKÕÀ„@Nqð4]Á˜ÜiD%DªqXª-TÒcÃ굘wCÙðîŽùwÄ ãI¿q·#çÜëÎxƒ½õq—˜µš¡AÌ+ô@¡[ Œq5@‘©†&}T±'©já UŒjM¡’0ÿ«°Àª5˜o} æz wÇòÒ¤õ×âÛ[ð{4p àvŸKXí¤¬Ñ¨LÀ°Ä@Í ôÔQŽ¸L×Bc§j˜ãM×8Y+#ëU…JÂÏVaÁ•k0ÿº¬·wÛVC*yª…C×Mhômg¯ïpÈêjL줌Ö
-öÉ,Ô‘‰:Ä5#,§ QPŒvèå?v¤ç =ùJ‚Kª°ÐŠ5Xð§5˜÷UÜŸz…¿’x©³?õ£7´ÓcñèÝM ƒ”RÚ¬ØJíã[€~Ž`˜ÁAÄ &d¸ÃH&Y#$c×0Á$¬¨áÅU"ËWÿ;üÒ[˜ÿeÜ7ÑuæÆCÁä+fsp·Oë­(ÝârW;*q
-ãÑŽîd„,A#$9Z6¤ÂmÚtoJ‡Zmio«=õ´a–²Áò³˜qS5¦Ý¾ëž|OííîÃíÓ‚S‚aþc†Oò¤0ƒÉ.v8ÎêŒÆhÜxâ'#TQ*LéI‡H²Lˆ¨Ê†ÚtÙ Þœõâ­YÞ–~Ú0˪²aý
-Ìôаm×=ÅćÈÓ“Â!A£)# xÒBª1B 3ã°ãQFg2óR!@˜ RÄÙ`», ªú}¿oîw¶YrÖ6[æiì+çaÖuÏc¦7ª1ÝÖ'†ƒ”R÷ áðœ9#lõ¤D²›úãõÕä}Çq¼N¤Ýܱó‚­ëqZÛÓNÅU»zœuu«k«@ÕzW¼¡ÈEAAP ÷äIž\ÈBx $„ÜóäFî$@BÈ…„„pAEV×Ôº9;¢mý-ʶ¿óÇûÿ×ùœï?ß««»Žíõ°¹½ôú€‹*9ÉMý‚8bÇÉ¢v¬:jÂh"(VVãÐ@ªýß ÝøÂõTòeÁ´ði¢ù4EJtäªÕßLpø„°»avwñk}n§ÏÅä…œ4~¿ÜµÄ1+¾=nÆ*ã(NUã´ý
-<Lµ—ý;såö¬YINÁ´èiBx‰6£æ
-«_ˆsøZ¨îîfFGÀìíäÕœµÜ°®Z)HÜB':ò!¯TãUr‚¦_JDƒ©ôoÎt$ ŸÌÄH¢\$Ò\ˆ„åV¿¨ÆéQÜÝ"Faø]|VÈÁaG­ ^¼j2“Ä#(Q6¢"*r¢*&!i"­$]0Õæ kæ ª¤Aš]0ݺ4!>‚DZòÑ€è¢Õ/®rz[Iž®Vº×-¤÷9Œ~ë`q‡L4Á5Ôz]E–Ž¶“åCmdULDÑD„](Õ€þÀðÂðû¤áOICVátÛ^ÒDÛA$"ÊCâ V[¥Ó+Á{º$°¯SL:šèQ Ÿ1hâ°GõŒ† 5M|CF•^k¥Ê‡Z¨Êx3UA¨ºPªÃi/ è ²¬ÂénÒ„di=‰ÛŠ¬~i¹Ó+ÃzºdÏ%C6ë@èÃ>k\ËáOÉX¢["†d¬™Þ>ŒÐ•q]i ëB©6gx;iØ°¨·% »
-gd9Ä Ù$*ÉMM¾Å//uxU‚Üë”Ãa«Ž›Äôkºfæ¤á×R×2ÙÈ•\o`·Ô×*ëXê(© §0,OƤAÿÂðqÖÙÎÂù.â„<§1*;¬ ÊO[úTů¦ÂãÑà{j8lQƒ¨ ¾.3&…Bö×aËí:AÛ8—/áð W=ÀæhûS ÿgÈÜ
-Zr-½Žs.‡éj¯)ùkjT´A©AdÐGOÐÛ¸7`©p–HGáùܤŒÃM$Õ€é¥!Öo
-…juÔ~X G(ZF”¨­ÀixX­ Z£Eªuò”–ÅiÀúÖ2`y/7eÿäZ{ü~dUÑðÔb‚kà·"UW¶YâÈs‰­e]-Ø¡ò5˜ ?×H 0 ´ M‡((#DDYa<Ê cÑú0EÂÕúÖPªÛ¯æûŠeÀöîz`]·óQ`Õþ±É%y¾©¥$4–)lóîÖ ùÄVîn´b»”ž:3ÕÇ6Óz&ØO3Òý#£ddõ ì
-dwÖàÇ6³¹ñÝMµáÓf_©’é«ÒÂ=8=ÔM4‘<d3Á YpnªÓ Ûj\ [µ‹e¿êbÛ¯8¹Ž
-'?ånu§ÿlÖ»hñ?‹ÖDo.Ì´Ï.ÎVü{ådf]%{j ß⌜ª'^@±Ë-ØèUquäj'­ Ú/Éòò
-mBS )`B€àŒmh!1·Á„Rc£Ó’eY’uß·dIÖ¹Òz%!ë°v¥]iu Æöpd0!L˜–ÌÄ$Í̯ۚ>ð¦? ß÷ÏÓ·mÿýHÓëè¾ozŽíýº÷øÞ¯'ö|%:ùÁWÒS»Ÿ¨Úë 8þ#à^½87Ѐí÷ñ`óSÍÉÓTç”]·=Ær‘{L&‡Êu”ë…~C*ßgNç{­i‚ë%8® Áòdp¦?ƒ3 §£ø¥x¥×׆ Ï\”aheøeh¤ šŸjOœy¤é`~¦î”ÜR²M×OU!ƒKrUœ”h“¡>•˜ÒD¯u”àÚ38ljâ,J0œÆpzÃè—ÑTÍ~¹¸Þ¡{ã&`jm™Óë˜Õµ³îkÎ˦Õt˸Šï«("¤R™(HÕɼX—&ÆQœoAq®ËqœÙË“Í2¹,Îaôh6EeãŒËX=7eð¼NÞ¦ ;63e0´uÌêO°îëÎɧ4]¶«jn ¬ÅHµ"Q«RÄ€vÐߌ帶l–ãÌa,/Ž1 £Gð#‚ÇÑÂŒaõ†žÜ”Áñ>ehi3~Ø1k<Êž1tȧ´±iØPQÓ'5²D^©LRMé±lŸ)‡ñl8Æq(Ë›G¡|šäã „ˆ0#x˜ËÖeX
-%–Ðàh¿>ŸéµiŽ³”fÊqf¨Œ°àbˆ5\ð³ÂÉæêéߊyƒsÛ&`Ý`ÎÖÚ1kû{ÆÚ¦˜4ŸvTá¢/û“„AšÉ©åYLª"2B™î5—“=Î+ v°:Ì‚*;\òq`r¨!œ=Ñ\=ï ËÏÚyƒ­éÀœ£¹cÖÑÊšq’OZO:ªæóᢉ/˜ù)Â,Édu²ªPÒbM9É7ÕFz\W¶ÿj¬z{Be7&¹HÞ΋æê ø(ƒÿÿ†­ À¾¯un°é̬³™ußyP>é8â¨Z?­]ñ‚µ'…[E(f”à£jY1)QUããµoh"Àõ^âjN^¨lï…‹Ö^$oæGsõ4o -ÞßÒ€‹28ö´>uí9óȽyh¿lÊuØ^s´‡KöOâ3…;(jçÓzIyD. “A¾sÚÅ÷\·ó5KT1÷ÁE£
-]QIÂ%¥d¸@­•¨§ç [€»±å[ߎöA;.}ï߆w™®…[|•pRBÎ\ÎG;ÓÙA¢š×-œÒÙ¤÷”û¹Þ}S¦ñKUÁªT*Kå0)“!D=
-É×Ó¼áµg†w€oëþ‡¶œø2º¹óoÉMü{Ù Êir³e¬¸Ó‡¢Å¢#ç3P„S
- ®ü}ãðfïjª×;8Áwy¯ñm±>3tE`—úuÃ…zAÊ
-1*Sï¤öÐ]ÀñÁ¾S¡ûwB?6oí?¬¿†¶>Oo~~´ú¯˜ŠúÕÔZÜJ^]ÍrùrjùªÆÒ[µôâEóÛ›bÌ.¸Aå\¸ÞÔ’wÉͽÆáåÌ xYóbþNºëÞ²8¼ww`î—{-CÃÔàÃpŒlI¤nFœ'¼LÈǬŸ/F>Í-/û,zT‚B¬^ªÍÿ¾“÷›ûO>{¥¾.ë™ù€Vþ~1ã“”v¯…tnYHÞI×½{Bc{C¬·ö„ªßü: >g‚ÏŽPÀ‘¨:}¦$%_z–^´‘UðS~nÞË¢üìeˆÌç…Ϫ‹ÒÖÑÅçÖq%©k„Ò”IeÉ?RË’ž6^L|Ê,OxÒri' î ±ÎîÞ¥^y/ïÿŽ >9Ø
-²R7
-×øE¨UneÃ2Ç^dQDóL†r¦‘Ó9Iå÷Œ‘[M#D©%@P؆ñš~?Vçô£N­ÍéÁØ8 ÆÞoÂö @°A$o á@ ŒÔ (§pMˆ@­ò/6,qkÙ‹¢xŽÕ¤šf°uã¼Þ*d %v½ÂéÇk\CØn׺ÏåÅØ\ý›Ó‚µ9X»£gïh… Ò?…)lÅ„(9
-ˆÒR7D™…k­P«PqÿŠ³ÀÅKf9Tõ$«Y?Êàö. íñcˆ(w á5îA¬Þ3€¶x‹ÛŒµº{±6—gsváíŽ`ý× ;òƒèl¤¤lHÓk’lÔª¨ a *ç,ðÑ’Y.I3Á¡÷Œ°8–aº ßO¹‰rÏ
-á¾6q[“Í·—µO¶ÕèG$$‹_ÄpyØ¿"žì!hgTÄîñ6’! !›E f_+ÅâRl.ÅîÖ[ƒbÛðuÂÅ©ã@ø¦36÷….®ü}"~¥'¥ñ®>‹]WØ6£­èSãLÃ
-ªÃ 1¦fñŒ’¢™Su<*šqˆOëóñh—fuqi6g°€ôA±m8ñ%h?ñw =™
-Á?Nû¿Ù­ó·¤<€ãø´ÛèöT3ÍîÎT¶ÏTNóÔÔØ”ŽfšWZi[¢y噡r‰x Š((¨x¡à‰J¹š ¨¥!x$š)¦™æef5­•5M§Ÿýî>ósüûÃû÷×oÄP‰Ê~™Ã¨w8 Jÿ÷W1¯4G£—u'¨‹CžôÙñ0ÆàVЮ#ÕÔ«š%JFWV]Ö
-”œ¼& 7·Ym((C Uÿ5XšB¥ý~¸dgr[7h±õ~¯± }ÑëùhÄ87w*A?åËÕ‡‰ä:’LÚž¤6³4œ^or]ÑÍÄúÚþäªú¾ÔÒ†¦XÑ&jìL/RiY‚¦vCAù©…)TÙþu6‡Ae}ì£Ú
-½¢³ñ{4â8=ç„Ó?p¥kï¢ùòÁéõ¨ÚbÄPÐÂVg(3»éò]¢¼BGi¸¬K”É{h•ŠnzicgªX©eˆTCýÏPý½ T!Ù¡} ·´†ÖƒN¯¯t[¶>59wèìÀ#;’vÞ‰)¿ã‘/)+F š$ev+«•ÕÌÓ¤(ó»’”’.ŠRÖ«PtSj]ÔêÆΤ
-eGr©Jc(¨D 5f&P}Àj-~„&s‹wûlŸèÍ&çÌÝn.Y„hžÚÄ)æYÒQtÁ…вüÒE~­£Nkb´r[iWrÔÔa;¥¥¢=¶¹VCjRic.«´ñ—TÚ„j•ÆP E ²&Pó³)4üô´í6_¾±ëàÔÌ.«›K{OkVœW<>D‘Î:±Ew¼òóôa’¬>rç:­–ÙÁlHÖd(ÔÙÍqm‚–˜6Ér[uKT[ý|ks+Au¥•tÙpP.í0™ùVhúaÇëîí»f'¶™ ,í´Õ¬ìñR¼:!]:œ œseåŒûäp‡1"ö@L)ãF¢”¦K•%t³þÛ•YÝ‘×@ìÉ Ú29¾ã¢Û!—‡kZÃÛÔb¨ýÎ.ïúæ£zÛ–…‘¯7.nÞ­YÙá¨ø´Ç[úÊ"BôÄ>žß‘1íÏcŽEäÑG¢‹¨C â¸z)¹?­"êWŠïãWc{5:± £«Dª•ïUÕ„ö¨/
-j¿DAÝ?Œ¡iÛWÏú7lZØð7íÊ·û«;œ¥°Ï[ôú†ÿÌ%š½ˆNJd&ÍDrâ'IYäñø\âhRî6£0r˜-ÄÜʺ6”WªŠCô¥’`}UI¾¾$Pß,1ÔoDAÖ/V:×þe­öņ-ŠÕÍû¥`æ,„žÙoíƒY/ݱ)Ï|ÈÔÇ! 1ÃiÄûÄTܽشˆÙDöù™ιét^È73h’Ÿ0!àûß-Îñ/Ïñ—åúŒ]6(Ö£àê†5ú~c#턉‰üÓ—¦R05Ânûl°:™¾êâCçLyí!½ Áa—1Q˜_ñäsOÉq!)” %5à#Ñ‘ä÷03Ùg!—îý 0å̃âTÏûå©èû2†¡^6£†:×¢4C_Éç¿XW ›L‹à»³ÀÜ: ìœipÂ=<ÑÄU_ßðAçÞþð[T˜ßëXŒÏ+j„÷Jr¤×K&ý‚óx‘‰?ý<—pj¹xrYåþï
-’¡FÚÖ ÚuF5Œ¯1ªx»n]!üýÛL03c‚…y8Z‘áø,œvïcApÖÝBÿéá^€G£äubÏœ‚ï“«É>'>±ýŽäùûsÖõCa€Ëûâ@Ci4kP z#Tù=”‘
-|G§F¼¢1£—©<êSJ^ÊR¬0ý!Y’±@*çÝ'VeÏ.åÜÃÕçÎaù³‘ͳ×
-f»3áý‚éðaÁíÈÛCØÏ÷Ã6bÈ@ ÄÀF LÄÀr†Œp`E½eR°+)©1Ïhœ¤ÇÔÆ"¥0ãAlqæ<¹ŒT•;K¼˜?C¨LãESØáT¤Z8q]41(ÅÞ ân oào‰>dl2.bà"† ÄÀ>c ¼@gàaЫ\Bðï¬XÜK&=î×”Œä%?}*àÎÇ_àÏÅ–æÍ¥‚iÒÅ¢IbhßX<»"¾‹Õ õJF±ƒ’Aü ¸—0(é&~>à ÞöµÀC ×ïëe ÙÎÀC¯fáƒßpcð/Ø´ø§LVÊbJû-?k.A”7_"˜Š©NDËŠÇ£ê%c„Æ’1üÕÒ;¸Ž²;¸þ²AÂͲ^bYgT™†ôù€‹2Cbà!†,OKÈ=ë yçЫ¹Øà7ÙÑøçÜDÊvZêC&3OÏãÏ&L%H„qâ1²¬ä©®|4JYq›ÐZy›Ð-Õû¤½¤>i'’:ºOÚJþ|ÀCÞ> 1d#†Lă¶Ÿ3‚Ñ«ùáÁor‰„çÙ”„ÇÜTæ›Ã›cääM'M$ŠÅc”òÒÑØšŠr]Õ0IU=u­fˆØ#ëî©é ÷È®ÅôÈZTÿ!¼Î¢š<Ð0ŽãŒZO¶sj­Óžq©kuÜQj-Š‚¸€"eA‚‚€` @XB$d%!@VI ûö%$lj@A¨˜A‹ VªÖGíè;ß™éuzñ¿ÿݼç</¶Wæ-¨D 4ÔPµå  ¢Æ‘-ÀŽÜ ìaX‰ñ¯kSÒžÔdá§hù¤»äÊ[djíÍÂZÞ "OxÐ Âɤ×Î+›3 -ç:—³ºÎó]­VlW«1»«UƒëV´áº[¼TÔP…ªQ-h%°B·
-o††ƒþТ𘷢èÓÏ›Nb
-“ îÕeRÆYD¦‡^Z?D©–^)æª.ç‹uñZB°˜5y³‚h5K/X¢ 6Cc¢Úuõ…­· úwC-j`ï]õA›@ü=HÙÑèw²ÌKYLÖ#IbþdSjÙO‚lÆ?9…ü¡Š´¿Œ¥î-;rµ6MžÉÖœo¶Š ,æ†B«©¾Èfä!†:¢ç‘ì:oýÏÀøÝÀ X {7‚$pȃ€âpÄZç•QéOZãIÅwd4Oc÷
-‡,é¤Õ´™És{¡Ò.»`p4šÉb©+¶š¸Å6#§1°K=«Ä®óÔ †ZÔÀD ü=Ë iÏìEà~PÿÐ?­ Oy¬ÁNóÿ¥9WzµÏîJŒLJ{+•m•É:ø%:'‡l´³JÍVf©Õ\[j32JmF)¢ÿ£€þÙ `¢jø/±ÿzhÙ½Ô  :úÖp(æ™åXÒ”ýxÚD;lN/éUg³ÌR¢XÉ'·72vu“³†¦sUUU•&[Åb®¢XMU6cUb@Ó{ëÿ†Å³„»¾éwë@¹Ë4»À¸ïð4r â±+,vòRLâèÅS™}ŽÔb»>‹Ù¦$ˆDbR«žf©äÖw9Wi­ÁQ^c²UT›-U3…f5URmÆJ*¢÷0P 5p¶Ì‡ÆK@¾ý Þ± »üCö?ï
-ê ;61|âøµþ„Œ®î3$½-ƒ!ÓášxÊUF1‰xöÜ&µó‚Àà(â‘b¦ÙJfX,¥t«©´Úf(«FôÞ‚ÚOg
-sªÞjÎl±˜³ÅV^h3æò‘k×åsZo 5pϾï ßøwÐl\öÙ°úÙ¥Íëîì\ë¹½{Ç•ûÁ‡;ï„ÆnE¦ËGãˆu?&S¨ƒì‚>|Sv/¹%½³V}Æ)Ö$;ÍšÓF».MeדÛuçEmvC‡'èh÷°QCÝ¢Yаésh]÷×,šî^½trxÝ77nû®í›úÎß9µ7Lwÿ@¢ìî‘,ÞDdu,BºžÆÌ ²Ü%â³kä§{êÉ=ê–Äîe’Õ¥:­u©S•.uºÜ¥Êt*½ôß ÉÚ¿BÛ·ó³/ûÛÔÀ’7&V,tOmÜäxº}Ÿöñîéà o*ä<í^DAñxbyÞôì0“>P,8ÓOkĸ¹¢D·Tœà6ˆã.÷HO:{å‰æ9FÛ#OV{x¨AˆšW~Æ%Ÿ=½´à3Ï­/?uÿ²l©ýåúmšWÛ‚%/¾æ=J¦=:’U|?šHœÀ”deP2<øê”ëELÌ…“pY?ØÀhœ´ñ¸1û…±} ñÖ¾Foà/>дp¨Ïyãœ7gÔ3w¦{jþ<äÕÒUíïÖm—¼ÛvûÎ?š6œTòäXq*6;‰ÉϸAJ¹•S†+¤$Œ–Óâ<ôê˜uôè #j¤½6rÄÁˆ`D 3£ÜÃ,op®HÎÓçéûøOî±¹³m¯¾\ †ekÄ°~'üÐ ¢äÍá“Ä‘g²ŸÄg¤=Ä`O?H'œšÄOÞ½P{‡\3A+‰ú‰EŽ¸%,ûa\^~l\ƒf/¿ZvllÌk úØÚæÍéœãsipŽíÞÜ9*XðU,_Æ۩°#°‚Ž߇EcßDǧMÇ'%¿HNIxšž÷+ö\Ì£¼¬¨‡$lÄ/¸ptl…ýÌ%ý¹17ô~K^È} 1dÒN<<yÑk ûÈgÔ:Ó§·w¶åúG3”/?™Û_Í‚UßV‚ïVøûçÁÁýYš
-Qá§ÞÇý—ù:‹júÀâ8@ϙΔž©ÕZt´V[p´Š
-JŠÈ•‚,Ê’…,$@²“…DÀL„$ €ŽÐQ¬£U†"{A”Ê(‚ˆ"¢ "Z¬ŠÞùŸÎ3yž‡ïûçíþntÂ;bìñ7´„è×i¸£ó\Bø+11쥂txNEÁ¼Ð%…Ψ!³fZðs=èycràÌvi@¡Ú~Z‚jê^‚ª½»ÔÑý‹֬̆M$°k ¾Û•A>d8⇃ȀXˆ ‰<&(G¾‡dl±Â1À?’È ʨÀ÷¹1òù¿3?ðÎë÷Ö÷ÝÛ3vë¼à€jjqBÙn8 J¦–:j`ÙG'`Ý21|»š ;7Ð`ß&øo‹ƒPÏhß1ÞG a}C )Èeðž¿dD#O«/¨‚ö6ØŠƒ½Áâ ÖP{]¸äˆªéF¡ Ã(”þä €åKù°öc¸.#»K<x­ßõáàz0C |s
-æ B û9þtú ®‘;“ÐÄ{–p™?ß*˜ŽëNÅÞNÄߎ&Œ nã
-nÙéÿÇðåàlw–Ÿ pŽ¸?Æ8_àQC€Í<
-LqÜ;FVâkú)ê+ª>eŽRÆœ%Y8ωÕÜg„zþ4¾Q0…kMa?M¸–ñ4¾7ãqüŒ1콌!Ü}ñ ÂXÆu;1pC:b`û­Þ!7Ey‚‹!%x©‘Ø„·Liž¡¦¿¤¤ÍRKØ33ošT-˜"Ö‹ž2žà›$“¸+ÒIl›l2¡_þ
-N¹‚*ÌÔ1hÈÅb ‡½ dàç¥|Ú Q&ëO%xÂΗL¤–(Æ“+²ÐjU÷) êQÒÅS÷ˆ×4w‰75}”M{Ò€¶™6 ½DÐ6%hÏ'h ĈAˆDˆAºœ pÍá ‹òm|(œ"F-œ¤ãç•lú¬Tže '¹Zù8«8kŒaVÒm§F’µÃäËùwIÝýI7
-Úiýú«ô~ýÅä~ý¹”~}ãFÁY;AÆ2ýÍ ÄîΠðq¼ƒß@Á¡íP±ôÇB ù^“„›W¥Ñf•ΔT!žªÒ sF™¦¼‘›î.õýJsѯ”¾âz¯áJr¯á£×ИÚk8“ÖW\Çì+ªe^_4 1b †,oÐøŠB·!Ì ‘APwô}A"öµ†NUqØSJ©xBrR9ÆÏÏaµCŒšÂÛ´s%ƒIme]ôž²+ŒnãùÔnãYf·±žÕSVÃî)µ²)©äô ¤ˆ!cµHÃɽ_€Þo”ºCÆŒáP%Øøß ÉI/´ Ö”J z¤P*ï‹5êaniÁíÔš’›ô¦ò>Z§ù*£Ó|ŽÙa9Ãê°Ø8fkz—ÉÂí.7q{Êʹ=¥‹²O@‚dˆA½û (F¯£ÿ0ïËa°DY0ÅÿÍH ÍÓR'uÁ˜Jª¸£P©¯‹
- ;Ó-ÆÖ´³WS›­çXmÖzN›µŠÛfµðÚ+Êù–2~§©DÐ]ntëƒ1ȃÆk%”ú~f¿o¡2À ª0~PŽy]ýÜŠÅ?¶é÷K™é·
-ÄòÕ‰¼ÖLMÑeQ©©‰k«jä\´Õr¶Uð[kÊתK…mVƒ¨½²HÔaÑ‹ºLzqWùb1ÈCæÖO@·ës0ú¬ƒ
-ô&¨ö÷„Úß·uaÁsõQáOëããÔ‘Éÿ©Leõ”ðå-ZyÞÅUqƒ¼ÐR+®¬±
-ÿYg¶Ô•ˆ[j‹2Zkô’kUù’6«NÒQ¡•tšµ’.ÓbA&b#åVgÐïüL{×BÕþPë·ÎzÏ7òöÃÑCÎÅF7’ð}µÉÌV3Gv±HœwV“e¨ÎÑU”+ÊmŲœ.5ŸÖÉ[ê4òŸm§ä­Õyò6kž¼½R-ï4Ûë†UNµÅŠ<W€eϨñq…Óh÷wwÏõ}ò¯ˆ€±+ÿå»Î¡NÜ
-RÐÞ9(1ÙBìN¨7׆Ký/ív¦o»œÍÿîó¶šêóuí¤Q{Ú8‘7#ëªNg••&åeTdäÖ¦äT7&æt6%e÷6$gõÕ¥döפf ŠRyCÂ4®¸%ÒІT´!KOJÑ¿·ú5h:¬ñã†Åþå.›ƒ¯úqƳ#^؉a¢ë`o ¥£ƒÑt=ì\EÃÉÌË¢³™‚ åIWóªãŠ… 1Å·c îÖÇçöÕ&äôWŸË¬JäUžÏ þHGÒІ‹û7ƒÀXjMv@«é®o¿Ö\ê³Ô™sÒyöÈíÐÈ(ÁùÎ`€ÿõ;Œ0QÇñøâ¶\~S\~r]Ji¬(§*J(¨ þV!è«.é¯9U0 ŠÍž¹4\Q,ˆ¿x¯\¸€6¤«®ƒ\MPi¸ ”¡ÝPõSÉϯF,~þë©Ã®ñ)Ó o§[#d¿ú¡ Ò^ΙKii7Oçĵ%G¶d ‚›Ëª˜Ím"Vàè¸p°*¼lHU2\](Ääß+;•_"àn•.ÚP - ¢òТ«ø½KWéX_iz«ðhÖVýÞ_ÎF·§¼Zù+ǨìËbV o ,)¡7&óD÷ùü.~ ý÷Ò²ÀÎë唎{åôkb»F,©¼WZv¿,âÊÈՈɀ‡6d  W´6@ݾMЮ)÷a`ÜÌcmÙñY£mÃó–ÚÝsŽ¿´Í¸;Ô<'z—<¡ñ'‘I„ÆÇŒžL ½Ÿ˜EósÄ¥~âë…$ñƒBÿ®±âÀ¶Ñ’ ÆÑfÍX G8VÌ©+’2·HA–Ê:h¬‡k{d¾v«ÈÌ+I?œU—\4Pí|e¡Ûº`o.zé‚+þ¯'‘?C¢'½ †~|*l*úc215`’Ï#M–ež´f&Çø>#rH½¹äŽñü€¶ñ|jÓx>­A2࣠9Û1PÞRíÊë¦îoÆ<œÝ‚x­.ßñNWóÖ@øÆƲè5Î…ÿʃ˜ü‘vz!0$lÅœŠ œKHð›ÉH"N¥â_Ô¤y=ïH÷zñgþá—04™Aìy’éÛñŸ,¿›’ÁEyŠÐÝÙ¬,õ´G} ‹ô¿Þ"}ó³ºbãg}ÊOX£Âe«¬eœKò²'!v™D _¦0YïÙÇ©o£"È‹ñÑÄ…ôÓø¿sã¼^–Ÿõ˜kJ86×zšà99“àõ`æ¼÷Ðt2~@2È“C ByvK¹ß¿éEÚ?)ÈÔ¯ìÞ&XÕ׺¼Š5Î\µµL^sv:³æå±F"±¾ÐþeùŠd?œ Æ¿K õ\⇻¿)Št{]uÂe±5Úyñn4nq2Úuîe´ûäüI÷Ç 1’@á&dº ƒŒt®Gº‡e¶ÉRµðÓÆRÐØžZ`n˜væ±àbžÎ, ºS!OþÁ"ú¬†“½¿Ÿ
-ðøšHuû rùœKÇ}*e:.×°Ž~¼Ávøx—cÿñOÎÑ¥Žãë$Z"ÈØoäöi¤eLMoºʲ—@[™ F{áˆ^ Ø™„ÎœîÖð±÷Š˜.žzìD{¸@œ—ú…,‚ýËDÛµr’ÍZ¯õê ?«Õ²ÕÊ8Ùrå™DÍÒÝA® bÊǤðËfL6¨lLÅ0V;fšÁ`¥Kƒ£†dp3%
-œ, =‚j]Ìຠî¸b¡O¢žrí‚TŒ!HÞ4‚d€¼T2¨­-¹pÐSb‚±j
-—ÍL ÔÜDFÐrÄÚ$jí@ç#Hî$‚¤½C´!×±AU&46Aw«'˜(¹‚ÅvG°UµÜNkpßõ+àÕÍÁo5SÓB´Œ!JÛb÷„D}àîÓƒœýºP¤»*ôöC•D•}èüqI™E3€ a°QŠòÚá*ëq°GÆt7Zƒñ¦#`&gV[ÃVpV0wEÀÿ¤¾Jz@Ù¦ å}²}/DîІØš¨¢.£Ý£¶r%‚`U 0µ¤j(6
-ÀpUa/S Í1f´-ÐÏá€ÆuÊ%oð/&¹Ü|Eþ@j ü ¶R×|Úi«„ÛA«„ú
-~ŒñÍû9ã_ïyÆü"ã á-cžøŽ>CzÏBT0ÀBh2@EØÎjp¿BŒ „eœ(;`žuzºP/€Rè þeþ@®¢¬ùÖSWI-A+ÄvúwŸÛÌï>¬o„¬/øìeü<{Ég‘½@|Ëšõ]b=ó{Ç–Ž£ lMi2Ø
-øïÝ€èçñžÀÝë¼µÀö…xr Ð9{€"=qéáŸðHÔ{\vÌ[laSBzYF¯¢½
-»Hz1ÒÊ|ÒÇ`öD>eØ1ƒÌ¦¨¡øëXç 5Q5P7y
-­Gî,`Ow&ºã˜ËÝ iÍ× Þ8 ÿ…`Ú¹Ìû} 3Ô Ñ»ÞkˆÁãJ&ö¹DDâ§0³ ¼Gôñ’MÖI¨T:ð ©wc;Óê‰éçÈíªrj»ª”Þ‘nct¦3:S ˜])ÎúlˆG ìen GïÞ Ÿ™`Þ2²w,‡ì o°o~g‰üå•1öàˆ–ŠAg[ÜÃ$³K åÛÙi½PyƒR¦úƒT«©'5kk¨ÝºCWÂlÓÇ·iòYíê<V‡*‡Ý™æ,àüm˜ç
- ^S uåW€øÌ€ì-ó wÛRÈÛ½öCÞßW¹a#ÙÑA&RXoïH•0š’Ò×HòeNNZ-³D[C¯ÒWÒ‘ÓŒäx¼ÝPÀnÕçrºln›6‹Û®¶$t¨œÜi.ÀB ‚ÅS@…Þ½æõÓ w³',†¢_V½)Þ·a´è°ÿãBÌÎÞ<â¡V33æ–NÀ¸š"Ö&iåÕB‹ª<¡0£”]n´±êM…œfS.÷žÑÊkA,|»ÞÄwèŒü6-"hW; P{®+$þw
-h— Vïo ý7Šý½·mûß؉=ëOòë;±õ~1þàí#´˜+™ Œß4Rá¯)iŠÒ$D},1×pTPj:«µdñïZLÂf"ºgÔ‹ì† Q«^'rè´¢ûg}6pPƒ½q2–ÿ r¼= èÇY`Û<ÿMéV¯ggv®ê¯8°¾»<Ìÿî Ü?
-ȸZ+›Qˆ„'5
-EaŠNsDfELÒヸƪ“4ei¥wÍjis¦ZÚ‚¨¤v½JâÐ¥KÚ4Îz[pQCò‚²ì 8ºÎŽm˜ñ©Ô×óe¹ÿ¢ÁªËú.ì[ÕZuxË2ìþߣ«Ž2é¥Y|A!’,ÏÖª5HšÑ(‹,©Š_³Ê[V¥âŽE©h6)å-F¥ÌnPÊZ3”ÉmZgÿoƒ§+È¿› ¦¥S¡à‡¯ Ä{Ú»3gVÿ4w nÛÂîK»WÞ¹pè竘}çJ زc4Zq—ŸmËÌTµJoDäÚ|‹D]ni®[Ū;Iz³IšÚbLJ±’”­ÉŠ6­³@€PCÊÜÉååÅ«¿„Sk<Æ+½§ÕnšÕ×°u¶£aÇŠÆ‹ª«‰Ø[q±•R(¹ÇX<c¾(YuD¡’Y2 ÂÌ\3×x:‹e¼jå w-¼Œf“@Ó‚Õvƒ(Ý‘‘˜Ö¦uÖg5¤£Y2l+¾øT¾òß/.¬þzàª{O“ßÌ;Û—_¹²ß·¦.lwi ."ÿ,‰d>Åäjl|©¬(9U˜¯Ñ±r³´œ“frÎ% 5»ÙÄ0Ý3²„£oÕ'è:ž¦Mã,þÇs&ö[W8ŠnºR¯)UK¦]^6õaÓ·Ö– Ó›—Ö6ýX~%dgñEl¨õ|AWIg)ÊE§¤
-Ö •šb³è ÇKŒ1¶‹F|q B̳(ÖV=ÝìÐ1ŒmÚxC»ÚYˆÄè†0 ¡;âÌ‚Écµó&÷ßüε³k±ëíŽõß\¶,®º³ÇçÄàí¹ ˜`ärlLj•žxžÃcW‹¥”Ê´|…Yuö¸6¢¢NQîÐaK:|a›6.÷¾†”Ý®¦X:ÒbMŸfôí*™7éCõÌIC×<\:»ÜÿÑôç’ÉW{}ÜÏwù/<íص®àÞÁ
-á.…r=3þ¿'CúM*${yæCô½
-„É8ÆüHè—ÇA³6 ªM©PnK‡|
-g#/Î …Ÿù¡HˆB5ù™ÑÈ]Â…eE*LëÐo–@»Cõ^Tßi <¡ƒ¢N?"»–1,ýÙøVÚa÷;¨×ÆVõ€é>ý&ó¦fÐ|U7h¾ì
-c½P’ì‹2A J•¢±$7‹?OCÖj!Lä0lSA»Gú°~DuÜøAYgV\7¿•?²¼Q¼´tR½–6º?«Iû:û?úœK†œ 9õÀÌ4d0 ³\`å°Qå‰rî$T¦OC…l6Vh£ñ¹%<XËÅȪV´…†a·þƒö é=}ÜüNUŸm§þ›3¨|œÛ£êÊm×¾ÊmÒ÷Y¯úò~2öåýhêË;“Ù—wÊX&9Á4Íæ,5+ÃÇbu¼Ö¦MÅZI(VÓQ¨0qQjå¡°Dü>o eÏÙÄLp»ñqŸ¥__›Ó«ýÁÚ£¹’×I7ç?ÑþŸíúŒkòÚã
-·eûì¡âèz¨ðv„©A;¡{à³€àþžMóyKçÍPäa“Ä,ܾˆ`ˆªŽ¸BÑ…ß > ¢ b'iÝ‘/éí¸Œfü F}ÌKF-á%½:v2±2v’fŒAçi:OÇ¡s=½_Hœì`úž0ãÈZ¨:±*¶J?³÷,Úm:™ìý‚Ë 20%áà Êè§qùqC„²„hmâݨ6foT?«'jœÝ†Ÿà4Æ9uÄ NUÜ»<ÞÄ*‰ÁÐ^š _b`4šâ0ò6YAù÷¶PõÓ2˜í²æß4—ã·í]fˆó”2Òe\w|DÌ xŒÃ˜Š˜~j&¹‡T˜x‹XÍú…p%©=æ6òsŒŽ×@4ðjâ ¼r’ÑÇ“
-)㜠[`b™cí1ï` ië,¡p£<»Õf;/êÃ_ý·à˜Ã
-|§ÔA;ÇsÃ÷ëT!5஘‹íáI 7XçÚó˜- eI$-¿>¾CX?˜\Ij(c‚ªžŸO3 ¹4#7›6ÎÉNœ0 ÿŸ±ÆŠÑZdü{Ìß½\ù±ÄmÍl©×·¦ÿm#Å¡ÎC¹Ñîýä€.9 Û!ƶðÔËœLV£©¢]–Q[Åj¿¤6,ÎKeÓÇ„™ =ÿ<Àd0ŒÜ Æx’9hËÇ@ZöjK˜²Þf¡{£p—Ý?¥û–½«pùj²ú˜ƒ¾ÆwË“òS?Þ+ˆ<Ú•çß¡¤c›S‘X­8…Z-P²K¹j~!»B”Ïl’æ0{R2Y:©Š=,V²G“ÏrÆé=/mDP\s`z¿Š[k “ÐsBŽfÉýÎjv,œ«t^<{ñÀŠ ­Ûj]½×7ªwÿZ‚uë¼@ð¿šE מãÄVÊET$£æ²x¥b%RŸ’ν)S ¦È$¥"£B¢ç˸DÆ5rÍñhÚ·xèþHGû¸z³,߾ோ;í^5ìY¢ovYñ¸ÉcSÿ%ÿ]7+ÃŽ´jð~õjrXU“P¬Pó©l•,S.)’ÈDu2qrgªHô\&餢äa±H8š,Œ DOÄ7"æ@š‚Ö@¸Ò*Ñ,…ßXþSµÕúÖi©y—­®}ï’-îz.ûíh¯ um¬ÀùÖǟѨé1yÙH‚J%e+Îfð%Š b~jŒ›Ú–Ê‘ÿ!K’餈tXŒHF“yâ1_dàñ“ ˆ9´iè9%FŸçWa`ÉF‹¹ÚÍ󦛭ôíNÖoü¸¸¿ÝÍáÆUß®6œ>\w1Ò§¬"6T­¡âUŠ"OÄeå!ª<3£2%QÙ*£f<”%žÕIi#b–|TÈ– 8)GjDÌdtm†½”-ÇÀôÿ,_‡ù«ÞÁÂtmƒ…®k³Åƒ®]_t_w]×ÖæíÔÐ|ê`eöDAmLpf—VÆ"‰Š…tn‚KÏÏRòÊ%q¹Í)±y¿I㲇%dÕˆˆznLHK×óé
-B—¹æ@
-º6¥X†êå
-›TšÉ#””$ãJšÄ‘%ý"\ÑhrLþ˜˜­çÇŸ7ðÈJ#—rn<ɘ€®Ï[ŠÊ%
-t·YŽkÐ2´4ŒÙcªÇ­‹G—f»®Mûó„cò³Àݬ?ÂQáÅ ‘}#Ù!ƒâÀ‡á'Gz6⼆úpǧq^½o Þ7Þ}¯½Žó»ò:Îÿò¬Y0y!˜Î`°º¯X‚¶NKÐØg jŸ,e¦ULÿ²9or^!Ÿp]/?îÈ4úí$BöâõQ.X=Éã´žå0&òõÕ+¼ô…Ažm°‡±;ØÝð2Ø]÷>ÄãÁ‡0ÏÞØã·ÞGzýbLà©€;Z hkµ
-.,* ‹l!!!{ I „7Šk¬KGw©KUªŒ#-êX+:–uŽíA=zÎL[·ê8¸ ‚
-B|潚«ô|çwñ]=Ïû¿““ÿhi²l´*5{¬.]0ÖÀáºwp3ÜG²ØN RqU˜‚ç"Ö˜[”>
-Ê@qH*œó’±tA<Ö†Åâ³ðEø<"Ž\ˆ‹‹Âq+: }Ñ¡@Ìï9ÛFQ_^$ùW)jÓmŠªHQµ`ReðgÅ ¯|2 Âé2ÄúˆÁšÎ$„SÒ ócA3-†éq°Îˆ&È"QëŽ5 °uvšæ£en .ÎEWÐ\ôÏA¿GÇÉì%w°‰ÜAÝ}Šª¤(h”Çi0uœþ^BÓ¸÷f#†ÎB#lŸX𘋠fF@>> ÚñóaœÛÄ@TNš•“ý±qÊ ìòýGý¦ãë©Óq‰¸2Í“ý$¿›äß¡(çŠ2»)*%`Ò8¦z¥ d±¥E!Ê; qÞó‘L›.}6DŒ
-ø§R‘u– ÞÅtð:3À½ÆAæÝLd>Íç 1Êy™ïà
-‘ùJ ®'ÿï J¦CšÊ€‚ÄFâ ­ÖKTaPÔ-‚´!’ÆDˆ›XK…à/lðÏd€ßÎAV'ɺÆï.ÜgÄ Ivg‘|ž›Þ[xýbd=“xM°ä‘4d'Ñ¡`1 IgB'öƒ^
-ñÑtˆNf@x&‚v.Yàwg!ë>Y½ð†·
-A¹1ö’Å(ªIy †-|èv‹‘{8šTgP^R¹WÕï¿hÞÊŸkï4OÔïµw´£yÿÌÓý¨wë:ó?è.<C>Ù)´á4˜Â½a#*¢}P›2Ëø3±LŒ}*‹ÃQ™Š’ºÌÖáhA£dÄÐ$§?¦ÒµjÞäžÏ}­íÌëÓÜÔõjžèz´oõ¿æºõïW £¦Ë¦QÓ…‚Qã9³g0"7ŒËÊx£&ŠºäÉXÅ›UÒ@|œŽe渱jGÊ°s)w°tèuñVé+Ëne¯ù°ö©±E×c8“ÿ8ÿ²á‘¾Ûx_ÿØø³~° Ëð®ðï¦aK»yØr®pØÒf.lµŽ˜=‘tГ|Ù{]ÄŠ:Ö&NÄ'œéØ=ëÕ¡#«1ƒ+m¬WµU™Ï]õ¢žò²GöFÍýâ&ÝK³ñ_æ¯
-n´[nš®Z¯›ýd(î0ÙÎ[mmEC¶SÅCÅ-¶·Å_–¼³zÓl/çyÁA¾‹²o®"÷ñ‡øñØ”î‡-ÂY#›óô‹z×Y’þ[ïäü¶|¹è×%ëå·+¶æÞpì2\+9TøcqKÑ?¬gK:-ßÛ;,·J/Y_8þZ4àhµ 8NØJ•¾±),9ä²y‚ÒÁL~#œd+È·±.”†Í±LlK2ÚÈŸ9Ð( êý£váãÍ‹ïmp°o¯ª]_±JùSMƒîŠk{A‡s_Ñ%ÇQû{kÙ7%í㶮Š¶’žŠ“ö¾ŠfGŸópYùò×eMÎÇ>ç»'( »¦•d»È¾WOz4Ì£a[4;Y‡öp§½Ø›=ëñnÕü»†˜[›mì® .Ñ•Õ+”+×ëÛ—n)ü¦z§ítåAG«³¥âdÙ9׉²+ÕÍe¿Uá|YõyÅ+׾ʾŠÝ®~ç.×ë²®‡'0“ÓFfQCö½5¤Ï&2“‘Þï÷%Žï?1åÉAáŒd·÷袻¶[Ó~ØìýmC­êüšÕù§?Þh9µ|{ɉÚýåǪ›]‡]mK¸:jš\¿Ôî­ê]²³úEõŸ–¼tm_ÒW±íl—y8ÕyÆŸ³8–¥H%C¥E¡S‰²f_Ë–¥‡ã88‹­9v!Œ5d¡l!‘Ò´ÕôÖeFišìK4ÓLóÌï÷ýóüñùû¾¯ûþ^ßë¹ÃXYá‹A¢@ƒÐæ»3A…„™êÄîü‚²Z¾—6]M—ú©ÖDî»j+µ§¥.;øìÍfšw¥‡9´&G»7Æ%úÖÆžgTF².ò«8¸MÜ<îm^÷?›7ÅÍäO‡gðg9éü9v:>$·,
-ô%tƒ”IIl¾bó樒þ¾¨I^¬Ö¥NÔï{å ô‹:‹+vô—xÑo˜·f‡:4¤ ÜkR„¾e iŒ"anH^lYXVt/#ê¦à\Ôˆ 5ú=/%z*"9z&,9j649j>$)j%Š=°Ö“0æ¿{‹È"_…ô©Bƒ4{Y›üS“.u´EÍp£™ê@­Ãöî
-Ãk%§ÍóYö5_qO–fÄúžKf|•”’‘Pžw™— ¼.ˆF
-ã&ùBáWøåLxÜÙYN\ì;.v%
-ô#<°ÿ¿{Ï+­‡•UÒäÕͤ·íÛHß´ï“zÔrL¥¯ÁNûú¥“M~ÇjK‚ìÊ
-ÂOæDûdg%2Ò22YIçŠÂ„)—xÑÉí‚È䇑‚” ~dÒ7*a:<:~–7ÇŽ.°DþDaDñr€Ùò€¥ò°xY~nS‚Ñ›j¤á®½í&Ê·šmµZÜö_¾äs´¢2ÐæÂÅP×ì"wZ~Ü™„œôàØìŽ ³Š‘Ñ*àd 8çᇧOq#RgÂy)³~Ò[¸Àž&<påH˜, ˜' +•2ðóUi»! Ï{Táa÷nñÞ®#ë;Ú­5›]ôª½‹ëŽçT‡8§•ó<.žõ)Jeò
-sC9ùᬼ&3¯Ÿ˜ÿ#/8g:"$s&,4c6”“6ÏK]`‰ˆ·)K¼øý¯•€W­’ð¼[
-†î(Ãݾ´=‡›oZm¹Ôá´çb«çáܦӖé ÁŽ uî151¾¼ª$»<›Å,+åœ)½îWÚá[ú.Ü¿x&, –ÃÌ™ce͇°Î/‹ƒˆb¥3¥à]^6ˆÃH‡<î•€ûŠÐ}_‡Úv—.Wßg¾©¼ÛA7ÿ†;=£Ã×4±iÓÌqå^òb7&øÖg2üëJ‚½ëØžu·C=êÆÙž5sìSeó!~Å ¬Ó‹Á¹‹LQ ›è!^ó¨0ZE‘&<è¢A¿tÊAûà6Jã#™Ê¯M7Þ³Óɼã¶?éö)ãØ[ Kî ¶ûºÀÑïå×~ÞÏëZñ™“mõ®m=L—ko]š—˜'./1=ª—˜^å˧J–¢ÀÀT*¼-xVGmTè½E…®ûbÐöTŸm&W=Õ“*6VÊ´ÖL~ä²ûì×^tÞÀ™£ì{!VŒ~¾½ï¡«g_†»[o‘·So½Co¯}ßÛž~«þÎM«þ®õ«þ'.‰†˜!0 ð²àÑ2ôv¡³— MiPûR
-*GUIE£º´ìW‡äSþc©~öGmÞ3½§þtÆp°‰ïž…Ç¡µÛP†½ãP‘³ÝP½«ÍP›õ“qW«Á'ŽßûËæûOO»Î?½Z?‰
-*ø«¢2~Z'ŠêëDÿw ý
-à ¢VÇ渶(.€–@ ÁB€
-Ü嶣QÁbØÍ´'Äž8 3ÁVÏCXÖ|°Š#È⌀.`ì]ÿOWÁï¨+üN¸ƒ~n5|¯w<àóÌ>ý„ÕÞø `À㞣A  OžË_Bý¨'=¸Áöà®q
-žQÞvˆñ·Glˆ„üYˆMtBtÊ"ðsÁ+]ð*W„5¬Fh+ !‡½À:æÖi__¤#è;?=öGÐ+b„ÀŸ¬¡ðà à¿á`>ã‚ù˜7ø¤ÃÒO=íà3â@$ñfAœà„õb³–"ºh%ø[WƒWG·Ùámtp:ýÀéf€}6
-±›¤žS g8@> J¡dòÅHJ[Q¾+âÊ<³Í‚:ø­ D¶3q,¼ÓÁà]bûkœû,d„;2È{Çêç!´—ö8?Dƒs3œë“€ÀÙüU¶HXA…ŒP»ÛAKŸ
-}Ø,èNÐ&-†*ÅòunH2Ñ ²Ð_Çx+l´Æ´Ew„ŒºÃ†ç؃Q7ÙýQ9/¯9}‚ñð§pïÅ€w3Wâq>ç&Ò!†ü?“È{¨ÉÖÔ¯²ÃZ{d±>@V¤#ÖŠA¯rAr†»UUà=,7ûJ¶$6°^‹ZÂ^%´s^Ä[Ó÷%÷¹ð*·7î!ïqÜ+ÞC¡•;Q× 8/†àËDN&AÐ-™±d_Æ“|ҶЙä-Ö‘{äÎ@w. Â…ÖlÙ²Át½[¿ÞàýR[Âøª"¸WQöT¶;ü±¤ûKRgÄñIþO¢‹‚»¢{‚[âÑ7Åc±—!ì‘ î„qÇe•#¶C1„$WLhÙb-‘»Œ
-#¹G‘ÿ4³g æ_4®¿egy?Y»ñH_κŸ¼s[½+â–²%êßòö˜²ãÂkÒžø+’o.J{ÎI‡E§eW@Ü©‚è°¢ƒj$´©ÿ>Ä‘|)ÉÖ‘‘³Àä6¦UT”ùN-gÍì7G8õ•Æ/yZ¤\ùИN»³n}À÷™%¡7Ò,Ü«ºíQ—´ÿˆ=¯ÙVÝ!þJy2é´ò²ä„òɪ7Ò£ê·ÒvÍ[Éí»¤V-÷¥@¼gˆ_Bî°Àidg¬'=Š—ØÀ¼Üö­…6åM%sz_eøœ_-Ñ ~6K]n™t^7
-r˜— …ìó9戞ŒªèÓé;âOè÷Š?O9$éÒ—w&­8’|[Ù®ý]Ù–2¦hÑ[åͩ㲦ԷÒÆ´wI “ø³ƒšdg’Q@zlZhËR›ájwêËZ¿©OkCf>¨áÿýVE¢Ëu³†v¡$ƒÙ³!}*¯$ò‹\KlWv­¨#£Ir8}¿ü`Z§jêMkê·š½©}šÝé#ꆵ£ªVE}Ƹ|{Æ[)!yD‹mìHî@6oñ<l&}ª–Ø Ô­°ým——Ý£Fæ´ëyNßÔ$,»P¡¤}UžÆì.Íå+*âw˜…‡ÖW‰ädïS6gÖ4ežÐ6d\KÙ™Ù«­ËN®ÍQ×dªªs¬ŠªœqYUöDH$¿[G² dë”Î¥ Â‘2V»€òr×G6Oš]mï5Ón6†;^ª.í©‘{vWèº6g³?Ûhä·™6
-[
-+›Ûey»U; Ÿjks?×Õ¬»¨¯Î}¢ûØ0”RiN®0Œª-†1åVƒU¾Õ0.{$ómJÞ ŸlÞ²ÙTÍ¡ îp¤<ß½€ò°ÕÙæV«ÏÔ«{ØóÎ5Æ8Ÿ¬—xtÕhWf°lYÏßWf6•nIÜY\#¯-lTWìO©0vé·äZn|”Z^0¨3 iÍÆM™qTU–?¦(Ë·Êßyûµ³ÿ¿{)ØL|2‹Òß8›òkËÊ݃‹(7xÙ_h {¦Yðáñ†ÄÕGêÕŒ¶šô°½çF6Z
-…õåæÄš²*yeéNõfSkʦâÎÔ’âž4Sñý´bÓ:SñÖT4¢1ŽªLƦ Ö   ßa&É.&»×òå÷ú”‡{¦Sî·Í |ß>ŸråÇ”³m¬ÙÝ­ü%Í"·ƒJ¿};ô¡µÙuÕÆØêÊb‹¥BfÞ\¯.1ïM),û,Õ¸éLZ^ÙÄ€>ÓÖX:¬)(U˜Æ”LVÅû &ßBÙœ¥3(CUÓÈ沧Üi™F¹uh:å›'Ê¿Ž¸Ûjú[W[Ä¢öÖx×Ö=rzSS
-«nW&·º./fk­I´iÛViqU­ÊXÙ¬5XÚõ9–S©Y–ïˆ×ºœ-CÚuåÃyTeØ4¦\¿ÑªøÛuÕä™ÅüæMBXEA«„
-RŠEAPAܵEÜ—#n=3Óv
-cÇNUÔž‹,òŸg¦g¾À|øó~zþ÷yî}?ÜÑÃf¡À”Í‚1=ÛŧoéA­ˆî4ÓµV+ºØâÁok2?ÖmW{$QRYkð+;”£.þb‘î“Š‚¸Â}ëõë˶¤­ÞSœ±¢´"{qIÝüü’Óyy%÷˜×óówöç,Úñ>{IÑ@ÖÒmƒ˶\6‡«Eô~Ÿ¾ÛÃу*!Ý®3¢®ãFt¹mu´M原T™Õµh'lšéöy}ªOqÝÜàOjó# «—Ǭ;¸&aÕ…)Ë*>K_X¾?+wÿ᜜}móæî»Íôådï}Ÿ=×@V^ñ`æ‚O‡2òw Í YÖóéÙ§D÷ñèN€®6èâ uœ1§Ö³.ÜÑ3þ&Õí“öŸŒsÞÕ’"/jÊT6æ…®;ºT·ªnuÜÒÛfå×î˜=¯¦,=³úËÌôê“sÓªo2/³ Uƒ™åƒYeCs²w§ç”FÃRÖ‡ÍDßï"º_IÔUǧ Mµ·óèø%Sª¿,æÕ\RU\µ,=ã°½CïQØ>ÇwÝ©yÁ'G,iY5-¯yc\vSѬŒc{“SkR“N’oô / ú£Ã†”/?R«>¤*FÒÒËGRGC€žo#zTFt£šèb=ÚØî×t–G_]Ò¡k¶TÞ%”^ 1ßþM´má•D—µ—Òd+/dû/>¿08÷ìÊð¹g6èÒ;¶ÅÌ>½'^º:1¡½Uúº>¾ý…>î’f6#9ñ(’õ‡‘œTƒ¤Ñ°Žè‡Dw]ùŠ¨½‰èÛ½j/qTyÈÊîM¤’{î\Ñ]¥ÉæÛ‘×ÞŠ³_q3ÅmÑõ,Ùük |³ºV®®S§\Ý1«s·6¾³zÚŒÎÖé1×™Ó£¯ vÚyÄÅ´#>¶3ãšÇúåÏD÷]­!êh`÷?ÁòÏUtr´ë®ˆŠžšÓ–§Ž¼O}„«Ÿ„Ž[þ8Æ:ÿ‘Þ>çá—Œ‡¹©Ý˼’º×ú&<تŒ}°;húƒêèîV¶û†F×ýByÿCxø]DFvAu:íyDöÃgD7Ùœ«#jnfù§‰Ê¯•ÜâÓ–‡"ÚÐkNkzż•½rþâž ãù=Z‹¬žkCOš]JOŽxVÏ×øžÜcz>–F÷”ȵ=U޽͊ðt2ÿT„þ8èòw(CþŠ@u7‚5÷2Úýω.Õµ4>Åò/í¼NôñŽÖü͈V¾´¤Å/y¹/eü¹¯TF†WfɯfŒOx•d×—a3½/ÏN×·Â!²oƒcØëí.ê×ûÜ‚ßÔM |{F¢úõ‘Dùæ7‰ò$þ/!õÿò€Ÿà5Zç!¢“õDul+XvvÞ'úÓ_ˆ=7¢Üß-)«_Ì3ô{pÉý~‚„÷j£Z“èx³¨ÁÙáƒY4Cùƒ‡
-¬UC›lü‡wÚú~¨´óùÐdï5òµƒÏIJáA±lbY?ñhí¬GXœaùD›î|K”÷#Qæ;#JÅÒÃŽ7n:¼øZ(᪡3
-B¼H‰c?dšø`©ã¤Øl.A‰ÅTšàŠVK\ŸèŒ_¬œ0låü_õLj*ÙPü5Ë¿C´ò)Ñ<–?ûg¢D(¤ƒ5E@ÌSà „ç
-ƒÐóŒÄX.š‚"[Ûà ñ$´˜X£ËÄ
-Ϙ÷ LG«b3Pr™hó-¢Oˆrzˆ’žż#ŠQ(L(ˆ½…?&ñ|X2¸ñ$ðä¹BÁ9AÅ9@ÃÙAË·A,ß
-I|KdðÇc¡ÀkfØ.0E…ÐBcœŠÐÍ<£ôëÿM–ÿø|=»¿¶HÍòUŒÉ`JŒ'WöŽ˜Â›'ž «Å
-RÞxó,À‡ÎQœ±[9B6³œÙÌ'”2ÕÌq¦c „°=/ÀŸƒJÉGp £ P'D@¢~™&P,6‡÷:KÈ‹¬áYf󶱃´e
-¤öð¸â
-€û;ÜßA2BY !Þ"¼8è¼ùˆö@"„nšÚd3DæL@ø²IÐl°EÈv{íuDP•3ë\ jv…ªÝ ÊKS¡¼áåæ¹Ê_™! Xæˆ
-’Á@H †ç+5<Ÿ‡B6ÂÜ9„ÉX¾”CŒ'±ÞÄ
-ÅÆ+ab2,1m‘ ´k¦ r‹ỜVîŠÐš©ÐÔK iõ€ú¬êNæ¾'Ô½ž#êמCêÏ~ <WCþVï…Á§7>ßE…pVCÔ¿É.ó ¦Ï4Ž¿áY¨EjE­Ö­( Š"Aäø%¿œœ ®„#@¸#rÈ A(Ð"HêM׫­X­³VG+VW—ÑZë]Ýgßý/ûÇgæýïûÌó|gÞùà]Ðךß$žƒïi ¼VÀcØjDœ0•Ë!D³
-hzG¬[»ÚÖC€q nü@=âüžú­Ë_þ\ßøßr}As}F}íú„
-nsþàþ[
-Ï«Aày9øÿ*Φ9â|ìºüÕfú…9D¸Y@„DÛB(Ï„ÑK€—´âßÕê÷Dñº·Ì*§×ŒFç—!.†ômz<âöŒvlóï´i÷'´k?~å1Kƒ­wƒÀëZl»Dïi&xŸbÁ6S À‘Œ•àaç [nb<ÄÅ$^ó@`1셢—¼ —®x!JsüC¿þ)Wï<GÖnzÌnÝüO¢Çã1èyŸ5¾e–uz믬+[o±zýÌ|á}• >?2aÇ4;N°aÇ1vŒ“àk
-ìZCç‹°o‰—R ï#ÑÉä– ÷³~—H·{/px*Ù½â_Ñ
-LJ‘j§Ù°b×»¢ªÍ·û=oò:½~æöy_#¿ò™!§|ä\Üq™¼çwž|¾ó ÔÓ$|ÀQ>P‡@‚¿)ŒwÀÅÙØuâ°sÉW`ßÀ÷Qn2«ô¶ú#5hÁœ‚óéyÔò»R™ã/’ô×£5n3Qº-߇¼/†5ûžuûM üÏ
-ÆN Îî:!¸x\ð$hBð6&ÚP(õ‡APo8ö„Ã.S€Ž3‹)mOÄEHÁód¬¦ü¥Ú`ö\íiùX½Óf6“iK¶ì'Eœã²dç Rµût¬vÛ阽¾'Äõ;'£Ú¾‰è :>|$l*äë°èÃáèƒáïý@ï‰zg„´‹!¸U 4S€µ ÷
-\Íg ·[ÝÔÛͨË.¦Ç¬=—"w9™”î9)ÓxOHKýŽÄU|%i¤ Åt… D0ûĬ^ñyÂ(žewE¿&:b€hÙ ÌF 0$@¯“@ˆ)ÀÁ=ˆÄ®%ÅΩÄs¨?Aï ÐïÅŸS~+[ov«l‹åLqàÇòÉ¥gr"§2¥.GÓR<G“Õ>ÃIZÿYEà¡„ºc|;³+î»#v”l•œá6Knscÿ$â€S„A
-¬j)0«¤@7¸øbœ-Ç®“çȳC¯ŠíÑc½ºS¹ŠòSåf‹‹zê‚3%쥓aŽã¹±.#ª¤->½J µ;¹,¨3©†Þ*o&e=d}â0¯6áßp]PøŒW%n… 8år ôr`édÀ0ø¸»q¶Âʽ-ü=Ó-@÷«ìÐ}ËÐ÷†Mçªü>š*g./­.Œqî×È<ÙJŸÎ¬jkF­Q¹—Q—ÒÀ®I>À­L”'ê’®ËO¥ÉÀ+I²Xì"¦) Ä]ŒµEú7ô!Ç=*™nïµFÿØgƒfÐßœÍOÖúÚNTÓF*ø«ûËÄÎ=ERÏŽüŸæ\µ>»€fP陕µ}z;¯DÙ/Ô*'DÊË¡ùÊ9a~ð5iÀÕ(ƒakRe
-„-D}/Í
-=Ë·D·u–èzõ|œo.5-Bgš7˜ß¿Ýf´6xñ@ w•qoäÆ]œGSIÒö:m†u~­<¯”YšSÃѪ[xU¯0'k,Tu!T•õH¤R}¨²€§ÊRlu:¦@îB¢‚L tOKA7*,ЕÚy8>šn³G߶a6Þ²Íz¨1hQoge§!Ì©©Râ^[.÷®*Kó×—äk‹UìM/+Ï(LÏ Uæ~šš÷P”š÷^ Ì^Z6éj`§«€0¢pöX WÙØù°wÎT™£‹ –hºu:yÀMt­5éÜ2¿¯-à“®&bEKƒh}]mŒ[UMÂ6]eŠ_Q…*P£+¤«K+ˆŒ’njQ·@¡ɵgCeÚû"yÑ;ÁžBüÛä©Ð
-Ș
-àHt@Ä–ËZ¢—Yý‚ïpÙ€p±{  ÑC |i…/CC._úØÖ¦-Ö÷‘+µ½aN¹ÆÝn™Ý‰[S¤úÊ;²©ñmÅ´Ý­ÕŒ¨–V"¬ù0GÔ<E
-›os„M¯8¢ýÀ¯"¢XQ•À4ä=ÈEèj9Bßa÷œÂî7jÄùÿõO3Ô>ö)js23ñ²Ö½Ë^;B|–3$tÌoL>,u—õ'{ÅRùF÷j©+EÆæ^O?ƒì™drŒ7œî— N0¸­Àà7]X!¦@*Bw´]ªAèd BcÝ öãü‘ÿù_ݤªžt¤èŽ{Ì+<¶sAöÃ!ý(ÿsÅX亄#qΒѤÍQÿa»N£š:Ó8€?÷&l
-‘°C ³DÂaI°)Te´Z=z¬Smµ:í±g\jíÇj­=Ž¶.ŶÐZ7w‹‚ÖÁ:V2Ö±. ”©VD¨ úŸ×±ý ·߹÷Óý?ïó>÷ÃóÕkÆÊ/—¦–7¼›áªÿÐZT_ksÔ7å6¸mŸæäïDna-r[;~Óóúc³x|ÑþÍD_|J´íó§ûßÚŽÞ>êKËŽEÑ›ÇÔ‚EG->¯±‹çv…Í8T)ýÃÁ©ŠÌN˜Ð²@]Úò¦n|ó;)ŽææüæÚT{s£%·¹35§q0Ͷ¶ÝÈÌm@¦½îyW–µ³´Ô5°;ØþdÿdûßÚ&¢•GyúS»-<Dó¿çæž6zÌ<m5í”Óò©ŠÊöꈲö™²â¶Wζ7âóÛV%æ¶}0ÖÖö©ÆÚÖ¨ÍjïÔfÔe|CÚqÓÁ”ÑóHß±ÙHôõ'Dµìj¾dùû‰V&ZrR@ìð¢™~4ÃEÓÜj~²Û"¬tçù”»Kü\îÄÎÎéÁù/‡åv.–dw®”fº7D§»·Ç¤ýk¿Ürñ{¹åÂ…ù<”¦sHLùI¦SPÔºŽh»ƒ¿³ÿ`S=Ñ{lV"ZÌvЗ;xš~Á‹&u‰¨ª+’*º¹’.£ ¨;Ë£ »ÐËÞ]>ÊvcŠ_ÖYcÒo,°ô¼dîYbìÙjèm×ÿt"\ßÛžÜý8\Û…HM¤êkˆ©™ÝÁÎíD›Ù ¬ÛÃò²üDs;ˆ¦^ ª¸,¤ÒÛþ4þ¶„·ã¹¼~o»cdÞɦ 8=Æ Tx™îV{îÎöÑ .­\æ;vh½H5´mL¯ûý•÷.ˆ•CwÅñÇ÷C×À‘ê·ma3ð>›Á•ˆ^gùsX~µ›¨ôG¢Â[BÊ‘íQ(e>Ž¡´Ç*Î Ÿ ¯ƒM †C„ra¦xÄa–‡¯yFc…— xGa‡w$xKpÍ'÷ø„ÿÛØ l`3øvËoùg‰&_$*¾B”ÓM”ù# |É„@ÒCBZ(( *.É\,Ì\ ²xòøHóᨄ`† óX&cƒÐŸ Çà ‡W˜!ÏÙÈfpU3ë+Ñl–?颢«DÖ"ó
-C =€qœ?¬œœ/Ê8Tóž˜Ë ±”籎ç°'ìcÎ??g5û—|óÛùÿMä¼ÎÎþ˾Eì¼Är‰b˜(xSü(b
-Dù³ZDÑhÄ’Tä ñ¬/Äj!8˜‰ÌKÌ"f5SÃìdZžm‡$=m2]
-{¦
-”-€²HE•bfy"z¡¤Ë} ];Ò|!ÝêiÒ¯Æ ª‘9ê¨ÓÌbDõ2w˜a1¤xÂÿdì]†
-B,‚Ç#dXù,èT’Õ<ŒI¬•ìiÒ b@o÷€¶Ìêi^;oToø"q• ëý‘P#F¶
-¢n »e@t 1W͈¹<îY0*Y¾œƒ-šCSÀêph(´‘Ÿç {™r¦ú!{®Y‹ƒ±<ôqúšðáôÓ6GÞO«ºg©—YöI-Gd–Èn[®Ëþ“Ö/ëµ<Š¹a¢Ë‚¸«Œ;ñg3&óYHeçÏ–rÈ—pp2.VO)›R“®lO÷s’h¸pVÀ½üWCíKÃrÞ‘ôÛÖGýbû›ìföÖ蟳ëbú¬_Ë{­ä=ÖSŠ®ìW²‰½dVº­H<ŸU‡ª“6¨Žå@ud¤³³ÛÙÞë eÙÌD‡*%ªd*Ó=†'ø •Uˆî”¼x«x^h_ÑIc¹´»pMôµ‚ò+ù›c/ç×Æ]Êkˆ¿hoRºí'ÎÛ/%väÝR¶?T·Ù¡iµC{$Úæh÷B³gX£8²³$妰^LUp˜6–0Õ,¨¶yßœäòë©šxmâì°Ëå¯F^,]}Áµ*ö\ñ{ʳã?J<S´%é´³NÝîØ­9é8¬muœÕsöê:ïé›04:aØ]CÃxvC_7rXŠ l×™@x1”0SÊ=œ¥äîÌJôÍÌð¼>Ã1úҴʀ﫧‡Ÿ4OömåbEÛ„?+[+ÞM:Vö¾æHiîPÉv}‹«>¥ÉÕdÜïj3íq]3írÝ57”`ÜÌg¥0o/ƒiK9ŒŸŒ€<Öÿ’ÿr]žQMgyþ%DŠ
-*2¢Ž2XP¤H€„TA¤D ‰@(¡„J¨¡†Þ”
-
-Àç¶|&€×âüõðt3øI¾ žäl}Ž#ñŽœfr+ãȦéÔ0k4Öf,9ÉnD$sÐ&äº JÜ{ãj<»b›©í1=ôVÞ³™7Åjä=`×ó~f×Åü—YËGŒj>¢Uñ‘wQ1”• Àå°k Œà½Äþ–n‹ÙÆð$o<.°„»öÄÅx:‡»érVÈ–QÏF›"´žvìI–»v$’5Â
-Js‚š¦t0kãµìš¸ NeÜNEüOUü{¶J€X¥Ä( Z±
-çý
-…/ý
-E¿s
-ÃÌ!ºB„hï• `¼žü/ ॠ{o.
-×Àýc¸­2‡ëå{WTî†KØ´EV}Šˆ9±{[äI ©®µ²rUª’ª:]M/‘6³ %}…ø¢_®ø7[¼ÈÍ–üÓ7[‚|äÄ’‹CžŒ_ÛdD[ :·ÈøU°˜…½7Ÿ÷JHðu¹!ܪÚ“5¶„ñ*·5ÃL³þ²
-÷ðXp§;O¦ëˆ kX£MÛa°Ñ‰Ô­¦®ÓÔq-Ô5Ç·UWFíR•ÇïW–%T§ÊVæze–ÐRókYE;')Oë'ÌâžÊ{„ùÅ/!ùs[”˜‰Yˆþ)(šÿJúØÃÃ"ìØûj& p¡Õ´kèÕ0hkñZÛÐÄ1¯i8f­ª ÿ²è ß.¯Zä˜U™â*+—{H˔ԤÒj†°¸•¯<竼ê£|ˆù»/_‰|b +.1ãó]»°$Å[Ä=ÜÅgp³{W#vÏV€ÁôvYB{×>bc'Ù¸¦½Q¥9jUÔº#·‰·'³!á@j½ÄYR›é.:Sà%¨®¤ñ«š™'+|¢*'8•8ï|"*;R…˜Ñ%ˆÁS"¯h5Ë[øK€¾àãL«Æq¾¶ ûf`34ì&œéw3Tõ1L‹z–Ó²-£#Ê6¥-Þ.Y“ì(l‘¹Ä5+ȼ&•WdC#-¬¡¢¾Ì n¸Ç
-V¿a×#Fp¢‡V#ZXþ+*_Í¿E{¸Wpã €®`ç÷ö´`ÿ©Þ
-¶³fjvÒg:¾ôž¹`KýÚ–:³dëuóÃëÈŽüÚç1…ö{\Eö+¹W†w¸ÜA'Þ@?@ίXΟH» ¼m
-þ÷!çäØýð;ïOÿç}î}ï'´~¬$¸~²ÔØ0Ofh¨¼Ú#×ÿv^®õRîÿ+äþu°ó«ƒBW e{;ø ¬ÝF´è;¢mù§ˆ†_ x(ã6QÒ}¢Ø§D›ÈúÖ"Þj)ü]…5GPps¬`|Ÿ(|Hü?ô´-"ŸÖÑ"ïÖ)bÏ߈5X/vÇ~‰nHÜ>6JÔ-«ß³æŽ*ù .ÞC4“ó'œæü‹D¹¼÷´»DÝÙ8?¼‘(
-
-†Š Ð:ÒÁH>0Z¤ArCOÁY‚
-y‚JL”X R`ƒÈEv¸%’£‘áÿ,ÝM4‹óËÚò/qþ-¢TÞ{Âc¢ˆçDAõD òƒ„38Ó…<àAjt"ø“‚Èá¤@4ÉÑ$H%þ“ΊB+g•l»ÀjÙ›æðùû‚û?¢-ÿQ
-ï=–³9ߧ•È“kpg.\‡3”œéDö\‹ î$†7çù1# g1,‰e²|Æ/AÌb|ø±ƒ}Ï~è
-,À*Àl!$F„ bf‹¡/ÀoŒÚIl¶ ÚErhW±õvÐnµ‡¶ŠígGОc7Ø3ö›ºÅG­:([tphÑ‘W§·þ!”s-FQ¬^ùw¤MË'b˜3ÄÍ“ x¤Æ 2¦Ëa˜oÃ2î_…†MJv(Xí€À#0œbWaxäØbhpl6¾wh2Âñw#œ P1—×F¸¾ êáœoÓ ˆñç/ –ëˆã^Äòýèœ"†u€‘Ce°Œ“#|Š=Ìs0/r€i•#L•l«S«©Ê¹ÅtÀùƒé˜s³é_ª&Ó}Õó¯Î æwÎ/Íp­3Á­Ö÷ÿ˜àñÌ ‡á!*€s}té$ Käz’Âxåg³[w1ñ¥ˆË—!v”]kt™òCçéï:Ïszk[êü»mêm£Ëkë×WÖj×kºÞzV]gûIýÜVëúÄöÖí‘ š[áõ³Þ÷ØM¼¯tîÑ:Î÷â\BO–¢$ 5J„ä®bôL“¾ïž+oJ,¶ýI©CC×)Î/»ÌVÕvYèú"a…úyÂ:·g [ÜŸÄïvÈãaÂi ?zÜMx¡¹ßä}->—㡽È.ÄCw&º“] mqm{w'ô♯·šåEÈæ^d›„Ö¬QSzÉ«´ly]jâyòhÇ'½¾P=ì9]}¿G¹û½îK4w’V{ÞJÜèu#qg§ë‰û|®&ó½œxÉ÷BÒSí¹ÄF¿Ó‰ÐŸHDÀ1öv( û»Cߺjxÿmù<oe«øÇõäúRk®Qx“)Ôõï*~Ö/]ö { ânÖ0§›¥êk½'{\NûÊëbê‚NçS–ùžK©ÐIÞì:¹J²×á€ã½Îíõsà‘äW†ƒÉÚǪÙöm
-ŒÛS;B¢!•ó³”„^ó¸ž|j,ÐQm~¨ðxpŒèî déŸöW^Ê)Tï?ÊýLß ^§²§ùï3Gw4s¡¾&seàáŒJãÁôíAûÓ÷†ìí}"ô»Þ×C«ÒëÂv¦·˜¶¥ó“›°Í݉ÐÊL„´‡œ™Îó^; ®£Ð‘š‡¨¨n¨=*ö§Ûő•¡IÒe)Oçç¹4\S3p\§C¹uûs¦ë«û—öô[¼«ïêÐÙ7mÏ®2oíScÙÜç¢ecö/–õÙÍë²a©è‹ðÕ}a^Õ¦ýÖ’¹ÿYöÜ)},”QC±œžPÐÓ‘Nt»Ä‹.2 gKºJOŒè­¬–ãz`H‘¦ºp´OUþ_üwš¸-oVð–ß„mÊ]aÞSiY—³#²bÀëêg­«<²-Ïi².ËAÔÒ\D.ÎEÄ¢\„/üæöÆýï+åTϳƃ1Ý#£[ctyœ;- Ž‹“›¢Ü;ªŸKÕÈ|ÏÃGøn)§ß4äKãúÂé!k ¾6¯Î_lY9hMÔò¼-¶%yÕÑË;½0ï^Ì‚¼7ÑóÁ6o0¬åƒùõ`DÌ K{ÜþÔ~àyë1ÏwÆ
-tµTJ—ÆÛѹ ®t¼Ì(.‹–ìßS±«´Ë¶±yž›Fõ­,£_3bBЪaSC—Ï_2da䢢•¶…£Ë wÇÎ-87»àfܬÂW±_!zflÌ:£‘Ó‹Ñ2ÛîQýPžuxî¼þ9ÿ×/ÓÙ/etr¢ŠŽL ½“­â]“ì·–e¨6ŒÏÕ¬--ò]õY‰~ù˜Ïƒš¶°d†eþˆyQs‡/ë<kXeÌÌâoãþZ\?­øjÂÔâú¸©ÃË¢§ ƒEM)Fd{è#ç³@ôËp¢Ÿ>#ºTFtf’ˆNL‘PÍÉ®ó¨¨î+à÷ÍÀ( †}߆}fö‘ÊDTDDY‡aVePY”M* X´&F«Œ¶±M0.59îÑ´1iÐh’“ÛKsÚíŸóæøÎïÞûÞ¼[Ä…3r •{°ªõî ×îÊ2hËÝnÚ’½Ûª1Sb_›‘ǯ–ÈÝ*Òª=ËR›Dò”nïÂäa_YÒ9¿¼¤ýs“¿öËMFïÜô""ú,ÈMBÏÅ0Rå߯iç›ËPÒÞ÷QÀt &ËVÀX¹) —»²úÊü—w•¬Ñj+Š\Ù¼w›I½l—å¾¼T»Êœl~Yv‘›<³Òs¯´Q”ŸqØ;GrÜ/+}Ò_š~Ý?#ý¹_†äŸ Š¥IÓQ(MCÏÅ0
-`~'Àý4€Tƒ?PþL)í<å
-2Šd®²<…gnn½(3§Ý[’=蛚uÆ?%kÖ?9ë™_röÏ>)Ù(NÉBQj&
-S¥(Xla¾¦ûá®”ö^ªÁÅÚ;éÕë4í>#û80Pk
-wç `1ÜJ³D}ȸºP:ÿ™}
-Q¸³
-bJÐs±—ñ
-›²»kpò•µÿoÑÖoíü†È±¥>^˜êÁøAêåwP~Ã1Ú?O
-rèoÕ —è}bL¬ Ÿx‘`B/Hb¤
-DÊPAd¨2”¡30€ ½Š€"Š, ÅBKÀ5êZWc‹îšM¢=–hbY-ñæb'œýãsÞûýuß»÷÷Îû}9(zÀy'úóV„œ×&ïq_™ ðÿßûúN”q%]e´v ^Hi¶óØh­d£e-r8hQÂAó:²Š¬'›¹hÞÃE‹Ýä
-¿gÞéÿÛ'\eÐð
-ƒ/“‹ä‚Ëßpú@w Ç$@/#@oZûP/æÐ^õšÍzãáÏ~>+ŒóÄ]Å}ôA&ïÁÌþÝ™‚;ŠÁ°¢Uï'E‡ð†b‹ð‡;ÆÿwÆ>ýë3ë_›qÖàŠâ¦ÁÅÃ)þ0úJƧ(:©@““3Ðä8]Ñz~@ïîI¹wŽ}Ò†€ô<4“
-íÇÃxêAe õµ
-ÆAO¡)tÉX…îÜ6Ÿ eið„Æ<¥q}nœYuNŠ¸"[c]ª)g–Ûd48楯erҺ䚴OÝ2Ó¾œ–‘öƒ[FÚ yF2Ä)3 3SQFFaí…‘½˜
-p:‡z@õôQþÛVÌÎt”Ú±ÚJœ–ŸqÅó ê
-UébMË–&YçgZëòòmóµ¥öÚœzGMv+“¡Ù,OÕìvKÖ™¦Ö|ç¦Ö<wUkÐ%YƒÎÉY蘒‰²±þ ãÖmšÃ:úÈ£PýþR€å”9HGÅ$h«²…–ªiìÆÊ9üºò¹ú•e¡“JK¢'-K0_Z”n¥-̪ÑÛeÔÈR—¶8«ó7Êòvºªò†Üâò®’grU2ª\tŽÏEÇ-Êrþötd/$QîÍ8ª£Pý>ÊŸŸÔPýjÊ=µ†°ªÞVÔËÙµuž¼ŠZaIõBC]U„(¯Re–Sž*Î,˶I+-”¨Kª–5;Åw01E½ò¨¢Ï]#‹.“§ò¨BdˆS´c
-PFFý ðŸ‘9P¾ £g?Õï­è\Nõ
-×(8ù­ÞüìÕóÆg´„¦¬Š6NZ™`ªjN·ˆmú“ðzŠ²NÃ
-Æ)J¶«Y†ŠY®šµÒØ»µÛΞ³‡ó;0Ïÿ}ßï›ùÞ'úMZðBäø׋£Ç½¶2î®â-ñc‹÷$Œ)nJójGüó%þÎW¤?Å'±…=´vß¼pU¬ëB`ý›ìÅç¯àîµJÃì56<¹ÖYki3×dé^S`˜¶ºÐgꪉ~E+§øß·bzß + ·|NXá²ùc–.‹µtsôÈ¥Õ±KÄ,i)X,1‹$fÄ=bao§y-~À¼ËÙÿ…ù¥K€UÌ^Èõè¥îÜ)5cFi(Þ” ¦mJצ–æë‹JGîÛxiüÆÉæqoM³nx$p̆Ùö;ÖÏ .X¿$lhIix^IUDnIcDðܵ‘³Z"sVIdîÊÞŽ±5¼þ«^ç½Èüu+7×rÌ~vð'î¢l3`Jy
-•Þ†,ÿö}`k~ ³I_ZŸ×È­Óuò«sû…f털\;')ÍY–”h?ÚP¬ý[x±–ˆJ´$  |„·ÊsœÃ—j€ß¢ÿ7 èA öÞR€7‘©
-Œ›`¸Lƒå¯RúʢܺKeî‡M
-¯¶’ ¿æ"]`½ÑȬ3V„VÖs͆v~YÁQaIþ˜¸H?+)Ô/n(Ѐ|+)Ð1"4è‰
-(¯Ê2UšXEæj¶¡¢™§/ïË-唞×”^’d–Þ—d”þ×ÿŠ3MD¨1A–‰ð³J^ðW%fA‡ç=X¬ÄÔÌ4 ˆÝÐÝà‡›B ­y#45ï¢ZšöÑ«ã ©Þ¥õ™~E–¼@C]S_kÍ­iäf×Øšê!az•S¬®z;\Yuù:\Yù“HUIÂTf"P› _]Ax«<KøÏÁ ôàî® sЊ3hA}ÄÚæÍÖ`¨o‡ÚŽ”Êö(·2k¬{±5ų°-Í'¿U k) Êi.giš,ìôÆžªq@Ú0)Li8/Jn¸-Jª&J²üG˜l!‚ä:ÂO©%¼µ<Å9<À3°‚38߈gÁ
-0ÑÐXã»ßF…š®
-Úé úþé<÷h§É#ÊiñŠtÚ|^wû¾æœõÛå¼æá|â1ù£ÿΓdýÎ dœ®å:fÿÎ}õdžð,Œ
-`Cíz'fà,@î€Òw
-;ékW½ âj0ì\ÂŽÅ-ðêÒnؾ$…mˉ°uY [–u”MËe”—Wš¨/­Ø©’•)ZøÊšxåM¼ôƒ›è*¡ ¯uÂËÄ]xéçpþNÔAß{&q38ÔÎ; ¾p;è@Ä5€Í7h~ËD·‚@t[
-"* ˆDˆÁì¢Á (Ä® öŵ×`Y#Q×ã QcCì Ö›¿"9ÄÝsöp~çÍ;̼ï~߽Ú3ïHu1~û}û|8sȼ{í¾gýŸš•O
-øý ‰¿˜Êø™üwÊN ÷ÖŸÍ5ü˜³'sv¾ÀÜ/3÷k€òcߦ§Týöª"-ŸmKŽ@MCàÅÇÜšðn“*¸)\ˆÄDZDØ‚I‰{ôüOYŒŸÊÚÇ2÷pæmflß_
-ÂO‚hÅk+-^·°Ã#o#n4÷Â¥f­ñK³`œþ[7œðŽC¹w²ôƒ÷Pé°O¦â O¶¢ÌgšÅ~Ÿ<‹}>ó-öø,Uîò)QîôÙ¬Úîó½j›ïiÕfßÛêM~/¬÷šµ´æ-ß¿-4ŒË©ÂŸS§ÙÛŸ*p£µ•-lQá犓­|PÞ:
-l0­Ô¬7m°\kÚeYbúÑêþ×­Vø×h—ù ë%µ´‹? Z+jãs¹¹Þ¸À©íl gÚXâØgzjûö~Ší:J[ÛEJ›ã,6PnLW­ ¡. «)˜l¹ÚœkµÒ\ ]n^b½Ô¼Æf‰y«\dþ·\h¾,Ï7WÛÛ9µäü
-eíuØìŽ-?Á?;µ—Öw
-W”tŠ±XÝ1Qµ¢cJƒe†j–tÈ´*
-ÎÖO³Y4KžTh;7hµ.?¨Ô~vP™}^P…}nÐ#ûÁÂ~z°Ð‘]N-Û:â3.mµKîžûŽvʺ
-Sv–fU6ÌzΣåY_L²ý.4W—:Ï~FÈrÇœ ú©!{œ¦„œvšzßiB¨ÐŽdOºú„¸Ï%îãâ¹·Ï´•Ÿ7uÑbM7g¬ŠjŽ¥ÝÛH‹ºwP,ˆêª,ˆê©ÎL´Ìë–¢ÙuˆÍŒ®£lsºdë¦vÉq˜‘¯Ÿ±Ø);|­a\øNãØðÆÑwŒYo _G=9’Ù×7YƒŸ#Y.ù{{3~,°‘ŸK¢`E=÷ôÂÂ^&© W{Åì^•ßõŒVo™Óc€vJ4yRôp» ÝÇØÓ}²ãب<§¬ÈBcfd±óÈÈm.#"Ë]†EÞtɈzëÒ“ã°HáPç)Ç`e8p’¹ˆv$pŸÈøñÀŠÞ(ŠµÇüxÌéÓJÊë¨ø¶O¨2'>R=9®·åÄØ$ëìØAòØÞ_ÙîõµCfÏ ú‘=s Ãcæ;³ÊeH¹~ÙãˆkZL½tN‹r"}zŒp¬ó˜ýp©pŒùïcü-<w­ï¬LŠxœ—h‡ÙI1³Ÿ¦÷k«˜’ÔI91©«:»oO˱‰ Ú¬„d9³Ï—v#úŒtȈÿF?4nº!=®Àypì
-×A±¥nɱ‡ÜÆ^£.c…‘ ɱBOŽuðøµ;ûyïfüÒd 8X2€ñy?«¿ŒÜnÈIöÆää6Òøä`‹qÃÕY¢5£ÄkGôï/gôK³’4Ü!=i¬>µï4CJb¾ó€Äe®ý6¹%%pë›p…j\ú&#’„éëÜéÌù€}ˆõßÎø¸åYI ¹%Åû)Ö˜šêŒ‰ƒ›!;Í_3øÃT#R£4ƒb­† J²IOd—úÝeÕô•†á7 1P’°„,,.¸V°:,õˆU±‚HÁA@ÙÙ*›‚`-‹k1X«b]Q´êQD˜Îè´#UëѱêèØrÔŠÖÝ:õÎk+Ú™süãá—@¸Ïw¿ïÞÜûŤÚÆ,ÈÕF/(ÖGFWÙÏÚä8;j—SxT‹ÓQWÈc‡ð(a>_è#æ ÑöÐÅ}xŠk°…ùßÏ+èö$ö|dmýŒ¥8Á…IZä%BNò(If²—4-y’YrR€"!1Ôbaâ\eLBŒUt|’Mä¢,»9‹–ê"VÂâ6:„Æíp ‰kv
-Žûž<rŽ†X¡‰ºÐ¡íá÷`×Aó¿'‘uHŒ©¼ï§ÐÏ^4?UŽœt[df8#=ÃU’’1Fš˜ác¶(}Z¯Øô`óè´ËÈÔhÕœÔ눔Ś°äBmHòÇú™IFûIÛ’š§']p˜žøÀ> Aˆ>0^舶‡K¼úgÝųô×f²ï]̼ Þ¹ù>-Û)9½‘˜;‹r=$±¹ãeѹ~òÈœŠ9ÙaÙ‘Ê°¬…êÌ4› Ì<Màâº÷Wëý3¶ü2ÛOÉøÎÞ/ý¾Á/M触 ÝÔT¡õOv=œå~leösÞÛ²¸s¹r€’Í×)y@|¾
-qöXP8QE£$󊼤³‹&É §Ëg†(‚ æXåÇ(òSÔÓòrm¦æ•j&/Y§õ]R¯óYrHç½ä´ÎûÃ{:ï\¡õÎv>Ù$Khzè˜Ç:°ö œw=}ÕlIVæ…|¦²ï(fïYbŽ¹¥Ì.sFx™ ÂÊ<%!e¥3˦ÊË‚äÓKÃþ¥Q~Ë-'-ÏVy—[M(Ycó^I­­WÉÍØ’Sš±ËîÚŽ]*l½ŠH!)6=g°;Ø–m^¬!ËI.ÝI¥À¼•ì}*$®´BP•#«† `Õh¼¿ÊKâ¿ÊWê·jºlÒªP3Ÿªyò‰U ïUeXxUYŽ©¬RzVnQyTîW»W¶«Ý+î¨Ý>j·„•Û
-aå^öšcÜ{™s½Æ2 |s@Ò鎭
-èMÝ
-mv0oë EÛ2
-½NŽƒü¤?ÌÚÃ!k‡´½
-n:ÁÅ-ZÉUòð‹€˜C@(ÿ4™nOÎyØiÖþ<s PÒ+ëñ¾pÞ%÷Éòˆ<!¿_OEl s"†6,‚qˆqð U/ã`²Å·¯VìoÕý!,!d| ö™EÆ‘iäCRɇ¤„”“5ÄH6ÙIö‘#ä89CºÈ"ðü·Ÿ¿?ÿaC·5{\UoE_þf
-G¸ô„#½ÖŒCÍåôÆcÅš(‡CXxBôòÅ3Ù <–ÎÆ=i,º¥©¸)ÍA—´?ÊÊp]V‰k²õ¸*ûWÌêpÉl'.š}‰óòVœ“wâL¯.tš?Á?Þh·8©|‰åkD_úûX2„=ŸÆÃÜØÄ/Ö#q_=ݪ©¸¡ ÅÊù¸¦ŒÇeU.ª–à‚ªçT+qVµ§UFtª·à”z;:ÔûqRÝ‚6«Nœ°¹¯lŸ¢E#Ь’£ é%¢¿ÂÙ ‚ÛZ8Ëß;Ùà‘Á ?i‡â;®Øzã‚&
-øÙ*üøU-Ü]ï¯)ƒ[kkàݵMp=Øï{©«ÁýÔåàaj1d‚ºrŒºr–¾r…ž_w~kÝoè7CŸ°fC ë$r"”°ãùCÈkKãä©GmŽoµŸ‡³áWkðqðKp/4 n¯RàZ¸.G˜áR„•ZˆpPçÍÔ9E;}VÑCÏ)öÓg~Ö¬â(ë”b–}Bq‘}Lq›=£øŒ=ùWΑHÂØH¸ãÈë‘„óCHƉ£W‰Ï Ž×‡ÈG1
-}ñ ûT„½ªï„{TDгD
-&tRݱ†õ‘p@Gùô©tŸ>›Õ«/`wg[¸]Ù6^Çg@ÛŽÂÖ¬Î@wV?Ó’å»t3ÒFݼ¬^wKæÔýZV—õw©#‹ˆÆ¡#"$ð9põÁÜ7
-c™Ðãži`à@îJ0†CŸ1ö“)¯QÇê0æ±Û󊸞<+ß[Ð’ëºrÚE 9{ÅNÈÄa˜’ÕÞ’WÞ•Û ŸÉm†'2›H1ÂØõD„>ãìÃO1wŒ
-—A¯) ºÍÑÐiÞNµ›3X­&{§ÉÄm.,ã5VÔ4ë
-ZE5ù=âªü!©Í8)³çäåÆëAeÆ_•¿•—‰´ÌHÄS–GDÏùÖá瘃[xÿ·qõz½ßž~\ñ__‘
-rW”ºâ¨—†6»t¬BW;¿©ˆ›Ûdåšê²ÝB]㑶aXœÞ0#ImX¦4Ü—jêÿ(IqqJaRëˆ(Õñ‚Øw×1ó¨}­€¿ û  iÀo{ ú7,»dPÜú*˜=áPè‰|Ïv*Ï“Açxô,}k!;«µŒ“ÙZÃËØÕºË+Ô¸‡Õîif»û<“è¾Ë$¸1‰-ÿ%6Q¢‹nFÓw1—±s¨?åFß‹V q#µ¸Ž—¶˜:(0v2Ûµr¼¡ ÷n‚ÝñÕ­¡2»ut†×H§yKد£ö6q·wuðU]ûâº&ۺΠc»îc;¿Æîþ·0¶cÛˆ`«ç7±ÿðγ€qÔëGv#Mí
-(¢q]×äèÑÕ Æ‚»¸ADET,ŠNPXªÔh{,G$1®qu]{ÖXëÛâîêÙÃùñ¨ï{·¼ûî‰@óx˜g £y±ägΑڛ‹%_ó>É`þQ2lú]f(2C¾¾ü/•)€™šë©·4‹yÀõ³ÕÀ赌A.çÏ| b3õ‹8~¥Zø–9ÀPæ Ÿrx—ë¼;<+"áQ1îír\é\—Êp®4骎Up,§2!9ýµ’VŠ3y³™‹ÔLYÇ»HÝ?çÜÄR·O VFý* gSÝ€cµíjõ°¯u#`WDÂak‰„Î26–1ÐZ¦CcI…Ú²*K%”–£\ï@]+ ©!ÕÚ=­¬bÐ×ÔC݉ÔEݸr ß6À¸‹úÕÔ¯Ü÷_¶ßÈ ª×AVï
-¼À.ãž2ižà.ó'øW¿’Gÿ¡§¶½ „Æ™ß5ãÑæ‹H?2„|B>¥N"uæâ9R¸kC°’:k©ñ%÷2S£„VoÃÔà>ê©~ŽéòCø„ŸÓG´¬7ßA8RW¯‡°m!ç
-—¶˜¼Gz‘jŽ ÞXjMf|ÎtX@Tjdⲩ±žûçs¿"Ü@#° Ç~¦ðIü ×p‰'ûž4q7Fï \¨ëhK_h®ZGž¥9&ŒÛ‡ÔíGÍxê}L­ñÔ™Š0&ד«HÃæÆeæÆ%ärÿM¼ºÅ8O_œ…ߊSŒÇ žø8£t”»Z%#Rëúá®ã9”ôST¯‚hgGŸ8ã¥ÚåA´¯'5£qUŽË²Ñh’%à‚|:ÎÉçàŒbN+ÒqJ±'”98¦ÌƒUY„ê
-4¨jpHÕ€ƒš&|­½‡½ºW°Ø2cíjÞAxQŸeN¸W^/'žëíñÀÖ7´~¸¬}6}pV7§lGâ¸ÝXµ›ŒÃö3Ñ`?‡ìã`»¥8Ðnöës±W¿uú2Ô:ìAµC=ö84a‡ÓT9¿F…‹@Y¥ÎBzƒð¥¶7ˈ¥†Üðn.yJ\µ·C£½;N;tÆQ§î¨w€®Ã°ÏíÔ¹GûT{$a·ÇìôLÃÏåØ敃*¯|Tx£Ì{J½ Äç¶îHfÃKi“¯
-IA3!å·!üZËÉ=–Øk,÷»ð `™;å­ÕýýPgè†êö}°³Ã l÷ÊŽcPRÿé(ñŸbÿdl H—ŠVJæ€ Òæ
-{KÈí­ÇÚ¾>X„¬¨XÖ?
-ýã¤ôþ#¤´þ£e‹£&Èÿ5E‘•¤\•¬š™¡ž¹F3+²Póyd…vfä>›ÄÈó6Ó#h§E ÍÔ(¡ž)Tm(›¹O|ǧÞJíºx Š òbØcòç«ûÛaÅ@OdFwÆ’˜0¤ÅöÅâØXiQìG²…±£dócÇÉçÆNRÌŽ™¡LŠ™§š“¦NŒÎÖN‹Î³™]ª›mÑMŠþV71úž.!Fh¢…†¨‰*a`+·"Ú}ˆÚÕÃÙc“‚¡œ·âØcòËbuX2Ø©qþHÒ Éñ&Ì(Í—ÍŽ)KŠ#Ÿÿ©"qÈ4å´!³ÕSâR4“âVhâþÍu™GEyaüùfav .D‹&¢è‘¨(Ú((Š"¢¬Ã0Ì ÌŒÀ° (‹Åq¡âh]\Q0.cMðhš›4rZ=&©Ic\kmŽmš¸&úõAÆäœþñ;ßý8Ã}îû¾÷Þï}ÚÔyI¯ir“ŽjIŸjíI·4ö¤Çj{’¨²'ŠJ¢xÊUîƒ?3ÝÔ~ƒíF[Ÿ6¶aëØþ>ð¤(Ñ ˆº´Ô¦‡£Ú…*C¬PnH ’Òt‹´$=WV”^PV©ÈO«Wæ¦5©úMß¡ÍÖÑYôgÈM­YÿHcÖ‹*‹^TZREÅS.qžaŽQû Ø‘läZVóÝÃuÔd¨ÍDµñ9TfŽC¹i*ÊL³—iPlJ“š²¤N“]–—Y(_˜Y®°eº•ÙÆ•j‹q£&˸K›™ñ†Î˜qZ—‘qC›‘ñ³&#CT ¢Ò¢—‹ñ}mðÛf`6½Ž•9àx%×RÏuÔ˜TfõÇbK0ʬcQb‚¢ì™BAö<!?;E’kÍ”:¬92›Õ)϶”˜-5J“e¹Êh^¯1˜ÛµifŸNoþP—j¾¦M5ÿ¤Ñg‰*¢Ô›DešITôržû﵎äð,ÚVÐÌq#×SüTpM¥9:Û† Ð
-§còÓ±Ð1W°;’$9ƒÄê°JÍŽ\y¦Ýa¯V¤ÛUzÛ:uŠíUM’í 6Ñö6ÁvU›óP-ª³Ee¢õ Š^z¸ÿº·o!Ïc.ëÀç*ZƒzRÁõ¸ø,ÈU#/oæ‡Àç4X³³s`r¦IŒÎ,©Áé¥9‹ä©ù•Éù Ê„<¯j~Þvu|ÞM\ÞIrY—û@·PTå<‡¨xÊŸ¸ÿŽ1î.'ï²––`©!®<úNþÍQ€ì¢@XŠ‡#«$ &×]Ñ0¸æ i®d!Õe”$»r¤‰®Ù‚’ry|I"®dµ2¶x«jvñëê˜âêYÅߨfÝSÍ*•1¢â Î>>dÝßbüûJxŠyhêI%)à{Ûrs™
-Þ Œµ~÷u´†ÆÕ@‚ˆÙÀø7hYGo†· ڥŠŽ$;Fc@G8;#É\<Ó©GÿÎôÛ]
-Ýî² ÚÝû î<Mç hw=†n§];ÙÑG;õ65+¨¹„P×üÖ`0‡ºÓ^ÂÛÐN`Ø`ð~ — jŸŠCp(òC¡ùÂ!ñEAðÍãeÃïãaóqCùè1}ôº¾£ä›úÜC"? ¤«6j®e¬õ¤”º¶6Ö€ñÆí¢v÷1þ.êû€Aoý8•ê]@8¦âÅB{|a#üÞhBû>›Ÿn~p»és»yÀ»™èn±ûuòù󘈿°º+¶2Œ7Ÿº™ÔÏXg&Qs45ƒ©9à=@{Ÿ?0ä# pZM¸Ž¹Ž3ÁlF{›ápà3®ã,?ÆgyÙŸå!ïa±{(pöm>/’»‹¿Ð´÷Á. d/`=Èf½CýãÌ70”šÔ§É'ÔþŒü…ü•œ€óJà‚ø"¸H£ò5›ôKãË\Ç~Œ®ò¿Æ ¿Îb^?EnûD|B]kÀ4åR¨CÝIÔÅXŸ=ÃÚ
-(züšŸ“¯É%ò-¹B®‘Rà&kóOæä»ÁÀm•ïÇ?rwØÜåÞ¸÷p¿…0Á>&üÇ?<aÑÀÎØõÌõì€Æ;’ñQWw}I¿“Ë~½›„%¥…(µ§Ó‹û\ËC ðˆ9Y‘M»ÈFMÔ^Æ"¼ÈÄ‹ XdâçOeÃèD‡úé$ãH$‰'ÄNJH©#ËI3YOZÉ+¤ƒì'‡ÉqÒëpÿ†ÇøèwâÛS’ÉüˆŠ!…Á "A$˜Œ!¿%±$•X‰“,"KIYIÖpþ ømœw`7î£ ÷pwp’:=LÑ ¦êî­û¹íç–QCí€@ŽžñäÏE8‰& ÄÈxŒ¡˜:ÔpS£‘ó¯Âáåü›8÷V–g'£ÞËy},Ùqügpßà*q…3|Ë™z¹üˆ:êªtÌ…–o½ ð×d,ã›J͹Œ"•ZêäQ£”UÔx‰.ãiâük9W ·êvn|…ø’¹¸€S8‡ó<F·˜‘‡8ËYÿÇv™EyŸqüû^ ž] Á[£Q@PNA–c9VØ…v9v…åZŽe9 Š'ƒx•bÔzßV,ÆxÅhÓÄšXÓ4žSgÚ:˜i›Ø$f:}ûEm›dúÇgÞ}ß?öû<Ïïù=¿ïï?¼ÿ5T-u'ú@•D¾ù’ÉOkñ%kñ)"¨©ÇÇÈd>6ê”2«j4âhÇGìÇØLü¿AÜãšÜÅI¼Ã¾x×qï1’Gx“•»É¾ñPý¨ÜR*Çê+°GÇsMµÔΆPSÇÎ20›l<@ÿ±?F-5š©ÑAոͽŽÉÞ¸Á5¹ÆZ¼Á¾xWXwq‰+0"<Á°¨â¢¤â‚üMTŽ8UK¾<á¨yÌX>–Ʊ¦þÌsî ‹qW\†·¥ ¼%åá¦ìÀu¥W7®hZpYÓ‰QŸ\òéňïv ûâ¸C8?î οŒ3n§&<ĉIŸãØdGÈáo¡N¡~
-øü^ø†?Ç` Š½STì!»Ç|†:ãlGæ˹<vîqäßáû›2®kµ ˜…áÃp>0§§¦áä´›V„#Ó84£ߛш3Û±æj웹 C³v`pÖöÌ>†Ý³‡10ûvÍù%¶¿ô™°å%Uè'›ŸÓ÷œ¯8V? â¨_LýHjóȹÂ{ß<µ3&â̬)8>'‡çÆàà¼$¼ör&†æçcp¾{T`÷‚: 5cgP'v­Ã¶ ~akð¡?øÐ|^è ¾.l
-ù©°>ä/ÂÚ…ªÐCÖ„|“/˜÷¨û@ÜŽFcy¤GÑßñØ9¤Á¡ 
-ëôX“n}ºô…Â+úRa¥Þ%´ë=¢Wß.¶ê×HÍ ›¥Æ„½²'á¨ìNQêô?Rjô”jýWrµ^•\ ÿEãkpŸùß4rýiÓŠ 2–)ô˜¬I¯~<Ö'¾€ž¤yèNGWJVRÑn0¡Í/´B³¡Bl4Ô‰C«ä6¬’ê ½ráUÅe8¬T.j* w4e†ß“(Nƒ*;STéë<Œ§ý¡æUÚ³fÖ€ög€±ô§Ó_±&k t§ú¡3m6:2BáÍСŘŒ&ãr4s±Hpb­±F¬66IUÆN¹Â¸Q.3îTJ3jJ2¾¯qoùØ5vãß•â U~Jº*ÙŸóëDÚ2j^¶
-s•XnöHNs‡\bZ§8LÛ•bÓ~M¡éœOé¦Íô[«éKÕ¤*Ö,U&’5S•lä#æú5/åGòè±i763–µŒ¥+“w.Ö§Ù< 9Sá¶ÌG­%Õ¹ñ¨ÊMEe^–Pž—/8óìbIn…èÈuKŹmranbËݪX-û4y–3>ËuŸ˯Èš‹ªää¨ò–lUã'¬ù j^,à^°±hË71žnÆÓFÖȘÜyP“ÿ"\Ö¹¨´-B¹-΂d”,ÇŠ‹`/(Š
-œbAA­dµµHy¶Õ²ÅÖ¯dÛ†4fÛiŸ,Û5ŸLÛÏ}2­ÓdZU%3_•³ÆÈS¥1î1׫Ô=W̽H;¾µXÇx:O#c©ã³ªÀåEþpÏFIñB8ì1°Ûõ(r¤£Ð‘-Ø6!ßQ"æÚ«Å{“d¶wÉYö>eyñ &£ø¤&½ø MšýCMZñMZ‘ª¤ªrúª4Æ;¬ùejŸ\ì¥ï³ó®A¼Œ©–ß+ùÛéáX¡EqÉ –Á挄Õü2r˲S–/d—ÙSY¥˜élŒÎN)ݹINuîVRœÇ5ÉÎ×5IÎ4‰¥Ÿ)I%ªœ´â)R’C•’ÉmÖ|„úGiÁJ%¬i"•¤„ß‹Ê
-UŠ+W¥ø²gÜ`í/”³*¸øì!mÄMœüVXEÏ] ˜kÇ#«ÎËݳáFz}Òêã‘êIEŠÇ„d‰žAï©–yZÅ8ÏZ1¶~‡´¤þ°SIŠªOŠrÿYŠªS¥¨ZUŠ®!ÕϸÂ\ÏR㻤ÏŽ@šH5ß5¼÷¹¬ ­IFJód$µLEbË<è[ð¬u ⽉ˆóf`©×‚X.ào¥ím¢¼ÝB„w«¸Ø{P ó‹¡Þ»bhë'bh‹*†6‘FU {ί'ê¹ÔZÏëa©'å|/¤¶¹™ú^@ß,í%¯ø#¦k&¢» jU8"W-EĪd„¯ÊÄ¢n+ºKÿÍu™G×|¦qüû»‰X²YÄ–•,–$–›&ni‡©žÃTUk_Šp’
-"‚ˆ$ÉDäÔ’PJ‹ ÌÔ2‡ŒUcÌLU«ÆÑÚjj‰:Jû›Ï•˜:óÇGr#y¾Ïò¾Ïû<ê’•¬È¬ …g³*°¬]FhÖI#tÞM#4Ó4B3`Ži M7-a° ­*tŠfpY Sa*ŒágCÑ~mŽÔw®·@Š^dQÔbOEäú*<7Ps#Ô)7Fayñ
-Í민Á
-Ρ üÉ
-ÌŸ¥ù¹jŸ_®vù;\yß)`ñÏj›cmAvÕ3yfó.°f ™øüN5`={e!ñ/–bò¥ˆ¥Rpqµ/ñR»?µ- T@i„Ú”ÆÊ¿4A~¥äkS>ö±jmŸ¦Vöùò¶ÛÕÒ¾U^ö#ò´_‘WÉOjYÌQËx?‹¾„Vv&g¦ó¨ùìžÙRÿ\)¡
-SMÖ4PIŒ…¬Yh¦Àx>]B –I¶öÏ•Rä)ˆ51 JjµIòØb‘Û¶2¶1 oc
-é Äš‰äzørjÀŸôE·§ý èo–ÚTKÞ;$÷]’++«>vöÛ½ Æûðc~ìÇZ†Z}-Í¥–b×b¼–
-)OÃþ<ì/Â~v—ë–VW%qmÒwÚ¡kÚ§ë:Gç6¥|"gÖ¿lä"\€óNš:u›ƒ[ã×–ÏjòDÑì‰æ+D1ˆ²¿ƒÎx4¦bº®j6ö³°Ÿƒýì–plVcwv·R…õ¹ø+—è4ñgý¨SX> ίu/`¶@Ûàhȉ+¸“ËÖÄ„f7rÞ
-¿N¸º§¯!Úë­ÝMúh§Ûoµ½Ùªn6\[›Óæ‰ÚÔbš6ºÏR•û\­wÏ‘Ãc™*=V©ÂcƒÊ=?ÐjÏCZéyF+¼n©Ôû©–{ó>¼@<¡½ÞiGK ¦†ÐþiùOó)r÷ÔN϶ªñ
-×––½´Ñ»ŸªZ½.G«¡ZÛz¤Ö´ž rŸ©Zå3]+}fk…ïÙ}—¨ÄÏ®b?‡Šüj´Ô¿Vþ§•ßæºrž(§­©EÏ hà!úפϣxzº ήA{ÛÖgÕ¯™6ùúhˆ*ºkuÛx•µë/{ûÁ*é0LÅFkYljZÚ1I©Z˜©¼ å+'¨BÙÁ[´0x¯æŸÔ¼kÊ }¬ŒPº¤‡üÊÄ~©+OQé
-B­ûÒÛ_Hê¿gî½3sÞïûÎ9÷|/>ƒ¶£Xî$–æEø êÒ®ºÅcU›8E5IsT¼@UÉ-wdªÒ‘«
-G@åŽ2#èXa”:ÖÅŽ;ÌBG§YàØnæ;ö[yŽc–ßqÎò9.YK¶¹$¹_’môqgœìŽø.jÀõ]ÄÓL,k‰c ­a­c¸ªS®UUê
-¥ÍTEÚ<•§'©,Ý© Ó£g¾Šœ¥F¡s¹Qà¬3òëL¿³Ýô¥w[¹éû,óq+Çù'+ÛyÑÊN·Í+¤ÙfNj?gÑ8žIËK+¼ÝMÍuñÜJ,«‰£†ÚT¥‡©ÒyÊ]̈QifœŠ3©È¦€;Kn¿òÝEFž»Âð¹k\÷m¦Ç½ÑÌvo³²Ü[™î£V†û¬år_°\™¶ÙGF¸ú9ƱÖlƒMÙÔ€xꉧ†º,'žr÷`•fE¨8;J…9SU3GK= ”çqÈïɔϛ«\o@^o¹‘ã­1²¼Mf¦gƒéò<`9={¬4ÏcVªçy+Å󱕒c›}¤fCV?§Ð8š+õÀ/žn¥-¿…xBÄRÆg±ÇT7\ù¹cå_-Ÿo–r}óäõ'Êãw*ÇïQ–?_nÐÈð¯0œþ#ͧ™âßb&ûw[Iþ^+ÑÚZìÿÈ\ìû¯¹x‰m&æàµÍä}$=é—î¥o…†%ô¹PF<…Üçó/o¸¼ù£•³t¢² ¦Ë]§Ì‚eRå
-d)=àWZ X)å†#°ÚH
-´˜‹›Í„À.sAà°x>0ã ¾7ã—Úf|>äÙæxŠü°–²hÃ×A,‡BðóeVVQ˜2Š#å*ŽRzÉT¥•ÌVjé|¥”&)¹Ô¥¤`®ƒ-
-V(!x‹± ØlÌÞcÌ î4o2cƒ§ÌØÒ÷ÍØ’ïÌØbÛŒ-²Í¸"Ûˆ+´cèì/bOÒ~o€&ôj`×ù<÷–H™´ÄiåƒäX®¤Š1J¬˜¤E•Ó•P§…• ZJU|([óCùš
-êæÐJņn3æ„ÚÙ¡Y¡ƒÆÌÐ÷Œ•ß3–ÙÆÌòÊlã1tzJٓЂÞ¨‚Rî}eø¾eèWJ‹«ð>ÕC5oå(Í]¥›k¦(®æFÅÖÌÓœU‰š½Ê¥WåjÖª"ͬ­ÒôÚFÅÔnÔ´ÚnM©= ÉµÏ(zÕÛš\óµ1¹Ú6&¯ègJ•m<ŠÆh‡ÛÊñ|PÁu
-ß‹^TB€ûœ:æ ^Z¸VŠÅ²NoA½µØ¦ÈŽ£ˆÎ‰£ðÎXX¤. ïÌÓ°Î
- ílPXç&]ݹCƒ;ŽèªŽ3Ü~AWo²5änºøýloàl$ϵ«Y‹PÊõ’FÉu+k YŠk“f`W£ÛÑ¿ýû¥‘XÚ5Lƒ»"5¨k¬Ì®I2º8è»8
-ÿ™¶K2váÃWî¦ì¡ë¡ùÚC3´‡d//ù½¼`ö²¸ö’äÞNžï†'øÝëüç @ÿ¡~:Èsš5PB­½wK)÷°Éwº“DÿçÒ¨iÄÃÒàý€pЂ¡vÄqˆ8'&Ž#ÄÑËaÜËÓËÆïeaõR‹#$päœKüÖþ»Èµ*5o3s@Ù¢;›\'ïEÍQ¿”†?* êEû7p ~Û‡)=I=ŽÓˆ?5Jzz,‡0Í቙ýÙ³€ÏK'™ä“À€'Ÿ‚÷xþ5ØWh¦Î+Ñ-"ÌlòMäg±¿¦òx4#JÞ”̧Ñ<'á9ø=œ†?ÀóWÑŒ £1‰9À üe¢ô2qœ§ù8Ïó
-ýU&ýÕ. ™×¨Åkà[îmÕïäH}ä›ö+iÞ¯¥ò¼žp#Ñ ;9 ÷<üÎÁKð2¼¯ÂßáMøfé]jò>só!&áÍñEš²‹:ŸTK—XÜ—’.SÄË p™8.¦j–káaÖáãRº3нþ”AŽWŸeÜ4ûôÞ€·Rbc¥‡ð/¸L³>e~>g|…Aùƒ`Ïš›ÉfNìû€„mÄìáÜÞh5@ßõ8˜
-q ÙP
-F¬Ó­eü;{ãv0-[˜žnrÛÅtí#¿ÃLÝq½®³úßþ•j¼Ähÿç8§¯ÄЧm>Gçuäælê–€ž“iÏE£Pï0'o©šeX§×ˆã<q¼L/ª“åúýYÛYº=Œ€-sô\—yLÛçÇ¿oΆ$@€„Ä€!Ø\æ0`ƒ ØØcƒm 6lÂaCH „œ%9HšPÒœm%½Ò´9Ö4RÔ4G©›Ö©«¦iªVíȦ-š4¥­¶e›¶ì·/ Òšýñ‘ì÷'½ßïû¼ïû¼ÏÃãü)îÓÍ't—³Ïpg–ÛäÖSxŽÇôôˆûó±x€ Ƭ€ZêÔQÃÎùÝÜåNúïá Â0îÑÇ]ú¸ýœsŠ«?‰›¸€ŒÅuŽü€«¾Æ¹ÊÕ]¦Ê W¾‡4ç™ö“™#={ÌÅÔŒÁOJ½5Ô*á:tÔ0ã#4qþV¦©N|HÐÇ5Æã*}\Æ.¼I\âž\Ğ΋x“N.Ðñy^¦s\áÙ§'÷y¤
-©¥¡Ž+´òä9qJxpBøq|N^3„£sÇðÊÜqLÍ›ÄáyÇphþyLο‚ î`ß _aï¢o±'LÂîŸç1uÿÇ4ÄtrÏßõX>?Lýéåí…á¸0?gÊpj‘ÇÃJðê‹U˜^lÂÔb‡·àPx;†wã@xû#F°7b;&"öawÄQì\rã‘—±#ò¶G~-QÅX´„MÿÇ7ÔÿšÏÌg«Ø÷¦Q;…O-ý¼ÆñSQóp2"G#q$*‡¢óq`i9ö-­ÆÄ2 v/kÂΘVŒÇø°#¶Ûc×akì6ÇíÆXÜŒ.#Ë/a8þ6Äÿë¾Ã`¢„þÇCj~Éòãc>1ï1½ŸÍŽÓÏÇ_¦—Cq‹±y,ö$È°31;VcÛÊJlYiÄæ$+6%90šìÁH²ÃÉA¬OÁPÊKL=ˆPêISßAŸì&ze?ÅZÙ#t§IÌ ›%UÂoWó9R2yÀ¹ÔWP›~Xža½ìJy;R¢±U–„±496®*Àpz9Ö§ë1´ÚŒÁÕv d¸Ìð¡?£}™ëÑ“¹Ý™ûC—üMøä7Ð!ÿíY†'K‚Gþ=2%|Å'å>KŸËäL!×Ïrl/ýŒç°ç¢—Í™s1š‰ ò e¥c [‰àšô¯©DoŽ=9 èV8PxáWt£S9ˆåÚ•{àQN£Uy^¸•ˆ–Ü g#÷?¡”ðÅ3¾¤Þm>óK,;&Y±ÆÍgßɸl`\á*cÑ—›ŠµyÙäŸ_΂jø
-Ìè(´Ã[Ø
-OaZ ƒp«6Â¥Ú‡jJ4«Î »êš°©>ª‡ÂªzB$a-œ¥@ŸSïf÷Ïü4™(c¯CO#ô²Ž± 1.½…aèV-EWQ|Å™h/΃·D¶’*´–á.m„«Ô§ºÍê^4©‡aS¿$¬ê—EƒúŒ°¨¯³ú¾0©ÿ êÔÿu¥Ò3J$a"?¤ÞõJžE>ñ‡ÉN–Å›èiˆ^ú—µ¤«t!:ÔQð”%¢µ,îr\ÅpVhЬ©E“¦v6VíZÔk‡`Ñn&íAaÔ¾& Ú÷EöQ­ý½¨Öü‹H¢ºâ5å’¸OÍ«zà4KáI²½Š='=駛qñfÜš%pi—ÃQ)CSU6ìU…hԕêӣAgF½Þ³¾&}
-Mé0˜¨5¡Æ¬Þ\ ¥U'*-ÐXúQnE™eB”ZŽ‰bË;¢Èò±PY~%Tæ¿I¨L’(ª{ÆÍ:àÛ¢Ã&`aÛŠ^ÒÁq½5ò·…ßë, Q[‰ê†xè¬2TY³QÙX
-[PÐ&C~[6òÚ
- ô”AáÑ#ÇcÁÙ^äÞdz·aµ÷0VyÏ#Í{2ïÏ óü²6 i­Ä-aU‹„‹œš-Ù8YOÖiæ¸ÉÉžƒÚåmìý¼@®o>r:#݃¬®•w¥#³K Vû5H÷æ·Að 5ЇäÀf$&±"p‰ëˆ|ÿwHìdÅê“°b† çÝ|—¨³• .â&7P[Ó³MÊó³÷`븪oRû#‘Ò‡äþ$3±2˜‹ÁR$uHYjA\¨±¡, íÅÒÐiD‡®"*ôcD¿AtŸ„¥½³ôH8ÅõMžEÒNÄLm]'{Ï
-©S3`ä¼ÌVíjeSËŒ[Û‘CÕh€ê(Âuš:.–:».X¤n0g®<ÊûÌ™+úË[¨F«_sa
-¿SðyH1g`^.õ@×÷UÉsú«$§µ’Ýzß 4Ãfp“'E—†g Ç
-m=E¸ž‹­ž¤®'˜õ•°ÿ½Å{—xÿ€þÆÊK¸›Ñ4ÂbXÆ94sÐ퉮ïj©#š†M’C½dƒ;Œs¢‘ærÃŽ]ر;ö½Ø±;hŠ(|F‰u€l¨…]pšw¾år¦›ß‡ {é)ñ5Ò“‡Õœƒåä º½ÐõÝŒ>š4ÛïA³p…&ŸB‡á‚£4çÇhÎ{H¿c_N`G#I#ů‘KæÉuŠX4²`ã;ð1°'-ÍÌc³Ù®quÜë¸x-t»äÉžû%—CR[«Ö1Y~Ö‚÷à}8€³6Ò9‚ó4ã.ûHbÇUš(€Mö¦ém™&>ºv ~‹f³¿“ت¤×ÙâŽnÀÛäéc8!µ;ݪu.4@¬W¡ ®Á§ð9|ÉÐöé¹ú ù-ì¸M“ôÅçùyw¡t±{ñÞé>SÝý”½ƒûÓ†ã˜#äÀIÉ? {çY÷r«¦Uë ø
-n
-Û§*oC²{Æ´¯SöÎÃ1ÊήÚ<ÛA ØÚÆß<8ù~Zg¢Õ¶ÑZÙf€VØ Õ²¶ÉZÚnœjÚMRuû©ªj?Sfû9ª´/Q…ýb•9Ôj¡Ã&-pÜ-“ãQ;]T‘ó-ºüÔˆçøŽ«¬ÉÒá‹>eo{gÊ)ÏÖQ~ÖÚh£AµN^Z椗0U¹Äi±áEUUn­E&h¡ë•ºerÍU±ë|Íw+W¡Ûr¸mз]Êw?¢<÷‹Êõ¸­Ÿ5«£¥n ký0¼I²!€vß™‹òWÕ_ín/³›»*Ü}µ¨c°J;öU‰ç *ê4Xó;Ð<¯1*ðJÓ¯,å{ÏTž÷\åú,PŽOfú¬ÓŒÎoÈØù·šÖùœ¦v¹©¬®?)³«E™]žñ×ùïC)Ë!´°*mžU2÷aËÂ.mTêÓAE½5¯kæú†)ß7Vy~•ë7L9þÉšå?^3º¥kz7£ŒÝò”P¬¬
-ŠØ¬äˆ%EœÒˆˆ¯à  †C˜E#à\ ç0–6–C9ñ,{rhÉa”ÖV™á®šá­É‘J‹ì­‰}£5¡ï 5D㢒46j¬R¢'kt´QÉÑù½@#b–jxÌF½³OCcNjHÌçð, Q-œ‰§½ƒ× À\ZãZ#mP¶¤GÙjR´‹Rc<5>Ö_ãbƒ5&.R)qñÕo’û%jd¿%ŧix|¶ãó4,Þ¤¡ñ5œðš^JØ£Nh`Â'ðPâ-ø?ªË<*ÊóŠÃ?we1 $€’
-ùœb¬Üoe§Èœ6R¦´pe¦E+#=IÆt£ÒÓs•jœªãLŒÕJ26(Á¸\ñÆMšœ±G±'qAÑÆ;ŠNw(¦‡4‡bS:Fë» Ö@‹QšU<—Cqóäñl6)c¨22ŸPzfÒL¡J5M”Á¯ä¬T%e™•˜U ó Å™«4ÙlWŒy©¢Ì4ɼK‘æš`þnkB–C‘&Èìå0#ÑOa4AÌ‚é`…0eIFs¥f{È㣤œ@%æŽVBn„ârc59/Y±y™ŠÉ›¢è¼M²ÌÒDK½&XZaY§pË…YŽ)ÔÒ _+4Ï¡°\Èqh\¶CÌR,‡¨r(†)ŒJ¦æ¾<zn‹?eˆ&ç{)¦À_ÑÁŠ* Ó¤ÂIšX˜ ÈÂtEXs4Þ:MáÖ
-…YëjmÖë5Úº]#­ÜÀÖó
-¶~©B:ÖÈwhì¡í^­0­J˜VÈE7Q)¹€Ù“ñ1jZM(òTD±¯Â‹5®d´ÂJ"Z£±%)ÍÒèÒ,-SHi‚J›ôTéj–¾¬¥‡PúÜÒð‡FC‘CÓÚžÏÝ
-)‚ilúŒu’Oý
-MÐÕ éõy"»±ˆÅujóúMžï©”5çàZåÁzƒÐõa»Ÿqi¾çÒûÈ¥ÁöÖgð7×`x®Àµža naÖ”»ÔÈw4Æ÷©ÑïÙ'?PŸü_‚×à\cÒ
-žàázö§ â òa:Ì‚¹`‡&h…6¦·5zÀ´õ=Ø}æ»o™­þÔx—$}£‹L™_éŽê6o÷pþ Û9oºÁ@èƒÁ ` DA
-dcaª~P•º§:ì۱߄ýVì¶é_øñ“ß?™ÿÁ4zƒ"ºJ"¯¼Ë<}®ït K=|ÀYxËéC?çÜÛKWL|Y[0ëÏšâÐ2¢cA£ûåدÂj¾ÀÏñãïøñ~|Ê´ù SèÙ¼™T?ÒQJæ zÒ9"ñ>–ßuqNÁ §ú?¾%wˆÅ—̺7‰Å5fÝ/”ŒN–þLN>V 1,Çv¶çb{%Ó¨ßáÇ;øñ[­¥|;Ñx…R>Àêâç<Z7tœHCåu8
-‡àÀ#>prWJU}ÑóÄs_ÖD¾ÂщÅ÷T½MNΨ@¿Æ7𣋼œÀãøñ:~ÅÃZ‰íu[±¿›Ê8¢}D|E¼› îBm'ô|î€í.85Égo‰ÿÁ¹ó-/Ö€Î(t"шÇZ:ös°_ˆíl—ñÙØ®Åæ|l6bs‰¶©ll¤2¶9=Ù‚ÇlâÍdsŠ¡ç÷ýÛ®­öëè"GÙ'Ù#ûõ$:¡èD¡‘„Õ ìçb¿]P‚ýrìÏÆþ\l.`w,$
-Ï“‘µTÇV½À·W“UD²Ì® ª—£»âîr¼]æê9Ç÷Æ Ž]®€Ÿ;åA¬é1ôü°B†Ãñ9 ™(䲬h”°êr4*ѨÃf,ÖRþºÏãy ZDd²+ÉG#ºr‹ëæ"Çü›pvrÔ¾ÄÑ¿…+`³Üµ^Þè Gk4:‘èıŽT-“éT—iL\ç…ƒ±YÌn0Ë°/Ì
-ÖŪ˜×ÿIíW=£› Æf¸8–Ý%ÉøK³(-¤¿¬‚Þ²Z¼å<å.z*<tU ⮥³b—e§e6ËZ,¯Ólù:M–‰…ñ”Š§¼#|Ë
-µÄŸËbFŒkßÕ£(Ç ðY¶ÑgIÄ[™§ÊLwU]ÕVÜÕ tT·á²vÓnõá´iµNÒb[Æa[£Ñ¶Aƒí6vÛר³©ëÛþ ꬟RmðvæB­¾CYÐcbALˆ½Ú7¬c~Õاz<Ö(ºm;pפÑQ“ƒ«¶gm%muvZëZh©ë¤ÙÞG“}„Fû~êí‹Øí'©­¿„­þ&Öú·©ªÿ¡ø=UöS]g<¥Öà¾]¶[œQ49Ü y Æõ; üÚß«ZºUS§=’öú8ÚRhmÈ¢¹±
-©ì°`騥¢³™òÎNÊ:û)éÜC±{šB÷*ùîs˜Ý×Èu™÷÷Éîü 9ÿ §Ã ×e×npS÷?¯ûuBXŒ‰!Ñ'ºDk;4(>Öº•ýº"±tÇQÞ“DY‰Ò3%žRŠ=V
-=xÚÉ÷z1{GÈõN’ã]a—÷92½ŸÁäýéÞï±ÓûkÒ=ŸÑc`ê~Ê5Ùî3ât¦ÅááRLrH»®[ú(ï…¢þm $`H#Ï·‹\_!9¾
-²}uìÒàeù»1ùÉð³Ó¿Hšÿ4)þ«$ûï’è(~I¢ïï$ È=÷Ë5Š«ÒXë‚E±_Z#¢_t ½^ꓬ}ÒWt,RTÉŠ$k$S ‘Œ@:;¹¤ŠI T“h$9è")ØObp/ ÁyvO¼L\ðMb‚ß&&ð¾ø+±#r®ÃròCõ|Ç¥ûÄ ÐpÒ!Ò®‘¶Zjä”öBêØVCq$„’…‰øY”ª!6ÔBL¨‡í¡a¢CSl a‹‚Tdè¡o1þñ'"Çää÷lg¥qHL‰ Ý¢Õ§9(íJi+"åJ_±1uBp:’ع¢Ã D…SÙÎbs¸€ˆ°…Ma}Ôa½Ü°nËBywîšx f•kf?T#”ƒ›‘“œVJÙ­ïaH=AÛaÑ+\úß8¢9°JöI_ñÈ4)³ÒŸ‡ØÅMD”ùZ‘áY‘ÙXI׃(ORS_US[ÕǶª\µª[UÎ\=%®êø=«ð¶¢@vP5,O8"Y=ç¨Ô%]Ú6ë™mzæ²I0ÏH_º)K¯¸¸ý0l>.³wR¹ò¤ ×)ÕñŒŒÆZ†šL®-vëj°ëú¨Ö5ë!¡‹Ö/êøçÅC«pøÌ'ºV5œ4X–Ö„†,(zõÛ©g®›Ö Cþ¢ô¥›|Dú' z "ž•þ9ñü&5x¾óªãÅZpTÇ%Õñ’ü -vz'—5Ñ7ô` BïcㆎSç} óÿ&TÃyéiê0(:5Ö :½ò H×tRúëw¢ÎK÷’¸Âc£©ÿ)¯j<®)ß^×x¼¦÷rSïå–긭…÷ŽšßMìÛz°Û¼[¯ˆ¯è9ø›ªá5ƒYi…Gcݲª9 S OkþI7é‚Þýe½.•¹Ö5âÎÓB ²í2â‹“{2å÷ceˆù×eõyÆñ¯(”K–kÁ]XXXv]`9DPEEE-â}Ö3±ÑªÕ68ƨÑÇš&5UcըʹMššúG϶&iLšLâ9šl?“qòÇg~¿eÙçû}Ÿ÷yG¯ã£ YµÑÆ&×Fa·‘ÔVÒÊ[Oó?Ÿr‰§&û4Ý‘ ©CÊƹšäߢÑíÏûԩÕ~á?­pÞ
-Óx½¿âä6§Oïtò´Âk?ñÀÎÅøüS n)ŒqGŠ>¡ÇüH^òWBéÔŸðqçèsϨ‘سuŠîõÝçÛø8¦Mhl§”÷‘‰6´Îêu¢½F¡ô*üöÁÞ§<°k1N161´‚){:&Ê2lâÖQ|¼‰#ª&öxÆÇ!MgÄM:ˆäc¿Ö ñw’ƒÚÅ/wõEªcj/ÀvØÏwz¸×YΗ:—ÛIrq”\¡.+ vâ»Ù*
-¨¸aÚƒÝøØIîÐ$bNgkbw%[éz\´h3n6i#‘7P›ë©ÍçP]ßIûû4ou.íw:·ö­h?¹ØK.vi
-4jИ€ÆTÍâmnq<ÌMe>¨¢Éì“ô_x ¾ù­ýÇÌËy-°÷5Å+8Þ{wÑÒn}W0z‘h%¨¹KŠšºdhVW—fvËWc·!šÞ½LÓºRƒß8Mñ›¬I~³Tßc¡&ôX«ºž[UÛs¯Æõ<¢1=/ª¦÷gªñ¤jßjàb(GÇË‹lía5ï‹Ã¸öphÆßì
-’B48)J^K‚<–åYìÊMv)'9_®äe§T(3¥VΔiÊH™¯ô”g”fÝ&›õ ¬ÖSJ±^ãù@ÖŸ%w°½Mè.³Ñï¥rdž±PÉç2(áûbü ¯µò¬ÁÊ4@n›Q.[’²l©ÊLÍ”3Õ#Gj±2RË•Nc’–Ö [Ú\YÓÖ(9íyYÒ(1í„ÌiWà¾S}JjÇæÓntÖsõ\œN-Ú©¨†r>—@ßåã)—§;½·²Òƒ”i“Ó£Œ “ìV¥gd(Í‘£TG¡9ÊduÔ(Ù9Yg³«drþF ÎýŠwþAFçÇ2:î)ÞáSBØ}Úγ´$óô:PË´†ó^ ùàæû,žgÙ3•–Õ_©YÙ²â5(Û¢”ìt%ggËâÊW’k˜Ì®*™\õJp5Éèf‡uoQŒûeE¹Ëຬ(×]Egûž“åS ±Wg²Ñ’L†1P%P
--Z¢þEÿ'»Ìƒ¢>Ï8þdY–]p9d¡j F¼¸äÞEv À‚Ç®" «!ˆfRÏzD§1j5Œ6É$ñHÓš£‰1‰ZsØLµ5‡GÚ´4u¬Svœ´Ù~·íLúLJ=øíó}žç}Þ÷}ž­J,}Z¶Ò—e-=/kÉMÙŠé\!iZP[O»ÑhÍgÀ€J(†<ÈE{,Ú#‹é»K¥!å‘ʨ4+ÝiSš3E©ÎL¥8³”ì#»+W]EJr¹dsÕËêZ W—,®ÍŠwýXf×Q™\gç¼.s%kÅ=~€FG!ç":õP eP“idzÑUFüè3ª8ª¤dwŒ’ ‹$ÙŒ4Y!J0FÈbŒW¼1Uñ5劫©‘©Æ§ØšvÅëe<¡HãyEgé¹
-_+ÊTtuP«ÐX\Â~ ÆZpA ŸóxÍA{ ÚÃ]è36:<RJ 3àÌHYLŠóZeòÚ5ÀëPŒw˜¢½*Ê›«Ho‘úyù· $½ R^ƆƒpŠ`éšêﲃ}t£Ñ
-•œ‡¼V@Lâó8´GTKC‘3ˆ¿N²1¦ÄÏŠPìÜXõ÷1Ãø¸ð}\¸~u?®ŸMìgýñ3gú›!ÖÏ0å£Cò1¬ù†æâÃœ`íäv.×ÁtÞ—ÂTÞg»Yb¾3Žôg¡ÏÈï—`6¢•F§¦§fc!ý"æ©
-é2A]ÁØ•KpSåë9 Èõ(bΠljÏP!ÝŸÂ+aÍp:¬ñ+ø5œ ‡ÂÇpH¯>¶?ctÍ$Ý`]¾¤9¼ÉÅs‹Mx›B»à@w~Ç„ ‘q`…
-£a2”B5ÔÁX
-ú?>Ç?±Y>c2ý”ºDÑ|„ÊoIÖ9Ýd¦ ê8Çá8ú>¨//w•@<)Ä3½Ñ̤‰£ûNìL® ú?>Äß0ÕãÐú
-ÿDó:\êÓfk÷m÷tÌä*tìÓ3zßs¨¶<l—`Û‰m¶gb¯IËÇ
-´R K9Òºñ`­6¡²oÖ“‹ul®µúÜÕtÿÃjàÔÖÅðÖ 3œèI{ÈÅnYа£‘É1™…ÆüÎÕfå“íì;±ïÆþLì5bÏÏJ´q´ëaþ®À‹åxÚE¦:Éd'•Óâ²¾uø#zo‡ Ð‘ÄÍF¾BWAâ¨t©h !Ã#Їý‰Z‰ÝøÑ…áG'~,#íšO&ZÌD½ïÛX¡ª¤…Ú\@m. 6›Ñnïòs­¯ÆÜ;êwÁÞ¯]‡øñ{d¹XN}v²&ºQhdk‰&¡QÀî,EÃÉ*xШÇî¼h!#í¬Î#|ÚBåîÑ,Ö£‘¡‘¨½ìr/Ú!á4Gû®™Z¢-°
-ºùÜÁ×Îu¸T&b²¢•ŒV&Ö³ÐÍn˜€Îdt
-Ñ)C§
-Z2шíùìÞ%TìJÍ ›µTO Õe°?<ý®Èq[îÈ Üýƒ}¯Ç¸öŸåXßÆ‘ºº` ŸÛø¾šã"ÕmÖ¼þ6ÍLÓìþC4+ê5F•7:Gõ1SUS¬™1•š1À£šõ2b}rÇ.Rul·ªLTi—*M½ª0W¹é¢Êân©Ìü/G¹î÷$3ïÑ®¤[ÊkK
--ßÍÆŸ&X¢ÕdŽWƒy êÌ͈¦ÚøQ2âÇËc™$·¥@Õ–2UYªå²Ô©2a®*ª,a¹J¬4K°ÈÚ«ëÊ·~ª|Ûß!È{N`8ŒîNZŽu\³Ä>Þ7ò]ÿ›/µøRk3É°Z嶥jºm°\‰ÃåL£Ê¤ïª"iªÊ’ŠUšäTÉÀZM8K…[T`ïTž}¦Øwj’ý9M´¿®ûEå$ßQnr°‰vÎJôˤþ“®ÙùÐ3i“ ¾¯Æ—éøR•-g²E)v•¥8Tš:LÅ©#5-u¼ŠÒ&©0­PùiåÊäÑ”A^MÔ¬‰éíÊI_­ éÛ•¾OãÒ_ÓØô ë¸ÅkÏ÷x
-­G‡Ò‚ÒŠ.¢ œ õ`ð¹Šï+ñ­œÜ”9"Tâ0kš#Q…i*È¢¼Ìáú7Ûeõy†ñG (—‚A–uY`wÙ]`e…]•]6ˆ¬xâM0žxD£†â ‰Æh´ä›hÔ¦:±­©M“š4¦‰=Ò$ÅΤÓvÚI›ÔÛ´¶;³ýÿ^3æ7{ðß÷y¿÷{¿ã©Íwi¬©J>S¼¦ªMMª,˜)OÁ"•tÊ]Ð-§ù)•šËn~]6óÇp¢²Då€o ³ã}=׿%؃¹Ð
-M|žÌ÷!ò©§.ãÀoNP­9M¾1#U3&_Õ«ª,UVÈSèSEᕆ嶶Êi] ‡u¥ìÖ.•Xw«ÈzH…ÖÈb=·x•µpgÐÙŠælA»S¡‘Ï!®ƒãùŸŸ|Æòœ·(^UEÃUYœ©Šâ\•—ŒQY‰Mî’29m^•ÚÆÉa›,›-¢û<Ù—«Ð¾Yû.™íe²¿ª|û9¸)“-ª0—pv Óæ*½ˆ-˜M0 &ð]Ôðÿ*¨pĪ̑,Wiºœ¥Ù*-5Éî,’ÍéT‰³RÅ®:¹&ªÐ5UW›Ìî¥2¹7j´{§òÜ/h”û¤²Ý*Ûu]9®¨rƒìFc3×Îe.æKFB€ï|P eàä;GY¢låi*.ÏRQyž¬VØe©(—ÙãS§^&O“F{f)×Ó¡Q•”]ù¸FV>¯LÏ+áy®ñ>ª¬Š¨F–GµƒØˆ½¤¯ÍÔ
-}/Þ«P06F£k“”[—¦–²ýyºÏoÑH¿CY2uÊLRz`šÒ •X£ámJ<«¤Àq%Î(ÑYIþ{J®‹*¥6ª-h¬¬–棘
-qê]øüC“˜&é9³©‡õÏx“Ðò¬1¶~Íc†ÎIÃ2è7e§á8c•~³ö!|D¿^ K¬ÙKŒ—Xð}4YÔ×+]$ØÅ>¸£À#œI̯e'{
-në2.ïSÎïY4¿£y­½”åy] ˜çõC4ÏëÝbš¢ú9¼ehŸ€ãÿ'‡{øÌ»Ja,#tZ\S ZŒ£–ø!}‚ŸêÃ5}Lá°Îâº>ÀU¾ÇÆñ3òø õxG;h“^Úåms·{†V½¬ï3šï¡ò]8
-‡áÀåÀJe|âIé·†NSÆ4hTÉO[„ˆ}?±#ÄžIìy´êbZg)±Wã*7êeõÐÆ»ôïj‡¨ÅAªr€™zÁÐ}ž†}FwûÛúŒ–ㄧ ShÇäžGîV4\Ô­šØ~b‡ˆ&öTbÏ n•_Äò}Ø«õ ýÑ«mÄŠ¿ÚM-vé§,õϵÅ'`| …/>g,³“Æ’8B-^T*ñG²™ˆ_L|7¹{Ù¢üÄ»‘m«™˜Ó‰9‡˜‹Ø:—w [i³ò¸ºÉ¨‹ åFµ™™Ü¤¿ò`< WÐ;k,÷—áExö²NžT2yg?‡øfâÛˆ_F¥½tŸŸøAâ7
-ñZ™…9#‹9N–³ZÖ“I:Y'«¨Ö
-ª¹\ïÓ9×yþåÔØv÷Û2»È?œø™ÄÏ#¾…Èâ—ßKÕýIJBÐh&þtª0—Uû
- þà‚
-!:Ì'©‘øã£×ïë÷ý}Ÿßù<_+ñ–£QËŒ7 ÑŠFQ4âìÔ$íMÁ,«cŽ]³O›‰x½™aö¦YEVWòÏá^e¾Nº{‰Ô{®ˆ´JÚ;ÂõQÒÎ>žï!®ÝÊctMèØè‡:^FÝNÅtúÑf6R´;ÍI¶ha†Ó:fmœÑM²‚ÇØE£¬¼QÝÓÚ£^C÷"Çú)RîQX€Ý¯s<ÛÎÛ
-²µuM!}*F«jTêÑò¡ÓÆ tj"«Wë²5ž=¦dö¤Æ²7kÄð°† 7,jÈpV†Ëê7ÜPÌðE×,+šs_ÑÜ´bð%4—J˜{JÂCvJ.ØÁïYžm\)W‰eʘ£©£&ó¬šÈ+W*ß©d~ƒÆ
-Z4ZÔHAD‰Â˜â…Ã*œÐ@#S4¯hÑ‚úŠŽk­ñŒ"ÆËê6ÞP§ñø“:MAZ]Æ´® wšRðIJãýôfaŠû žó’X’æ<™Ì1Ù”097»4dnÒ€9 ~s§bÅ}ŠÇÕkIi­eFËœº, ê°WÈrFAËeµY¾*¿å]ù­²
-Û7(hß¡öÒ}
-”Ské³j.½¤¦Ò7ä-}G¥Ë\ÓÜ“á<:ŸBó %àC¤ØYXcÜÇ)Oø/Æ;Qbé-ÏSO™Y‘r»ºÊ«ÔYáV¸¢I¡Š6+»Ô^U rD~ǤZ[ÕìØ«&ÇÇÕèxFÇ‹r;^—Ëñ¶êäúîÉŠpãhî§ìÚáÆ’À8$¸ï‡¾:jâ‰0.ÕkÔQmR¨ºDí5j«q*PÓ m«ZjÃj®í•Ï—×9¡FçfyœÈí|BuÎÏÊé|A5ÎWUå| þ
-dŠšeŒÚT­TaÔ¥‚¨OùÑ rc½Ê‰È›VV Ã0ÅÈÆÑË€‰âoúþ
-éUÒþNÚŸê` ÝâÓ+/¿Ýh× ]±V²G%K¶Lƒù*ˆ›”›°Ê(Sv‚Mž`á&Ô$›À´&0Œ ªF)~0CÄ0”^e¯oÁ­C#½üîäY;øø]ß#±íU¶ ›bƒ g)4O†$I-Yüà@OqئØÀ)XŠŽ¥ø`]ðx)Œk
-Ó˜ºÀ»¯æ$yÒ«ì¢o3h$a
-<ß…oÃ7á9ü‡â|N¨ƒFb-C¡OoãcÞÀ¹\#Wp9/ã|^Âu½È¹Š|Ž<~K¿¡hM‘^Ñ#8Ìï0lO1|ÕeÔ.åc¾_ú¿Þƒwà&¼©2â؉ãÖ_ð3/ã©^P'ú=‹Cú%îéiœÎ/pZOà¾~†»Œ|œÍâ1òø!Åü}
-ù"“zARBéLÎy½»û,|>ŸÎçðOø°séyxŸù4cñ$cñsyy‡0åÖÊ;¤ÐîG{í ´W¡=‡öíhϳ<¶â*wònûY6e6N“ÅY–ìâ]adÞZˆyNÀÇá8°Kð΋eôT¾¼/·df©¼… }?åedÛÐNëaÆãóA{í)tgÙ"Ö£=¯Säq’y9Á¦ò ¢Ü¯3ú
-Ç¥èOÌTnƒðaدïwð“ü’ûj~ùŸ‘ m+ÕåÐ'ñº§`¹6¡@;vía´³hO²…Íè0y$ÌË>íf{;¢{ùÕn2¿‡ÅµSÏ°ÝÞ€ÜÛa<—_ÖœêúB~Ëc7EÿE]ÁëÆëÂëTúÍÚK÷2/{¨Ó]B?‹æJŽ5h®g¥ÜIÛ8Zö±rŽsÌœáÎy²û)«éuþçþË&x"¿<”ß傽 ǃ‰Ü-hÛQtýú1ôè§Ðï£"‡ˆ‘Eo’•2K•n B>@6»X=Gµ–‘œ£Rf©Öf}†•6CìÙ<ßËo»'óGÛôÂqÈÖ‰JúeäkC¿}7ǶŸaŽð1’¬Œ1úˆ1ŒÞ-ŒÄ4+fÕ:O¥l#«¬¢¨à‡©ž <ñ+xr ŒÃù¶dŽ™û8òö”rD–.¶w-¶
-·2k‹9ês†9YÃÞµšÚXEN³f'Ù;VR+¨ ÖË8WYž\N¦cÔço5ÌÌRÁTù
->K¼c´@» ZûbK¶†ëIç~–ï—›—hy‰Y£E6Vh¨°Fƒ…~ , )³¤Y}E õ¥ÔS”Q·iT]¦I¥LkÕiºSíÅ;•,>ªDñƒj+>§VÓ%µ˜®ª¥øºâ%9µÀib"î6Ž·NÞ&!Ëç½ßË€µXf‹2e†z˪Ôc®U—9 ´9ªTy‹:Ë;ÔQÞ£eåÃJZV¨Í2§V˼â–j¶Q“åAE-ç±\RÈrU!ëu…­9Eàqös íèmo«hnáÿ0ôÓ*÷ò]7ÏtÙ Ôµ´Ti›U)›C¶jµÛê”´…”XSÛÒ¤ZnÅiþcÆ„šŒYEy…j0Ž*h|JõÆ×TgüX>ãEùìÿà:'?'ÆnâÝ…=XKÛ³’ö|”ÿÐý49u_;Ï-s)é(WÂa¨ÕQ©¸£V±Š€š+ÕTѦhEJg¿Âάœkpn”¿r»ê*Ë[yZžÊsrW^Ruå pSngN5pñwoc-u@[>CÐ )¶V­äÓB.1W©š«ljtU(êr+RíW¨:¬†ê¸‚Õí
-¸ûäÇøÜ«äuo§æn¹kÊUsJ•5_–Óý#9ÜÏ«Â}ƒëœ*«s:„þÝÄ»v|ÚOýA?tñ¹´bq¾o&ŸFò‰xL
-y,j¨µ+P[¥úZ¯üÞ ê¼Mòy“ªõuËã‘Û7)—ï6Uù>(gÝ9|'e÷="Ã÷Ù|¿×RßuÞœìp
-›9?ÑÞ€öڣس^è€V>7C„ï‚Pǵ§Irag+Z
-e´•Ê–°ÊšpÈ’p©œÂ1“xi²E%É”L˜Æ%ÉI$1ILY’Ó(‰ IpB'žÄP½ø¬¶œ¶oÚ+h{Ñï‚$×qhä~ü\×rß…uc ÊHÊÖ^"sÊ¢’”!SÊ©%)
-S jŠ¤ñVé `Óø«ôVà4NaRRRlœÖäÐIÙ‘Ó]hϠņd “ë6hŽ3
-Š Gñ@e"
-ÅJG‡CÀ)ãØ)R¨ÖZ§ÌСPflÇik©RA Te¬jÙ~ÞìÛNÿøξ×>ßç÷¿ßóe`À.˜Éц³ñ£?:ñ£›œô˜…ÖMðº'
-Õõ>ºî=à»è™wðã$ñø) tŒ¦9Ãa|ƒ$ÆÓ×Ñ™¯Y¼;Á6ÐîÂù¸f¥ð‚•â_)ûÙú…ÜØb¿ Û5خǶ©Ú&b{¶gb»ƒÖxû µOË)¥5dâÚt;m´G/QÀß'*;ˆä÷àì›ÀÓà)p ¾¿Xåô¾Uæf{&‡ÐwѺИ¯¡íöP¯àÇnâñã.ÞN”ßíÔÈVjd ~ôÍêEá=×Kxó:\?דDtœO€Õ`X >¶Êú¤ÕÞû¬-`‡ˆU±2°›K«ú@ ¶+°\£g©§Q”Q´¨‘õÔH/5²?ÖàÇãz ûOR­ýz”æ^Nô–é·l·ß°ÅǨ Ùc~g­¶;hµ$»ñíi=±è• »ÙlYnlá þWÀPƒí:l7`{¶'Ñ!­ØnÇî-àn_Ï%sˆÅƒtAz·›Šî†×D—…w¬mÀÜ_P|û¬ت°”Ž]>ç`ÛtdûØJÔa¿ûã°7‰#u:ÕÑIDæQ±R-4ƒ,M§GZYm‹þ
-ó*ÈÏ—'ß'·;¬<w¹rݵr¹åôLR¶g¶ Ï9<«e÷l–ÍóŠ2<?Qºû×วŒ|Î lÏ…kò¨™1¸ C@Ï"øS ‚|ã^PP˜,w¡My^C¹Þ\¹¼…Êñ†äô•*Û7T†o”¾fÙý3eóÏU†…Òý›”êYɾ7•è;®*É{GÉÞ˜Áæƒðµ WÇ!êA ¨ƒyAÞû¸¹Ï-¤œ@ºœA‡Œ ¸åɊȪ’-T§ŒP“ÒC-J ±Ó†–)1ô”B»&Ãaa0ÈL¸bZŠÝNø¦0‚uÈ£j~Ë@$À_@ï½ÀÃuÏŃd„SåˆØd‹ÊŒä*#âUz$¤´H™R¢Ã”mTbt²¢•(º"ÊI݉ÑÀ)¡„a³„é%ÌÙ‰ÝÙð>ÀÈÙ¦A׃A˜çAà‡·à?L— p”å†ßÍewÉ^òg³¹’;¹ï†ìn² ¹,$„$Ð\ TÄ ‘’
-„‹­ãD¡8Vª^¬µ”BqÅ2¥…Z†N¥ö6¥#Œ2ÚÒ¢±í ØÙ>òÛq˜—Í;ïùÎ9ßùÎËo÷Òyn”'È[é«Ú%gÀ+{ ]Il%
-e VPÈ!ÀüdŽ"Z‚ˆ¤ º"ø8Œá<À<]ÕLpUq-Ãî@™Ô‰h
-²¸öc> )ë $ÈUc—£Ö¥¤ &ÄSÜa
-(ŒÁH w#Éâ)Â<a–s2…9¥C§>ÔÞq-ÁîüJò€íFP ª¸.ã~1¾äñ›Íµ¿~L{‘ ®MŽH²ëiô 4Ú©“ -JG l”¢šl+@È5¡¯¢c`œ÷*oð >40E70¥c»Û­ Ô +¹WŠ/üæpí¯¿ýdK©—,1!ÊÛÌa7“¥•fÞF3ÑÐbl¢‹ál m› ¨‰B&†xjG¸´ä›Ø„øÐ×
-¡É·à¨Åe
-Ä×)VÞ’)V¥óšp—ÈË»ôK4Úw(¼_“à ¼ÍBÎñáÏßSÕûî4n;6YëÝa­s¿µ¶Ã_¬Ëâ¡Õ"™¤³àxPæz^dŒtÐ
-u|L/½ANþAùÞ#ý•Âú$^{Yzÿ<S­þÏÑUŸË)¦®ý ”[x30•IÏPJ_e:F=Žè3ŠæSÔå?)˜(ÑëÈG,â ¸J€.ãÜïyó_Ÿ
-ë¨âù³£Ãt€0ÜPÌÜÏqû5Žþ;‡@ãH×1î·q¶(ûNì{€‡äÀQ@¦ÁS ÏtìÕOxÂËZV1j¨¡ƒTW€ÝS­çUE¯¨Ò_Àmç^\[ÅÆœŒ$- ƒzÁlÐÊuÇÞ ž5àO}‚Ž8¼¬! dÀ• W!\¥ðTÃâÿFl·ãU"[ËyºO·µ½dð¸n‚8÷âÚÏ(GÊFã>ÆŸ9 D¹®!žMǧš)‰ª±;Lr+ªj›OU¶,UÚòà*†«‚.V_½¦ÙZUbëR±mP…¶¥*°­Qží!ªy7^ÿœ'’q~ãú&÷À¹ˆ±§—£>š@¨å^gU ÂcS…;Y))*wzTæ0Tj÷«Äž£b{¡Š¥*tTàˆ(ßѬ<g§rýÊq+˹Z™Î•áxJ~Ç!¥ÛÏÈ—| ÜqmÀþ2øË»‰[Á îU‚2žO%Þ${*v»TäòªÐåS¾+Kyî<Mu—(×]¥wXÙî&ez:”áéWºgX>Ïjž-Jõì”×sH÷OÁUð/×ZlÃÓÇ(ÜÁ¨Ñ " Tr¯ ”àOï¤%*ÏHV^ªSSSÝÊõÊIõ++5W™©ÅÊ0*å7BòMJ3:eòKå1VËml–ËxRSŒ—å4NËa\ŸÉ‘JßÆöbøæ1Ç' ªA9÷J@!Ïóñ%7=A9¾$eùìÊô¥(Ãç•ßç“Ï—­´ôP&#}º¼éòøcrûçÉõ?¦Ë8Ê«
-Ão6»Ù$›,›Ífw“ýI6›l~vIHBHè&@˜J$
-†$•AkJJÁJ¥´RZ•j¬Å¢¢ÌXµÕZdZQ¨µ t:0ÕVªv¤Ú–aèV;èúÜìçè0/ûåÛ½ç=÷œsÏ}o
-|ŸÓ·Cy¾d÷}K¹¥Çe+½ ï{²y¹3°½¾ë‘ÀÝŒ‹sÁlP⼫¾¯À—`™Mþ2»|eyýù*ñËðÈ(!ªUh+ت‚`—œÁ>9‚ò7ÊœRN-àF Æ¢®‚Œ6`|K‘ZiÐ
-’ Ä—¢|A|ñlòrå :ä)wÊr©(4K®P©
-ùQ~¸RÎpBŽp³ìáNÙˆö/B×܆hD †Ñ²!|½ÊÆPNc%|½aÎ#hŽpøŒƒJF¥0ß•ãK <G¾r›¼¹ò„ìrGœ*ŠºTPéVÅâ¨ò+·*¬œXç“€-¶ Úc
-±-€[©ê ø1Æñ!ÊœåÞ…ÈïöJò
-qÅ´õ¼öyÖ¼# 3Á×6\/5ð†ø»”ð¹áÍï™Qÿã´øŒÐûˆ%úÆ,áiD e§ ÄÆ$~l¡6¶“[)°Íl&`“,Ø4Åoö!š˜$>öë2ꄯ•ýÖóMSÄÙÍ~†w9XeqrÄ‘ìÿÇ&Áf°ÕâÛÁíàNjänüø µq/õ¹‡Xì¦6ï,ºƒéaç“Òôo¤©©“ý¦øºš=puV?ü&¾kÁ¨Åy“ÅG«C&gð–åÈ3Üd…¹L(9!éQjä
-öì!Îù#–¸°„î6ko,c\ÉŠðÿòAü(øª²f¥ï‚Cà~åÌå²y†Cv„Í&¨‡Ú“äã{OKß¹¨Fê*Jˆ¼¤ªÐìy“W³Ï=烀%¢ÅÍ †çqe‡#3 pÜHáÇå†\“΀³äåjô<9y™¢{‰@Ÿ&°/|N:‰gT ·î"bcö|'àkÖìðuÐâ4Ãà•Jg-®_€-¾__ƒßƒ?×Á[àmÎËrr™³z‰‚{Ò¿î”þr€ßGQ
-•-¦@¡t¥÷˜%þ®"}€vĮ̂N£|S tÏLF×8$P¬ï3\¥PßE¿¿M
-3l3ÃÔ‘Á–Ä)e­X›Å%üx?þÁ<ó>jø*Šù
-
-þ-tûëL4¯áÇ&¹ßqXÏsh^¦x_¢xOãÇ‹øqJ»tR{õLÇ(Ž£ú™žÖßPõÊ&˽Üvƒ+p^¯Z!¤‹3ûNe–8ËqŽYæ ÚýÓÄóøñSâqŒ†u”Æñ êsÝašÅ(æCº™2ù”ž ˆ¿Mñ~“]äô
-¥{mfß{ÌL¶ƒmà5øÎ:'“`6Í?š)³=Å|wˆœ|_APÅŽê±ÛL„籟.ìöÎL²ûi$_¦y=Bãz?"÷kŠ£zûÝDZ}‚§“p_!B<DKƒM`˜2:~b•¸9^_±ŽÁÃÊ#nÅÀ‹ÝrŽGL_À½øñYêã^.=4ñÝäæ.r³‹Ù‰;ÈËvÝÂo'3÷é“x¼…llÖy‹†ã`<g•»áþ’uÍ‘Üv‹*Ð49ÙÁŒ9ÍT´ ?n#/[™©neú»… t’¹™ÜLhílˆ
-ÑFþßÀ¯n$'ãDhŒ R-ë©°µðƒU`¶ŽüVÚfµ&Ó&L{ü¸ìØs(!lÇ°]‡Ýv[aì`÷ÝØ^L…öS«ù7
-ÇU;MÅܧ°,§Š¨ú~x? ú,<fñﲸÍU`®s%™v½†X SŸ«ÉÉjjcX~l‡ð?†í¶“ØmÁnQèÆöìp¥ßÀÓ¼ÚJÕÜÍU¿Ÿ¬=ŵÿ[À}mtó¹ÏÚ¿¹
-6ZÜæº0×jT´qlÚA!vÝ „g?†#†ýö“ØoÁ^vP­}TÊ æùN²ÔAVçQQíÔf»^Ð\Nû\¸çZ]g¯³ÿuÊJËꘑ*F:tÉœJÓ3Òš¼pàc?†ý¶RØl¥BæãMæ™fbÑÄÎfsR0¥¨º$Í<©7Af¦û™ º5†²e%Ñ"æÙH'#ݸñ°î
-Ô8ïc Ò•£h¡C‘ü|Eò\
-;Š¶{²ûTn‚¨‚ö¸ö¤üö6•Ù»ä³÷©4wXÞÜ*É’ÇöyyrÃûgÁEðo²šÑØ/óè(Ë3Š?³döoæ›%3“™¬$$`BH@¢¤ˆ ‹€U°d“­ì(Q¡"‹¨EED
-TP‘M(ˆÈ–º€- âZµ"¢‚"K¦¿wæ;=§žþÑþ4œs3_æýîsï»Ýgü}àêÂß–6¥(M@ÏrAˆk&ÉЬõØ%êvJÄé^ ;’î KÈ— gœM@™ø ú³Z|ÎâuÍ9I<Ž9âv,—}“¸l‰+팸¬ O8:ê¬Câ_ ªmkÌ÷<bÔõ™$ìµJº×.!Í)AÍ-A&.~OHtOÈŸ§H¼ZsÑ´ÖâѪŭÝ$N­VÚ±i³%M["VϱxˆÙsRÌî„Ü¢Úx:À{u€>4ù ›gqéºYBzšt»ø}NÑ}.ѽñz½âõDóEÄ£gqé%âÔ+Ä¡·›~ƒ¤éÅ¢“NÔéy}d8/aÇKbñrgÀß¾*bNEˆ}
-Aß3A ƒß"¿Mü~‡èºK¼º[4¿[<~MÜ¿¸éâ ÄÄÈ[°©¤[Š%ØVÌA²[ärÈNjð?‚„ôåý]༆–¤e˜y
-´4J¹C96g! -dSCI23!Ýrmœ3™ò‹AÈæ{ŒZ"ÔŠ˜%
-öESjh’ërÙ“¼³‚\¾gRG¾Ðùì…×Íßì¼ÖB Ë%ÁxPÂEWjI],-™“VÌI^T0‰ ªàG š¿‘FZÑœ^IRkA#VNŠ,c.š'äZ–Ï• À‘Wœ:ÂÀÏg/Ï\ðÚhÕÌL1—$ã’iêRU—kkuÑRG[ê¨bNÚ±ÙÚáE«ÊAΚh˺¼†ýÙ†äTI‚n}RÉ»Ë@S´å3$Î(õøìå¹ Þ4Å[f\âÈ"˜À h /\4 š¹éD×SGwêèΆê†ÝŠ¹+yÞC€F¶3‰­gDõv6gTû„T” Ÿa[>uÄá Áë…ׯµ¥¡µÒ4UFÀéh„®Fèºô4¥B@?ÖhöI| búaX_ôá¬êMbêõˆHŒù†Ð”–ð”°tŠ¨%Þ0>ëøìB¯¥ÒSí Î. ›¶z$Ãf*|Õ¨j@8‚:F³FÇ0'£YP£yùHŒ`ÐpΪ¡¬‰Á4°·ÐM LH9:K˜²Fðf°ý­áççæöÉ ™âT{|´«„j¡…HÀÛÀh#O
-6izEq³Òæe-Z^YqÕÕ­Õ暶UíÚ_WݱS—ë»v¿á×7öèÙ«wŸ¾ýú8¨vð­C† 1rÔè1¿7~¤ÉSn¿cÚo§ß5ãž{gκoöýs~?ïù.xè‘?.|ôñEO<¹ä©¥Ë–¯xzå3Ï®Zýü k^Z»~ÃÆ—7ÿyËÖm¯nß±s×îú¿¼þÆ[{÷ýõoû¼óî{‡>øð£Oþþégÿøâ𑯎~ýí±ãß}òÔéÏœ=ÿÏŸ.\Jü¯ÿôÿÂõ›ÌJ±]Iö YW¢ÓQ¡dg+Ýù/RÊK”ôr´·Râ+•úk‘ßAéïŒÝ”7) nƃeÂ-Ê…¡Øp›òa¬2b"NLUV܉w+3~§Ü˜‹P~<¬ y G+Kþ¤<©Ã”ç”+/bË:åË&eÌ+8óš²fòæMÌy[¹sPÙó>þ|¬ ú‡¾T}£<:I?(—Î)›.^JŒ>¹\Í»%À~¾þË÷_¸_b2™Í‹lv»ÃáÄ·Ç£a…O×ý¸ áG8‚#1<Á\Á|ÁåLÒš”7?3'é Öt뮶;©fÀ Ú[‡¿mÔØq&O6}ƽ³fÏ7Áà [´xÉÒe+êØ.j·¬[ȤƟILiLŠT*‘‰N„¢©hýòj~Þo¡ø»'¾Gô©~8î3gÏž;wí?]¸pñâ¥ý‰ºÆ¶ÄÓeÞÄÊÊhbm‡üÄÖ®-;zW_Ú5¨æÔîaãï3ûЖñ‹ö®›¼j×ê©›¶­œ¶sÓ²»ÞZ»dæÁÕOÌý¸î±…G. 54ÔÐPCC 54ÔÐPCC ÿw +ž¡†u%^¡†]½ª/Ô¬9ùúÐ _Ôºÿ½×Æ-~kóÄçw®¼eë ·ïÞðÜûV¯¸ûåOÝ÷Ñ¢'æ~¹HÖPG ÏVFë©áÕ®å‰=½ªÏ¿1 ÿ‰}C&|±wäœwëÇ>ùÆöñ/n{yâ– /MÙµzÕo.¯›¾Ѳ{ß_°dî'—‹×°Š6RÃk]Ë/¾Þ³ú̾þýïÿ{t–tž
-)“U£k„aê"a¸>WÑ~›Õ“Ä¢™¬ ð?J!ƒìÔ& vøeÞàzz¶ÓÃcòÁ-Ì£>ÿ$CkS®F–ŠkCe\ ¦)Æj3Jñ-)|’‘ʉ鱶d(;¼ÔØnZÔÚÿs®ÝõôË>w'C71}f¿Dm<WÒ,ÈQ•÷d¡uY•Õ¯¢ð¦øb …Oi·6 € |È :´ÔÙn\h²ßó[÷ÅSÏÝ<Fǯ£Ûú%ÔáwE:·°!D|·%K—¢‰XuŒˆ # ÉÍÖ?ý×°
-”úÔÛþ}®Ù~Ï´ÉÅv|ôʵ§ž¡Mƒ¾4Yg`&_`3ÕÈ’;
-TEr-ZF•båäJ¼_©±6PüÓç@
-J!CÝÁÕ³Í'×™í¶™ž:Ú´Ï^tSM_CˆÆ¼‰¬€øŒDzŠ1$›ÚÊ$7‡±M¸¢0-¢‰,¶6PÊ÷¬XPüj²ãäw摳ÛZ_8žl|ërE:ëãNxc³‡¢èñ´~T*¥à vâ2pFB6º”ÜÅ´6 Þ² ÈvÿeF`åàÀ±5m“gw¨ß8ØÈ€óÅ’9÷[yÓÞˆ´§XÚ’DBGG<ÂÆáñ3))Ä•‚è‹¥[¨Ø²l^¹ë‹Ñž=ËÛǬSÏžÙ)vÇÀÉñÞ{7wÆoïø8œ2…
-‰˜ÄbpOñ8ô">äßäÄX4 >J´6 ÝüÙ3ÃæO;F·.×Ìþ^²h»ƒÎÊÎÜWã}®FÍ]ÇÏ…Þ
-{óEÍü‘¯"‚f(/cƒ`Ó4„µ½Ñ¬ÿ¤çñ7Ÿh¦^!}wø>8¾5œÞKÇhàÊ™Hàí€AΡ Ô5à.-F\ |é{Gq÷{ëá»ïim=Æ/ÿ¤Zý©táçUpàûpdK*8¹+Øï#€K‡ÑÀëD0€Ÿ
-¨3þ
-ä×çëüý¦j„áò°”^A³µ€\¢ËŽ‘*´†ºÔ$,!­µ2.«KÃêãGv[ÚÃ=ÈÀú×ZP
-$Aê=]æüüž+‚#†¤zwþ^ ‡X¦aFÕ*²b«ÓZ*SR»D ™&^\¾™Ëîµ4Àúh`C¡Í@v~'¨¿x¨<\æÕ¾þÏÕAÄGµ¡i]8¶^@(W±IŠÚ<Ê}IÕXžAï-ed›YIÌÜDV¿¥ýa(„ e¡úü „ —·Zÿg:8éQCHz§,¬¨I^ÕÀPÕQš%ìx£Iï-ÊÊ0ç2˜™¿˜,탡
-8gÜ:
-ElA–,DBHHB@¾„- @„%1, { „E¬¥Š"
-ZDÐÖÿ|§íñ>^õ‹çþwõžó>±ýL³pæP8:HÁå"ÿ•—Oêl@Hü4†@D E> E…ߧÐñ÷h Ìx 3ø{ =–p—Ã~ß@¾ÃbI»ËbüÆΆ)Ëõšy›µ`o%†³6…àâ”öÖË5~)ð
-}çOztõGr(î ‹yÊÀ‡ÌĆ¡ŸÄ_ x ÷{œL|ß@¹mÅTÿæåÆÉí+5s7*àÄNØÈ3GRà¼]xž£Ú…øçŠÿ)Üó†|9x‰æ…^d\ \dyû¿bûø.pP¨…dß÷m®ký²Ûk—µÎm_¥
-b} þüà¸\¤÷ÎhX½L3ùÇå5ðéj1|¹‰‡¶%À±/h`·?œbàÒ!4øöƒÐ£( ÷†ˆ^@9é ´S—aã±6îÀ¶½‰ïäïørö¯²Õ%'¶‚ä«ÝPíb 5—íAà¶(Å=‘)|FÂÌøìëIÉS|F¹!†'ÓÑòÝAcI¤n#V¶´ê4j¼Bkn    ¿{C.bÈE ¥ˆ¡ÒaÔž·…‡=Ôú»½’aƒg*"©÷tî­VîP*GhHL­ÒÅf)º¢sUíQ…ÍšH¡¶%¢²£‘PÝYµ¦ÝÜ~5ì[y‡6‚èøV!†zgkhpw€¿K
-Lèy}\DMå3 û3Ù]WÑŸ¦ÖÆdkšijJ©®‘$ÕË#d=U$y—¹AÁŽ•‡
-¬7BÙñ-P¿¶Õ%P¡Ü_6†`×…3Æ$äô‘âè}N¬¬+5A¥ILÖ6±2ºUŒ<C­ÔTE.3•Q*{ÅY¹½3ð­7@9b¨±ß*ÄÐäæ
-Cű- °ÿÔNÖÐâæðVãí>ߊÆ=jÂÇÞVy& ¥¼»˜Þ Ée¶©³¹=™†š”<S%·tX+ÉgJŒy±R½¹½3!鱿Abhv²­«ÃÏíW<æÚñ“Z,ë–2<·_)é*£ª4¥¬6%ŸÓSÍK3J2x&aª`8?A8’Í®èÏbK æöÎ °Ú
-ãz„E\¿ ÝÄËÍNË^禗pÓ$FsƒÂß %ˆA†”ˆAëhùSÏ·ö zOû}Ãô±Gº±Ý-á•êrcµœ®)«ˆí.&xÅ©¦´Âœá¤Bá›W>Àή0šÛ¯†½k@ˆäGÿ
-*ÄÐîh¹Ô÷ý\¿‡ÇÌ°O؃ì^LA›– m¸Ù(UÐ4Å2fw®„­O'p…¼¡xaé0³°|€YPa47(üt%ðƒ1Ô µÝΟ;Ï\0^°›vwŸºívgÔŸÝg ÉoBþ®¼™Ø l ´æÕÐ;Óe¬^Ž”cdUd˜¢Ë éâò~šPb07(úÍPf¹G?»Ï^÷œ;87ärzú¶›ûĸ~äŽ_|‡)8WÑ…­·„Õå5›S䶜ÞS«’rûI’ì’TdŒ¬’èÍíC!b¨@ õˆAsú/õç<»qÞvòž«ÛÝ—q†ïýXMCAÙRFÄ×àªÓ¯Tìbkt-¹#²šÖsUÆêÃV%ë±Uù}8Y±ÎÜ@€Šö®©åŸ@ydóëŽÓ;fÎþûјó©û/¸ Oy`ÛðQ\Gg”êCÙ8 §•P£&*)ÊÈ&bµWÇl ©Mì@×fvÖæ˜#b\MG6Íël·OžÝ?þÀñäw3.®}ÏÜCU(šä&:©Àš›Ò‡+au*¨mDYD+¹6¬™ZQÇ(ƒ®±¯ù«ÒÔ~ÊŒ&sƒÄPºçcP|¹öMÛá 3¶[ÆÇ¿Ú3òØñ”þ¹ËEÍ‹KAòIT¤` —9ŠIK0ás¢ á…ä^RéÕŠ×E«î`JÛØ2_mŠ¥M«67n·€ò®ÕÕ/tÿ]wï¦ÍæáI‡}ºYÇSšÅóßÔ½tóN£Âxh*w ǼIHŠº‘N¦d… Òr0Œü #‹ïoH,BéSŠ}úÒÌĈA¾û£7šýarÐúã‘ûÇ>Ñ=sØß¼töDí[gçò×nžyÏQAÉÓAÖ$ŽL½N'3 cÔ8ìFBÈm}‹Íõÿ.)u#=Õg4Ãì b›4~nñ¬o·ÅèøÞUº™c[šíöËáÌQ8ý¯
-šŒ |˜Hñ{…šÈ ùLdšTý}Å«¶íËoÝݸ\7½gMÓ«£[e`³·þÃG›p=ÇÔêÏ¡nÄ×Oü"ɳ@E¿dø¡çYþsì@¿\4êyj÷lf°÷lVˆ¹ê/Ëo˜Ö.Ó=Ù´Býjï:Þ*€»ÿÏn½Æ%}¨¯ã¶êl­ÎNmg[­µ¶ÖÉS›e—é²ÖJKÉÊnÞ/T^ð†¯ ‚ˆP@QQQ@@PA/]ì,«Yiåén­›múìÿéôÙûÿ»ó¢¿÷ßÏóâyžRؽ‘
-û·eƒ[
-„ìÁCä>ÄyE@²÷)H;ˆ…¬Ãaã”#Ás´£sEÇfKûÏ–¡î?æ…ó,£‹æµ?_öV3|ó~lú¶¯ÎEfAx8䌃ÀíáX·HÜ©?BÆî
-P¥+ß²£Š6/…
-äfÕì^ GŸpÖ„1~Ïù)‘Ø$ÂT1|RB¿’Í.»˜Î玦ÔTMª¯Iˆ†â僱š¦è.Yo„AŽ¦7†7†7†ÿSCÙkCɦ¥ÀC µ»?‰—#4wÆPO¨Çù?­NÆÝãfo0©”qZãbNYÅùLnõ¢ ~(¹VbOKmñ²k¬ZeÄu¨õ8MÀB ̵‹€‰üÕ•Û?„ú?©§#ÈŽº‚,ØkNøD”s§:#ã:'‡>V\À9OeÔ “ØâtžÌšR­2'‰ÚLø掞8µN£éhm× é•¡1”!?mb#ù~GPqEfVô¸ 7UO$ó²K.”R+‡é… ¶\f‹9³\cL­Ôu%×uë›MêXy¯ߪoNhkG°WüÏÀF 5ˆA²k(ö9‚ÚÇÔ˜ÙÖÓÁZâð·$)9—«3ËΕçíÅ4©™R¬éÉfôi¼ÞNb]Ÿ6µÙ*MZÄIÊnAÓ‰¦W†2ÄÀùv ·-‡&Ä Ú·Ú»€6
- ›°cSΙ# ͺØÊvU’DÖœÖZ×­ã )F– ¨¯˜Ïê/à
-(ÜF;¹Lj!—¶Ñô§¡
-14!Û
-èrÿf¦³ýס£^wÎû‡Ž„¦ YÃéÝ]1|•6¡Q¬HUU5gv²Å¹=Åuts¾°ÔšSͳe׈2xRKFE‹MP8ˆ¡1H·|
-¾Æ$^åýÇy9h‚:ÄжrþíÁæL~æ`švú@óÒí ìÞ(
-ü÷CøA"ÄûfÞ?²Oâ /8áעг¿”…ÅÎVž:ósMxô #âôL]dä‹Æ¨ˆç‚Ó¯ÓŒy©ËÈå….ýÿZòíìÚrp_Á‡OþF‡ýËàà6ß™ a»ñ·©^ñå ¹c àP4”Ž‚Š#‘@94ßp`ù…çX(ð^«û<ëØ|ͳ¥”º…<ضœ«JÀsmxoƒŸk¹ÅBŒûiÀ팄ôðëä}…»C¡Ä3ÈžÁPµ'¨{µ÷$°÷½N}ƒs]Ôÿ˜ëÒ
-ËæðàÝ…TØòf¸½ »VãàÀ;±pd}l …ðÍÁûþIÀm €t×ý?än;$Tá‡Ç äC? »ùE}­€Šöeó {,æî· Ñk ˆ|7(Ô„±^ÀÃû›ùœ^–ø”BÍ|XÆλ_À+ù'QTy—ÐZs'³1™Þ]û%¾§~"ÕÜ0žâàÞÄ]á_‰¿,p¶ß ¿þ/ ÕÈPá¾Xè¿àþ× ñ
-T7€á¸û¯ÆPŸŸŒ1!O I¸û=ù·;sécâáPc¹ÜƪQ™¨µm%·WY.éë(í°I‹ÔýMÈÁÏ7¹…˜ÚÙ€µú•¡þƒÅ A†dÐ|LÇÜg±Ÿ±èGX"nJŸVx«+›9ÜJÚ%rS}•ZÃd5LV%´¶THûÅd•½¡Hm¯/6˜Ø%˜ÖÙ^ÈÀA†fdPì] =ÈÐ{Ì}Æìó½-*ä[[|òSJј*“9(#6aâ"¹–[¡R°©)ƒ‰©|« ºÅÎ¥t9Xe*³\of’{{œí•ý8 ®o@ËÎeÐ… úÏÖƒÅoÇs{÷“Èé¸ä WtE›ÁìïÌi2´È•Me*icµAÄfa<&×ZO—Øki*¥ÛQCÑõÖPÌ:gƒZd`"Ú<–A72‘Áæ·ãÙ` ÷¿/F„L]8“|ÖT4dHc`JB“FF’É%%*± RÏmd`lÇʨÚkêäŽJF·ƒL×a4³ÎÙþgà!ƒÌãMPïù ˜}ÞµûnÿáÒI¯#§‚ï\ŠI¾êH(t˜SéM–@¡ ÊZ¤EÝ< Y_'¤öÒølkWÐOn”:JTŽâºKI­IïlP‡ ,d¸.92h÷ü0Ÿu/}ݾ øtúZXÐÄèiÜð…ø‚¾¾šÚÁ—ªs¤MJ¶¬LGk­6WJX}¥"ž­PÔbÏ©ìy¼ ©Ñ¤w6¨[õÊ Üº:ÑíÔïy{Öæ³ö‡‹G·=º~bÿÔxHàõkQIƒÃqùFŽÚ‰¥sÅB+GCê¢+K´UÆb9#É­¹2‰ SÚ²›uAdÒ;°‘¡ö½ù ÞººÜ—€Éó­çÞ<rÔuzÂïäíà€‘ñˆDëÕX’úbbu›ßȳd53MÄŽJ}‘ºX[¡ÏSÓLËP‰-iª. ^¡7§ÉÍ:gƒzd¨C†–÷€zÇâ_-»—?òZsÿú‘-wïúyÞ˜
- ¸0o¼C츚P%¼”R_;˜!ª²çÈŠ­]D Y“ÕKÕáÍlC²©É”h”£Œ†$-¦q6ଜœõó@ºe>è¶/znß½ìÁ¨×ʯ'm¸yÏ×óòtÀ‰¾©SqªÛÑ„–ñøò†ëÉÌšÑt^ñÅìæsç‰ò4{¡g%wÇ÷Q5g,lm´EˆêÒÄÚ¬Jgƒdà­› ›çÙmÁ“‹»–Ü?°âÆÔg‡øzÚúû÷Ü‘Ý‹Nç“PÀø*µ’|3“I;ÇÉ! R‡‹Å‰Cä–¸ 5mÑçke‘çyòðÿ°_goMžiÇ#ÖŠNǺ_¶ÖÑŠ bÝZ…ÔŠ"ˆ(² Dö KØ! Ù€˜
-z*£Œ)SüžhSѪesÀ¼ s«ß
-óÓØ‹ö)[+ã,vU%8ZËÀy‡pßsÁû ð¸T zÄÅ;v6Ùø.3 ò-#0l†ò&Ÿ. ž‡¾. x¥ ÷›ÒD  êþ…êž¹|cæì«es`Ó"5ì^Y{×åƒÓ¸íJO‡DÞ'"EÕ5 2p!À8Œö‘ È;B
-.›Ià±-
-v…AÄî“@²†Dl ¤î €¬ü€¹ï8p}!ßÑ„û½¡ø€”:ê.uXbÌ×,15£óç(`Õ¼b°YÈ…­K2àÛUñ°w œ×‡‚»õ ðµõü_ ØyCÜ7^¸ÍR·ƒÌí@ßqX;
-BÞdI¯RËâ&“Ô‰ñº”qõéã±MYÏ¢Ûhc„.Æ“¨ÞœGýì{a·87NsÑô·áoÃÿ5díX¼Ý‹¡`ßJ#†o;àíAã ‚”cÀcžxË⇿¦ÇL¦ŸN˜HV¥<O¨ÊxF®£Å62G·²F‰Ü_½¹#‘ýyCaCüþÐ[yh²³ˆ¾}!ä·D?¬Ù¡u ÷´ƒÒ (Éëƒ ÿ†—Kœd&¼Ì’¦=KUÐ'U²Qjx#$ÿ~ŒYx/º³ðñ²h0²_|%|@t)â¦
-cuvu³&«Ñ¤Hom9vÖ(Ë8_-ͼ¤Bä"ΆyP€äÛÆa)Ô!†f·ÍïZ=¦Úpã­¡ÁÑ”:
-ã²2EØ)Ë–™‹Ø*Ÿ¯«á×kXòF%³ÒTƨo‘ÑÌæâ¬3M"ZWMí¢M‹ì,Î×ó ÐöS(C UöK¡áÀ—Ðâºi¦ÝÃá·sþ¸±ö໦¨øëz2£»’*h“gÊŒ¦ª¦0O§æÖ—çÊeœ
-“„]k±[ÌF[³ §³öTNM¸ˆA„ˆAg¿Œû¿€6WÛ鮣ö//wíÄ µERú $zGu¢ Y™.«-¥«*Å\]Y¡ ¾D i,ÊW˜„y:3?¯¹•Çi5ñ¸z·[‹&ÈûŸ¡1T oe­ýçмÿ‹÷g]l^uÙó¼××m¤;8h =‚ÜÓCo«?ÕP™"Õ–gW”—²ªK$üúBQq#¿Pnâ µf¶ÐØÊä›[˜üŽº~·MxˆAb3Ôˆ¡nÏçÐâ¸úm‡ËÆÉÞ#»Ç®ú¸Üí ¼ÚFî4iÍ
-_§£–(ÕJ©‚ù'ûuÕäÆq<,2ˆ´ZµVP”\Q JUd—}‘=„5@ !a ;D‚HD‚Ȏ¬¢ìЂ VŠX«ˆ EtÄ>óžž¹'—s1ŸûïÅ{Þçÿ«Î.bŠX…Ü›Œ|þmz^y3-¯¾9ÛÜDÍ^é®’d L¤‡4T ÿëä~·îþÔm®¾8d{ê嘳Ùø‡Ç@_h[;žV'Í(«‹Ìç×PJ¸I•¬kiµ)%œFš€'¦\½ÖWTÛÍonŠåuÔÅåwWIØÈæe©É¹U'à–®Òz‡Á÷+ýfjoÆl´§Ç/ŒŽºcº}IâÎÀÄê6K ŽÈËmˆ+Ψ¥U\®f\§V²ëãÊónF••ˆÉe×o‡•·ŠÃ…wE‚î*IüÝÀ> ¤áºæfh:­¸Ö¥¿óÝ°™ê˧֚Ï.šþünñ&Öõã(¥ÁéíáÜÌæ袔[‰¥ÔÆËÕ1õ¬Z²(§>D$h ÕÜ$ˆšƒkîÕ+{*%™ßKGuÕå î¸ü×öS[—ÎoŸ{dª<5mq|ì…½q÷¤««ø‘¾jÄ?Ž?ˆgpzB9ŒÎ(µƒRÓF/oeV[¸×ƒš¯ÖâZªEþ-M¢€Û]5¸†¾rI@Ö.iÈÙ' å7Á­crk]:›_ß×SzöÜp÷Øœ…æÀœ­që´‹sí¤®dÅ ¤§2h¿DäÄ Æ†õÓ‹ƒû˜¥¸>n¹_¯ Ò§·ªÊ«W\åÝÓ[îÓ1(”\Ax*²P£& ­‡eµä¦~ûQaì¥Ñžþ·æšwÞØ5¼rr,›Å` ¦±¡ì)||òdh2e"š1žÈ!>LÎÁ¦øŽpøžÃW1CBzè†Àm¨Mà><\( àî”ò¦¬W•þØyPzæÑ¿dÆfµ·ö-ª´-›ŸhxomPñÎÁŽÿƒá¼ñÃ1^‡Rç#¢£gã¦iI„©””€IVšïD6Óë)/óD˜‰~Rå:.Îrï’äî†òÝÒЬ,õÇÐN©/T¤û´ÛV ÷Ö­]Ð,[µÒãÿyÑâÊ
-Æ)uÅ߃ö仉'/RBHo“ƒþHôŸgÇø¾âÆy½äQ0³Å èÙ
-ªëL=ÍùE‹D€·]
-DßI­ô(¡>Ý‚ê]Ø+ÛòQë[ÑWý½¥_MŽ¬[èf­Û1ÖÝ-©ëþc×C\ÿDaˆŸ)Þø5:6`5Í»’‰óùäµ\ˆÇ,Ðï+ˆ®ïE$çEqˆ$ ìÔrëVÔýŸ7£zß‚jZÛ'W ÚÛ„pN%Œ4X`®E»3@D‚ß…P Y Ò&(öþäà ©NÞÀvö® æ/ž›ûWÚm½ÜÝåË Œó—FI,ÕË£FîýÕ9"/*J×À~ùÐú– º?¤þ*\8 ¶'CÁå|Ïà X d}ˆ5ôš1RLÜiêœ ®kæ|s'Z8B•¥ˆ¬$1Ú"‹ºÛ³ uó±ªò¯od®‚šü8®”:;ãáœr8˜ €•†8ñÏãÀDCˆ–+Dê8CüN@;å)§/Sײ~²ƒœŸl¡ðŒ ÏZC¥DîÝ‘A5ü"ƒ*{&#UÛd8p@>ý3Nl Ý]80Øã æ{Ñ`·ßÜÔÀç àÔm¤a äCVsØŽX@Òs`5æQd˜3…Üc&À?.‰Æn)TÙC*ï­Œ¶Ë$²\¨)àˆ¢/ò]¸ÃÙN`¼Ë,w[ƒÃ€V6/SðW1 ½F@Úgáû JUâTÏC¢ªÐ÷Ÿƒ4û€$€¢"1‡ä Bg $ê*AŠÁH·P ' `újAjÈ9HŽ7Zª $d;A, Q¥^ëäjì¿Cë>ÅAk„6Â*¾‹¸8òÞ$lû(|ÞgŠ<ã59åñjCÿoø_j@nE¬†DioK§• õüÈ0W, `{k“¨ŒX3 _¶*ÇâyžëÑBìçˆJÜZ˜ˆ°JºEZ n û€ï$/F.ŒD¿Æ>Ž™õy;é5?î5³HøoCìIH>¥,½À1S®½d{jCþ<°¢, 5Éè˜ujöSœ h5ª<äù:y)´!j‘Ø»@¸Ky4@ÇÝ¿4ã÷$iÂgŠ>æ3MöMØ$" qÈû…‚¼ã:Šyî;àš*C¾äa´‹Ó‡,²°¨.1Ò½?'qƒþLà‡.Å\‹|Q÷&¬Žúš$NzE¸sùePê äOøýÊÅN¤úM%÷úO_ÚP÷È@<Ò¨©
-†Ô FI­%ÃÄ>aOЀð~¨¨9x,÷&i<³ž4ÁÜÐÍ›€lÞËG6Ù8<dãí2Kõÿ^ŸQMßk
-ûdº•V¾[È6ç ª³åʺLƒ¦:ã–ÖaÑ)ñVµŒÐ+•fñÄ™ÃL{þjÈGJ6;o‡ TX
-Ú£«¡æôƹŸÝo.yMÕG`ŸâbF)é‚ÌB+‹Do¥S9&j™°®+3%*M®F«Ì¹©—g·êE™ »[ÆÏäWæ>`Û…HÙ7KÝ
-¤Aï±êNmüÝta×Ls ç¤)û¤öJŒMŒï’
-îòòè¦
-
-§¶„.ÒQY2%Y¨®")u"bŸßbää¶Øù]
-q@À$Ù8ö@ášÿ50áöE Ú¿ª¬úØpÒõùü®—­þžæ0Ì¿b¢ûõ‰øv9¾ Y˜C¯ã°uå7DŠ’r™˜V©®,’é8d½I6…÷ªRr¿¨”<ĵÈH i(ß´
-é½’Bú ß  dW'`#g!Ûæ ƽŸÀ­ÃŸ½o=¾îUǹ­½˜C;‚|{Z#"[o]M©¯IÊ×jñÅRE6‹')” oTWV¨(¾ŽÄVòX5ÆÖê¦U“[Ñ+Í+äÛ”Õh(Úà\¤A±Õjöº|l>´ümû±/^ôžýêé ï7¶îK>Ööðˆfs,ÎØ'¯N¥ñµYJdXÊ®KɆ2_ÄÓf dz‚ÀhÀ ÌF<ߪ!ðz¥ÜA=P„4ÐÖ;A%rê¯@ýžEsw¾]úºÓkÍäЙM? _pïï8·#,¼¾-:Ym¾–+jÀQYµåņ<YKçªèò G*—h“ez}¢¼IŸ$·jp’^iŠxo\GJÖ9‚ÐÕt[æƒi—ó»v÷O§ú=Wþ{ìÔúŽyè´ù{7÷†„­Q‰UmqYœ–d
-Ý„/¥4ä°së
-„šb)ÎÈR$Ī8ƒV}ÅpKsÅØ©ŠÓô‰ãUƒ•ö
-v|˜‚yô˜l”¯@ƒj…ÃGórÔè€ j`b™Cû´ÛÓoî+ o=]«ÞœÚÅý÷áÒ×þ§È3a¾93WÓg’C“§3"㧉1±ÓÔ¸Èé²ká¯xI!/¥¸ )uJàTmªÿ söE7óËC»€¿Ôj?EX¢z‡¢Úf–£?l^¤Ÿs_)óØÀž;±­xöÜþÂًٳa'Óf¯œKšÅùÄÍf`cf‰‘³ÔK—çÊ‚Cgy!Á$a—~W‡¼¯Ž¸øÞ‰}g‰ô{×e(]P£æù¨®Ž¨;# Q7ÿølž¶¸ˆaÿÊ
-8´Ž
-ÇÜòáì`öá äÛxˆõˆ…d¯( œ¸ y§Br&ègƒ€í¢ó ¸pô>¨÷õƒ;~¾`ÅØó}ÕÕê„jéuBÕüàŒRÂ*G!lu)ƒÝË)à¾6<קÀi·xðÝ A;/CÔžPHØ i‚ Ë=Hßøõ‡1À=â bPz\
-‰¿ƒ„Ë!Û:Ýþ Õñ.òÉñ‘ˆ¾È7შ—¡ÃQý¡¢lñ‡ÿuXkØÍ@qŒ³å»
-,Ê.`fû@ºü
-ãý·”|øƒ€þW¶(þm†ÿšj¢¼$2_à+ØÏ’jù=è â‡ñ7ewbîʯÇt‹[bs›â{3ëúiçÒl”E q`®B¤õ”®3@¿{ý–CÞag0†»ÉIðy¯&K¨×<^R¦ŒÜKÓe<"šywqE’Τ*y{b½òVâeÕuômusü]Eú¨.ñIv æ9óTÒ‹t[@â@\m¬5“@¼á;Ð ­gØ5,¾ËÀzÐy´ ÔýC^¬ïp..è•’ó\ÈJy˜%`Ü¡+8í”ÑÔ|ÙU|©ª%ù´¦Û¤»€½¥;‡éÔžÆÞ“U&?â—âzY'qÏ™¶øæ@Zel¤yeHëé·Nóι`õ^:V|`ý§â÷‘Ñ~ƒyIÁÏ´Äøn)ƒÔÁã0o°$ÜËt¸9ͤh$jê •úº”úœÓ)Wr+qí¹e)]ÊbB·ÈšÚ“]Ú˲P2âÀAzSéì
-<æ@ñ¾%£eû×½+r*ôë³¢CRÐ*©Uœ•q‰+äýÊRHÎÒs”§©ùÚ*riN9éŒá$±ÙXD¼e´’:5ò}©‰ò˜k¤ô°m4d¯O[iüìAÜKòFîøJ½®úyíHu ÛËÊ¿žâ¸Ý6ã®ë(¤ßäÌŒ—WË‘J«XUä+N/2X©§L–´Æ<3õfžÚ¡Ï¡Ý•ëhøZÚŽ-¾9ÐÎ"ZÄÁ²y
-”ì˜=VáµèCMÀš¡³‡]ûjÂ|»ËbCڬ؄#‘ب¡3kel^¥P$-á*UÖ¬\½9Ãj40ÊóôŒsf-ãšEÍhÏU1»”
-æ¡‚ù˜g HGè+ì@Œ _7 Y¦@éöY£Õ{þUç¿z°áÐÖ§u¡>wª¢ƒ[‹1ñ,b]•Y¥Êä•HùÒ¡Leäéôúl‹QuÒ¬`ÕZdY-IV›Q¾£gu‹DYø¶@Æé< â‹üŸ…›¾ƒ
-÷™_Îx:Ÿ÷[9pá Ë£ó!Þí5QÁ-eè¸ó'ð©Õ&
-㤞É-Pq$F™D¥kô
-É(á›…Üš|·9ŸÇ»eâñnkx¼n1—ûP`  #•±|"ÈœìÀ„ÌâŸà”ÛôçöÌjò]Ñwéà¦{MÁû®×E»P™[[’L(Ï'1¬F:רgK´j¡J®PêERƒ‘+.4³Å§ò3ÅM7óXâN-Kt_Â>Úâ›kéDP"ga^c¥'qö®q÷ÜÁK>Ëž^=ðSgsוúãGÏ×ÄÅœ*OJ)*J¥çåS9ZS¦XžËW
-tr]¶:Ç¡,È£+*,4EC>UuÓœ®ìÐ¥ËïKÓeÝ"[
-·ªâÇI£g·M¹¸kö@«÷â‡76Þº|tïŦðÀÚ³1Ñ¥Õ|~y
-M_LaË­L‘ÀÂQ°M-àͥæXL$}™9UÎBȹn&ê;t$í=)YÓ-²0Ç™ºe pÕD¨Þ`ÿ©ÑÅaèŠÇŒç¿{9výî¿áZk gÃoaGª£Q…uèdC Žª¬ g Kév1[F?!RS
-Ôz‚ÅdH¶œ4%Yêò0ùÿa¾Nÿ©Îû8ŽÿŽý¢˜²u‰©)¦H ‘­dß9„sç8gáœ[ölIƒJÅ´\u]Iãšš¢G£1´h™h’êjs´P²„+]Õ¼¯ß\À¹}ÝxÞþ¾nü~ÇçÝsDrü^½ôûG{¥«TAÙPIþ ä=uzµ:Ú¬5>tÛk¿½ã¢7øØͤ﾿Mw/ukÛ zDs7›u´#)yÿÏ)òª6YAÉO9e;Ïí‘·TÖ¦þP{@Üüý!AsS¿¹µ‘wæZCRsÿÁ?U O>©R…¦j¨&;Žš«áŸß¨}ºü­úäM[¡‡öZ
-W£}×^îwÿ±76ôÄMãàU¾°ºK,ÛÕ‘–»³=«8ãRA…ôbyµ¨­¦–ßÚ°ŸsáÔ„Ö õÌÖ«õ ­uìŸTqZžV¨‚"²¡ÎD 'Í(¸`A™í^IyÝ¿’20d«uû•»Qç¯Uë“P—¦è Æßãi5w¸ü²["I^OjfƵÌ<É•üawY9¯«¦*¡³¡šÑyê;zç…Z×Õïè]ÿªŽk^wi°T”ï4¢ Ù„ò¥Ý”xwg 10dB¹õÖV»ó»IÛ°¯Õ™—!NG£|÷=‰‹ªxÈaåò~iªäw¹\p7?—ÛW^Àì­)Žëm,ím*‹îm+ßÞw4XºýÆ‹Âèk/ TA¥!G—Rpn ñôª.qï¾.qstå× [ÝÖqÓ3c>VÇF÷¿¡nÛ=RøŠõRÄL{‘Æ e‹øŠ"I‚bw:C±/ƒ¦8’­hÎŽº˜CºžñB‘ñh$3bà­\ÔPpJŸxÖ®Côõü…èy¨Kü2c¦~þßëžq_vdÚËrßT€]åûp·Â÷tŸìInpú¤˜š<!‹IšÈãN”0Y{ØŒ‰\Úä1~ÌdsRÔd› ò}·0bê(|ü(ltT%4êƒç4ˆÞ_µˆ+·µ‰ögºÄY¥¹Æ)¥ÝâF¥«i­Òó›r¥¿M¾2Ì!sŽæš:Çñω}•²
-ëÂai&Ü–Iàm‘„ UlDZ1ÀXK»uäÈZOŽ;rplŒ@±}v;„ nS0œqÒ)
-Ñ8¨NÔa©ZVhæa® ôEp6äb«)þf1³ˆDÌŠp°V† qURV@fé+_}냊5^¨Y» ‡Özâ¸õ4[{à¼.ªÔÖN!šnÄá‡Q=¥A)ƒ¡Z6Ì4¤X¥=&ôcຄ
-/Ã"ÂԱ˼Áüë6pͶBhæérwr,¹"×ÜÅÎØmá„Ú¯7áð×8±Â§T:ÝM¾— ªQmŠ_©‰a¬Î†¹& –:TØêÃq‘Üõ½àe°_¹!l‰ ¢–8ƒ¶t˜†àÚC`d‡£ ¯G¶±-
-ŒmPjbjRJ¬T×F\GˆõºÅ
-î¨/ìûÑó¬Á˜ÙøáØiÆmœ>MKÿH{·­
-D6XkB´A2]d» ÏÛ¡æ(¤["O@~bN{@¶×i‡ 9‚ä–ˆZ£ ìˆFÒõØ?x¿Ñç9ýŒ Ï™ÓÌaÖc<áMÜ ûãcüóøyš*“·K"Ù²^rò¦ÎÛ¬"/c”›cWŒŠø—ü­È¬òƒ¬>iÇ©œŽFò9úÑÏñŸݬ…ÄÛœÜ{¼é„çü1æHÒHü„@Á˜æ?ŽŸåô³”ñªü¯!i­&R×i#gƒ.ŠœõQêi„ò@sTn·BÇÅäçz!§<èyõ“¬1v>õï eJ û?¢VÞ¬ #éCbhšw/eŒ=(}Íz›ú,~L:Àœõ%|H¼Åžc«‚d²A@6ÈÈ}“GnÞR§Å¨Üj„=˱—j…*–ÊÅn_J2}ò‹Ãærªcf32gÒŽñ¦$MÂIñÙ”qÁ¥´Q~÷Ž7ÜÞÌל¡ìGÌ᜻ ïvÜfOJ¯s¦E]¼Y¾*H±P‡¼éåk´P´N•äæÝëaˆZ¿åØn…ZÆÆÏÕwe…ÌÿCI~äT~%c"«Ž7*kHN¤¿ÉT$žßùŒ÷KácîÍ¢ܧEwØ/ ¯sG²»xïvtð'¥—g„ª@B6$“7ýù®Ï°&Ï5àoÂTÜÚ#¢G­¢Û:«â
-Þk0‘x—Ï ¿ÃæQšbF-•£&çð*ˆE ¥‘jQQDkbaÄ 8?RŸ9ÅQ_Ñ3£æ‰kỵ@Òó`„™‰ôãú ïܦOªË_,•Zí_¬t86]âaªÉ¿e?œõ¼'#¶‹èa <˜RÃN`V0epIt&¿ªæ‘+ÄÙ¤FI©7)ƒüD”F™ä¦P^2’)³$9enUH4 ïÓqé!uL(Ïnø_©ÙŽß+Ü;WcÿõT…û¥•]vˆgGjx@c5¬FÈ¢”óøLGçŦ 1¹¢ôèRI
-­.INë–Ê迈“è< ýE¬˜þš²d  ÿþ^mŒdÈùF1øPaºí]í{fê펎«¯_.õ¶íÎòhÎ"Ô&“ÃÊ% J¡ËÌå‹àL8YÂVˆ¤±E1³F*dÞ‘ Y“bÇñ±S,Aì u-Ÿ3ÐýŒGr¤kƒü¯uAééõKê‹[~²0zÑd{d´îÚ…þ
-ŒÍU€{}.ο2ƒHP%G“s%F†(– ¤1/S”ÀUJøpµŒ ·É`î—«‰‡á) ¿ŠFÐV"ЀŽÌ¥É‘Žì‡ò¨Îÿ+O­û½îÂæ¹–ïvN¶YzØàr¾G}ú¹ÔÏM­Äú•dGàóÒ©äŒäX†\ʇÅ@˜.âÆçKX‚
-CÐ,‹ Êñc LÁ3˜ÉEGD¯æs†‘#9²h¢ÿhÿ©>¡÷®ÉdëócVÆ÷[œL:ê<¯ÔWÞº^^r«  —™M&É31‰©\_.âs¤)"†$WB—I)‰ 2’¸_F‘Œ ©‰“0U8M_ "X»Ð ¹“ä=SvXk¥î˜Î›ö³ëž÷šn¹kyð^»ãÙ–F+u­kQEov1›¢ŒŠJÌ¥Óù
-›‘À£§ÉÈ)
-11¹8)<¹^JH¹'HFÈ'¹‘Ò阵€(ä|x'È‘,ùûРÊý¾é+í×=§t'†Înê·ø²³ÛáL}››eYƒ·K^m€wZ%.DRÉ/¢ÑXJVlt¾€KÊIŠÏÎá*qˆâ¶$XÑ- Íb3'a\ÚtÌZ
-É5@;ã ØçA‚‰_°Ùm@ñ%kPkjÚÍ~Cf–àõeK0»ªÁJjn@A•Ý((ÿg4”:£I€á?|—kXÌyÇI*§xè ‡¢$%ÏçRtšæÔšfš™f¦fjjš¦3Q*jS$¬b…°Ž­ÇéZ\«ua÷bí®­'¤„q˜(Õ÷ùïîëñâóúþ\×}ÿîßý¶Ë Tp0ÊÄzS¼çs¼ˆŽ( 2â­ãA·Ù îòh¤¯ŒB–mT«Â‰c4Û탱Û!û× ÝÑ]Ž~è^닧¯q¹‹D:ÞM"µÞ!‘ê#‘¶M)†ùÔXë‹ag˜
-'ãd¸›&Án,ÂD#fa$È‹ÂÀøO0¸K!´ðG¦¥”–>(¶òB¥µ'j—º£ÙÆ ‡m6 s™+.\ÔIç9¢þM©î‰´¥D*€ñ9æN`± Ë (°7Œ…‹ÑFx‡!À$áfþˆ™ãƒ„¹^ Íó
-Œ'Ñc´þ-uh“&éÝæWä‘ؤ/1Ï(ˆê£"B`÷pà÷´„È7Y®³ëke¸9òâ¬Ë¶E¶Ô™ù®TxAT€´æðGLroœàœùÂîŽcþ?šüK¢–ÞO~K¢ RÞSŸS?‘{i_â§cÓ#:¢u6á¼J‚UÙO‡ÒÅjoS„š£p³
-’í'r‚"DzR¿qÉÎ1QcÔç´ÖM#¼öø)'ÉبïXךäækF/û%m˜ÓG{Ï~B¡?dŒ%ÝKžˆ¿ËD¬.À±š¶­±võ¡X5êu3QâiŠ²`sl‰¶BÕE|çq•Üë³¢0H+«Œz/©‹}+ÜK~Í?Hâc½dŸæ¾`vóŸ1n ûèOÒÿ¤ ¥?dhø=L-ç6k”q“=N¹Æ™LÔRî
-=d,×GžJœfb«‡ *`[”%¶‘íƶ¦¸h‹¥>U^Ø°¢ló`æÊóô=Ì>þ¾Ô§ÜÃÂßÙ’G¬ó¿0odÞg>õ$Èn±Þ¤_ç¼ç_Iá\âŽ2ÎsÇ)º
-Û$·ŠZ¥½…-™Š½™¯2šdA£ìCª.þqÈ êþ{‰™¨'Þió:ÃÑ&šC ŽD,{Ú–°îÁ^¦ÿíú´è«;2(+r9gJ‹'
-*¤GUÕY‡s”²[ó÷euî•-þFv½¤Aþ¸dOöse}ö¬Nñ6½Vñž¯ ð Ùâi(&ØAìÌ;}ì_;cä°›ñp‡ßüþï­‰sº»Ÿá£‘}¹V’t¦*›ÓY®´—–IVeï˯W6嵨÷ä~[T—sªd—âJiuÎýÒje¿j§òeÖåkq•ò@H[2YDÖ,%¨!æ¢i¥ÞäAGƒ®Fƒ>sÿ:jùàhìÚ[i~Wš¹¿ß#J:Q#g·Wå Ú*J¤-e•ÙÅ»”uMêjõÁâ*Ugi¥êrY…ª§¬Bý?u…z@Q®––«5B]üã ø;sÔýŸîúŠk:Ëâ
-ˆ *HDPŠ¢]@?«®ŽÀ8*£ ~ÆYѳÿÝ}ÎÃ÷sÏïžsîÁvÞ:Â× {ˆ:,¥—{íþÙç²ý~'ÍøöÅ ×B½zj£Z«øÜƲԨ3ÅY Õù‚ò¼i%9Õ™Ùç²ÅÂö‘p0W(œ‹D/‹DË)¢ì·‰ÙÙïy’@4–!M?a{g6—-—KRï.›‘~°‘4à¤q·‡j4Úh¥™ëÙ^åß\“À­«:Y]ž_^š+(.*NË/¨Êå×g·ædˆûÅéâ)ñ±üÂŒ¼åÔŒ¼·ü ñŸ±’@Œ:ŽmÁC–ã–§yþSçnÂë~câó+™‡×Ôǯxï¹Þ`×Ýìq±é°_ýÙ8ΩZAdùÉô¸¢
-Ñ‘¼òÂTaiEfFñajÑÅœä¾Ü#Eã¹É%/„ÉÅKiG ß$¥¬ÄI±Ø;8®Œ‡Ò-88½ wà>\ÖÂ/é~½e*=3rpëÍAOƒþ^?Û¶¶[cK8£¶™Çþ¹!)¢èLj¬¸F˜”UŸ’^Y–‘\Q›Å/?/Š/¿œ[>–_ñL˜ðóRZbÙ›$þ‰•8I ›Á÷Þrԫ⾶oýØ{q{nvÒhã䘽Úõa½î†õ…^–k]g¨Oå¥hVñ…Ä0qÓј¬†ÌÄ´³âdÁ™Òô„ÚêL^M“0êTWöᚢõO„Ñ5Ki1Õo’xU+q’@6‡\ET)á I}îQFË£Êè×{*èÞ´!éæ¤Ý–þ17ݶaŸ½ ƒLçê¾jiO$3¯#>$«M•Úr,îÈ…œ#qÍÅ)ÑMUéç2CÎuç6Žd7Ím\N ;û–~æÏ8I «ý“jÐ÷ôû€<z<!‹>TDôˆ×fl”»¦\µšoÓ,jo:” {åFøeõDzS{““zÒbb»²ã#; „¶Wå´×§jëHjNgv̦³Ú_ Ø-ï8çßó$t¬%dõòèi×F4;$îÝ‘FSÉhä‘ŽTïì^Å–8í¬›ö6©˜òÛ_p›í& £§ŽÆò‡ùÁ¼¡ÔðÃׄÑ!ƒqìŠDæÕú$ÿ«íß!c`Và7ð61 ÷=/°{5J’qP)‹^^ ¢Ù>º;JB·f6¢ágdt噡mÁB¾á±ƒFÕœ§AÑCƾìû,Ç´™POþÝhÞÄÀˆÉ6wBš(ˆ¯ˆò¯¡wðhãñԉ9mb%š~óc„ÏÈçPI _}8-…æۤЫÐè <F=¯Që+©†ß¬äO¾8°µø¹»Žè)Ý4miËÂuŠyåþ(<Ÿâ4' ôŸ+d1æ*9´¹s\Ê\gˆ×ühˆç£'عìýË_lï{³$2ZhBhº›€F®I¡+“DÔ>/οQÆÕý¡·¡òKrák{5áï.š©ËTƒÄå@ó˜%®uøR”=w1щµ˜ê°˜íá»XäE_¬¢Rè^K>KC ÷å˜× ÷Å/>î/×i’¼¬Eèþ%„Fûð¨o”€Zgˆ¨aAÕ¬©áË× HùkäÌU»-É«ÎÛãV½´"WýôCW9FœÕH³ Õ«€Õ”}¾«B[úZÁ~ÊZůµ³/9º}¼êôã§)g×OÿrvùôÁÙeíßN’ü‚õàfB½ƒ8Ô2ŽGu³R¨bE•|Õ ä|Õ#¥5“ã¯ÛlŽYwT [÷Ð`¯Ów®iù} ÓõùÆÓ£}xÏØãù=×Øý{©ÉPcæMæÎÐeáC–0cy^aÞ[I2Þ†P_B-7:=ƒPÙåÃ&\hŽ‚Ά80’‰€½dØÌWPÔhà¿ÍØØ'Ì bpÁN'ÈÔt„<­ƒP¦m§uì༮-tëÚÀõÝÖ0yª'I7Vÿ:V¡Òy„DË8t p|PÃGÁ."ôIL0“a€<7y€»¢+ДœÀ_ÙØ*ö¶ÅbTm€¯¶Ò·ZAÎV (Ùf§ÔM¡QÝÚ4L _ÃnHt©« ¡’ Ÿ#”Dd\(ãY Nðm" In`!í ¶2ÁQÖÜä¬"o¾d `n2ƒàM&¡`±Š† PÔ‡ÌÍ»!³”+iC­’4+kB»Du£Øý±d- Ä_F(
-†ÎëTðn°àÚRûÁ¸Ì7X‚5Éì7óFp—ÖŠ´.0d´!PF8²;!\vÄÊj€@ndÊ©XNNÈ«ÀI‰€¡C
-*È°ïwû;ýñüÞï9û]笇ظmÞ@èXø  ªo#Dõû
-âÞÓÂ4ß/¼¼ÀqNé6KLMè(£)|„Þ1LëÜó‘Òƒ"_ǽ'=ŒzC|KxEúŒN™Þ÷ˆ
-÷i~‡¡·ÿ £èh/y¨kJ=@µæ+Hö› šà ‰p Á}FÍñœ@¤ë-ÍæafðG^ÑÎANEä;Vö¿ÑGñ43é%å<õ9éjôSÒ]ÆCâkÆ”¿¨wéS„߀½Î€ÈŸ™°« áÖ
-Ù4ÉÀpµ1:?õ­,Ôy‹Ð7«ÜËásõ†Ùïëœ_ÔïpyP]y«”êÛWÀÙ~1GyF¯ÀŸÔ¦ÐŽ'XGÔùÜE‰ 6¡&¾ZÖ,«”žL(“ô %Ò;HiÂ{I 2Â+F,,ò…jB&)Ö
-nE>rSiT½‘ÕŸâòÕŸÙyê zžú Õóíß¾§C7uÞ27Û‰Z»¡¦5/[|çüÙ²íÛ[‘Wjˆ»Ê™ÛN™ø»[ó¥QMÙ*jm†–U•–É-M-š4åcR<7±U‘¥>«4¨¯©2“_%di>
-35£±™šñèLÍÝÀA»€,²tÔy ]l ÊÕÆrx¹í»OûgæõŽwÛ‚_;ñCO=aCçAÆÖ¶2îîfS<®Ö¨ TæhX%™ÜB}¾0/­D’¥=$קUèR:U©)?«RµÏîƒH§û‹«ÓŽ1tÚñhk
-œ1PíŒ=ö fàÌ<Ìý^gÌKv½üœ;φº¶žÚ»úp;iSe #ÔÔÌÝ“Û &èëZJMrŒú`:/¡2O_^*”ÕÊy¥ÇNi7Â.»ð*Åü²a^\‰…W<Æ´HÑ=¤;aà€f¤~.æaûl̽ós0ýW0}W–Ûuõú8™/l_Út.Ò³ºƒàWl¦ÿî:jòÊÃ
-µ,ƒ0Et
-Ø÷/uÄÎsYq[[ 7üsbMóFuaÓ¶Œ¼ÆÝ9Y ßækê«
-Uõ EÉõÅÊúÞ┆¡uý9©§&ÓÓNMitÁæùû ÉÀ÷tò°‘InŸ3 ×.3ÉÅ^9w©^SÇ°öV¸Õ‘|§ýפœŠ®”Э3¢7\X%XÓQ"ù¼½L‘{~«:ãÜ®ôԶʬä¶ã¹ò³õy²³í«¤m½«dmC9ò³Š–éTeóŒZl7$chäI-Üif+í ÒqAÎÞ3$M‘SØÌc÷CVöÅÚïê{n»­ ØЭ _}#/¦àzq|εõâô«åIª«JÅ•J•¬«*-±«A#êêHO¸r—ò{š¸kJ•xñ£BrA7좑þ£„Ü­£‘«­tÒ~NZn2Iý##r¢ß’ëw×ÿöY°Éî§QÖÛž7<–{—<L ÌóYÖý¢È´{ëx)÷Êãå}"I_¥DÔW%ö5&Å÷uÊù÷îÉù}ÃÔzR"èXp"]~«$äÁ„üÒ¤GÚÏÑHsœêa’ª§Fäà«%zû_±™ÿ œ_þr¥Õú|»âç2×UÏÕ^™ƒÙ~©ƒ…AɃëB“ÊÃ%»¸¢ÊhÁ`U,°Ç숋}Þ;ø&.v`œûoÄü?OÒ]GHÇO„œéÔ#'oÐÈÑLR9<Ÿ|5bOûr„Íܬ ˜Wª 7/Ðò¬³µb;6ÙI¥ÍtSh <eÚµÞ‰Ú-œíN?ÁÈþ€¸‘£±#?G¿k ‰½9:°"òÝ»®v.„û:õœ äB!Í穽BÈá^=²ï)ƒTLšém´§•Mz0‹'ýŒr'ÃLÓ§¢ÍS¦„‹’¦’–H¦RmEÓ¹ö‚ébGþt™oz»KÌÌ^×È™ïܹ35³Mžá³ì°¹Ê vèì” .5ÒBAíEBÝ"ä«Ç„là ›°Po –ÒòáÊȇ¥B°±+Mg&„Ø<JËh¬¢»˜K=@±aI¶Û¬ 
-Ó¤.B¶Y
-^Œø3C±Â \–?bY>.‡Ôˆd#hŒÝkìŒâyË°q¾¾œo‡oLlqÄd)jMlpÆÔ-:¡2Ø{›-O)zIHÆ8!J"†‰Ã½HXÑ>ƒ--Ît?xÒ9ðÑg#ˆá†0† ¸Œeˆe:@À´ƒ„i¥5Ò !—e‰–96±Ì°Ãpõ\€C†¦8ªâÝhˆñÕ‡" `BÊ‚,ÚR±)ÓÌ!*²BÂk÷Ø þ;[ð«íÁ¯s@\‹#âÎ/ï’x7)÷Á¤üîÞ{Ê4æ<ǃ“.Ÿfàqèqô!ócB±‚E”1ä"SÈTæ,Bâ¦%WØ"á€=„UŽœ^Ájo›3âv¡›+øw)ýnà¿¡ü×ü)
->ùH™áÃmŠW]  fà{Ó!ñև‡‰” T\c¤M¡PšC¾j1de6î°Câß!>êQ­ D®Hhuƒ°Ã«Þñ„à)å5‚Qʤðš£L ÀžÀãƒ
-Ž.Hp¡AêF‡Ú•ŽLwò8(Xa„‚hSä‹-‘§^‚ìdltf‡'Ôß,ÿ˜rØw6¹&`FQ4%o™L::!»öAz;ü½ô׈QÉ›•o%ï¹CÒ¹ˆ7I{-GÈKŸ+௠DÎ4ÈéÐPý*êy…ÞL”a5×%B )mPëø1o­ûLö6ïÉŒ=~ãi‚Þ«…Ž¥Ô†&7rG­Qoå1ÃI×yC²‡üWÒWñ/dcüùlL¿Üg)¢BèCBt˜š!Å‘Ž,ªï:飔Êc}€!Ê"LPÆ·À:™ÍÌš §ñ¢bϱüM¾ïrþü6s_øæ`äkõ÷ÿc»Nƒš¼Ö8€Ÿ„MEqk­K©ëXܪêŠ {HÈ’„ì @ bØ ›ÙB-@"D@ÙD–
-A°^µ£VP¯ÖöÖ¶ö^µuãÜ×ïùð›9ßž3çù¿ïÌßç)­1à ÅŒyDêÆ>$ …< Ýù‘ø‹ô{“ú>pš}n0¡—• 1á[ n32Þ+øÔù»$lw€Ê}  êðb¨:¹ò»î•‚±ùX‘Û¯QòƒÏÄ)Gó²¼rŠüï…U`î0kq·è&üL¨…xƒÖOš¤“­Ôû”1ê ò÷Œ·¸Q f#ôêç@O[ a#²ù’O}k½Tmµ‡ê=Ž0ÍÃù}Ú‰ÿÓ­}‘BÝüs"o×£X©Ç}i¢ç¿$ß6h’WŒ»ÆÑÆØõäÑ°Vê0³+ô
-sˆ~™1Íèe<cô°^“{¸w‘;ùÐׇ޶@2òáÈ|)Ò·‘»¨‘ldº9Ìç\ø:÷زßsüW?Ë mšU³wßN’xLÇÅyZe)~W#31Ãâü  ”ÔÏ«¦öp›èÝœvf'§eaO°Î³çØfî_¡fÁ<±U±-"Ø,‚¾¶@*2—ÌAzoò—h˜± µ;ìß|ãôgÑá%Ï‹N®šÍÃo¼ÉÜ5¥zŒ%EŸŽOôˆÑ÷Hs ]:ŠE\jÖ1[çØ&~7§‰7näÝá6~k¼§ÖG@|m$ÄÔDÂ
-ã¾¥^‹t¾ hXøµÝ«’=Žÿ)õp~\êµòîiì†)mè®± žû•ÔHÏ^e¼WB
-¶]žIl. š¤¥ cd5«NÒÄ©[xÑ _/šæWJ~ ¯’¾¥ëeT!ƒ¸r ²2=H¾«@¤­F:Ÿ+êCñôË
-7ûgUüTu|ùL)fýxÕíJ.ǽ']âyAëoV)±¦D ÑŸK«Õ1 Ñ•ìJi=·,ÊÌ?Õ',Ž´
-uÒ§üâXäK–ÏStrˆGÛù‘HßS"2‘÷(Z‡ú§l#ê7Ã6»Çu{ïÔ]v½2ð«‘ÒξÖ·r„ÇÛÒe~Íj¶>9•X”E«T2KãËØÅò^Qì9A~ÌE‘6fL”óH˜ÿŠ•¯ø@ËS@‚V±¶@ö((Cú^ò
-dŸ!o5ê•Þõ¼n3úaÓNû™úÃKǪý]/—wtë˜ÍùüãÍ9Q~uqÁŠXžšN-Qå1‹’J8yŠj^NB³03¾Sœ?*ÖÄ?g$ý—“©zš©„$ÎŽä é{êå
-¦:¶ GÛ.î5y¯ioÀnm>KÙW£g®(žÔKƒò‹âñÙÉ”4m#%'Ÿ”]ÆϬÄf´‰eýiÆ´$:û7ž<ç-3.û#%. lb$ ŸzoöðæÌb0[·Ü=·Üê\&:7¡;ö/êj;ñE« ³¥¾¼W_v¨¤Šï•_U*Ñ”(ÉɧÓèŠB-K^P•åDjωÄÚ^±H;)–äÿÊ‹*|Ë”|¤Jó Á‰d!ÙÉÂ"ð¤ÒÜ5.
-»±0”i¬dÒŒ,Š±‹M6Ž³ÉOÃhoht#$1êaˆ-0Ñ ¼Ôp·€ÉF;0rÞô]²Ãö mì3`Ûfouw)ö^£ÄlÑô“w+{™ßÊ/ñŽJ»#¼E]±þÜ J Ë’BïÈ'Q:*(Äv#-¤½3×>ŽxJ÷¿!ÛaÉ ƒm©
-Ï|:’‰Ða9‚‡äz‘…
-'¢\áŠÙyž0—ù¼.©ö+\2lZñb憘ç†ÆØg¹MñOs¾NÐÿ=ɪíHéÓžK{¤¹*¸¯¾+¼£y&¸­O¹™ƒ„î\Äýœ‡ØÄÜ0þTAt¾LÓÞiñ£½/Œ±v¨NuÄ‚ —7óužcżsæšëÂJ>æ?.\ÿ0sÒ}ãöÔ»y»ÒÍmßÎ9,¹©?-íÖwÉnèog\Ó?‘]Í}oDÚå|$u™0ãRâ.`ú» ¡ïÏ÷aÂÌ¥ùS™¨¡÷¨á .Éá͇瑲=ž/4ñúç[‚–/Œº[¶$þö¬•É¿¯Ü(Ü*ºnÚ)ý1wÆ÷ÆòËÆŽ¬K†Nåw†ëÊæ=RvÎÎ<[
-b}Íî_›`ß»FìܽRÍý¡Á|±~vLç‡U §kêÇ,“´W®–ªøTy |«zßœº–Ù_çì);”÷•ùŒq—ùc“ù‘¡É2ªi®@Vs%dM•}Q á»OsçÐüÚ·–ÐYVp¯Öø3? c>ØËéÙ tº¶Få}i¥1è\CiÌÉÅóÚëÞú`±´márùÞkU{*7iwÍû<狹_æí(o3~n9‘ßhé2mµôšþ:oHßXÕ¶ÿf»>£šLÓ0
-«NZ ’¤ ßÚ4D•¤#/ÌC
-ÇÏ¿+2T¾Vk·Âró·ðRº‡¸ÐtLg¦–¼åveàî뢰%1Gz ;ry³r)R~1½)£Ü¿>½ŽY“ÚƪLéa‹“¯…‰’&ÃK“—ÂE©¿±Ä¼u¿òsèæ->‡¼T¡ÜC"Þ{Ù˜p#¬WÀ¿7ÁÛ Æ°ØnAœ“:hO6zIüw V°­zE'í:JâÛ Ó<ZY”†œº$Kä_É—0Å­!¥¼Nvqú`Xaún~únaÆ?CŠ3ÿç/ÌF4Œ\’¼U¡(|ɺ€rõpz°*у_Zõào2}øNfF˜¹xDk¢ÕÓh¤±S! ÙßUu¸]çÔ"Lv¯/â“« ´rA©ßùÜ*fIvSHA–œ“—y%<‡?ÁÍÊ\àfgýÊÎËý=0_€è#«B'ñ-¤âÍ™¿ÖÄ:xwjÁ‹6XìÔ…G]; “òÚcíî›Zè;z‚-/I"l[+cëʼnnÕçyd±0—VZTìWTXÁä7°²Ùü¼þp^îMnzî<—'ø;›_ðßÀ¬"ä‹Q1Š*‹ï€§ ¨P –«ÔáE³&|I¾ëљ˦„‰nka¹«a_û SykÐ^ic¸MCí©cÕÕ ®âŠ4o¡8ûD¨‘[*Ì,©cñŠÛØ©E½aI…£ÜÄ¢9nbñ2'Eøfz)bðJñ?‘RDU…âp|Mø$T‡W<mՀǚ0ק“ý&0ÚwPýj·‹A·œº½ýbàŸ¥ëšæhqÙã%µ)^ù5™>9Uù¾ç*Τ‰%ÁIeÒÐQ'Nt=ü´hû‰/þÄL¬@Œ¤
-ä“TŽ¨ªPî![ –Ë
-’M1e?0Y²~¡rDãÈ…#CdUˆðVð—€&z 0Œ·_ÿ@Ç]=h»»‹ÐxÇV³râ¸pÜÇD0`Æ¿ÎÞŸ:esöZœÃé¡dçè¾÷jûJ•¥h *d¾þŠAC1…½bø)VO(¾P˜ýÈ óTµŠ{økÀœànÀÞ~ýx{Éo¡eFêg·CåÌ5á='ݼioãs“~¦)wC,âïDì¹k5‘t$ìÖ9Ç›— ñ27ÿñzOß1™7ml€â36Eñÿ|blÕ‹6Š<è£È•~WõN°P0-¸Ñ  Âù7š§HP5¯ ¢#(^ØCÌ}l¯•ñgIó´­q‚LOÎ…›sž²d?8{ øÏ&`V`ǘ9Ðfê©32gòÌ ‹÷ì´‹×ìï™ÎÞ÷‘#ù:JžþÚR%Àì€ñn€+Wqþ œ÷gåC5(~¢Ù/õÿr!õ…µZ í˜çƒÈçÆœ%¶ ëYôÎÀgñf~ÏÒ÷Ðóöù,ž·"/Öò|&³öx6dã¶tÏÖméG·ÅU·§ëÖnߣCnO¾6ßp»`  sçãýY9P´@þ -HUÂYå.B¬ò )RyL“£ôØÀRÒ7*ƒ71”[hÊÓßP•)ÛÉÊ,SOeÉNweÍn×å6s—e……óÏw,œ~^´p\þ·…ãO¿›;¾CdòÀÐe€.|‡-¸ƒŠ{
-5ìCÝ–è†á^ôûÑpZÅ>}¥w ½Žóñ <H[ˆÅùì_
-Ö°Dáš{PŒ¦9JÖÚr´w¢2í¨IÇué|‹†u¶£© &è9öæ+møªïàü‡8ÿ)@ Îg)èk
-ñZHÕ2E¶¶1Ê´ ±JÛ
-ØÝRÀV$4”³ˆeÓPͦ‘2‡‰4/-¤ñ§!E:‹£ >&¦š¾Ïµ|3Soÿ"j­ÓóˆÎ9O•=®Ãw¹ý60ÿâ÷åG=ïÊ/xß‘ßôþIþÄûÅ;ïÃávM ×+˜3 çï"ᨠ¡¶ D[1`Á@*é»ä&™ä™äËD3>¤+õߤ©L_$«­ŸªŠì~YTã|?®Ñõç˜V÷±è.¯Ÿ¢z}nFþ•s#bˆ{=b˜wUyÚwTyÕï²ò¡ß¥ˆ7Ü Qð>³ áv&®§cᢠa$7ŽôÞdÒ;3,È!7É#÷È÷ÑžÈLÏ Õ{šgú c ûNÚr‡“ËçÞPÕ¹_Khößȹ×Íû&v‡ß……ýüs1ûÎD <}Ip"ú¶àXÌË€‘Øß|ăs8žÃ‰p'Ü4!â÷ι„t¾l2K %Îôd©s¼ÔoÚãbɬ»Ñ&?æ$³¯«3¾K/šw)­Úó|ò*Ι¤µ¼“ªÿã‰=GíŽ :PôuÜiñ¸ïÅû㟈ö&LîUÁw( œ¡dx ¥ÀC¢Iîb’¿Ì€B¾ …R2Ó
-{Æ›*WúI5GûneÐŒ›eJãÑ¢Dö¥åéNg³óÜN¨Ë½Ž¦¯ä^Òäw0µ5ð@r—p_R¯hhñÉ j_Ȁ꘴?ñ²lwâÙî¤wÁ}©èKƒoßpú–Â[bÉ RH~6é[EFV˜Q“µlƯuNŒûõîÌ×èŒV+Œ.”ÇYŸ*Ns:šŸív(·Èû@VoŸºž?˜Ñ,øréÆà=Kº%}©;¥;RC·¥ Ë·¦œWô$ßVô¤‡ô¤CØ“ÿ/ÔàMˆ7&wУ°œ(#³ÔQoÌ©G³©±¿¸0®6úN»X'3<Yc}¤"ÉñëµÛ¾Â|ï¿å•óúskù}Ù™ëE½Ë6…ôdô†~žÞ¯èZz ¼sé)eûÒ”í/B;ÔEYìÌ_g.¸š`HÞ"é{ºddŽ:}êe“!u¯ÅŒº±Î‘ñm3—uºQb0ReõUÊqhEú¼/Ër½ûŠ‹yÛ ª¶æ5uç6‹»rÚ¥Y=ò¶Ì¾°Võ>åZõñˆõÕÈ–¬gaks&%ë–C¸>üõä_GTä·«Iß+&ªgR¯VéRZfQ·6èQ£mvŒó­>¬ã-"ýƒ–{ë9ôצÍÛU™åÕ[^ÈÛRZÁï*^ÔQØ$Þ¿A¶.o³¢9wGxSîß#VçŒD5ä\ŽjÈ}¤\?!m,DPSÖÃO’È;ÈÒ!oQ‡z½R‡[3º¹~:õ¯ö™Ô7³©S½´·éío³hŒ³ßUŸâÚ»RíÕ]Çí\QÊo+¯®/]%n.Y'k*Ú¤XU¸MYW0Y›?U“)ººàaDmñ{Ùg¥Õ•AP_¾&¤ýç²(T°¨ûõLêf ‹ºÖ¦CnšAÛlMÛä¡õU»`Ö`«Ü|wóB»mMIs»2<;?Ëån¨-ö_[])XSY/^]Ñ,­+oWÔ–~¡¬*é¬(9]Vrž¸UQþ.´rÄÕ•ÖT¯ iääiQo«hjl5M]_§M:Ï4êÒç:ÔÉ-–Ôp÷|æ¾®
-½f–ûí?pfÃÞŒ¶ Ý=!)÷B’3&‚wüÝ7- •éÙèºï:«Ã­ÀT~!3ß·…Œ”1áó ײ ¿~\­·btžqÒj©ñZVWdx¢,Ò¬¬d‹°èX‚]~a²ãáüt—¬¼,÷ŒÃù^é¹Ç}w:œ}.()»;x{öÄìB’ržû%FeÊT¤A¹:Œ']Hxœ ðuE:À€áÓL8Ë„ëM|èj2§Û$ì†Z%ÿä©ÀÕåÕá&E•›­óËâŹ¥;¥™ÅiÎûtK+ÌóL)(ñI:Z㟘ןח7¼5ïQp|þo~ ¨Ü^ˆŠ¤B”«ÃD&¼Øð}€ê8™ûjh¸]Ï€Í4\nåAG« ÝÔb¯yºÑWYïoP|&lmþ©M–95q¢ƒU;öUì–í.ÏpÝu<×c{i‘÷GÅÕ~[‹bŠ.n.Š.zSüÔ7¶dAW‚Šm¥(W‡I
-ºÛ
-€Ûµ
-½km•ƒb÷Á>±ûÐßÄî·§Eîó¶îŸ¢ !T§*<M:ÐÐÞP× Pq ` óRGØ°st9$ŽšQÛFí™1_¹iF}åÏ  Ó Ù´,hd›~€jç*_Õ¾5^ª\#UéZ7ÕWU‡™\Õg&ùÆLþ匩ó_ߘ:¦ÎYl¸ ÷,yí
-pö@U/É¿ý.?y î!6>Ö„ðñ!ô‰>±¦üž8Ð^“®LI Ådð—©lÙT,Çq*‰+™N׶›>¬³~ºLW4Ó g3s‰'|:DŒñÓÏx‚Éžà ê©»ÔÐDÞa5é`á
-Ó˜+ñ°Æ{X®±YËñ2kY|üu‘S—Žõ‘þ}ö.?æ@È€çO
-©5¸žZ…ŽÔJTP+Л^†4#h=Œ¥upÍÅ,†–08XKt0ØØËÐÄ»‹“75LòU$ÿ;€àxü ™#€€0Ç%°uÀ—ÂjÔ}4„åd/KÑ ôP@é ˜ÒF)ÅAWJ½) ¦(Œ¢
-qŽz—øŽú’øš:O|Iãç~`üÌV=¥Ñ.hÖ`™ t "ð7ÊN ¢qQTMˆ Ö†›—AH†ç¯ü$2øĪ3šl5žcî ~è[ý>`Äô-cŸéÆÑ5¯éSfÐÿeþ‚~Ëü ý¹Å#Æœù}Æ‚Ù½
-ô±Ô
-Î n½§—ƒOY x–—‚Çb íï- ô;ßÍj„®ÊÕp¾:£ÔDÇUè°ÊŽ0®ô\2ÔÌÔÛÙ¾ªckœY›,ͦ©&k\Âw‘U“ªEbÏÊŠ:Ÿòò¿’²NFQé³ ä ‹_r*(¯äVP~é[† |Á·°(B0ßl5ôg>B¿U t]†«‘€Î*Õщvut´c%Úß±–0ÒNÖêkc,ïl 3R5n^ÓÔb]¿•ãP+Ëu‘H‹<D5ž¥’ZoaU“Ÿ ²ƒÎ0y¢ý,®h*(Kt#ˆ+~ÃàU}óÍ«
-_¤Å@&B/ñncï¼VÐùì}í4ÑI@ºõОn+Â@—‡fw‡¿î¶m!†ÍmѦõ-IVÒ¦ û*EŽS…\à^R_¶¾°®Ú‹/SPyµíþÙÒ¾
-„N«šìÄîÙ‹Ýo—.ê3G½»\5¶÷RuZº‚õå;6­–¶'XTªÒmËÚ²…­ù®Í%¤Ü¦*
-·±Þ‡Ó ¢±å;é©òñ€dùqf’ü3Yþ’žÚðÅ7½(ló‡Ðƒr„fêšnEèv¿Ã8¼¡Á¡¥¨wØu 9©·zkËûWHw†‹{bÍJ»S­‹:·Øó;òœs¶ ݳÚÅä UWj›Ò7IÙKKPŽÒc•“ŒÍÊ«ŒXå Z¼ò/Ÿ%x&µ ãñ=¯ pø¸„ßàÔ6„&z°ûáüáa„ºG5Pû˜j³W“ÿð:júL8þür“
-ÁêV­.`ÕjåÒâ-Ñ>ûd÷¥³³|&3ùeæûþÞ#3ï¾0ÞÊÊx«’=©öKvçH–å»ÏÛUì=kç¿i;m_<eë*Õ¤-Ÿ‡OزE“mØ•e8i0’¾È,ƒ)<Û€ªÔCëðãªÿÎÁ @-Ý?+¨¿mÀ†ZºÿÔI`u'³¢6„³ü@Œpqu²Íûû³æ|“'›QUäþÞ¾YÞ•È'W. È­X©ÌÞ³.$³Ü N+¯ O)?®/o‹Ðïî KÙm
-M-Ãà´2TÅÛn–
-¥®¶>H[Û4î@o¶Æ¤ÐÕ`€®ýGºLspf=À1Zƒýe
-€­Õ
-£å°¢Óò¥¢Oô\ù\ôDù»è‘EÉ
-u6~3p:þ‹À©„7”‰Ë?ûM$!Ÿq6òOFÇÆ’‘§5(n?î` L<»§h¼;Ãß$îðg±/ì䇟å³ßà'9}ÄÍr½Ÿç¾œ)÷XL×xÍs*}æÒêH3©-ä)”ÉäÁÀñä© QöâÉaö#ú {›ÞÏþîd_ÊO”¾4ä×{ù`¼{9è¸5(g†}/Çþ“go
-à[™#|Yx
-ÛCJdCáJé,K!½)—þ.R.û>¼Hþ_†R‚T
-DQ!²5(à{îA‰½W °iÀÎe$ÀJæë÷Á/©§Ûô£wwT_ÜßZÉþ IŸq¤®<÷xu™Ø§B£ð/Wk(¥%•´’â†RÕ"W„K‹¦Y’¢{‘â¢O#ÅÊoà T?1eÅ(¨°Q0dkP6¾ î¡;Î`͈½»ß"vŸ™&'3{Â@x½1ÊþZ}ì¾&ãe·ºjÎá*÷˜¾BtB«/ôS——PTZ}¢¬Ž.+m –húÂDê©¡z™ÅW?ä«¿‰–þ›)*E´ü2D—¡
-ÌP¦¨cÔƒ
-:ÈŸäùß@=eOR
-G<zúØúYÓ([Ê
-ÃÒµ³ÐŸÆƒŽL#ø#ÓZ3Äp'S×2'2õ¼º´há©ÔÑñä,ÉÑÄ,¿›Q ;ÿ¹mu\‘ݾé«U{¦¯w¨ŒÝæ¸+¦ÊigÌaÍö˜Ë£¯¸lnsÙÛ§.›ŽöeqhW¶D>FŽô
-ÕÊÈiÕ…«g–$Y”(2m”y
-qAn‰$/§ÖI.ovÉ’kÜÒ³{=R³‡d)Ùç=“²”¥ÈuMËaND’žËÄýJ³ð×TêCÍŠj@ÙƒÕÀþ`g>:kÍÐQ;‹k«ñÖi¬Z2E]±\PUnZV=CUœ`Q¨J·VåÚåª$YÕNéùM.)ù›g')v¹'(dñŠs²8Å]Ùšü»&ä3§Ä&I*`â‰FÇga¼4g˨”}˜öÏ=õ@W½:êEh[+åšêæè¨ÕïéWÕ•V‡š(«¢Dù•ñæ¹å©VÙerÛŒÒ"‡Ô’JiRqì5ªM®±ª·åhå'*o{D«þåºZÅœb‹™„ˆ'z”
-㬖“ôu1¢ä¦D³„Æ «¸…mÌÚRûUõjÇÈúõNauÛg}PwÀ5¸n˜|ï¬þÅù5s U3b7ÑêÃ%z†©Ctÿ}­ÀŽvÚ=7õ[€*J5Pjfqùoù–Ez›ƒ S:B‰›¢Lã6ÆψiO3Úk¹¾Ø6¬­VÒÖ*YÑÚ%]Öºß)¨õŒs`ë7Î-σZ˜Ã²f&^ÞÌl'ú–~“þLÏÁ êÿ!Êß½ÐPvK'í^Ûe·.=Ó‘Ó#Af'—ÚíÃOìÐÛl³=Rµ-Ö4²+YÖ•mÒYd±bkµuÐÖfÛ
-Ç›žüàCàp+ö·WC|;¶wT°¹ÓÀYßíä,ïâ,îžçÌïüƒ3¿õ‚3ÿñÌnN¶“úßAù ”_z ÓÝ×|Jù”ý>eû|¼ó5àr°¿£ ÛBØ<˜«‡¶°xè óGž˜ùhfüìÑãL{Ó'é0yZLÖA8Ú á³c<»
-ãÑÇ0~2ãŸÙ$Êo¢üòœaÊ?Où”@Ù ([ö@z°ù0ÌÃÌçF=7…é 3˜¼°…𥂗î0zå ƒ×‹ ÿz9øcQÐù- ¼7ÅÀoÍ„²1jîØ5ò„Œ‘ßþ«™ò+)?W $ÐÝïK¯ó(Û²(Ûâ0ý`ò
-2=˜1 ™ ô™|f Ž‰æL<ÉB€ß_ý!3zøýè3:£B³‹äÞ$Õ”¯ üDú(â+Àÿ;`.e»þ °»ª3eÓÑ)߀z„Çøô]" &DD,‰=q!^d1 !ô¢Ìè‘5.BCÏNMÂÄ´[:8¿eçÊ1 OŽM[À1“
-€,æIÐøœÙÄKŸ`btVù`¦ŒºóY.uË»„ñ‹w5ó†×2ÖU¯&Öß½6]òÜn|ѳÓøÏ“óžMF<MÏy~ozÆë¶ÙI¯fCÞ¿›ðƦÇÁ€76ù#ì uç™Am„ƒa¡G‹ÑÓùÓÑý€¹Ä-ÿâƼòò\%ãÇ9ZÖy¿%FçüjMÎú®0=í»Öì”ÏfóaŸv‹o}¾°ø‹O¯å O¿Õ€Ï)«c>׬¿ñµ>èû›Õ~?lùµ¶èóÃæûü°ÙÇð\¨È‚º „Ãa‘h<‚ž„ÓèN¨;º: ý-4„ ‰£Î˘'¨Œ‡™Î×› Ö[ 0Xö4[ößÂ>èßa³ß¿›óµÿ~Û}þ'l÷ú_°ëñ¿o×0ÆÙ'([wb+`Ù5ÿ0ñþð¹Š@hl‰FcYèqŒºe®F9¡ Ñ3Йè
-n±ín³ßÔÉí
-Úë°+èogÐY^GÐ-º=øw[¶k ÅÀÖ[?‚0^õcºŸø_’t-‰…®Ä›¡‘:•èçýñaŒqñFûbe¦=‹²-º£µV»£ÊØ‘Õœvk¸íᛶ…No ëæo ;(Ø6ì¸1ì'Ç–ðgüõ¿;¬Äö͑ض9
-Û|ì¿/‘=‚ú7SºœŽÐ…tú>ÕLµCÒOÐ!él¢/5˜Ñ“c´;)Õ´31ÓbG‚Úº=®ˆÓ[n×[ÇÝcàm\ÔL¯_Ô&XÝåØÝ'\=è¼*ú¢óÊè 1ïø†Xì
-úŒÐõ „F ö°êÃÜsžûr-P·Z€v©§Ûsý¨-9!¬–¬E¦k•)«rkCFg™\k¿tq©C¬š®–-s¬L_',—¶¹”Iw‹K¤]uÒ¿ºIo»§¿qÖÉ°@·ÓÀp'½ŸØ‹i°àºqꞀٳ¿
-Ì×*08Lz‡Ð¿dÐÈà”¡cE0ïè`Þ
-–;ej׻ȵŸ‹eš=nRÍq÷4íew©ö™8]‹…²,X\€iÀ›ôPŠÐ%ô28Zû 2¨ƒ À˜×ÔX¡µN¨¡vQSãKé«‚X¥•‘&Å æZ½Ô:¯\ÁQ-QÛg•9(J+øò’F§ô’uÎiºí¢ÝW®Iºcn‰º‹à©(Y÷»SŠ
-X+
-8"8Kl‰Uk+“âÕ.DéÕÚ:¬ÖZÀ«uÀ}_»Z¥þ¸?ž•äÏy÷÷í}rÎç?hžô<Oz×wûpf&pœ{°Ÿù»–±|ΠeôI²óSaNJ >L1+¦'Ǫ¦$Å;LZÞ_3~ùPí¸ecŒ^:A?òÓižÃ–Ìñ²8Ágàâ~ý³üû&îhÚ;±ÀØ+ñœ±Wƒ&½^úõI>äÝ7AþR9™ûÀ°ï{™¿u{À±dÕ*`}œªÂ¬4=f¤15½˜”©x/µ‹j\jÇÑ«;ø|¤vØÊñ †¬œ¢øÙG û­XèÕ{E²wÏ”Lßø”m»¥nÜ5ålã®É÷ýº%½ðé–$ Ý“¤W÷åoçÁ×óy?²ÿ»8ŠlJeÒ¤5œý29ûeïg»aÂ:_Œ_„qëÚ‹QÙqÊáÙ=ÔC³8Φ9NÛwíûn½×ÎÒõX³À£Ûšåž]2ÖxuÊØjˆË8ä›Qæ»úgClús¯¸4Ùˆ<ë+al܃½¬?/ ÈböÊ, q=0›³èDŽGcr5™ÛÃó04/ƒó"ÅÀ¼®Š~¹}T½s‡¨{æŽrì¾e‚¦ë–é.ræºÅå,ÕEç¬vÜœ«ï°ù GDΈÍ÷ôáŸëÃ7H}øzéQÏIÞ¸ï;˜¿q-¾Žç€ÙóriÛ9îâüÇѨŸÕ }¬>èmm‰žV â­±¢›5^t±öWt²SÆYÿ¡Ž¶NqˆÌŸí‘¿X–ŸæbÎߢm—¿_Û6ÿ´¶íž*mè®ç®¡;¥k莿+àÈgÿs˜¿–µ'ç
-®dí ;¬À¤ýÀH΢ýl@—ã@‡“¡…„éѺÈÁEA0[T‹V%=вdKÆ Eé4++J“DÓÒu¢I©UøŸ>%üKïˆÆÅ¿+ü
-¥ÒïÔTÙÁü ÌOÍ–°ï³¿&3{ÇÑþ_3ÿ[桧À«à_î ß îð©ðwE .†R¼.uC£KáÉ—†•Óàñý"èÿ“÷ËÛ¡»rœ®AWY ÝE ]…º ombþjæ/eï?fíSX÷hf÷?Åü â rh^øUž?¨¡»åÝmw¸Ýñ¡fp½íݸػÀÙ>
-诮·—j'hjÝàXëU5@‰Â¨#ñ¥¤†ãÞø5¼ékxÐk¿ ^øñ]zB/ÞHfþž¹Žñ,d~Љٖ‹@«Ë€ÿO¬ý&Ðàà|P×Ê:¼t^¸’;5âo
-¤¶@] ðªñaôŠë\‡ä:$¹d‘’–wÞXÈüé<sc‹ç™ÏºÍW¸÷×
-RJ<QýIý– hB~l!ùó»áu?BÙÚö¤×3LHí{BºÌ¤ô)­¤ !×ÓömY‰½p>Ž:çR¼p¾„§ÎU¨u~Œßœ%¹Hüª•x¨•â]²…/d ²…×ÁϦ¯{̽‰
-º@åï!ÌnÓ€\!CuÄ~´a/ZólEâY`<7"Œ¦Š{ÆÙÂn\$n—‰›ÆÏÅ ãq͸AühÌ?÷ˆËÆŠJã ÅÅ€2EyÀuŹf¿)Ï4«S–6—Êb*¢B:UlË|³ ¤Å 2œëçšÚû ÎÜÛšñ0¤#ªZ÷Å­àâ§à âŠi†¨4ÍUT˜å¦$Åw¦Tå9S¦ò¬i“²Ì´MuÚ´WUb*P™ŠÔ…¦JõÉàêcÁÏŽ¶–­¥ú~‡ Ó2W ©„Œá:b\Qíêq¯}n„EàŠ%‹󖱢Ì2YQjùPYlž¯:e^¬úÆœ¬>iNs8aÎr8Ö.Çñh»Ž¶vûŽ˜O82ŸÓ0ßÕ|aù¯Æj‘š|‹tÚm‘Ž¯íªGF8BFñ¯"xÞY º³ª;ºÂ£ÇÕ¨&(n‡³1PÓO|3Bq"z¼ò«èÔQÿt8õ/ǃ‘KœöG¦höE¦ÿé2 jë¼Âð‘Ī}Eb±'{¼Åc\jl!ƒB¬!„$K€@$6±Ib·Ø±@Œ… Æ8ÂÄX$vl'®×Y&‰ÓvÆíL“Ž=iÓ&“I:MÓÔmšôö43ûÇ3÷þ{ïyÏ9÷û^ê+b?uU¼L»$¾L¿(¾Î8/~›?b.ü†±”JÐϤ´ÅT‚ºJÄ> ‘FþIÿ‰ l€Ç
-|,‚ßKið #Þ–í‚_ÈÒà¦LAº–YB e"®dÔD­±G_’¶Åž—vQƒéÚËéãŒeÉ sI²ÀZ”¬°OKBœ€äÇ/yÈKÿš3›þkFJ0§¥}únö3‡ÑƒL̽ø{T€¹óçƒ
-¼Ÿ÷røð†r\Ëý9¬çf’W•” 9e‘AEEôr¶5öŒ¼‰º ï ²z˜þ¬!Öœl’=+;ÅÎ\æù2×øS™·ÞÌ‚ Ù‚ñ¬ï¹cr‚0GåãY)kXÿŸPû!æ¾Jî«îEÀÍBl½
-Ó¢J!@xU&‚æKîöþ>zpu¯6¢͘7ð9‹×o=Fl›ÁcÛ ½61Ù]ŸAé¨SFµÖÇ4[Ë© –
-†­Æʪ­näXª;ùÕæ¸Jóq‘©ÊŸp´ê|’¾êú&]ՇȗIzó"ƒ™ˆCøGÍ/Ì_p…3øúu×8mxßÇ 8Ù„™§‰Çš¡§y¸šRHíéGƒ"²Ñ^m³—QëlFº¥¾†Y]gçTÖµóLµ}q†Úq‘Î:— µ“4Ö×6•ZßG¾HÔXÿ#*³qeµ_k%xa>Å}ü
-¢­-¥±ÕÍZe³™ijªg[¹ºÆnAYè°Ô>_b9Qe5©Èþ^R¡ýs|ÿ^¤²‚b;ÁGxaþ€}xçà&Ö¼Žú+˜?º1s Çð[Ü®hhwñÁá~Ý{I6W*¹Ö•I©væFVvǘ:Ë©†Ž
-zy{-«¬­™£nsóŠ[‡ã
-[gDùŽåø<G(AéxùsB®ãßÂ<!@xù‚æ!îã=ôàú¿Šúçú0÷
-†ÌÔÜA;=g°ƒ%÷ pdž)^†g‘/=vEî¹'û£ }à /}€àJû Âózð:ö` ë?7„Œ¡8^ô` f
-³ÇT,è||Ðú¶€æÄ(ñ‰I*ßr/‡’ç+ŠPNi#³§*¢³&ëb3&[iRoCâõ²yØ©Þ5ÎAï[±÷S¶xâŸlñ8Á:8öÌ0wp7zЬwaç
-IV´ä”•Jòþ;eߊ+bop$rOðTÔî२]ÁÛQ;ƒ¢vžû.zÇ2½ã,³cé)!Œ‚+¨ÀÚ}s
- ùêØwu콚/…$°'¤€Ý!ì
-éaGÈJÚj#m yH[C³äCçÉ/l¼AÞ²ñ yËú·”篔ç_!"ž[{ÊeÔ_Dý¬}d{€Ú 
-ͦ…”IÙ´†6Ò6*¤½TL'éÝÁ;<¡wxËßÞPß-ÝÙôÖl ùÙ¦-„â/ü¦õ§!ô9M¢J£%´œrhåSíaÖÞ· ¯q–%ºÉRÕ³doð”ß6zò'D+7·l9º²¬‡­/„6BÙBÏÿIhêûZ, ¥´’=ÌeB3·2³ÏX‹'(ar9‡íóç!^ññ¸ßH¸÷„»3DG¶ÃÂÙÌz´‚pèÀštÐs<l9Úaš±4 ïÔ3ðF=‡@:^ª³ð\•'ªµ¨WmBª
-鈛ŠÝ„ìp#×?æû(IÑ‘íðe=>1ãE;w<öêˆ;A¸Þ&WÛ ÆE÷‘8ç>Uî“Qá1§=æH?y,’NxdJÇ<²¥2uÒQÏ-R‰ç.©Øóì°×iÙ¯›²½ÞOeEÞB¾‡v½Wøá§jz•­ä/Ã+«/ü xàã„ëí=ñK{+Î~†rK NX†¢Ì2Z*µLŠ-ÉÒ!KŠì€e®l¿%]¶Ï’%ûÁ’#/²äÉ÷X
-ä»|ö*
-}Ž)vú\Uló­Slñ}§Ì÷ŠM…bc#ß?4esZ à4ÄéþÕtU£¦“çü\qª³/ÊüƒQì]â¥}þŸIEþcd»ý¿”úO‘ï´Î”ï°¦)¶[+¶ZW(7[sUùÖͪÖÝê Ö#êõÖsê5þ÷ÕÿôoPçtêU]„*»‰²™èÊ60ÿ>§´k½€‹t&TŽÊ
-]d“²L—’k»$d‹>=¤H¿(ä˜aAh­a^èS}ZO¡#›¹=…vn˜Ð4Ý›–¹jfWpj/Äs'Ï ?FJØÓ×€‚7äGúbCdr#ûH91²•ýåËûPfö£Ê蛤^Ò'Y›Þg¦ÍÂÞiºù½3lÓz¯2Ì ßh—¾Ë8;¼Ô8«÷û™½ëíRú}J_¡#Ò6{ÆÜŽ
-|—`BV¢– ñÃÂÄ`)-¡·,5!Z>ëÓÁÊ”ÁÃUÓÖL¯MŽŸ¤›7]?1n®Ý—±öbW›þ»Åq\ì>óØØró˜¸{ŽcâìÇÆ ;Ò“m³û|/²ÇÙÿƒ#Y.õÛh=?góo™ÃŒX<¼5æÿ/ÛeÔä™Æñ®‡Ö ©GAkµÐ¢ˆÊ!¢†#@‰ AåðâÐz@TªBt]O »®°µÖZa»Ý]ÇÚ-3Ýum«µèn­­Õ~û×êL§“ùÍ _¾|ÿ÷ù?ïû~ψµi¯ŠªÓ扫t‹$å©ñ¥))2kŠÁ±89ǹ0¹ÐÕ’´J‘—T«2k7¹gk[=LÚƒžYÚSšLí^í &3iH™$¨²’%QùS™‡èû{Œý Kž·rèÙ»œµ>¯5é•Ø`‰:Ãd¬1ÌUæŠKõ‘kÆR‡âô$iAzºc~šÉ97Í⚣[©X®«Vuî†ÔúÔžé©'4i©ý^ºÔ›š4Ý#ušNpK× J¢æ×â?˜ÿsYÀIjËöç³çËe¿C?Öå¨1ù Ê4«LÓ±Òôº¨Ø¸P\µØ!?k™Ôœ©sÌÎÌr2ò\² V¹A¿Z™¡¯w×émꔌýžÉÇ5Iú‹^Zý ŽÔIzÁ-Y/(‰b˜kÌÃÀÛŒû8µ²ß(b¿Áq£¨1;£Â¬A©y<¬¹/£È,²˜ÃŹ9‹$Ù9 RSvŠ,3Ûà¤_nvI_^,×™*•)¦ nZc³:ѸÏ#ÁøM¼ñ‚&ÎøÇûêx£à–`”D1̧ÌÃÅLžŒ»‹Ú¿·²çbI¾c­¨°HQbQ£¨` ,È-˜-Ê)›,Q’LËR}~’,=?Ã15/Û99¯ÐU›W®HÌ]§ŠËÝæ¾ÄÜîkîòŒÉ=O®yƘT/6 *¢Œ5 Ša®pݧ' ˜‡æ¥ø.–Ÿ›8VrVb±ªk}9%“`* BfI¨H_²Pœf•¤Z—I“W¤É–­09%[\âŠKå±Euʘ¢-nÑE{Ý# ;ÕEç<]UGþàQ(¨" ed æï\ÿg¹ŽSëµÛVÍk€zŽeÔçµìr9²*¼a¨ðGFå4è*CD)•á⤊EâÄŠx‡øòéÒòLÇÅ«r­*q‰*«–/,Û¤œ_¶[^vÌ-¬ì,ùÔ-¬ôž*¬TPÎ[É
-m¥ ¦Ÿt3Œû
-§ðšÕÎsk]C«[å¯WQ„TÿYR3 YsW²Zת眧'J#Ôo§nË ¡XÝ
-·ÞõPõ¶BÙÛEïE(z¡<ó”§(O=§Þ·Ð÷zú]ɸ-ÔÖw "N
-Á“ý­z%qâßx:)$„D-É"d©% d+ÙAöPg?uã1º¨q
-ðâ¯x€«´ékÚõøžÜ%w~…àíAãE?4ô‚t¯N"³È|GÒ‰™XŸyñë8ÿ&>y;uvQ§ ?à
-~•ZðïÂC¾ øjü«Ã]¾ßóóñ¿·ùøFÒŠ›’6\—lÇUÉ~\–Ç_¤çqQö¾á¼BÄY¥ˆOU"Îü1J±¿”üà F* ö!ŸzR}ºÀ/Ãñ£&4ø›º
-OÈþ?Èþ­$Ò[F²M|@¿Æ380Jƒ]£ûb«^‹Íq£±!ÞˆÖø,fM\³2®]WʶÄUqKõ“¹ÅúiüB}£¤Y¿HÒ¤_%§o“ÍÑï–5êO³õW„†¸‡Â̸§²ñ¢”¼ÊO£¨%Rë¥kýLÍù™À!jy{“Io$(ñ'ClHüÖ&ÀÊ$–%™˜¥IfQ¢mNôpM‰åÜ<C€Ÿc¨•Ì6Ì”6$4Éf&,¦'¬—OKØ!¯O8ª¨3\PÔ(¦$>¦$Š2BZó
-⩦P ÌÀ)Òž‡s=´n#ÚŒ2´¦tŪÔh´¤Çâ´1hNMaæ§f3sR­ìì÷NŠ—Ÿa¬ä§C’°1,­36
-µÉKä5Éë¡äe0ùj’ñ¼*`¼§
-¤üG11EÙ«ü`
-rÙ²WZPÄ—X}5 +²Ö .k£Âa]ª²[׫mÖ]šëÉNVëMâ_j«UTXEù „gܤ:œ![GÉæî Ý´-^šõ]4ë:¥¨u¾†³&¹´¨rD…ÓÀøœiŒ×™Í;¬œÛáâ ^‰ÓQ%µÛk›}–Âj_¬ooUçÙwj,öš\ûuâ±Úb•„‚Â3¾²Ð^ ¤Øw–ÑY¨ ÍGãðâr`¦‡ô†›Cµ»3ªÜ}Qáye¼ž1L±ÇȸÝfÖåÎçœnowKlE~©µ¨FÈ/zGn)\¨Ì)\§Ê*Ü®6½¯É,úŠx¤2‰Js¡¨ ä„ðŒKtNRöSìÛ*©4~®$š'õô®ºð—jà+í…’Òx|ÃQ䋃Ë7Žqø2Ø ¥¶ t7¾ÔÍç•–Kr½!Y¶wºÜì] Èð®Q¦{;TiÞ£êTï—ĪÔQ‘V"Ê_ <ã3:ïS öPìí4v¶†¨“¹´N¡±ÜOï½~%ÜþnpUFÁQ9ªF¢ ÊÀX«Ò˜üÊlÖRiår* ù¬JŸ$Ã?IšîËRýóåFÿ*ErÅVe’ÿˆ*ÑI•XñP™T!*’ÊE9!Œ{Á:‡©;)ö¶`õTÒu´i ’/>òÅ”aB0ÁHŒ½¼¹¡1È™ld²B™Lf(Ÿ5…\Z¨„O N”$ë¤IÁ¹2Cp…0¶º]<¤ˆ^PÄUÿ ŸôTˆŸ$
-ñQö’S”ƒýoÙß&Ý7h"i4L#ÝUOsƒÜ: ²ë{Â\?™áa0…G!=œˆÔp:c ç0ãÂ66)ìa õ~nLý>®¾ñ¿\—yT”×ÆŸï›°Œ3,²
-ʦ0 ‡'Æ-DkÕ$F­5O465"¸eE© 8€¸ÂHÝpjÜ%Š±©§‰&*.ÚTÓ¨(1Þ>
-&©üÎÇ÷÷y—{ßû¾ª¾™EêÔÌ
-9³^“œÙ¬Iθ­Ižÿ³&9]hÌéBmž×Á^îÁ]ôu õKY²+Ç¢ùVæÏwÈÛdX¶'†äø!-'¯Yã0ØÚƒ¬ý0Àš†þÖèg#Y¬¤Tëû²Ù:Ga²f)’r
-”/çlV&æ¸TÆœä¦Ò˜õXe\*TÆ%¿RÏ=PC_7f1³&¬àyÈeVr¬âì•Œ ƒódô³ia±¢¯=©ö¤ØÍH¶÷‡É>}òßBRþ8ôΟ,í³$ƒ}‘o·É½ìäX{­c?&Çؾ“cò~RĬäv°‹ywÒ÷RŽ@ùÔ´ÚƒÆ`5÷GÕQk׋WÖI%0–ê‘PCi4âKˆ+MA/Ç@ôt C¬c4b嘆HGº;ráX/us씇¥°ÒëRغv)´XH¡k…üœ­ô}/²q ©;“z“8¢Žåxøû@ÿM€i3_ôpz"©G¸3Ý*£ViDhe
-B*"¸r8‚*Ç¢kÕ$T͆UüªŠá[U}•ºÊVè·<„¾B@_.¤ç”S}·YÔžÃqp
-5ÇQod%0¨0o¥þ6 r'ÌùÔ·î%è\:­+’àã2“Aðv€—k<]SááÊ„ÆeƒÊUe]#9Kî@UûêÝâŒ{!ãm¥ßéôyê`<5ßäX:xõkƒ‹þ7
-µfRg>u–  Ëp6êQ§”)ÙÈõ\s;SU[ŒÅwh¦W˜Âp•ÿ}•«´’+\îDøë ôZÆÂBÓ…9 à×îÄH^!¿£æêM¤?Ó¨3›ÑÍÄmæä&–SÇŽXC56síjnŸÝ¸ÈX|£8¯ð%­:ÇU¾àj-äÌ ˆ@oÚáÁX¨ ´^ÞzÚÂXH±Œo2ýLÍ7¨7ŽZ“©3¶ÏåñX€ ȦÂ
-êä󸮥F5*pš±hf,NÂc<ÌGiéaæãõþ& ¸ÿUÓnOâG;ôŒ‡Ö<#pW€
- .+†â¢âmœW¾ƒsÊ)hQÍÀçªpJµ'T98¦ÊÅQu«KpH½nu5šÔuد9€½§±Çó:½ÚPï#à"uOÑ
-Ôv"©ÚA;öý®*< ·µhõŠÄ?½’pÖ{
-p’-/ XbEwõ(àKËeë‹Á*\Ðyã¬>'üâðY@*šº¾Ž½o¢1ð¨zuAS±;hv§cGðbl ^†š;ªCŠQ² ÎÐT„6`sØQl
-»„²n?JŽp!•’’!­û "–¥¬'õ,ƒ½YÊù<Å÷ã8æ‡}á‘hˆHBm÷þØÑcj"G£:r<œQ“QõÊ£>Ħ¨ lˆZŠ¿D­ÀúèB©4z½T픊£ë¤51n©(æ¼T{G²÷²ä‘UHOicÙ{ø†WÞé¾À‘T^o}Økd4Æh±»g7ÔÄPßåñiØh‰2ÃX8 PbxņéÒÃiuB¦T˜#å'äI¶„b9/a³¼2a‡¼"aŸ¼ÜxFñqâ-ENâcEv¢³:YÚÉ=–ÓkÔ=ןóÖ@Î|¤áU –×߶Þ^pöĦ¤X¬ïcBIŸXc†Õ¦QÈ7ƒÍ4QZeú³”kš!­0}$-3-–­¦år¶©P‘e*S,1mU,65*šN*$ßPf˜)ç›…"ýîšêŸJ£ÿC€Æ¡ìqùs5¿•§¨±>ÅÅ}{`µ%v‹«,iȵŒÄ2ËÉj/e[&IK-ÓäÅ–å…– y%[‘a±)Ó-%Êy§j®Å¥úÑeÕy†ñçÞ™{D ŠK] ¢qÁD–pFf`¹âf–Ù•ÀD
-5.ŒKãq-5zŒX›˜TkÔÚÄœ4§mz‚5m<96ij4IÛ“dú
-«õq¥¾Jôé4uúç4µú´Õú]R•þìÕŸ–+ oê–zÈWryjH"Ú> ý|Âzßeí—mìA6³G#¼îËäŒÉulI„–…£ð¼1kLsÐlJF£É„U&›à3-ꌡÖX,V—‹UÆZM¥±I[aÜ(•wÈc»Îm<©+1¾Vlú y¨+6…ä"SH"Úâø?ñ7©w‰Úgø‰íÌ:xÝÃu¼H?6š#°Æ<Mæ‰Xm‰Eƒ%õ–4ÔX2„EðZò„
-‹S,7{Ä2ó
-Û¼Z[b~^*6o“]æýºBó‰°e–Ka–?’º‚ŒL¤KÚ^þÊZ¯eÝÔ}%Ÿs¾ƒ™“4¨Ž…k¬ah´EƒíIÔÙ¦¡Ú‡*›¶t”Û²m©Pj+Kl¥b‘Í«qÙ´…ÖµRu‹l·îÕåÛ:ÃòlÃsmï…«¶/ÂÔ¬œkëCzÌÜ¿åÈužú]˸9Š¾D¶q-ë¹®Æl-ê³#Q£Œ…W™‚
-eÊ”$¸#J”L¡HY"8»X¨‰Êr]©×æ+~)WÙ$/U~®ËQŽ‡)Ê…pEy'<[ùœ÷!‘‰ô˜Û܃—YóÙöÁżÅ1t7Ùìžãº|üÛŠ¥ƒQ¡ŽB™Ru&ŠÕ¸ÔTª¡@Íjž¯:Å\µL£ª5ÚµIRÔ€¼XÝ­ËR…YÕóäVx¦úO^¿×YÕL¤Çܢߗ¨ušúÇJÙû@¼o¤/ÕìK¹} Jí#PdŸ§c:–9âápè‘ïHGž#KPªãX&.q¸5ÙŽš,G£Öjo‘2ì;uûÙq.,Ýq3l‘ã>¯ßÉéöP/’ùÞÎá^ ÖÉà0GOÆ4l¯ä^\NèG×Vâ G¡3
-ÎñÈw>ƒ<×\¨®$丌Xâʲ]9Âb—C´¹JÄL—Wcq­Ò¦»6H&g›ltÒ¥¹^Õ¥º®“Ou©Îoå4gH꣰Ÿ+y|'‹˜{©ßáåûÀX²…¬[Ôrz²¬TB^i$ÔÒ1ÈqO‚➉ŞdyRaõXéÉ,ž|!ÝS$.òTˆFOƒ&ͽNkpo—RÜr²ûŒœä¹FîÉIîÿII¥¡>’KBÚ^Þ gŽSÿ@-ûÀH þz¸Š¹“¾dW BVåHX+' Ã; ï<˜½)XTe‚©Ê†…UªVU(¼ebŠ·NLò®Ñ,ðnÕÎ÷ÔÆ{OKqÞ«ä)®ò¿Ú¸Ê6®â'.ÒïSÔ8\Ç>¬âûÀ8²4’Ê•Ì] Ì\¥n
-ê¨ÓDíÔhÃîÉ9ÆçYþÎÐ’Sœ¡G|ŒÒkwql˜Œ£Cyœe¥ç䑯›ÆãžäŽo$Oü^17Á¸æ Ã‡xô ³âÒ°,\pÌÇ9Çbœu,Ç™áU85|zœ6ã„S Ž9íG÷ˆ#èqGF^ÁáQß Ãù1Ú]Þâ  sÔhž¤!È“¨ÏëíŸÓxå»|¿ã!â+ÆÈ‘ãpÕy~ãâ‡ó.áè­Ç)×DœpMÃ1×lt»-C—[ :ÝÖà·jt¸mD»û6toÃ÷O°Ïã$öxô¡mÌ´Ž}„–qo°c<óÙ6„WL7OfRß›Ú
-]Ó& Ãs6L÷ÃÞ*ìšgš°sf2¶Ï´a«×R4{b“Wš¼*ÑèU†Y[Q?kP7«S¨Ý+¬Ÿ}]¨žs_¨šó\¨ð–…uÿÃS^ë÷¨}‹)æ³Öù¼ZO.º˜†;¼±Žv{{bçûs±í%š}4hò1 Ñ' >VlðÍD­oj|‹Pí[Ž*ßõB¥o“°Î·UX3÷P>·G\=÷ªX6rÞbé|Y,y‡P<È÷\÷¨{-œ©]Í~‹t…±¾S²ï\ `ç<Wl™?Mz£a?êüT¨ñÓ¡Úψ*? *üÒ±Ö/å~Âj¿R¡Ì¯B(õoJüwˆEþÅþÇÅå}bAÀ]iYàb~ <@ÞÏÈâ}®ù6õ/G±çdÊï&‡8ÞÃo;蛦
-1Y·V´èê%³n§” ëPÄGŸQ˜¢o(⢒×D–ú1 r›åç§qÀ)jw²üÛgeÍg#ß«ø½”v,vFîâqX¢ŸŽL½lú
-©G¡5]SDŧˆ2½äX–ˆ{ÇŒƒsI,ý©ßβoWÐLj9.£]ù´ÃžàˆÔ7¤$L†%aç#!1¦ÄpÄ%ê`4kN‚Álôæ<!Ú\*jÍÕb”¹YÒ˜÷KjË E„åsE¸å>y!E˜å_H”¥«Ü÷^ú¿‹šXòµäò<’jŽ‹éú#5Y‚%Ù É`JžcŠ/bS`H …Þ…ÅÖD[ÍÐZÓ…(ëRAc-"¬Ub¸u“¨²î•B­Ç¤Ô+Rpê·R°õ9‘¥”_èã¾÷PëpûÞ|Þ l6’
-Ž iG}’dcÍ>
-1éc ÏxÑÞÐÙ@k[„H›Ûb¨íñˆ°[fÏBí+„û:q‘ý#1ÈÞ&.´•í—¥€Ì{R€ý™h“Å2Þq‘ë<–Í3IÍÝ+Øs±¨#kþËv™Ç×x¦aø>ÇY›=–Dö…lvBP&-~˜¶ª´Ú,È"d“’åˆ%‘ÄžåXƒÄVjI ¥5bÔ´Æc´1ÓZÚi«CƒªvZ3ß\‘Ìoü1\rç{ïçyÞ÷{Þçæólb™>Kz »4&ÞVqñ.ß]#‚4"!RÃhXâ0Å&>§¡‰“øŠ'ÎÔÀÄdӀĦ~‰ËM}’ªÌ½“ö˜£“Þ5G%]3G%>4G%æèVâÛhdö ³e®T‘Á>`
- 3“³8ßE<ˆgTJÅ&;iHŠ§bRü48%LSûh@jŒú§ŽT¿´±ê›6Q}Ò¦+:m–¢Ò²‘¶ÄÔ+­ÂÔ3m—),í„)tîUShêShŠñ„°dÃÜÊAr¬Cc#º«±†Ë°
-ÏŽSÏì
-Ë™¢ÐœçÌSPŽE9kåŸS+¿œcò͹,ßìûòÍ2L¾™†É/£·R¹ŸX¿ݲ|Þ‡B¼§…}€©0ß ƒ±ŒÑf…8*¤À]AÞ
-, V@a¤ü ÂùZƨ‡e¢|,3ämIU7Ë"uµ¬”—e›<-ò°\”Ga‹<ó™XóÚð‚Ô|Ó"i z˗З–QƒbjP"M‚1+¤Xè aà·ÂFÝJÔµÔC]J}äU"ϲ(y” ’{ÙH¹•—kù«r)O’syŽž)/‘SÙf9–’CÙy9”~#Ç’Çr*az.nc[5(¢XÒÅhda “Vñ>®‘ÆcËF®g øWàA+%×êŽr²:ÉÑê!«„ÈÞ-;kŒl­qêl}Q­3dcMW‡êÅ2UóP¦¶
-#[yðº†LëÛØ@î«Ñ^¾RÊE7­_Wá?7Hq›ØƒÍRÄ)`+ú5èo—kÍêTg/S·Î |!°Žadg,ŒÉ@£©ãPÕ‘XÖâuw\ êöŸÁxº2îèÕìÚs­ìš/£õü)k¹S
-Ü>i¸ì“Þ–lâoaHa1Œî~R=Ci}_šCP ¸æÛÀo Ðõ,^ÏÇÏÁ×<÷OXI½-äAÎ ÛèGhŽFoz‘<€^—Ã’s£dwT2GÿÝvNÇIâ8EïaÞg0?Ý:Ç™g
-šhrMÙ@-šH¬‰Î| -ðßý·Š/‹:'‘ó´Ç†Ö£¦?¥ó<!9¡×‰­ÄÐsÃÐçá÷ð¡ô‘½ôŒÒE Ó%o†Ãé*q|Â`ø N3 ¨™—®™sѼšà&°'͵€ÜgSë×Èy\ïÀ1)êôOI§Ùû³Ô¾UóC¸l'F h†¿Â§pšÜĨ}Þj”0,·ØïÇ]†´o9-4^ºW B-ìI ¶|¡rŸvˆw€œ‡Ÿ¤ ë‡®;y:\ ö—XÿJ»Þgp þ_ÛªÛp¾…{fé­ô=5ù‘³úãb0´ )ÆT ¥@âÅ63Îá8=À½/ð0qðL‡Y0r¡–C9¬+l…°Žànß׿(ÜÏûO=Òüõ‡§¸wàv«çÅWrnÇ¥=Ž è #`<L7 2a!ë/Öcë'­Dc=PÚ¦ïµ[uPts”ç3ÝåÓ?ˆê›vÍV¾‚ÏáFk œø×ìÁÜÀ"`<ÏÓÉg::Ih¤é;e뾩EEh”Ï*Ö¯`íM¬½ƒÌßbýFݤ×u‰ãr[׈´™Õ>†¿<Å•Ölíd˜løÔlÛëÑÍjÖŸœž%§ñhMFg&³õ…Ò9ÙäG–Eúq\#Ž«ªdÍÍú“êôGÐç(À+tƒŠ|Ç+e¨éÿ`؛؎†Ô‡=ßvEÓÍHr‚Þsh½@¯¢ñ:sØét4²ÑÈC£ÕjQµN«Fïi-¤9­c<u”j5’Y#
- íÔ·cÐbŒŽz‹¼;«#‘w!·`ý™sqQÃÑ‹ÎDâžÊªo 1G'‰ãâ8N¿!Ž#ZÁÚkuX9µz›Zìã{õ§äKíB¡õÔÖAíS´üŸy­[œx݈ç:¯Ö5ud]hA>äÖ‹]DN£Èg:“Й¦CŠGaoA:»ŸƒN:KÑ(gÝJm§5¦½Úb>ªÍÎi£Í-mèøPÕ UÙª|ŠÇ´”û´ÚÊU¸Àçˆël';êà®c¿ðWCÇ(ì<Dûlã´Çv‚vÚ½¢Z»éÚn¯ûdm±Ÿ§Íö ´Ñ¡PV‡bU;¬U¥Ã&­wÜ­uŽZãø;­rº¥rçG*u6´ÂÅPÉS<B÷+®›«´µóÁ´ü
-×éZçš µnÉZí6_+ÝÞT¹[‘JÝËUâ^­bZ-ó8¬¥ž¿U‘ק²ty¨‚®†òÛÉk§ÅŸVÛ“Vɵ׈`ÎæÚÙë×z-wV§›6zù«²k¤Öu¬ÕÝFª¼ûX•vQ%ݧh¹÷ -óNÔïT-öÎ’Å'_>ÅÊï±N‹zÔèMßýÊõ=©~W”íO™þ†2Àÿ|Íu{¹7WØ
-h- ZåE%¼Hy!„@$
-6¤g¡-=­é…X—aÁÚŒ
-¬ÎpŸQ¦ ?|™mX•¹ ™Ï
-oæ^áÉ:"ÜY§Dâ’X©ø\Ôfß!’¨U<ຒ¶ƒš§‹X´`ƒd?¯¹|ÖÍÜlΞˆö¬H´) E±k³Ó°:;Í9:ørLhÌ)GCN¼9uðäúàÎ]‡ºÜQ›Û-\Ê°¨QŠjåIY•ê¢Ì¡úTæP/*ITÇ80Œ´TfÚ?Ú¯>²§ØÎ8žb팣E5ªyhV-†O½ jêÕùð¨ Q§¶`ež®<œy ¨É[ƒêüváÈß&*ów »¦_Ø4#2«ö]Y¹ö&ùŽHâ4c¼O79÷‘rZM;ë ‚—ìƱ™¹ ð½_3š9ðjâáÖ&c¥6.­N­Õ:ªtåpèªQ©÷À®÷æ_/¬ú'EYÁQZÐ'³ Ë̆wd%†ä["ÝG”Œñ+æà õ†¨?XÅu ;i¿ºøÿ& }6ó±Ê0î‚(ÔÓ°Õ9†lT4°
-a+,…µ°åÆ•(5ú`1„¹h‹(.z^˜ŠÉŠLC2£iTVhú#ù†H÷…Ec¼[LÛËy¿Bí~'°×ÅZ$[«ésùÜÏ8ܦIpšf¡Êƒ
-ÓbØLËa5e¡¬XÒâXŠÍ0—ØQRâBqÉ*™[`4…Áüœ(0zËOd:Ëy™¶ôc™Öò/"É´fIèÆ¥ÆÉJžGÔ=L+ÞëžsÓë×Òë3ŒÃY&Pa‰€Õò0ÊJÂRš si:ŠK•0•éPTf‚±ÌŠÂòʽЗ?]y‡ÐXŸùÖ}"Ïz\¨loÉT¶È×Be•Æ(—„š¼me-Ðr¡þA/°{"Áz`-ãòò]c,³M‡Ùb{,ŠìKQhO…Áž‚Š|è+ŒÐU”A[Y…üJò*WC]Ù¥£[ä:öŠlÇ1¡pœYU×D–ã+~–„¢òg9þíæ Û€}M¬Úð.¶G}\ÆáfN*KqõC0TGB_]Í"hj–!¿&y5*¨P9ÍP:+ëZ‰lW3® Ètu‰ W¯H«=*äµgDjíUòO!wIBî§F¯³Žsþ/QwÏZîÉÇ€'Ɇ5ìyøÌÕ0½(ôÈ_µ{”î8云í‘CáÉA–G‹L õV¤×;‘V߈Ôú
-ìbc¸ë'.ýÀ¾.þ¡v7u7RÇj÷ð<xÐï€dú‡¨ßL{‰}h?Ío?pÿl²€ÐÐø Ð ð’àÁ3À‚`!õ3¹ý „½nÕÃßÆpHBÏó̵ƒ½\ƒ}¬C~ÕFÃ
-€Ÿ’¡‰daCŒãã8Á8†ÇMÑ/¢´#<hFXHÃLà0¾ÀïÝàoþMî /ðÕœs+µ½ý<^f ð«9ÔZF­ø!®ÿ0ñ0ùgÔ~œù?lJÎ2çǛфùmÔóŒãÉ(/£Qp£Üä£ÌÅèaÂAF¯ðý„Íù{ØÊ|¯gn©í8˜N°_¥þIêŸfs gœ&¼EMNÍÍç8É/É%6I¿f“ò›‚ËsÙ Ð_e¿¡»ÆKùÜëÜø×Y`×9ÁÏ“É—ä[´3çM?j8ßbêªNSÿ,ëšÑÔœöóq-.#›à²bÄñÈGäwä÷2à“)À æä&×æÓ8àoËMÒ-^|·x~ÁÍw›“¾Íº¸ÍIüý·ä3ø™s™©GÝåÔûÅùM}c_×üð¾ùù3¹IþB>#%L-[Jଓ¯¦ßpm¾c£r‡ù¸«î±6îñ0”¸%&^ââJïËìö¢I$‰"³É|’Hÿ£ºLÀš¾Ï8þxË¥^È©œI @’„@
-WÈ›O!ŒÂSÀ\ÇQs2s fN±ÔKÆŸ¸/~læQ@RfV_ÑÇ»ôñ×e€ëò}ôÓÇ›èáN؃>®É%œ¦‹×q®Î±Rg¹r§©rŠœaðgaô°ö¿·ôÈ¿oj²^Ô“2Ÿ4j™˜‹…ŒZŠ×èã}\¤ ôqŽ>ÎÐÇ)tâvpgîÇÏp/ó/^â·_ÄŸYop€jûGØ7‚0Žú¼êîò8ÝâÕû=]ÇæèOÍ™xÑÔ“3’ç‘I<î87+]J…j®übfÜ@Fê´Rcãnã)Ù͇¹CÎòÔ\ÁvîV¸›{³kð4‰žðWÊßy”? äõC~9èç•wyÔDîì)ŒBÍ8ê%3¢Ž§/ DìåÆÞQ¥ØíU^µèõjÀöÑMè½]c:°uÌtŽ=ˆŽ±'±yÜe´ÿ›&ÞÃÆIÑæ-`ÃS< îm^i¿æõ:À«¾?_˜Æ× ¯Ýã|px\LˆÄÞ‰R윤B¯·=ÞVtù8°ÕǃNŸ2tøTã9Ÿ%h÷]g}›±Ñw6øvcß>´úG‹šý¯cíäûhš" ‘¬xÂ^Q¼Žy­ö‘³1À±H௸}^ØåçÿYØ:9?"Çæ
-ž™•Ž5Áf4ç`Up>VÌ.ÆòÙX6»õ!ËQÒŒ%!íXº5¡‡°0ì<„_Euøg¨Šx„ÊáG|L½w’ø
-æ«öd*g>÷° éIàÌÇšl–°)X>«#¢±"B††ÈTÔGP™…ÚÈ\,žSˆEsæaáœjTÏ­CÕÜFTÎmCyTæG@YôÌ‹ ·QûoÇ
-Oˆá}Åö«ŸÚØ‚Õ±Õ!½|Õu² iKdŸç…•Q~X=u1‘¨cQl2ÆjPkDeœ qNÌó ,®¥ñ‹Q¿Å⟠H¼nÉ (”œDô
-ò¥ŸÂ•ðà’>áµ.SÿLç ¶>{H·h§%°’kS'öF$ $¡¨”Æ \*C™4¥ z”$d¢(ÁOB܉¥(L\€|Ù2¸dÍpÊ:àïF®ü8ìŠ7`Oú9IßaÅ0ï²Íx•ú'29g°ÝI¶°ýiãgkè­ž>È' B>eò`”Èç¢H![‘ŒB…ùIF¸’lp&9áH*F^r%ìÉK‘“²Ù)í°)w"KyUŸÈ¢ú(Sõ€ƒ`¥€¾Únæ:ظv`é`볎>VÑG-}”+Ç¢$Ååt(#àRÆÁ¡”#O•
-»J•Ùª\ØRÝ°¦–#+­–´F˜ÕϤî…QsD”¡yUdÐÞ _AdÐü
-»:ÙêX5)°h´Ä„Lm6ÌÚ˜ÒKaL¯A†nôº6ètÛ‘®? ­þ’Hc¸NþA‘F?ŒV'ˆ.³§©÷µw°ý/äÌÉçZþ¾”õ¨d=Üô‘§÷FŽ.
-}†ºŒ¤Bk\µq=ÒLÝH5‚Ê|Q¤4@îA¤4 "Õ F¯±'˜÷Aj?ÏxK1Ï#ŸMQóó2úËÏâÌgž€LÓd˜L3aŠ€Á Y†t³
-Z³šL Ô™yH³!ÕRUÖ2¤dµ"9k’¬¡°^€Üú>dÖ{|~y–0„‚¼BcÌ{?µwp$é(ã^ «J¸ô5ÏÅ™ë”i½ÕéÖ h­!PÛ¢f“"Õ– U¶ÊlR²íHÊqC‘SyÎRÈìÍH´oÔ¾’Üsç¾GîBlÿ$v’œaÎ3×#Ì{/u»+9ïTq/𹼜ýþ<ö»ü¿\z1:EPçyC•€”¼YH΋D’#
-‡rGdŽ $:m:ó!q•AìªE¼k-b]ˆÉÑùg••|A#Ú% Ú9ÌiÆ?ÄüwQ{Û"î…î>ë9*VÐK!G½èè%Ù=²B$º§Aê…Ä ±;ñžÄyÒë± Æã@TQ æÕ`NQ#"‹7#¼xŠO!´ømò9B‹!¬H@˜‡+9Κ ~/µ;9­_
-4’ÿs]æQQXWþe‘u
-œdά<Ȇ3D¾Ü$­ºÍ­lÀ×J´—aÛb“²WS×2®—m”zAWÚ„þfô_•œ0'»Ðxn¡é³ÓÚií]¡'Ð Ø)ôvba'©ílî–uPC!d Ý|îRš[Y¿å¯pÐÍÝÀ 1þ5Îâ6©Ïv)–ñ4˜0úì”ÜwIw£ÿ¨v
-´Ôe¾J]¬*éT¡âN›´Ðu·¸þA·2»_T‘Ç=z6kÞ\F·‘«ÿÝXôá·”×Ýaôw”Ú͆§´ÎÍSUnþZå¥=´Ì£Ÿ¬žƒUê9R%žã´Ø3E‹¼¦i—IÙ …*4,Ö\ÃJ½hX¯|ïÊó~C9>Ç5Çç¢fûÞSvçæVfµsÍ÷¸¾¸öpåîN”¶ÆÓ_FÑŠp®ôuQ™·–ø„¨Ø7N :÷’¥s’Šº<§y]Fin—ñ*ðKUžßtåúeiŽ_¾fûÏ×,ÿeÊ
-X­Œ€m2îWzà»J:§Áw4#„Š÷Ÿ ÿ^o®c®–Z ×Ÿ¡­à½­»´‚R¿$´ƒxª(0@sƒ¢”Ü]¹Á}5'd f‡ Ó¬ÐÑÊ MVFèTCÓ•6[3Ã
-5=|‰¦…Wê…»¦FÔjJäQ¥F~¦ÉQ·59º¹¨6>Ä÷£h@ h;ì™3¸bʹvK‰É|ö§ Â]9¾ÊŽ UVd¬2¢ž–1ª¿fF ÖŒèš=ViÑ)š=MSºf)µkRbŠ5)¦\c7+9®ZããŽh|ü‹¿©qÝšyþ…÷ñ»Ý}´;†ƒ¡Ä`síØ¢¾ô—¬#;ÎE¦Xo¥Çjz\”Òâºkj|M‰V“ã‡*%~”&u› änS5¡›Qãr5.aÆt_®ÑÝ7èW=öhTbF&6jdÏѳ¹•‘‰mû/×åu™Æñ¯—T@T@Så¢Èý2à 0 È]`H°ä²¨1¨ `yä ^ÖK$ëZf*h¹YÞ)=æZֶɶ—vÝ:¶µk%Ö´Ü“›®Š¥³Ÿ€ÝãÙ?>ç÷ƒ™yžç}žç}ßçËšá£ÆŽLô¬ã}%q4Çbb\9\ö0Í ó‘-Ü_EáÓU¥‚ˆåG$+7ªœˆ\eGÚ”Y®ÙQ5ÊŒª—5ºEéÑíJ‹éTjl·,±ïÉ÷5ÜãÝù?N“ÿÃøÜ›Er˜±a #ÇŠ æ+âø q”‡-z´
-£Ç)?z²r£ƒ”¦¬˜XÍŽ1*#&UÖØ,¥Ç*-ήԸjYâ—Ê¿R)†ÍJNØ¥¤„£2%öȘx~àÝ)SÂ
-·nW˜õ€fZßVhÆ<û€))}€#ä`/ëߎïö2z¡œ3–•2ëG)ù) NVb5Y]•`õR¼u‚⬊͘®˜Œ(Eg$(*3E™³žY¨°Ùeš9»F¡YË5#kB²žQpöË
-Ê>£Àì‹<o)8ËÙO(ä^`ÝÛð»yçR…Ô̳Ž1¸ÂμËgyĘJ® ¹#ã¡ÈoEäLQxNÂrÃ437N3r“4=Ϫ¼|çÍSP~µóë55¿U¿ÁKò+8­)s>åyS~ùNùC@žSûKèüoÅ÷ÆÞ–t/ÏÚ*zXlȤ,bI&–XÛPÍ,­é…cR4QÁE
-*š¡À¢(M+NÔÔâTçÈÏV¢)¶
-M¶-Õƒ%«4±¤CJöɧ䔼K>áyC¾6§&35‹äÿ¹JzY¸îQÎ…Zz-¦ˆ§€XÒ‰oyaë+Ø>J¥ò+¯)¥“5Ù¨Iö0=hÓD{²&Ø3åSV$ï²ù_V«qåOjly»¼Ê÷ʳü¤<ÊÏ˳ì:8åe  ûÏ,â\¨ã~Zʹ€4\öS©š÷¹H£lâ2óy1†’Ÿ€ª!šPé&ïJO¯ôÕ¸J?­ HyU%ʳ*UcªòäQe—{Õ"®n’[õF¹Ví–KÕ«UõøF.•wåZá”ìÄþVümh È ÆFÎ…Ç©ï…ËéÅzr@LÄ´ýI¬ãê†ËÃ1Zí˜(7ÇT¹:BåâˆÕ(G²FÖeéº ¯«ÒÐ: ;л¥ñXÛ_ÁméQg?Ûñߎ¿µÍÔáI©~%g#Ìã=Ržb«Óù|J“ä cš†Ê¥ÉUÛйMÞÀÒÄÐ\€\<l¨F
-ØHà-4Âöñ—9xp!Ì–ßbhpj+ëÞˆ¯V¾ÖÔJx«¥ùmÒH25”§?ÿ÷F¹ÂÐ5  m [m €m¾ÀàÓÆ%ÛÆEÜÆ%ØÆfn£‘WSÄÕ,b5:³õ.Ã_B±å†´ÊÙO;òo-¶W’®eë9›7°6q&m–ŒOIá0|Á3.Oã ƒoúv‹ 0€naí`ðêð‡ .þ×6tÇ#|NA·¬“žÞ¯‘øs4à5ƒ{àÔ|·âw9>kð1¯ƒ>$mIÈÒÈg¥ià»üSÎQ;ð½vÿâØM»ÉG'ùè$]ÄÑÊ0ÂP´‡‹`ÏC@ÓuQàN wäûôÄî+
-}àÔ|7²¶Å[Ù‹øËÃO
-áFwJ]øß#y‘ûðùPR¸ƒˆƒƒÔåúaô#> eÔ¥›8º º¹tºÙÔÝ4v7‹íÆà1êq”zýîjÅÏiW|?ü<g>-/Òƒø
-ÜÿWðOØÁ×1xNÀÉA^‡S€I½ANÞ$'g¨ÍÛãR‰ã,áY†ƒú³§h¼žmÀþèyÏþ×µ„u/`Í…¬35Æb¥ÿº%÷ãÒ°“ƒ>ÞZ™ÀïÁ Ò…Á\âèOpn„ô!µùp8>cûœá"5éec÷Ò½,¶ý†KªÜK²f+¡Å³Î`ÖéËÚÜ߆¼…ÍßÀoá÷ÀOô!|…¿Áøz-§Kp…ú\uCÀÑ«×é É7Rn±Wosøܦ©ûHv‰¼ý;”–;¸ âãÀÂÁ™PeP h€fhµ(ÈMº‹²ûEyEÖ‡¾»…¶º‰bü7:󺮢gïéßþ‘Kp>€÷û5ïHCaxÂ$˜q`\,<¤ïÑu}èÜ[ªÃörl¯ÐwÄq8¾%Ž¢þ®¢Ì¾F^F)^Bg~I¿ AùÕgXú>?ÂYøu º!ƒyñaMÓðÉZŒøÊÄÇì—êŠ`{!¶—`{9¶›)E ¶×êïhÌQ»çÙÀh¥;Ê:ÏÐ.çi›o‰fÀï»p^‡ÿ'Ѻ7/}£ÉúJ3ðG©ÍøÈÆ~1í`×9UÐ~ YKmÒ@k6Ó¢?ªÚµzGOѺÛðÑ©ÓläSäâ$ß8Aä¯Q©n<ä¼r_ wà_pYÃX›;þ|ôrñ¾"ð“ˆ4ìçê-ÙØ"el•
-Ö±ûì×c¿ û«Xù:V;•ØŽý½tÆý’ˆ^Àâ*×…·ÎûØ5·ëhíú·š 9óÂß$Ö‚Ÿ— V,æa߆};öplÕõZ|Ô㣠»-Ø]¯çéÑç¨É³|k¹øÓÕÓæyF„;lÌݘ؀±m°°¹Ù@°an_€L áb ’
-Û»þï3>wi‹·J>EOOUE79¼äð“£›}¸Ž!\£Ž+Ôq‰~¹€FÆ6¶øeƒÿõ­³Êè;K ¯0š—Éûÿø"ŽWœ©íÒ½÷€×úMêy…÷åÞ‘ÛÈ`¤ç‘ËHžRžÅÅsxx/YÚ±É8]§Ž§¨c•~9ËøXÆze TtšŠç™ÔOÒ¢³ø„QüB|„éÇøŒ¥æc–š29w¯²xzž£¶°8ž-™çRðLò˜ÉSγ¸hqy¼äi'Ooi=ÄlØfÂf1¾ŒÉðsß÷ Æö½„cï`4ò!F¢?Çјop4VÄðcü:‹öW»y,=Äó|¾¡`oÅ”>1 ëѬD¤`1*§£u˜‹±`6ÆŽ™ØjLÅzŠóa"Îñ¸nÀhüFâ§0œpC L¸ŽÃ’{ì¢_ò‡ÿŒCI"éÿð±šå†%ÿM–—{ÄM–»«l‰¶˜bŸdK° ‹ÄII¦%é˜LTc,QcI%‘:0,­APÚ€!i ŽH;0 ëE¿l‡dcdsèI^EwòUtÊïâ ümä¿DGÊçð§Šð§‰{+ñ3òïšè¶wˆëLíçYfV €3Ô7C;Éã1"—#˜’#) ¤¡/Õ†C©•ÒêГքî´6t¦wâ`z?:ÒGàϘÁ÷2–Ñ–y­YwàËz ^Åω?¡9ûBü’ï¾ x±œ6`¹¿ÌuƒïKlÉfi“qú'˜þL)„¬ ô(ÔèRâ Â‚@v9üÙN´g»Ñ¦ô¢UéG‹²Þœ!4çLâÀþE4î?‡Õ-xÔoÀ­þ êsÿ@ü‡¿Ãyö×Éý<ËüŽ‹m–“6¨à¼Ç6(dᜡgmÏG—J‚€*í*%ÚÔ´ªð©­ðæVà@n šrјۊ†¼.¸ó£> uù§Q«ÙDµö\Ú×à,øø NÝ¿‘Ï{x—mð«ä½Íÿt°M¬°œc[:ÎoƒÔÑCíšx´hdðj2q@£F£VÖ ·¶ õZ'ê
-ܨ-ð¢Z€K×gá1TΡR¿‡avÃ+(7~@üŽøšÁN<à™_&ÿ-7p…%~ƒXâó îRÇ
-c;E즣(3@©y6óuX-/£Äò>Š‹Kü%Å"ßY™‰û´ÿ=rÞ`Ûw©™ó±p€s†¦:üÔÑT:“Õ&9œ&*M¹p˜ a7›Qn.C™Å…RKlÅm°÷ ¤$ˆâ’iX¬ga¶]ƒÉöŒ¥ïŸGQ©ˆ"›È}op¹Kþcmß*qš-ù$µ RG7u´2V<ŒU§5« åÖ ”Y÷ÃfÕÂj-B‰Í†b[,¥n˜K}0•u¢¨lÆò åËÐÛ¯@g¿‡Ç uü†ëWÐ9Dî‰($^#Ï/c¡­¾Ÿ£H0Ïuœï´G'}ãcŒÔ1fìöØìI(±§¢Ø®„Ùž“Ý€"G Œ µÐW4£°2
-ª& ©ZB¾óòœw‘ë|j×'Äßø,r¨ñò<G¾«äÞêäÔÅ^Ÿëq¾÷q¿ƒöi¦j诲šH˜9å08³ w©QèÒAç2£ÀUmu5ò«›WãGnMԵǡª=ƒœÚ PÖ}Ùu ¨ûñW>‹PÖŠü&âEÚý&ù.wëã‘mç ×¾ l…Ûi“&úÇIßX9¾éëã¡­—BSŸ†üúä¹5Èu¡vÛ òT!ÇãÒÓ†ì†^(F‘Ùp
-ÛHo¼´Æ"¥é!R¿ä³ˆô†=Ü%Çù.p$[;ÌÜx„ñÈu¸Ÿw’£I¿¹©Åј©E낪99Ír(›³Ý¬†Â«C–ׂL¯éÞ:¤ù|Hõu!Å7 yËI$·lBÖr Ò–ûHlýI-_ðY„Ì·‡Û´ýÓä?7¸7žÎs,› †‚Œêi¦–jÚ¥”Z ôQn Yþ8¤ù¥Hõ§!ů„ÜŸd¿2¿pAÚÑ„¤Ž
- Bâ â„
-D íˆú!L`Ÿ°‚0ó•À!Jà Ôû{âëe7ß#b‡ɽ6ɼ0ÅX˜a,LÓ|öq¯†zJù] PSSm$;†„á8D'!b8û‚
-„¿-,F‚I>È d0éÌ ÿ1Èy7ȹfˆÃÜÐ{¼ôœ5¿"ØIq[ä\9 œš§N‡¹úç€î98™ˆ<jËâß%"j:†Ã™nŠ³Ô› ‹}H»WdBLl!pˆâ!Cü¡Émþ8ç݉]^|v­cœwÇÄG¸x‚¹‘¼K”zb‰±øóá%\D ¡å~ö" '$Dß± ,²ñ[L"8[.² [d±_d±]dá] -Ä tàBˆÁ¾FÜdä {Šƒéü—,Jœ&æDla,.sûIJZeNàHڶΜ´Al…\•D
-!á{Ôù·ã¿\— TÔçÅ/Š ²"‹ ;à Ãà û&Š
-
-AWŒ¸¤F&Ö%I£AbŒq\«—¨±±ZkÔ˜ØU“Ø$­K›xHjcb”šX›NÂÔ¦9œ{þÃ,ïÞ·|ï{¯ý¶Á £ +#
-0ÁÒòÿØÍr°‡úØC}ìeHn ìN÷sáîçB:@<@Aï_Æ €á}GÁ{||´>Ð|¸§á_%~ ‡/ .Ë) ._ì»ï‘\Zá!„,8 ]àu'0ÅòÃB
-Û°]‡íx:Û ðk %´ß^ÖÏi opÂtDoq¤>!;ßp¼(cv;Áöïiø¸ ®w”™|¾ú-±8¯8,ØáÈÆ~>^À‡rlWa»†©Ø¯Çþ°¿@­Zª=ZAÛXÇf8Zµ•_m&:-D´¶`ƒkÁwp~ >s–÷…ŽãÖŸzãK?¸"à‰'f)XËÁ~v¡cñØN^¶©F[4E›ÐÑ‚Ž&tlÐ2­£™¯!'«ùæ*,4±2ù"Ñ^ï÷qÎ6çQ{œr¶›×¨‹½ê_\1øa…#b¹€P Gcᨆc2¬õpÌÁîÓœ”çõŸ.EÝÔÿ˜(>£©œ;ÀÒÿáFø¹vÎÑfó|ö¤únüÚ Ÿüá3a#<àH‡#Ž8Šñ¸ ž
--FÇ"t<C},Ô\=Å;ó:­':»4›†:“ìÎàÕSõõpÿWh«çýàïËÞéϾÃ8°™Ö²m¯Ð;VÊ›jï§gŽ?&xlx™Žþ\ÍGÇ\t<©QðTÀS£YÔÇ ^MçÓˆÅT¢5™ŒMÒ!ªøm*èSÕº|«š.ŽG¸H;=Õ_:Æõò)DZËHÒÈÕóâ²ÄÕÎ>ðÃ)¶Ír±k†K†¦wÉÕ´®ªëZ¬)®ešìZ©‰®TÛmºjºÍÕøîKUÕ}•*{lVEσÓó¬F»]W¹û=àx„óð‹æú2²÷‚u¼ndy>˜ÑƒøÌóêªÙnžšÞÓOuný5¥W´&õ²h‚{’jÜ3Tíž«qCUå1Bc=ÊUá9^£=§¨Üó •y.R©×J•xµh¤×÷~KÅÞm*ò¾*òqt<O3~6“+W<XmaÄ`ZÌ•7/”±‹˜Lõé¡Z/oï *oƒÆzÇjŒw‚ʽ“õ˜w¦Ê|«Ô§P%>¥éS¡â>TÔg††õY¨Bß*ðݨ|¿V ñ{Syþ+¯ï·Àñ¿0w^óÛ¿ÖsÍ6ò|–ÿš;ÇÃ:rTè¢
-?O•ûùj”_°Jü#5Òߤbÿ*ꛪa}sTØwˆ†+? \Cª•×ošõ›§ÜÀç50h²ƒv++ø¤2ƒ¯*3äž²Bð#èÞêëu £èŠ j€ýv®}˜Läê­$7£‚ÝTè­áA* 2¨ (FùÁåÛ588CƒB)7¤P9!¥Êî_©¬Ð)Ê £tÃ2¥1Œ¥†íRJØq%‡Ú•áàéP
-x¿wÁÛœC¸^_
-¥DNRRälÙ£–ȵZ¢wÈ}LÖ˜Kàp(щCpí€Ã`é¥<é9°ñk6£àd>«²FÃB£‹r£<”é£Ì¨~J2(-*F)QñJŽ¶+):Cö˜Á²Å ×€Ør%ÆÖÊjœ©ã"ÅÇ­’Ù´]&ÓÏgzWqæÛ2™üïà}‡àó6ø×1¯däZžÊ§yo":*Ð1CБç¦T£·’þ²Cd3F*Ñ'k\¢¬¦T%˜Êb.T¼¹Læøj™âëe´<­XK£b¶*:ᨢ¬À—Š¶::“àP+±ßç«Ã½‹¨Ö£yé´Ô £EÔÊ r–fí.›ÅS‰_%Xe±„Él‰•)!Aq ÉŠ³fËh-Plb‰¢Ç)jÀ㊰@¶…Û¶È`?¢PûïÀ-^;Âmí&ö-ð¿Â¸·¼„õ¤”zäù8ZÆ›2>†ÎÔkJJ%Ø<d¶ù(Î £-T1¶(EÛÍŠ²Û™”¡ˆ¤<…'PXòXR¦*4e¾BRW(8u“‚R)0í×ংҼ׉øÛÿˣ苌à‹XÏæð¬CK:JÑ7”8eS#vbbJwStª—"Sý‘¬ð´…¥ÿÃv™
-Ë¢s»àh‚o]!ûól´0=r-,Â÷‘ƒÜRÉeïõ‚÷"çw ÌÎE9ÍŠt&€d]½á¤p×(…¹2dp¹âž®`w©ÝËåïÞ"?÷AŒÌIp]~®/OþNú)ø7ÃÙ8OZ†5­,E`Öl"–$ƒ\Fyñ^3¨ù$2OÑÓüdÌ5Èà‰Tˆ'FÁžDzz(Àóˆü=, ŽgüƒBæÎå¾à5=Ï:¤©“©to9tq9ôsðo€»®\ªYÈñ{×\þW†ùmùõ!TWjÇû‘äe( U@!—CÞËÁæå€órÀx9ø¼l¼^„ìEÜ^^ž…Ç›µŽMC75ã"ÀkCOMð¬…w%¯U-aªxëÄÅÔ€g#+¤þüÞ¼°H&r þóñQóñ–exº2ù²DÀÁRŠ§*¥¥é
-ÁWQÌ%+@3‚ÃT.¤VÞ„ð;@_KüÚ•|VKš«ÙH× Ò˜ƒF©7×D`aÀÐLr¸µ_hvÈ£<È£<iÄ™“F¼F6·w‚¯§Àõ›h Ðes-ô*Í*Ÿêë¨1Ë×2eXÑI˜ä3b3
-x ð©Nwà 8 ^oÜ7hð:9Ïš¹ˆQ¸L3xm\á
-ãû
-ñ¨%8¥b&qOêœÖ×,”¯´ ï¸7·G÷˜¼;¸Õ[çs}„»úF7Û}ø#8Þ
-y 7{•//ñx§ƒû8xéÿäðƒBõ/üÝ?”¨»xÝÛxÌÏd!¾]Ê¥?ÉÃ8
-ôò¸J—q‘q`ïâ2Ï“Ç9­cÊšô¦vé·ˆùuXÎðßi²<©ï˜^Ÿ^GÁó õ¡~_[ÌÍ'22–8}@-®á1/iñ­äï š›zˆ]@ì"bÏ#v9±1®¥:¦:fà)dÜ̲ù%•8 ×)=‡`ÚÙAØ€}`7x¦#vL*%¸Èêºx[f¸áéE„Aä>š¥‘Nìlb»‰=•èÓ‰ïeæç2žùįÔ~òxV«aßÈv²];aÜA-¶±…Š63Ú§am›ÁFÀn‰fÄü±”:–ÖiôyŒZ¥G”ÌúÂ1”øc´W6—ÍÜÄÏ!~>ñg¡Äbâ—»E,C ÚÀÆú™¬%ÛF¢Ö3“«QV¼µXnÁù8×±wl=‡¨Å>tñ ÖÈ3ê¡mÌI³†Á‘Bþ6òwh=úX§)päÁ1Žb8æ{±Vò·œ –òe5µ¨¢Š‹YЕ(¬Þ‡q#ˆ%ÆØYÊ/²Õ>ø`ëÝ.¶²F¶(†ñ$ÁÕ žp<
-G
- 68¬§jÈ£ZÓ´„<‘Gëå ž”“UJ©\ #›‹J‹õ7Ía¥Í{6h¿^b{?Ëvö[É!®{8v¶‘϶ºõ
-!J$õŠ£ºÉDí Ï@Æ2Ž-DåÊ‚Ç ÏxòP¨žâW²“¬`–Ök•,@9ùÌGó‘§Y?À[ñÔŸöã0GÌ^ŽÝméí8rÖК¬¢.5~aŒÍ_\Ýô¸ú0žAð ‡ÇO:¬YTÀ W*NüÙÄ.gõÔðd ÙmÕ$¿VMô{Mnÿ+rÞ“+È÷ÎÂ}´GXo|/ØÂýž­ìDëA]ýU¡9fyý;kfÀÏTØWùƒ5-h„rƒ,šlSN°C“ƒÝšâ‘;d–\¡%šºXã «•mh–#ì€ìaÇ•~I™wõ˜Ñw™à[ùá~É8êÁŽÛ:ZÚ²…´Eó¨‰7*HùáFyÂb”ž¤Éá=41¢Ÿ\ƒåŒ© ÆT3f(Û8NYÆɲGNWfd±2"+”Y«´¨&YMû•j:.‹é²,æ/€ï>RÁ+ð·Ñ†îâhkk‡â÷ÒnÑ‚”Ò–Q“|æk²9TÎ(“Æ›â•mêª,S/ÙMýõ˜y¨2Ì£d3[•n¶ËíÒØè\¥F)%fÆĬШØÍ»W#â^Öð¸wõhü ÷ý„8Þ÷Ó‚î%mâh«§õYÊÿ y>—šÌ NSiœ•kTFì¿Ù.¨¨Ï+Š_£‚Šl#Û 0 3À
-(0.£D4DÃwq©;hc¬¨9©&Ù¬i’&VLlkšXS£i›&=iÏñ´Zcܲµ‰UÓtúœÛÓÎ=ÌÿÏðÞ}ï»ß÷½kPqˆQE! µ«0Ô©‚Ð,å…å+7l´F„SNx¥²Ãë”1WÆUJ3nUª©K)¦ƒrFž7äŒr+%ò.^¦önrïÆÓn-dÀò<Ffx<BjàáB'e1R±iˆ
-AÊ7†)×­“MÙ¦$e™Ò”i¡ŒÈQJ,Sj”K)ÑÓåŒ~Tór%›7+)æ)%ÆüDvËi%X®ñû_J´¸ûð"uw‘wãç&|m #Ï2,ÊEÈf¾Jà —JáQ`ñUŽ9@™æaÊ0•f¶(Õœ ”§œ1YrX
-4ÜRªä؉JŠ­–ÝÚ¨ë2ÅÛ6ÊfÛ#kÜ+Š;¥Øø+²Æ˳[6à÷ö’~v#ãçšR´ÀçGy÷«„ã84R‚^sú+Ý6T)Ö`9¬aJ¶F+ÉjS¢-Yv[ºâò_¢¸ødK¨’5¡^±ö%Š±o9ñIE'¾¤È¤·ÀeE%}£è$7ï¹Ã¨ù‡älÇ
-l¨`ÆÍ|n‚K-<&³Fehek–V‰ƒ•h”Ý¢x»IqöXÙí²&¦(6)G–¤"Å$WÈœü ¢‡ÏT$Éäø¾ŒŽN…;_T˜ó¸Äç;ŠpºeÏÐÿNrn{
-É*Õ°¬I2dÏPpö<å´(0§C9ûå?â(8/ÿœ›<39‚§ÈÓAþMØÓÖª»ÖlîTi&ÏSy?žžŒæ;¹pM¡gqô$*ÂrškPHn„†åÅÈ— à¼åP`~‰òÇË¿ Ì–¦qHA»>+ßÂ#àC *üBƒ ܼgŽ¡ÞíŒþ«9›¦£G0»ÏÅs%\*èË(¾“E¯’Y³XÖ'btŠýT¤€¢P%ÿb›†—_q–†Òà’qò-©’OI£”,Wÿ’­êWÒ¸1 %¿åógàŸº¯Ø­Nò·Õ Ç:iV¨4‡xž Ÿû±iù|‡åU<}‰¢/!㤀òAò+ Р2ƒ|ËŒò)³h`y¢ú—§ë¾r„\áršYþX
-0“嘵rŒCÆ ìSÀWæÖ.jÞBÎõõÜ豉óÔ4°¼/Æ–dÃ%žø„Ó› BûMñÕÀÉþêç
-æã0wEß=Ì\°.ìBD.„å¢×"°c'1!MdbšÈô6ÜÚ1‹;‚œ-s8›æKópG`O+y‹ɇK*üâøžéaÉ@È¡3$Ÿxºé µ\òµ µ\ú5\t5\@5™
-Ÿï¹XÃáÀÂßÃXÒ
-nm ×Ú5ÒÒÊ¡]ÓÖ±@!H]/YùÎû@à &ïÁóÜ
-Vx´ÒVx´Â£ŸÛÊ%ÓÂå×RÓZºöq.|æj&çULÒ+q4+ÜZO¬XÐ9HfúF$‚|‹6K[Ð
-^ú?ni 5è3|Õ5¼îezqA#ˆ_Lì
-ý^.ê¨Ò{ð8 3øºwð—¿‚ÇÛð8‰#=ŽC=†·:ªn$ó2µƒÉyÒ?t,¯àY°ï?8ÜìVrŠšüôÈEžr¤?ŸØ£éì8ýGàñ:ërX³ˆÝDìùÄ^‚³]MÖÇØ2mú›ù~žƒAÂ馲.²= ö€Ý ÃËá&¸æ•‘GZ§ÑÅq’+œžYÈ‘LüLV·€­8†ØDžDì©ÔRKü‡©§‘øóX%Ä_ƒ"6’c§vñv'¬¶³iÚPÄ6Ô´…¬ü
-8K)gYÃBðDài†§žmðô`ÁÓð ³÷$Ÿ«Ÿ]vàÉ>N×K<¶n²¿î'ø2LYÿ%u )tY¶€='±e¿Ì*•³™à³í\v/ä<eð¬'O„Ó7sKZáꄧKØ{ŒlYõÐsêÀ£[Ȩv2»Œo¥V´RíZáß ÞË¥íÐî_¡Õ^˜mOaϲh¿ŒÓ‡Óá4Ãç€Ë ‹žrx‚ÜŽ\¸šáj‡«KmqýjÖ¦øiEãª9á‚š–µ!ñ¾¬†¤Õò
-bª÷áü:mí:rã"8…œ+GS ‘¿ˆðIñÚ–™¬VƒQQƒUͧ6¼Ú`(Vƒ±BãZ­7Ö«Þ¸Qu¦6…Mݪ5íRiŸª3)˜yNUæ›
-˜ßV¥ùUX>T¥å3S
-)1<«øðÙGƒC˜ÎF%„™-Ÿ*.„–ÿE8O#»çwr'EÆXw3ªnçy~iÀ–jlõãñq0:™R”±Þ¨´õ¥F²•ñ()R¢ÄH•â#õŠkˆòÃÕ‚/Ó
-ó¸:;_ ˜ÚÀU®:G
-Ê2¾X&±–8äÒ«¼ó>ï’—_{ ðîÅ´n¸šá¨a¿"örÜ„Ÿ²·*ô_üŒañ î|n]ÅàîãÁäMð>¹gV°c´B~®PøWðÅ
-I·ÑÊŠtÿç¼÷‘†9c/gÛgè–TW6\ÆÛ÷_Ý›²Â¸†
-{mfŸ5¼*c?™ìÅô,küòôs¼5‚§Á™¨1#¥ê‹šÄ àbÔ°þ¼>
-9È1ö’%c›ôÙŠP9œ`-¸ çïÀÑ’ïo±c-™Ä^,p9õ=å±R ëûô˜BÚN<¾£Q¬?–õ[92ÛÙõtÖïdýn=L<ÖéAÖßÈ‘¾]«Xe»¹¿»\Ÿh¼÷E±ô󟧢­x8zõ‹'¨‹môH2ÙG>eè÷k=:BÇêt5ý²J´R“ÈÂ=pt±€n¹ˆ¬Ñ½(\ÈæSÝ°té*ôO²ù.r”œŠ—ž?àä˜b¿Ì˜×C"œföã€'›½ÀQÆê~ôÙm½«m†§žIšG<º4›µ¡æªv³ƒ·û©âŸPAo“½Û ¢É ÿyš#äy®™ƒ©Ònžs´mE×»o
-œö” ž8ÊáðÃÔ,ÕÁÓ
-á)‡Çcž:ª³Êh†«ž©¬ÝÉ_‹P¶’
-~”êÙÅ/k$?‚f§OþàyFŽŒ>OqÅm›¸r¿ÁѺ¼!.s¹Sc‰£>;\™°ä±§"öã¥üp᪇«®±pMdíptóv¹†‘Zª«f ³^Ðéw@d
-Þ-a4œÇuÓAL&cÔjHÖ¸A©ð9àÊ‚ÍÍžŠàò*P}LHuƒÂª4Z5±Œªê¸9Âàˆ_'üùâŸÑ`ÃKª0\REÂ-U$Fpˆ+mw¹´£‚äª_ÃÕ²¼„±‹q¬ÓÅlIŽî&&cÌqjHNQ8Á¢:Cšj²U“¯`b±ª+4$±JUIµ
-$5È—4V•ÉíªHž%oÊ•¥¬U©q»ŠO«ÈxB…ÆwU`º¥BSDEà
-Í*H½WžÔ5r[¶)Ïò´\–ʱ\’ËzD” öÃÿ$#Fžöá#ϯñw泥¯8!7#kÈßš¨
-‹Yå›J-*±äªÈR¨BK¹
-¬UòX‡)ß:Jn[«rm3ä²/T¶}•²ìßR†cŸœŽ•îxGéi•3-»ˆöÂ÷Ü[×Õ1n‚ÅŒ€sð¶ÓÐÑJnFS'džR¯ƒñ*¶U`·ÈcO“Ûž¥<{¾r%r9|ÊI );­AYéã•™>MNg·Ò+åÈØ*{Æ^Ù2^5óMð©l™ÙÁöý¼›ñ³kûî‹°HŒ=S°l-~ò@­ £Fª¨‘òÜy2“”ë4+ÇiS–Ó©ÌŒ\P¨ŒÌ
-93‡*=+¬4L¡={ŠlÙ]²æ< KÎ7•êÚ#³ë¸L®_OøÌ”
-ke,¼K)EmJ.š¥¤â¯+¡x£ ÅßU\ñQÅŸáy|Î;îröÜÃÈ» °ª…ž
-Ÿûnâ-ÜÌÏqSýäãMâ8ûz{Ž†õSâx8Nk{ÜM)»(é3Hé4’z¹~=ÈëÇ1pÄp;ÀÍTÁþ¤_+Œ}XáŠ' Ž,ý?u§ô
-Îæq¼@>zñS'ñuÏã/ŸÃ >£zŽÍ:=E;¦§N*Ò£nž<¨7ÈÌUí#Ëû`Ý :À.ðœ_ORòËìÜ ÔpÙùµ/±ç°öh=‰kë!G¨Ë!Ü^7îï ÊY¿ŠöñJ¨gýõz\›áhçßÚ×ÓDt†*½bn¨ÞÐ 6ëù^ Èþ489x,ÃØ‹®h2š
-‡çn1 öBxæÁSÎÿ¢Ú(fYjç›C(¨—êõÓi>'{·ogžçÊïáºÝG;kç}+ñl$n9¸Cà5Á¥…r²§xx’ÙK<¹ðŒ¢sG“ášÎ‰¹®x*‰jê]r¶ñí~"}ŽnwUL%oß NqÅOà*c}œëe;WÝ&âYC›¯%/‹×P8¼fòfc_1ì)žö” k.\ùp‡«
-ÆiÊædgqeê—dñÏʺèYŒ‡³¥½Ã1@3¯åz©MaL$?óÉÉr2ìC¤&…X5>È¡1A.å%jTPªFgiDð «a!w+'t†²C‹”V¡Œ°:¥…7)5¼C)áO(Ùð²’ å1|!OÄwòDútÎ.®÷ÝX‚m )‘1—‘›PANŠ©O!õºÇç´†*ßdT^„U¹‡r .eGx”‘¦Œˆ¥GŽRZäyS•bœ­dS¹<¦¥J07*Þü¨Üæ¹Ì/)Ö|Q1–ëà{ÅZ|zþýxÈÆÏ- ‘k~ïkËæ’§™Ôf2µKmFØ•i1)Ý¥Ts´¼æ8%›“•dÉÇ2\ –±Š·(ÎZ(—µL±Ö%rF5(ÚÖ.‡í¨ì¶—e³]_‚[¼÷©¾}ØÃvÆ­–IŒœ¼Öãm3–ßlò4Lb ÉÇ ‹ RšÝ Í¢„(›â¢bä¶%Èeó*Ö–£[¾œö»mŸ%‡£TvGlŽõ²F·Ã²D¿(Sô™œ’Ùù/ÞûtþN¸Ûð³›±ˆëA¶ ›4Ÿ8î§6SÑÉ42’ÚdS›wˆâœFÅ8¬r:ŠŽvË,»3äÉ木¨˜é²ÆË»Hf×™\ÛéîR„»Wáî~Ü×ÀM>ãþdß{àÝÁ¸×< =‚ZìQ1•ð]!µ™2ŠYäQ›,j“LN\ñr¸,²¹ìŠrÅÊêNi²Ä —9~œLñSeL˜«È„*W*,q‹B=ì9¡ Ï
-N¼¾UH¢O]pí†wûLúÂ,úXÆß•|VLl÷’£)Ôf9É#'äÄCNœÞPEyL²xl2{œ2yâeLJUDÒ0’Ç(<eŠBSf+Ä»PA^ ›Óâåð2ôz6½—Á·$õßÚÏþ;àÝŠ%kšå
-Í¥B+×tʵr‚)—ØD]᥊yÐÙ
-ݸü~0)\ü*°á¢Ö¸É½¯Ã»{‰œXfm…Õ°Èÿ³Ù2É÷V¤á|ÒßµÈ=růËÄ”èT£±MÐTÆÛ©ª±jE¤Z­WíÁj©^v›q–¹q˜*ËBÕ˄ΆKZã[µo¹5Öc[­¥_ƒU°`¥8,õŠïGñÑ ¶ôbK‚^2Ù“:£±hhÓ5“i|1•/jöZ­V<ji¢V
-ôሕ¦æ¦Èå¸Kk4‘ëU»ø@ú®ò{.ÔJ£1Pâ•¢4à™ öÅ—qEÛÚ`
-1³T÷ƒ<ȸѹm¸ µüa‘éÀ-ÿí߉MKvÇ€z«˜´(j-|ÑBL‡9÷ðÏ~×àô¢3ÿp.ÇQ3 xÔ­ê€GònÃ߶dÜÇàN¸;¹|Ü›ü}áï6Ü÷'Ѷ$œ3'ÙqRý<%&§4ãS|qJ~œDzRÍ>ù”çÞ‹•x/Ã9×ÅÒf ž|®Ê¸'y®Òj= kÍâٱ ]øý0¸’Õ!,£‹Ú£p~ †œ¥Ó³´qÎ0rNÝ<ÇçˆïüQððÙ—cž;ÖÞ¥¸Ë`|øº<˜\ø¾“äø^ò\e>´›ö¥Pë³ÆF<?WŠÃO£cq|”€x™¯ª£¯iøoÐç›räM‰ö_¼a«{ý “u| ©= Ø&RÿŠKâïæå¿š—Û6¤¿˜ÛßW$þdvÿƒ}ê÷öºßÙ*ß1?ÿšX߶¥½i¿{…#_â¬ú\ü–YŸÅ3Nmc}¾ §àË6ü>±Ó|d†ÿÀüþ¾)ü]“ú;¦ø_šì_³Ãü‚/±ã…ê9ûÔ³
-Å3¶±§%êOl»OIœ' ø<!=Žå19ãéGãc“½&É}/Üù>•3d,‹ÓmB¹ñ²=âE;ÕÏbW8{¼;Ô
-Ã,g_æì…Î^êìUÎþ*IltþB¸›t®‡l®î ¾xÀÛ÷Åý×Çá(´À¡¤ Ÿ$¹/¶‡³“gáÊÃÓÇ ç—:{¬³'Äivœ—6½l`÷ÛÄîµégÇÝvÌ;Åå˜Ýêö8hûCºžŒ›ãûÒûQú§Oõ)ØÍ s‰'éÀÓI©=Ò.ù \¹xºãèëü¡ÎÅþ±Îïì)îñç×9žó)#+œ¿ÖùyáJ×ø¹9š¼½Û‰»xs'5íÀ󠒡 Tªx>)í3ÉtSI½•‚/ WBé)t~ÿø¦-ívì·Ñí£kè´É~¹ÇÆ»›FvÑÈNZÝÁÛí™ÛâªØâM¬ÞÀsëEp]ü†z>óDk;áùdŠµ¥ßédI8š,yùb¿iŽ|ENàü­b”¨WÄVûåf{Šc–ÍrŽVÖ€co¬“5Û(¥É‡¨÷žX‚e1/âýÜ sÐSG j+ƒG’¥Yùv¿œ™øºáꎣ7Žb%8ÊpTÈŠ*J¨Á3ÏL<sð,röêXÀ²y<3‡/.¥:jšM›³¨o&î 8c$|(KÙUV‰¦u´#í³½%nˆ4œÙøxzÈ‚Þ8â(‘eYŽ§OL™õfûd–'gðöt¾˜*jmê™L›Åc¢*R£êÔàoÃà å]‹;
-7i¹û”´]ìÙÆ–¶q¡QŽ,‹.n–ƒ/WO<}ð ÄS‚§”2Ëc;¦:qŠ¿&yb" 'ˆD5}V‰d%ÕŽ•=c(¾BöU¨åøÛð–rÜøÕ¢¤€½þßΞ F³5ü²Të™ù2g®{åËÌžîÔÏ@¬%²¤ W9®*\“pÍÀ5×'Ëâ"Ñ-¢e]wÅHÍe„ì†Ï¡5NØk¡Zì>¸JYß–ËÙ²œ_h9õæ
-ukŠ<©¡q쨔+cåìv”Ç0•´ ×jk*®zç/jWÎPY2„ÂÑÄ@º8~ïRø¿¡5î3~Þ¦µnÌ0^iÛè³5Æ%Fõ9F€|2™fÆ¥eàÍÆ™ÀW€µ®~î5ˆÃñÆUƒùbµSå
- 7gaæV^hÊa,¹ÝÓ½)C"ƒ¡Gú`C³îÁ‹äÁÌëA—àN îyb*ùcß4Zï̲IhW¾GóóV ‰LêgMb©g½XÞ…8|ÍDIQÂËNh<)OŠÇòz”DòDïF(½´73–Ï@tßi–½iN½i6½ˆÁ3OLfÿ1ì;¼ïCuIËÙ…ïQáÌ|ÄÒ{b _âð€?Zøj`&¬Þ±.v?._ŠÆ ×û¤Žþ€éÏ‚þñ(3–ÿ8”—ÑWÒ—Û>Tz.²Ø?ƒ½‡µ¥.­7ãi<Ÿ¿%ÿoD,!`R•8¼—\à‰)ÚÖÐó`.Ð .¯jÄÈ¥HB–@H‘1°%ÚíŽá@TèªXb¨’/&f:û¦.c¨K4®#1ðwsb©‹=˜8|ÁÄL´¤fÇÒ–œ§µxxC¹ÐCxìtœ‡ŽóÐÁ $2Nºæ(‹ê˜mt †5&j0T?ŒCpmG2Žaôè×EˆhË9K(ñU/0q&{–´ž@âAk
-D&Žxâˆ#Ž8j$,byüb!p,dêLðY¼õÃ]Ù‘!1š‰¢C¾H£l‡p…õÊÏøŒÂñ¢Á„\q .»÷…°àçâU%NšLH„ö-Rø‘dch€’Ê
-Ñ^ô¡û@äDˆ•À½3Hvägxíq™|òDêp–„*Ýжhc´æHê
-?R‰#•3Iõ3<†Ã ôP€ŠSÊ,§>Ÿ†ˆÅ Øž„Eé†q…„Ž‡™\·¨=ß-øR'6û†¦;Ûø9IA³Š”zɆÙœI6—|XdAî,@œÄW°æÖ¾+Y?†µ[ð»Ú“©C ÷iB”F-¦›ý™(¡ÓŠ †-A[(Äã÷¹¯üožq@
-á¥
-™$Y’&y’(™’ê•«$ûëuÒ½y‹„ïܽ{’Üðà!y?züø÷ߟû³¼¼çÏóÕüUQEUTQEUTQEUTQåÏ!ß`¿yò ¯çÿ·bQEUþ§äò±o‹µÿ°nÎÖb¯}S“V\+Îáè¢ìeÅ:<=¾cÿoÅ¡Š*ª¼¹°oW±µ¹gÖˆ ûŠ±ŸŸW¯÷ÊG&íù;‡êDÔ›&N8:< Í‚[¦ìß9¼qtïäåOŠ âá¾ÏÖ*Æ®Š*ªüGrïì~“¥‰\Ý13¥çšÇ¦Ìö.æ§K?jÊaó˜è`[á–°Á„=7%¤¤¶ý
-st¢P"M8<ê[^›R–6í×+;©k¯ ‰ˆkÑõke‡U ¡ —lY»jÛ9e‡Ks§í¾b"<ƒÜ.îòRE•?­Ü<wxçÓæÜc“c›eÝ0eß;ª¾ŸƒQŸ›°_¯/¬îj“n+;¬íàPèà’|VÑþlLuÃý`Ó]ù:kfp]”V†í"þ´¢Cº]‘C”b wÒÊšžQrÈ[Ý+ˆ ,|j…w:®¸ÅõeýUnÐ3cöŠíß+:|³a톣¿<5aUE•·"WvÌMíqФùüâ>¡¶Âlª)ûÁŒ%dátÍU¶Ÿ[ÛPYúÕÊ‹#Œ¥Wq†¢ý€rF‡tÅGz]‹¢âî(9dj_8ôºª`¿Õî…]Äü¨à°­ìK‡J7HŠÓK‡wsÿÙþä“Ø—1TTÖ..Œ(r°Û®”ÅÝõéѵ}­4fŽ>¦z±‹{–ÏŸ·à£µ»LÝAª¨òïÊÏ»sÆŒzfÊzkfL°½(¿Ö„ýÔäCõ ~ h?›j¤}«CJö§3ëÕEÐ%‡/c_TV¹ÙJÓ*½p°ÎT°_ëú²xEêì×y\Íùð_’^HÙÚ¨;WiˆÙÉÅ Y¡A›"ÝÒ­[öˆl£!¤I²vå–^ÙŠRª9­$ÊV¦d2öåþnqÕy>ÏÏ=/÷™—ë<öy÷;ßsÎóýžç+N˜Èw $— ÓŸ°ümWy0¦’ù\°*c »†<0gלˆuNä@§Bö„‡É!“ˆÉ ‰·ñ¯+‘‹G[Yš›uï?Rê|÷^î—Èrr¯ÝýH®¬/¯å‘žíëªüŸÝí,´~$¾åÒKý]×Kn±`ÅÀÿôlëï¥ò‡Á=ê»Zò5ö[7ì‹q|g‰Unr§¯Ä"~²F§8ð—ß›-cYþ¸ÙÞ Ä‘\à³–-K1¿EsÁÁ÷
-®²+
-sÐ=ét¢®##URuMÝTÄü„¤ó—³ò‹Ëî?|òšÇÊúôzq+[:¨º³ÖsâÀê‚åMžnþÖ´áÛÚËòú›ä‚¹3´‹å3šoƒ\P…¡7.‚B ¬<¤L 0
-
-òȆ×èˆ ÀDG­r€ <ƒ6§
-üˆž83ð|6 Ô~!Æ]{=i¶»ï’5á»$€²>¡*²OE®t³OˆªŽ¯œ1À°Ñûoâï,Nõ4•ÿªðGO\Ùž~ÙêpcÝŒ)ì àGàRÂÀ0X»èÏQAÁl²(fà4ˆ¦ ƒM<ÒAoc0
-ÍÓÔ ݆/¢UÄ)ã öÐ|›íáJËæn¡×P‡¡W›‰
-Øx ì£À—•°k’àFÁEà‚Q®…`0|”=t€[“ 1x}Ô
-RÔ¡àWvHý
-p`+gQ€£(^±£‚1£ö¦¤¡×±ÇûÙ>¡±—9¨½Ú–ã騬ÿ¡*ó®^¾œxú§ø#qb ,Y2aHwcýVMëOüb’/f=-ÄÈ/} Öô‚-ö ´£`=·œç€¾}’ék஄)˜ÏÀ
-Âð§à4ÎÜì€`"þ¶ C
-ü€È^ÆSpÙ|Òv:Q ú h Z€¢1
-€¸VKȘ 
-=V…yí!´pÁ’°Ýñ‹ñLYÊú´zY*K;—x2þð˜}{"wîü7ûeÔrÇñ„"Iwž:G”Sy¼\šV[´<¬6'RÜÜÕ¹n%Ü:溬'5Ém¥¤ÖDtbè¸Z·¦òºL\·&$
-³–ܾŸï~vç¿×Ÿ{¿¶}ß»Ïç÷ùœ<%E…„&Ýg™§‡›ËÔIN£†¡DHÁJÓê"ÔNÆ„dDè]ƒ Qè!öcØ@
-°d *¨°>7 º8P°W% \ò² h¢`3‚^l:®9º3â Ðc<…ÍxWo67µü!ÌõúÊʺî¡Ìó·[ñЈZÙÒI‘ü4Ÿz{z?cŸvTäg‹„‚C |Þ®ø¸˜Xî.þqDh\â1ÓyâXǶC>¨M|;
-Ý¡P†
-ê`(d¡B÷G $‹8½‰‡º¥¡&Ìú{j?›ŸS„®£Æpä´¥ÁñW5zŒáN®K6Å•V·áiù|QþAh üÁ4×ݪª¬(——•Êd*®Ýi„³sZdD(k}P`
-âÈ®|BpWãù©×$ˆ ¨ï¿%IHþOÞ¿y­Óé:ß~0?_(g¦‰D¢ô,ñ™¢rE}K¾cШ+)ÊJ_*=ˆÍI,€?!ñ4Ðl=Ã…—[ P½Õ®¿=¸Äž¼ [˜Í÷þö ©}gö˜… OZO$oê!xLõá=é¥5ØdbBCö) ÉO¡Õ´¶>ñRÛIðrþ\šš’r"#;¯@V©2[ƒÙk©þ«‚˜›cç›Ìlz½Œi5a#*¹XÝmþ?”;¼6ñ2.Þ#œ:ĉÖ™Li­Ã’¿«ßÌðü_
-%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 15.0 %%AI8_CreatorVersion: 15.1.0 %%For: (thatcher) () %%Title: (repository-icons.ai) %%CreationDate: 11/20/13 3:39 PM %%Canvassize: 16383 %%BoundingBox: -115 -1130 917 123 %%HiResBoundingBox: -114.793 -1129.6504 917 122.6416 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 11.0 %AI12_BuildNumber: 39 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%CMYKProcessColor: 0.75021 0.679683 0.670222 0.90164 ([Registration]) %AI3_Cropmarks: 344.832 -559.2051 424.832 -479.2051 %AI3_TemplateBox: 250.5 -250.5 250.5 -250.5 %AI3_TileBox: 78.832 -915.2051 690.832 -123.2051 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI9_ColorModel: 2 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI9_OpenToView: -935 55 1 1798 872 18 1 0 140 332 0 0 0 1 1 0 1 1 0 1 %AI5_OpenViewLayers: 7 %%PageOrigin:-150 -550 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 63 0 obj <</Length 7053>>stream
-%%BoundingBox: -115 -1130 917 123 %%HiResBoundingBox: -114.793 -1129.6504 917 122.6416 %AI7_Thumbnail: 108 128 8 %%BeginData: 6902 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FD0DFF7DA8A8CFFFFFA8A8FFFFA8FD60FFA87D7DA87CFFCA7D52FF %A7A8FD61FFA8FDFCFFFDFCFFFDFCFFFDFCFFFDB2FFFD07A8FD13FFA87D52 %A8FD08FFA1A87DA8FD08FFA8A8A8FD0CFFA8A8FD19FFCAFD0FFFFD04A8CA %A8A87DFD05FFA8A87DA8A1FD08FF7D7DA852FD06FFA87DFFFFFFA8A8A8FD %05FFA1A8A1A8A1FD0AFFA87DFD0AFFA8A8FD0DFFA8A8A8FD0EFF7DFFFFFF %7DFFFFA7A8FFFFFFA87D7C7D527D7DFD07FF52A8FF7DA7FD05FF7C767DFF %FFFF527DFD04FFA7A17DA17D527DFD05FFFD04A852FD07FFA8FFFFA87CFD %0DFF7D7D527CA8FD0DFFA8FFFFA8A7A8FFA1FD04FFA8A1A87DA8A8A1A8FD %05FFA87D7DA87DA8FD05FFA7527676A876527DFD04FFA1527D7DA77CA1A8 %FD05FF7D7D7DA8FD07FFA87DA87DFD0EFF7D76A8A1CFFD0DFF7DFFFD04A8 %7DA8FD04FFA8A17D7D7CA87DFD06FFA8A8FFFFFF7DFD05FF7D5252525176 %4B7DFD04FF7D7C52A87D7D7DFD05FF7DA8A1A1A8A87DFD04FFA1517D7D7D %5276A8FD09FFA8A8FFFFA8FFA8A8FD0CFFA87D7D7DA17DA17DFD05FFA8A1 %7D7D7DCAFD06FFA1A8FFFFA8A8FD06FF7D7C5252517DA8FD05FF7DA87DA8 %7DFD06FF7D527D527C527DFD04FF7D52517D525251FD0BFF527D767D527D %7DFD0CFFA1A87DA8A1A8A1A8FD06FFA8FFCFFD08FFA87DA87DA17DFD08FF %7D52A8FD08FFA8A8A8FD07FF76525276525252FD04FFA8527C527D527CA8 %FD09FFA876517652524BA7FDFCFFFDFCFFFDFCFFFDE6FFA8FFA8FFA8FD14 %FFA87DFD23FFA7A8FD2AFFA87DA87DA8A1A87DFD07FFA8FFCAFD08FFA852 %7D7CFD0CFFA77CFD05FFA8CAA8FFA8A8A8FD06FFA8A7FFA8A8A8FD28FF7D %FFFFFFA8FFA8A7A8FD04FFA7767C527D7DFD07FF52A8FF7DA8FD0AFFA852 %FD05FFA7A17DA17DA77DA7FD05FFA152FD04FF7D7DFD27FFA8FFFFA8A1A8 %FF7DFD04FFCF7DA87DA7A7A1A8FD05FFCA7C7DA876A8FD07FFA8A8FF52A8 %FD05FFCF7DA87DA8A1A8A1FD05FF7D7652A8CFA8527DFD27FF7DFFFFFD05 %A8FD04FFA7A87D7D7DA87DFD06FFA8A1FFA8A87DFD05FFA8A87D52527DA8 %A8A8FFFFFFA8A8A1A87DA87DA8FD05FF7D51525276525276FD27FFFD05A8 %7DA7A1FD05FF7D7D7C7D7DA8FD06FFA7FD04FFA8FD06FF7DA87C527DA87D %FD04FFA87DA8A7A8A1A8A7FD05FFA87D5252527651A7FD27FF7D7D76FD04 %7DA7FD06FFA1A87DA8FD07FFA87CA87D7D7DFD05FFA8A17DA87DA87DA7A8 %FFFFFFA8A17DA87DA87DA8FD07FFA8525252A8FD42FFCAA8A8A8FD07FFA8 %CFA8CFA8CFA8FD05FFA8CFA8CAA8CFA8FD09FFA8FDFCFFFDFCFFFDFCFFFD %8AFFA1A8A1A8A7A87DA8FD04FFA8A87DA8A7A87DA8FD04FFA8A8A7A8A8A8 %7DA8FD04FFA8A8A1A8A7A87DA8A8FFFFFFA8A87DA8A1A87D7DA8FFFFFFA8 %A8A7A8A8A8A7A8A8FD27FFA7A8A8A8CFA8A87DFD04FFFD04A8CAA8A87DFF %FFFFFD04A87DA7A8A87DFD04FFA8A8A852767DFF7DCAFFFFFFA8A8FFA8FF %7D767DA8FFFFFFA87DA87DA17DA87DFD28FF7DFD05FFA8A8FD04FF7DFFFF %FF7DFFFFA7A8FFFFFF7DA87676527DA8A8A8FFFFFF7DFFFD047DFFA8A8FF %FFFF7DA87DCFFF767DCF7DFFFFFFA7A8FD047D767DA8FD27FFA8FD06FFA1 %FD04FFA8FFFFA8A8A8FFA1FFFFFFA8A8A1A17DA17DA8A8FD04FFA8A8A7A1 %A87DFFA8FD04FFA8A87D527D7CFFA8A8FD04FF7D7652A87D7D7DFD28FF7D %FD05FFA8A8FD04FF7DFFFD04A87DA8FD04FF7DCF7C7C527DA8A8A8FFFFFF %7DFF7DFFFFFD04A8FFFFFF7DFFFF7D4BFFFFA87DFFFFFFA8A87D7D7DA17D %A8A8FD27FFA1A8CFFD04A8A1FD04FFA87D7D7DA77DA87DFFFFFFCAA7A8A8 %A1A8A8CFA1FD04FFA8A7A77DA77DA8A1A8FFFFFFA8A1FFA8A1A8FFA8A8FF %FFFFA87DA87DA87DA8A1CAFD27FFA1A87DA8A1A87DCAFD04FFA8A87DA8A7 %A87DA8FD04FFA7A8A1A8A8A87DA8FD04FFA8A87DA87DA87DA8A8FFFFFFA8 %A87DA8A8A87DA8A8FFFFFFA8A8A1A87DA87DA8A8FDFCFFFDFCFFFD63FFFD %07A8FD64FFCFA7FD06A8A1FD64FF7DFF7C7C527DA8A8CFFD62FFCFA87DA1 %7DA17DA8A8FD64FFA1A87C7D527DA8A8FD4FFFCAFD0BFFCAFD07FFA8A7A8 %A87C7DA1A87DFD05FFFD07A8FD05FFA8FFA8FFA8CAA8FD09FFCAFD08A8FD %22FF7DA87DA77DA87DA8FD04FF7DA77DA77DA87DA1FD04FF7DFD05A87DA8 %FD04FF7DA8A77651A1A8A1A8FFFFFF7DA87D7D7DA1A1A1A8FD08FFA87DA8 %7C7D7CA77DA8FD22FFA8FD06FFA1FD04FFA8FD06FF7DFD10FFA8FFA87CA8 %7CFFA8CFFFFFA8A8CFA17DA77DA8A1FD09FFA8A87DA77D7D7DA8A8FD22FF %7DFD05FFA8A8FD04FF7DFFFFA876FFFFA7FD10FF7DFF7DA8A17DA8A8A8FF %FFFF7DA7767D527D7DA1A8FD09FF7D5252A17D767DCFFD22FFA8FD06FFA7 %FD04FFA8FFFFA7A8A8CAA1FD10FFA8A8A8FFFFA8FFA8A8FFFFA8A8A17DA1 %A87DA8A8FD09FFA8A87D7D7DA1A1A8A8FD22FF7DFD05FFA8A8FD04FF7DA8 %7DA8A1A77DA8FD0AFFA8FD05FF7DA87CA17D7D7DA8A8FFFFFF7DA87D7D7D %A1A8A1A8FD08FFA87DA87DA17DA87DA8FD22FFA7A1A8A1A8A1A8A7FD04FF %A87D7D7DA17DA87DFD04FFA8A1A8A7A8A17DA8FD05FFA7A8A1A8A7A8A8FD %04FFA8A8CAFD05A8FD09FFCAA8A8A8A7CAA8A8A8FD22FFCFFFA8FFA8FFA8 %FD0BFFA8FD05FF7DFFFFFFA87D7DA8FD63FFFD04A8FFA8A1FFA1FD64FF7D %A87D7D7DFFA8A8FD63FFA8A8FFFF7DA8FFCFA7FD64FF7DA87DA17DA87DA8 %FD65FFCAFFFFFFA8FDFCFFFDFCFFFDE0FFA8FFA8FD07FFAFFFFFFFA8FD07 %FF7DA8A87D7DA87DFD11FFA8FFA8FD39FFA827FD04527DFD05FF7D527D52 %52287DFD05FF7D527D5252527DFD06FF7D7D7DA87DA8A8FFFFFFA87D527D %5284A8FD36FFA8FD067DFD05FF7D7D7DA87D7D7DFD05FFA8A8A8FFFFFFA8 %FD05FF7DFD055227A8FD04FF7DFD04A8FD4FFFA8277D527D207DFD06FFA8 %FD0AFFA8A8A87DA87DFD4EFFA884A8A87D7D7DFD11FF525252277D277DFD %66FFA9FFA8A9A8FD65FFA85252277D2752A8FD64FFAFA87D847EA87DFDFC %FFFDFCFFFDFCFFFDBCFFA8A8A8FD68FFA87D527C7DFD67FFA77CFD047DFD %66FFA87D767D7CFD5CFFA8FFA8FFA8FD07FFA8A8A8FD0BFFA8FD0AFFCAA8 %FD43FFA87DA87DA8A1A87DFD13FF527CA7FD08FFA77DA87DFD42FF7DFFFF %FF7DFFA8A7A8FD11FFFD047DFD07FFA8767D527D7DFD41FFA8FFFFA8A1A8 %FF7DFD12FFA1A1A87DFD07FF7D527C7D7CA8FD41FF7DFFFFA8A8A8A1A8FD %12FF7DFFFFA8A8FD06FFA8767D7D7DA8FD41FFFD05A8A1A8A1FD0AFFA8A8 %FD06FFA8A8A87DFD09FFA8A8A8FD42FF7D7D7C7D7DA17DA7FD09FFA752FD %07FFA8FD61FFCF52FD67FF7D52FF527DFD67FFA876517DFD69FFA8527DFD %FCFFFDFCFFFDFCFFFDC0FFAFFD12FFA87DA87D7D7DA8FD08FFA8FFA8FD42 %FF7D27275252527DFD05FFFD0452275252FD05FF52535252275252FD05FF %A8522827525227A8FFFFFFA8525352527DFD38FF7DA87D7D7DA8FD05FFA8 %7DA8A8A87DA8FD06FFA8FFFFFFA8FD06FFA87DA87DA87DA8A8FD04FFA87D %FFA8A8FD3DFFA8FD11FF7D52527D522752FD11FF7DA87DA87D7DA8FD4DFF %A87DFF7D7E7DA8FD10FFAF53527D277D27A8FD65FFA8FFA8FFA8A8FD65FF %A87D2728525252FD66FF7D7E7DA87D7DA8FD34FFFF %%EndData endstream endobj 64 0 obj <</Length 13548>>stream
-”={?hãö K4O,*Š A´íÃ#OPïÀµxŠ$Ñ
-¼Ã]'¯±UcH`¾††Ô[HñoÇ»rŠi¥ëýÚÊæ·ïß>{õtåÔÕ«Wö÷?¼¼ûúý-ÎfÚ}9! …6XTPLÉ€¾¤áêiÑW,í$Nã­Óè ø˜ÉR“(f…^¶ìòtÔ0,í”Á艉Áy r eÏ‘háJ‚ÆIÜÌÍÏ©–¥‹¾¤åõ Óå¨{¸~`6Ž´HRæŒUbX9Ò£é%ˆEÍ®s’žž1¤sÁÛ°p”ð„Ë
-X(<
- I×Þ1]ÒYH}ÒAz'ó@±#É~­?ý¢¨•+o&Øèh8DC¸†È•¦–ÔaàjÈnFT/&Ûn~mJï‘\fg&h•ø‚,x´Ú hæ…2ðfú¥Hù¤ ÅÇG ~g^ni0Ü–J6ä`Áé™–ŒŸkh‰kX lˆúyC[üSø&5\0´Õšs´²4ß!ïÐ+Ä<ÔVb¼Wsl¢ÿ¾dÝ ù6EÍ@@¨i_r¼â5 Á,¨yn!Ñn9à"šløÛÌGb9¨®d$`5'a|l-%VúÔ u/Ñö2d¦•ÜÔwz]±Ó–_e(öµ7+Ù*a%suÌJ]Å]#Xñîq™ŒôY¢ÚÖ—LL;[íLü\ë‹­‰ÌÂißöÅÞ„eûÉ™,5\0Y”D(¤['&3¤”:øO“h>´±—L†÷471Þ³8¹KLfð/ø¸
-&3´³±zŸ˜Ì`P´['&‚#j›"æê[j+ïSÔ¿N“Þ”˜Ì`¤]Û×;ŽÀè©Äd¤ààÈEe&3PÏ|_íVÀzZÑÌd¦mƒE™ìS/ÔaL¢és%—%¬`3“$ó»cX~w”Ï ©¼m½{E¨à2£­zÁQ£Xzõ¸LæàIƒUY00z*˜ŒŸƒÎœ˜ «¨‰€\ýôL–.U@"UÖÿ³HSDM…È6§«˜ÌA­"Û Pñi÷¥ˆ½­­˜Ì³4JLæt0¡“!š¯˜ÌÁ¤Û‚Éí¯Ä+“9E}²ºb2§:ª`22"Hup“9Ò+I ˜’É€ñatÖ XLÁdŸz¡c2G‚ÂiU1YÂ
-&s IuRJ†Åò»£LæœaL¡‚ÉÈ~_wÁPcX~uîƒ4ðÁµ®á–“ Q^;vù$-
-Ð&±R¼>
-úQa…ˆ G/Ãi£ˆŒ¬{ú(3
-Ì&ÙR¼<
-ú%%ÎŒ£H^2JG!6e|[8
-y/RMé(4Ä1<X:
-±9ß•ŽBcûÀ"€þ—ÎBCŸï´.…¦…TѦðM%¨tæç’'0·V@飃½¨Té04N ]: ”†ÕSâ0¨-† ù¦vb×®-††„Hƒ;; ÌVQ-²ÃÐàtÊÛÒaˆÝMEw#T: ósɈd§As”0’±ÊèÒiM(ùFã¨tæç’G0·–¡üÑŒQÃÞ»ÒqhpPEž%ÞÚo˜†Zú ‹yŠNÁ<þ å®í¦/}‡Ðñ„’ïÐÀ‡é\í;È.Ãì;Äø[m ß!±Îö•ëÉ×ô¥ëÐðqkc+(÷6a‰¢“û0Ójž¢‚¢“×/?—|ƒ¹µ åXä¶ÜXâÉüÑ‚w“ ±zN\ˆ Ù¾t!
-¤k"´ï¦ëK"yÖ² Z­Ö¦v!ì¬*]ˆ™V‹gšNž¿ü\òfšÎP1K Kô–KT9K½ á×;~ÞšL‡p]ow ,·;ü4ªÞÙÆÁüúøvgÈîEp^¹ÝE¬Üî bC_ïlã`z{ñ½>ö7ª226¼º­M…ÍFEÑÀ(8njlÐ~ÙwM[ÚÄHÓÞøÊd(Ál[¯‚ [cÅsvBZMi³³cóûãâ ‡ÁjB¬ogÇ>
-æןCº-M–¢-Žy}[-pfR(^ÇéÃÀçÅVôABjÚk–li} ,Bñò(x ê°ˆ¯N¶;5œŒÌã.^Ç'ÃÒ(ô`2Œ3X\ §Àò¸‹—GÁcLÔPäRÇ ;æHþ±W?ƒ»%ÈãÖø`ñú(˜_/'¢ö]ê:bË-6 ¾$l·ÄxÜæÖÓË£`z{ÞÉ–GƇÛBÏi¿ù×Dã ´5’ä´óñœ1„¸) ®N v6¨ÊºÃ+ý°©yˆaÖ¾DÂÅŠÇ (kÊÆ2?º5)Ážc'%LÚ²YÁª¸óuçÂ(8ÊùƒÄT÷¼Ew$Ï:Žð'•-\ÊÀžnC@w-)†­þ½Þö’‚g`ž -Áhº5Q§ÖP]\[ÌNDö¹ëN!&?Ö·¤e¶¦l,CÅì ºg¹Ï=©d]@­ûˆ!»m^Í ¦Lq”?¢6E]óô΄(x6„ŽÚrt9i½e嚟´Ð!N©ðµà®$niB¸|úl;]ƒñã™Ï‹¢Ç£è)í}hkDÎf¬ Üˆ‘-fú„ë$̉ Kä‡[€™pÂí¦N”ÏôXkÃ8R[ )É6a-Ë'²-GñA¥=5ß° FÐþõ²óX2haÁr°Ë…€zqPt¹–Ãÿ,ƒÒÜ)W6–¡b8ØK„Š o‚c€ôʶ;ÈxeÂÈ;mƒ¤õ¾‘<Ý´÷MŸ´°hsvrÒ}”Y™ñr2*[f%И “g#RoF:n
- QA5&ÐfGÁ$ß»p;î{EG`C>K PBÓDö°†Ë ܬüë¬c?`ñu‡+|°Ëì*ÇgV–fÍKƒ¹[ö›¿ÌÇd#ƒYìæÚÿÚmj‰[k ‹¿…Å_UXD‘°€GeÞ;lc¦¤ùÚ”L`iJží¡”Vã(X¼>nJâD¦‘LfcÄJS'L‚¥Õ8
-æ·?¡Á€#·Î›JãHÞnR5U[Hb"õi×û‚µRJâüX"¼ÜX…–’Xz§KÖrª•8÷Ý‘QÌ 8 Õª²
-(ONѽ~`È@ô
-·b]e/à¤W‘ø«LyPÕöBúxe/8¤À£…½€ú ÐVn¬¸Ã³½
-PŽ¥
-('ƒÜ=W«
-
-àT8Ó©l‡ÛHz°4]rä~ó—u­¤Ą́
-þ ‹„¿ªH˜O· ¬e¯çYMG‚Ѯדڂ¡­ë®‘Øœ¼¦V"߀Á!h;ÆTÛ
-¦‰ô8ðÉH0È‘°¾aŸ}Æ'г‡ïvŠ6þ XjŽó6YŒ]ˆÞHXN‰!b£¨ÅUm¾7$W€á°Zn4åã›áp#\ïp|Ü"E‚ƒ1hÛ³aCšk²•Îñ`ò»Nîú‡/YN€óäZžm?µ4µò a’/0Ä¥Yº.¯â|вÍ:Ó\VêÅ5 ξ^\$Ìñ¦­Wû©fBËk«ûÀ‡yi5æŽ)7/#=fMÓU˜qr]´\ZGB³oêeäœR¦†±£lµ´„éÖ×K‹ ¯—6vviq §á0¾¼Œ†h×öõÒ²ânµx±˜º^îØ^½´¦“#ÂrmÑtkêµE‹Ö×kk¬„Q펴wØâ²)ÝWk‹šm¦W^[„žzÎ}“.šV÷Õê\Sój¸’Þ{W3³– ¢rua¾I’¦‚I9Ù`yB–<-/Ñ£ém½¼'âíkf¸#ŒÛH,UŸJzV­.6zÅJ"F©fÛÐZ½¶ð!8­k¾¥'VõÚvˆ8Ó5ßâNx7àåÐÞpmãDi¾uÏcB$€&ŒÿQ±_|hDÂFá€sÉXÖC7^„wZGHÌÆ›z-pµßµõš‘ îÂÒÚ6>®×;cvÑpëÍ°¢†‹i ÷²m}CìlØÐ80J I˜êº®Æh–Œ¬7m¥ÖIŠAkd½q½OáÀÇŒ²¥]ÑÑ%5Û=t¼„±S§[ÅN%|ÄigÃGœ¤ s·JX\Öo…Ô¹&ò$ú(#•Ó»AC´
-¡lVVÔ7<^‹[EŽoYרF…Õ«»'¤k$%Ö¯Ñ|'“© ã%ébº¶_îp
-Œ}ÁuaMqO¦—›†mÛ¹Šœ1­Þúó ¥>Ò’åx)âaѺfûXAn~Ø qt²yñ©*#hÑ®¼aã¦íFëÙð‚éN;v‡ §H@$EÜäpË‹½“šÓ# È‹‘¾ Þ,¤Qµ¸1Ê}ÔMUª½ZÅ™è\Ô©œ7òw¹¨&J•#«¢Q|92D«Â“|Ô@Õ*穯®k zU*+þzÏ $8šŸ•ÒeíéIU«lú [µûµrç.(W-®û;Éî‘rnŽ =2| jÍÁ©ø‚~引;Þœƒ$(XHŸ VùzU¬‘6ñ9ô†}ÅJVK×x-«Û¨f•o7QÏšm²–×yàļQÓ*Ö¼ñQÕÊk®|t­¼äH«!ÊV^q„m+/®bneu«
-:Z±º%­MÐÒœÇUk’¾5ÍqêOÉöÔE=­ì‘‰ŠÚH7™:
-Ñ«¢ªÖâ<¢íåKAWk›&\WD¾¨ ¬ Û먭a™r)JÛÀ[IúõÉ¡GâcJJxXç ¯µHƒä—…m¤—BÚV6n¹™.*[AÅ4Р³• ‰J×y‡ Z[‹ìsH}Çßj[!â0Í¢·•r¯‰ŠÓ™dó*jn#ý ì‚ äÓQlDwØ ÷ o¬AyÄûü¦ Úè×s* ’Û¢¾
-ÉS¡øŠþ†wyÓf*(p#ŸžWƒÃ÷95mƒ †]ËÖ· í¸Æé,éÏ'
-~äÁиšØÃŒ)! °'ì I1-úÁP̾ÛàB"¢B#ŒÔ¼WȤ‡£²¶Ç*c£òHBS<eÂ-´Ü÷
-Þßâ‹pó""¤è×Lï±b‡O ‡°ªAs)ñ©gaZ>¢t…‰RÐY;¢30s‡ìkØš/uHoLÄ/·Sw'$'ÂS–»FÎDÇw‹Ü¸Á!1’ºÌŸ· ~ð-Ù„¹"Q³•>ššÅ<át5}:Ôç8 @â\OCPš 4Œ æ 蘂ifž÷“Mv@QÕÊæµ·÷_=y½²NÒ™~í½<¸ùêÉÁÑo…{´¯ßþ;þÖ+›xïÊ«÷Ïö^<Û{‡¶ë“s“¹üÃ\Aáɤ âÁÜÕGMÕ“ð»è p¨z³úh¼?á{ãÅ%>òûÔ•'¯¬Ü{»÷êÝo¯ß¾,n»pwxEžytóÕ»÷{¯ömï½ß{tsûÑW{oä‘™×·Øw+›7_½_9•Ú?KÿxòúåÊ»ƒƒ'©ýá—®Üôvþë`ÿ­¿[Ýg>uåÕëW+Zw:˜ó¯tóµÒÃÞü½Ò[éÓ¡Dó'Ç$'YD9<£!»JÆœÇ$­pëŸ/¢BK2œUöŠ3dÂÉà`¸ç§ZIJû2´”‘ø½ýIÆtH š[‚Ï¡¥M./"û“Ü«ˆåžÇ–fÇ·?y,.ÑÜ¢—‹R/'ȨÆ~ž‘y"×–å8¢Šþ' §:-íž©¾„´%éc¡îCïbu'bJñ¶3¹¡ŒäÏe,ô)7”º=36ŒúôÑì»=AR> ´zŠ;fr·ÆjREw¬ kža_-²6²Måp£Hr¥°­ac»ÔƒÃ8íLŠÕ¼ * ×)áô¼îО5mïû9{ö¯¡œKKä¢CóÅ# L¼’r Œ¬VE"²›çcj#~eð3=´Êp:„+¶FÒþ›àj º^…OÎB6ÞL-[Ø\Û—³:´¡ÕÔó€”céê±Ô?Óóõ¯FÁÏlW¬šbÚ¦ÿV_zIÀHo
-0}6¼9ü]¾tH¬¡Œ÷enŠZÊ;R"9„
-VP¸NÓÂ8ëWH%&}4¤øgŸO«¨ÌyB¦Ž3ÅÀ¼râõæ2-›ì€AN’e-âÑ%Á>€Ä-°%÷A,pZr“ƇZ”àŸü™€§‘;ÃP› {øY$ô#
-^¹ì¤æc=¬JÃewôZñ4F(A³±€ùçŒxÏÉ¿-‡D1Ñ÷ §y@-ïYˆ áü9E·P‰©ešÇîebñø$qœÏó8ÊK2ײ
-7&x’H|´¼À$* g–E
-µÞƪZáÎ<@ÝJ˜Œ•<+–‹–Ò%ÈV%ÙòSÚF@9ÈR|øÈð£‰åH¸­çÐ)–Ï.ŠÀÞ¶í:Ü#•â«È 
-š"J•@€|Ï›GϤˆÏw%N‡4–öVJF5ÈÏG«HÓ+^Ú†úN’&.„b‡¢Q=²ûv’"€Ìi]\³"?ùe7°±ñõ„Å©šÚD©>ˆìò!Ò®B4§Ñ+¾ÿ
-¨éЛ¨{ÖK]ÚP
-®,ŠÛHé~
-W‡™ø›Î·üª‘ûëL¼¼ç@Jr]a Å9@Šb€8zo"~–ãX°@žûÛÇØ@ ,‘þ.²¤ÿo½eáPv ¸´Š“LÂ_„û´ãWm
-HbP•ÛUæÒfÞãðà›møÞœ9‚¥(šçŒ´"ejD¦H¾ù8+EGdí¸LžÝ#ò}LøÉA:”µû#ùÅìTˆÕt¤m42}.;ôêòS¸úhùI¤w—šFŒuv"G¦e#Ê%_ý|&AšGžö9±l _‡¯Í®=À×ã³5À¹Wkk
-žÌ[U7ôy%hkŒÅ?%%Ui dy6"õFd㬑³ãòxVlÈö1é7"%K!:±û#‚øÅì,,bä™+€ç®4ž½ÒXtþJ#`Î,õÿ<‡#3²„þ¿db<\
- ÁÞå’¡uwKÐé\} ½>
-æ×ë’](ß„++±$‰‹–o„l·À*·ÄêñåQ0¿½PžÙ´x¨Â¼¼å“¯—ŒÐ¦ÞfŒ«Âh®Í?.×
-ãA˜Ò›XÁŨ8§ðM\…wÜ ämö(ØŒ§PIƒ!®H#¯T9$0\Ô³N
-Ø¡°ñR
-Sºi€}⯴öïþrkÿ®\û¹œ¯­…Óìoºø ÐÅQ»Ù¨~O„”ö³ò(Ñ„¶½åH„^\ŠHè½¥ÈD¶Ú&o©]Úé1%#ôƒ¡-GAxs ÂЖ¡"¼· :%GæTPÃç›X{`ጥÀ‚žÏÕý£Ç}TÐGëáàF€Sωü{ÄHxƒš64§PõòÜ:¡#Û4‚ ÛûÉÔ`þÿÈÔ0ªW:ÝJašPoËs.Ò "J£A2äÔ2!t¨íH
-$~Xˆ*8Œ+Cѹ¶-¿äI]‹OåîǦF†õÌ¢MP‘â»wÈB⥶]ÀlO̧$¼PI®â*Ç‘Á~ê5¢ÓRcmp+¾! éš›®|9P¤pl¬„ÒG 0v®h-ad¤Gªž8ñ1-gÚùëÉ»¿‰dÕ·ˆíú›tþ&Qc?¦¬ŽÒI/H)«–§zwYj¡./M/3šš­”×QBÂ0—%% sYbÂ8—&'¼¼4A:Kóê³öØúlnÅL9’±N³½yù”rëZœË5±6mHÀíb#U8L7õr =Òæ'RjçWhí¾Bûa‰`5×cBù°
-õUœ‘ŒŠ,,>~Žàn‚8Nf·x},^/ƒÕp.æ%ñ˜5áÒD„÷Nel·À¬ñ»ÅË£`~{þ*®3
-(#awDZ¹-åj
-¥^TÏq–¸
-BÆ´x§÷œØ¾]1H¼‰»”ˆøÖbpÅEAƼ–«UàÀk“ú¿>ÔñóœÈµ~[Dý Å׳W)l™¾ƒÄ%¬€jg c»ëQJ[“§wÇ°âÝÒ¡Ü!ãöcŸï ÓŠéä{Ãê9áßSMoŽa¾¸7<¯#ùäG¹ 81.ë—%Ö÷"v+ [hýurúlà2g»ÖHvçKd¢[¤ÂbúJµHËR25V@á£[“äÞiîˆâ,»¸wÂyIwGF±+‰_ð0ß¿`®Ôðçk¤«åœ¬€8'ênö>—Ô.&Ø
-(ONѽž‹Ðkäâd2]ƒ<dNc233»Á¿®i/q¦U"l¸¢øKyš3!Ô}c¸Yƒ\ñ]xR÷5ˆK0œwh®ò Dæ(mÝ-¾#r¥Œ‘£_²æ¼V
-¥£K¤­ôa ^Ò…f¬$Ü„!·©Yš©1¼÷¢ˆ$‚;óÒDtÛ…$¬ù±6Ô;Ëme¤ Úˆ¡gmÛ'ª-G°›\ùÄÓSƒ«CL½­+/Àb,ˆ¬’=8y½„€ª­˜’βÏ}RJÈ1>¥¡C
-ÄÎÕJtô†sú1h4ß"=!ä{–'û,Ûœœ]®òµ=/'£¢eV
-ÏYÛˆó&›à’\\¸±¼õ÷±Ðö3b}ìFêYáU˯’P7œ»V7r­©‘ÃI“¨á²€‚JRŠv¦ÎsAjmÚ
-§¢^aß
-$%¨QÜ‹•a$8MIÎåøMçdk#>ÀÇ <ƒ!ߎÝl†çíeÃÙŸápMæÚS;üY¥ÂÉy1äŽsä2Ôõ¢³u´õñg•Äúòd®ò÷™Gík®(§z ›lMÈ‹Ê\CõT)‹—|Ï©ü Üþ|ÁgÀ\°ÂtNΔä¾M/—¾q"!åP•ORñ®DDrFx+åAÅu^yzá¦H q¥ZPcãº6¼.5H†ÌQ܆KòàR‡2⚶Q µ~vÇF“‡‹Ú¾Ž‹<³` µÂmÇo¨Píy—Aͧ¢Ž e™Røz®òF ë
-ØŸ)eÏ;Çó‚«M¦wáõŽw
-]o50ÙŒãTd¢tâÅÁ°Þ ¤/Jº÷Jx°‹ÁJ$ÀZ¢W
-%AI12_CompressedDataxœì½ërãF’0úxžŽ°¿oH¡n¨‚½q"DJšõ®| ·½ë=lŠÝÍ5Ej)ÊvÏÓŸ¼T… %P­n‘23Q¨{^*3++ë‹ÿçÇWÃÓ«õ›ùPÒAòÅ“Í|º]o¾PêàÛåòîv»Á¤/új Ì(…L§ßº×>ãÌ7·‹õêkü$èã–þrû~º½Ÿo¾|ù$þ¼Ø.缙߬oPîÃp1[¯nGÓÅW¡U¨ælº…\BœÈôD¨úZ僿à ÓÕïÓÛÛÅ?ñs¦œ‚´ñúnuµX½¯ÿüz0ÂàT:È…‰9þuñÓü¶žMl®ð‡ÌG™IµÏ/G™:[Ïî®ç«í›õl~{;Y/×›Û¯“ÓÕà»é;ø2ü×|¹\ÿ1/§³ß¢"ëÕ²Žço¦·ßÏïæðéÿ¾û°YL¯ ¶áOówwËé&*ðý|~5¿êZìô[óúb±œÃ _O·0M8ߧß
-ùz|·X^}wýfs¯rLU¯©ç¿ÜB—¡÷ø“íëo¯!åÕ|»…9Vd“ïþëßãáBêÈšT
-ø›Ù<sŠ~¤RJø‘§"Óƒ/ÿýZn
-ÐŒãÿÐ F.úþϽ…o·ó•ï=`à以ÒÑw¯ ÝóÕÕd}³‹ä
-è²,[®ßñ·â7}âw7É?•ŸüïÝz;¿…º–óAž¼ÛLŸ…º“Ó«Å|_nON7ðùd2›_-–ËéÉùtv·Ÿ|¿2˜Ÿü²%'¿%¦œeJµLg‹ ÆÛåüÏ“i™‡ËO©òY¨|N%““9GEçEÑW¿à<‹(Ϣȳ¢ê““5ç]sÞu”w]ä]sWî8ëg½+³&'wEÞ«é»wóÍÉtp>?™Á|ŸÜnç›%Žâv>CÔ;ys·\η'7Ó ÎÀÍû(q=]]½YÂ,mˆ’¡¶«“ÙúÏ»÷Û ì«9Òò ÷¡hn´Zo¯æoONÏO~¸]Noß'EÒ ¬׋Õ]™)üý0_\ßÕ““F¾ðw½¹z;‡ª«9þ¾žÞÎî–ø2L!Ý·þ¿wó[äÕúÕÉüÏÙrzM?»³é
-¥Þ/VÍn¼ºœ_¯a•z»-ßx&€Ù/npä·7ÓÙüä”qê‘Íÿ9?Y#Ž¬® K'ókúCˆ SL•†®“ÞÊtN¼Zü¾@)&­˜óÿ*~½ÝL¢çw›5õ”(¥è7½QuÉÉÛ Ø£´|rí¬¯AÖ%ÁÂ3/:H/uû~}w (’œœF(zý>eÌ8/:wÎSó-§£ë·E¦o9Ӝ釨¾0î8Ç/œã—¸š_øÓB
-䓨4âz:Û ¾¿§lÓ“4Stròþnõnº¹»^Nï¶@‡°$üv2›B¹äçsâ£æß^ÿ| G¹^¨×ĦÎW³5J_^ëu´rÿã¤L>)30³þùÿ㊀÷…jXÌúùÃͼs³ Á ET€n4Oš»të"žµÀj¤N
-í ÿŸóÕ»ù@ê3/¤^¿úpýf½|}ÂýÊC7<ǯaÎ<ÁU,ùþ&!1÷Çå|úûf}wóíêí:ù’åâŸ
-qž~xó?À`AÈõ å¯Ww‹íÄÛ›¯î­ÒÍ|À¡0½†¿—>›¿Y°,Ωç«ßçËõMTm‘ä<øÏéææáª\NW€"”^Ô|¹€•øÇ)ÌQYw™Ö¡RInpEú=t®ÖÀ=¢Ošn߃xìø¶¨›_«ç´‡ë{5Cyg3oînß~^¯—EµÕOEí>™R1ÿa´ñ#Xý°â j¶ä3Ô[Y÷àZÜ»[€‡\ûd
-2 b‹Y[-ß‹–øÛ>ˆE,oq{]âS”ò#²äÙrþꈀ×÷Õ†³üþ
-‘¸[ÙÛõõ jÙƒWï§7sªsûþ‚r¾**4¸ÀÄ<v8¼‡ùŠ|0^EßÿŽ
-ôÌ9@¼-•4æ
-ºucv /x„JU*/ä9<g‰œÀ3Æù–¹„IQbÏ„º j“"<Æ(J@”`8%0‚B ƒ”`€˜ÀOFÓM=Lü…Ÿø1M<M{Bó^κÀI¦¼œð0Ýåd§4ÙåTÓD'8ÓX›ŸfIÓ\Nò„&ù4š`C¬hrE9¹4³0· M­¥©¥‰0H)d*Sq!ÎÅ< ˜`˜:',0AcmB
-kÊ<çéY:gœ eÀãSÂëKS‚Ú™!©3 U§“‹Éùäl2™Œèò‰ƒyÎ
-PM" 2HÏ<©äžLL IG†b€!C0Àï<!ð vr 7†Z¹¼ùIª9O¤7æü‘3žx{‚'l¥yä‡ÿ zRO!üœÓsæ©…^]N=åä4óð$
-¦ÈÀTY˜²¦n SxSyÕ
-˜ZSl`ª-LyS?œ(. q°Q
-ÆÓÇSÉÓ&™§œ§?
-3f+ÌX˜µ0sö’Ö“1&mâŒ4 ä3,¥©ç1Ê󕌸 sægÌ.ˆQHÏŒgÎs€±§úóÄ“º (a %rB‡q¡ƒ"T0*œLªh #ÖŸUP @
-pb(ˆ€<I†Í…'SåIÔF0é´']â®ëp-Äg÷/ÅÝVâ¤ËRLü[ƒ˜ŸE;€Ê)ˆÿPÎÇ@X›Á
-®û›p"£"íVå]Õ¢zÖO•ÀŒÈ½3VýYö­j±\‘“Š\„cåCTdáX®ÈÃ&M"‘¸*GbqM)”‘ŠŠ‰Úè#I¤Ä*IU)‰Õ’ªb©&¬Z&…r«'*R+IìbÙ#–ÂrI0&3¦•bìüCt8vJxÆÿ
-B v¡`Œ Ö¡¦A.X‰È(—xSÑꌰÉ8Øæ‰nYÍ<ç t…õ(é&IÃN,u@ç½ çØM8iùO4Y{TãÑõ'ñšqùdÇ6×xòð$…:~ÆgR{ÎÏ9NÍy幨?y(þº·J{7›
- «3¬Ú°š”VLBúPÐŽXWb½‰60cR°¼²Åÿ‚ÆJ+h0º„ô5ÖÞX“c­Îø‡U>VÿyƒbÈK©Œ… õ'$lLHà“lÎë ¤yå4¨ª¬¸²TZ¦ZD¿xx=ØOƒÛÿX•fµ:(Ù¬r³úͪxaÜŽ]J˜þƒ™´@øŒtº¹š Ö4÷seiµvk‡»ç9iELLÁ| ØÁ†Y1b‰[f°cŸ¡VpŽz[A/’t:¶kƒvÕ¤ÈÇ›µ ö·t&‘i;ÐS0yV ÜÁÄŒÜÁúÉ4, .ñ¶î`íôÆÌ¡±É;½y} fï`ø>K˜ ëwIŽ½™ô/h&ÝåŒvŸ×VUô¼OBÎ+ÏYå™Tžqå©þ#¬Mø÷â*[{²Êc*ŽŸ„0½|d啧*M_Tžóð$…™«|&•g\yN+OýàXB‹¦óöçø .ͤi»·N«6Ñ“…'‰,ªU»jl]Í+VÖª­µ°¸òSÚ]Ï*ö׊¶b‹-²¢b™¥'‰L´¥™VW̵U£mlº ¸áIª ª`å¸òÄÿÎ*Ïyô\$~ùŽí¾…õ·÷të=Ýz3éç7“>ÞxÖ>yIãÙ>“—<<{ûM^rßì1BW¹ŽÊUd®£s¡ ¥“ȤYEê:Z×»œ<IÅ«ºÆãZ7VÃ^Žján
-è4s§Â#Ç'“¨=›®—ö§¨³2øz^j]ˆ6ÊÏìFÂh îV€j—Êd–-Ò¦2‚ºeËš»dîÖç|$mª÷è³/°$Ê¢™–noPÔŠïÓ²Ídšsq '—ÃÈöm½¥
-ìN‰nS…0
-d#´çt@­Ðž\\B1 dÅH÷§à–*:÷ ô<ˆçûµ\-ºO|Œ«ß?ÁëtùURyƒJ¥‡±¿Àu¿ÈBWÒbþiŠ]UÁ«*zň_ɽž/uA¸ô}Ù%Û¤å\ÚEÍ&†]±g¤áXv›øÍúú©´ÓÊ>ýEdºiL³…ú’\RnÒ·ìÑG»ô᜚W°óÂÀ3.fÔ“H%
-p©í–û€ñ¶_ý(k|~/)·ð:£¨¤(wâh¨Ie÷­mßmמÛyM÷oIÓ¸p´Ùñ”
-H íèbÏ°±w–+UÇXy4Þ#®ðKJ ²ð| >oñ‰ÏÒ_¬væ3R&‰~ª¾4¥'MIJÞ“¦ÅF×ýh¶’ŠMOšÝ¾4äM“0õGCë5UŸš ™æ‘gMé[CÞ5 ÙòKVY‘RUt„”)–}m˜n7²>7LÓ„³‚+¹ðN±á€¶,\q‚;N rãs‚sí†Á”WZ»JÃGi×9+žóè¹(Ÿ¤â´+*l<ªñèú“?M×'v—üG’Fñ…³#•5Ð9®cY$ëÝ“ÉK@ÎáÂg
-þ¤ÅÉÿ§Fþ Ìç&u$’ç–”9ÌScbªŒ"¿uËÎf ¡¬Í)‡E• 
-Ñi¨ºQRß©î†Ôw@ª»ðU?°ºëWÕÝ«îâuV•ÏkÎ\u®ª×Ö½raÒðÉâ­"¶´ W´`éÉÇY„›¼7ù8‹p“÷&íá˜BM¼ÌR•\bé%–`b)&’d‚»1»ÇMUª9­8NZe›†t“”ÎNùf—\K3¥ˆâ¨ðìÚYݵ§ZÛO-wTwí¥vÛG¶P“;¨»vOc‡ÖÚ¦)Ÿ€0 +Ð žè,cò±Îlu_¶äcÙêîXÉÇ:³Õݱ’uf«»c%ëÌû²5än´Åã} î‰ùœ^Ï€K*Z›•„éŒseê°6®³Cn_/,øÀÑÖ3¯òvÉà¡|· ª¼uE…äÒî%’´©ÕàVˆ
-*!n*4µï<âbk´”p´~þ¸ñiÕ:>H.Ç×Øüμ ]ÛúŽ¬Më^¼|¦I´‚Ækè®ÓmñR/¦Årš'{²ÂQßÝ6¾2ø”H¯¯»Ü¯âU6^gc-§rv´Ë ·X߉O‘F±Ie/6ÞθE;²57¬ûœª¶©óluÅ.¹5$À¾JÆ1ÈÊó‹u7-¹ÊE¤Á†9·é ?WbŽ5,ºI!IÕ
-ùAsý=Öz;T&‘±~Ü ê ?—‡êbÇÊI%pœ§ìÄ¡‹¯ÖWªGX}…÷î,ÇèÎòðaüÒá¥n¥õ}ýo·†–Ÿyçð»ôâ}ÕÔèxãpß’'q˜v‰’K#E/qôG/qôG/qôG/q|2‰ã_’Æy¼Ø&WXå*v¹ø”i|ΔŒsIåÞ“2(c°ÐíŠvºëP^ÅV[ëvË‹mv‘Õ®´Û%•€§ñYÊØzÛïb ^lÃóV¼¤ˆ yµ§…-/¶æ™–cÆì4iœ2æhci|Ƹ8¦T-û¨ññÉúÊæÊ:À¢ãâI;³¼ ¦„Z=JíCÆë.¯¥9‹ì­õhµuøí:2®“ÊU4纵¶·vסñ
-ˆ2pöd™ìˆlë6ƒ}½FµP
-˜ÉSJ˜(`&ûK˜ñÍ6»£=–^UuŸªºGyS%Q¤Çº/UÝ“ªîGU÷¡:gª‹ÈÓµê?U÷ž*ã;–Þ¯qxGŠ—p<¾ÖèŽElÇÈ+6 žyÍp£?=æý˜‡PaÃË+“Ž®çLS`Ë‚(7ØáäÕ%7ó(%D†g¤Ðsîô»z0çGñ#ÙjÍ”dÌ,¸QťOê>'u_“ÈÇ$)L"ß’šOIÓ¤~?rI*^#uo‘úÁúv±ŠÇXr˘lœ¯ÇkñK*QÂv:ŽUƒÙV½² ¿ìºgvÝ7{‡gvðbjzf×}—ê>KU7¥È=)y´h8=R”‘<%xòmáFêŠüç}ìÊ].ô¨’
-¬î÷¢ßåB_SÒN˜îRÒ F íPr|Ì.Šå+À:ÆÎé*%û]ê÷°8”tÓUJº_ë×ÍàVPÓÉàÖüUÊ¢±Cçar€RäTå¬P*ÛµníWŽIfyŠçF:—&Ǭç?'¯c ÓÞºêîUê£VËÖŲºV¦ýÆ_¿ñ×oüõýÆ_¿ñ×oü}2W£î»ºTÒ½T›%²ÅŸù‰d‹vá¢êÈüÿùÃî¿$EÑÆÕ„-ût÷….záÛCi¥/÷oùU.ØßÒ4³üÃdWÜ1rH&2¿ìW®ê³~ŸÃú[t„u›øس­ÏÀ¶ê7=|;zÛÝÚ)ݤaVn¿½j]n;«ëOë&ÁxÐåÀnãN¡–3»IÍðܼ\¨rÁPÍn:+­ÐIaˆ®^4Ô0G—Þå_Gu7»výê­{ž¤C¦æí÷<õkÀ¼xð¡'¹÷st’ºÎXmª,)ȈPò!d'ÍnÛs·üŸu4mLÔT˜h0 px>Ýûn§ÿ£ª»eÿ(2ÍÚÈ4«³=™ödzxdú©Hé0#nØ62µ½E»·h÷íÞ¢Ý[´{‹ö_Ò4Ô[´Ÿ@hõtugî”M³TW Ò=Öœd—Mæ^y¸Å@ö8«Ö½æ§¶£†Tl2òáH%È¢ÚK¹ÙNѵ[öÏŠ­pòƒÃÆý8laF‘æÇ65ï«¢ßÆOá„–ÔL姄]üRZ:Öž”ƒAßãû`ÎO‰Uÿ9ÝÎ7€Hü
-›€;Äî3bù–òrbü§äØÉqšÏh 8Ç›ÓIÑ´HË:Š¯l!$޻€òEã‘„UÊX¥”UÊYã8Þ±—µüý:!°ké`ßî\;ÖGNõ±?}åðf^8Ã'XïüZ„K¬†I áCXÄÑGÆN|Xl»ˆq-iAVtѼ9ã‰yŠ;ûbÚMÄÛjºâ¶Û¨I».gW5¨jyèU‰ÚÕ«•B÷ˆ¹tß}Ùã€ÀîÝ—êžJörš,»ºë·çž_dÁ;ËX»ìøé6+£GY íŸ¼çQmORk±í1íO5óñ-£€ì·YÙ‘”wçQôw¿|ؾóYò}UÝ'AÔD‡º÷>©¡µO´¼¼0‰ˆnR#¾ê®{Åœ^3«û§.çºÜj‰Ò…6yjP‹Rø ] eÓÜÄçÞdÝóôˆ²dvÊphh%aú°©3aHÆI3TêŠrÖŽŒt"jsÿ²|þ°œBɧ —“ótêTVÙÙ5ê²ñ cÝËP0 ZpO  ‹«°eÎD“¸O¡§”ô áõ÷ëÕ›Åj»X½#0þ|ƒ_ùqºAp’áÙbz½^] &woæ· !VßÙÈd©wÉ3#*ÑÀæ#ƒf¿/^ßQ—…ïô¯èõßàçÿ@â=ønðÿNW”þëOð§Våu™äk\BR­¥JZ(zÙ¬ “V-ů»ïØ™èvà²&W¨7ŠÌ(ºú5ãöÊà7È Í(Ç“ð˜6uFåÐb.ðMãþ V)3ÄÂjš’#Q”½l©ÓÞFéJ€lm¥)GVÁ°âvâ´ÐN({ÙR_h'3#\ŠòØŽÉG©9ˆg2”Ó€Òt®d¥íz}õvÂ|ÄíPŸlK?}Zh'žËz}¡ú|`;"ZÕÙCÈ"ÔHHõàì¾mnÜJÜsßJœä[yWb TuY27xÿF\>N 8Ê^¶ÔW‡ •Wº›‡p5À&n»^_h'^L;Ö¬N†­•@™¶ÚŸz}õvbÚ í<„«¡˜NêõÕÛ‰áÚÙ9>-´â^_ÛBùÛâ±{l‹“<¶=„-oyÝs
-9@0K5÷5± •ìÚ™® pWw$1ˆ® p‘ue!_Zi¡-GYteå]Yì.VÞuiêÊbw-M1SóÃI«tÕ‰·Öª©Õ"­r‡N<µ…bhçx×£rhÇdו¥ÖëÛ—uwe©X·Üͺ»²Ô6VÕiùöìÊRw-ß]Å‘/­´Ð–£N]‡6 3#—iÕšo×âðÐbW)ïñ9´Ó–¯A~œ1F‡‹±¥ë"T¯oßÅ®­Ÿa<mù‰ì6óô_YM;­rµjBí¿$ç¬:®å§Gé^Ž¿Œ7w·ïC=ÅÖ¥ ù+Ð Oáÿ¿þ‘Ü%ͪ]¯"­jhAûЮáÅf i qÊe5%50 –“¹T3…J­ Ø…º¿UÑ®:“ŠüÆrçr4ÀŸ~¢û¥m&é¼´5’(Œ…×Y¨ô¦Á¿ãQéÁؘc€ò¦4¥Öq¿s èIœ|YKv£L[RTG{jQÅ›j%J€Ø"sžª2H®U#aEš×{²#¹¬äM¡äÿÖ:†ëÝõíh½}Äm³ó&ù%É_~5øõ?ÞкT
-T-® jœ\ •Å½UC?;r©’ Tu#­„l uO…
-ª}rÆ“\TÙ˜€§FU÷(TmÓìrj«.ùc%EÉ‘asBÁ”K»"ŠE\¤¾óÒ‘0NFu_{¶’9’ÈIœ(ö‰èI­¤î*
-À²ÔæÙWƒ“WÛÍbõnðåx|:›Ý]ÿ´ÞN1ïWƒ¿AÎoàÿaz}‹Ð;”¡.ž¤ê›ï
-(?‡N8WBÑòÐ 9uYEAk@bÑEbÆ‘ê‘"‚"sý âdEå2YE&nHÔЃŠÎ†äL˜Š:÷µú­àÀD˜Žiî{+UE«´´ÎÀSCQùNøSÂQ*^”RåMHVZ„ç|¢i‘˜e~±sÎÚŽ*÷
-°„ŽÛLÈ0© ‰VëŽÚ3Zë¬(àČЂ#©¿Ð ©,‚cæ|oM4™Ìs?.ã
-~Pƒ'†dÑbŽ]þ„ÔÜg%$¥_¥q®€¤ñ‰Ä $¥©"H<@rà(­—ràíµ_WJ
-NAÞh´¬ š•oš@Vzâ%¥¬%mSUÿÔ Ã%æú‰@ˆ
-Q~±!‰¢ùmæW¶Ì(åEis¿ZÁ$‰mA¢Aì‚L F ð’AèbÌ™Å(—j/‰ÔiŸ˜ëBŽ" ¥ê”á•“>±è
-ZP©òyÉ9•µtÖ+‰©´^ˆÕZ’)55—µñ¨áFOgÀ/C¤Öø^çYQAˆç¥k©ŒÏ dᮕY¨µ6O I¨Ü¤^b5¼÷É ™å~r#@Ê
-«]È ÅªT‰NyÕÚ 7 ƒl*-
-@jOèYæLHòÚ<ÀÌå¹O,z€€$·
-™¥‘ Uè­öº2ó˜ŒÕ)xb8ê°ž8ìñ§‚#HJy¼Qæ cŒ'>›y•_Tûå¸QHóV‹Œç,3T˜EPø3Ÿ×ˆ4h.¹ •gô‰FˆÀZ5¨ÍiŒô¨x™ðÊDè
-3x‘;‹ÓÍbûþz¾í>¢cb {óïCg ËÅöÇéâ!9ùøt¾Î
-ÃoÝ!ôÛs
-õ½ÝË;ííb¹ÜÇchù îÀr\EóßS÷;°Vê «Î›âµZwoPÇËŠ|~¯€åÓ¬½.´nöbCœÿó[¥;éê¡#
-UuŽÈp Œ}D;t¾þw(zû°ÕZ©Ú~)]‡M¿º3üý½åzó] Àcá/Ppêòÿ­ññ ¤ôYŒŸyL?¼øàÃcØYçèÃcŠlwèôÿ2]øÏÕÏ÷pd?¿à
-œ·Ó7Ýa| M9輯CcÿýÌ`•2ÏŠën5û鈸ɋò‘¤ƒ¿žý½Ç³gÄ3ñWagãçr1!e–ÿ¼™®nßv¸Eâpðý1BÍ¡ j/Ó$òÈ“fÇ` ᡈ\ÝÛC<dÈsît¹<
-“ ¦¼þ~½úª 0%CNÏß-Vñ‡äûªCó§W®ß¬—É—ãéíoóíWI:8…ÿÿúGr—üŸ;Ö¼ý¤#kR âÜ(³yæýH¥}u”§"Ӄߒҟã×ðòoðã é|7øǧƒ+¬ø§d(³‘J…H;r¹\SŠ°RT:JóT †Rdf³#笄9J3«‹„IB)Y™r™P¡¬,DµŠ¼¨Þež»Ð.TaaÆ ÌH§Jaö¤jw/“·0Ž³Dè‘‘Â „ © £HžI¥ÂŒDž©œCdŽßýû,§3[æ°µlµIR¤á»,S`tVR+T't—r„VÃ;´êûUäеtµIc¬8
-šIŒÆ_¤øÞC!¡³r¼f¤ø{1~
-²Ã@#5(€`mYÈ›"íI P*@˜«T!f‹|”KMø2J.08Cã °ŒZ]–™Dc5£\¹œÂÁZî qL‘ X~ËÀB¡æMüÚ Ó ˆ*”SD…i^gELLªÓ0cˆ‹}ê\œ¤¡°'@se"൹C¨K–¡| )3—ÖŠ2—i鬈j*R¢‹´¢_EM¡ïõñ͘ûü’|ñäômEùâ5 €DÃÄ+`,Às EIíä§ùtÉn©oð%È…êGûç›Uþj¹ààŒ 4þ}³¸ú÷9yû|ñŠ×ëe%÷ù
-mq¿[\±¶ðÅkã%â(ÓO pÞn7´©ù³Ž¿x-›1^âf[f©÷u’¾üjðëF0‹®mÂìÝr9߆ƒñtöÛÓÍUE®½c‘v—¸*Òš¼
-|S2
-kÍd†oCøx¥ß´&àAký
-ßãŒøÿ¢PE?€f¢Ïq9ŸèŒê¿L¢6£<ܽIèçe2~“êñ{à&_þ²B-âjðn3½ZÌa®³¯ð+ ºF·kàŒ2“~FÂÇï ~c' ÃËÐæÀ,mŽäo
-~ã!Kdظ’ôF«Ÿ§ß4dé‡,á[”G*ÉÆDe†œA# ÐDí ãŒCß½IèçerÁC$ï#¿$4à_Øj>2ô›þ_¾ù&õÀ·?èý×gð‚õ€…xÿ!ää¢È©}¯‹ú‹F|/&IÑ·~þ‘^_%Y ™×ðé†h÷ IŽŠ_û_EµœLѯ}—ô3ô» g¥|¾Ëâw9Ôðmèëô?1kñ½(âóΊþa¶wAðåéj½€ÊG#Jq<HÇ2¦cP5!¤LÃ"{K ,ð°ø…$Unp5Ä•ûÃë~îMx"Hìs&Ï£þ;þõS/X +>Çå|n
-Ç%'߯·?ÍgëÍ€„Å]3^—^&§ßþÝÃðç·ëÍu8oC"ð«õ›ùëÓoó×ÐÛWxcÜë²åHÐ(ð (`ˆÜC$Hs8±@$,׉ Ì[ú•`ÿàO«R]$†™Η?Î7oç³-KAÿ:]]-çõaí’﯋¥»ß‚
-Ù„rÚä¤JI“jÔ¨QË
--8u*Ðh–EÉðŒÅ€‚ˆ¦ øº´LM/Oöòäç”'m'yMÊ^žÌ´*’Xž´-â$Z{vÈ“ú‘ò¤n‘'±/PšŠ@©µ-zYá>‰×}%œU…L©-
-M;eJ´üèQêиÙ*íI´z©ºL™
-B¹P#Ub'ët,…æÚˆ¬X¶°”ì^W&á-`„uÕŽt&ò°FÀ@­1Tf9ê€Àú2©+^MXÚbЊ
-»Öl©sSóoÚ·éñþMÃ4#këˉÑÚdV‘¿·UF`¸ XóÉñ¤é¢+
-š63K"ÒVDĉSü$©PQDŸDaÊ\ƒHQ¨4~õDÊŠò4ŒÎ€hV¤\„‚ êÓŽfXRÃœl”ë”g¬2}“€ß-ÈgéÜ
-Bíhº9‘0«œuN,¦Þ’Œ¥Ê©gä*¦=ÃH{y<ËŠLE)›ÑŒŒ$Ï84˜Ç³Nï5šàÄKO™”Cë.g•ç¾oŠî—Pð †C€g¨9»“6"p™ püR>AvåŒÉQŠËßu’Qä¤2Å`(œÜ 2Ð
-Åî%)CÆäã†qíÃzÓEÉ6l Û¸±©¨ÅL. ­ØÉ´ÔŠ¹)7BéB”)©·ZÑ ~M…ÉfFg"ª 6¢\õâêÇ]‹1© ©£™¨˜{Ç3]ZŠ¨c>±9À¸¬Žú×Ëøµœ®²Ë¡Ê>œ2‰»S¤’&_b_”X¯±ÑhµÕ.ÖTq‰ eçêi—mó·3±.ÙúÕ‘wž+°¡…ÒVµ;ýKüÁøÿàO·ZjÉ“,€«ñŒpÿ©ww>Áê{1ý}½Ák\ªëîÿñ ïÞÐ
-C#³úæB
-KÒî6²èä3’wʺ¦@ä2lèb\ïÐ7rmb»X‘‰j±¶¨…š‡F8 yÑ  ]О§C ¥øÁPxl613
-oí§eH3§L9sCš^Ô>£þÚõ½ÈíbÄF>{‚qÊqâ†x†Æf¼™À’¹°"</^ªL6iœ•P†‘(cÄ-Ë$‡ÌW5I°ÖQ»èy$„BÇÞ”l%4!è{
-ÅñH ±Ðœ.L¢Ý£,ãé£TãÅ ¸‘ƒÆà‡àOVàꀦ]Ô't‡Š"¾‡»I6¥UD{“=
-Ö4?xÝ ¶3D—1‰[JÀ$•|s
-]k€~lhÀ¸ ã$Š"ºL%®q²L™%‚–(Q&É‘Î…ä¾™j„0ä匇 ±™²”B"L,ü$f0À‹‡«L ÞEä“
-ãË~ (CáV·¡mSñ•6ÍsŒ\#]ÓË¥£+)ðZ,š‘
-C7€àeÖð4kdIÆj)è¦ ôßÄv´Ã]\jo0¦9M¢¾a!\bhùAFo@VS¾­Ë$‰’œÓ–¤8€)ü¨$Ðù
-3âB šX¼í
-A¿2¨¥.FCíŽwg ¸`‚HdÂ5ز±¯AVÞôOvk2=´•í#ÙœoÔ€`1öNCî4]¥hS Ç•Y¨I(šŠ¦|SSHp~Ò©'a ²@Ø1äA gèP#F$R LØÓL
-¾å%Y$¡Pe ,·V}ÊLêD> fÑ©¨èR³ÌZò)ÀW
-4 \Ew‘å/™â~ؼiÛ¡açVt¥(RºHv%Ž~]¤(9bfëü…ÈÁˆ¥£¤!e7eö"!ÔˆëqHB:#áÁW
-fJ+-Î]ä
-ÊQ攇QG 3@™àg/üã$’•Œ„PS³afèß™gÖIC*mÊÒEBÔB”æ»QÔÃÝ Ý¯x,abæ±IZ­éµ`:jÁWê)Qƒ> -J|Vßס¼7HZüš0k2å·ÀŠBáðÏY‘ä{êò>©Êؼ¨p6~ÈI©Ñôu”úWï96>NXzsr3Håš3‚Gg £¡7æ¥1
-ß«"WÑó¢¦Æøž‚ãšÌ/|[ -­ôK§™Ú½è)PH3A¦`>t]$¡å_òhfr²jÒÊû–ÝÒ°’Xoõ)|
-D—U E3ã1¤‹E{q¨Åd#ÙQ*fIèK‘TôßWÒÏ 3,
-Â/sþ7ÆÔ° *\æt†wXÇ̘”ÄÓÀ8JŒÔí/>§[£ÑM¶w‰»9 ´Å —@qZqC}’HRN\¹/m8þˆ‡'$ØÀ"Èr†¾,qàÞ±¥;Ž´à èy«D¢a™
-/™–¼“\Ü‹x ÁkC§yÞ©Õ1_šš;ão ñ–‚ ŽÀDhöà¤ìãÎεæ£OоÂb^áf—…1êõGß |ŸÜžÔfDºýî·*ѶWÉ)ð†ÜfƒaâñHkع'׎Ø1lòdÂ¥HZ:«ÝX.®é¨ÈŸ:Æ$\²àÍ£p§ßsÞ6Äwt´™!SìñúîÃÒ%i,)ÓNn€g$¾Æžö¢Øß8;hCM:½%æGmX\ĽXÔš%Ò{æ…"1ÇL†¥1AðPÌ‹2¡ô¾4ABã iÎÜ㸆
-ÈrB´<Ïè/i x†Ù§…ÅXÞßË•ÁR®¼’Ã’ø•¦ýÆŒœÃ4
-ò¯ð¡Ê¦½LNv#— rb ðE” T¤œü8XÁË[ÙµIú%£„D[v
-R$EÆžè¹ÉFP¼Ø˲)ç,oÅr’C*éÃÒ1ÄŒ%nH=Aãž¡@äÈÛ(íæï–ò=Àwì=
-öa¡ÌˆÎ“¡ù,’K¢°i ;TfîÑLÄà®"›¢°l+ö*Ôj
-ðBÈcžóÁl£q¥ÇãÒÒ
-—±›
-Ïà}2”¡ç ]p•¹œåQ‹× ¡MØâ‘r‘ždζ3²$3‰ Ãeì‚…D©bÃ:&hÍ…rT¸I³“ä߃~ ´†¿{†þuä%Fâg!'C¶´z“'HʱuÉQQ$ÆÅZ#§2Ô éÐøŒØy, Qª5ÄÄЃÑÞ£C0—ãMÄlT»˜’‚Bžjl4)6Y,ß÷ÕœÇÇj-N‘ k ûÊÓ_Ÿ
-è§GJ‘¿ºÈ-†…4­Å& @PbÔB“>ç%õ{-…â¶]Qfщ˜+‡j(zü7J£v:âà# äÀ/EGÁHU–ÎxsmEÛóÚ$UfÙ»K(ÙZTg<ÓÄ~ð˜6íÖg`^ 5å™h2Ú_)÷
-<()(‡Aë(žÄá-Uð˜…ȃ€$|´;`àL:v¢ýñ
-ÔÿðoŽf/E§Ÿhá§ÍeP~Á@ÁäšGgo)t¬´¯!hûùò¨€Rð>…xBñrȤInz#zZ>`Cçnɾ Ü ™í¥PTM˜]àwõùz´„‘›”ŽEM}4ÝËFwãg@°Ç#¹“Þ*Í ÜLél‚5j€wŸIÍÁͱ’ÍarŽIª²Œ™žtD›æÀ8Ä]K~³0¼‘t ë#ˆ2Ž3¦yÔ¸‚;e_µ[³Hó%<¤"¬#³r³ Bå×fû(ÇpËã®ý%‘ÆáDçLJÃV ôü†åè㥌ýaxlÜ¢p¯»è[vAC¯ òî*’ÐÍŠ6´s¼ –7Šç~²}=÷n”4¤Òº(]¾‡Xsði6X |5xRwµÒò'zâr>¥ì³/ÞÄNj¶¼£ícK>¢âœŸБ`baióŠˆÕφ»ÅËX¤fáV¬­’ÜÆ£+pÐÀÜÖ[êqÌFФTèÍ¢ï)mCIÚ^æ¥þñM÷mšJãKÀÓà/U³XÓEµ‰HQbTB¯ÔG _ˆ±:A·P;Œ=(‰tÁ¯O?¸ÔêZÜ°‡rö=›òÓ«W•C)E8Á§<
-Æq,ðè@J‘ùÞ.Ÿ¤GA”Ö$sä¹`K¬FŸþ0£PxèºÌb«uï¾Þ¯¡$:÷M&
-®›¯4ürMZ|žÐ×¢’úxÈÚqë×ï.ùö ðêËÙb30Ë×_ ¾¡ãE)Â>Fàv^ã#uJðö,µ–Õ2JÂË5@¸2¸©Œ»±Êò–i*Ín,
-ì³ ¤‚Ö£,s¼I擆x|5´Kò¡ñQÁq×ÂЙoŒ‚aéV|­aÒúÎX2 ” Ý6Î…n¬(¼ „KY·ÔŽ£€œ³l¦ò)x€ÙYßiN hr™È1ÅâÑnjÕ
-Ü“4_Œtqw&^ÞsnçT @êÉQäÆ¿8÷”lØ'í…l{5Ÿnfïa÷ž>þÙàQðD½CR,qâýÑ-²)@pç4ÈìÇo@u&H©
-j
-ø“–D ‘ã³ûìƒ!k¼/Àp]ˆþèµNg8œ8å /Q[ÓJb$6£[ qo6% µIÇI14úÊ[Ïž$;“z Ù’Ž'PpVHÂëˆ(^Lêßi÷oQæ#¢¿Ysv–„¬S)ùîó)wþÿ8\òž%i
-®€0qoµÌÖ„«Æ/4í/^ÇèöšÝðº%Ü£s>\Å–ÈòaýH3ŽÁ¦||}<Á!åDt¥DÑUnë|ÆZ•;ßÒñ¦Ðí_J‘Ŧ^sùÁrTºá’¿›ŒN‚S& Í&RLˆ€h=Éi@ˆÅ°Ò$É©¸ÿ©p(ªfm–àN›Xd%4‚WÚÁ5º‚wŠÑ9Ý?±khÁïŒqbL–)=F$Á@*$ö>äiÙdÊןI„b˜òB¹r|J“»
-Ez¢˜ôååÊ)ÅCc,XúIA'ƒú¼…Ð[!$)Èwàá>²Ö†$@t÷„SŒe+6›phg‡<@ç-쌂9pØÞ@Æ hvƹârŠc /Z3S<$ª3¤lŽÂ‚¾;èÓèàžÛ$A>
-)¸ë†z€Ý€Ç–SŽT"•¤hV2ó×uÑ¡ŸŒŒqþÄ‘`+6Æccçe32YJ…$yî‘­O¥²G"š°4:þhŸ
-¨'Ë)º\Ë÷–jš5{Tv¸ãª)ºD Ï à °RðÝ ´]ŸJ²‚wCøº)Æ_χnwÝï†àš€¦‘Ýetù*]¢È”} I–¶°†eˆ ‹áp+ŽsŠ>B÷íÖe9:iøë¦a<ÀȨ}I0‰áp«Ž®4À] A§ë4…K$r7P¢?'Ö £Ìȱ'[‡IÆs¥Öpx”Æ÷a£’a³¡a³7Ãf—‡-¶ŒØ2MÖٌfû²v #ðL]0ªE–Ó(K9Æ^Äs|Ï7žõÄõã’Há'†¯‚¦ÈðVaiõc¥lµÞ––£®Õ^:„®Œë‹×-ÕÓŬQ€uÆÝÃû]kݧöÅèXj®çÖ*Öi›ãJw9,oyÓD]í4DcÊA²ü¹*Ú8FClF.-ÃÈ3÷Â
-7'žLÊŒ€0\Ö„ÏR¢WLÁgíàÙ¤ÊïäÙf+
-¨Yj6
-¦ü¾í·ŸÜãö«?¹š€Ü¸ÿ!Ã’W"“àÏAà³?ß}\EÕ{ûÁ—Ó‡"ˆÿуu ÅÑ€°D#%ã?`\öJɬŠýR%O¸V€/­):T‡\H¡ÈA„:üAÁR…ìWÒ|ÿ ¹3|gaG5#þo‰õvÂØvÏ#n¾'§Š¢ûÉy§wóWÖ”„ôGîã‰
-á癄=ðÊ•ÃCa›'Gr)ý¹D_@ö´E¶# ‰Ã2«?„ÃUGpã<2Ž!}pÚŸ-U
-ò«²ŒáØ“XAªæ¨Ì63 ÁßöPÜö‡ó/è!Ðß̆§æʤ·²4TÙñx#€‚¿ßÞ¨*”öþl¤U´
-è…½ÜÆ‹þT) Ux sH@]šmQOBÌÊ{bÀÛ½ý
-Ù^—€Á“ò0:ƒvQÓð7(wòá=긲Œâ c•Kõ¤2ž`RäV²Òs‘ãËÍLÙî`<|<îÌ Í6+±ÿ·ò’¸TH$•ë (©/ooè?(-G»Ùö‘©»Ó TäØÀ]=þNZþ²-±wž­æ•W÷À+Ìñv4FÓ76“¢šé4-G† JÛFÊ!ü‡°ÌŽFïhúŽº¢°}/}¡ÎN
-{PY'ñNíßäÉþKî èj{ zTŸê8âOq¶X‰GüQò@gÆÀ'Ñɘ²ÕžD»|ÑáwòxgÆ£
-±n¤?ÜJò¾rE†O»Ý&ýã
-ÝË`qôÆ`ÙR8Çþ°ÕðÿŒþ‡dú’ˆõ‹ïSÿŒX¿enü»yÌg4ú²hôΪ
-ìc¿šBp7Þt÷r~~Èùù‹)¿øBþ&` ‡ÄyŒEws_¯Æà<^àÈ° Eä¿JçwXwù.€J&X’2¦Ü'UÞùMPöùŒÔwE¤‹·Ç|wDº‰'è…nª $/ysOé»@rÕÑco± Ž¯‘
-‡¾àéO
-SÀ8žø¤ï HŸ‡P|Þ#øŸ@[PC),)ïþÅH꿵z¤°s?^~ñg“þ3ðò™ïüºÈóÑ”ïð8˱èŒW–À•t‡"¨Ïg%¿ÉrÿoUL’gÿHËm_TµŒ,¡Zm[¦ß
-¡>×i–ëÿ:ë´ÿ•7mãÿÊ{¶q û²m_7xàMÛø—¾g›%n¾h›ÿ|Ñö ±ãË%`=*Jªh
-)×Îù’Výáÿ2ÆeA¨šª€ð‡ þít ÿ­?H{ûr¤>ÓûºS!Ý»
-¼èë1õ±Go©Ì>£g‹s?|]nWúØ-œ1;q$ W(xgHø4ÏOx
-ÞsâXžãp”70 Ÿ@a1žƒo~Ϥ0p÷ H (ú6‡‚3¾ÿäíù"Áp#£úÂG}yaìw½œ_-5<¸´ð?Ú‚<
-Ñ€ª Œöa ®`ªypô¦—=Q]áv…Ž!XE™³^¢² ,÷×iœåIõƒ4Éó'²àßý@Fmggðƒt* î ÏcPˆƒ‘çTéþødOˆ3<`²Îr<Zã – ht¾K°™çIUÔCòª€‡¢rcà2ƒ”ƒSº­Í’ Á0Œ§¥)dŠz4%™£BYžÃÐa/`X¨ØS ´¡pФ5§6èNà»èƒöùóÍ@mà88ø4ÂN=@qÇ Å>œÄèc#„³ hDó‡F JA1à ¨á¨5E!‘,äAƒdP yTðr|þ{ßGâýœµ¡1ãÑŠ#†“ŠÖyŒ„à÷ê¦0ÈbXŠÁi\a‹gÑò$½×Äç
-
-Ï„fƒì$)–FıHÛƒ14}Öƒ"Ñk`áñ=(‡Œc:*€¤Ž|áø‘š£ÐB+Æc…¢Y­Àcχa Ñá4{ð"®%€L‚£Ø£Y{(eá q°Ž¥IÄ:M0}r¥_œ„ýrÜAnØ…b4Å!å’O¡çø1`r{–€²¢
-±D)ã ´C gÇíÀwÐJ™{4õЊq ;Î"M@ûƒÖ‹ïí†Wæ’ ¸ý¼à44à|p˜ƒÎ(ž¦9Bñ7À,lŒS8öth‹ü€TX<Ø0ØGçoòoãpzï¤8ÈY¢È)´kÌ‘"Å0Ž~¼7kâ `’…^ µ€QŠ5œA
-ž2
-mŽ=:ÂT;Mï†#3§²Qò€t8 ¡ª;¶d•l´ pÔ8-G£óyy Z¥%E&ÈÐGVñ&Žä)å´+F‰8}b/+T>œ h(G$qš§I¤}œ#`', àMÏñØaºh‘8ÂŽ8´e’‚ó@³†Úr>«K8ÉŸÃ B™£‘ ª 51ðpg$°ôl°¿ËÕl¨†D·Q@{EX`J("Ð4¥4å!¿Š¬Q)–U< ƒ|‚#YÙlô
-sEV 3öèû
-bÿ¡ü <…†"q
-uçïqóÍÕò·ÏÌÜ}îñÎÝà7U,báÃBö†(8¦\*þ½H"ìæÿ=cÒÄcLWàŸ@3 ¯E¡1Áðô`Æ c¡X„$;¨Meq±wú!„t|úžÆ×Ë«óoéþìË£óß"’¼ÿ)+ ª"Áõí²«ïÄé‡RpñåìRqÛ—ß%
-Ùž“ÍÅ·ßT;Ki)< QÎ…Ñ#š9P~'ÃüZ¹³å0Š? 0Ž¢°Í !>–ïœú;Mÿ7j¿«‰‡äŸõ¢ðˆá8«?Ùч»ÍVZü(WÿPÌùÇÃÂAÒÇMùÇÙ¡sÓ‡«ý0>{Ô¸_á‘1¿ +ÿ/ÝŒÿü…£ñOvƒ8þîXŒ4a‡‹˜û=ïÉ:ö;U?œâåÏ…a#q;Ë“Éõçl„6G}(ÖžðçJeÃq‚·ƒŸúH®¿‘éï_@ê‘Yúë!lùÙÒ÷ÿ¿'Æ@eìVÉYyêÌG¤zÛæH
-tž-\!¶q6”–`VH‰6YXI›ÙV’ÿ~ûtïiÃzÎN2:^¼ ˆ%© ,¢Cë2æ``tWšp˜ÊÆ=ÞŠ8jN±¥œ¿p53ñ¯ñýÂsöÏi£Ç‘Óû³vt]–§púëÄ»°ùò6€õ]UmåH±Gê
-G*Ñ_ª/œ§T6–ÿ‚†?FeFÓPe—"|¹ÒVòìþVxPi ·ûB•Ág‹Ê~¶Âp–D
-û&umàYBYøóA…‘è–_¨0Š`~…ûM
-; ©bïjÈN`¬Ê†“vœ8œÔõ¸ªXÆŽqÀ¼ÖÎÓäãÍßUþ8F!qXž¦®åù:Ýqw1Œ ì4Ás@}œc1î‹ÑŒ£ìK@‚žxšøÉ
-ä0†T$ä¯Eú: òwâìD5g§(ŠüR<à—怿2ßÁ_¿Mw8Ç+²
-ò!ØaÀ[™¯Z !¾@Ó?p9„ÿQgo—C>T\ùµ¡E‘Ÿ¯7´&òÍz{»"ò¡ÞPñzC+#¿€ÞàÒÈ·èíM ﯉p °_¥1ŠØ·ý.ZûÆrÔ[—o¶¸[‹JTPv~µAþŽzü6ë£ ö›õøÆï¦sƒµæh
-ÿe,ˆïc·ãë}ó¡’ı¯Iæ`”%ù/kú##-A_ç¤ßMƒwõI’´ÊF‘_¥Hœ?t@áLü°
-½{ɆãÜWkÓFr¿Š&YŽ ¨ïÞMR´HqÄWk‘f¾¬íÔ"E?J‹wï(ÁÁq0,?¾òr–ÑÌ—5ý‘iEPW¼|7 Þ¿¯„ƒLñ<Љò›/O‹öíüËÚÿ°¬ˆDüpK]ñóý4z÷NÓ)Ó$ч¯Pé±þË:øá™&|žÿG)õntJ5)ö‹ï¼ÓLš~¼íO1)œÿ!z¼[Ñ@\A£Xæ«Ò!~ßž¦¿¬ýJ‡€»C~8xƒû… nWq¯QÞN`ôWì@¢*ýÂ~Ø^$z¯S»fèžR]ªãÒÚi¹×Ïa¿iP–V~Yèû÷OÄîYßÞ<º_:£éþΜ oVÊÓ´Qy6êÂMµ…ãžVž…þ>aôtJ~|AÙ5aPÅ ´;ìá% –aßé3"J’8nn%N/5¼¦ÜŸÏ;;·„æÞ¥†¼†ÿÚ¾³¸$­Î¶s8{#ç­Nsb)€öˆjÏÆ»\ 鲫þð¸!—æx¿£ß“*>ÔÚqÎî¨y®$+:´ûY‹ÛþÑ=öù‹Ã<üCjªô—³ÍxøYÔû|VfŸ€¸Ð¶¿^9Ö¡N^_Ž„¿ŠÀœÑÇZCÊ83à‡ç5¼1ñ,\š#ßÞ‹~×p g\™åC"FfòæKgð8h
-RÏkD¹b|uxœ>ü¼‚‡˜ÇŽ:¿`¿¸
-G½Åž^Îø#Oú†f˜ÝmW»­ª€Œvÿ¤Ÿª l$qwzˆ
-§/Ú¤…ÍôƒçA Wž<SÍ
-B$,IªC©óFË(ü×J’·,X,¾cº_ø9ªPìÿ羡©\…Þ¸„=Þ·CÞI}Q+ú«Z1_ÕŠÝ·"¾¨§´âl´QÏçñ Âöìa_Ô
-¿ÅÇÊøG…RZ‘gvûnà•AÁC÷>R!öX…ÁÛRÝoÓ°ƒ
-¹/lGܶÂÛ‘_Ùîû°}=oï*þ&ü”7‚*¾€Ï¿‚>–Ä‘ ߆)¸r_Š
-HcÐIž€0–y<þéʯ8:j ¿UUgË‘ôçm-œÓô诛â¥ûÃ+½Ÿ]½¨ÄŽH„½WÏ¿Ì4!]¬”N TEÅ‚ìæôZŽ›¬]¶sz ؽ¾Ñ['ÏOk¼K­p^¬¶ÃTsskÆ.›”BUxíùb~ñ½-.N{'dHéþªôö€”[äQ)RÄÃ$]×=÷€yÝ)az`Â@^»¦+^ÁíC&ŒZœ¼Ô¿yã…7fàD²ÐY©Œ3,Ë8ýq+…þÚy¯I¾”׶¿•õŒðRì#ÙyxqÝqö6Ù+5]¿löRký?„ôNÜÎ@qyȪnéúf'H'ŽÓ1+ŽÕd1·`v¾70øŠï}º÷†n$ŒaÅwvüò­._¥}0Û.ú°ÎºÎÄßPÿµ²K«Ñî‚Íᘉ·÷Îi7[ѾZà²x:pâ‘F°
-ä夾&)7öôûù–^7vñTBß’k¼ÜÚ7 °ÜÞ'‰+y,½‹s²¡(Û¥ì@yïÝ=Ú¡´Ô[˜ôÐ+TäU%wA²ZÉö©t¶ô>ÙŸ‘ŸX~›J!aÅþÊþǃtwŒ’mA<;«ÿÞÐÈ#yc–°´Ý-ýî°â“qÝdøä‰@Svù5\Ro¥Õô"|1Ô©”¾åo“kÇ%±w(åkÊ| ©²¿\J§xù–_DtX®ÙÜ1Q…p·¾YN¸rÅÍ´1áNWÐ_ñ!
-wˆ "W Ì–c鲡|˜“ãâÜ•î.–ãn*b¥¨á¾ xÂö’îzAKß ‡Ë{€£Ð¬ÄÃÑÆøm*d}Q8óÀ·|oV^,ó0
-+ä
-9LÍ)0<EÎäݬm(½?×€
-ÃÛÚtÈÑwë#jKC†£0ðBõ‚HžtØ@§Ðg‹7âÞrWÃI…<h ÷”Έ:¦[Ã,^oØJ„^&ž}?UÛ5zÍtÐLýeô~@HhŸÀž$(ô­„ºHÕ!aóB1 æuè/…^-¡±#¹÷û†ç
-À£Çà/ˆ+ó9]¾ðg ØÂÔl÷'ëÅå“î Â×»¾«ÏSë~2ÌúÐØoè\Ä€B$Ò5©§H €¹K¸=¸ººŸ}x}~iÎZ›AJakièZÌWcמ-^C¢«þ¢Õ· ÎfùM IJ¡d2f‹¸Ã´ ]…²LÌK…¼”öéb³Ã¹jžü“å^ffÊW8Ø\,]À²ŸÔ«ŸÃ„é¹Ä£Á”~òÇ=˜0p¾àVcðåø›÷IwÙF¡D¿Á¯ŠAÔ}eŠ)"¯zPëã
-S2µS‚¿¹Pg§QP×*‚,ß}Ýk öX¼T&jã‚W‘/'U*Ä9E‹Ë‰+TAéó8ŠûL–ÓäyïNíÃq5 Oº«‰PÚ@eúFb =]ªÃƒ¤:}E]GŽžxxÒ]Î¥÷–ÉÝ…eôé(•2èé«bc7 㳀ĩ£T'S¹¶YE–w•åQ$EžsP‡ç$3$ÎÞRꕧ>éŽ*ô\‰yԉ󲋗Kn‚§¶èêÕ ûy9ùÝ™Å\̪÷dµˆjÂÃU\GsGðPŒT‘%‚ôˆº}TÕg<ܵ¤r0ûPǾ½·
-þR%¹Œøp|þ¤‹ê¢] ÚÈœå&»¼ÎénKfŸ Ë©O…jšØL/J
-• rÇdcñ.È-³“aêzÊö|JPx1"•4„jËY ‡º‚¿°4ƒ#ÙÛ¾;hÖÕHóS`gÍ@¬¬x.FÁ´¾ŠÁ [2Ò(¦-x\WW ¶ö3ÕfÛJxÔÏWEë– ~¶eÁXy;Š[@ÉQZ_IzVšáÁ$$˜Ã…÷9è`XȨ*á:T^†5íÜnq œSö{§Í0»¸HœHÚü¤»Jœi3M)v]°¶ƒ4o¡÷X£V¯K˜QRÎÑbÞSæ
-œ|¦XA&‡. *éù›S
-ÆCb XGÞæ/Ëåp¿7±X•Zì€÷Ñm´áèIc2:ƒŸÀáurCžÐy_-ÅöÞ+1‚ñëCJ(Þ²Þæû.×aÎ;{Ð{Ÿtg1ð®ÿ1b¶PB6÷>öÞ3F ÷‚œÔy# @]/
-¤ºS,Òò‘—=ÂŃIóäh§µ7g‚°¯º=÷^[³€ô©T¯@‰Â&l13ãSˆ²­ºŽ¯ò¼Ý*ÆçI–Ö!G„tØñXÅ
-IJ@1vÇÅ’]Zà‡;‡éI óøþeâAGBVÆâÄ9u&bªç¶ç«:rœ>¶©Wý…’¥î1«-üôzÞ•‚ØJõ üå¸Fö4–Ïc÷žÒæM¸ªÐmNŒtõ¡ˆÞ‘A¿DÎ`:-ß„C&©¯JlòÖ'kL|ΪÔñ¡‰Ù϶'¦³TE (ŒÛè“mü$b’䃒Á|ƒyHJR —VºŠÖ}cPù—ð']ÀæVÇô†Q2‰’þ¹éjõ0~úí ‰]È^Ù|ÎÌëü,¼Á¹b4‘ep¿Ò»ÿ  ¥m]t…¡åw¡`L«;]²Iî~œéÔ)¾¢ù³jš'“ÉÀOnÕ9 wÞŠ¦Ð| QR¼{ù.‘BBG½$|@t¨0㨀d¸MU†i nX hçzïû'„ykEð„e8ƒNãÕ Û
-Æýì¼–¿4–Ö©[@þ?2ŸÚ/Z¬DÁ¤·ü¥ò2÷¹½«Ð“@˜‹ 7†ƒÆ·£Õ
-w/0E¯Äîé>æk¼)R~%².þ}:`Ym@GNÁ”HØåÝêë±£Á˜&¤uåà×BÃß]K
-ŠÝäL[Ȧ¿TÒåy<=_3áü$0O[žaMn€Ëeî „-š%ƒŸ³Æƒ0ºŠð.ˆ#ÍFÓ~SÁ¶ÖsJ³Æ’:LÁZìmòz3ƒÝ#h æ‘ÍUT)­âBâ.áxì˜
-Þ•?eÉé-ÖÐÛVRnÒø j)æ”åsùÒÆJ…`&´iÀàp%ŸC­PįOøܱ ýr”|K Âr€°g A§2¿—`m¼ò–½§rJ¡ø(¿ %ŒÆº{Ô++áÑa¿€®{²d 0ïùS½œeí~éÑÖ¨mÄï×|SMâ Ù X;!p”=Â
-ƒ\ƒ-uwKWžÐ„f4në®5c¼ksø½ŽÀuĬC”ÞãÔf_F‚¹xÒy|¬&„v
-Ûø1wfu¶8‹ 7`p—
-¸Ôb_²|ì€Ì§¾ˆ€b°ê—ücãÅn¨
-yQëfðš–ƒø 7‚ÿ»[øµsùµ > ÊW† N±5 ¾Ò6~W}Mñø´-M›è+Ü–B×A_Ó]´¶gˆÉ›»Ólr:û‹ Žë×Îâ^¦'Ý™€ÿ
-D}(ä—Ø(mt›'Ê ãLx1NLÙ‰ƒ)“i½;ÒMÓØ*7ÃCílf\z_“£Eynç{Ó¹iŸ×Þ^Ø“ÃÔbJ[¨eªF¿JXÏ‘fÝn•Æ¾µãÅ&S1ËÁçª[ÞλÄE£†V_µØ³”Òieb6|®ó=Aç–ýÝFh}Ù«! Œ¦®6¼vëc¼iLÆ—xËÔ·bs`[²X´QÓÜRã°¤•êôVQ?(Ú’/I‹ÝœµUìÉÜîðjÒ5‡l2Û
-êµFU°;ÉZ<ZÖí©E»>Ýu«¬y×nÒƒ’Ø\ˬUÏO
-m'bì˜q¦Þ™_\ݼ1£î9ÓN_[¡âý®I ’~½<¤®êPö‡Ø'ݨ1£FB`Ø"Æf~žu¹Ú$ʼn)¾y-NEmÈ3ËYÜâ+ùÒ ^_3.÷<™qØE ãh‹#/\éÐj±²¾Œ–y+Y”0Sg- lò|åñïÂ+‘6ÕŸtk_¸Ö‹g!{JV™)a‚©>¯±©c¯Zí|ZÕös£WPCtºç´-§«†ÖC=M6Vú »\‚À] Û:S0æÜù² w‡#&!e˜™ƒ8ôJóîE§±p›ÚêÐR;kïÕ½³y„¤Ú&ͺz{Úb¶;Ì­–ËÑæùæ|W°E.#àÉNC˜XC´üš4é,i'äòwP©¸7E[4y‘î ÖNÆ“qužt œ˜`l.î©rŽÈÌÌ Óá"hMNõ°^t–7n£‹~^ä¡]ªÝÑÁ0äч ‚§aðc^®\ÊzE]_|I$$Ògœ¨Ó¾ædÞ÷óÝÆÖ/fBX á±ùŸtA£FÈ¥@+Ä–ãÐkôE
-GKu9òœÈ mšIQR=££îbó3Ã~LÔñ,Ï',E>šh-´®$7Ï™’³¾ú5N*iu`L´=cn®žt™Ždëd‹F:;ßqÞ\Ì0ÇòÏþ²>_…äò- #[@,úñʪ¸‰ižKy[ƒ*;ìÙdy¨L+~FÍVvî°ZZ¥ƒ5jÓ³Ô^#´TOšÅaÃJŽ»OºÆ ¯6CãâºepEÉV7Ò)·ƒjÞÒ1˜ðn§×‰Å»á¡ÆÙ³ÄvloœÀ\ý´uPd³?X­Aà¬ÕAœñµæ:ÁÄõëÂ$iŽót›¸Òvª÷Ú@50Ç»©Y~•¾ú5}ãœ4®G¢®•,‹‹u¼°è¯ÖÝeÕíÅ¥´US_œìjM÷ýCY_ ò\Oá²ì˧ÖeÛ0„ãAuR*Ä{úx:¡öå‚ÆPY_¼èÅÓ ½­òèt0Þ™m gX—³K]±LnâÕrrùê|iûÒÌÀY릾1Wü)§Ú©×Í|0þÌk—ÉÚ¶PŽOí„‘É„*º$S ‰0á{þ’sÄù¬©èË„¥ßÎl\Ù¾‡ªÄY ”ö ßñi,y x_ú9Η&<Y¼ÛéÏÍêàЕêòáMLéèÌþâY”´Òs=¶Ä›ÚºzÑ ä»¥ˆ•qý,åˆQÑ2+Žw\Ü]î%è‘hñe|Cƒ-Þ³;F«ÀwÖ úr)VÎν†ÃË2ïëÆ:N3ÇVÍ–"Äæ±k—~Ñ“‹bnÛOâ\ƒ™Ìa/¨%2«]g [r©M«—k‡ŽE Cªf3Ýj 4Ä*AÆvE¢ä)òÃØʼiÒ¸g)ÔW7nÙôŠRbjO÷†Y(F¿–[ÝQsåmñšF8橹Áìgsƒ€¥’#$`tôƪžIÙ" ¼1i!Æ°olËÚ‡ÆA̶5´'>>¶<Ïìõ˜ÅÙÍTõæ¶M={1w¼ª¬Ü|²î¨5Ò±š»e¥ºúÙ°¼™˜2OºXU»t.'­Uh:å[í˜&W.w­õÁdðšã1CŒ³f¶‰»--ÒDÌÏ-¯Nv‹ û:¾Ž5]u—a]ê-2SkÑ”Ö <aÕ •âI†Hªf[¥à²ƒ(§_ºä2;D²tÇ÷N_"Ér3T †ubohõÏ)RðeÄad5H?WªdŠÃ2¹¶äëURfw0ì–C†YГd¼¢›'ƒ¯BÎSy¶÷’ælZôÄ2 »0ú« {2œJò)¢çËŽ$|ÎöW"YL¾r7/f¼:Úšdܦ|¸Ì!팶mI]na¥4yu*•Ÿe±dKæçõ‘¥\2®:ždÑ:ˆ´V’Ï—¦:TÖ?“­œe8'D]Vv¯§ø Ópšœ‰iX“0$ƒ=]º”Óê’U×ót¸ì0Ã
-c穤‘ÎŽJ‹ÍQ¬WLX¢ÆÉ°zM‹ùdšO'JM¼B†É˜ýÕLíIlÖõök§*çšN6J%­kÇ®õÜ«+†n%šëžªMäLit
-±ô(•©§¶©¬¦V× m7åšì™Mšvw»¶•± ®Ë
-E_qíK-zko{¢‡™Rìd e\xçã„;sºcÚ¢­i‡² ¼‹çÉ|xþš`\k0öZa¹ì+¡Õ$ã .¡ågýò.®W}‘R$±u€jk”Ò­‹>šÈŒds^jA|ñ›U:˜Ä¨\|ÕÚJ:Í*Qª˜Yiå6µÖ [ØX+å0ºŸ[…–\Ú›…tyèiÈÙ6a­ÜkÿÅC >‘zÆæ¡,à\«ñz硤ÎîUR9$%畆ÚÖÉäè¢È8·l‚Õt¼Y­±Îkš­{¶.3ºEAÝ9ŒUnÆÓëEdm´EÛr÷^§%jnr” ®ÁsŽîÈ™“Çu=ƒÛ‚Òªl¬bÝNsAG¦F{•E¶`á‰lúEªk¨ ¿Kl2 _i×'ØŠÉ3 Wt’=Z˜º^0·®Õű‰7äv}ßÎý2*‹ý,9Í®UܘJyJ-ì2ù—ŽæI×ì |ÑFT­Ï{¶Î"Û$ªÕ¼ÁïÈw„>°ÊiReGdSÉy¬JkY®R_vά½+ö5¶D¾
-åRV­ß<—ܹe3ö¬5nšM‰Ghç&ºÞ±Z´ëszv½Ø<f§=¹²$iëøó »Že¶þJ™˜—W`rl˜ÜÝjÆ ƒL'h™%üÏþ—z¾™R°e) šÀ8_mù-[Y¾êãÛd\,µ8k,cÅUÂWï´²¡v!Y$ë®´3^*6„I
-‹›[;6åsL«ÕiÝÉyªµè()ì˜jÙ5q¬§‹Ø“ M³4Ó7§€“°b+´,Þ¾”qaY–q.u­“«y WÏXè­»BKi ˃xŽ¹’›’ed¢)²KçG†Vö™3HÅ`Îä.T|YÙ6±fH9LN6SÍê˨ö°¦I>ÛÁ (*2–Ü-YOHgDÅÑm#æçfÌ^zówK¼'³©•'ën@ò¯2…ÿê(7VžÕ»ó¼WH犵ôc$7e™çz¦ï£ù¢~¦•köºVß R£X Ë]_t]UëG[º_7陹^›š˜wL1É<.z»)7`D;ŒˆfäÿõžkÊ[×î<EDE0GrÎ9ˆ9çtþ›^ë]ßþÙ}] 7UsŽ£ºÐÅ–×sõb¢ÑpÔo&G…i§„¯Àâ¾s9´ovšî°š^*\(fÇ4Æ8ÅYOªåb <wX\¢d@KV¦¥õ{*Ί|ˆv=dì5–gµÙ××ó"³)àBwÆ*PJc¥vY–—‚Ð$”ýqí‹û/ÆfOwÝžÑl›Ï=Lˆ×¿µ@½JR[j<y3T_g~-.‚d2{Ç`äÛLj ðÉgöYûóÖ¾§Èw§“_¥oòOP’—kFå|2¬ëJ¾ÍCh­:.
-{é\7Plï…Ü ªÆ$‹F±Øþ6½tz÷n¦æôW&žÔAÅRãÒXmAÀ9E´ÆŽtt‡^ªÚíqEÑei¹Ü¹Mï³3oWv›}Mï†k’ÆIg1Ãrâw6«‹VM_I÷$þa×Õ„ì‰ØΩ}Ýå6–±£üÞÚ,AÂÉ]Άÿ`âwÙÖ—'ÑPnî Þn‡hÓžÜוº>U¹,ýU?XÊ|FŸdIñš*g¼gæ]Ÿì]˜`¶qõ{ʱ³Œ°¶ÒZ7ÂĘä íð¼®>¤¦®ÚJ(éW1¯>NÉèÚš5}»¾ÿ$¢1m¶ª
-:ðæ·w¸=…Ô;³Ò4œëÿ R'5e–rÛ^¸xô.}ïyãș󋬴ÿôºKT,îö˜BÝæ\Û®Áéºnû( …$‡è(”R{ÔŸ’¿Œ³Ç{%¡=6ŽúŠ
-·^÷#µßÈVFÙÞ^”ß½µdy×TæržlkßA]úÌ|L)Ÿ’Â'ß;lT‹Ê÷$rŽnhkªÕ^ý ˆv1GH+s£”JWxÊOä¹WdÊÃåÁMѦÆö®¯ÕDŸÖ{jÎÆpXñ­¥IpºN4ÝŸt‘_& 2*J´h5öþP+”<¨(œÈutÝ ý{q‹„ѹ–ÐΫp<¶ñ«Ôw ¥ÜžšJZ½J]lq/ˆ`T®¼!eò´QéªöÖŠ•{'<©Ý¸0 ‰ï뎊ƒ½Xõ/&Ä»0%‹âr7[ð—ä€X¯¤Kmn‰RÕÉ%6©ñ×—Fxr…)ØH‚G{"\ªáx^‡“pF€ØKÉ¢+u—jï=)cXqSG„1:ªí/Í
-Ù¤»eÃS¯EÄ_¹‚¶¯×¶Ãqé˜ ÛiK8φ7¿²˜¿£ü6
-³1g#^pG«¦§ @áÆópH"¤Û&·†Dµ‘h¯?²å¿ø@¬§šÈ9åä.'2ŒªC2±SÙ}#âʪÂ*´+n¦Î{©BŸ™"§¯‘Àr®dH-Wù~…ò—é»Ò‘Ám­¦|BA¨ƒ:PÖ¶…+s’躋À)L¸¼)æøÓä:÷-£iÙSô¡÷j}~M!ôq¤âí9}Ôž¢eƒÆ[á®››n]ç**Uä—¶ŽOÕtmàš !…ظø0Ýt*®2|thĸ„ºj‹oR!¦/{Õ(Q»>ªOäO8Û}5M÷AÈ×÷ºÎªv94z3q$¿(iÑš‡J1ûÃ9ðVúÓhyÐjÚ÷À‘׃AZrt{”ÉÉØz)GÝ™Ûíqÿ#G©ò"˜å™ÎelË›)—¢øº–úr,¼kËî>^„)¶îÊBLà…Z¾ô å=¢ÕDfæ}šÙ]°Ô1ÀòBVTrHâ`k1¨ÈÑ­ÿÝçgs‘­`Ô‘§•t]bQ“[Ê·¦4=y44È—;gLÙ-»!Hó"Ï:Î
-–û~¥gËÏñ|£¡–Ý€˸¦t´n¤Û¨fÏqéû÷ú¤¶.õ§f<T8U\Pk6›.IZ=Üó·ºÕ•qSóý‘ªM‰£V ¸Ãºè„ •#FÛ‘[)(çδڛ©†e:%UòÄ7©¾š<¦ßÞw`I\§»Û\Õü=Mâñ\LhG{’F5ë”$Ø"¡5°FÝØ¡·“-:·’êÏ~ÂŒKÓ²y¶×}µ_x€&ÀÜ㈕>ÚٚʃK¸¦ÏOmð‘°ß;=Ç~›Ú1jø*Ã"{QúÎ{8_ª$¥É=qVìÆJ)Z|¾¾‚?{äiõÇb­ýí4µÞÏWk·º®´ onßÁ¼¼ T*¿XÓ+&°1¬¢+¯wsÓðJÃqn;Y9åï*:µ´|NÌcõ§…}/»ðÏ´†/ºêðŠ …+¼‡—7æ+wöæ÷gKñ3[á• ®àòlMÔß‹ûi}z¾H«ãa‘^—]ÑWµ÷½¢Gàa—u%Fy§áT^…dŒÖW%¼aëƘx<܃°è)ú©n,¦ ;ÖÒ²ŸàêÖ‰¨#Vw€cªÆvÿ.(š”7Ô]ÖúwÙÝì+¡£ÊÃ@KYâ€3—á°¶¡;ÞŽAÖÈäå½õ4çxi )]e¯Ò½þ°yžxô<–ƒ£úÓ÷T™ª›>NË»s·¤ïn÷´p3fª}•Cñ,æ¯þ^;JX)òaj[¼×å‡ß[®&]Š×Oï¥Ô9âpá×Â"-ˆ½e§t|œ!¿ kt¡›QûÁ\Ly¨J&h 75Qñ«Ñ»ŸýË='ãïåT¨¥Î”~NyV¿Ž¼k=(½Tí;ëÛóýýs‡ÀïhÒCJ³sãÂ؆~­­öæ‚þómF»¯]¨3|çq5LG»«[£@ÝŽÚnÀsó˜n”ÂÃXŸçק ¸oX•ÛXù<äRi¼×uÙûŒ¹å-µ…½˜i›Ã3ÁÓ<[¡
-µY¥s’e£xSW&à_»vucÔCx¤÷ôÃQŠ¹ŠfÉžß;€EW¾¼Ù~ˆRè“iCS› ¿$¹ƒ’Z«|ï¦Y1&!¤Zª¢öÞèôؾ"ù×YÄ<òƒNš¯Û¸„\1ÿÛ½"šôòŽ8?<˜Žñ9õÝ”_ÙOŠ\¹4_ÁXÿ쎕|ÐKvÅ­î¨÷› ˆf+í–݉m;è.ð­ŽFY«4 †g©.uÏ©ä_ïXYB–þRgÉ8„ôÍn„ˆúØÄnòêå<üôE@ Á·€O„Öh²Ù’ê­óÎd
-ÑLªýs]–ä–áöHkjlî[ÈaÅv _À°•kOl¸²E”6ÅÝ­ßR¯LfÆ qÐ垧 õéììžïŠàu’GKƒµÙÆ‘-* –«ŠÓá-]»Ì‡âRïª Pi˜ôa`ôXV›eT4Äó4Šå'šr2u‚]ùfÔ„ßÑ 0pf½2Ì¢wþìo­œ°•ŸéŠ*ž°¢m¤3a«Ý†‹h¢L9ìöV7Çõr~m!µ³ÕR½&nùP´ q4ߪÖ<m<³aœê×+B…œdö©/¯^öŽî ó™sqð§÷(4û¹t™ªZ
-0讶ÒíPú-ÌÓÚs£ö³Ü62L m
-t±†îâø¹Â˜1;°ë?:Ó;CzI½û ¸AÝ>?Ç™Žñ÷F´Ìö3«éÃøì ]>A¾S#âI~1¦½3*F³<®mŠªj90óž“›+g•ÃyÛÐ'ÖÕíÜ…ûá’Ê:/™Ó²¸¯ç#*Ëù ûÐk‘é׆ª®ö
-P¸ £F•xŸzgõþ½þ/m-w^ÕáH¸¸Çøôž<A󧼀sàG"Öã÷O9«À¶.ì³È9ϵR»äàLö^f~i¦F=‰ž³x\ åzQcœÞ:^,É=&µ¤/lüB“(Msž¶™Ð]]]9†7>[ú/_̨zåЪԧ†;õ‰°(*âeO[¿î#B gcökž­×ì“ÿG‡/IÒ)LÍÎ;ù¹Â‚½Zõbs8POí•Þl{H{¥M£nc‡´Š[lÐÖöLûºuH±ZÞ@?Xá@r¿Üe09|13¿<‹,æÜ>¥ÙQsÄí(jÛ®Úg† Š¼íh‡iÛ©fZ€‘¤Õ£)ÜŠŠ$㸢£³;TõÇì=•»‹Ÿû•Æól NŠ†V*füWÉ!×rwÑv®ŸÏiÚ~{'Z-ü_©9JèP׸¾>Ž7»aÆ5²ÎkwD
-ãæDH××–Þ$øÖYÈü+!ÞRXB/ÜHäìaIÅã,Ŭµ“hI/Û5Xu!Õ7`;»Ô[P{µ‡z54ªÿà徺îb;i mÑ×jü©IøúC¬‚r3âÈwƒTØ;ä8þ »»ÕPJâ%0sš-÷ÊÊŸÖ)«Ø W’¥Ö\éŽWŸ¬)éBÇ¢ÆàóÞ[¨„V™Zf¯«q#«@ئj믺 ¥¸Sf»è §ê]õ™ð° ã?û¸|ÒÛW÷-ÄØ~åÞœZá`¾CýòN»Ic ®ÿ>œÁÝaº=Û¸¹YÇ¥5þÔ±öÉU4YÉc*×Â…‹ü–›úTçÇâ‰No·ã{h™6"sD‘U°­æ
-6G!¡ú¨7Rk{–þŸßÙzÃÿF]Vœ
-ÏåÖLS°Õuzˆöû°1ëR;sÉ’jÖÈ.OA¢Ðde›k¯nbyÝ›V£D?„yuܬŒ…X´Îõa\g7uw9fDóàvZ¿¬Œk¾sÏÄe}À½þ"ñü3‘òjrcÒTI«œ…ÖJzýƒÕp.Ä–Ehá)Ô¹aÞQÆë›j¢ü>¶‘pûzU=PÜ9õ{+*ÆÁ½YoóöºVsÖúUò:¼# ¢‹ÂªV>°ï¯à&Si CO´
-iœ#VYo¤ÃN_Ûéž°<@ÊF¼Ô~KˆÏLÁUñsä;âk$ˆ›l5Ĭ漟…Ñþ„‚ÔžùV÷Õ7§lûÔÒ‚ÇùÚYŠ|cðÅœjSÿƒã'upøë…^2oð¨3F¼=¶Jñ“÷€9Ê a¢†‡5³7âípáòÓr“>¤/JäãÆÏzc_™íßäTÒËCn#4\€P(xð§È/ðμôt¦Fù)µÅªGüõ«úò)ôÛÖæ]Áœsù‘ç
-“û4&R÷åN)‡S¸#¯¯xŸse]ª¨»¡»·åRã=”GÍm‘6žÊÀ‘*¼¥Ì±í‹ü`·;¹2ºeMÔ/|y¹Í¯hù(7u؃¾<~üTi›¦bÎÌk{ ?Þ1éɼµ(Q°jý†#¹bA<ý=g?O y¤QM¢“Ö o©ØKI^…»Òv(ôÖ書r’ŽÃØY¤‘I1&ùU³"# s§Áé /g«¿²[gmy×<¹ÖK0¶RuYnî%p/Næ, Ž6©ù|당ÛöÖJÚ7%ÎÞðt'bQ³Ó'\iþ‘”fv„¦F½Õ¶d`@7üq½žËÆB<¼V0Vn’gãåŽTz_I©°ßg:ø¥ÒðP[ô›N*Z†`1ÿ`ÉÒç/Èy–Üúð©h.~û,9Œêq鲋Ĭz9šh³lµB«Ä×$g±Z%\¯Þ󤎲Л½’ãÛ¿ÐêHRP×'þ{Ìa¤(g©Ñý¼þ[_Üí}5LÄEk„£[ÉŸ{îÓ[®Û{ï²ÄR­KРŸµÏíÄ>u>e”ÿaóïs)2yvb:ébÛ-®Û4åÉ€H
-wF+ëè&-j6TrdÏP¶w˜/ßû3¨[kÀ‰iAvø¤oµÍñjþTïWÞmÂgÓ òp]üxÞƒµé¢¥:ZxRVj[Š§§ìù(¤(ÓZÛÔ*ú×qt²¯TÉ<™Ìo±µ{‚âYJK˜ª‹å²c¾\h¯Ôâê*—É~¼TUƧÓÀh3~þFþå]œ/÷²±W‚?;ù„%µÎ²6ÁR¨„ònÞy—î7Ppè(Ì%£wo5vßù—Úª.¿ðH‘†œom|QˆƒßËÕCv¥J½æ)©ó,9 ,#¯lªÌâ~b«J­ÑöiÉ=ÚÏåä…¾8¯[;Ç¥áz]Hoü÷Ìæ\ŒÁË’ VKë k¨ãÌø˜s[Á.0~€\ÛF2*¼«pß3B)XúÙõ6c\1jÂ:lêú0´m|ö‚û";?‰Kl–zŠ¯‰?ͪý½1t§·V¿–QRS=ºúqã³l\¢u‰û¼½ iÛ1Æž”KØZQå <c%q43ö ½ÈÕ!µRn‚Aë§w<-CÉW\úÊê¨÷+, IŠyᑳ¥9¯]É!­ü%Ô8‘ï&÷z«e4}|§?a15šë#•þéj|`¾ó¯y‚jR.·ÛHû>Õ*5Õ­ýXB‰È@4*s¹^øä:'¬Z<ô†k5dßÑæäp5q|@‡ïÑxdô« ~CN©É£*£ß‘[OM²ó.!¥öÌ“˜ÓLŸÇÀ8XQÅI¸}¬™`gÊLÅjÝf©èÊg†Ä”7€êæ~ÿHÕ||ààÅ4›Úzøªsœ8 P¡¶€:§B±7P½ŸVjͧCE»-A˜Òªû¯Zƒ>oìJ÷ƒ©øjÇËÕµÐää(-4ýÔ},"N×¹ÖøRcúJuc?+'Õ­½OTW¾)yÚj?˜ï
-xPŒXí:éX™<i[õ-ØŽe/5û‹Üáéeæ?êªn”?³O/™‹G1ÛN~Î;ô¤Úu ÓsWE5²ä·Å¦‘EJj™W24õÙŽã º¹:)þÁ“±è†\2”ty4±‰=ÓXùcÂêÈ=(A¥
-ò‰^BäP§°V%^‰Ãœü’8¸oR/°·IÜ O¢q:!α3ǽLôÄÓK5ìÙŠ­7ÙÒÞ’š×)gËÙûÛ!°‹`þüv©ÙÑGy>—ŸŽPwG»¨ÐâÓ†(\ßë씪á'”ˆòzJ/-û—BåS.±òa
-º*oï«öK@–Ún¤µÝ;`r⃄ªZ#Xg–Òh‡«¡:ŸK+}ˆyá6UN7Œž×Æö`£Rò\{ΰP¯­³ÈL(«Ìl²p™N_ëÕr·áñ‰ì
-ØÒ³~G·ðü¶KYЈnz¢¹f®…ÕÍ_cœOæ€ûîÍ×ò& nÌ/7Ô«­Ü­Æ%fÓ›ço§[u=ú”4»N¨%ËUm³C¨`KƒÅÆäüá°ln±eQÉö-)¡ÝmÜúaž9¤ Ç«—Xí]º{„M1ÁtÁƒ×šÝ›æºÙè7ì]åç¢ãßÌ‘¿s°° çн=*ï¦\§ñó|š:Àd‰ü}0~Ë›‡…@Ô¬/Oۯݴ bdb€Ï–ùh†ÊLí(ÃìĬR禵Ú.ªfkˆÛ2Ž‡×ç¿_vоÜb~-;×ð=|KS0:ÿÞ‹æåü¯`ÁÅH¢b¤/²zÝÿDô "Õ³¿S»6GEZQÏ-ª…ê„]\\R`Ùcáî°Õ©x°Õ‹2'ñ‰~ï€%Ù¯ÓlÈ=•ÓèÁ·¨1ötà|âëý·à¯dz߶]B¾¸ûjßeÑâ¾®~yþmVØ›Áê<êX‚%W³¥¥Þê¬é?¼æßwf±ÊÑ”ãž]|N¾/ëPmX•®cís­HIçä¤bne©Œ,µm?¢Ý0ïkO¹2(ô›½ö=ÓØ5ûîcÔÑ[ã¾í,V g>[‡êxß U€…ÕºH£0o½ÒòÜ!­Ægì£<ÙulÈL¦(íÈ$³[-1^㱟¨w;2¡—ò«V\¢ZÒÛ)'xxCƒ îÌÙ•uÝ9ŽoÚ*‚÷þ°~&íQ"µZ'xïÕúüƒ­c’Oíˤaý¡ü]G
-B!»U~)z“4À€pk]‘ò¤­.01û"ÕíÛ éÍêÕ¼5DÞ¨ÛA™¨"ÿA†]^|~QcðxÝg§öq„ œƒô6Ôeð
-ùª˜…—‹=Ê×8ðÓJ·î÷‰&Þ|*ËÇF˜ìÎlŠ3§ªn“'ôþ\mö×X•òGÀ¦ãQîrVYײª ýÈ-¼#øº*ë~ü†D«ìKà§&W%Þõáÿ¡œƒÕïŒzŽö÷‚xîäójµƒõÖå'¤ ÀI¦,S­O #>u·+kç”’ò]<=ÚAŽ£ðcÒêíòÖÎ>ŽÇ„»•ô§°MI¿r#÷ˆ•
-ËDwhÿ+_µ"
-<–âè™#»ÆÙ&µ2àZg>£-«GÉõÊ7¯|¥PË8!Ú:49¡:уQzØi y K£q‚דíC­—%¶ãh^{âo[JÆ87ˆ^}KRŽ„y)]"¾w}±ôAW*†*½3¡A-nDÏ«,tÚ>ý"˜ ÂmÉ¥³öïµæŠ•%*øvs7éžæœôqéêT¶“X/.ÔŸkMØÜ}.—-xð f:ܽÊLô¿çt—êFµÑnÊf«Klfe®˜:½L¹9ˆÖé毷w.·…Ï{§uÔÜŸ'±M}Öÿó^“Dç9özY€|n‚Y·3Žw?»Á~'±+u? #ðª˜Ì}Ÿ×o߯#\ú^#Á?úž}L;Ü“)3þµ¯Ù«¤•ósïÙ Þm˜õ˜%Ÿ¬ñæ†hc<›cxú¼Œòä´ÜmJØãí±Õê›Ä^o •Q“µÁD—Æþ¥À
-úãB¨'ëböã=s*áƒUÝ’°îÃH ö0“…*C^8—…Ÿ£×DcER©7Ëû" 2wñ%´o†O¼ÅÁ
-]khGíÎÛÇöä"l•™6ùΧ ¯wïâÐâ& øYgÌjPöÅã½RY°j°‹0¸³âWëëÉ-OKç-3/…n- ùÕh×v§µ/'ºÓ¨;œ©-×ÉŽˆ¢“¨ç²zÉW~عôãTŽ’zì1üŽ˜ÈZû9fÃæ°°ßãê.š(íúÅsƒ•p:´ŠÄWÏg×1NH.2n¢-€ë_ ´HñÞO÷Þ ÒxžùK¶+ñ]üFcY} "îü:Oаx‚aBTåëàÈ©!ê\]-”Ï
-%d^ã¤K~Ž£[YK$ÔÉÓT:ü&¥öÒÆjNvgì÷¼IÑpP‹Ì·Ä³¥}Õ.z_›«®þ£Õ9×XmûÚCüèû>óÍ~Ô4«¯Q@dì²e´¬½ú;ⱫŠýs'Ó§Ý3áâæUŒÚjyÆÍÅâ>„§ž
-ªÂb$òÕRe›)ic¶ÚäÆlCðQÃWE³*·1 5W¥˜1 ñ‹¦Ës¹ÈÈÊã÷`ÈÞCâµB=OÊ9ü¬pþŒiŠš¡áÌÎÉh§Q:Uëoû%p×õÜN#LYÝÏAÿ½Ü
-
-ý/†~uct=œuâ°ëÄTg;Ò‡müÊèælœ¢7­1+{ÜÙá÷‡?{vžê^Ì„JKñŸ&pþýéýC1-¨±d’_%u©[
-mƒÛ³0žÚ‡lG uß¹5I¤Ö¬çõ{y'o¶bûÝÿ€ÈVž¹a=”KkÆðKè6uÐÑ›S½pJÂ(òLkÏÙöì Õ…Á¢V¹òz dí) ÷šNý¿
-™Tß®.›Vd»ê_¤aýX?x «,Iê6˜×AdÕ½×Õ‘’¾YƒW¯ñŸ=ØÿŒIà;ËçLRFÒ`¨,¬æ×î¦I{6ÎwŠF‘Só'?ê;L@…6ÖW³½ÎŽH¥Sä—ÉÛýï––N
-y·~o‡ó¦Ï“ß«¡½ÃQte'¹•q%R4v:é™õEÛ©ûƒ†OqÝŽÌÏÿ@œ†ƒÆãT>•¸—yze¼ÆÅÈœ—Èظ4JŒ9á®*’j™}¶Ã¶&üKäÂÁêd}3ú/Jû؆]ìÈ€6_ïÜqL4ííž>˜¹)­Ý­~´LC^ëÕÛµÎ[4´õ›ùˆY·s3^ÉÆö|üt¬Na4ÿÁS½¯V]A<ûµ©q^:bŸÄ $%Xø~¼,t©_¨àv×~û^=:Õâªu-Îð«Fp%ŸŽÉ4š“þgÿ\ûqéW
-ÄÕjÙ@Tl]µyl5ÖýoÓð™Ñìz.2rVs~O_½ît…Þ®B8‹OçŒ}Õª%„Úaì¼O[ü Ä.0~òTHÑ(×îáéy«0w‡y]ü`)ì<„kMûõHje?Û©öÏ—0¸žÑo‰Ë—ìP”v
-W8ÕüÚmÒ·E³ª@oÞq‡‹·Ö=¥Ÿ®üÊ7?ûvÓ¯ØnÝäÇõ—Øshþ¤ÞòWƒÃNèN.ªfÜØBùÝÓqÝÅKMƒëáÏi´
-uBŽ—›º yÈî?ûp—ˆ©:+'ÀAØgp2Ùj™ñtÖÜÐzÓÈ ;ž”Ÿ]«ÃúñLµl2 ±¸q(4Yßn¾}+U©ÁÿP°ß©¬¾ükÓ*âø¹X^'‹Ìi›´&…°ƒÓ½Oœ'¤lÎß_ÎòÄ—žP¤!¯‰÷_F)¿z©ó¼ZÄnœ°ÐÚíq½²C™Ûm·ç {ÒÊkÉÕ&˜ÁøK.£eóáS³ÿ ’÷•gÍB
-Ñ!ñ 2Y Ï!Û^ßÑÐ µvÀ'‡»±
-w+ß‹î©“ºê9¶„~ÿ2·¢—½³Y½•Ú «!éú¦`Ou‰/-<«I.õÝ5Vˆ¹ë¦&ƒ—€U‹Vö«Ïí¿(Òé>¶>È– -s7› Z+·€Å=õûM³C™àjvK–íÜcTù~5ÁXn¤µëØø é'2Ï@‘Řюß;×Õ®_vܧÁk/ì÷ÊÁÆhTOùÑž
-Xè"¾ –já˜QîØé¿»kÂøsRÝš!õ
-•©Æ¢6ÏÒóÖ3¥XŸ#@tS¾|ƒs zÕ@öþoŽ×nÉÆ`ÒYƒ
-±=zës¡Ã8®|Ú3´×ÿZ~šùÉÒŒÍ2$lÏÁu—Ûyþ»&:%ðËÜÎ#Üul1
-—Š 7ï쬟¶›;Ñ@ñî̇V%ÑŒ}‰Ê’ô_ ¹­ž¾àÔ¾;^
-äˆ/eÂrª"Ãå—¼ÁOjuci5i!V‹ËŠÓ†=ß ÝuIÂ'ó9‡ã‘ÙØïž2¿‚V%à%cÕîògiôg§åhÙ‹Ýo˼óý”‰úóál7×·ˆT¹ªnO÷+XRðA4èc¼om©a_Ùé¦dú=Ï´ïë:·OËâ¸YþÄA
-Ÿ†BçCÂ6Ž»yLö²$m‹úÊãY)1ç.#ˆ#É;)b3ŒàµÓ×IÙhÕ‚E6,xia,­ùî敆VØs£ÅÊH§íRJsyó»ù5ÄõSLûˈw¼q«;—pÆþ€¥®ÚN-rþ~q˜x)¯v5µS“O©ÙÒiÚ3!K`O¸¥ís Ã$Ü<æèƾٳ ÿÆß%¹pó«kœçeµ{äö@ü KZTÏœ) åÙû N²˜jÊIßÉÉLJ‹ë¤‹3 ¨–Šnr·ZÏñ÷§á”Féæ+0­ƒ£–ØÚ"ÁË@œ5+uÈâ23þJUé}
-Gy®ü2hOï`™7;lKô©®J5’‚
-}´êûæ«guÓwKåÆŒ0yw¦aÀá_Y*ÎN´'·¢Ü÷½±×¤Ó%Äutœ¹f²èË£ÕTîüãס³¸,¿Ú»Wa‘&9n¶Ä¾Tè%Å^©m{»•„lkmýF»Z°™
-±ôvÖj5»¼ï¼Éã¹YûÖU”Ü7 U:³Y&ø4z¢A¬/î‰l
-)\gü:MVùÛ¿»ÔÔÂJâd(²x¤ Öæ(ÌÅâK­O(CÀYvÈ¥
-jW1>Ú@ûhÙÀ·WÚüêë©@¬ð¯N1ãÍ"“窋t]üš
-™Ð¸8C9óÕ•nj^¯Á«#úã2ÐOý=bCÚ»‚e¶[Óµñlê„Œ¡g|tðͪG¾-¿Ä32¨?ì ”ýUÌÌì2ùB )³b,ôýt­VQ•ŽÅ¡á"&óªºÛ&ECò|wpJ8_k>[CÙUµ¥ÃZ?*½~Z3ÆšF£u zF I£IÍ{F½5¯èoÍ+2ÇÕŠ6Êè¶þsk†ÒAÛgÅ €¸ÜšwýU×Zå|Ç© ˜í²õ¶¼X×Ç‚DÕë/KnŶî(=|@lb>V«² Ÿš,÷-s5yþRéÐå²}nch‰ubêÁºE˜+—ð[¹O‡å#ƒfDàÈý¡w‚·Ñ–‰ýÁN¢æYoò»Þ_ Ð^//g–#[ÃepížöºNöâÊu¶~ó
-CÚÍJó8Ö¿ö"ß}¤N»µi¸Öª%禈¿JRX»î Bm·æ_zq黑gÐ;mÒi•é h*Á2,M´i^iCÄy⯩—‡ôH%gÚäÔ»8åMï>”Rq¡ù{–ÿ$xk:ï4úNÉmGêÞ;hZÍ6ªOú2w-µsúˆwðÜ"t"Ò±V#GucŸ´ø5±ßÖ‹³ÏF-3ªh‹Ž 6\’Vcî´Ñeá×Nðí v¸Ý;³`¾“HÌmq´Sc}JX¹"÷zzbW&-‚ê^)IÌ:¯¸mõOºÒ*²|¤çï…l|ËÊäY‡luЯ*/¬‚¨ÍàÃ[Çêܤ-÷®Få¬`IðClzíÙZ½gSÐ:¿ÇÔßÂ|¹´ûùÓ˜
-óº[a+™Êo^¾=šºo™¹Yðä¡ôž“ËYú/ÁÌÀ»\)8«“nî7Þ¯Ì7’µEyƒ©e¼žMeoæ·/ßÌXo“#fþ2ƒ«8ú9A7±íÆ6™&(š³[YüWƒ½LPKƒŽqÕõ·s¦æ7ó<ËVÜ 'Néh™&õ„žûV6[lEfÍr?åCmE[ÏÆ4ƒTŽffƒgQÞEíŠ÷JÉ­I^ÊÕ? Ù´±»þòãF”ÚW\À]ªð|ûÙùðwMRßü¸ðÍÐy틯̙ɟ8–“WÌ3}
-™q*Å^ÃÇlߺŽ_†#Ô¶å‰ö.ØŸIÇýë\â.ž>°mºÏÚRV†i; ûÔÈ>ê‡Ø¿ˆA„?÷¢¡÷¿“ÆäóÎW¨ºýhOdþá¼
-õ¨?ˆµÉvŸ3(ùp’î„¿ž“µ{I8` ™2û¨G‘§ÉRçÜ9kZÐ-o]ZRŸw=2ˆŸé@¹=§ÉÞIw?Ù_(J9Ý‘'‡U1KÖH‹^³ÔßTμüÚõvm–ºÏ?
-}ë#µ&þÈ7Dª&ôù•ùn“}¦Ùô˜°d…'¿Ž.¨«'FEAõâvN(<WßήJ.¿ïmE½H á%œñø DÄ’ÓX”Ùûð½Ñï•Ê#.äÙ»¯ÀNß?§ëPø.ÓºøH•œõí
-H?$k–ŸCé¨ÿU’Ä„‹—Ç“8LgGrn@©U\O’pcf'¡í‚9s= på3S~óó­9\
-92†ÏcsÊ×%¡¾s§Ã‰vè'Jrz}C÷Xò2ü ¤Ð|/ôò%]–óËqt[z¨ òmÑ.¶&ÆÛÍk1ˆˆ\|âwaˆŸfy¢(7¿*?~w¹¸ú¨Õ†¯Õ6Í ‚ÃÊÕÚ5òÎ[h.°»&Ûçý%¥tbYV:,[ÛjËõ>ÞßýœÓ7ÏûãLw)ÎÊ‹:[ó„P<™¬Õ†‰Ci©„_!f4U,ä½ä@yÚ϶ýx*¬þÂ~6Z‡¾Àh¤u‘í€'[½R4¹”7¬™ú³ÛOwú1’Îþy)µnœ¨wœÂÚ¹<zê_(ŸÖ¸±:)¬ÖÈLü^¯™ÒцܤÌb¥”&0Û9C\ßÌŒ£~ãtGÙ?ÓºéÿÕ`Ù×Cì©Yÿ7ƒîv@c`÷×F’Ù ˜&b=vT3âÂ*1ÅWÕêõ-‡×ªë¿@Þ­ÑXû¦T÷›îjv:¤b
-ßQ¤â".ÒSóê5ÖÞ/b.á\˜¹mf ü3›Úø/výz—9—!­¼##ª?yö‚¤†š—¦ß¤&~÷¢¥Åz%áX†-JöwÊ7þe°™¼ãFm°¦ps;½ endstream endobj 66 0 obj <</Length 65536>>stream
-ŠÚ†"­Ui2DüI£à=eat»ßëŸút• ›b“_Éâ\U> CË\¹'Ò­F¿ˆüÿÇdå%‰é>(å5òü|½È
-ÚRPÀŒ¾lZ¬ÂŸçL•¤Tt7e±Ï9öòí áK£® j›ÜÎwó:bªáAþel— ©Þdm'™•¬Ö8²®£uß/!ÿ•ÛåÍ0.Ž lßXqRŸù1CŒr†·…bó“üÝ£õ粺¥…ûĶf¸ÐÏ×3&~´8owïúÈ“Ræ»ÙnÒRQ_Ù$*€Ü¬ð>·é6ÏÈVÐÉeã˜Wî‘ùêãEQëW²³8 Mõ·åeöMëåÁ‡&É
-±½òfmpá¢åƒ/ÜK™TXÐ ’r&˜ÕË냯íÕ„±}îùŠ‹&˜‡ÚÇa*ã“à2ª†ÃoiÂæÜ
-_F-¾Uÿ”æ5·Û˜EJí4&cÔbÓOõÝb&çxäÁ½Ë0NHtG*$,ÑÎFJHCò„?â\§wÄÓÐ-](Ϫ…"í EsŽ|}Ú]­&ñyãÆ£7*,A\/ú¢ü¸¦%är§«Sãu6³Qª«»?}þhã
-ÎuÙqøÝØøqɵÖããÆ¡ÉË;/‘ŸÃúI$ÊU],íke s•žÑi $s+7U6|.
-̈jËLѽ‰ëYŠ2kT}˜‰¤õ‡Ðsß'©ý@ÓÊAïéE«y:;Šͤ:€ EÞÞ5­¸+[£D¸”þ²D7ÎV7Êá»»J~Xã„
-ýu†£¹Ôs‚Šò´>Ö„µÓÝðv” Ú È„Ý7§¨Ì¸•-bÅÞI·®ÑF#÷qß+¸µ¾¼@À:jï2ˆÏmŒH† Q™¿‹
- s=1É~i”oűÉ;giR=f…B™yIåðMˤ–¹áù›ó­`|UƒVÎsaöÝöcHvKÞög0,ÉTÚþ"ðk;²ËßýS³ú#½-ªtÈÁ{W5dà ½êŸÈ¶#Äð™à[—ÏÓ#ýæCœáªØ}­À–‹\ JœÔ_à&¥‰±jaNo]GµÙxœ…?·™,äe¤O}# ü!\Î5…p³îÃßê箸*Ö&ð9/)<¹wŽ´Qˆ,RG?£û^¨p÷(è[ãqK¥†Ã
-êrKªEÏ‹6ëÜ Íÿ™¦¥ˆ5á>@ÛÀqx¬3TŸ©T}6[8ñØ¶Õ ¼-)ÆYø
-5¶kºÁ¿„‰ñŸi£F½eƒG&Åa°ù93ñ‰Ï
-[«®ª’ þúT¥ö Ù DªA¡kþLóéE_"´c:]äV|kô¢.äï}Á°Ê¨VÑë
-¾URïet¤û°®÷Ò¡¬ÊþÛ5uLWÛÕŸr{°ÈŸe¿:^ä:v¥gy365ÅBäC§K ®³WÍD01Sø>w„Ü3;‘ÿÉ9QçênùȬ%š2spÀãé`¯/ƒÚƒbv¢Ú„Õå…M?Óæ
-ožb&û«fç_™o(ºÇýÖ-ý‚oF¢»ã@¢%ÍõˆJT–ÁÉ wþüI\Iž²½†µs±(;2Ûüe&ᬈ7cºWŸüűT9êQ¬œÃ4Xk’Ðkò ný[u6“kö—iãÖÅ»^°´„Æ•¿@êŒð‹3lIËTƒ”Š¸× ˜E€w WS²Œº;
-\®ƒ1&Tw
-?_H œ¦?ql=k*cõ 7‘º˜ÅžT¬~ñ懲9²Î§ Û Grµ¬Û·äÖ•aŸ½÷Œ_Ä…²Õ9\CtT
-ZÖ²Õò_½q€ê…Æý¥
-<ÊF¯Åk¦]R¤Kß&Ý(·1v4&´é´|éÖÍá*Pg<¥¹~o#‘¶Îø{.T„þ-„y«É÷#Ÿ'%™›MÂٙїè 4ŸÛ³£5Œ²-[¬õ«–s&¯ÿh°:„=×.&6™
-´{/—éú™¢rÆÁ?fQÞ*ž»à6 öfaÕúºüêÛY°1—¥þ{ŵð±wx„çž~cˆ‘óäÙåâO…jöccåÎUøœÓ¼(¾T.2‰ì:<y©¡þ³ºFh‹‚Uì˜Þƒ(Rh›à(уaÖãG]²Št€“˜¡wßµ{Éߞϳ»ò/.Q晞P“:Ïyãèí³÷apæmLúvbß}J¶%“¥ìG`×ëTË þ3ï’‘³÷¯Ì—‡|^é=6Co…ɷ܉õŸñɪ»qGßîáZÅT$ÿ·ƒµjQ-C9ë«W×´ƒ@3ä/“öVÛâŒ;UiRÛóUÕ]7Þ¥ØUkÚcö¬;™\Û4¨xéÀf8Ÿºûzçé]çýïo7Ÿ$éÒÄìJË®{Aæ
-Ó bÖµ¢s½¾õ®A šqR¡ƒ¾³r%cݸyMÁ®dÇ=GÝ{ÅÒw™ÔKÔöÐ’å‚…ûvPÚuN6ø*FN(P–/ö¾pkå^ùŠ¢@M‘¾ÁÏß±tæEû¬*.©THŠÉŸÊ¸÷ÖéwOYý4/N¶Ÿ¶{¿t+éf9íyûdÑù¢ý"‡n¨G Õ<‹¾º:Á)÷búòR:ÙþK½×ïY£â=&„dãíMàœ¸jÙo[!,ŠÑŽ¸/ÓÛ
-~0ï»l ƒ¶ªõ+Ç–6–JÓXëóÙÊñ¿@ÊlxDÄÜ+éÚy©ýNí$YéUËó¼BŽaÞ';/¦»¤nÀo•ô±ª÷ÃõÖÓÿJZœË¥+ÑnàTzÀx}»[|÷9õ EZÒüy´ª=êgzmˆ`¥7˜«]anjÇü ¥Ô±c¡²~¡æN£“µázñÁ¯3(ÞÐÒÙ0]'_~Í寧Òdöú lÆä^ékK] éT‹“zÏ;Ï7y49ž>-Š šwù
-^‰®’`­ÿ¼X7z¤›ñÖû«ÔŸæïqíÙa‰ÚœÂ˜¥T™“‹¦tÐx¶â@cñN£†Šþ+uŠp sFS—%üîDÉiñBþ…–«fÊÑÄe6¼Rdž\•ç†žrÇ­T¦-Z@k“b3èY@•ÊL°w«–6Eœ&9·AÞŶñî—a=5<þÝ©=Í›8„ 9Á
-X­Öñ<æÔxòb~¬dµÕ Ãÿ%t‹–¥eZé„/0 òYȨ~8$ÈÂöêÆ'êüåUx7z´ ª¬ò«w#̓Øú›þN#3}õkS<*n‹j÷ sYVÛW¾©¤¦1è$ZµZšs*Aå„üŸÚ þ¿,õš5Kz7‘çÉ| ízÇΤ¤: #¹® ë’¤÷ÈtÅíŠPˆ¼ÂT·íÛÒìžÿ±rJgi{º{âúø蚪v\ÆŽ¶ÚÛ`O˜=òšä^Ù$[ç*Ô*æ ߃3 ´~Æøøÿ…Bí&zÁ^YM7©/¤·‰ýŽmÖ¥H:Oouêlm {áËóêô"mL|c’Æît!þe°§dœ,ÎþÏ=]tßÝæ1ú`ܶ½öDÅ5íz5«ÂH 8Ñú_}ú³¥ÿ dÒÝSSú A¾róWî—½CìÝ N‚ßwâ¼Fö_þR<ÙâÔ¿½'¶ž‰CT¸K ÿ^Ó“#EÍg—­?Ǹ³
-[ü÷ IÜ•/.ôíG¢xÁ®‚îj<8iA¨8+7“º_¡òŠ啸2.ôàÑggÖ¥±ïtXhg
-.x.öe³H¼¸óã…kßZ*„„j‚ ”¸µÜÝÔâþ¹r{^’|R£7Ó£1t>ŠÊ@´ÍÙ­H±ÝσÒÒÕº–ó1±LŒ¹Oó“OD”´ÑhÏ
-ä¡õ¬W^XA;çò¶õêð¨ï&¦8
-Ê´[óx€xŬ®LÕ@›Êlhl™Á“o¬„ºªJcÃw;ž,Zê°°Gc`óò
-zºWÜűê³-U²õÉŠ‰ÊyLV÷î©+ºð’=)Ë¥Ö¬Õ<qð Oëa™h:0ÎKæ<öT^²j³ê°`_¼Òq<0(¡CgÈäYÒû9#Æq¢Âðî<b¥ùÿ¡MQíÍÛ0ÒÓy#·¤³·V@°DÅäâânwÉ=Ï‚·Ä¶z³¥å¾¬Ðôº£H‰^§ ÿ= `Ð9, ÊÏ­ç^`j.CTÏœþp~6z'–4© —ÚA?×qÙ»Án´½8Døà…JáÝ‚Lw½·OýÑDŸ5¶aøi~Ÿ
-í@F
-’þ(UwAtƒì·Ó–™ñ'Ö| Ã><7¹QÚò~neRòº¹Î}= 7Dž±âz4z6ÛÎßË ×\˜‡Vã%lk?£N9!9é6¡jÝlæe²ËI·îCXr,y¤FêË ¼®½Þ…õmMöãüYt"‹Îìl
-y›Lg]ùàFé*82À6·–Å6xߨæùþK¥å±"R§Nì˺=äõsS”+SÄC/kÏéô"gÓ Ñßܶ©ŸóܒÖ?©~ Çž*ûiDÀ‚ÂŒ0Åå-.ˆ[ò<Ô¼*Ò6–KsSéÀªOåÉP¸Ë¾ƒK­'P)
-úÈ5»þ¶Ð™Õþ]—®f½€½ù3=žE»qš
-ûyõ­zJÆÐÏúá0Rßn£&7ù‹UM“…V¶•<Ôƒ”_Mæ ýbš@ÆMNMVeV¿jªÈË,C]ÃwW¿t¿†D×¥?`KƒOEý4“ª»Æ5‚Ô‡ÂkÏj\Û¸57?ÿ2u-TÊêÍêK‘«/lòºëæ®p@% nl«ì}›£Àÿ­ý<¹Õš»OGÏ#?ß?<cµP¯‚nÕþê?wïRíŒ!§Q
-}¯°l-zÿ°ºÜL‚¬´ËM‘½U™<‹Uœî£1•Š©$ßÖGmª1¿=I6¨nåoxõ…pl‰gá«)~sõš+J—yy©ÖIŒ¾ÂÔ‘WD£¬º¸Æ–»#–³‚²øiµ„ìx3Ék1¥5G[²|Ò|¿(*û}©¯ köKãêH¥?µ®2ÝöF và­Ô©>»¨Ý³ú¯¤¥œ$Öµ¼²ô6kÈ]Ç*#ÀÕ©Ûð.û?gyPõÖmèâü´P:§¡Z.à«ÎÍeúW]»_’ù¾Ò_‰*Ñ/ $ô¥¹Z ê2°èXø­Qß›r¡t“C Áêokv1QÏ+[wþßÎ9Œr±RU@Ë §™Sˆ Ì\owÙ>f¾”õ`]š±{Òø-#ó< \d9
-îäÔÅ+¹áÜSUƪ ·©á~ëL®(¢x¯æ¡8mÖªækÔ~¨¨,‡D±+@¦D\#ÔšAÛL”¾7ªcQùú 1C¥ÒYÃðÔ⽶Ô~ýÛ{žïìÀŸp­S!”Ù•íÖ+Þ9Z`‹'í¢•Uškzá­ÐÒìQ|Š€Ä¦V"Æ?Ÿª"( Åî¿pÓ
-¤ØfœÃñÁÓçü´èG{ØCÎ) ïóÈb®/®†heA$VÎ×ÊãÐï0I=7ªÔ¼?JÂvŽðN
-®9+|ËÐk©XÂŽ¦ÿ”¦^—¥ÃÒ¬˜ÍÅ–yDËëJ~»ýU×ä ;|J¯^«hBc­Oß&Ú^ž±ËµñRÖ}t ®[
-µdã5|=«7%óóLèºûwH`H.ÒüàPu¹AhC>JÕ? Þͪ©V9ÌçåáI²í…†¿4ÆÐ*&°‘ýT[Ïâß“rÇ@4æ´þ©}n4NM£ ¼ßú¹B;(þ`Û 9yá¤ê¦>D {å^i€sî_™Ï™é>Õ¹ò}üaXiWæu+)?ǃZ˜»auN} ’=¬BéÙÓQá}SbdLló«­í†‰–S;f¯£Hƒ ‡ü:kâ¹Ô+·ç«ûœ\ ºÕ;Ú«w\Wý<MÙÛR?ÒI”ù×sÌöÒ$ˆ{>D g‘+P»Þgà$„íE§f¤ÍhlÄ ìâõ6ôScU"Ï/ÀÜ—iû½ø=+»<Gõ>a“œËœÓ*sf/@ wÛÂÖ…js¢ðqw>³ïÅäÎ ,±æÜvõk%«SÉuß4ÙeŶÈ5Óg3÷Ê€nضxσ
-ÌÜÅmý³“ºüHúr¡ÿ鸋/’ß“üŸ›}b5ûÂë½æ:|µ¯-3¶_sz‚b žg1 Óm.þ=eÞi;Zù`04˜HcÊú¹Ãû¾Çèky$ ZY²­Ùü„e‘Т`?4)øQ–êjÿn-ñãg‘U¦ê·f‡0”×bD_‡Ûj“õ»:̶ÝѪIë6ƒ¯à&nª¼¬Ö ÏŠÿÎ>=×C›<=<:;"E½ŸQë(Õ½lIÓz¾P´%8¥Òçï“ÓÜ+s‡úçœÂΌ;Å _ߎ50ü2#k¹{G˜Õ\î½v+qs`]*æéôY×Áma¶™ÿÏgÿpË]ÓðGéÝŽ¶T£sÊßzvâ4Ó«7Tø;ªlFM“¸Îÿùô¿êÚû\½0‹ "× |üBV^Q‰«¦Ìûíbv«»Ò“ÌÊnø3sx} 9›k‰«ÿ…r:£Q9R¤‚=RÚ(W¾a=¥÷Ýd_çX˜”ø`hxiM­+"WŤ{ˆN:?ÊÜH“`wþ+|2Ai2÷ÍîGO¾¿kß¾­ëu¾|ƒÐõwilðºiA{X$‹õ¡Ê/åÕÙØu^»êO»i0bp†,ÌÑ'¿¿GÍp—Z/@aëÑ Lº&Š(ç0Œ/üj'þI®ªÅßÑ´L£µ[Šæʽû¦Sû0ˆo%| ÇÞ$ÔOdÝb¤Œèà^2éWŠd^†É%•YüÜ:õ÷h÷i5ó‰ïωTÂ?|T¥"•¶ž®¦Aç¾(6ËY”ܽ'µî¨*éá+»´*µ~ýî"Îÿ#ó-gGBC^ë'öW2¶"wˆ&ä­ëkÍÇv
-š1‹rÎïÒë]¹HOVÛÚûÛÿ÷ræœÇ3ó=ˈáhhææ±ï }ÿj(…9韸[«(ï<ôf*á'ü¬„VSDÉ-ù~:îØ &˜¹’¯Vò…Pg—RzÁ÷K˜Æ5GÃ/J‘¸LsŠ1ÐÿdÚv7ªµ"*Y±ì6‹àØùd³bÇ„C ™+çÔ¾…øX+âÐËiŒ·ÌZƒÿ…¸ýU+/iëbh¹ÏéñMª&äçô€U©2—éâ‘v€´
-
-̱k¢P²)w¾iòeø Z3…µZ½M2ñ4˜®äÛ÷“³Gs`šÙTÜзú0æ‘
-•ÖÂ7Î~i½¯[Åù ;'n˜§>¾
-$/îÐ0Â&Â?©Ú¬ Nø¤ïÇçb–芽fƒ–×['#á¡G˜Xãylݪ|z”õ.Ð 6ýÀÂpAU™ÉBØršU‰wë3o?•ª ÖG§üWÚcãòÁJ´öXt.®¥Tø°zÆpçõZ’ ã~Á/·][ %ï; ‚éSd½(RXÛ¥·‰$÷q˜R:°(²,tÅÆŠÉ 5J{Ÿóûæg pÃe3a€:Iþ1j¬7i+r–§œp®7ým¢¿ƒ)õÒ k›†Ý‹¼rëO&+6+bwÝ}ã±\0RÈ~zÂf*RÏ@>Q7ü⟪:g¸?¹tî+æõ“?´öÿÈz¯5åq`kø
-Þ‹°ÁDÛl0Ø8眛œs†“}õ¿{÷Ììoæ?é~ú ¡$•V­U*•šLyÖk¹é+&Ùw(1=úôÐ_‹ñ‹÷‚!ˆ½ëϪ;=Ïõ°q0 Cº¹4¶n´åíú£?òFUÔÔùÇ"Ç6×xøYײ“âqÄ£ÓT­OZ„ù6~ïýôLÝuüdéqƒØk ,Ã.Ôõj̬8 û3ŠyÈ»Š¦ØPreaïàêŽ{^´¿ÏBÏ›eïÓ Ö5ç;¾ùýö¹rÞEÌö ,í²h/v¦,¥{ Q\ч•§
-tÜÞ#V !ê%~Ø:H­5ÀþéÖ8Ù#¢øº÷óÑ ÏW¶• y{OÖj=wgè„þÒŽ¹Sÿd’fñu|ÜŽ·2Xú‚»×=ïJÑÜö:5¸|¨€Ì¹¥r¤¸ÌKW^äÊ_?_œØñðä±Ût»Yþ²P›ðvÀ§·ä#¹ÀZ¢§˜
-Š,·YÉÁxvmˆôø"MÓnªôd诂ÜZT™ðÞêC˜²ºä±Ò:5áeç:nYi3¨ÚVÀ÷íhÛ(Êw•ÜI÷j}S† ͽ ‹?$ø¹Ž å]³Tæér®Úèo*cÝ Sas£ i]U•=xÏUª÷B_;ê 
-3ª
-÷#Væ³×\‹ø[*Ô‹N·¼zGÚ7˜|¤Õ‰`áÐêmdûPìA÷ïú›3ôs+Í_EeJ:x?ÊÂNï@ýµ<ýšàÝ®‰G+²[Üõ^6¹I@åY(Z…-k–æîo¹!½^={iÔM>¾˜€º¸bkÃBGؼ-› ÎRŽÉvÑNºb|C!ΆuGÚ9Á¿nŸ*'Ú\KÁoÈ#¯å;¿´Q£Ï(JÉÕ¤O,ìÖ7¤ùé ªs~&Ž0§Ÿµ¢Ê$¤­k>õƒ5
-rN9ÙQ¸E%ùUÊìjcü“Ú$!o~S6Haâõõú ìV¼ÉÅ(ÊÆÖiþSBwÕ›`ŒÉÅvãÞßÍÝ% ‘¦öÀ>Kµ|õõOvðEàoùé~Ö4 5¹TŒ{çq¢5£jXf”4ª³v9ï@»<Šä8¾y’t§¤’°X÷:å Ûµ†ùTÅÙ…x^ ü]E`TË÷PùT‡šÔl^Âì\X¨ =ó©),¤bT|h èP¸²«
-¥hÖèÆû0’ÃÝâÇKª;uœ`¾”¾Ž†"’¯»%^¹ÇI…*P®’ÚngM+¶éUTÿ
-ò°S¹µKpajðÎí¨Tz>l69rGÚp¦ý“[K\qûÑúÂgñ ­©NûÒÌ?ŽzaE.ü,}ždþ 3Ö-«wµe¹Õ?Ac<ò9†Ê¿†X£OŽT†=÷ãã’YÃy÷DŠ_S­¦Ã¥Ã­ô¥ª“œL$o§§×NÚÐÖßÿ—ƒ +Â}T}
-fÞõÂ…/9èóÓÉÛÖ'–dc«Ao‰·'•®¾D•Á!(ç\ȪjÙ_T_˜Ñ6}¬XE¾Ÿö¥Ã¢Ã¤µÊ&KãÚqr1O8Wö+xÜåÊþqâ¹ýîja@ô›úÔ·†c|@/.ûÀ±ÌDb%RËåc¸æÛ÷‘ìt…Ó¦·°ª=ôçá› •R“lüø—‡ñø´y¯ÐþµN ¦÷µP›rÁàºð¸uTê™Tûð7#}ÞÃÒ;¼–$ý°òypþi%ItÐÞ¬9šÝÚRČʺ€´v ² }Š²×gßzÊsBw7¼Ò¼Þò-rlÿ¾7£ÆUò÷ÜOôÖížF­«¦pç>lå«J_m÷‘–˜±ºÎ÷œ7ŸÒ*ÑuÛ^ýËñùŸìZ»¬šµû—2‡¦Îˆ3X}?ãÎìØ<èaÓ´öå"öÉôéö{ÕŒÅ_eD† £_C
-Ï=;÷½<âû%•¹¬ÍÙ– Ü¡mdJöЋ%³W±œQkÿæßÈ…pÒÓïRÕœó;q; ¶¨údqˆ‰'ÝÑj#cqÎ蓺«Áý÷ìC<ý4hnš@·h×ÜO¥›I™ë—á‰ýêO;Ï­và¢ÖtX*«Š>Ìc%ˆH>FïoSî¦Lña2~lÍúv•*ÛR.ÂÛ‡»–¨Óšº\¿ÄEƒ$ls¾t½¤Â’¿GK\Í|=DŽ© VÇ)æ8Ö­(\’\¾oµaÂj†:– 9©[úGõ‹%¢®É<gçü÷´ÿþmHn‰’ÜIZsÖ‰oÖ´Ùß ~EYãŽbÚ¬}ªÕ߇¹Zi;«|õÒ¾ñë'¥+ý›ùÈÕ¤¸Ò!Ù1ö‰’Á¥-iqw G€;6°Ý0ÕŽâä`œv!^œÃZ/ßFÄ¿gÛ3ÐVdR»žGd#Û ;ƒ^F.mó 8›ÞF—eÊÕÇ»œ‹ªïj?)þÇKX¤V~Ù@&õÃQäIÒIeëÚŽgúþ»Ù¡¯x#Yém¹×‡—z®Å
-ß M,!Hÿ2eEêÔ kS³*övùPqt·ñäñÖ¼j8Ç{Ô×9 ¡ªÛzMsæiLèár%üÇ~K»÷¨ ¤b  In‚¶¼J‹ý9‹>ü˪²„÷ƒ%Èvù3¼È‹ÌN@p¥É~ùÓ
-¡ð·!.ëû·ÀèN¤NÌ\hkîòj¶ê”“\<ð«5[(CGÏ9LñYR½„ ~ á•åtþ×:>7[\oô<åÜÖ‰ÇU ùÁõä{0DÖa×»„ArÛyÛu`#&EDâÐR~ÊC¿ 1 wÆÓùŒu‘´ü+ÝáÊÀ«‡m'¶#lªçök[¾tž4M‰ôeÓ¥ÚofN=ô×ê;H¤û¹9Û°x'äøhÉ¡ŒqŽKO ¯}¥Lì‰|WÞFð˜XD ,^Úÿ¢óß$é(œögj’ãiMSÅý=q
-²^Ã$÷Õu8ŸØû9/-¢áA]í«;»q4þ›©§2¾ñsB~ó¢ÌÇs¢Lvi=›}/6cèú£?Zêó§Ú¾æ€õp¯=D²þå%B`7Ùm@²Áøe.WóÀ†fU«÷ýÐLßÙÄZu¯9&—󛓧÷±êÃlø_SÑ*U¬ýã¶ÄϽg×~úZ`Yõ5T¿žî¤½@. ¾Ï®Àm6ÍeŸ§þeÈOV!i-žÝvk½èÚµÆ>„¿‘w¿uîÏ—ž_F´SXƒh‡‘ámÊí߈¥ sëWr‘·ÞéÓ÷R—c¯Ôô` cŽòÊŽ²u·Y­KÈ)×b‘ÇúiâZ"Š±ÓŸ£Ø¿{Ëhd˜Û;‘•² W+ì¾á‹Nïˆé+_O‘’ÏÂrÕùhUÝòþ-™Ñ«ÉZþ‹Á’6,(| «!ŧ&ô !éç„^Ùö>±f/Ás€þLÂ…mZùhþmHÁ
-–ûù•hëm\ª7/rÐ'ï;¤º© ¥™ähPßÚ®0«J’ô¨í{H(‡ÿ,Y]©±|›Ð5ÿ:°Pl:1JŠÚ×¾Ù‚Ö•Aa‚)!ñ¼÷GùÉß.V:Ö†ÿÎÁ¾€oì6~7­ñ ÁÀGîßnY3ÁEÍ{mÝÂÜ„×Úr;n[#¤hýÇÎúl ®cÃÞÍ#N˜9Ym “­Ö<Íd™?PÅP‰ª¡´Æ7H?X4âþï¿ÿú°ÃkëÅ3nˆsD´æÈsç±´õ„—§éËòί‹ûn¶.…ù–à,¼QËu^@óÿgÈ_ 6®¶ ŠÙ¾Ö&Š‰ô °¿
-·Ü÷àWößB+yc“ ìÈ-ÃÝ,h•E¹Ž·ùâyZ¬¹‹|µN…#mPaO WGòÁ}Aô¾Ú1Ðò³$"NÃîKVc{¤K…XyCM›7hÂËÏ ØO\åìÂÞª˜4&ÙÑÄ·cjÛcn‹Û¡@¢FKŠ®,F¯Tû
-ƒÜÉO=èª$ ÀÌ*ùÆ5Ôihêƒü*F;×)PZÙ<lH[å
-YÌ‘=¨û¸íþO†küz³FìzL!L+‚W1²´ÍíÓtÍé–xÉÂ)ØeFæÊ×Ĥn5‹–øœ¡ßZ:ñnýpîÿ”ÐpvnÛjÕ©$knûÔ oŒ-û.u[·aœJïØì_°i "àfk;˜ø«šoùh̹…v/öW0ÂO}:Ó‰±9où°G‹;ìçô-ÊØùZ¯Ò$„ìÿ©æ›‰—Ma®
-]W!t—ËîÙ;Š`åñå™WçÊ^OQ["0³ÚÙ9÷¿iÏß2ö.u{ bív^«!àü²z½Våî *\êd)¯È7K›ÁVJ„ „×üš• &JýÍ ‰.éê(Ý¡:þ“²|jJÐZˆ¼4ZqfF8‹uç¹¼Žù×ZÙwÚ^—GXá.Ü؇S[`Sé#T¤Ò¥ìŸÜÚ’þéÖhŸ8 ;×çŠßN×þÉXjº*VÔ^=Ëø° SX²¶Úê$~WaðžTQM.<_ÿ»8jø²[Ú¹ì¹_.²T™ë4Ù1¹òtg·3ù§NIΈŽ¡5Z“gP_av[UZëûߦdÚÍ<>GžãÆœR€±5¢꘱Z²ØǪþÅ:vȘ>
-\8ÞЧ…Xì™[]þÅ`Õ"Înfú|oYzç†xšæz'âvç,¡¶Ïk}V¢[—ZsÆ=íaÙÔUåhb2xQ­‹°Ñ1`zÛ ¸èS_VëmãtïJç˜ÏØlÓï7^Êöåê»ÁªÝ¥Gº•ÞoK<…,e:U˜Îöʾ̿åvÇûJ+cÔøó©øüY`ã•›i <=VÈݤÂ_KÎX¯j÷ƒÕaY—¿6 `pcêY–Ÿ·Èé.›DÀ‹SVSCã&s<&ÕÞ×Æ
-ô ¶˜÷¨¼Nî˜J<F¨áÃû.íöKÎ
-ENçœÆ:xÓ>iVêÏŸ×F—†Žœ9²æ!¥(Au1áÀöŽ]ý@R¿½OÅI¶[S}-p‡\§Å2°6öÛU…7¶×¤5Õ;Cãàµ@~õvåÀX¼§0ƒ ‡lÿ_?ØÙ`â¥|gßÏ{ÃîZCŽhYÚÜ ëÍ;=Dͯµ1¬¾¼æ»hŠ[øñkµÀîEc%æ¾ ¼EWXby|Ẽ¾h‰wv¶£Èãae•ûv˜d‘þ%ýgNN'pÇcÎ7¶M€õIŸ¬FAûZµU¦ÍC£ ú†×êyØ!6&óh^ÿò1aôÚýó¼Êüõã ûÝd7ÐdwÖ[ôš:Û »‚¶Úæ 
-›VnÈèŸdpjZ×czæ8à(½i߉F5÷è#RVÖykpª€¤]·V’3XCÂä÷è?Î>›_S
-ñ‰•µ¢N«_0ÛóXZ•TÃÎUi¼aDÖ¡¬ÉåŠt#¿’ÝÏŒ|þ~ïþh?~]ÁºžáR9SòAy§VÄþ¾Ùmlîj%ÛŒTΛµÊËî”T‰f·¨½× ü?‹Ck&ÑBî;—ßUA!Ž2ÓÖî‚ÚTìÊe ¯¦„¡Wü­ªŒõr®ÄA}œûiöóêÿë'º,-G³¨[oöBG²œš£5öŠ †ñõg+yݪe[_f±Wšh«xÖû¯!åÝ[°ùðü¼šS1á6¬ûj[îmÎ01׊ n¨@öß(¼Ï*»Ò¿³kî:¥Û³3J¯{
-N«3×øTņ@–¤~Ú ^yõ8@ g¾r>öÌì›ÓÒ¼ßn²Òý:þ½îÞë¥DBã# vúäúÙºÞœŒ)QÊƱ£T³‡€¼ê²íñOògiñ°ôüIGö߆´žv©~[æ8v_ |_#»ãêèJTu.ŽÉ¹=šÎVÅÝîò•ïX°Zkå—ˆkU¤þÛÀ¸;˜"—\¹U8ð¯V§ÅEü+`†f­(ÞB¦·rÖgRø¶ÄšÓOÈôoSÌØ< D›¢^‚È9ׄG(â Ø•°*Ïš‚<‹ññnHÂö‡;Ÿüß|£1×6³_C ¯üSÙU¿Â;£ÌÛHs*o'òÖöƒé”ÒjV¸}}æ `÷[¿ &Žø¯Å©t´çI։ĨêPéJºžè d_Xfêý•–u+ÖV ¢qÒ¦Z E~²•Íü„Œ¶x¤§«CS †}¶I£OU?LÞwíŸÓ*;‰[úD·:»mý¾¥`¼©ç¿+ƒ‹?ï%ù²<&´¨jZ%A.i=ÙÆ8Óqól€ˆV:6™¢ß*æ¦ÚŠÿßÿþÛör[lt9b‡¥wQj¤Ûɇblmvõ½TzÌ€R®Åt {†ruôsX7qSp¿ø¹qñwµÉa{ êñåÙÒÛoˆ¦Ë ÊçxRºàº¿¢ŸÓG$ðþ´f\½lÌláZ@ʆøƒm+Öèëaæ½HnŒß'š¹ß7°ßt­ÛîÕØxT|zÔþe
-7§ÙÎé(ºøFOåÿä`Ç‘=¾£«fwzžKD¸yØߣ¼«õŸÜV Ó&ž}à(ÍcYnA?Î~ügqðoMû*PÍëØ¥ 4F/•Sô—·°itÑýA›Fd+&ãM¬¬ý‚¢ÁW
-…vcê(âkÚÛÏýNýôŸÓa•¡ù§²“Í­I››õ/wð·Pµo;a½ŽG¢þ$ ¹L;ÒÞ~Ÿe ‹ù<¢ ô ì›£®j*ßTC‚nAÛš§ë”>2jace,zeŠ}an\!³R·ØýRìû7î8~€A.v·îv˜žü`®~¸ þ¨bƒÎóÙû§0 lD¦îF“ŠùŒ©ù†Š¯ÃÈN,¦3TëŸó`¼•†½Dè /tQ™ÕÕ0-_­CšMÚŬÉì,®ô±QQ“Òº²¤úâ3%QýMÇ2;Ó†[w1úl>‚ó ÚÞª‹CQK•î«Â÷–¬2\·.íÁz³—ÁW¢Í»§y[oËè;G¸ÝÔ¾àû^lö§ØT]Ž qdþ@ÇðÚ€N(ˤ§©ÎdgÂœ·™ã_Ø5<¹\4}v•M~t}ÝZ…›#Îõ{¹}XÞ?z>P
-´_…SËýýr‚ðÿí8£Ý%Ó?Êõ¶5,/º3ºÂêºòV.VuðU/µîóñ¬Ýž›]Ýsøn¬æ¼…0¢Læ/´dj;tbÒù·4˜­0m¼£ªŸ;ÃNn¶É˜nžy·Ó²7YG½oËmŽPEšmW
-‘Ôž}+^G 7 ²°~ÉŸFý]Æm ÝO´òzƒ·¤z¡Q ž¢ËÒ±<Ÿæ ‚ôÁBÿ–„ Æßà ÛzöÄfœ=—ž¹ðm¢ü.)
-‚Ή¢XÕû}qžõI‰_wš2pÁêòðR,(ÝÕî¦ÜÒx­º··¦¡ò¡ ­î“Xû?/É@‚gFr}6Ív%š˜Ç†Y:<æÐv¸Û©1BRÐ8çÔë„®^þl<è³½Ñ7%}pÿT76ÎZÕ°Äñ½p´¿(QG6¢èˆ·¶±FTòH•@~CLÒª¸ÇUkp)ʳ¡¥â½QÅ£E…S¾õÓ¯Y¨frþ“dt_ÇóÇÄóÅi3ž·¦Çj¨Í¬Ûp5GGd¾™xa²÷ñvôh¹Ý ³•ÑakxÛJ×Ûà†m -›mFëmw¹\Û™ÓÛ7:IkHç烃=üc³±.•{²6×äŒö‡ó6Ð ƒE§WÔZÛ×C»NÜìQûôºc T½gßïÃÁLþÙàêZî4ƒÚK*û¯ÏyÞýAÆ
-ØÎ…o+ރ«u\ÓÞb õ_Bzo·íR‚x¹¦@ù4OÊ1ÅÀj…3&Õ%ŒÕÿ@5ñ×ë­z®º˜“k¨_J«±8«ŽÖ<d€Îög´Á‚ΨñªÖ,è.‡ML—‘æÆý[Ò~†ážáC§M$Ü8ç#f·­5ÓìÔïÉ=×(K±>%……ovÁ>LuGÕc£×«N+½;=-QþüX¦[f ¦ Ü蛣 ÁÀv½Ï¬õDc‹¸òd·ÌqS»óü³
-ËU}‚ ¯Fß.ŒçRÌ`“–¬¦fÖ®wme ¨@JNª@/·»;Úî•<{fÿ@>L„¿8Ðû€÷ûzð5 4Læû[Ô¡¥yti5‡±ãäA&ód§vîé´‡°eÃ-Já##o)j_§éá;f^í;·Wñeü|…Ø$ öaŽ–ÂL­ÌjÍN:;T8zT\`AQ‡Ù²0 Œå
-+K(½Ö„I×/A&7Ù‘ØlÅõ¤µ«õÎÖnù£½Ý½d‡æû.™9úõþå„sq:¹tÿt¶Üz©wÓË,ì¼®´#?®˜ÛÜîXuö¼¯×ùÁ_åqiWÓ§t˜ÑÏk±Üz11H¾æ}É}WÍ*󃌈
-›®%y’Ù‹½½klJóÀB«çrßþý®s9ë³[ó{{æ^b¦uÁJ«÷ÐZG¾ZŸŠÕ
-,Q+ɾ¤bнÍsD[1êvlß8ã¨év7ïn¼‹Jζ>>š–5¸îR©’ £¥Uëöw“é}¶Ö
-;ÇL£ÏÅEöõN´;bï\¡ªÝ=Ë Ú§¹ïtG“ó>÷&5z9‘*áV§¾,æÐŽ˜ã{RÐÍI·­'õyY›GÓ¶$¯0t]¬ÚÃl.ónϯŠo³W4¥Ñ=\óýbµ¹Ðó¤ä~ ÿÞ¼›BWX;Iç2žq~o67 Ä‘’”’s4ôÀfUÓ{q»8«ETsÓ´Mý]ÇQ÷&fù¨šè´ðÓùø"å!Ðñ)³4©¦ÝÂÙøßéðaÂ,øÕ§i”¥éØ#ùÉ–Ñï›ãÄ­oâ†}1hË(û[}
-*{sÎGCØ¥s›¬ÙQ³1\¬Í:MçQ̳±Uc‰Ðƒ‚ul¬KÍ×ëȹHˆ…{õ³Ó/wßJhe€y¸ƒ­yN‡œ×;´™ªWѨÅýž|Ïž~Ýk®ó<3Y!]§n¹¿ÔG6yvîcŸ`y·ùæ²ÌÒºÚ%F’­ýc±ÃŽÃl5dÒt÷«² “â"H—–3†ÍY¸°YÚÛn& {m;”üŒ¯¶ÛŠ„ :]Œ¤¯§“0hbQ×[ŽÉ;  “kcí»@Ö@ST´Ã>û[wÇ–Å\Mÿó¥·v«õ„˜“<»¹“ScgYiëÅû¯j—¿çÊEU™ë PÚ³Fæôè‚|‰5·åcßÂWní]`~‹k /Š$
-Á„E.ª“õ¾›‘Y1Í‘rf99Ìç®`Ç÷Ú´e]­N—1)i ó{êS®¥ÝϽÃaQtábžÃ=íO¬…¢g(0š&9zêý–Ð#}gø7½Š¥Y·³¥’·¹U}ó|@÷[¤2“W놀8]œ ¿Wô:$wÁVïל'›n‰F~¸®[ÓR6`ù’D]iØ·*>9Áè“Ä;Ü€*†GnV|Òà¡ãFP½3P®Å좞yè¹Õ´(u7®t†[웩fªF4ÿyÑ×6ÛY-ÏͶ5åYÇwrÀ {žu
-¼÷.pᛳ™ SεÛ=¸ô^ éˆÆÞ|êƒUïb&m;'‚©^šàß¡çBÉòÕqDzikÿør{¹/ÐÍÄÅ’äm4ÕÇÏ@«SD¥bjWÓ%¿|ð-˜
-î%'©¥C2œDï>-<‘´!ý2i®<âq<4~­ øÎEHjü¼WÓ¸YˆåµV`ÃñrlK@ä‰x⽬C%ÿú½°•ñÞ5‡ÇXlyåQ+µæ4üÕ^4Ù’ƒ–Àƒµíá²3…•áÒ%Ú~|y'ñëíòñ…+äßâ˵N—éjˆ¿['uÕ)½èEOé/›§JvcØ›–npÀ„,•]Îa7-Ì Ã&~Ý_±–Œ>u›—#/lFJR"JÚgêè´ÝÍzörGãèjÅ•Éw1©ùÙt ¢;Ÿí†ÕX"ÉÒÕ]ùöT»(£s2G±‡£26=ðÝÚFf·FcRÌ×÷²‹± Öm™> ›3ùu)y
-zpþ@ÎלÓé™eœ/fB‚•ñ›H{ZK‘¶XeÞá5-í>!fŠÈ"º¢öNñ|ñ¹‡£Ù%1o¾ºúUÕdîkî¨K­  e Ê.ÈÇBUºÑ•
-e³R­Õ’0{'£öt-š%€G½2y°\Ì™v>çA³Lz¼-PŒÉÉ“ªßö{bÑÁ{¦LO ûêfÏiø}Ü’1=Ç5 ;…ÈŒ~å>ö¶÷d¾ lG%Ó”²4=ðø“Xî>Òã"TÍu4±
-Z/HÀφh»êª.ǽõ€Ðõ§ Çߧùà®åÄé“êN.^¾÷ ; vE»Ú¶ßì_'Ÿo•‰&Où {¨XÞdDKá˜hà(Ó¿òÆ
-o/¶o¯1jæ ŠÖQÖù\wa%vJæ·¾˜~ŠRýRqáqlºÃýÝZK¦¼ÖtÝ]Û&í:t”& Å3³‡õ)E•”oäJ<S›Ì„=ÿ9¥p䛣յ߈,Þ½$9Ì~Þq;9¥y|n”6mÒ¾”xxôÞÆRܵW¿'—A³6Ç &g:K’ûÈ2ÛIä…¾Z´óˆì¯úJ×¼áΰ*+É™òíUÊMZˆy“•!¹^„îðK¦TšJ±“4Di3158ק»îPxÌV,·<(·¨^¬¦Û» GrºŽÖé!GK\_á$Ü`[ý‰íåÀkøæ s¥»‚ˆ³²OÖ
-ÞëÔVÝÊcao¿éöòõ±œ æ'ËqáOnÍ$}£1À´q %ÇüN?h”¹?P—Û’+[úFŽ;¬mÔÜ^ÎG³á«+eQ·þØ›ýó– vBè*FN½Åx¡)ß^Œ KÃOÉ;ö[)ŽnÌŽ2£l¿g·ÎˆÇÊŸD»ý ÿ€–Î8hÏ#`òÑ
-‹Ïפ^ØóqD€@’pD
-¯×ß '±:©©ú ‚º Kµa‘}ÊɱÙ9Øxr3=ª7QÊòà­‰_fL6BQøïE‰_Ú\çÂ.P>KoA¸áè„Û
-Rg›§{ë 6g÷²0íñ?h‘ŠÐÞΨ×M~P›¡µÓ%ǪâE‘mw²o^ƒ=´¿jm\ª Ï:6Â¥iÈÅ¡ØÙk§ôT+-Cº ¬åªåRG¾ÿÒüÌ Û®lŠ“|Ç̇þ&íjhú£ŽßoëŠÕû÷¤Ä6›Òç<©Î·Æ„ ƒWZ“Å¡"XÅéêå‰ã
-­O‘0éWâ¹M—ª²Fêÿ0  >
-KþCªïf3ŸÊ™î¿téç„DXÕûó¬Ä¦lŽÍ©<ŽBÃóYô¤`þ\.Þõ™5fg{µN¦ÎÅdÞѺî])¶Þ×y“kA)q)¡rÍùê¦ÔÿQÈO›ò’Zå¼ÏdàÜCiµR Ìì£ìÕdî"$®½öwpè Ö»ùe(-Óå506ýRJrVOBèKºs$ÌöéS)0×ÒPv=Ò¾ÜMy0üt”Lö{÷ý? ‹ö3E­®|³¡ö[wÚfaZŸ(½ÞÑúʤ…ÅGÙVD_[Q5µ¬m¤Fk¿­½§òb“<V„¶Z‹ž6#îW7Õª«¶Ûš¾ì$­ÙÉ]’Ö}¾"MþVÉ!ÔŸÖi;uÍÙ¹¯l³MjBéô›1ÛñÓpèGÃkÙÊè/ãµ>á†@CûÝSùèwàÈ®6°ÈÚA^Œ¶#[Š†¶·ÕÐ:®Ë‘}¡è•úÙ ²wëoX å«GõnoGâþÐÖ¥§Éê·AÙ‚»èX«ÓÔºÂ}vÜ)Ñ4h'§¦ºeÞrÂ÷ûCwí®05¾m"]-sÛÐñá?H³à>¶\¨`2üœR¯Ñ¤Ò¹AìÃ~¤&ÁTZmé:*TÙ¡ªÒ—žWO_²_R$U•ÚZDC}ï´WË—ê n6ÐêÙ¬¼×¸ú@ßé±\¸ìò»lž#••ZŸiòó—q÷8;©ƒêÅg€v}ßêø*£WNãfÐ)Û÷ß•Qè‘vf6)êákç©hG­:ö±7¯€¯¶ïDè‚=²ŽSIëªí›û}aeö¾þdÖߨãÖ`nckŧ–®Îï®s°vmca$¡ÂÅgiŠØ»`®% Iù)l®—m<æ–R›ãritØ•q¾sŒ*‚aÇz8®ÑÇ{ÏIlfáXFEfÈÓÔàÏ؉Ǯ&/ì&§'ÑEÈfã© µ «—`DÎA¤B+ü r¸ðw4Êb«}PC˜?”(›òœV=;[=>æMœa^—­ÌôÒlú1/‡V?±Ój®;¼¤¢ÊÞo†RÒ„ù&‘a£. 7zdö»ÙGõ¾
-Gzaj5ùÙ­îß;ùßnŒ~îëpP<}~
-ß5: Ò•jý>¿ô3ñÚbN^7ÉáBFÍӞбCì†ýË+ö¥òz¬@¦Uú¨¢Îþ÷—¿É‘–jÝÀ‚‡«-ñ˧S86ÿrR«?”Ôe¯¥ýõmÇÜsfmýe™"Œc}R-²QæÂE¿ìB®„å¤e8ýB%ŒMUÔQM³ŠÇMÓÒ;s),x`Ô8˜3Õxª{
-à0—k~å„h¯À\°‰¶7]ºU~ŒA¹øà®r½š¾ê ¼Ž‘ÚlvXŽ”ÕÖ ]‰U…ëÚ4hÆ íŠhonøÒbÿ¢òÍ|¸-ü =k³ •aèÍÛZÞ»"]«¼l+‰íãþÙ•óÅ×j7§°RPXÞÊŒg<Ë|@ùççR·®/ö+ñü×F ô2cï³Sszdí­º!û’%ø
-jÜöq®aÔˆ›íMô»UXã1ù©éáиúÃi):«ÏðÁ5ËÜe»þ}ëç_X±Ví"ã}±¬×æœj*‹êK–ŠÈè³0ÆQaEÁß «è}÷/U‘›¡ªÅO²T9V·#ÕBõ“gnš˜aà• Ø3üãkÏêþG?ž»_ÝÖÃ^b¾X<S<÷\/d!µØ=ÛƒÄj_É̽^gŸ\ˆ1¯¿ˆ‹Þ“d§mõÜóL¿ÔTŽ\¿àBÄ
-¼Ì ýÛÓûÆZã^÷½^ËlúÛP³(Bß¼“›Á‡Ì²óÓoÒœš —ßÏMžžƒã¢q•†™v/(ƒöy.'»Ã"­™ËÙ•s—è^¢¡õ‚A£_|gµeØÒ·[z[$ÞS~NÔï´ò©ä7Èé
-GN_ûãw´^:3èÌÅçÔP[? J1*dËôdÅ:ô—%‡ÍiÛ'z¥¨ )σ²ÓWaQLÎXÇRµÃeèf9³Ûhç/cŒ©\§0LÂñv‘Tî»Ö@]•‰Ù ÔPÞ •|°pÚešZã­<Í-ߢs¾ƒ—åŽ|¼œ!o.˜4=ÎÊÊõûø2*<´¯œnÌæí²ýa»ëy­¥ þ¦S¬&ƒ.y³jÍÃÒÅv'Î2f”nÜ%kgó,W(žèwh12—_gEÔ㙾@)eÔ੨¢ téžÝ;hžý¤A¼œÒ»>Ê_j’šÅ‹Þ¢sk,·¿Œqù@E#I÷/,Z'V¤>‰>œÎñÀOˆwÖ…ÒÕü­5ÜÕ &²Þ„›ðÇ·Øã©5)/wUsŠåüÒi·ëú,¨œàˆ¯÷Á*5\»ænü.ÿê…õsdÚɈ×TìRR<f›£Ñ'Dßã†ô€ì`ø›ã•NbZ£<6¦ÞŠ
-À0
-s?ócÆîþU;~v¤)õ4&X ¼`v_FµýÕÚÍ35$6í†STVã‚Çmï\)aÒA¿ýô«%Ž•îš+7OzMÙÝ-ìäº2WA
-ƒ°¤ÅÏFÃ;œ¼œ+ÉÉùúÕ”={±7Ø¢4®àš¨ /ÕÎ Y£NW¢…T¯‹ôã­ú¿ðÙfŠ&Ó«µnß…æØ
- ml÷ÈYèÎÇ!jX†+ܳ`^nÀ3{ñ§ÒöwÍøuZj쨮SßG\xÓQà¦(Êwg:'ÆYÎ/nðúl‰3–œÞÏ1­é©Ã D/ŒýyCêî¹›£Ó±,Ñ¥}}¶¥´Š8Ý<q)ýÍf1Å@#:kC¤<~µsÅYL}•teÀ»íí¨åD×\'«6³|ÍûÚÌS?÷uS ¨;]a¿ ‹•Ó¢’ÔßPˆ 1ä`â¦×Ó¥;Îeh§»ûMU_Ý÷ÌæDê˜ð~;p™Îéü+šíöSS•ŠEêbü¢gVhkýÍõ¾µQ£×…’†ïщ]iAë( hM\§©ç¶HuýÝ7õmµCNëƒïaòÛ'ð%I"·èl8€Ÿw ö£³^úXg¸¹ ´o³…äÈo ÔøÜ;Ëèw^‰*"!M]'Da—|lT¿wÝKܵ×P^ ½ÊÑ Ë¬ší¢qc@«JwÓfëðTí=3³Ï§xû#/žìû:—÷Vã›A©¶a ¾qRÙ”;#åýÐÛí­gÐUzi¬7‡÷fY‚ž—-±ùã¯ÎFy axK4K6k.D¯ØY¯§©1ew’…¸'ëÔngÌÄL f{ÆrTá­Žüõ¯ÑŠÔÒÌÎ}È…%*ó“÷ª6¬}¤¹Ä\d¿¿eªÃvyÁ€–lÔ,11‚y‹ÑÕk7}Ìw±RÄ }s )È"iš=ÆÎ3æ>n:~µzu´„˜÷Ÿ<5Ÿ‚´qŠ„ôÂFNWë3²–äÝù,ñsh•noØzÌ’’$݇ì*ö?б?ùU9y‘E™_ˆö.R¡·®e¬k™ç5·Ô”"(†‘˜ 븜8=
-¿» G¨rô‹*JL”?9Kén¤3¹«¸H§]Ôê-4;žÔïÛÝ­{¤$ɪ{ÕXùvH^èýƒÆ£Biea³‹Î3aÔg—š¥•ZµŠGt†2-öÖü&1}÷4õïô-!>çÛUuÂåj ×£©M§‹Â“$H)£Â·øúÔM_·®öîþeðÛ–…-mÞhË_Ñ_Ê[í'q[¾mvkåÓLZP‹ñ`2'Œš¡½¢î˜IóR5É|{§‘‡ðÏâp#©`œý¦ª “_Ã~\“9öÜ›]aþzŒx´JÓåéä°hÆÙÉ^þò3-t7À(é¦ÝqíºÝ`[iT·
-.§‡F¸š$ôÿ¾RKÉGÕשùq 7ÜíÌ„ˆæD —O[`¦Eµ*>3UŽšƒ ¡‰xB‰á¯’nB‹ÚXOÍ¥‰1:ø«jÑ1eIªÉír@JZãlB!Ÿ}ù÷ÈÁ…LÊ8díH­ávvz7¿¿ŸFâTz÷gƒÛrK{—Äs•2º¿ý×zWЯLjqÊÔ~m¼jc[!à…öŠôX˜Q‹‡¾µžGAÎû!Uq »‰wYÿÝr¶¾e’¿¯«â~\Ø‹\[ÊΧ¯ îðŽ4¶†g*«Uq‘ÕB:ëªP,¢…S#Ñ©½%³ÓO|¿R·b!òQúŽK×Ç_†å8°VŠ FþZu -4·=]‘ˆL˜Ö"oݨ “Ô&&¬È-RÒëõœ»œÍQÂWŸ@¤y¦â×ú O:©:P¬f)KÍSôë»~ô¿»ÇúÓ{ÎþAÂÃOŠI! Ûóú]½ŠñC¤ô²¸‚âf©ø’éÎŽ‡uôî~`ú%¯?o²s¢‡%n¦j¶ýqËsR¹I¥£ä©çƒÐwW$JK ê [fb³G/óº˜by£Õü2;0ÝZŽcÕ"« vj炙®–_§«:^v
-Eý“Z)4ǪRŠÏ ,D}™do5<ëȸĭß*w%]õ©ê‹Î*YªêÖ/T• +æyñÅÞ9'õIùdqÇyG] 
-êZí¿„ ¼”ÐUÕðÞÔ&s\ótCý”I°›]¶gk•2MEWH\=˜)oª¾2Ç®¬– ¢e ÇýåpcÓÆH«:ùDlG›ÜQínª+¥îöìEñö+¸ !ê(DîÁÚÉ{Ù8¸ ‡íùcw™
-;ˆ•ßÅúóíâ¤[Y«§úTù¹ÍÂ,w¯áäióòcâÑ ô½³–<8u2­]ƒÚγò¹ûMÐQÑÛÙf†ø–Z¡d‡6<8ŸÈ†þ…9qÜxÞ¿òÁI[¬>$ÿ‰–=¥M-ýOÉ=ÝYîV†)”ÒÇ`hç­:šµ¥íðؘ§w-dgÜ4ÃlRÓvã]’wÅêP \ýà§oSéý[:)#Žƒ¦­dïÝë²”ší¼úì¸ZIo%¿¡¤/›[P´ž
-Už2Êd#ŸpCæpkäÏn­‘Âóýu¿û£kŠ;®_Ã5±‹ ‘Žv˜Î˜S5ìoQjÐñ\©ZW­£ Ç1éö©C
-GÓ¼{úåÝl[óAÝ Ýe÷ªúýƒÀ¶ˆGª-0¦;»Á_ë¹Iù*» Í»ú$¥E4ú#®Tªn=Y6ÆoÒkõü¬“úÀÐzÁØ[~JîÅÕXíEtêØæCmÌXŸ5 Û§q}µ„»`¬w-Íz)ŒÿA9÷v1»6IÏ<?@
-á]ߌ,¾: ã%§È«fÀüÓ…;»£¶w—[¬N0÷m-Ÿòé[my•ÂŠS)Å
-B«8=öF3¶$+aÿþ0¼õêúÂjÞyªö“ƒÞ’$-²7•“¦ßc;#Í’áVøÖ¿YK‹å9‰»Î{K­©ìP³pi†ðs7ÖꑸӃw¡ w¾Q¤¡%;õXpGºÎè—c¶ÊÕøšÚ=”3.éH¤&»Õî£!V€mÕu£R[^»÷oÓÐÞápÒ#†_‡kÚÅÅìÎ|ë/ïÞ5·µ57½~•ãùoØkei(öf;¸2zÞÉ—HôÎÀ0Š®`P) \{.â†sˆYàÜ×|ÝêùSBVM—°[Q-4.[æAß’yÃdjú@ínqrª+åÅ °K~êÖá˜#³NY[§ýÌWó5êõÜÇÀd¤ a|n$Ρ뵦““ù±i˜Â2]3Š0Jnc°4Æ”ÍÑÈË•{¸Ïš°y_йVÞ•£DÃÞTÚ÷!Ǿ6 µ¿ûi»H³;kÞpc†®Ç
-½æ—ît29ë: Ü-á—ÔñÇÇs“ù~Ø»íÊe¢ˆ}™¹Ì€Ìó·ö›õhaÊ¡?—_¸Ðœˆw©æåÓñ”Ãlxö†æêìxÖ'˜RÆ8p§ý¶"0£ÉYãzµŠ–3–ÕÝ Œ÷O_7 ìï|×ïf \;²âªÌ}£BÎRð»·´åø°gª×r
-E2Ò.)w²"®Tíøµ¬¦ùÝ®o;‡ªù¢=Sä7 8n„D=oCÜÌÛ^ŽÜhü ‹=Özfö²7'{aÁ Ál9ÇÍ"ª=ÛЫ"kçRÛ ÍMG³¶ ²knfùŒHgl*y±™t«Š³«)ÉðPˆÚ¡5€…LæíŽO>QpyWi] Én^ý†=¯5X½©GR™ÁLg ˜¦{9v–£fy|µ˜Ö7³Éå&ìÙ­ðcÊ[5¢ùzІV ¤ö
-=dÅiÌØÙùD-øÅA³ÚâÐq²Ï‰ÿ9üGɺ^–-¾ÖrÍ#îÄÙë7_ut|L°ÀgÑ´“}‚î­‘Š—´¥ùÇFwYçM¿‘æÄÙYÏ.\@.6»…£y(™º!_ªÍ[r®.N«÷xæÚÈ@žÍ.á5/(±‰s0î\(9ïŒõŠ:耎$=,¹àœ÷†È­úF!DU1ËçR¸O Hïýœ®A’ð¾dr?³Š¡7þAY/ñòîÙxCL¬bØPƧ™“c,[¹PQšgÕ¯ÝïÉkúAe;Õ/*Lþ¶Ñ1¥ ‹ã¶ÚIWß—\Ðx‰Uu²_2ë{É­ÔSÏÙPd¢f#@ƒ4zZf|—g¥S¬½­Ú1¸vŽÕÜ©¸³ç¢ë~} U:uMýh¶U –^¯‘šh8ûdðB<B€lô<ÕŽ$¨0mPëý°[øsï½O²Aaôc@ºO ÛŸ†]$/æ 2¹ŒRT©l¬BÖMæ4‹",!Çô%¥ŒÆÍùÁEÇ`+\èVì[ CÄ-¢w½dl†ZúµBAupüNOá@ak}vº—).nŸöø5UKÃ]ÚÓýê?t5ör½aÿãIûÏ@o® }q(p ‚-e¿õî âöòå0~¸…UgñòßÍÚš<Qû·uà÷sgîö>Xû¹òŒÈ1H“ìZQkû;#ÀŒ©ß¹výæžMiÅ¡?¦ã[y;v»ZVõÚYî_JüÌ2=´Îì﬌å4ß±G]átc¹¬ÊIµõ6ÃçåR‰›ˆ¿¡#âßßnÊëq8¼àç­ÔÇ“w0^ H4ºöj²îÕûln­¦÷ªÍÔF9œ!ö:<¤ìeèÉýz­üýÎßLI™èLVQq­ÕðnwWRŠÞ{ànºï¬×®ò èÌDºOE¾ORW¹îÚA:Q¾½‰”­×ÊÚ¹.ã 3 ¯ËÍDyÓÈÙ·Ùë]ßwE•ÿ¾ƒ…ÿ^¾®þÒ]8_EMhÇNY›=°eÒzÙm:w2mÜŠa߶86Z¿}Ü*ÕàY25r˜ŒðôÎõæo…9$Ì¢I/›Œ¦Þß½Žh³þ‰®ó÷u˜)ç!°Í]ß»>ç<z¼&WP•N}Ë×[ºŒºZê(ú¼½òZB-BV¦ô›±Sý¾-Ó»ÞÔ«kQ¥œà½b¶Õ)ûôpŒ«‘ó |¤J=ÀõF£_§!y;ÄÚN©F.gmz3Poþd)ï»17g6<V¯´ñÞÁOcÒ-zá%ÝlfE =öÅÖ$ÉU¶Z.ÒݦM Ue|s¾ÇŠùšÖ¨ó€¶*À·~ã‡t•À{_©mV9øé´‹—-üxÍ¿:>ýWXÌä…Z€ýÖ’c³!LF8º•uÃïÖž zól}ýrÕƒš`ˆ>Of¾Š1e#Ú|Ö~KËu
-pëù ³Ãs•ÝžàW²®¤™—Èfý÷`+SÍúSœ)å4㘉‚:½çàM”ü×uqÃC<^:²_TÿnO;ù»È¥ ß:éObUTÒûNöT† ØÊ´NÐc1¬²z<&
-0
-^åx{
-ÙgÛÐqûµWÙ”*wþýI«gòW–Uš(v‚l‚é¶Òãî4ïÌß¼ƒGã+”ËÆÐþn‘¡Oê†"vì“ß)î »ÖW²©³ØßÏÀ,Ô²‘Ò^bÙ®xåji#ØõþnY'ÅkD¤C<Öcw(ðÔˆÖü}ç¯7»…˜Âî¨rfûÆ­^r'i>;ªÑ>êÚÏúq~PÃsàSnsô7|jcž­^Ò~|’¦pž‰
-?6?LŽ–ã¦äKÃ¥6êÛEfei=±%¿Fc£¥s‘_3Nœ¾ †<ª W6×8ëÙ㮞;þøù
-S#‚¾Só¢Ü9yL®Ç×^‡Tù¢²0Þ+9á¿¿ßù+áL¦…eM©´SÄúlœŽ¼©’˜ªXÊWAy­ߘSKX·Ñ§„÷Ky¿–º½¶ùÜ
-š &/y´ÁVLêÊ$eùX›UT8˹z¤¹RRØaÐÜXÛ©¿ëRkñ{Þ©¼ø®ú>M'R°î“³aˆ·ŒÁÁ]ÉmeÇZuŸþ»µ»öS*æÄ( À’e÷Šð³eüyüxÚ·gÎÕqAV¡äç^Ì~®žm ß?ãÌ£¥óÈY®²Ÿ§"Lï¸YoÖJòæˆYÔ}¦ õTªâJ°
-íÒCÛ«ôì°ñxTVÛb=¬³îwôÙ*ÓôU'–æib-tÊŸG!ÅlÄé•û<P:§"ä³]JTe­tGÁY›Îüæ?(4
-ªŒ9”fºÃ£àNãiUY‰t±×¶+†iæЯ2¾HM'«Ô㉳Þ6F›piqù»
-º[;è3д^Ë⬙-ô&ŒeÖ?ŠrQZ΀Ÿ7A®.´ûf­,^ý·QoÉÇ«(&9÷ÓU·;dž:+y‰Œ’lüöÚgl’%ß܆ ôê#Ä<
-” º:æ)1âí=owä°Ct¡UKÍ5„¯Õ¾YcÿüKvùÓèwQ'=ò ¸I 39Y©pXP¼nQXúÔzúf¢>䞧sXœç× Ìa?VËœZ&
-’vÐ÷}ܵ¢{uZ¤ÓªP¨MGý¿;ÃÇÁ²­x Íj85Š+Bj</xU—wë
-u<·¦ jŸwdMÑOrO
-ZÕdè—ìN¯üT‹©ù„;KÏ–©¾ªSÍöu•3á¸ÿæ8M˜]Ú
-ˆfï#"6¡€äòU„Ömb­ø`”VÎ{2K2`ÈéÍ;ôÓ
-1®Û3þ¥í1¯ã3Õ +Sƒ6ÒºwÖŠ”Ôñ6íkAk;i¿ÓÔAÓ¢võdÔ× faZü,¥ɵ·Ç‹f‰¼7ëNv5ãààå=F
-S£ 2NxuBÏGO± Cú±KµV°oG´r¢·Ó•0‚s'gCÅ*Ù'šñ3cÝ º8)ƒ ¨ ÃΕ¶?sm>~¶hBÔ«“¢E&€ÿáÖyIIõønXìbÚzI››²à>¯^iLt
-eecö ÓCÒ5ά¾C…Ïžþ¬÷×í*v:ªkiè»ýÒ“
- ãÃ]—&›aé5ZÐà'¸ ¤¼úvÛz[1ëÚåÆâé"™u,=˜êö[!ôž»Ö¯Mn­¡ŽÛyº@!·;Íë Vh¡Kò7ÎY “ BóiÏwj•Nbt#o?óMEù»ÆM qè0ëˆÝªêçµ{ß›¿Ë'+Ì [~Ñ[Þ½ž5=G—ß\Au f]>cÄ°Òé[ˆŒœõ¨Ô;7Oèë¿Ã8ƒ‘woò«Žï›ùVÆÒ’9¬|£òØ›‹¹œŽâsp‚OF½gôdQ4Óú÷Ž$ÚÃSK´f†øŠÊ»ã¼õ >Åðè$ºqaSØwÝFUÈwlXðÇG©yM€µDÖ/ä\ªpò*nß ”{“ú’±¶¢‹A¹mÒ¦̛Rk¹nvl®èÞÝYH︘ØöÜybûÈ[Èìš- Z¶øVý§âmÃȵåB`)e:'=ùó Ÿž5ÙÔ&ì#0”áP);£òœ`FR–¦ƒX¥Ð¤›E§ê˜¨ìu¿4«ê‚U´Þîù8QŠΖ¹ŸnÕ赩w\%s ó+{}ë2FDl.V3­xÚ†ÝR¹–ËÁ_¨‰ÿ&©“œÏ Y±Ý %?“R OÁ¢ë,ìé­îâêg°£g˜JÕá‘GŸ¯h«´Çëpù—ÙU óF=÷^Œ†B¥¢7Œò;
-ÑàT _•)@»€? q?Žœênû¡ôX[`Ù¹˜Ï®å`9‹6 _xúÆòN­Ý‰~äó2ù¾.~¯©oäó²FúFµ»Ð³óbÜ·w>ïwhene>˜ÐbÓiÌg77Õw§dÂ5éµëÁàŽ}{FóÉF ­*ð’X7~ò"2òšˆTTð]o°}tñíB—²¹hY“ÞXÉÕ¶‹*sZ8MûÈz N ˜õcâ…Ör#Œ÷ÆU"Ñä¥ÕÒ y
-WóèÄöL¾&ô ö çapéÜ }ÒãÈiO¡Zw ¥-ÑÙÈlÎæø?¨ÕÜtMÚ7Ñn~ë
-7‡¶ ŠAS€±¥ª3}Á¬I—šeW|Ë8¸m²Å|)!å.hú#EdVTdÊÛ Œ…ƒðÔb+ìh^rdùy@<Üq±z¶(ev•üQbM2bߘ«šÖ›¿=(Õ·H`†°Q3‡õQŸgþk„d Ù
-¬;îÜ&éOÖÈÂ8º|jüà‹Ôæ ø›—áAÑÛ S¦9÷Û{Í Þ‡Ö~ò»‘·¾"Ž^“:¦Äx×ЬMëT° |¿é*#Ö0äâõ%·¤xœ
-héy‰‹>´ Ooû¨y°xð'?íUŽ×Do¹´lÿ’»¤v™ij&ýè¿Fr{â°i´ÔWa:&>½ñ¨5VuþÆÜ‚ß* ¸‹eµêò“Ìé|ß
-ÀCjgÆ(Î7ï(9Õr½é&3(³»Í¶h:ã¿tÓHÊj/òH,[†øIQïc®½ªVVt&e›‚Ò3<ð©Ü¢¯¯þ¹/Âxsk¿Erß2ã›?Y¶ iö
-ôNÙ°exh¼ŽÜÝùŒs…Uîý¯ÔUÌhšÄøÖnAŽ*€V…áîøé±È=9ÏâT‹ Q÷H¹õÐzÀSÞ³¿n­WkŠñÌ9Áúlk*<RX¯w¡».ÖÞÄ–Ô®\€«BLÕJù»`Oÿ?Gg™åªDáÜADˆ¡!Xà»ÏÿÑïg÷êœS»ªö·u,5 ³†¾Ò³Ø‘0§£=u¬l\²s$ðþ±fñ´d¡úþŽw3ÃêöãÊÖJåé}\ûê jqZZG^z#‡—ô \#U/W~¦Ý
-Ÿl6À™G·iÉR­þךԟöš¬,\»\ëª@»Óœ×V¹]²/m0îõíÆ|lÄoõFùÍÉ>ØâMŸvÌh>[v¾÷
-àïìÉ.Œ²¿¬</XÕÖÏ×0©®>®³Ã íÒ´êÊñ4!Ýò…ŸŠ~(Öj|`4~Yíßñ´By×W†›)\¶t2Ü~ïŠÔåÔ·¬£Æ<}ÞÉ ‡þ[ý}3¼¾²‡fjj–¼ù
-£ðžèìµ9+£¯æi|ßPr‚aÈßYf½<X„l%b_´¤aí ©Ñ{˜œîêg5±ÉïF<{ö™­â-õøXÊ¥gçö(Êf|ê'ªƒ¤þ~¯‚ëOÙÂó8‹åÂxk«ÙZç.NCV_]4ònÜÆZ×=ìnR°,
-=ŒEeK Añî*ðÙèH/ßöïöÔV§CÝ×sôÏ'WFwfEÁ]Åé&€<2ãý^VøÆhº‚ƒ›Lã¥i49ª"J™ýË\n6ƒ¬nÒ–¦ú €‹Ëž—ÄD0ÄËÅÀ*ø”ñÜ…k}òýFzëÔRò—87É«àû̶µÆ³s5ïàš’Óq_×:í‘üHøTL¦9ÚãôâÎ °®êð}%Ì“ÆR½¼dõßßÿ–ádkšŠÜ0Ž¾Û¥rÈu‹d47g¦lmÚdDôÂú”®—Ãø|H,oYF³
-ìüFÉñ¬y¿Ïõ’+eên—ÁßϼM?5׶ä_w6ôXÚ3›žÒ…»Èœ«¦#ƒ¥œXÓ…ívν½Q%¡‹1½µ/Ω¸%³|›ì¾©èNƒs ×á
-꺛ƒšWL#6'f«Jðæ
-‘~Cƒ‡Íƒ‹"b-ûULÇÌûKMØÚêïÛ‹ç“°à"D½iµ7å?`l‡’%6Mͦ‘U9âË5E%í`nÍ}®Csz¤Í–œkO¾ŽÐß‚¾Áö Sð=äMX‹ȃ†‡M†WªG:O¶ÖÆCþÓ¶ü)Ù®AG„édjÂe™´­k-'J.|¶èù
-{ÿaýÝ­oÛMd¹mš~ Çv¦Z>S}ñµ:[Zj›ëÇ÷a¯xv¢C—·:̼ÜËÂsâHwÿdm'Æ¡³JÔi¿íÌî·áðñ¾/üK¼¬›H_‚uÇU}8ršfJþè[@!z‚ëÑ:´mæ•[‹$ Áz–*)2‰’›“æÒÒHýÖ)Ís}Ñz²2+çEÙ®KûvP¸}ÝŒlhЃ&óÍ-àYÌa°îDÝ9â>$¯È—–ÄÊWëé~åÂFp Nú±øÀˆYzõWªüÖ»áëEô̱²Í™Q¾Ž+d¬ˆk‘Áî»ú=&ÆÑú¤ðª»È xa|YXiÙ)4öõ'fkj¿„ í™óÁ ŽFL¾á¢õ•KêàwUâQ˜¶ã’Š¿NÙ[1*dämþ¤–^(“vÔúÇì•é£ÉÊ¥0oiÕâêtáù‘Ìv¯:>ÜÛļǓÕSDòvp=%Íí’ž©çþñæÒ»úChHE×{£Àm´ÎS|¿ò&1i]
-%=ÜV_çMx†a?kT:áAíd¶¨d¦K^ùy°yx]›#°Ü©Ôw~ü,ˆW5«1«Â€ûß)3ã‡ùw+ÜÕ¹³)lƒ«÷6ÜÁ.>ïÒÔ®éTlT…ŸÁŽ?·›ì§Æ}G‘ðMsksÂÌÁÅ€{½sö±—vãU0Ÿ³ÏøšUµnfïíìiAâiç%\¬FŸ¤ý«ÕˆöñV·Ë´àQ? @
-î{:Øt‹éÚnÒåSk½ŸC˸½óÅ鳶fB‘æcŒõÓ}.U¬…u¦¹ég¿Š–2Û•Ò¦ðÉ8¹>}÷™mì`¥Q Ð¥®²¾¯„A‡Úc¶éîŸji¾ûú¯‰“kZl"o:zn͈8‰'÷w*p§6r-ÇTêôýá8°µQe
-®¢ü yç¢ÏW½™—#³{¨…¹q¬ï[î[éÛö¶[PÞúnáq4
-·Æ­¹~‡nÖý`–LmNÓžïòh}Òü6ú±{sj$ùÕÑ?ÀpgÅíi¯3ÜÝ;ÛôpÒ¯ÛÖÞ/¨c'»eÇSå ~‡aj˜ äî¤#Ã:0«Ûóã¸åvÙÓ–‡µ}¶ ͹Æ-z¢èauLñx¨ñ)®ÂSÎÝU?’;K®M±úâ(—Ÿâ Û)e¹æSĹ–É©³ßÇ0Ü+8ÊQ:Ÿ³Ç“6ëyc`èY^q§Ça¢Ú,ò-¢„¸žY, >E:ÅZœòöÚìâ3s%ü-”–#UÓX==$wuîöÍ‹µ€£zvÝ¢Œ¼{šNwÒü8s…»’ ÷D¼ëJY;F­dŠ>Í]°õ¦ÜsfÔ<4
-%§Ítºt_Ô
-\âêïí8óý ì^{~\¤þÖQJ^¯MÎ3Èë7ó³C\ÂeÔÙ^ιŽ±k W¼zȽßؼ_Î.ìç½Þ³éÆB0£¥µ/ˆÔ@ç„l0r°zT‚µ+{wØ}Þ¶Rüî(0Gÿ¢6ÿäe-#ձ엃§š¬˜=ß·tö§íüþ“bì䌛¸<–sÿÖmõÝþ›É#ÆÔ¯¥ë\û”BÀ"`9nicæŸxBh˜Ï›½:ñÒni¥•°kÝ@µBJí%¢ðÆú ùa·µd‘Ýq¦T(7¨ûƒ:¿J“"úµ/ÌyçUÿuó™u¿~xw2’f¾B?çÖÇÇÖ¡›¶.QEº‚ܪÐ<}à×»lwæƒø$(_qìšÿÜÊ1ÐÜ,ë²ÙNÂ|Ћ
-C°„írzX l˜%¤«+$nIî ¾S)Ãáç‹3SΩGóË7F-[¦c”£Kô“¹÷¸®<ÿê£ Œ\{l¯¿];£~z¡Z¼ ԞظqùSc›
-í/éÁÙo+Hec¯¥o¸!:Cÿ‘Ý|)´«X`¯ëOoǧ4ÓxÖ=ÐÝââ#fs˺èÜVxÕËNf±–dØÏúi 6€=$–£¡o$˜G« "µdëµ^¯¤ó æ¦OrÜÅ.¼]îé’ã`Ì÷ ÊÊ–Ÿq¿¤SK?…tJê:º[±í»aÑÅèÛ≆˜·îºN N×fÞ¤Š~œ [vÎãÎÉÔóÒ A¾•­‚””muՌ׷àË®¥ç^“{a=¼ O?üH½êú<>ü3ã(à%ï,!ÿ;9¶_f]ÃÒK+€AB¢S«7ûéšÎ½—åHµ5ZÌE#†¨J`;{¶NVå‚=ÔeûÊŸb£ÑegÉšMWó*ÆtŒu£ëâØèBn
-²ÐMJ óuŒo9Ò°8ªÜ÷öþ€šGúcKÑz˜V·IÇ
-À0êM
-zôTý–´²ç—ŠÄy4ç¤ÅiªƒF¬U0}®=ñ¸jÛÇv/­Ld/`à‘0耚fîv+O«Ï¥òò‘«þmÚh_¨­§ÜM;ž §4kãøFmsb>4@3WBÈ-µB£Ÿ­5ß oÜYâÖìTÌCFÄY¹,F"Ïϯ(žÓIÀÓ> +ØD÷ˆœÆmIÅA»‘Ým |{ÿ
-!_üE€'¢çt论œé㧣˥º'a}Té+Hׇ >Ï/èìÎ £ÍÐó뙾áJ~^õ‘»…|t’Ä
-nUÃFŠ15‘ÑW^ƒr­<$Õ³2Rq*Êqy=ëdì¶äOâjÚpž>ÙXúî<wLÆ/¸…•| mQmjja YE$ž£t[{Žµ ŽßÔ ìºæNz¥úá(º±Â$.§ê?³~ú&qh­±
-wúX}ùx’Ö½4ü f}!Jb®ß˜oh]ÏÔ7Öx’…};4 ÷¢H¿òìtï]ÒºH¿¹UÖ´Úìâ]G%Ò·ÏÊÉtU§Î/›ÊÌè#fEûöÇŒ -pÅi‘•5íg¥„©×[¡—L^Û÷‰[vç9xlW¦¨­,8JÕ &¼âIûLVÑnŒJ 1:¹£FÝ×q’íot<=1ãBN_ |ŠÚPhLü’Ò6~Ž¤4ÔÜQ$Ñ[ÝÔÇ0(w¥©zDÕ ;ë±¹—)üÞhé‚‚® °î–ïg±—ã‘>è`Î=­Öš‘mн\(=úi«šâ!»¦D¿…O|£MSðF|"òæÑ~fÏTŠ}@rXexˆåæ÷#¬<’Éš×ÓÏÙ!Þך*²£U¾›cXÖ__³x„Nfëµ{…¬1ÆáïÉ×h˜©úEªSúÂ5í9#Wíš F²x«ãóø@k‚&ö~mbóY-tïÎÍÒüO„ð?³iS— v+ºß5\>çðÙàÒyYÏ ÛSG:²/¢/l¦B* ž¶Ô¿qË%Ú¾væ£uljÀaŒe7h£¨'3Ëuú¾ÜZÛ_ëÀÎî"‹ý†bI¦¹Ïz„ggsqû¤v¹ªWÆ*d+…’µí)PxoÁµ\3+ê§7À¯¨ý„h7åŽ!–#¯;SIÜ’œ*nž:¯=ÚmB›œöep½ÈýË݉ìdf:ÅGú!º^Ê¢Þ wµ"úe§.Û#/ÓDØ-hÀÛëßøb¹îô22äèÁ£¬ök&$€Ý̃±×Zk°§q.λÑÈô˜Ÿ—º\UܲP™˜,pÛ¡)8Šð!þr6[_úuåóɸ†«¥ãkh;R–µËN׌ýðØó¶3Æ;´*e²s÷vn_jVkP- Wßòº@é “¿•$¯ó4†vìS• `®®1£ÈÊ〱ö‹q·Tªg¾ÞÙÅÆ5%ÏÈçÕ]n}ýIcG§Qp$ú³ÛWÔ&æYß ­&l}?UïIÍî îHŠÐgÍë,·ŽK’y´×¯ÀP­˜÷áø-ÖdOûº°•lߌ÷Ê=¨þT™ë[Éøðèh}¹*2Ë¿Å­Å–4²ÖáŒ<oáÈýuϺ©¹<‰jGA:yBÅ<ïIËrëÄN™xñß Umäd²æOµð£MíÆ*d:ÉI2FßìíT
-3T»a·¹ÚÐ#X"|÷ö7é(õ•~{Ôßñ.î‡_·F?žÚæq¢ÌÍJÐh˜=^‚…ng¬šÛ¬ö°(Úd;åCz²&Õ_l|0˾ýkÝf[u¦}ÏûöŸv+~ó¯8ÿ
-~©$`"åÏ<TÃ~›p°YeIÍ!Öƒ—„;ÖÊ`€¶Í·lÚþn‚$à.ª8'¶t#úœ6þ$–ãüÓëõªQy¡}©ôåö…m¹o;Ó#ÿž›Ä6#_w\ϵ&Êîb/Øjlwͺ?Ž Ü¿¾@”MšwÊXØ”U;oöj¿à8™ýlTáæ[ù’þ¡n¹–msU‹²è?@›•Š¯Ï͆ÕÿÝx®ª ºÝ¬Õ#ä‡j{•¤mÛ)ût†ÙxyÉ+n­ÉwÌŒþÄv]Žiqæ—÷ïbNæº3ºÒ^Q7…ña摹,è—ôÜ?§MíKf¥ô¡|<Ž?h~¦ú]^µæõxñÖKöa^¶Õ ;ÿ¦‰›5ž\;¿[…¹KÛ"?XŒ¯¿·ÈûÎãÖƒlË+˜¼Ð˜ÄÿT“Ï«”ˆý.Cÿ'‰ùöoò³¿Õ¼l­­­m}à<}7_T ½µŸy›:_Nä¿¿'eRW§Úóyç¦oÊ­æ€íedøÓ_ÛB€äþhG–yÚ+ëÙØ%ªE7œ_f³_v6¬ŸXõ9§¾ð¨Wgï÷.ñ½ýàcÆ+xDnÜ*ðy[´|žBáÁ÷„¸ñ@T¼BùžK…4ûü=ÝᵿÄZ™4é Ù=áÓCצšÃ/ÐÑ36Û¾7Æxþ2]Ñ ¡àV‚ŠñØVݶŒc Ôƒ·9»ö±¼Ch£ã×däv:Ø™xéL¡dcqZÜên¿ŽR²¶âJº=ά;ãÐmêQ<-jkâTŒÝ¶ c›Ó2ºíÏ™6•«¸pæL‚ 7Q`¹Ån; Ó‡‚î_›3‡ðw¢ózÃBÆ Í±«‰-ØÂàf%8×pd«$33·kLï¨n¹ ½ÊTbTYuHuc;€G¸?juæ¸DÈCd:ÔUø:¥žm0n=p0©þ÷L/±–å­ŽZ‡.í—þ|X»y×IådïjÝ>KÇ;O?ˆ{²©+B“ï9î®÷ÙÚ³]oIÄ 0w±êØ÷‘Áeœ³·*ÛA™ÛØýcûï<¾RºkÛFHÓ2IÇSÿþ¶|[½H &ç¬Ì[œÚC;²  纇 d?‹ÔïiÃr|¹@›ú=]HT*²#ȳÑÚå×ñm¬Öñ×f*Ié@h{_ñKâøaG›Í®Ù-Î…+WÖnj)fs×K5¦‘¨Œï¤çyòˆÉÓ“²~bÔS»<gåƒMÌ%s ó¢­ªÛ“k­hƤ,Ž3«èÈÁg&‚êÑY!r8ü Õ½i\¦
-eUÃ{Ÿ@y¿£ÕLwO
-"ÈPúïz`¶B¼5Õ;+ËWŸóÃqŒ®°£ú
-âEÿ{‰Îô¸s´u儦Pûĸ#\<>¡ù“
-d¶ˆi)²ÉÁ¥¤[ÏêTøF±AY,‰Bbk¼—w(ÀÄVU2ûûsç~çΈö5ªjÕU‹5çž·Oh¯nMÃÆ3˜ß=ôsCÝÖõáÌC¶¥•ÑùÊíi¯¿ºzwV¹É˜mcÎ+é]G‘Ý&˜6Í^¸p»"Êÿð¿sFŽ¥ÍÔ‡œc$*£®Âg)óHS 6ÆÝÅ–] ívMœ6?Ñ׹܃ÂKP·qû Þy'_¿Ö  ¦'б¶$ân*âB*1]Õoàýqo3…çgEé«yÁ•â ˜D’êwg2ïè4*Ã÷—‹©YÏ[¤JÞmæd‹z;k2­@ðk=pÔî!ÙË|“6’´ç‹•m;êšK¡}Ž`É#µÂ[úëGóã%`ã?Ët}Ä'[ÛëuòçHN˜©ÓV.Kê¢ÎªäuKéo÷Á*Q{™èe8ãX{¦ÒÚAð«fU©V‹ihf@5Cq4D¼ݼ½R†ÌZ‹”tyt «§Ïꩪß"v×Ãëú¦ýÑ­ks½­™xø–Í;‡ã%‚OµËMÄuDò·>×Wþ‘W‚žë4ã‹ÆxUž©g¯k;V.}÷ætï· ºÜP÷!­÷Ä"„K„YS¢8‹ŽàšïÇÔç’–¥ÒqG²Èlâ«uãDHëÓ •0¿Ž-¬ª)ÅMp4lŠ··2¼¿YÐFKÑ`·Ò|£RÄó?-¸/rg–·ʻʻI¶™8ækäêCߢºú›9øjxã“ñêwLk4”Ò­÷\[{|Ç~¯2; ˽uÅ,Ö¹¦õ5
-Ú~Åq—Á+€ñþ±¯á»Éñ¨yx
-BWÊ‚%†u"º„âtµh«¿ZŸB•.Suš*uøÒt|ê9¨´¿ÝNd¦Ü8|Š|.WÇtRZ½•!»Ýõ…Ø¡^Í‘UOžü>!}íìUgö-À§Ï{·ÇûiŒGE'Б.>FÃÏn$ô*ö©eÅ6Ÿ¸:À–­¤ºh}_> –Ûnµ}߆àci·µÓD…ùÑtßGS k§ü*‰Ìd²Ö¿ZŸÈÈÆ9=éƒC-êO ¦öüЄ0à×IíÐh¡_Æú´WÏ<ëÅUøÃ+ûº¥ø‡ÚÛVž›£.«ìÝu5²çúºŽ–™½­øx˜‰< ‘©V»XL“‘dì
->jmεOÀœ”Õ£Þ´ˆ²Y(¾65qÝ)¢/ä½éÙ,ÝoCë.ß10Q«cn§–N*¹v|ÍÍ]2e wµª´ùÕTyкÒï ¥Þ¹Š¶†ˆ%CH±`ÝoÓšq#¸72 žæMø N[ƒs êí„kg";O 0¥×ÃÇQüô£ò/ý,´P~äÐÛX7@4î äcà ”™Wγh)žüLšjR}=W<¨ÅT¼—tªÈÏn堔ߵ‚‘=Ìž7՟רÓwÄâ\ý• ™– dÐ/(8#jýÞ¨œ£áY†¿»ô“Òæˆ7ÎáôŒÄr[I›ÉϾÔÃï¦A_»Êæ¼Sú,Q÷xnSfX¿ÿ€¬|:WRûUDVåNn>¨ª…éôN29ätôJ±h¸ªe‡ozŒc7XBFÿ4¼sºzòõªôŒ‰D²ÖwBJ¥©N n$¡¿‹
-S_ê¼–áS°8Ío½Ëø•à>Öf3“3žaú«^ó>?ê7úA¸ÀE^I½¬+@Iä6>8*îLh™‹yãQþiûd‰X/YmÃW¤[TK³ß‚æZ4?ÂnÔ—_ÞÔƒU}©_OòA›ëª‘•5wGÊüJws·S8 H>$[L¿ñ®V«5e>oxGR,NGÑX—ý¿÷‘¥áÛ' êzŒÁå.QÁ5M«dy|ð]™Öm-ï”ÇV_:vtLfýijÈ®qÐq;ŠÌCwiëæ¼TãL,5Sãóš#xóq–íÆÿß%Y»3¤',¶Ù§P+ϳ¥ÚA©ô¶‡ØÐhð|’ê ,Ú÷åŽÔ7VŠSQ™Ëí×|-™ñ{äÂß tÊܧ"ÏÅ'g­æyß÷LmݧM-:’Iáa>#ÂÖÒöÈà€É®@°ž_7„¢ñµ?ï0ìfÓ’¥œ«ïx\ՂЇƒŽRÚæ¥"± /¤Ò\5_ "öíK­ê0õùQBT¶½vó©˜Pa;ÿð 5KΈÒcúûÍâàuÕ•+w4¨¼¦ÃãE®©?¶;`€>꟬_?ä¬}½î[á­t«”䘗&iÿ
-Íš²¾ŸV­}Í“7üÓØÅ|±Û<$‘ñ/´Ù°°&P² @Ü]ŒcÐ/Ãïò÷á¡&Z¥Ïðßlj…Z’+Ùª1ßdeÊ­¬ó*“Øæ4ˆÕì·zØν ·ÁÉ£¸ŠÓ'בãpnU*“n׊aJ½Fjf€yWú…û7Ÿð[ïEº±ÑtXý«V&5#fŒf+`lgÇLaøÕ°-¦a¶Œî8”\SÎ%­[=ÉÆkwùëȧ™ê&æعÆÝÅàHc< ¬¤´ÛÕÖ¾kÕÎ]É^VC-ʵ—¡ã¿“þœ–iãvÖ.&xJßÆL®zõW2·jceæ݉³¦SXö²ù§±V¢Ã„)Ülèn´{ÍœE„ÎlfMôµ{½*C¶Ñ„ëÆ´úÞuÅ×bi§zY7OÐÃ^ƒíÞÞ7¦ôú8Ô² ãÕH;C—À`õÎß)™ Ðné›[e'ôy{ì¢"Y6n«³K|Ȇâl$+µºp¶„»”í:âçÕSÙ;mRfèôµ§Ð^Ê›ªødhôŸ²™wkÃ{A> þ6ÙWvmÖ«.sìøÖÍ`þýƒ›q Ü|5õK,ëá¦4ßéЫt(ºÔ¤ %t9bW͇ެÏæÝ\ `>ÀnøžU9tû4ïÉôÒºü4Å$4Ùøì£hJÔ]ÝÃwæà8ç ¥Â²ñR ¶›lcO{%¾5*˜Ð“”5Þk©Ô à©m ùHÝ-svBÈy}`ŠÕ?œ|Úò;hô7yòpæÎñ¨é¼øÍ!]Û+-¦,í'äÔ8ûX…Ë’n”ÖjW û«6ýJ˜¦^§è±C¬®ú|wh³¹Ý»ÎÄÝåî’’ U •‡]ŸüâÊŽ´„?¨vw¾œs_Ó釙6³ÓKçÚY%,lvÔÂ"×â) ¿·ŽAkiÑgjf.ž+ÃàÐ(²b›oˆ÷xw7-ia=àÚˆ¬
-Øcæ2q’`jû¦,Èf)ûú*õ#ï†wrÓè*Gø7Ѓ‘ÛÅï_ãб-Ôu•u}b—€ ͇_ÇéÇÆÍÐ?啱ë,ÂP›–ñªÛ±î«
-~QûþrŸ”#o-mÝjºÃ1Xª;yJëH'é¦l ¨¡P·ÙÉ}é-²{©íöZÅan¿~–pA„HýÛÿ9nÏßÁãÒ?[´
-­Z®æD;tÛt.xü¢ª=F1âv–×dßàßû­[÷fÈU{êæ#-3Î{ݥ͓À¨ºœÇœó;—&Òó|{t wWº¾ZÙ˜ˆrå‹è¶ý'”fl!‚Ž8U¡Jkp±9¢ÔqܽˆiøU­2«$ŽÒü„€Œê–Ùü5‹O<rô랈_§;v$äNÖv¶yUšŽAßÚ¦`7¿óÄ“„´{°*9ëðî`Ò¶ïk³Ò%û¨â€Ñon?Ã%Ž"ÑÝGüÕiBy!øëåÀØ÷fç‚;UÇ-åu¿Šk÷_!Ä/ËìnëÈÉNÐAA¤ŸÍA—š Ž=·ò”ô‘³DˆSÛ¶<ã œ&Áhã>íÞªþ’ðPüËìÚ¬\ǘõzûñþk«kÌÂë
-'Ø©†gg
-'d-_Q•%T×µÝ.ŒP®;Á 2Aö
-JFÊA*‰Ý-yy¬z@w°öÀ¨£÷Ì:é—™”I¤•fèØèÍ·§J§—,³÷d‡ÁˆÊH$ºÕ¿Yj²Ñð†^|o4©l‡÷ü’<Œ¼Á7Î2wñò3g”#¯ð¤bu ²ñ¤¾nm]ËôÝg·d
-ŸÁÂŽÞ RÄ
-z ©Ü†m£q¬Ç[D
-™÷ÅÝNOò2ü@ÝG‡™mZöŒþx”‘ŒÞ7íç*0=X`é7¸;(N?⌠\‰@a·ãÝëÑ€è.Ƚsv;õ<Ób»o8£rïWTþÎÐHßìç‘Ó.¡˜cÁ|Gk¿ö1Mç?F±ëºç<m74QêЫã.KÑÝZ̬ԅ*#ÙÝ!„ ÁwR­ÃôNéN}# þÂÐ…æÒQûðU¦ 56„r½ÝÝžó•Te>M³bÏ™Cçû€•ÖyùeÆ`ß(Yâpf"½Ñ5ðø+à”†¤Ç­Ç©É¾‚ªök~W¹/R.vìŒiÝïyg£Â”ß(2#óôEÞ„+ïÄ90‘¹iN–MÁ¼vÔvž,f%AxpŸ¥³VSkŽs«3—fCsÕ½&µtø|¸Í£Ušÿ=Ÿ¼®Ru¿¾ÑXc‹`€Ø wå$»¼é)9¢@°ÅÞˆ°øStÓóýD›¦‰Ø=c¾eƒ‘ÄV@¬mnx ü›™ù´}éÖªJ–í|aƒ½ ‚`"}46¨(*
-6ˆ"ú§žþòí›52++OÖ>¹Ïþ3a€Cf̹ˆX Câ²êKl”Çf§FŒï•,ƒ•Ì/3è•€`™iÒ© øèµ™9‹œ«ŽÕÉiسKºÚçC%Î[£æb§1¤qWX{§P]ë-÷:o‚‘ÓR#f7×ù *ßY2žƒ>8JÙ/Àð.pWû¹Þ¦®©P^æZpqæ$Š¤þ1¬¾êÁJ/Öù L^HO±µJ³(Y˜~úúÙ¢ç÷h€V–GÅO©³áÕKCbÎê<ðIAýž?žgw ö>L ­j-Xœœð,VzS^÷zï¡m }Ø›VŽÎP€•=¿°5Ó‡Ühá¶ZøîrjO$÷Þ¢òì¨X]j…’ƒðPú¹M³’4k N¯3HQ7rô¼FO±ˆš§ÅãbÄ~¸Â ê
-³U‡©ܽûg°(`å׌OerZ1i–¯j6Š<É£*ͱބÉòÛkvv,KØoîÐBéβSåyçtÖÄÁKŸÚópý¦­Æš$/Î —½ÉÊb^[{O]UâMåÁv̪Ã"[’˜›N¿K o«Õ8䛈¸,m2ňˈ tê³HfÍqñðÞp†Yõøó°®ÐƒZ$¾\Z…Ù0ú\;âØŠ®þ²êõbZóîí§?ÆÈKç_#ôî•3X3Ó¸ü=VŽ/
-»£H®ÉcK
-Ê1è8
-ôˆï2¥7õÄxôiä¡|f€q4%U¢ªX}oÞß!SlÔTiTu­†7ŸaÉyöp]3R×ø¤cä3Ýp‡G/Ëù©úþiÑñhòWdµì©%!dÛè-6Zk´«îøÅ«Ffuº¨îPO÷þ`dz1ɾÜ™£!Êä`ŽÛ¬²yñ÷ý
-"õü•÷u»¬tG
-¥]ùf>Yäd½Ôîù-{Fó¸¢Ïß«ÊÒÍZ~JNµ‡ Ù/`’Þì3±RÕ×à‹†poÁ»yV1À´ Rë!!Ÿ†lÇd¸²5þÚŽaˆ]Ë
-¢ÉS¾Ûáf1V¢¹K%tþ3B"Àæg'<ÚÒ
-,x<“\êŸ)ÊåÚ)78eþaµÔHÊ<²áVxí;®*èÂz˜ÀRåúØ7úž~êúZeÆ Ã>/³ý÷\¸E>ò7Að^-SXõô­ŠÄ|QÇMJ,Ãú
-êM×S 5O’Þ!±°v+XyX÷~îQ­U¹%1»É‹óWëB?(F¾dðÍ«Pì“Ù(Ö±@5”¾±µEÝi0üÖ Ò,efî›`³¢g¬¨
-ýaÀI${H)íSLñùêvÞýt |v-AüœÆ¦?^² ×Rc:Ï Ó
-ÑÔîkNü˜°êMÇ'~–jX‘»r…ëžè«Üy¥ÒtØáÅNÙÍÒ ¨®\Ik¯ÙK=Fv}³E_És…æ-KmŠM¶!’!Ü'Edî>'C°{ÒZß+²½ó*”!Cºl©Ìr'PŒ0=æa¥ûÄUËYÉIR'—7b<zuµT~í µ§À½)%.[¬’òV›]NÎnt¥ƒj§:–,ÆBÎÕ+‹,ÆöŠ’I]®w˜À0Y­Cê•*ò Y¶‘ã@™°-ÐË“ôR»«y–/w$F~c­ g.Ö …¤¡„›Ù"!ôZš¤E/³×~ŒMv¦®Ñ,SºB÷J{Ü·{¼8Nd™HÅúBøD¢zºˆí’Ý0‹;Ð⸞ž©¡²×9õ±Ž¤j§ˆÉ\ç|` ’Cà`ì¬Å~ vå0ŽÙ´Ã}¿¦°>¼…°=òF³[aǟÛ+âKëˆÝ‚¾ ,ÆwC|ˆ£^»LRQY}iEH=(Ï I»—pþy™©™}@DÓŸ‘‚AŠá°ü481ÆÊyú÷\kºIKX4Ú‹IÏ]€#¸±’Ü2–nhEgå|®'ÏæPŽ?ñC}„ö>´<%ì—Àï86%¬Ì
-œ˜Õ£T»;hžeRewR«ž,ëO||’±W0ýnKÉ`©žouÔ…îÍy¿’°ƒSÔ)¨Åy¯*(‡}_í¶ÂqLä)AÇ‚•—/üëûMõuž…Ò¥®ß=çëÙ™Hc.ÖS¹Ä_”¡‚1÷õ÷›Zcó žŒÛ`sŒ*áQ°ÅKI84òÅS]>’家û4yMCbÁÈ€Ö.9q6ÛîÆ5­ ª^ÐàŠ{ÏÓþÐTÔw…&Ò`ëœçßÊãigÙ8-7ª»Ñ&w–Ô)²UñY¡Ž÷Öõ¢bCÿ…v…Áœ~,!@‰Á¦Uª–ynèÕžÞOõ
-µÅ\~sTno #ÇÖò@ùS6èšì÷NÒ„Q¸°‘å–B R;omÝæHñ(YzrmŽŸ'T஽ªþœJ Æ@.G)¥p§áMxWc%²ˉ Ý”Ž^Üù`çäðvZE9^ ¤Ø»ÊR)Õ»Þªû½>rulËtÕqG·Ú¸Êű,³mÙ‹ž†ÏïI¢-SM¤Ù ®Ú]84¼Ì±ÙÛúRŒ`.Û›CLÉý‰/L‚\WŠ:
-vœXÍ¥{é‘ / »µ>‰8­E97"J­<:ò¥N½Èò(ÕY‘"¤ð‘u¸ë4É¢!íçͼ¤gÏ~=²‚…xÞ$û Éí5 קsžJ§^cÛÔãçL®|ZY6.·Åæšj0 ¸Ïœ"•OV; ÚF‘¦ÆBêÜ£c×q¥$/î; ðVîY¾Êûú,'½K¹®ËŸ‘Ì -ÑÚ?#lU-k‚T¿ŠwB:öËig16弧TTøcljUåà…l¨[n›úJî¥Ç¹ã“
-†Öp쳓ä\õ•\Õ¹(ËOrv›Fú3çNá%a­=6SÜ×Ü  Z½¦b–ÁÖÆäd#pdc0±w†Ï5óAòºcê~|C±ò|;£¦­¡…ý<Ófè\…y«hG=Wd3ëƒÕ7?›j®¾§È\­‘kÚÖù•=ìoÇN!Kg¦™ûšc ÎH½“ò,(p7õ€/að,‰!§±òê7;µõʈê´ØÖñ6u ™øªj4:Ë£þ¡ê²»Öº©.xjã…æ‰Gy¯Ü¥gܘ;÷O6"W><© ÷-hdùË®v/R+;ý>¡ln»…ªTÌOàç\søót+?°Áëô8++ÚZ¬=ηœD‹ÇTÝÚ$: "”£ÄTsûðcýÊÅTØ·‰“²šû6–"9Qƒ®¬¹-¦‘Uï#‰ìNŠr@·¼bqeq3xuÕZåxí—Â’ŠG,¯ÌÖTû};pK,(Õ\ãQÛ—6ùïÿŒÈ^WÄê•'¸”G‹VÂçA™—gOÞVŒî³âh(Ë•|A)UÞDÒÍLÓtC^Ü¥ÆùÕdrÖØÊ’T>Ÿö¹¤Jü¡HCì=ÍÒñû]Û¶¥§ >äÖC…ŸúmÙ<º0ýÜ«ò§¼¿Éäu«wjp]ÖÚ9Ç–?Aÿ!ˆ,lbÜŒó’6Kwòp2E£ë~šÐ==|h§ô´ta¡¯¿€ºu€a.¨„{õz5x®ç£Rq˜¯ñ Äú §<n Ø–HÒÁÃ.JýBCߣҰé®å#÷ý&|­&ÖçµÆL´„ÏØ:›óyïkÌN?;ë 0ŒGuŽ¬ìe‰¾ áe’ƒF9èN
-SÛ©§Î½ÖŒÆ®$:1a+ jË”®J«£LàÎæÒ{A$|ÐÔG÷ÖÁ[½¾(å…¹VU¶.aø]¼—ö=×Ú[ \~H.¶Û+ùbw:¬û·Š¤Ýö¬®”˜.jzX^r© ±›ë£Sè$/éÔE Æ>XóáßorÁÙ*Jg\~ׂù+wž¡K¦­õNÅñýkB³ºÔvÑúŽ C“ã;B©çnBÑxÔ“Wm UÄ‚<otﱬ˜NöBiÖ}ƃ)½ï›(¡RYcÜ/ùT’¾:ãÑ8.ÓÏ×"«+±Ä\ U^t²KÚƒ»•ßæŸuñ8ìgÕ¶‘?¥íQ>.Ä}j4y Æu
-)?çcG;ãø¬SŒ1B#f{ËÒñÂêHðª¡ìà¡}›'¹ñG/`8âC~Ô „^åcg„u‘…¾1;ž.õ¬ºk1]ìÂ<Œ
-û9T.à:ã"wùì{óÁm­?¸`îÞkzèÇyÛ‘ ÌùÆÒ%‹3}‚go’å0¯Ú´N;Ãç§sîžqH%~ñA–Öv¤{BWê5úHçíKoF= ûËú†OKàh<q´ctS+b2Ž‹Ï¾á°ü!ƒþrîK æPU¡¤/@/ŒZsÚö ¹A\¬è2|w"@᪳r‡^—©‹€–:nتÉÝõkÃÃÓ®kƒ^EÃâ`ŽÍ¼úE¢h£ .&R:¤+>n›âSÍ?¬Ì’~–«åê
- æ¸ ð8GÙ¼ïHÚx=4®^Ñ'zÕ{éRMX·°æu·<üzÕ!­t­CjÐïÒù0”«ˆ½¹G•§L¬~ÿ
-³ú…0Ž/yÌ»¹”›žó$bÄ!#^'yáŒÆ‡fƒxPB±ì„äùxXIç=Û—Ly³é‹š;©GÕsB›ÙãËY/Iz3F¹¼x¾$>—­¯Ôøv9|?ƒ z¸ÖXoÕ±ºÞïÈE[ 8‰&ôàu|S'Ê¿%؀ؚ:Ùvt="Ψˆó¥wy“{J¿‰‚$ 2}³FP»óRŒm`R«„’‡ÐªÓ¹“e}:çn4j3bÏÈ9%Þvu(<ž­¼ÅF;ŒÅº«[j ä|­º;KdŸg‡ÁŒÌD£Ð”ÃõþÜ–m}ÀT‡‡0Õ«'j”ðX~üý¦#BƒRÉøÜ[Cx‘"hÖrâ'EËYîUŽÇcf’H]ä˜R•ˆ|ô»Uïl²½Y¸lÍŠF$]¦7OX“–"GNAÑÈí‡|fkíW[é+Û¬'«põ„×q-¿»\@÷ØæÁš·Ž¼5QˆÛ×k½&½Ðó²tWƒ²¹œ +ÌöµýYŸu²
-‘Ÿr¾¯>ÎpŒùÝ––ÆZ%»SûbËŠ«î÷XyÐa,‚ŽRÑv¡1I+ú°„³_`æd8DŠ£aå ¯Ì.Òî£ JmÏ©ÝÖžªç›c=nÞäÃ÷–õž1‡($€U¬ŠŸËP1k ׫4ȲŒ¤<ì"16:•.5R¸Ôhu¥efÔ®tr«]á<1åì=ý¹SÀ=¼OëV?Ùü°y‚žtwÖøð}´+Ãx±~ýžk Dµ!»»‰°ÇCiüáG~Øc<ªµ<¢ôÞ–'£K¹'3ùÏdÍN£„FÓw±Ë¾¡Ío§½ä„ÉMhꃋTez¡4b{$ýhFÒøÆÊOz€s/€í¢}Ù´†ƒMþ]á–Ðå
-e»nNó*PQ™S§‡âý ëý Fxk'@bõÛ¹û}¬]BäΕ¤ýß3ôMiׄwum…zN­±îgzaô­–²¹äΨóÆW$ŒßÇÉN
-oI ß׉ãÓØ~³ÖN”ÒÖap.o-Y„IŸgµûB®§> ¯À»ã®N¡$¹öELÏ<ÆUgàZÚÏ/YÖGå{…ã(˜‰')j7zL—뽪 áÒãt\rH¥-µçàº%ëQ^˜Ù²ÑOîrç,OH†Ô!êR{]•‡2*S“N2æ)²Ù`o84'¿÷³+וoÎGkÐÕrŒ¼¡>ˆètڻ˪½J­q)
--h­Þ(GesL÷^@ßU¡õæîÁr‰(
-s9
-~xhž;JY¾O×+©ÂG«,Æ–4>†¥*•Î–òNp¢äª´µÔ-êËÅX]¶Re@*¨;ð'̲SŠÚß jvá¼ ¸°”’KéAL÷­Öh$—ý, !‹„û{¼k Y$ËRáöj¿ÇP…Í,Qö7W­á¯¤"ߧߋx‚ù †[’¦°·Ô°µÚÀ @‡/[WÉh òÈʃŒÔOé#÷Oº¶ ÎylÌ„wívGÞß#²³› q‰ˆûjÐT˜‹º¿`Òru` ÍA^ª™«~;°ã œcY:VsýFÜ¥8áÔ†òäLÈÑ»¼cv¾k
-<ŒƒB¨`ì›dN"Tãª_
-…'‚ƒÖl¥‘Åý{úåQ‚Ýí,{tÛ-Ùå't¡q?ªRã4¬ßæ‡ãjŸ£
-qM‰¨^ <f@Omu¢×­Ÿhr0®gWQGÑò çg¡HÝi¨æ™J¬¶%™Ý„Ýâj÷Ú Ç«‚_Ÿ¶”õuœˆt;ÎÕ?-Å9蟮XF—týÞm*3­µ˜|ÇbE™*„™w•%­}?«)eT]ÖpËmªØst9°E
-’涓
-‡±<§¡ŒiÂ`Qò숖Tcs¯ƒÉD´¸làw”ÛÁãëJ+] K¥µQØþ)îSÝH“—„S½úËb¬I¯æö¶jo“µ’”p“ã´ªl°Z§ÙLº®0f7ƒJpm”ËzÑæ^‰ÔâëžÃª×—Î^qu¢<ýç§óP†/omZQÖL8Ñ°³L©‚4ɺ3òâU ùîÓ~~”ù&óÑ #$:co>íEy¥ç¼
-­ó± ·Ú8”Ðov+qEŒr¯¶ì®6•švÂÎÒqs/ɾZVÑ°\Ê"Ylóõ’k)÷ŽÐâb‘³å=8ÇÁ¸Q$¸Êš¶ºÔKf/\V£¡ÓóëE_rö#Ït‚l¬rEòw+Û› Ó:jCWº-hC¦¹ñ9«Ä1žmËå€eÂë·kXE䮯*iO/çþ,¸Ž¸ÿÊ¥ôAÊåjåüý×ýímšY¹|ú`K= ż^”À‡–…9¯ìˆn§V,Vè:î=­ÆŒ÷͸9Aí‹ÜlÉA´}¬¥Á¥´°AÈåíÞuÆ^MÊV¯‡øœØ×äžó ‚výŒW£w í­+†|ç4›Â6cŸ6X8e.õ2È5‚Ç(‹©ƒ.l‘ÙVÊ=ÅX,ðªb ¾yI‡v×åD6cšE«xe›0±,šÎ{µé,N_ÇEguz;
-µ„–ÇŠJ®ËGr⎕Ž·Yv€Ç6¹Çµ]wºìõáT>„yau¬m×Ã@à6rÝð^¸KOwgW³;9Ý. ý¹7´õÄ<Y?< 1’üþ¸{ ÅÅ3S±ä/½ù-%ZȪ*²p±89ò&Ð^ÜW%0àüÒéð¸+›«°ÇG½ZÚ³H­ðx“µU¤JuªM3bå};<è\AÄ¼ä ²Áo©ñ¶¦Rg§K¤Ø]^ºxb”¾¥î÷ŒÎJÈû$ËF¹A=«­‰ÂõÂB×ʶ´—çÐÕ.ú}k–×Ð^Vgúõ½(ÓÉm¯¸g*¹@«ºÍ$ª$^¨ƒ;³Žö/Ðý&a¬¿%ºœÊŸ$
-‘\í ¸i‰ùî‡xT:2ÿ­Ýäé"’“ŒÊ÷}ò)Ò××<
-^¿¢âð¯tü«UÌFª¡ã_­âð¯tüYS8Á)8O_ÙwÜã%uÍÝí¸ö¤ ê{û+½‡jÄä ØeõæÖ벓ËæÕäS÷ýî
-a·LÏ 0˪¤ó¼=!¸Ë¾|™$D'®°ñ2?²ëVÛæRê × =Üæh—;O_»ghæõ½Y²î’V ­+§_À¿?ÿ‡ðßDóÙ^op}¼Bûu/?j¥«¦?áó 2^O~2«:ÑËÜ_LÐÅ|ö좛YŸnì•eùVéööŒÆ¾³Ôu`1WdÙúøþÕÑÇÑ•Ç—g_<<ï^E/Ý‚¥k{u)õ/®]˜=—-{šÒEwšƒ¯kãžY+xë‰B4Z47íïyîhÍü«!£yëü¦;>}Ïç¢ýŒÝ#œ“2WßYE¥¹<]!löLŸì”(m { o—vq<Ûš»¨²6š-y¡_N…©f²¦¥Nžùïá»-ÿç‡þ RHŠ;)Tì´UWý³Õè¦,—ñ±¶sçñ‡ìLó½ em%DÉúäò™šû¶2Žd9QöÂ\×Ý’­¡Ã©¡öI|ò˵åH!+Ɉʠ‘¶öëMLóÛÀµü7_ͯε¼¦£É¶i1w„0y6/GáfR!žM¾;Ó¯;Õ©>;«ìKMåÇU²Í_)tÊw2)ò3± ãüL b6V¢ˆã®NÇâv– WÓÇÛCfl¢<jÒ¦]iÒn&:RguÍ¢ ]}ΚÚVªâ ÊÏÀð³Ÿüi+_é¤í²ÅÜ‚w=\¦WÚ­Øù|ˆfæÑÆý‰>»åôîƆ´Gy>ÐlÞgŠÍ©­,;R!¢€’ݦ9–'%¯Ò§þøþ¾Ÿ¶ˆz+v?Fõ(²a|{¯0‹þ'§Z åaè1™zj:åï*>JÊÊAò†+´¥ºjKUUl‹~›îˆ ¡Õ‚BäMù_Àß÷;÷|@¸^î”ûÚ¡lžªóÙø‚–L] kGö"+–ˆê¾µB½ùë¨óáái.ÇÝ{i3/ׇrû"û¬­Ÿ…¯Ÿþd˜›¡ü®*î–QcTž²ÏÖ`4Z]ƒœ"WSg*=Æ:èùÀÅùÄ&ÓƉ\^áÀ,áË…!Ö« “g!³N”+=ž‹Ñ__ÀM6¼Û•„¬¾É$\¾âüb_ºÊ]
-±s0<|*ì%k`ïTmày;o-&o¦1¹//º¸Ã•r]/gµëÊEÖ·ÕØv^ÎþXy|?6¿ ÿžfV#ÿ*ÑŸ€ŸjË/ëùü2ÑŸjËo6þ¯rÿ'h~¿ÙøŸjË_£gæþï5þÍo÷«ñû?«g6îÿ^ãÿ¯¶ü…7Òð›ÿAóÛýßjü¯¹ÿ§ôü~³ñÿ¦-uúüfãÐü~³ñÿ±ûÿHÎûÉä¹|Æùݸž1öÀÇà8~×øý©Æ[;õ<þþ%qâ­µm?73bþp—Â}½"¹Ûʽ^¯+àd=–ÍÍÏ#úá ø§#ÊžÅ켉QtŸñºgDßo0´ÝRÿèÎpîP¿¬ÍJϨ2áÖ.ž›H\üÕx¬IQW%ç/«”~_Eu“i<…® ü#M<Hnâ9ùâ•·[Ã1ì7E‘=òÝØŽëÝÎëóÖ¥Œè»òq ™MW[rš,wïÖÇiBçòÔzOëSó/YõúoÏÿdDrFô”ÏQóöŒ—A-£9oƒçnªõO£Ïüns²‡©»ë¸¹ó°}°××fþÔ
-+‡‹Žd
-3
-Ñ~Š6¿€«F´†çGlª§2ó\z=Å_¯•Šë´îý5ÌÓǯ'«tˆ½‰|¿8ê£ñ´åO~lË#j¼ø ÈÚò艾ÀÍëBññ#%_ù;³\4oòãB\°eî¯9wâR¬c9ê®7Ÿ£oÓ.Òâî °‹
-Aˆ›B±=gx/SX¼µÌ~ªˆ)³Åû4·” [žcŒbLºìØäq»±Ê¶ûý”ÑÑa`g«™†ü™8¹`Kæø^ù¿÷ÿCH!ÀÍôœgñ QØ*mÛk‚هܽšPµðíøp–'#¸€­|³ŽÏc?঄üT­­$ÙVY8ßOW“Ñ›iQXjE'òçzÕåÂÉúiønË¿;ŸB —õâLO—X¤­ë=x`&ºXÓ8õ¡Ù¤¾)^îõ…Ù+!ÓQ·HZÌšM~NŒãè=3šÓScºwm Õ|Sí‹ÜDÉUršLò׿R;T~ü’øæÒ¢N,‹Ã›r8mŽ‚¿¹n?è;u®S#?]10hUk|ß8 +Œvce¢ÒC¿N4S»Ë¡>Ù`¢¤¤¢+ø×äÕ»ö)ö?ü)H¡ñ¡œBvN[éV¿ïг”
-šðW£÷âá úæ¬RôæÐ…ÿaŸø>ÏNïNí[3€IAõ?€¯yôñöÆîQHu³Ž·Å‹o´­ ¿éIcÈ+Û*¬K"a-DHo{¼±=ø\¯1<²Ãr)`–x2ÄÝ?3yiu¡]À¼~?·ôôˆ†\Dm?äý¯ãž’ íjU—œý½ªí÷Ÿåɬ÷Uàø¢¤ã³¯È2¹þìl1«`dÓ§:§K÷‡Cí¤Ëšªz«õØšnÓíXø˜Þ¸aŠ;2@¹Ã¿‚/àOý!dyÝ8I›c6ýS6’Ö€ëÓ:p¹ûx=©]AÚ†C¬ŒëQY>ìk³yV#ÐÛµÐzàé­ÃyÕ©pÛ>á&nÂå›— ÖänîsF?שÐLÖøéùøSðüÓ?Oô'h~¿Lô'h~¿Lô'hþ/Åþ<ÑŸ ™¹ÿ{ÿ_mù-Æÿ ùüfãÐü~³ñÒý_Ñó øÍÆÿc[~Ÿñ?hfWù½Æÿ ™û¿×øŸwÿ—õü~³ñkËÿ'
-VçÃŒèaž‚p%#zcß÷ñѪ]¥Ç-ïE×FS:ìqgº «uw×Û—3=¸lâslìêâì&MòâÎT8rûo8Y‘¯Y–Á.·8sûÈh?hâi3:e4ñÊå3öçîâÛêõd¼³*)ŒåyÊ·qÑ/¿B{ßôë]k…œ<˜Ž/[aÏÛ‹2Ž+åìf­ë:}—ëœ{LÌ_ÇÙíüïá ø÷çÿ›¨éù9gD¹úù«ówœ¿Ü3¢>Ð9wëìèD<MÁ¯P©µ—$+Óó38zpX¿mQDø+{?žÛ¢äe½¬ä¢u¾~}9<šÜæª œf×Çèø+ðÌëǯ Q°z›¥ ^“nñôŽ ¥´rk°ølìç£Ór¾'àÖþ‡ëêY'AÑÝ{w÷å=nëåϾ[¯Õh—æêR¾L­kÁŸbúcÿüØü‡ðƒh
-v–xqFsI·y~Ç£i«z >Gô9«,‚á®#Kƒ•}èþfw¶ž7ùX÷-6È?]§Ôy¬It‘,Ùø™,‚œú™Ú­êÙz[«½µÄ¦»Ÿ€/àOý¢·i
-îÚAb˜ïŒh€Vn¾ät.p³>
-^'[:n¤ÆÔ¯.o/§úÅ‹Jåç ‘d=Æ ß÷KM(G‹Vm|›uoçØZýÀ¤†¸gtû+Ñü¾ß;óá_ãŒè9%ÆêýŠW]ºÕjwø¢GÌ(ì;oùDî–sjþAŒ„‡ÙèÓ‡Û’ß*á¢õšÓçàعrïb–¼i8ñÑænâ7kÛðü}ÿOÁ߉f·Tb§à ;%Ü~ÇŸƒY‰8§_®š3
-Ÿ!¯dîçƒå Pf·}èËmŸ}F«$œg£uœaRû`çÂáûÿw§‰™]ar;½U~z? _À¿:úÏD¡Òà˜D8’>ð_ö}¹ªvm|¶áò$ŽñÝÑ{æî»Iع¹ëæä¼læ§yW~îí%“d1f2×Înõ½v+êWõN= ž\ RpÎgñ9t³øÔÞö÷ˆ8¾:;âõX„¯Ê½ü˜"7p?¥/f>²Ã´< }±Þ¶‰×å7vZèáå0Åk3ÏÜlw"KW3Hz§ö*ôE™¹áAyÆ×ýßá ø§?Q&Ós¸~O7S¨G^zO}=R©S¹o?…nÔ@»ÜV]'Ì]í¬OÞëò8ØJœ¿©ó~6ër[ks¬FJ-µˆ:Êü[É#ûº“G½ô$JWÿOÁ÷ÓÑÿqà‰îòQ™Ù¿.ñþõÔØrìJs,ÙX¼`²ò>¹Ù¦Em»:<Ãí<ƺî4·/¯Í}µ½þ1Q’¨õýL q,©¤çâ^ïÄ~?ý
-¤ '½þFóU1RÈ•²K[“4I°i¾zßa䊠 sòôÏd‡·Éšƒ‹æÂÐíétYPfƒ9 ãˆæ—:<þØjí2Ywt©´"[K±z·Öÿ_À¿:ú‡å3=Yw˜ÝC=må­íëº,Þ¿(ËßZ+£
-¾7ú å–m˜ZD²ËgãËÒÐe‹Y¯u㸪[“>Ì~LdTR”ÖåÕþ©I45ÓEŽ›X8³?ß«{ý÷~
-ž¥Œ¨æeD)PI[üv`î1ÈìDá’z;E6ã`;ðä„NWm“°ª¹-cH(MÔém¢#ù‘®>µ‹¦¤¢©ËëJSý~
-—¿kâ¾´ÏdÝmÍ_¿Ñôý: ¤´•Þç1µÆ–_À9éÇ{
-/¯í(¡JέY/MWÏiÃôñ5j@öH¿)'VG&¶¤&¥ª¨8«• äBN”‹‡š(•ÝPùÒ^É ÔþdŠýÑ©‚&Ig4m<ûœ÷ù:i¸’›åvÍ¥¥v6£é:òž¦xÙ–&úlé]Åë}Z‘Gê°•¼¹"åqø½ªõ¡5ùt,Ö{GJt‡É`Íý‡ðüؤheDÝü÷ÄPÄÿGÛ™®+Šl‹ö |l±ïEAA;@P‘NQôýo¸vîSuëdÕ]YuëÏ€óË5Œ1à rûd½#c”6oÚ>®ÒãÊQª°æu±l$_|ŸØçÃԤΡf¡Íf±CgV¨c†¦ËNgº4ÛszÓëZ$ i=€å🠮â«;è•õâ=Ý8ç/Ðcü6bv7ÚòXJM@+Ì;©Ruoø‡š³æ©Ü<à2{453ßA–±)O_¬a‘®¥ËðtÑ‹àiÃuÊ”T\•©öN¨N`:‘äŸ#ýõç_ˆ«»]øX†q伆ÈÖTnÔ{W-¤ÐÕ^ZpR-²~=£n¬è‡™ÅŽ®Ì̾…t½Nߦ-¸ñH@Ô²÷~N¢…Oú'åEƳe’Ô YŠÓ ™Dð,±}þ>gK3¶½ÅmÌ%­¿Ý± endstream endobj 67 0 obj <</Length 65536>>stream
-+­¢× ']]a¿rðŒË1eqVN-7ô"™×©{^4'ªÒ°É——½hòr!öøöJàÅ% žóÆFðǤ…ã<Ö¹nej·‚
-AŒÒêØ\›qázØâöDÙáLA:àð–ѱ FŸÌ#ÆFÔ «Îûö_#ýõç`ž ¼Ùi¡±FNâfy-Üźn@œ9B:³*cŽ§2ø[“ѵDä§Æ¥V•Ágø“Åõ2Çjïí"¡ž¤¨Ð‘$´é0K
-_ݲÌ*w=ühšR®^t¿8zómz‡[‡):Ä»ä8 6z$ýÿƒÏêèÿuà¯Ìò ð]‹Ë[uö)cÜÇ•E÷Éy%î‡^Ù/m+«pžà—AÇfOؽ ò}‹ÚívÇrap4«‡Ø‹.BïË!|o¯‡%&‡Ž#=wIÖ µ#ÞrÖ'òaÿ>«£ÿÝfТÁ§‡Ú›Ù§¤xënɃmê–ò2°O#xçê ì¢&Ó³ÓnÃ,­#mŒ1?šµrÉ1ïè­Çó³
-;r:«­W;66W›¿ ׺|ý–ôå¯@´×UâZJ?Ç5«›ŠÔ\©økßk^!æ’9g—ÇfZî÷fSÒæOYPâK_æ&y^¨•Òìü. çì{zZÌÆæ\f&§Õ1–ŸjÛ~v_¢?4Õ+ºæHŽk#Ç~
-b'¾£ÃWÞwŠ©Îg}LÅgö¹°^è1¦ò[¦ìðª¼Cæ2´ˆXÁ¹[3¾ Ýg\r^›ÍˆýqNÛ!.ÐåÊL›^ŒÝ‘¦ùᯑ€þô# Zoð@ôzn‘ãš™‘Z ƒ°ð8§\Ê7Γ)Œš·éŠÚ“­ûTkŠSFAý€‘`hE/ü¾5}l¥ÞvG6éYNÖi¦¸XÎéòl&M¹«¶¥¼ÆÎø›
-6¿$&¢B£œÂy¹DO8-0I'‡“Y>O™¢»£éYSçér«ÓyÅg˜¯Í¯„{
-»I¦ápjÝ‹ÚdÖôÆ°²ïan EPÿ™¢íF€dæ€zå9|èëÉP%•épðb¦ÈkCÑÈKdXdÓ¦8dt'ø? ýìèÏ—QZ‰ËíÇ+†£ö0.3 $Êósžñ_÷ˆ¨BŒÇëž­m«KU§N{n
-g•Èsòi´d{g 4;cC;‹¸_VŽØGÓ“Af:bOǽ g94mÖˆZqüø%$ ¯Í?ý†fúÇ¢ßÐgþ*ú Í-öOD¿¡™€þåÀÿø.ÿrà¿4?ÑÿWÿ¥™€þåÀ+ú¿-gÑEoöEËùSI yÜÍEh®l ÉæiµúÒL@–Nß6@ô|8s²q¤öx¤¦²óu¨z3á§üÔ3øöëøÒüDK½ãrg‚GCŒËÁË~:»<=tr!ö˜×ü"qí_]·M:mÇæψҔOhñ¸¶¡Ikc‘ôk<r{ýHy¢ežR¨mÚ7Ú5™ñ$4™žúù-)̼ïû>Íx¿Ž¸Ló«šØ´§mŸúUëé„¥gÔE™l¸[î@ŽìOËPÏ­±Âé”/ì¹4¥SºxTmÈÀwV}ŽÓ¾j˜§ÑØ2™3ê˜åâwüЛxö±‹Û˜¿ÅÌÐùS$ ?ý(.‹²
-Â]HÐ@40ø¸2,ã
-5xFK½¥šaÅ?ÚÝ®;omG
-³ìyMâ)½ˆ5Ë0ÈÝÑj?@^y,ÕÔ£9kMΆÓk»g¶ïº—lÄû¾H[pÅ¿hÔc`ý:~hJÕÔ'ú †ÒÛâ?…¡ Zãè6w³·‘W® ýí¹N|;áaÏq}-ž°ZY³LhD?köçœjξw1¸gÕ7jT;Þ+>s†»‹VT+VRújü:âòf³þ]“ÿ*cä?e¡ u§Ñ£ ¥¡Û†Ã*Á¤rì~j­õ
-~meöÒá´½k;»Ó÷G+h¦Ó˜³Ë!”Lw‘Ê}‹¹Ž§Š­ÎÛ†±~ÿ×H@?;ú?¢i Ê"Ÿ2F j¶ô¸šîq×ËÞÞ°R Œ[®çƒåøê‹)öòhN–ç¤ejv®îMöîïuqœý¬©ÊØFñq›qõ‹6­ .jí.Jè¡9ºe7¿ŽšÛvŒ!~ðUk}ã>õ–{- áC ÇÙ;b¹•ps6bÂm¬æs§×{¬l#­¬L©z'ÕV÷ˆÄiÛqé¨iVs°[ÏŒ”¡Öѳ­tG…½<˜Ý7KíqY' ¯Í/!.[†öC4 ­pŸzË]\¯‚G@‰ÐýyíÕÂÃá2ðí3I@× :ñçíЗ­’×_êáå¶Üy[ÚfÑRƒ‡uYåIC]µîôVéz“ãr¤Jš´/,Ö$Q«o ýáÀïEßòàSÈ‚¦Ä¨¬ÏÅø–ú3±êåìÀsdirí<r Û4Æ “_†‹Ã@`ç[2ƒñZ¹7ãÕ†c9¿ÒSªâò] VË4äîÅI¹¹óQG¬USùuüW³‘þÜÐûT²Ÿ’¾‰«ç“ÿtïùì=ž©µà¨g{^]¶ÉË«‘œ[Œ]àô;2gwûqu¦¼•Q›'h&Çp]bEs.š&
-v§¯.Øc¸Z°Z¤
-§¬—ò¯ã¿ší48'©Ïc#)qAýT‰E'Z™QN&›¼·˜'Y¼ãG·âã‡MµˆmN,‹ª47’Ñè5éõs´¨¿kè¼ëicv“P3üTŸ3FeºžáÝ‘Â&—¤ü@.öøSÄå—¿ý!:Ù´A׬Pq­´[Å5¿ïÜ7Ãð0…3ä†×VçtDˆÙ~‹Ã±Õ‘´ö› DeO‰Ú싾íÏ{—aÓãш™ìRM¯^³)kךn T†4ðÕ/!}mâJÌʯ-Ð9ëD\›:òã–Θ·ñÎóüÚ J9¯Í«i9N²£çÕîæBN{«Gtï.ÉpÕê}º;ï¿©›N}¦Hu?÷¯¾Æ ˆZlÌDrJ2µèàڔݎÔ_Ç5{ =¯VãSo‰Çµc$Þ_æÌ-ƒ2²³®*>OÖ-[2å–ÖØçnvs-] ¦LÀ\CpÝæüqk4YHï·èsOëLëËÁ`r+@8ùH¿¦ä€¬ˆDüší&9®ý ègGÿ€¸RíÀ`GSqµâ×Àð™¡[ÉaC
-"·«/w'»hyǶâ¤ö†Žä41ãGK¢3-–>©pi³P›HªIW«§åï¦ÝÉo!“nГjyÀgµ$F–°ùu|ý–íAç$ߟ'°ÂqM[ îèp„z­ Dœ ÃÉÒ¼ßÍóÞdð@ßÏH/V/‘Ïu’ü  ¥9l?ÎÏ(ìP¤/t­<埘,Í>u‹Þ!ï¸"“H§‹¯hΛ•.þ:€áççâO…u-U*€¦œ7ü‹¿Ï† ÷ŽT×—ý±1?h’Y=)¹ìñ*6¸Þ•Í€ƒJ³ç¬hIÚÉ™éBÉä¨NQ+L\(“ëF«B¼™Ïa¹Õ%Òdk4>äqògH@úÑÀE=.“Ýešr”¾·z|ÙϬè(múC¾¢óÚRž¨J>]<ˆMTÖçï f²†°r˜s3|]‚ñ
-ŸzËË‹Œñy’ªd†ØÝ‘)—
-ãƒ^*sùR77•î¯4ee÷¹V†§kô˜Eîuµæ×ÇÀéQŸw4y¤2JÞÂD±…¤V|²k®ÙÂq·aX³kMÅùæDuïmg2X.9Znbg07"óFc²S‹Ç¹¨žÄ§õ|&áE+ŸÇf0ÿ:ÀðéjqÍË~m$²Ö¢¿Pä®óÔäØè(…ÕšÛ]\÷ùT«Ê³E½¶djã嚺ë–6YÃ㉮ßbÖØ0$kœSgÜ’ˆ+^Šúvž7¬bånèÍ=Ñù=óþS$ ?ý(®1œÔ±]1WÍ)Wš’›>#VÛ§Yo~È©$[²· í§"žZá%žÄîž ´‚8¦–‚ÛÆÌ-qø-m°‹Äí°jDPw>4ÐE¾sDVÿ<
-ÐÎu$¥;þ¯ã>ÚÈ}Ë)/Ÿ HO6 à˜×€cö
-kïù¡ÏWYØ, é ¾ (¤¹šh‘ãé¡ð™œ¦±9oÏPÏ^ÏQS¾VB¥Ñr@É£Ž?”‡‘8T‡+¸£ û—>È,˜hê¿ëR»9z2D\í6¬v•Éý"ˆR1©óieÌ.¢¥:Q›l‡Z3T¡ÔÅ/5±‹ñç‚Šês8ºtÔ+oÇdzýŸ•Pî³ÊÍM›`?k™s$Å ƒ}m(ý5ÐÏŽÞ‘²ÛÔ½² ™Ž(´ Ÿ–ptÛ{ú,Ù‰Æ6½Š1Wh$Q©ûÎŽÄ-×ضŒ¼u¥†lI¥‰¤-® þÊfºfúƒì…B
-¸úoZOã2䃃T¿\vÏf} èkóCTAÁÞý]­ÈãŸû䥸RÌÛ
-7Jî¦5c *µ:ÓÚàW·3Ž8X/Îl$œâ Ÿ’H}mcíÛÖN+þÑ:änNŽùÈd²Æý¬žînÍu¬m&y2~ 1¼¿€óýabÇåLhnEä"7 9ü¬[‚Íèùh ÜÜ-öjÕ@omÏö®¨[5ÚW&~ñ¤-ÅÞ@Ì3io9ò²ÂÕ7ížéM(ëïÖJÿ´9œtC£T|ÿÐü ¿íTaД*ö¹ý\ˆ+‹Ö1®¬gχðÈæî…©†tìøÅUukUzêH™`ž€ÎCˆž–@©o¬\³?S´e\ G_t³ÁîyÇ.›C¨›ëS¡²SöcûKø\+ÏÃö†xˆ¾ÕHI^‹¸bŒ¸â
-ÑÃßówµká¾TîúÇ`‰¹ÎÈŸ:Á žŸÞýÜÂ2&uÑ<y“¥Q»º«CØá6{eS;ìâ4¢¿!–KàبÔÚÁجš¿þ%ü^SBÊ æ›Ñç.äù§~U«Õ¸"?C5
-õp<%ºÞYZ¡WáìSç¡¿¥-ª;cÌjŸgõ–qàö2Ãï’û•¸Ñ›¸ª+£Ãº¼MV·Ù*Ëéx-¯ØÂêH@?;úbøöœ€1$žh¯bþ¹]ÚÌóŸÂÐC\eûCJŠ™Û[|—ƒÂ¾ßrÝò
-¹<\‹°ó¹"nrv
-äb‡ûìNî^Qyº…ä£M¥»®ä7‚ZO«ªé­¼’ êR3e9â_šŸè‰n‘Òç¾îwž‹«caW÷aÝw|ê–Iß‹~¹×¯_¥•ŽœP{xœ…§‘¾¬±£ÝûÍ ³$`ë³}#V¾ˆRÊòùžÉ«ð).µk & i÷^ËÄHKÑ(3â/!.§ÓÐäAàm´º¦1ˆ«Ù:WåHGïÉàWÈ8…9åžóæ=¦æô­eÏ.XnÏ'x¯í³½mnž¬/f}¸_èP~f|‰v¹‰4.œ8)3²`‘MI ëM óS$ ?ýè?¢å´ü)­?õƒOã,®žõí³ÙóÜ{’ïÞƒRížq…çºvÆû•æ‘ã˜æá ¿Z;ˆ7ÛZ%µóäUØ1ºòZ~ö¤N bŽ1&Âé¢:ÞME"½… €è×ð›æçZù@¾|혘¸–r¶éy:ßð ~óÙ|6}•ÛŠm%ÏU#Õê{4ÞÔ7pfXS[‹JMŽ}´!éM¥-€ {oQ«iÃy°ŸÜÝœsÜ}ýy×ó¼íêÂ\Ê¿„¸ g(¼ùÔ[Nòqåz퀘ãt\k…ë(2;$ƒ‘ï¹õq\+‘S²Xˆ‡õt‚·æ-¯ùW®¢¨Ì­²„ØwU8]›5^ ´6±õ«!ŒMÎêôlìz7åÙg8ÿs$ Ÿý½hƒÎÅUèDϳi\së»jz`ó«æ7ÉsÖ ÓÚ…ý.˜å7e³P\)²^\êjQ„›äûbÛ9µ4ª³)äÑfôè<¤þyBO¥<Ï…Ê|–ỿ†¸Ü†§
-‘ª¬g¥IÀ±Ð@OÏ9R¹¾fd¼éÊ¢ z2Õ"­¹:°eB;òñî,ccœ}pã‘—ˆõþµø%ÄeýÜTqãje÷ï$ ИB;`RÏyYò/eÕ”cÅÚOÈÖU3n d•P¬íìpç´ûÌÜntõÄTûD¦IÄzåˆ4q®àfÉèàÖÇ0»ÖƒÉäJÃIïó|þ¯Íw—7ö?ÖÕÙé׎Bá6–^¹ë£f€a5ûý…´§ÊƒÖ–.{%[ü<‰B¬Çm{¾)/³ã³îÒõN"ÓH­Â¼l[ÏŒ‰yª€›Vª†áR³/øÀ[ —£³þÐoûqÙçŸ
-V;®%ã0zŒ‹‘'¤Þ‰¶Í´ÙW°á¾È´˜uTx
-J.{RÅfZÞÎÑ7±ŸÑç¹A7ÊçÕ½TR ·Þgñ>Ö¥¸ŠáGJáÅM*ÍÒP++•6êôIåbþ%Ä•ü~W»SôÊŽØóúö\hôÀ ÖìËQz_* ºëÈ… ù(ǬnÀס`¦¡6 ¤Ç†êmxƒÜÓ0?œÇ0‚p«Ó±s>sÇf›Üun¯4Zï§
-#Ï+ÕF‚0è~!ý¶ÿ׈+ó‡šRÓîž”.¦r“ô}IífÖj¯Ñ-ü×7µKÏÇ)t1›Íû"Ý4g MÖ–¸$±ZU%²;w;ž\·:NÛœ…]2Ä«ú.Ê‹µ
-«y2º˜c»Q`}Þ,9’Ц5ê¤;—á]éxÞW»!O¡óü%ĵæ
-ZÉØÆf}Þ”§V²‡Uò™ÛaåLqSèUàu%b++áölÈ¢ÔYÆf´L¾%Z±5/êljäŠcÅü€ú@&þÙüGÎÚ"E©>|4e
-ˆ²sîÙx®Ö÷dþ¥EMt\aX}œ·î.¶`~ë7úšÚ'¯ë̆ÒVÙu5°ò«6.ÈH“)K{$æ–¢‡]Áª'ÇBI,Ïg€Mç˜èïÖê1\u?÷z@@“W ŸzË^\Ý/ÁuÿÑΔ¤vþLØœ®ËSávÊ-G‘¹hºÏR›ÆÛ<Öx­çÕò{Õ!‘ÔòmJ4¾‹‚u×Ê v:mñ<;Í}÷È
-U7ùO½%½í˜h•œJ!ɤ4oíËke{Ölð
-ôûƒ¹í©Òç}|lÍVáÛyÊ£Ôã%åðZR(Ã+ˆ_´ê…yÛMÕ¸Þ)Õc×]œbŸ³Ù”ë-g€9õ]|~M¨và,Ÿ–Áy³DMļՉk-gz×f£y@gRŠ ÐñœM÷OÇ:º¿†vÙÛتå«AI å×jv“ȵx*ù æ›Þ(Å)?Ë&;*œ€f™ºÚbÑÇ™ƒ]¢fX£5™m']ò»
-ƒ¡ÛÌØÓ”|ËFÔh;srدýg×PF·ûQ<ù«#.e›Ìó,WÍ\§ô¨fºô •æ%I¬»¸Šßk¸3~›Ö”xf÷RïÉï"†YªõŸ›“*y1ϽŸž¦—nãe·ì5£Vë²W YXõËZГ—‡¼qÊÌfµf»eZ"‡¸ 21fù©tœ:ïè< ý©Kj•ûx7»'q}r/àdéàù¤?Åõä™ dP
-ÍÏ`øÔ¢HÍ6_>·9½ÔÍ€íªÚÀ õ\fwtII?š‘e⥪ÂÂè¯çÃVk;£2Ÿµ¾©Ûãô‰Eñ†g<žvC¼Pm§0¸‰”PvÉ·Ñê¢P¶Zâ°R÷5û.bø¼îÆ•ÁãS^iV\ó?œD«³ƒ¦JgË%·YcXJövvÿF¬ïå5­d“S^¬{ iþêääÙÑ-­ézÝNVCå@ìš5Î)Þ;ŽÊ=ÕÔÈžáQó\ê% a(kÌ0¬zò¨áÎßE\NÙ}ó’׊ÎþþRµÍ5r7 »ª·mc¸Ž²;æpk¬é0H@²¹˜ãBÀ¡Ô †³Ìâó©èì%ò]K+D¶»Ýá´„™Xµ^sÐ\¼Ä~>9¼ ¥ü°{Ôv#ä¡4yäA,´Ÿ!ýìh\ž¾‘¸ŠÄ§·ŽäOa(a³÷c$× {WI_“ëþÛ„åiv×BÚͱDžœ•µˆžvN–Ä.(7>&ŸÎð[ŒÃ¸=º¨÷ÍQ€6/Ã{?çe¯#ÏV7ƒ¨g¼„ 쮃 \û.@ÌéhÊ)À£B'Jì©3ìöŠê¶úšX¹${yA.¤šsH†³ŠN®çî&ä>›ŽÂà³îÃjö§ÔR§”‘äµawÃ>Q³gܹ"ÃV3¼oÃ8 ¶ì,;ÀªËÒwW;·Q`%×°].ÏîB…-OOyå÷æòRzß…žÚÊͳ_c\æúõTŠ#rÿŒÆ4!¢xåÖ&PP£[G¡GÝùb>\YŒˆ¼Ò˜‚Œú} IzÃÃ
-Ö@ÁÜÅy3º«ã8챪…`¹ûyp˜^ßdA¿à®ïŸ•Ð¸‡«ägêrÝ]¡ãª«Rgh`ÞóÞ5ÛÁöØkKØ ùk$ ßö7l¤NV#nLK|]¿ðoAxq…]¦¥Z§1Io­1|–{ áÑð¹1 GMDiÈõ©jMè1Íä²{‘¢U·yZÇ]y»Nãugþv°9™m =ÙíNÚ¹´îÏk)„6ŸG'ˆ^ßE\¸,ý¸uq1ãðq)y¸Æ%ƒ?ëcÚû®—Jî!.ʦó,©G´È¿Òwñ°/Ýäé¤>d¤Ö…Að*¦Ñ@Û¥É`T~Nƒ¤þæü’ý]£­ùX01ý #_Ý¢…x—VQs˜s·Kœ¿?ý†fúÇ¢ß0üñ]þ‰è74Á öŸŠþмk05ãb'ZÄ¥æÅKGhz6ö‰þñ RýÑ}Ïîõá$ÁÉlä¡»x·€¨@×CuÜî/*=´à‰#ìNÉèÎø»ù“÷ñBZö±w{çg¤‰íåVÏqä§{Z©EÛÖ¬Ï; ¾6¸˜ÖøX&[qqYJ‹·ÿY^.Çpÿ=ŽázUŠK¬Ç¥vÖ{8ChªuèÞ¾Ÿá[O`Áy,Dªp'Ø Óà …]p¹S'/œŸñmÁÓé@õt 6
-&ÓsD¶¨—6mïYÉÚÏhñèfîø
-‡Ï)ÝÞÙB'@ ÷¡¿ï\_¦žîoç‰n%lßw ÈË9ðézÚÀþy¹#®vª½<šVóu0KKcû ÄŶ4;ÓèšC ”ë…1|xVÿS½ ;ìç ¹ðJ4c8OÏ
-û|FBÏÜ"øZ
-ŸÛ6Ïl7H½ï¨?Θ¤gä%Ú#E‰÷òðAuÊEw«^pÖëÀmôÓ1/¤tý:A4½T×_H@¿íÿ ?D±y;çD4%}‹Ë¸ö£,¸,ùhc€–Ý„ÏÊŽ#a7šô£®5¶l{>/û @}ÈÙN<Ò_°®•fDwÊI·”»œç솶ö:žy-eèWÙìoSÙ÷jŠü ÄE4ü¼-«È,; s‚°"Q¬DØ @Ù:
-´˜pÜ„PJ7q€Îw
-‘ó×lŒós3Dÿ è~ˆ.ÊH\n³ŸÇ°â·¸òðóqUžöîÏȆ9…Ÿxõ^ƒ¿htR¶U6ŸÙîSKc¿™[]õš¡(‚o-·Íög}Ìxm=Î5oüUN¾çþ"U˜·ÂA›»í4Œ»-—#€ÕÚw
->Tó…l`‚ìsýå
-Fë-¼ájή˞4íyä±-mP}l¶tûS5»ûs lÆ;u‹íí»CÕWm®¶~¶.²øi•žÒw§'7«­ÔX´z£™u¨zìœuu’0uušÿ XÈô<Ù®W}8ƒU¦dž]5<4ú‘‚,8¯0±TnLìÁ°3¼,6Ýþº…z½ÌzÔÍÇ,Ô+ómOÌJ­Ë:[¥äºiŠÔQoVßWç»ú­îι®ŽOA½ƒ>’¤¶e‚w­G>3ÕÏ#ªÆ!ÿ¶wòÞU&ÅqWj6×3~ô¼ç%7›m[ûø0–“/„oºýî¤a3ÈHç0—‰6W”ZËf«ÍÈVã®#T£™~Óuu k¯ÃmRÛÎB¶ú9çUcŠÕA1’«™Û{SWŸF%÷@¤û7ü ÿôÀ Û˜s#,
-PL9^¯åüþ_àoš°çÿÿ+ú/4aöúÿE¦2˜TI
-À‰^ðb‘2xÎõ(›\/g2)›rЛf\SVp6=r º¿,&Z‹71j’éíC] Ï¡a¼/þL_x— wq<°»€ù ê‘~\ku
-‘„W÷d7•æn­è1Zô¢µ¿EÍ™2$)W~ÄfÝ{=ìêÞ‹Ó•Gs°½œ:Ât³ÁDû
-×–ì°PÿŒÿhâ(59&¡[{ òÑ7GΫ>ÕðÈOª @†øýÌñ §>çDœ$QÜPW©¨]ocêö)Þéõ¡ššJ…Yw=
-&•óƒìzõtnÇ®‹ C}zZª6K«Ä|2êò_
-e®¸4‹{”DØ=J<›m±Zÿ° ÑÞ÷»$o˜ù…=…ðíÀ`JP*ah¼ÅFÄ}Ö»”ü ºl?>ÖsYÅíë:3³vÃ>g åÞb{™Îmu´VÊóPReújë+'nÚÃd¿¯NÊ>¾k°³JF¨Ô®M>xüBÐä%ùÔøø%
-ˆÏjZþäûæA¨¹×î¯êô–ŠŒU ¹‡Gü ·‡1¨Æk«u,m¹¾ý´‹#©f¦»‚ù`´G–\(/eÄË™·Zᙂ"žÅ‡!TöÒž¯ÒmÙrœ÷â9­— æ ¢;¯ý…äoþÀ/“ «2ú=cò}Á}šÁ³áí^'C~‚ëÉÏ])>Uô­ï×óeõÅ­³{¸‘6»‰Ú ÜÙ"g«n…¿g‚X:k~u›hËö bÍßoì4ï÷鄳ì=1Ïd+õy:)ÖæýB½ú/ð_Í©‰ýÚo‰O¿?—¶@©uõ“N¹ßËtì‡ó8}¶ê~äÙRÅ•SÓ8 WÔö8Z}®'Cy¸˜ŽVÄu;Ëj–ã›Ã9¿Ø®Iež9žu.g¹GßÞ„áÈnŽñ˜°ÆâRXe÷à]ù€'ãrs¾¿’Ÿâ¦e€’œ\âU9‡çÜÓ¿)7ëyÂ^­ïîôú➷̾\Õ ÝnsÓ8—)¥Ïé•+¶‡"rc¾Õ;Î4^™sNç&±Äb¡Í®ÄÈžß7†‰·Oz
-›VeVnë•ÙE±ÊÃòOO‘áaDŸ þýù9Ë|¢¿ªOseCÌ 1ò.otw^òq6=7Ž UÚJM¼®ö„LëaGô›Ÿß`Ÿ¼è¥17‰ß 3?/–Ó0UZOÏ’1N>íÓ˜â,0¦ælmœœØÊäÑÊÿ€ÈËgo(b:ûý6¡5×’¤Êìîlú¦ùÍÚÓ:Ív‡óaMI‰e=›Y½¥IM—²<ijUiùR¼êíÅ –t9ܨ÷™’d§«CŸ¿\éúg;Êd«Þp4Y=a®Ú(Ò{¶6Ú=§•@ôÍ È+'g”Ly§.O>ðÛþšz²² up¶q%4<ýõãKÜÝ Êh4#VE—.
--yT]˜¶Øàˆ›ÙdÊN±;m*úp¼}ô™Q¶Š ƒÃå£ ˆJãØçV«¨_4
-}o-4ûÏ¢öOøAþö
-;¿Jóâ$ᙆ½¥jp¥S>ÏuÊåìËoôÛ~åjïE/”Éòe*H-áNÙÎÔFƒÂä•8•q&n5‡³Ú³7ÈßÜ)í¯-¾wç-­ëѱ«è¤Û)¦á|¬Û¾ñÃn´!»ÿ ,CP¤ò%P&*½‹ne_÷y§í§Ù´}l¢WoÓµöaT[fù,5à îáÓ± ¸³à¦˜zˆ£“÷Œ#ÇÈ4U2ö®Ù¿¥‡=Z:´¦=ùD‰]í6ÜRïªæQ´™zQé¹Y¦Ò#Ž£z{0ù-~¿îAþñJ@©À–.» uuÁù²×”wdô¾º[ßJ#m -%¹Ðt QÝž½å¸ûÜrDD3uB='ßNfÅ:¸¬‰b¿
-‚z/¶¾çZw_gJ}NGÊ<ƒMgÜCÝJ,ãöáðöL¹Œ;95·ìäŸÅŸ
-@ø\Uç¹w‹JÆt¶œg›ÌûuùA¶‰s)©În0XóÜQ©¢/1¼ír•úú6£šÇpìØd<œÏ0¨Tg-k¢GѠܥ—©65Á 3QR\›9ÀÙΙhš­¢,^›·–ÿj
-¹YéiVŽí9DwñgÜVÚTuçŵb¿ƒ`eÀôKÛ€º}W\†(­Bã8 ¿p÷«‚×qú!Ê'Øí|ß\<,õÞAusŸ½W“ýtõw¡ì|“ìL´Üf£l«µÌæ?«qÍêc¼n¬[¢Q÷Þ¹oñöÂ* ±Íÿ?ȯ‹7›ûMÒœ‘7Þó ņ’’Ÿ=ÒRÌI!£"ý‡l–l#ð¤é •UF;ÙÄZhÒj—uº'ïR6_¿?¿;BãÖEV?M#!ß5XƒÏ×cg^­«“Uï`Á¤öò²ËÚ–«)µ^AtþœN”ëg­;Ð@'7^ŸowVj_O~ôZÀq¾Äâ*ÓŽˆÖdœt‡—…;è¯[qoÛ¿0ÝÌq¹€z±ÍÕ²ëÖ²ùК"uÒë¾i×cÛôêÔ¼Õ¶ŒÕzd”ª‹7V”ÉR5´[šÃQì×åÏ0ÈΫ£m{³öznd;Â{ØÝ,§ëÊUÏŸpúÙÔâñ Ý}¾˜ËÒ*µÆºÆ¸ïæN©ÍUùÚwOoÒj6«o²óŸ•ÐNîö] fµþw4s •Š-¦ÿ³þY>È•KÖï%o3yÿ ÀŒï•"jk.–ªü§T©/¸lFgbÕ&ã ¹^æʦßH2F÷c­÷TîTöÚ\%¸6}U
-kšŽêê¨ò¬mgiPýxŸtuPˆa€ø;^É…—|ù°ºÃ¹ŒÇ÷FÉS?]˜~†Å‹Ž3År_|»-ÿ
-êD+ë´¿oS´ØTdø³¼²û3`«ß_¦ Å†0²”8†@Qç¸ø­
-ˆGŸ)Y8[E
-PtAÑAÆn;C¹’ò—=ÔLpüµ¬dIcÛëFÝŠ Kÿ>Üž§ÁQè
-~¡cÈתŸÚœÛÚðÞç÷Þµj›Óq°Á«Ž’Ydöó‰Xt®^fdEèknì^ͱÓþÖð½-éÒÝ¿Î-ÿ÷ƒÿŠìcˆÁP®§Ðñ»ÚxGßåe"y—J´5 Íû8CS;W†·ŠêÍàÆá<#D7w`×Élö Ö0a:Ë£½"{WKÉubs“¢3Æ{hV´HLv˜#õ7g½Õӄų£†þ¾õg
-Ë]9ñ$Ë¢pò[>àv./ /¾ö<•–Y€p¾8þ?ȯ ÀßôÈ—jEPX±PT ŒDQßÎ#w‚òäs¾ôæ×ÀåÒÂkߨЋ6˜~\ÖòÛò´URãÝ´"º‡Æz4éP’»¸Ä¢ü}Ë âäb);iy¡¹E{A±»hþn ów&!†ä‚0ÿ
-ÊäG.ΰ c\ëöÿÀwvQzZ°ûÌ ©ePœ„Üså¥ÅÇXi/ü°ðσ*Ç9•=\M´&G[9ê ¦åÉ"Ò¹°ÆI È¥6l•©Õ­Î¡t·Íx~Žb³%÷⦢“'÷ûô8Y›¥Ô´F¬ð©/êø¬´Õ±?vži Ýr
-õÔܧ¹¤[lx¢]8ƒ…=€x¨GŠn™!wÒ ·z°i2¥XÉ\Q°býjZßdù<‰¹UM“ì°%¦XÊ5¦Ó™:ÌÆZß—FÀ)Ù£>G`ÓÇÆês„NšÃo&þëò[
-óQ³Ýïý FÍ7ê†Q•1¹p$¿ÒqùWjx]ŒÊ=½x&%Äk¢Ezzœ&ÚØp2ydæÒ¤¯GoÐ ,Ñ«£¥m÷œƒî#´Š½š¾*öüp‘ÿ…ä¯û¿Tâ‚Ý
-ŽÈUÇRák
-m'%h{ì¤Ûᡨºyºшo}B(3mêLö§ª ùxgúøA~]@ÎQ¡(eh
-à•¹
-X N}
-°&3èUâ_GŒ×~§w¡¬g´NÉ…iIÉj=c¿ÔMÇÕY‹î„R‹ÃóàþÂß|øi5zY(—êM¼í8àŽã5=¢¹Êä·øÖ±Äa™ã;€õÎÀ—!œB7Í ä¦úÝ~ÄÐxü¶Ãad¥ú‹tZô³ØGؤ’ ¥¸f*Z´¾­ìGüYœÂÈ¿o'£äÞ}‹™Ðh¨äfÔ{+Èé öæ«óº;]c·›>6u®Yaè”ùÑà·
-`¢n<Ö¾YŸŠ _ò˜ïËÝv¯eY¸Äj÷Â>¹ïIˆôûvëoÑK ‘a)ï‹î¸Ôh¼‚Míl§ïåìÔ®›Ç¹ÕdÉÔ<mkìmo¤±ä¡9©°Ã`÷¿™Çõš&äÞuUsKjý¡_—@¹Ïú¿‹MSH”@~_N´Ú%²}ŒRÍõ9œ)Aà—žd|i÷>ooxyfL»Šï—×eÑ©åÑúb©„Ô6»B±gôûï±>*ßæ»iÚ’¶ÌKßnνçiS´„ŒVñꙫ²ü¼u r·[ͯßœü-þ£‰çÂï;… öq¤_(˜ÂBQÖÝÆZ;gÝ~¼
-¯ãéÚ\íÏîŽG–‘ÞûÊÚÈØ-`æ.5ÌY,ªìËUkËF0Q[2cMXß9uÅû+EYg¬Di7W‘¼Ù7ŠkýžÉ¯¬ø@¬rã-þö[
-õKõæGÇu3úA#ú—ž\º\=·Ø7ø¬j¥½§©3Êë¸ 6èYíHäMTÙûj
-üD¼äo˜ïW Qv©ôWÄ‚
-º•yzQêpȬ1e'§ÕšÅõ ÄõÃNÎï»Ï )Ö‰SŸßöI+8³Òäû
-Ò«úƒ$ѲԻO?ƒöíA_['‡ºÁ¬¢uaí-}\ûd¿ÛÞDÛÖZìÉ•Íyx^ U_¼Dꃿ›©ç²nÒs”rÜHÉ”X¿4˜|ÖÌÓ’0½ÝÝã2+ÕôÔlÑÓÞ³³h¾Ò¿~~ €½6PÔuŽ ?ô_ æ*ñf{o……<(]©SôÈÌ¢µ—ñåÄ,$AÏ»¬úƒlÙ¡èci¿Æ¦º+^ƒøÂ?¶½`&N4¨ô›=˜÷ ÃumrVºŠÕiÕ]÷&‹7ÇÚÔÇú3Y#ÌgZKïiu8Ãò×=ì•\8çÀÈ›
-Ⱦ]õ­)È"dw˜
-²RËY†÷ ®
-`=ûŸ«O1€œ(ªìû
-Õ·­ñ£u¢¹ð-¼?-OÙk 9ŒOQ‚Ò¿@B‚¹‰(ÁPæ¶0[v¿o”Æ‚ïJ½!
-Îanî®ÁWÆ`ìu%“>Ú¹z緀ͧ
-³;´ŒÍ¤ïÏ„ãäææâ–OÌõr-…òæ"æwÎyš×“šG2^´Êî MS‡Ã ¡å„m[÷èÓ0Õöú[€\¥ 5¹×ê¿[UùŽ/þZO&F€L-×Ï«P3ã5­^î™É(
-¦£$哦Œ_¯ŸJé"ÃÆù; ;u¶Ý¾×“«S×ØçGÛÈ­h¶mŽîï9.ƒ:p@¨Úµ>Þ‚³ñŽ(Öt³X(ïœÊ5ÿ[€?†mú„¯a¢Z0i:=
-„n¶
-ÕêšÅ-3䦈VðÌÄ¿X9¹9,ó† ë%¹‡ÁLEÐ1õ}ÙÓv”„ÏÞâñAwR¸Þª?ÛÆåaŽ§ÞrrvÇÈ><xÙÆs¿`i§âK¨]—[y«5Ū&Õ·á|l·|t“yrzöRQw“²yÙ2}2½9Ùt^«ôž¸ZŸ[¨"ßä·€US…š³Ô´[PÓ+'€ôË¥×â°…s˸}ÏNïãôpî_–pm´}í”îk»ãQûk?9µ´X*QHÌ.úý†€è#´ŸßM¢ReË2íÍÜø µÒàµÊtcªÒ©ž(QKÁä Þ€™øú½ÎgÖýÌ'ý[
-Ë¿¢WªòX)ò;üìÖÈnlJÌþ±‹MíÂîð±”;$XtŸœïJù
-gÖº47xÀ5koÜ0Sˆ¹AŒ> ˆß`½<ðÛrZ¸‚¼•yljdB¶L¦®*>ÞÔÿõv¹jìXoAïÉo¯\ÂjÍ%&(½ât½]šÄ*]¸;›¯‡-wñ½oóÝÃM¸¡°Í°n›gŽÎ½ÃÕé’!kô‰aÄãafNÈ·§ïYßË?ŽD ùÊûÎÒ¥w´s¸gPê9ÑÙXÞînþÑL;qgR0-ƒmîΣõ`S§vSlÃùÚþà‚Ä1c8V
-¾ðØð gn.6—ôažImÎì~ÃÞ¶Ð~ÏX›ÞØusZ¹fXˆ÷q*ùûô6”ÂYQÖ~€ºP“ßoÙ èöû1 ÷ÛºÕºœÐ:{=ˆšÿ²{$†Ók£ºÄAWÝ4&#y(ëìŠÌÄK!XÔ$¾¹vÔE­ì8[´,v†°Þì2(ùS!x%“Õ%K—;µq[²'ãöJ·Çʺ£NU:ø-
-?¦Î›$•T•ENŒê BFM©I(¡ÇBw_7a\ÉÂΤSЊ .¬á;öYįL\-&­wƒÏ´V±Ï´Ú‡ÙjO¯•ÎNãVê2zÿ'âq.«_€<`—-ÙÙ&ñø[Ÿ|Ü!­¥nž¸yªê‹³#ëõ’k9ãy¶tSwùi"ç{w¬ÿÀø¼ˆдÂtû\¶Ûñæî =¡Çg´Æs¶ùìm6^[|JOšÛ®Ÿi
-x‡ùÁšxP6›ø1¸64š4$Lÿ'n¾rå\76wÆ6ìcÉ®-uœ§­NœiJèLžzf8zK U¢ŽÇámظÿ`}3ã¥Äö©EöÄcPä/øˆîŒ¦Ý®IY‰‘§Ê¼‰§Ùr.»…•Ò×&YËÆÁFÍ4²½7[¿”®f#Ëh^]ÑW½sÒáû÷úÌÏú><whGhi¥åt,¤</éWB¬Å6£m¹ÇX‘+»åà¾fÒ’»ù‚@IqW.hÇ7¯¹v=5«r-lÄ0»Á3ÈîûÎÇ2F³Oœ†ÜRÎuoå¼ê¥\š }oP§'sBH\z"užµ»Ýùü'7®WÛ –V\Ò1k¥×ehÜ÷M#ðYÕÌã,Ë¥ûtÚŸw²s±[½í{v|åGbñÕž©Þ‡)Ʀ±i¡µ;u«Íã•ašÙrWh:¢Z/ ⌞§NíY;_k +•TD;SeŽg8ú•·.Œ*o£rª¬ÑÞý?±Y{ýüªÄÎH«½& ½è¨Øˆ{%¨|¹ø™Éw©“KOèŽYüíÔ\wh&çrlïô­OFªö«µµOsxñ†ze²õqX+Ó÷Ó¬½„F§šL™A•}¦»9·+È!¸”…,•ñçˆ*ÌG£Ôoñƒ’õoø>Y›•·˜V»vAôb£’qÖæ#|úÓg¦Í†pè­û]­@Ëúå8.-O™m¿jµ¨+X7<ý¼¯ûÖîBßWs¿öÚŒžÕä &U.#!¾Ð!¿5½ã^¡t0zt‰ŠÆ¢Ìl”‚·~Z/ï
-%TñóþîøÎO¤lö?aé%­« ò=âZj2¼Q~$~ô~ÔËÉô“;wkpKîÚd¶’Â6O£l§Q|†}_®û5««*Õ¥ÔWl™ÖËÛQÎ,ã!µ,QÏS”›Ÿ}Á[!—B)MÝóUœ9£_'²¯s¿œµ”-—In÷þ–Iüâ$³œôÿ #;#ÁˆÍ—\ OÑFJ~ÔØ=¸dÙÀ˜­x#š'M"뾉P4ý9äªKQ.Vø\½\Jyú;.G½˜‹­Bñ3gó~ÖÉÝwS!W'Gý¬5)™¥6˜PŸ@1)¾6sÈ­¹;‘xò¸ý6úèRD&=-ý'¾yËÓP$€¥*À†œ°µ½ؽCX€Ù¯ÀºÐ[Å°Ž нîTÚÇ
-*qumDòåÊFyî«Paó =¶ÞëÚo
-ÁÌ
-]¾áœhB€§;i€mÔ\²/êtBöu6vS !Ì6rt¾­Ç‘2¾Í£õÞ¾®çÆõÜÌÔcf,2÷ùn_ ÁÛeÂvGoùâäC_ c¡üƒy£{©øà˜O¡ÐüS½Lt‹+@<n> ká6
-Èþ~ (bð
-¸ =@NrPè«°†A(ðµ"GOoöd)ýºÖÛlrÈzðRjaW{-ájé¼ g£×š°ê_6Ã…÷¨ŒæÆŸYôV^˜Íikc|ð”k¤?‘¯cÑ#™J•4ûz¹:ÉF×áX•´ ÄÇ«x8þ âîÿ Yüß5´" ö¨ÏjÐ|jke3^\©çÃûvÒ¸ù¥õÞ¿¤Æ§»›¡±Ô¾r+f6‹#W±{Ô¬¹¬žÅ¨ÏŠÖC< MËÆ3®MÌ äv^ÁxÿÀ¶“S¹{{¹öcäÔ¨2X4Ý#y¶¢¥FÏå‹ú„õ߀ë¦!
-—¾Y1ÑÙEÕ‹è-€‘EØ·c÷:ÓèÃigh·ƒ–¬â­µöq1S…•5j‹›¹`¬gýÛLG“ g’uá6O3|Û{!¶ù›ç^38÷ª¾fa¬$KœR–œÉ(\vm_ár¨+¼¼÷Å¢tù €8Ù" z‹)œœ
-zkyÏä8?ù«¹¹¬[ÛÍ2™ó¾–<7œ·DÖ‡ý9»ÔHzJsºÏÖM–´YcS*uu²áHEn(ãxOµ‡º™«§o•e,eû.=e4¿Ä†Â§‡Â’4†Âaw€WÁâñ§¿ðƒýi ± Ps…¾W+ô¯ÏT¶»¿ïæòŒ-¸ÅáÖ¾¶q¡8hÐy¯äûŒ˜ßŸnÁ\6ª±EúMÊD‰Z£PLµÙe¡©LhÂKÅ•õpgàÇÁq„‡ƒŒÛJ÷•œ]î+y8i”³˜úgeõß
-yÀ¯ƒ›8yIÏú™Ù†è9w6×%KI¹s¾šíQÂsÓ®<dTß`TvZ+q{k¥NDªé§zÓQÖz“C§ÉûÙóö§ù þ¥; O‚Ê÷:š”œ-QÏ­JÒŠ²Þå5£Zd~:éaõ±%¿{O»cùdÂMsR÷Ž’E÷Á®¥â>^#??¼²d§8Ä Ü÷jì+ãµ™Å~)µÖ§í´…ä_N¯à^cŸ¤Ò¬H7$3;mPxwSw—£sÝ ~Å%i­K‡«ÀfÓi•2+o¿"ç ‰a3ÒßàƒeI­Kâ9•xÑM¹.öûÓ]k8ÔÏÝA!
-;Wyž´§å!ÊÕ½J†mÅ
-“2q¦….q±)¦èIc€uÖ?Xý,-¼º’¡RõüãB×ógJ_{`Ckz¦Kð+ÜLÉo´]ã>Ÿ12#'RjbP8¢¡SÞú25 »è)I‹Ó¶'l‰ÖuAkÎ{™}ûNg^¯/–Õ7i¦c-¨Vo:.6¥ÙjœðP÷2î¨^TÞ+zì7.tey|×î±R»wZ£šîMV5ZغÕakG¿Í_Ø=ËVΦ3l·ÔŒäï‰îîu—¦“aÙ
-*ä%µVoË`Åܾ™óA}Ò¾jVçó¬r„—TËòS:Lé¢Ü¨AI,Iä«ÈÌÂ%›µëB&¹,Ê®hÖ(¾ª6ÈílÜ&ñØ ê³Pñ“B?Ïcäóö¢q˜ÖO…ìo
-F¯ë¡WqÓW¼sì•uý@!înŸ—Û®˜Þ„ÛqO 6¡ßñÓþx¿`Ó)”9BÛ€íT8œ2øfmK0N+ö8.Ïê÷µVÍûƹ~;Göµô¼H—úŒV`ˆèîçå-]ä¸Ü…´u:ŠÚí@õµ×>§ÈŸºŸR[Ÿ:Ö¶ãsUÜè·åÜiÛ£½ˆ¼Ûú#Ú×lÝqå˪÷ªž~À
-ª°??‰ƒÐÍâ{º©›È¥ÙýU§žÏ»­KŸ€rvèÕG³ùKïÕNíù¶åbH¿w8ˆá¶—ãóx§ææÖ¦öæŠûM='zŽ%ˆ;Y©)›K¯³k»ùl¬¶e¼Â/WgI%à¼8-çE>s<ÍK…Áá7À?·¾öRç:€ì5@5Ãå÷ØÐS4¹¼w_ƒ~òº_ƒ
-ÿ>/ÕêövËìÁÝæ«û‚³jmÊØÛÌæØÀ™n#{Õ\ÏÖNF]­Ñîp·"ØÞeÙ7¤Ç¶8EVz‘/ûŹfûV€>-«:®Lãž=΢Î{?›#áî7
-)wêîÕçi:êäŸÔÏ0®d̵ÌX/§ÕZ‚³ÔJÕ€Þä­Ö®‰¶îqeîÆöÞ4¶öXoüÐø ךÖËsm™f€®‡lþ³ ƒY2ÛA÷ÚËÈ>Fl»˜¨¿NÊn\ª |4ÅK¯´£ŸcôzÌ{Å»Öb×QÛÃK»œTB®ö ¶Xë­?r­´Íî»$6$„›Ö]a¹©ÉÊ«îJÆVÜ7ƒzVuú‚º¿âÔÛøn–K¡¶×?‹{k•˜üøýœ^Ã^8b«~ ŸŒþ}0Y·@¿®râò"Ö´Êôºý©þ`ïu™µ'«µÍÕ{ê‘mq+ÃuÙW‹—Zé¦À×3¾ØªÕOî¤[ÏçNcZQ]böOºÄº4]ÊÔú5ߧµI£mü†ìP*—Pg“š¦—ck›ö"~èR‚3Û«|’«×~ýr¼ ]gt}º›µãRç&ÆL[Ï=%®\ÆÌÛ\[Lz¹Ø´°ÙøÔ$à1øè ®¢}ú6ò«µPO:5½ÞUŸ»½S5%æQ5ûL­jVwBµá\µJÜôß°Y-WéUÙҧºRî£w€
-yôÔ¯o¦pGîí1òÌïbÔ©D:ƽÖz]jfƒákc¾…'½~3“N²2^ÔµñpCû÷ñ™®òëG­.nSUËõ³PÏ5*ܼ'VRÌeVæO5"N•Qe#‹2ÚÌ Êh‘ÿ†uÖ}$V¢’ýÌtüQ<9ý£QŠzí}×›¶~¬l9¦Ì¼ÙvgH2!•šÇg¯ÑP–Ív½¬¡K×Æ9¹6ûÐÓjÌ7ç•·X±+í°ã–7ô0(cÛõ§$~¦è©z1ûJ…ËöiTQ<ŠdôÉßîÇfþæ¤z¿an> 0~1ú0¾ÅÜò"ŸhàþÑØu˦ý2Þ‚éªêµEµ¨TÃËâD}|Kò´þùTkÍë«ãe¿]áO( ÄaP:L½Q‰zú³b.9-
-çoó¾“Àø%w? œÑçÑìë¼,e-åÓζŠ=5“ø—Uf9­y®vCÃŒ¨ëÁxæŸ<…’SPa³±ëºÌzÙçí¼y°‚i£¨ä¼ïy°låYk¡H\åˆäSA.W¬ŒûGªxšM³o!ò¾Í”óU”¡s†È´²Ö°ÜÎ$^MÈp%F¦øZ['·æhMâÉñLV™˜è·GߪÕk ?móüMù “ZÓ÷IG)*–·ÿhlB—¨™!vº¦ÎêRÈ8äJ‡±s,ÊuåTИ®—Ÿt~®N¤Ãl+ÂqÉp…ý‹²Ç›„BîÛ‰GBô‹ÂOëe—;i‚Ïa%27@'ÞVsûr¿b>bŒÚ
-Ñ%rÇÁ5VŽ×({šÁ¥XVàûÓüþtŠ
-S»>Âó~@XµP,„2Õl㛃½ÀpË~ë—sÜ`ÈÒ¨÷̓ϫ@E™hù
-2?otáütž.‰;ÍœÃÚl)RÖNÆZm6ÀZõz¹Âñãì7
-ˆÆ
-/JwžÕ¯ÓR'aT$ïîóVqxfÛXD’í¸Ìhuì»ó…vÏ9ÖØG³…W=ãc<îú–œÅÓý«—ž¸Ç
-9¾l¨âè6Nê?˜Ê÷ŽúïCµq¢Le‘—Ž
-s+"ò{ñlÊïeW”߇éàÿÐÿ €@U@²K._ûÜMó:™ Ó8‘§îÝ ŽÙ°žƒ+ ug-Ïøµø"•e¡;žÍkÈke¶.üÖ°ï« âô6¥^µÇØëÇ`ä7ˆv¯,³ê+oT•ø-3òÑ$9 ŒÉp³úl‡82Ž‡x^­A¼{?Ø/d¥!Þ(ÿ
-@Ð
-o¹ûgÙ.]«G„8§Ù ~tç%l{j“œªÝ1Ü*‡‡ƒy8f§æ<°¬Y*ÉÛº˜ß~°É™®ÇÚáéª ó©¾î½’쪸üYç‹2b!>%ºéRõOEÃîç¦ø½Ÿ[ãe“ïß¡ø…ЗÉXü ІÐê·Þr`}¹SA/LÁ@\ -!u!;z9ÜΧ[\Sk²µ?tÁjv>Ú¬“•gºx,'ç·¸—‹ï£öpÖž:¯tî
-·C"™‡ÞP0¹A¦z¬ý`}Y¹v$Mz(¢®.ʼnròʼnz(ˆ­ÉAŒÑ÷Ðû p "*±*sõ[©÷AÎé
-—:æˆ(µ»÷&ïÍRa›@±ì¶ÔT·>¯c~öÑNC}Ÿä'“Ëue˯ÂZ3á¦2 鬤ó”?Üý×àhÚŸ¾R‘Ò¨ ”Å)¥0 ö{‘xõæTßëÍ3B"azÑ WþoÓû¢û  U«ERËy³ŒrÅ×ç½÷³ö{ÛÊ”b{“•lˆEu9®˜Ë;ÂÂ`"MåjJOÈÑLƒ^ýJùôÍ7ŸlÓîP*½®ƒìƺK7NHÄ°ÑÆ…'U+ôb´Öì¾É®Ômwfz7æ]ÞÙ£D7šÝ4Žw»í^ñW@âªå6adq^ipÌ‚C²£}.vì(x®3[ñ¹˜öè´Å¨Â õé¹×ꎃúUÑ¢\{ª¦R·¹,T${Híð}ß«ÎÒØבîV£^üÁÒÝw”ÎvÓašþÁxÌ#»©ÔwÈ :tÈ0Â;äI¦;•tÿü_
-oÖüs³®»¥~0}pÔj“rŸhkÑ{ÚWS¦É"¶ž Î<»ê—¦þF|à“£`9­ko¹(½º|.úðñ¤:ÔæRiËÆs^»¡qÅÍn÷;„+Î[UNN<§^ìOó ^Î^"eø>K‡xû:´"_ŸËk€Ý¬+g=¦÷Ò‡š€O*E¢ Å×UCM{LW&›<P>êD
-˸)6ÔíαwJØõRqýÂï 4ì Jh+ÙÁð[‰fÞóè•f†fFSŒñæ«ŒÚmˆÏ®Ýù AŸìa'ç„ÿÓ•?؆s2ÑêìuùYX{3\ø¸S ?øãûì´Äv(eÛaÊÃ÷fû>« =§U!©}ô^§oÌ»8Æ9<ù)AÔ7î¶1š1ƘÕ[¡›$ûƒµ¿-7ß“`Ý\×ïæ:Ç—›kdË5W¯ÿ®ßOÿÓ•Ö¤ÙD¸z,ôÔófväæyꙓýÈŠ3®êäÑP!Ö®Éùå3ןbûº8G{!ÕÁûÝmâøþ̘uònÕ.åK;®ZÎ{Ìë­ä§šŸ –oòx­ÙØöGƒ†E— ü™$ |k”ꇖÇÖ¥{§~ <8úšqNSE°¯l´Øá£èµ…À|¤‹.×ÇQÔMm²Å¬‡¸éõCN‰$ãÂ:Ï–z]7×äÝâ«ÛQÎö ]–ú#®&óæÆ6ĺÍ0êÛj ù Ù”Þ Qe2õãA©×³™³DŸŸÂ‚V¬Ê‹V¿@çß uªS»‘ö_€«å)Ù,ùh¥XíЊoëë7?F|NãYªºS±œ²T°ËRdwãÐ Ý[·n€?µïTGýr»rÞ2½·zL"Ërë3¦-dXŸ7{·mH0’«ŸBD{Í9A—Zm’®ÂÕ²VÙlÍê]PÃZe.«º;lTéŽÚþ ,g}\Ïóçìv›áóÜyRð{µ«¯œÁÍy.D6ê-xù`[í@ÙnÚÕ„
- UÎ8>Å2G1mŠ¯´ºyžiîFB¯qÔy¥~¶8½žŠ.§ûÇÚTµÕ‡ÿ@ªZ©\™›_aZˆ^~—k…)o2eà>éòŠO·ÿÅöïµ½ÏÏ…žyû³m¾y™Eã¨:áq3¸ßK‘CY“—}CçRiÖÚ\ó«^æŽMim?'ä6r£L¡®†Õ:=~•¸Ú]à¤}´¬je5«’¨Ö¦Â&þµl·qPF6|¶´U}¶„¥„ƒ÷®xX‡hñÀ—KE)j7!Dö/,Ë«l`vŒÎeZêYG­->¶Ãbí{¬ÈÕ‡s^Á­)—ZsrÈíëÚ‹÷è@°¢Úc°JW#Ó¡ª ~-UVýG£ìÌí2±$ö3Zñx.ÍŠÙï”…å
-ìçù\¾¬xÜ– ›½qnš¼¹Úñ†æjz¹”« Ëå¿`~(Õ›zσ«­ö©ÝP6ìæ}cÊ2îYm¸O¬OOqQ¯™BÝ­.õ[emr/8.›eë]Æ3¼D5Äl1Ƕ‹õ4 ó~~Àä+óY/§¿Wì•ÛM3‰öXeØwõL}\P|>•ýV­²ßâT…Øáš8&†|þÅö§ÑåÁý¤Ý /Gæ p­`Þë«ÖÈ)ï~õumv+FÙ( …ã¾DݧÇb.y…â{ä'Á3gí8k jïLr¡Ñ W¤IŠ¯æ Cng•2‰ÇÍÑg%?Ù¦‚Ëü{y{æqM0­_Ë`¥Ì”ÆJYT„( ÿÂh®”ör´mqiè ^Qï&óÁ¸î5â>œc-&Ç—D3és/s”÷WC=wßtÌìëP¾Î™ZQŸkbSHèmHüeïˆ~kyÄO+ëŒËí­y›Ã+á§7:é?pÄP¢|Úš õÔrVꦸ†5ùÁR\“Ú@Œoñ;ŵÔ_
-uöÔX(,Ø1
-îêìÔÜ4¶bŽ]Éévöjp ÑÝx?`væ>óIm°Â×ýíõúÈl¦Úpfó|ÏŽÞ„dÏW@´™v ¬ßécï/
-#N„\­èñß'—óþS©ó˹÷¥ûK¶ÿ¿¯Ó¢A•ÓÒh^xT|ÐØ‹·ãyý
-¯ÍiÕ}r‘ïH½Ô ù²]?-ã6( ‹ÁtEiž†pjqsg;T™+â¾cÈŠùñ$U½n²[H»óÔ⼇àÒNž_âNõMŸ›$%†+Û†ÅnGüƒÝòµjÓa·ªøö²áhRz¶{½rvTvn;ÏÀÏ›Š~ËÖÈ«h7=,M·|ò@<~Ø(
-Í4­,›œ/ù+ÓDe¦9h¶¿´þ‹ìš–®Î³ý>^ûŸë6H[§õÉr"W·~N\ïœ-µ¸ZJ äXªè#ß﨡fgåt´$•Ö…f%½LÅÁ÷OÓ¾
-¹–Ë“Ò†ƒnÀ…­Ò„inßÅɬPm¯“ 9ÖÊOuœ¥ÑÞ³àX«<Z_šøù÷£l@"üJÄäÜç>qµË†ÒãjîMvþ{~^»L—XÛÍ|6îïb¢¿“¨¤®ª1;Œï°ÒE\Òý"=Mß'øÒXâW£–Ʊ¯§Í
-×Óêd¤Óæ˜X«ÇX Öú‘ÆMz
-ñ|·î”Ùø\’ ”iL?z-“zàÜ6P¬¸(ðŒÂœä \Ðõ1òžzÔÛ@B*7ï]HPì%Ä$d*£-`õGU:Çe<×£ê8øŒ8³[ËÔÿ‹𚛀é}{Q¸×oÇ
-4ÍYV§ÌèÐêMñs¯­aq³êï•òvðË1ú†à<:”š+¼HÄ?û&âÛÒñgÏâs¥Ú±Ç -›‘×mkò½öèhŸ*êÆÈN@+‹KQåž:¥o:¨Á5ŸÄŠ¹nÅh2(¡ í‰C· ­ü.QۚبLiì:êqÃÝž ¼l¢¤œí}”°¡=诟n£ÏXU¢a{½uƒ¼=@x»ìÖàí¢^ýÃf3ï^–I}~rY#w0u¦¹ÖÁ9ëÍÍ4ÄÏâ0ãNå ŸÉÏùL§ËÀ¦}ö¸£&ã•ä:—QnÊx¤ÎØ͘f)ˆ3ÉV¤ d<
-vÁ\´G²ù†.T¦„Ì ‰£&Ÿ CVOÑŒh|*ÞH!É#—ñ;†Ö¨Ük ìsç“6º\Œdm##Fl¿úBXÄ8§§ó]7^í]ª–;÷9è,¦}¥s_b—’h¹r9VÛ/Ö®üa‰=Í‹}b·û,»zP¨ò Ü—ÉÔ6øReHƒççd¤¼GãaÜàs¯ÎÞR_
-Íè„–º·Â.r¹þ.)Cý:ÞhÁ-ªŠôfë6ѽu&Ón_›ëã¹_ÿ€í+ÄmÜ›€m€Œà–ßÐÄ–_T-r¿[…ʧÔ*
-¯ÑAÏ–GQaÏ |vKô|‚vÑ‘ÔoÑŸ´×Ü–P¥YåP­ÑXN]N˜U-f•}­w³¢ê]ß>«(øÈU,æS†Þ·Z"( -/×"].vYž\
-á²Äøûk Gåâ®yB‹|*HEþn3–÷?Ì›—þRô‰‰ÍµÏª>Î;ÇÙ(ê?…l"Œ)ø¬Õ°¶Àá&Û_µëò¹4ø^Ó»¨ÍªÒ«ƒ
-dUðúÇ…ÈöuYÔkX.>®û;x\Jлø(
-ôA·Jc¡Y¸l¼A¡[}0ùë‘6òšïs¸—ä Õªä ­ŠæýI¶û×ü"áoÓåÎÓ­1&ÒÇœhí[Ò€rrcXÑàQÛCñ~Cç­ê-h7+‰VAž”Rå`~cÊÅû‰+A‰ÃÜÁ£¯+ D9Ùz¿pY›Fþº“í|¿>_æmy“Ͷò)ã–
-”›£ä‹BòÙžä£UWÉGàÎû4ùL«¥ŒI3ÃìgœðäC¥tò¡[Ù'èñ,Ã63AòcÙǤ˜|d&›Å’¼Ê£¯¢Ážl‰ žLŠOÈiþ')0Ÿ4—W2`/—æjA!{û¨¦Àî§ÀJ¡S@>H)€•­€¨0ù|üø»-@á“|nC(CogœÉç^ 3ºL+eØZÆÕI>Î&C“|z)¼J¹OãY)ûz¯†ßwˆ¼Kú'cú ï­Æ‘øÇøû: J|§9>
-)Xë)ÈÍ¿W/Gão=94¹{¿øës³Pb<!Œ¨ £Áyw§}þéãy˜-‚ÏþzñÁ}¿»ªîŒ©ßÚ&çUk+ÑhóÉÖ–²H›ü™tÂ1öˆ×°RXÕ¡n¶® ZõJwy9ÝåLºu–ÝÖ¾ý‡4ÿªfê“O
-vãÒ÷ÊËf
-¦+ôµ=8£»*Ç£ø½A‰Ë»0§C[q©¢îdoí†M–]lGuç°¡Êó8\ò+,"°Þ ¬òº2_ÔWÂÝí§¦; ¤ËYF½êlÙ]L¿¿^ÞàІ\§9l»À¬Ütüλá׸þ‡ïÝÔ0ëÌ›üù_ ¯%·Ò¢!ÎîÞ½æ§u©—-‡nèÎÚsä6Vøp-½æëíè`­MËÎe´)弜[âÝ¿}”·ô%Ð3M­öºi¬u\G=â.ðøp5$ {å¾"ksB Vµ-6Ì©ŠÖÍܬþÙîž¼S_Y„£jZ4œÖ«žµ®¶[,wk ÷ú=ª¸õür+ Õ-º®mD*P’·TwŸ™ƒ…g©ïº’º¹vtèÜìj¯Q)±Ë39oq7³fNלžSÒ8wû²Ñö“ÝB-Ò©~ϲÌPGnZåÚK ?¤ 0Ϻ2¼ç³^œT—óºxFË4‡èë —
-ñ–üøï°â2åUËi¶—}&@¼ä)Q®Ç÷y‡NR9[ï‡ÝçÂÚ5N®Ucök³I:{C1xÇN²€kË‚¾uí½ÍR'œú~Ü•
-×ùrsš¿•ç´š–çE8*ý!;*õïÓ²Š­ráyôù˦³;žZïþþ€4÷Ûð¢öauظóð’óMK«zÀiÐuÆ÷h`WX“²ê”,—k[2ºõ†¾€Ó—­½×JKÄ×AýÌîW•Ø¿²ß2ŠùìײΌًä sªÂ'›³Rsz€|ä&%YªÁÿ"Y=ɺ²‘¿=ô|:­Æ»ýÐ6×Ûe£„[øñ½ü€¾…Ð/wÙ¯ƒö6ç׬F—êѺŠ-tø@éfkÉkNN”5
-¸A¾~  ӹ﫿¤`²Iî×kùñž§‚±ß¹8ço öË]]ZŒµ| EÇ#N»µÚÙj.È— ï¼n¹VE#ZtG—:Ûvv¸r¨´|z9)z ñÕ"RmùÓa±²vpÿyŸæøÂZor+¶DqÙIáq“žuå&pà&Dí?I‹ÍÛ;ösðù·Û-Mõ¼õ^Ú|Ïë>ö±Nè²¾uÜÇo=9¬ÜõÄ\}´¼„ça®Ø˜Õ:vGiXTŠÝÖH¼…ÉôÅž„éÐ?©ÂÈZY<åmBnõŒ"vG)[ígË£ýÓÁ™©%˜Ì4„/î;c™Éß&ýCZƒ@´B‹§ýKܯ6̺ê­fÞôSð¢¹Á Wíú¸`›Ý°Y ´}¤‘üä5¨0«H¾lSRß-XDÅúN1Ö'‚ÒYžÆ8‰cúÔ‚ÝÊ\ÀøÉ‘iÍd¢”ÎÐ8æÛè8*ú8Ö§q¬ÓIŸNÚ7õ/I8nä/v9îÜ™ü€am{wƒ>‡™žs§2¿IfÄ®‹§µZéÀj~RKFû>«O·y¶ŠRتM“CÔ<VïóBa\ØéÑì®^˜cT™&Qõ&q{?VavŒÑÜ¢D£h SIi5£’òlO£ ôÌè¤ôbýå1S†¯sƒ´[Z§–«Ëqéø©î¤/Ì-™žó‚LT}$Pž:Q{ûo=yöºÊÑÚJ¥þ³ŸŸ:½gE C³É—(ªÇU:U”­×ÞÓ*Å줛;ÌÆÛ´Ñ7”¼¯ägÖÌ“^×êÄ}$Ä£»!=øxÏH^äG+&?à¿æ—«ªñQ-ã» d5ü@‹DÛó­Äpª|nÜ»«¶oY]A{v ï¡S‹“„xÄcêDŸ
-×Ç]Î_š#ÞÉfäÉîhX
-\š-00Ǩë`-ÎwKW:¸H(æ® ]ð~L9¾+ØÆ©0mlïƒm~õ¬!õn*4•«0 ‚´F”>´?âúê ß›‡ôÌV«Í:vò4^¿¼~'c¼~ø´jüåÂ)Ÿó6¨˜ëÕìû~E§úô ãQ<)Z‘°Æ3)³²Ö­)b²n:S²m²&ä.g®jæBQÀD½–KcT:Ô²³ÇíP­ $3$Á 7â;èû„‹)mæ0ŒùÅs¨Ö‹Õaï´$‡½³ï{aë2œ'ÂóËã?àïë“RNèE­–Ïhé»ëYǵ”X28à(óz‰Ë}fG‰¸é ª.x6
-—ì 5LW'¯ãg§žÒöñžÏ†Ÿm…ÓJ“`qþGc¸„Á 6ëw”¡ÖîXƒOoèÑz vë¡XlPl§;¨ ´.¨u?Pkßÿ°Ç$`»ny•?:(¾S›æ]Ã×õP+aˆ¤tñÔ7ûCž“Jc®1ê*LÜĉ¾ÏRðw§t¦üct'W›Í‡Ø–åÑ”ej¸L¡,ZÃá̓éÁÓìˆhªÂ
-Ä!S÷ŽÔ|ñì¯`wØ_õ}»¿+Ç~ð?úÁ¿ÿa[¼ù›
-Ò_–¯ ºP¨®Í¾»ó´•ŸJ,W³Žévøk>ÔW†(Q¿£-ìvƒ ÉΓ¡¹^ȃw'¶¹þ}RV>å;R&«ï~uáé¶Yïkh¿·0²ÛãøiG?,­ö«•Û·Íhš¶‡j9[‰g¹$ ´Þu{ÓrÌðÒräÝõËí¾ß·VWÉ/ußس³&ëâ‡ve™qªï ’“îvgó-´X4ú»Òéó†½$Ë“añ[p3PÃÞ¬dºWn}ï‡çc4¯¥A­¶=­ÏRa[dñ 5®6‹ùÑ¥j½Ê•i#œW &NN ˆD_â_²l¼5%Ö Ç0¼ùA9™’]}ÍùÝ šNL®>&·ý!ŽÃMFƒò¬KlZï˜Ð¼Ñvúz¯=*<É6°îN[¾2[´¨Nè·@ ¿o®|øÚ,7˜wcsþÞã®QÅ®ú€‰zƒR¤Ú¹ úµölWãQªÆ0®Î¶SÉ®ÚBñŒ!|\ª[±îÈFùKóc§ÊW“ÂáÅrð¢|ìÀ-öYí !ªÜ\—ÁJ½Ù<Ôk—V£_S¢ Yë8¾P½r©VÕj-·
-?„måaqÅÞ•A›¬@IìÁíÕ&Põ²w.ïˤµÊ|ØûK«ê@+^XÓË4¦Jz
-¼š¦¢ÎýN)†‰&8|¿ãèX~ôzѼ’uànTnlç°Ö™Ñ…ÊÓiÀ•áw[Ó;—åÉЕù²šJ¶Ž^ZÝn^i²¬o‹ÛbÿRä.ZZ¬ÚO<Œð>(V,Øx0vá¼Ê]
-ÊD NoPèt³+ÞkÛ?(WÒ·²|l|9kÌ~HÔ:©p¸¦ö(´dAH¯×«4Û9oZ­sÛb¾ur¾.æË´Xî—Â"2*A³!]€ ©Ñ”òlžM£0ÃV^þº‹6ù~ýût†Ü Sxx¿QÈp:
-L½»‡’{ÔJéç›—Zµ»ä¬Û·(·íßfË»uÇàøªmÓkŸ“Íx ÞŽ0ž—]-žÇaµš%n÷ʉÝ*§Š°„þÅgªX¡K|ï›{o“4} ÌÒIs×-–æ´7óZ—ÏÒ“3\õÑè©ö½ÝT‚ÛœU÷×ÛÞ¯HcùŒM%â!´£tw­D£ú£ç"|¡:5ìRø0ÌyBºóðÄ1`x8Àë~®æ>;=È·Ï$,lMÛ.l‡ø,ÿ‡,<: ôÍœÓüЊӼ¾¿åeè{‡ŒN`oüÉÇ
-yWhr½ŸÙ¼[B0‹Ü‰gf¶[^À Øž™Òî|ÚŽÂÛ©ºÜ%G±¸ÏÎø¦xhûûÚ^£ÎîΤÃÝ¢KrÛ—¾³6.[<†Ëi'Y¯•Va]Î~ùj«F¹o€ðÛä~Ióe%Jó“ï “ŸïGZ@ˆoy9ëêõj?NåNûÖïjÝï Ð˸] ÏÐ2bG|%:§îa³w‹çd¹M†Üv‹©“Ó¸ùÀóÛ†0ô4\Fj>¤çëÊz}?wÖÐ ‡­v%Y
-Ž5`½T¢Rì_{ý/
-oï<ßÞâuJÿEheažÖ—,¸Þ+-ܬü÷j[à\~œ‚x5Ùn!*¸N¶Ìç¸æ¡»{uwÆÛlqC¡6äœçñH+ë0$ëJ…ñVE¯ƒãšÞ-ˆ‰–Oy-»#çk“ â÷ËØ34›ÅÜäÛÎçÓ;9…Âèe'íÄ.•Ë¯Xáæýü%‹ñ§ògÁMÓÄ·ùwfr× Ý/·âÆ÷+8·Yæ¡JXî[Ù~ÙŸ½lî$b™,ãßT\ôûRõÌn¹)7ð]§Ên]€fÏJ{U1söx«[›fkh±—ãÌœæÐ!ù«Ñ
-Åç"béÇb^Aï‹y—ÈòäÍ?ÒB=ŽÒ¾qýWû«úç®ä&O•ÍA%ïþÖ ÖÇ•ÇJœ€e¼+eYõ jyVo¸nÑ9K`:v@d:µ'
-7³6שùZÕ:ç™S9ËÙOÛùÅhל×":¾J‹^»ÝÑuÕœhÏgßÕ†û¬¾Ë»›êl½«:âµX©öõ—¬+ãs
-v‡×{`û œœã…þ~¼ËÅÖ«¡æzG%A0ë_ÎþC ž¶árNPlCöú¶¬íéÞ7î3%m´#•[¨½…¢ßÅÅBGÂ…§Yw£¾©õE­ïo5Ç¢µ9µw±p¶F'‹Ù$¹í”-WŠ¿D
-_I/H ^6ä³é=Z~ºþñ²;{%η…ZQ +otIÜò*¾uÉyéb‡çèe ä÷©f3f £sD› Ø`Õ“¡f”ú®œJeNO.‹ÙÚ½ú3(ÿÙ+ü¤y—[”EþÑ—Î'k&)V{%u0ùòå,^¡é?Nÿøÿ5Ù¹žšx<ï¤ÈÝ´µºYMe½giauѤ7Í-\ö¾Í5œ½y"'±Ñu©þl^óZ6ƒAêç¥5Õü•íÍ‹§ÁpÆ–û”²#¾O0”ƒº"7¾%)w|%^Qé"Âvø™>FÝÖ]>!‘TOHäÜQ°‡¹Ó—ã²}ŽÄñ±×§ÖÈt¶þDœ¯÷—pÌ­óú¦á°.%r²ÍùœmÊ^{½¸½s'}Ø\Þ4ÀgÒù
-ëf›~©¢ìKQC©N°ÜBý¡4›9”¨éŽ0}œ}u:€6®` Ï=ÿ9·ž<Ù™Wøü gk±`™·3”=Üã—ÃþÏ>0vµ²ec3áÑÙJ¾ÍÿÅoh/Ç i›û¼ySi¿õÅ]Š}}xpwê .ó‰U{dÇXµvy˧Y¢Å’ºª%ö÷=x:870ÁÚŒ
-.4@>ñ@|Gë/«´¬¬9ïûd¸ͳh•ê‘)ÛÓÞF0þ™RËÀ¸£ÈjÔ‘ôÍj #,ï€mù&{(L}Fv‘ÍdnT³1y¬ÏÞ7zØX'”ÃÒ'µ
-±
-­Ñf£Jv^ãõ¹=ǤÃÅÇZ £Ö¥<ŒÚ13Œ ÎÄZÌmµ°Sð‡ãœ»!Ï/²õËr€\T·td3„èOu·¼ gÓW·#-Z\}J{=¼QY¹žŠ¬(p:Ó)#Îø€+ÚÂÏ{ÊE–¹ÄbÝç?DYÊ£*O6ñÆG°67¦¿5ØåLÜ‹Go€ŒŠ'ô•³Aô•wéÒ§ŒR÷ƒÿb÷ÆGîê2f Pvš}(wgÆç­˜gHYUŸíi¹—yH»w~@ö8yc̬_f'ðTèdq7¨ûT^ßn‰°£ HS̼ñ&?(`q·6T78<X,q}%’„bøÎAÜ%tDÔÈ!ÄÀ"¢ÝÓ¢¬/@dôž/ÿ°-‚Uwù¬v w¢yºÕÉfºûjðóšS#D{°js‚ –˜Ù–©Ÿ¢G§œJÒ€èN©Âl©dáŒöq…ŸúÌ>;ÆZ2a]{ûR770¢Aµý.â…})T¤iL&†ù̲‹Ìr fáöfksfóóåÖRmiû£&dÚS[d£%jo5TcN¾Ç‘°ªêÉm‹–h'<)Ù5È2óÜ eFÓ¡àò‡0°ùv‡÷!¶¼8›åÎ 9Í7²ÌõKýUÒmöËøxWýÖ`­PïžhÓ•}+éÊKkЕ%dÖ•ÇŽ×m¥ú²ÛŠdÿ— ïð¶;ù$–y…ºžQÒLŠDFt4mÄŠrolÁD…à•>€_
-]èûD¶6ÙÁ`× ü…Ø¥Ë ýp‰‰Çü ZÅ]?ìå/}hQ|Àü¥’ë»ýZ÷‚àp·“ põzœ·HsÕ^¼–ö"YtÛ‹ˆ“ÛÙ¶Ùm´·òÀÍ/ÿ¾ì°›r`-l;ÕÔŠ×d„†¡¼íâ LõzÂ5|&´ò|!hCÈx¿é"¥E…è³É€ïWBM…§Ûî¦AõXë¼ÛwçKܹiIÚé¿*¥¶‰ Ú­ÔÓˆþ<J-`MøMŸ‰oMªb5šä}:mÄÙ,Ð7¿$+÷g4=Ã0†VZÏçJ³„pJ÷wcVI"Œ&‰swtB’Ú ÝÜò}Î^½¶»º½ã¹Ü¹›ínySxûµuضÅGJ«—ÌÖû‰-bÈZ¹·}kÒÄîÓX¯€jƒ™ŒÑú6ÞeY_×P»vx.O5ÑbÊ5qF15ßèµÆ-rÿ`^ãÀÑ ~¤ÏÚrN æÿWö¶¨1ñ¡ù*H9”sÝø½zµ¼Þ÷;ñFhÝÓF¥Rë»ݬ º…ÖëÈ™ªŠÕiM
-GZ­53½jÔvÕy®u«v—óBEoÞÚ•~DRÐs~Õ ažÞ•Ó”/§V•.§Š©•SlcgDÙÞÿ×üclúÖ¼¡MTñÓTÄÿSøvDJgdøò.MB£RW+ßÞ-Ïé=ey­Î'Ø г<J¡w9·—˹h×)-çŸa‰&Ðɘ5 ¹T¬½ìâú9ÜÃÂþQdÖíR‘9Gp‡%pÇÕÖ P]'`í¨ö ÇÉhÖÌ• Öäýòµª¬RÒ»ÏxA~ð“aµ@“ÕU#[¿ “J­‹@A½Úíc|«0§’zZfSãŽÊº;ÃJp-²©î«
-w¯Ö¤pCdAn|¡-Ôü|tps· ·Ëécê‘CJg0ydðÃü^†a è6‹pF,ÃAcñ‹¼ˆ«j¶_;âÄt É÷'†^´¿;âΓ›+gþ©ÉŸóz½‰[‰¾ì.àΟ@°Ñk¦…;Öòªh×s÷‹ÖÌ¡]­ `1œaã `Mt`èÚ°Aã˜á
-€ïòG¥Å0|\ÁúÔˆòóµ}Ë-èس>à]Ê
-“·v ’w=Ê^ÝøLÒó<—¤ë[=Ig-$IÙÙ8ã*')[Ê*c{HR>wÍè%IJ@†’}–XW3^í$%Ûh†L'Na/%
-Œ¿ÕæúI>‘Pþn‹³ë&¾H$„±¯b7ŸÌÒü,oß7(¸‹:¼»_ðé¦XÄõˆçUõøOü(H`¼XÙÕ\º‘µËã—OÏË÷Ò;…µûñÈGçlï¤Ü">4—b´¿Ðt´ŸÑË/)° ³@^èR[¦¹ÜçæòØ=Ã˧@p­%d”ôžlh u„%²5˜\¯§þ4~Äýy<€qó[µ6H/ÂRxñæÂþBö´Ë9Xh·ó ÒS~ëV•´~Äzÿ ÍÆ“}—
-íÚ­6iÿqÞàfpÚ
-Š:—nwªœñX¿öÔƒÜGÌ}d½}÷=\ïtb¸Û!yî²5Çr6‹mÒþÙ8\\Ý
-óåxÍAgÕ˜1¹ ¬lÑ ¦T툑§·§,ÑŠýJmߊ1>Eµ*u¦w ⦋ÁÂÌXÚS$]X_Ì_Ò‚°ÝÇ9~c®*mq6YW¶¼.ß°—è"ìŒëM̈k\6Ål[õ±´Ä —êÇôvj^çÅ1~A\?Qøe//’6$o`Cê ¾¨*mbz¿Ž„)ÚŸj‚%;KÃêWÞõˆ'(aÌbQãóÍšùåûd–¬YüòÜ«pxY¦±KÌÎ4¬àƒqÐu§˜—ân×-@ù–%8Aߘ]<J"† Ù×™¦Úk^ªµe¦[ùèŸNróµ¿I«“ü€¢V·òS£­BB«- (>ϽŽ>66lM,ƒRo#ò´YÆÎø²ø¢ÿr»’w®†ú–]ùÕ‰*Ñ? ÿ<Ž0—j0»bÌ*F$’ýé0mõ™ùJ®Ë3.÷Ô•º½q¤‘—â­Cmž0:O“öM°ÝFÊ{Tàó)TåÆ#fÃF0;›_g³Øä¸w‰¶€I«4NZíº”Áê_´‰$Ïô_®8p3ð­nƇ‹Ì'å9Què”1´cÊ\·´@:iCMnÈ|õ¸Q³joõ­ÀŸ.úLšO'†ˆ@mw:,€+Oã-OÞ×'nÕ\Þ¹Òlýa+S¯Äç]{r‚®Y4Ó";ž1¾u¬Ön­ÝhÆ~JkŠöEý2ÿÿ5ÿˆ]¦åî;wV.6¿Ôãí.{¹¡ujï36@Í-øµùžwgÕ>’•"5‘z>"N_XYœÇÙàýhéq«ƒºf7!½c«>Ë`™ˆ½&2FÆ‘'ÔÇݧ†Òú0SO÷3§†, ÓUü ÓuÜ'ÓPæ3"õKöÓbªþÑ|êì쯬N7–ó-xE; ³1Y‘m}øq
-*SЬšV²"6Pñ~©©%ß¹ììZË<¸Q4®¼¤-¶bK¦á7·ùÆóøs£ïý@#r½B™1“ïš@‘#)P?úx? A©ê• 4µKPzÍ0ç„[ýåI{KÆ°ÄÎyÄ@¦lþ|Æ x´Ôåj”›ÕÐs^îL]H|`‡Þ[-q!Ï»Ì÷‰l%qÊîrôœíÚb¢hw¿ò!}¯­]®Ö:¦¤ËÝÊd.
-˜h &ÖÄ?G¬9JjX“XR˜è!
-&j½È¿úÌ[_ŠWÉ·v%Îa{ÜØì’ L#Ù~ãTZÍýG4ÖàC kŽ/qI•Ýò=æ4‚F“Ù+™ŒµÏC¤çQ¥ìwh‘ÞÃðÉBKÛ¥žt±¢ôÀ–°ãÞ¬c-pƒgl\ý>Шãþô‹vy Ur  ^ÒàjV•ÁUå_vøÓRWí›-zÄãÉÙuz8^˜mb8gŸ·š¤WÌ@å­+ÇõÄ”9]¤â$ºÙ­ñÜ éô}æ#åœô·šB‚ùÙ‚(—wTÍá+|J“LÆ×a¤ãŸa÷%WýëFÍþiŒÎ-q:ÆqºBqªŽ¤£C6î2’öÎâ/Y»Šyuùhh’[jE¼Ù½‰žËCå¯jSg=zsU‹'1›ŒH -¦_£\í“KS ˆµ+°£­OGÕt¬áÍnc
-:†j·¾Üõn¶÷ȹŸ Ã먄¸u¹‹ää=ݧv…le-ÌVðº~ú b}]
-}°¹•þ°[Å™wÙÞÏ£©èàD-ÏBDºK\U
-‚VJ³~aÇþûLIÇjLÔö¯3n2¥–x4„ Ûê{
-½r”l–ºY¦×´˜¶2i¾sÓU“—¶ûÆ2|Þ…*#ÁÞÑb(õð<œÔ»NãTïêhóT/?N½|<õëåu¤ÿevºÈ£Ñ×·-{—?iæT=t´¨z£•±²otBp(r×ÉáCwÔó?â÷]ëéÓÛf›£“†Ÿ ±3É7 úµöBÖ§2Ž(3GJœ£Ö·ßȪ÷vд¶GZA­²N5dpþV­ŽT[£µPq`Ì®àaWpïZ«àšÚ.ßóã^ùö˜é™ÐéÛq¶eÜ̲‹Û]êê¥+¨ÎN!ÅÀ4üuK X™¢oÙW”š¯ö ©”njûó0¬¢c}_qRó\!æá»üè¸<©bH™¾›T)Òœ~h%¾HŠßí8ø—ÙL\쨘B$¬ý>,«|
-ˆz®æO•ý#ßsÕÜ…¾ 9ûÝwrxÔ܃qí­_À¸îrWõ/ÃSßèýSøj›iŸrÆ,”n•0Fh¥2{GÂÙàT=ã¨Ì¤ØºÕ·>ÔûØ~¡ALÃ<*{‡œ³ý<¡JØ»˜ä^
-á9›‘ÉÆ.I»Ë¼’\ņNbÿØ:–xLÙ÷OÌpg}»óØ)‹?b‹ènU¼·Àü—ô›§é÷õÎÂ<ÝÜìÇúü·þSO—§ôÛMžÏÍW~ß÷—Rþ60>å+Q9!Úãg®1ÉB?u’ÜñÞ=ýT¹ç5<ª$4>DÓ,yØ{ßÈçÂÝ@.âË™}Ä>†£qÐÊÖb[ÎVôPXMÇ›
-Ö_þã;žÝ®-¶Ÿ,µ‡ÌîO·ìþ¥É®9q­Ý^Æ*áîcß-\üå¤tóü)-½e1ºzùv”Î¥Õ!?‡¥Gi¦Î¯õi èT[•ÙÉnH“F—ÖÇIe0£ýÍjtm —1Ü×\zÕj;s¸ßw¸Ä2íïP1þÅϧ ÛùäY›7GçNwÖ=˜—™m—Á½Â{£4)‚öI•ïmyË1™g½œuÇåpªÒÝäpË_&Ízú­ïwŒ•‹ÐÈÕ+U÷ql¢ —i1¬“FÝŸGÅ\Ó^šñÔî°Än,âÜ°XטA׊zƒJkßÿA·âËJûË;ß|xWF Ìãn€*1›% ¡2…šë¾D—WgýZͮ䩰D=ßžpó<ïNw¾;˜Xª9ÛÙX&pŸ ~ç2&q¼&yw€M¾íΞ* ×vu('6Øb?¨Œv]KOcy&0-<Œ³1Çþ@†Ý,ËvF5{ÓÿæÕÍ-çgŸ)™»;³·P<¥Öܦ±Âã+¼dìAíBuVˆÉ
-6O*; ÄÒì–é•ÛkqJ´(íbhNøm¸ð[­†´‹Ñ†Ï8 ?´ÿòûÁÌïçþó¡ðÙü¢¼ÆäÄ©ò7g߃¾;Û™¸SÞöÙð›h+$yô”ï»ÐÕ BM5ÊL䟴ìo‚4Îmñ%íú";_;mߟ
-þË_ ·Û·•åûÉo_UøÄW9åvß­Äõ}Òå1=rÔ¸þDc3Æmn÷Xý;úHô?ñXzï7×8ƒÓJÙVñí˼(RÜçàe I”»ï•Ëîõ¤î“¯rúlËò5¿mJ÷·OŠiÎãENòåŽÀÛš°òmK€^ö¸­rSŸ×H;âöÓõC.—<; « ¶õ´;Ìe–]:·Œ›”™‹M3jÖblk«ñ‰–ÞWlë)-V=„Ÿ5tt¿è­4¬ÑöÓ 4Ö¤ïwµ¸¾UÓÊQ¾jØKzLDH¢³\äs}¬Ó{ŒðŠÐÅvvW¶ËÑàµoÛáÅc¶½aÑ…ufœ‡÷¥Ì«N/,GÓÎ΢R²R)¥—hÚ€© ‚§i©Áþe[4BmE-v’§ŽsüäjÕ²õ‹#¼¢5¬°]HQWG Kehîé™ócñÝ8ßDÐÎNgÕªrB¡ím§øÒjóõ®pfÜÒÙs·YLÁ§ ©á= ÚGê]´ßߎ* r”h²#úd¡„d‡c Œ„ ;Xž%—]øØ ½÷û ÿ¼vzµGï\Œ 㨠“MîÞ oa$ߘ©'¾Ç­YGÄð°öûIÖbÛÓ4mW¹K‘ï/? îA{)ç8>"3Zçzô«Y4+@#Ê Ÿô=dGB9åI(ô¬Dß…÷ÚJï õ%Þ#ë9¼W_¢x¯pe~ùá[òÁü8Ó[Hï©2=£¯ŽÛI†¨u–¡B8Ñ­[ÍcñSí/„ úš¶«ÇWÀ÷˜Cë­;ëX` vQeÆ‹ J§ù=MsòI Û{ÖûT>wé“’ôrˆÍ¶´$Ê9$Âk0{ÃŒîÆà…£©­ ¹è¡þ¢ƒÖ¼…JWµ>æ/þìZ×滜¥þ>ôm÷ÄfÓ¤øK6&kÊdqW²pב$kÅÇhÆiN§[mCóøâD}ﯔêÈ ˜*%„”{N„{ƒ%ºÆBÂãd¥ául?ÄÌÑ}†&Inƒbui¹#'ËÕ^?OA7'öÔd°ç¤Éàß´Éä‡&ýH˜&}ˆé~_1‹` ôY«ÑïrÙ¬7”Þ;
-ÝFU½K³§~ÊÉhúÑÊ£|,‘Å^Ußfý²ÛIWAŒ7v|ÅEÌš}èÀjû⢪¶FÃh¾Ê³Q“Õ÷«†wÊíAï‹ø×=‚ˆ£¶ˆ@Ôs\_'‡{}¥õµPõu/ ùýæýö±?~®Sn6Úæø°mjeW-($,<;ò¢sâ›·QD{‡•ODR~†^ŽÝI‹øe3Í£æì\ßfún,.u¨!,äz#/L$ÈÇÙƒHÁWE`…ÔÕHÕËZ×´céY«YãjÕø–øjà * ¥Ÿ*Iƒ¬TNé0[Ù&ú/S<õ 7(Ý»ƒd”ðýNÛjªçI`÷Sço#&a^{OnÞÑCãü9wš#¤Èï&µ²]ÖôÓ-¬±Â©jæù³!S®rýJÅFžhKš\ù6ìªå ËT®±*=Wãs‰-æ¡â{ë ¢§!ýb»v ‹í¹XäOVä7æ/£%ÂömÝ«æ]¶{»mɳ]4µñe½Îƒ’;ýÞ¯¢æ{/ëÛð9®Z'Å.½Ì—“eÑ»O‹B ò‹¹ë‰uÉؽa‰ÍÁ°¤ôZÐ&š²Ð&]HÕåT&¯ÛBôRÓ‚6x ùýMêä14É“â+¿ì²ß‹TFù%-»K¨o¤š¬+—l²~@UL„·h»Õ›º6_¸åàIóC¡a=’;‹*Š¬'¥Ù³dÃA{5€*Õ8Î,oú ?ßOQî ç’Ü0¡^9l8€þ@à†E W“aõ
--Ž½ÞŠú·ì®\Œûº,×yz%P'p±÷r ýÆÌÎÙ¾`j@O2´ f«  6Ÿ ’öPé*èf«hÆã
-€/l)ÀC]ðÆ:cu|³œÏh@¿ü–>Ó÷²Ò·éiÚ#ä4mkýŒû,M…v”±{üÔ`;8œ1me<Ù4I%ch¦shé¾¾êrúZ–ãå+¯‡Á3¨¶Oéø8<aë{~„hùñ(»ï=&;Å»ö\¢·WSnÆ×qoåeuMD(þ©Ž^Ñ]Ÿ¶ÿ"ýtD'ýÔ«fúNZš¾µìôžóh4ÊbÄ7Þ% ®”Ëè×3ŽTÊ­oí—å§t8j°y4ÿ@õütî1~ßµû{~¯MŠ«›ñ.ln ¯¹¿&mþrEWòëâÂSøBl‹ÄyR5»gzŸ¸Ij‹dÞø..¹zÿ"ý¸â0‹µ¤ÿÔ“{õŸhßVn˜¾[­¬E£ö:MµÑêàóB«˜…W­?a3‡ÞcìBÞÔž½5f§Îuð=)WtùÒ/nán^ˆMÎ9?ÔÒäLÇÕE’êÔæ”pGñpZ¶ìÇ)ïœà£ô™CÈNÕCy±µö:±îk/»sóëá_ÒÏU±²hK½ôCœäôCBzÖ¼”] ½ùß*ø«ÀxYï?Â}ÿsׇ*tkR\år½–ëçÇFÏ [¦’ù¢Ì% ÖOË¡ž
-MB?Ê6aÂ;í*´0ß×ynµ3}cŸ‘Ë;Ææ,UîÒö¹Â­-Û(eý¾Oã¼Á¥ÿKúE{FúùâY ×Ömã?ÅpÝ›¿üKoõ¨b¯Í­UÇ—‘¢&穦=“vSøžDœ‡Ž
-ÍT=Cö}ñç[
-ß8ôÖÜsãÒÖzS'„ b…^ÐûÝ º¨©«½ÿÒïld¤_‘²WÖOïgþ ýªkç¹¹”ìÛ€ªYç—9±“œÁOŽ¥Qe¹GçM|‘·»??¯u??·3úÂÏ6‡‹R s{¤¹Y,¹R…_o涼.ƒ©hý]6‹µFÅ_ÃîÉOr•òÒIxjñàçÊ‚Þ™²—öeéæ#þ’~_#-£§¼µÖÓjõŸ]æÕ»^;A;†>sЖ¸_ñW7¢Ï9;ë—ïè3Ûê'X‡ú+Z—O¹S sÕûê°DÞ+³CçýdÍ•ü¡¢!Ëkd`KW›±‹Çc/giyÎÈî‹ÖØãµÑÖu67 >#tVδ{Øu¦Óþ@¿‡É®9jÿ’…çõÞ`tîßÞL8{S=­%9†>TÙ M®¼§5l³F`~]YÂÝÕÑ*ü³S›,o“ÚrI¾›Å´Mì½÷Š8{ž$=³Õ+¥ÏÜï¡ya7©ÎÖý›O 3íñ°<­ÁšôÅ™7A`ü2naûÚÈ^!Œ{‡«mwæø Ô;÷Ëo„}ïžú•=ÖçÖÏÎÆÑ
-Ž¦ç<ýÙ0·®*ruÕšðør\í 6Ở
-øPb5ö Àüå«bÃk¶ø“Ž±Ð¥cEêa`…u\æžA£xM—ã¹ó¾”WŸK±GÎÊ–÷Ó/5ÇïNßΞ3ºâþtDŒ×¾;Nü“bþΙݎgûKÝ^¶0Ïåí<׆’/⃲…ºyšV\á}K»“À<Ðó¦iÂÆl„ú—?‘tê—‡QWôsÞ'Ä{;áZÞׂ£çü[1¹-Ò¼ÎëöœUò/hbÚŸÆx8¨ÉÚ.#~Tg>ûô
-#êµsÖÔ¬ÿº’Ÿ-‹î'…*¥‘BÙýH!ä¢Ó©’ ’©üem®·íe®r¢fYF]¡ÐäúJ~ ß]P\™@T]œÅp¯“góÃvXýNÚå ±æõ¢vä½ñƒkì߬Å#)±hr­3.öÀèÇ(eh:Í‹Ôƒ5ò;BRxi+"@g'BºÁ9<¤´ÒUWßÅ-6_<,Õ+øæS,0Û¬üòûy‡·£ßÝN¶aÓÞ\Š_ÓY¯NÚêÖ])IwEîŠê‚Ü T>Þ/MÎœOö\I–,6†cÆMÑ C†Ú›žV†šÙ5ÊCÂԀ̲ú¸M¬ëW• endstream endobj 68 0 obj <</Length 65536>>stream
-(~þfïÆèÛÕ¦ï_ôX&Œ»„š»ó=æ&)z¸¿Kèaÿü|v¢´çÚ&bGó_¤õ»?'„C¯|"W²ÛCFBð,÷ùúJÏÆdõ.ý|ašUå)å]çªí&Gr夸Á
-®| ÛíéñÙš.PbÝ7òÉȪ雜^¾Éœ\ôú‡ •Ã.¤¸*‘»°}Õæ…ÞŒ[ªœ±Ïï¾›{¾¿ƒóy¤/!9ë4¦s­a®÷Ìš|ô>|ìA
-à<Ìøœ
-¿ün¡mÌŸuª{Ô£ªä%a¾mÁ“™½v Y~bô†¡ACÌ“ÓZ¿oÙåÑ#êg-&äˆ.´™%r¡Ö º9Ôéꀘý ÝDϱ†7Ò Çý/º’±"‘¶T@Âç ‹æ %¬˜qeY ¨¹\.{/dŽ­üb‘¯TÔK`”±uivÊÙê€}ã/UŒÏwô–®v 1
-W5äv›–ébÃAu`@åÕóM2îþL 2 £¥‘qu
-›qÓ³hLPq-û×루ÛL
-îúØRáØù¬2ÊÎ7 À¾\p4jN:­
-3ükšvªù ù§šŠ•,Aß4»¯e3^BÌÛÏ ÎŒžÒ±3{–î?ÂÖpóS½LâGÙ “»öˆï·“|nƧ^¾fƒ
-qàþåªp“‹[¯3f›ÿéûpÉ” 1M»2‹õÊdJÆϾ£YŒÕU†ýS }Rn”^B„ OéPÅa³Å<Ê6.Üc¼­Ükc¶w;Њy3Ò¾}Møþø:öürmÿâBþöüP·Ç3?ŸIÚg‹ w:s Ó«k'áÖu3Üé)?Ò'¿ª3þ%ýäO?eZ§“¦ï|ÖNÃÅXÎ~lFÆkžE(Æ/aKe'Ir»vË}oÆ+_®þ®è²Ü¼¸…2~!Ö(sž”Ðö™Žh)™×ènÂ$ã´lJÃSÞVÇGx,eK‚tîu°8ïL¸\Ü5B‡Œ“îEŠ‡•O/Fw—ntíGê_~ö®ERÖ¬Ÿ¾'›]šðŸëÀÖ´,Ðû„ûèäv Ë+ê…› ±Šg:Œ³8wÁó´DÂï)?ØAGéº+Br[ÛǬ×Ø׶3óÞÏwr%²ÇÅèv-Enu§mÆÓÞÒçú"œã“sÈ=šÅÍ’é¢á=a6ù­Ë¬{ø?¤í$f*Q›±èdQo”ìbØ÷aœô~êürEKÒÍ4k}::ÊìÈÛǸÚ¶ímœì©}Œe7zäÎÅÇö Ä÷vâùð Åp¾×BPžµ6}E­³7&¬‹ì§„ßö(¨¸·Ýj'N  ÿ8{£~«R¤—çøMý‹ôíù,ZH?‹U¨ YoÄûn)S—=¥NË…ÞïzŽŸçj7‰‚¹ª‚z®4ÁS þ@‘5¢õzaÖŠ0¾ÛÃâôÌXíÎ ¼êÛßš|À¨oMhvy)Ô%Þ‹ìÅP"ï%róC5æíŽÎsA ­äRë/é·tá~êÉ­ÿ‚Ž¼:?›*;8O7wè°]í¿±}2K[vÍ7Ãœ#3kµÈ‹Vå{+ƒ–þiÞù(ÐçË‹ï®–4Ù.î§ø¸ ÑÃÕ{ec…ÇQ…l„™!¦:Ô.6[]çüLr¿útóR½iyØzNj#­46¡qsÜØ_F‰*!¿¤_µ$<»Ì€½LŽuäTìB…}³zºÅέ–l_—y²‘¼áûh©Uô“¾Õ\ºœM/&QÇ›+¶:ÿFScÞ!ÖÎ<ÿ8Ng2s^Îà÷{3í
-`7­äëç‰n2¯I½iƦíÕFÉ}GŒ†&»·âÄuIG:;Ó|ýì·ü­Û^ñZ³ùm\ýËoõû:âä©$ùõxœ§¾ÛE_6Å€‚øv‹ýaìŸÓ’ÿñøGTš¼¨9+îOÔ´’œÚ“>vWÆÇÑKÿ“µÅëeÎsÈá 4so>¸DEÎsÓ?;lyô²=wÙmªÔú3–ŠêÙ¬wÃhew«7ç+V•ÇÊÿâÑ/®„sn:$ÿ@;Bù”CiwúF&¾ƒøÁ’êà—Ã_ÑL ?×iu\ã—F±ÜpïƒéRYÚîÌê¨h,TµÛ°sŽ`Ň4f‹/ ¼g‘µ7ÉÈÒò¹·¹7鲉œ¸q²?Š1v~ÿ²æï}¢µ.flKúýâÿrÃÇšpÔ‚
-¾]Nf¥u¼—;x±åÏ6+m:ͦµÕx0ö ¡k'muý%̲gÌÆ0»0ðA˜s™AYšt,-œ(Ùäj¦áC#±ªÉ²ïÄiÔ'úÄU¿Ìœ–ra]›´­q»×¸÷5Ö—žð®f÷~vÀáqáxBعýQk³Å…â
-{ro¯s½í§ñ=ZLñÕ¹¥xîÌååÚîTƒãP¦“ç Ëßr–.ÞJ¦©žëFß0+œ³Ñ²ï*g®O–¬OôB6
-‹–Æ·š“Þ÷Ò]÷:ÄäØ &ñ«+³õ’F.­võ†©VÜ^­P  Ä¯Má_$AýÛŽ¼2Û\#Fñ´øT“ç¬ZêEc“æîä¢Ð$GCyU÷•n=4–gŽ|öo
-ôÉu»¨OKb]{k
-ªñHöü¢Èõ
-=Eìf±Ö-ÞPí&»¹²ÃAôRô;—ô¨ ›o€ÉÍíR“ΚIgI%»Nçþ øåG¿-<¡ÆÊþ>`OL'‰õhmÝé&?µ}¹b¶ýíÀª_G#ã¼öü¬ÅFÚ4Ò§“íE{¿Ï©–Ër=‘Þ»ëù©Ö-SSí‰RÙÍN¬Òçs²|ôK}¹á#é¼±×^ÞžÄQ¿ð)Ênvži]é<ßµMgºÝ<3¾¹Ÿêh©œë<?yðËþÜd˜Íö}Büqç
-2²y_¶®jKº)ÙÏ™ ÞÙMO¤œý°ó"K‹»VÂGÙ}„v\­eìD!×|!7Vï!rÆâó—•+Ðk#7«/9k O¸üÜ™¿XUFYȬ—Åœd½o -®œî¦¿òÔh°Ù¨Õïý¨ ÏÓUΆà—tY<r‘ÀâXNk"]*£™Ö`:\M’……90…Üy3k¯œRüjCñÉo&û2¯²J›W9yÁ«<|ÉP?ÿ°™þ!ò6k2cd!\\x2øÜ.Ž°Ñ‚A­Mº†Ó©vu×:½U¨jÝ2‚šj²<Yit$_Fi+9‘qµÁM¤MçÝ™'yá‹ÏËÂâ7„<íÕî´á6ªóêJóe)
-9m ݸZoPbµËê•yFœpµ>ýáj"šÍ/?‡ô—íª<%WNb |`
-câ1MlxÙðÍD*8zZÜ+½UZkwËúWVŒO¢ÉÃÚבÜV~.NxÝI'µ]‡{£gaÙ&žB~EÛÔ…³ƒC½Æ‡Ý9Ηw!ÏéȵËÕÔeML ØÆíre†4ZȸРúÞM˜!;91ÃVšþC2€ÿ!Të
-áO0 ™ÅçbÞMßÊiéòg‡õhkÂÝ‘»åøÊ+Ï°-]CUœØºÑyç–〃¥Ð^£vpKOí"õ½ñaZûð¾Yàv€¯ruQn±æ¬K³Mn)3Ãåu@ß Ú‚v7?aG“Ý|žzVœzVG.õ¬ñê™^4)Ò~_½6µV _òT£>5w;à,ïÕƒenÃEŸÑ§Ãnr’bNçœäšLçÝ®ˆ`45¡0Ä~öUP@wÎoÅᚯœ–{n7H®\ýzMÙã¨g›¯b™±¹zƒÁ® EÈ®H=§s“b>×9ù^f¶×‰¾dâP² ³C’â óIzM÷þ@¿‡  |ÑÙÔ vr¿¶üºïMl?ô4¿ÅZj}‹Ò¨Æ0¯»#„ÂkÛn—Ê;…ï€Åõg…1‡¨üŠµb9b[º›0öqrgp+üÒ£Ë.Ë.¨q®Qìä‘k“íEW'üÇ|BˆS8& vâë/ÜÀ•åEÇ×·]ˆ¯ïÌ€ªòó/+׸ã^ñòEFS½™vËqÜ&üü·ì0çãWêxÙR·½,œ¯.{,‡û"Ûºô{Œ#ø6CÔÞ=¶Ššn‘j¶è\)N0SrŒ
-¤ o«ÄÊÛ¡œ{²¸*×»x¹8cZ/Ùbµ<ñø¡û ®¢û㦋î7Ó ºŸ®X5i>þ²|w7ølŸO7Ç<_VK¡·zÛ/ÎÔ}ãnJTtÚ›þŽæ ½…1×â §'ùO¥rI¦¸3kfýòõF²“ó}2¿:GD`V΄Ü$Ÿxh·ÞÅ­2§M¬–nÔÄn2Ú¸3NkHO²¬ø]¾7¯Þ¼ÒtIj^]%h^õó¥yí<³ Ï·_²¹òç1úÉÅ6kvieÝ1‘{ë8U|dv¾ùPæµÓŽe®S„ æc§Iv† †ý…€o‘‹†w“’íx|†õ`õ·Gýãµà6“VÖû-ckÍÛ¨G4GÔVl<çÅacÊ›+ä=:œîÀˆÇ4Úˆ×B–ˆWš&Èü³½#ó‹ûe ähʃ†\õo# »5a4‘ÔØäâ\ù©À·<ÍDUŠ,$c Û½µb4ë|RZNaa¶ðõiÔ—î^“º"aãå¶iÝìÓÿ"Ÿé«Œ,¸Šä–
-_—
-k£mš‹ÚF]&5µ‚eï¥VÚ=¸Ziu÷j%³ª²}¯•˜þí—YciÐŽôÁ&q¼\4Ø7×J2±¦"(k¿Ã']f¤;ä*°xu7 ZŽsm6fï…,«p¶z­LìKoaT‡·Î¢–uJXëV_§ZùÑzVã‰V¨ê̪^­} ¦b
-ín¥™?NËɺs(c¥(]—2QºúƤŒîKû2ºetÌÞO"8Ë“‡u¢UèóÚøÜÝAf(M«ÔT(>¹lBl 5j¡l%<›AøÖu fk® ÅëECnUë;’ªXÏWš/S)Ÿ7a–˜ªQ¯”¥ÛMØ–F#')QÔ>ýŸi¹XœÎU´Èò'öV¸ ·¥m·åîò#€BþâkÃàíàv¹ÃmÐzþâ’9nÞæ—¼¶6‹b»dØYÁ­9ß(I.ò“·lŒïU±áéWWìU9ñ Z+çüÍï(X0Ï<,XηZ}†£ŒÃ’–ù‚;ܵ&  ®µBY嘼¯ô|Ml-rÆÆ;ƒ¤òów¹ÿnç퇗kÜ.c|ýåw íþG\ä»F•»J[Ú:À}æ™W§¤Ml¬ÅûM6AÔºªJÒHØÒ„âIx¹¸aP1K&óú}ÄfgiÎÛ8ó} ØÀÓæm€í±E†g¤w€d(ãŠýìà¡
-öØ€º0¡ç›õ@¤ÃH€ü¸]@µ Pl¬Jy˜?g #@m P§U
-ƒÁêOþê¹qÃÆ)q¿õW½¶¯~áܹ2Ë—w J¯Á…ß•&qX­-Ïß®p<K×Þë´`¡Ú u¤£þYv;iéþâˆLO^vîÙûEúVY7ÃõŸ:µ õgÄšivVTÌ×W±ûOe¯OúÙ^ßͤ¾a#ó–S=½úy' Š*§mµ‡;m‹<K±Åž”Q?)7/ëÃËPæ·eì-ÃÙcË?Õæwä6šoýj>ó_N‹ò& ¾ì†O˜Öÿ…ô4²™N×Xšz^5ë¡ÿêë+ÇÒݼ–[I\/˜×D¬ö/\Ç™³>ÿÎÒé½9)×ÛáˆËóŒ®{'7zìbeîÈõlýòÚ2ûyÖ‡Ú¼¶NÝ-½n$çìîd_Ê*?®ØKåÛk¹x[P^ «=žáBÎwú†ø~¿HßG’Nß|TÎg½Mãllˆ¼£=±ry´æÕ¸±gWŒ÷ÅÃŽç•=6CÚ;r;[f—ïoøc¬C<¬Wx±Š2§k•òûh¹¨£ñž`÷…‘ÃÒ2oæl”gGÃ'gØ~݈< ¶¦‰7]L}‘¸MÙœ›Ÿ<ãâ$ÿÒOûÓ×<–¾çiíY½áûîÑÍÖ~âãëI…•×Þi€ÜÖW÷¥M¾«oºçV°—ÅÚ^]îÉœï’Kw^e/ýÙñù f¸ðœDÞ®°Œ(«º›ú'*ž²#ë5 >½\ø–få°y|3?PF–>–4’ím¤ÉHaTª¡p°9ç¡Ðî>
-éeÈ4ÇñäZ—A<E„䤵•ýaO.6;ª_Þ¬'Ô-^.ÝÛ{Ñn}ŠóZé^è=»“#ºþªOÓ\kòÊç´ÉhQ±ÂO±Ò 'næ*Üx<»wãÌŒíFËts•Œç;hJpP±5bØIOòà,:á€8æc¿_WÏ[ ß0ß_ü@ýaý¤Ÿ¾ËÞH«PŽó«Ø{¼yÞŒ?ÔlËÂßUfRÇóóZþYÀ§é='ò7Jµ/2VÈ/6ZÍf„@¨lWL+@Ff‹ÖbUÅýçç0Â4ò¯ŸëÖg¬Òµ?<qŸ>?šVzãχï5v›ž'½ê;w¡G/WEÂôÀ;ïõ‹‡y{P—æd_Ù_¦Ü{^ðyÑ£éÌ3ûY+QRdz“”Ïa~_ŽÖ:r
-v>óGõÜ ›Íâ€Ê7«¾ïTÿq1¸~Ðóš½ôîɽpµ{
-^!®þŒè¹ aºŒ*Ih»—“2 ù™Õí^OOBOÞ6®vºœ»íëåî˜ÛÛ©¯¼í– Ä&¶µZ§ÖÈ}xkˆË­È|õÚ†9¦g^û3<Û™{´iç6ÖÝP*È€*¯¯FüP×µëAG(ù/œW&Nm"\*,p–|NZ­Þ:8zXæ‹(«ÿJµ¬•žT+©”䬮©~úŽÝ¯Lm7¨­;×7wê0¢x³†s95SXÏ™ C‡ÛßrmK>aÌ_sÞPÆ×–¾9S×gÂ@ÛAݹ†º§³z¤h Ú·}¶*Ul¾î)±ÚØd˜^þ G{½'ÖÅ
-V˜±›ø>6®Ärp«&~¿ÉŸÚžò¼7»;Ôn:öÛÖlrnÚÖóGfšoÚ‘¾=ý@íüîjõü2àÓ7§ÄÖv~Õ,#Õ㈯«ŽàjJ<w*åä$îe¿»Ie–j­çŸšWÁ,^´‚9ÿοØ3/±öçy||¾0Ø^œ†×yÿ=õzžºïè]«?nØñ&ÏvØÚC4ÓïCoG§´Û.H`Y$Ò¹Ñvæ¨YS%QOyå©âªþU.E¿¨Pí
-µ“Õ©Ÿ»É¤î6”Sø>òüu6øë|ÔÉ<µ¯ÿU…îW¢†à×ì{ói:çÕȶÆm»Õ†¬¥ÄYU%b¹šÝcC™£Zc«KS_V¤Ü³c‰Š÷Õt4‘üdÚØ/ë†ÙGáp-Þ»Ï~ŒiÃu7áu²~øþ7yFòGÜ£
-ï¹áiøå†gㆱ–y}Üp}Ùdxï¸G±¸ÿÅâ¬è•ižasCFåöžD#»¿Ó:¦dó’nB%±6*£OIúBÊ3wF„µœØÔ·½±Ci§ò@8Ö»“lÄ°IoQÅÙ®îUžW>q@Êû8Qà™K»Æô„çøG¡Í†õæ€m¼w[æ;åSæ!4óU|æ;,ÙÆí´û‹ýf;¿®•0ó@¿~Úþó ;XA‡_VÌ6ìÁ¢W.„
-ÊJI\¢‘O³@\àÝ{v²Ðã=^¢µIãBÖÄrµQup¹*×Zfµð
-zY+ËñnŒjt–
- 8E†.<Þ×Vðxvzà eÆÃcÇëÃc5™Á¯%º†_#xÕ[}jÀn•C[_§jBݽV>Øéãê)òÁ§Æ1Ë°O‘g"©áÜ›Eªóó ªìX.÷!žø*é¡T¬×*ü®ä¨ Bn—6Ü
-CÔÙ½½Ôš$/¨ Õ‘Â2¿æ ê²açןé4oD\’7üš7† “7lcœ_Ï×Ë(;ÄK'o+r°ƒ~œÞ¦òÚöÄroÑ®ßn@aç(Ý ìŽËâA>&jù{½ZÙ}7Ò#¸(`s
-è‘2ô¸tÉ@ß3ß©V¾ÿdS—áåF`¯×«Íó#òzª÷1)îØhµ4×v’oÁ3×ú«'»¹. X 
-¦ïË´€ú_=Yª¶þŠ·¿Ø`¯ ØOìŽÄÀ5¤ àÜùp1q<.
-)ƒdøH€O|Àª« ~ö7ŸõSù8pQ<"8¨‡óú“éÚ… zè•ÃRZ€<X¹Ûvþ¸{´ÿöæêè¥äÜý•nÿ´ò›yû[Îa0þ*¸9hê´¶õöìêS9ÕŸ^ * „qlaíNp¡ ¼? |–2h Î4Êù}ý‘¡ÿNÓæ‚þUÿ/%t覩E:Ç —×?•ÂB»öŠJõÊ›mþ©ÛÍÇoËýÒ3î;ºkÝÍû {G‡“þÍN'Á 7Ó(‰›·UBÎÞ‡«—o—‡!ç/A¥ÀÇ©mYqˆÅ£ÿÿji3 2xØ¿Jh†oó?%®£4ÌÓ›è…ø©èÇCéïݼa…Û‘#‘$n Õ„ŒPâš´HæŸüՇƋ— $)qjJòW¥Îùëؽ³téNÊ}8?®ùÃñ°¡÷þ¨ ©½SÌ)?ÐÛÖ/vq»dþ‹ÿt¯UΠVþ£„¹W[Oe[™]Hý;ÚO§7,ø®¯‰˜.¼Žã°ÝÎßNô:Kçèûä$‚ýIñ¨?GåƒùéV÷G©Kì±E—ÙyÅž°MÚ#yË–æ&ÀnýuÚ£ëÆ=ù¬¾A«¶ŠêQýoþêÄáÿyõiZzXÌýÎ>[Ì`U_y wó2À7 ²¯ÌLkÅ©.·ÏQUèž”+áÌô<Ü; [=h>Û&ú|µevÓí&¨Nþ´º¬Cbu_7®çwi%ùU>x”²H\yk‹µ„0 dÁKs«Ø·gG³²œ9èìÅÎ Žân¥ò_HÓuóO à?`‹IÌuž— 
-ûêº4ÕšaôÕš÷])g*Éüdå\>.~q Fh¥•Ç´áËóàð=ºžj¤ô¤Â”sµÃ±Öm{NÍ©ÕZTçòm Ö½êhæ‹ðlS˜.íi~7içÔãÂ7ǵӓ®Ò?ÏK*9ÈKk¿©œV™¨ˆjç<B­’¦â∩s(÷ÅÃZfòÂSfª4ݺŸ nkèQgþ/¶¯‡ž_8,rÕR.$#¯Û“nt+»Ç‰g¬l ëèV´†Ì3Å=Ý–*—¦¡ðo]_MŠŽŽäª¾f*øXCáæ\µ=u£b”wRÜwUHn‘Êýñ>/3F¹Úîë\‹ïª”òpæIì^¿Æý&~ÛYÜ¡ƒŽUËQ:•£U©ÙFÚ`¹YòÞ%¿IÊ~]¢lw½üH–~鳪VÌñQË·¥ž\6`EÀtÄY íÈY,¦Ú¯ž¡Ä‘£YÈ+'­ýXf–§Yë¡=×->)¥Ô§nRȪñ»!b¤Ý(1¿«JÍ…ï;M•ýFMøe_ë5Si¬7´™a?ÎðŒëÉ%óa~køžÏEõ¹u œØû@nÕœ6;þ,"ÍÐ<!íü¤–ÓÚÖÐäZQ±ç•P²x¡.ûÔj=N£U'GJ?Ú@jJíPùÞ\l©ƒÌ‡ Å͹¹¸‚g³ÈÔ
-õ£]k‹K£QÖXK°¶þX¨úè)ã$Tw½~âµ@¨gS¡j&¿Xî^G0!~R7~ì-½e_³aÕW‘­ÊÞ-êåÚþ«:‘ JÓa™íÛÕV=pi)| ˆSYlÍWm± \»M5~ùÍb¯664·l´sƒ°W‰ÐÏ@¨^´~êõø:~¿ü%¨?™«÷|O ²WúXå{=ä{Myòá/~Kž„KÿvôŸ§oà¶ån»s»H_=YßÐB¶Æ¿½|ëV^­ƒ¤I.‰³6Š‰…Ãþ@M k4OQå›n
-Nw„Ž¼ „t꧸¶ÍL¼|á/·î›ïÍ®O+4ÃÝá‰ÆqÆÛç¸^¸c_L=ǾXIf_ÕkŸ}Õ*!ÇuèÉ„?YซrãöhvèO®»a·¦gŽÁè
- îÞ&Ã÷ž] @H!ÃÕ44Ú*
-˜ó§˜xäæmó¡JMÀ|]÷O]
-‹µü&ô¦þ ÿZ
-yR.Rýˆ òÞˆ¾#—sËlcçÚhÒ_‡øz°n\âpÑÇh•îËŸl—p˜x\ç;9}Î-¸š› ™a{ƒŒ¼Z$Nq§Ìm»Ÿ<†ô;ƒ M^)ü‹Ÿÿ­Ö6¢ãçf߸cœªöñ»ÇÛ²§­_¬Þ7ü¡ü]7âZq%݈ÚRyÕ¨…þ-qó]«Ô˜£ËRkæ” 5ŠÍœyhÅž&NÉú8=ü&7™´¶ Óa÷6ÒQ2Žš›Ï8?Ï•G*œm/ð÷ƒu;ÚF%½fø&ÿâ·‡OØ,ÞrtØœ¿Æ:Üëƒþ&@ν•tÕ³yY¬ëÉÜÊñ«™K§(6Ìû4队ÉÃUó>Q‹aȪ•°ñ´°q$XÔXúxÜh!y‘ú盕k52£w‡»v:¢Gd6ppfçÇ=ûî“÷#üõ“`(õ}¡Öï3ŸÎ,Ãhõ‹ÞcÚ]¾òÏõ7¡öƒä´ì1ë-{ »«–úzZgNá&Ms£OÎÅ CúŒ#þ2-š§Ìå™ÝŽÝ.?Ðp§ßîCtwK³ÈáN­û±[*ûI`ýÄç˜>ó½Çr¤÷ê¥M× }0v¿OvãFËõÓ-4,¢»,3VwImÇ] ÜgÝâìýâv:ªßlUÊW¼yMnãEûJQo_&Ï­@„o<ÇŒ£Á”É©”­{gXçüåB¿W­-û·.±ë³WâÔI\ÒòâÓ›¨âÇ‹fÁµmÄ•é9þu—Ã×Õêìl6‚íT*¡ÝžÖv­^tNŸÑ!Ì…i]YldõžèØêÈð¿¢òžŒùãb'—ü)¿÷Ô±Èl°ô«Ã’G† Áÿ¨Öï/ÛÌ¿RotAÚÞ'/§ð+¯Óîª,-»ÚÞÜ9ÛšyrÚ¯ñÍ>4Æ/»E sn‹bù¨YW—á-:1UsÈN»&U¢öXïœÛ Š+ÿ@Æ7WÖ Évü þðä1kpZ[Ýt=+ÛhöÆEéÝâÜ•öÙB¾ÒKi6×+xÑ“ÊEÔ…^eº‹ TÓA«¬fÛ#ñ1Á÷;î4gñK’"‹Qƒ¥ùÀw{“ïíÎí”~ÜÛá÷c|ÕzÉ6®/èECW°©­U=Ð üµ×ë0¯î¢^Kµ:/>P«µ¢ÿ‹=5?ßû Èâ—I.‡t‡ÝlúúBU'½ÖÝGºëï t‘“õuЩ ubGF­dÒ¡-67jšul¢¶ÓøÔi7©‹gD³çÐheÆD_¬‹ ]5ð­¶ÞS'ÍXu÷d‘…j­ž¨r*WYŹùš|áâžÜƒ••LmrïÖ­÷Z·þÀi ˜Iï_l>e÷6ëC£ùhÛXØ>ÓM2󸳿a›(©Ÿ5ßß,ÖÛgwrû-¯2oR?TVòaô%WjêÅqMÕÚgiå쪪ì+§®6V²a¦àŸåVîIû³Lg¶¥5èrP‹#F„ôü$I°TGüTãHüpÓ§8I‡Ù.&Š“’™AôþÅZ¤Û´ÁÖ¦Ãó©eõ¤ÖUè¢ðë\»{È|© mOöòÕ˜¹§¾Œè¯Öî’°º¿J5µ&Ù™ï´è7äkq¬È½Í*‹_Z÷Ê6ŽûËoqA)”FïÊ\6ò^œV:WQ¼Ÿ˜ ˆjs®NMhó4«¾6V>vmèJeØ ‡Ü±Bü=œ¿Ïá€é²VÜu©ÏÛîÞ¨ši¾oçn“§¾ÒKÍÌ®jç½})Äaä>v,µîáoñ¹<#¤!5`F§cˆRYqÄÜ­ï7çƒÕ¤ C×Ucµ.º×N BÁœ×XUzýX, ëGü×í뎨ۉ©eØvÿb7wØ"¾ŽÜxÜO‡'£k¡g=Æ8Ú–.DN×Çâ]=<VgÅí52ÃóI6b|“|Jã½Q¿5§,J®7çIÀ4•èØl¬ ±ÒЗ_³èHWØ‘R  ¾Õ­Õ¾î@¹{;›0»gŠ÷š¢ÊSà4ä’¹zà’…Uã’%¦þ@ÙÁíþ‹Y2ñãQÖG½(鎣¬Nß¾}€†F•›BNôcë!·Rˆ¤±±é½¹ï&œÅ³ £P®;­Š ÑâêǾúçyâã©uìY|¼Hz¼§!!Oú†K®ó+çGhžc[.Î>kr™ÏÝ>[÷Ê;¶>¡P¶Þ‹[l½Ï;a’v ë§á COˆjçVŽél½D}YÛ½6_%^Ü“ÖcN¤&¹Þˆùgph¬·Þ¥QFƒ§PÅýoÝéMà:NïQÞ›ßHî?9îVÄ%ο¨Çöü.ûã;Ê#K¶~4cæí²UÉL¦Æ4?+‘íѳÖ~MÏäS‰ž)¾HÏԼ̀
-à¥í Uêì¶äÃd;²2Ayâ Ž-â 3Â.€8Èå:qà#ƒo’•N`ŽÛ„¶éƒG˳/U«=ÛµH­ÆÅHæ„Z*ÎB&nTJê¦Þ]€%O{“ûâæ£÷Œ˜ÌzÎnRZ~ÞóÔJÏ!”Ž8UÚ‰,¹õ{"i²K¬<Ÿ]â°bÇ„­{kC’?ï›Ð„»#ƒ“¼ÒÆ®ék‚]ß—»^—,N’M'‘fwuà NÒÊ[¾«ngp1EC[qåÚøÀÒG|½šÚ‰ënžÚpYø½`0e$’[ÐpØfó¢w…3¹½ÊwÒœ¾$*­`Â^Pëæ(<&w¯²‚“ÓQK¤Ë
-ÕÌZֆϢ1¤Ãí­ 6¶%Ü™¦^Ù\0ù]a)w¸§Ê3y/nØñ~¶¤çßÊ”Ò÷)‰nîk¡?<rÜS¹K6æ·ÍÆfNRíq?³Y+A3§ˆ6ªïb¯W 7§iµiRÇ*@êÚêF2Z ™Z J´@WH´ÕžÈhKÜèh4¹~’"ÇÕ»ö|üÔóaRk—S¨¹Šç¯l½Ä¥cÌñ›òŽ‘^½%e´*3™ŒCœŽµ§ánj£òøX}¶·ê„»¿«Í.TAÈTЙa’¨\ž
-haU+Y ãT4¾3®ÓÓ¶¼™Ô_嶸G r%ß‘}fÂŽÐ? ûñ¼†ì=B,—×mí¿µ¾3G°Ô6V0¡V•¤­™¹® ÿâ“þî‚\aO½5YAsì6w'ÕO6èì…e>
-é䶲B¤s¥äÛò–Ëíç.WFi9è$ƒØˆ."µÝ´]:[¿äÖÄE‰8ï“âÕŠÅ>u©é»áÀ÷
-3ZE ­{@
-ÃDÊ/똕WßnÛˆ×m®—Ó\yñÉ®XYÕé{¬äqÖ>¬‚}­gZÖ¤:êéժȣz—z©&â¿ñù¾ 7z_j©)ÐExÝ–3WjUê1ß9ü|G$Îýlö Pèls[™Ýå*+êz+6⤠¶[B v+c¬z†Ä
-òÈ@¦€  ĨˆöD¿Ág˜ª€ˆ*^†Á ³ò%ÃÄ\­bzÙµÁa ˆQ?ûk—ã
-h*GºÉÕm´³«óf 7å?,ýö'€)!GÀÓ/`HžÈp×
-èu  &ÓÅÛ_Ø0à ÿWË}þSÑñ»€5“!`#i Øïý
-8jXœHó€k?À™á
-p¾÷§07๠÷àl9Ì°ß5Â}‡otHï“–‡‡½NYtÄ¿À-x6öš…ʨPÿÛ¥ß>ü›ü[øtû~[
-ÿÔOþ_2îŸr¼+ñŽCÀ¡5àïí3¨ÓïÏߧ¦EMÔ÷ù
-ÏÑì¨=§3)®¢Ø*ï#òD]§>ÑLÿ¨£ý4 ˜¦#JŸt:þFö奮þOþê?}ß»÷Η Ïψ_lE­ÓN)ZI×ûj©<>§…þÉÝç;©’Åb³£Š@QÜÎ#yÈW§‰’S&F˜I@Áü„¿abrhÖü‹1ÆQƒ·ÇÒ×ôG‹–Žàåt¥Ãi¸³ thUíÊàèÖÔCîÇì†ïüxPÝÿ@¿‡_üŽãõÚ§¸±Ž'{lR³ÖaUkÞQfG¹ªER¶§~L‚š†i¿¹ƒúa,½›—ÑBl=FjÎxk¥ ¸ wFù†V¹W;ràÔfœ»Ñ'“‹ÞOe·Ï¼êã^ÐpÖ^í¯ Õ÷»FT72Ü~öê:ùd~KâðhfwÖ¡b/UÑfÇ––YËibBx˜zsrqCn´hL[QÃ6ïÑía8pÐóÄëÂ'/×M?é½}æ~?÷AîÖãÓÏÓK'¥¯×Ì¡)dÅmÁ&Ý]ÃfÞoÈYÛ¥¾ƒÄÚ¶¨ÓÍFï3ÒF¬Ú9Žó/®¹›ì®<\–Þ˜Þž6é
-©§8ƃ†è†‚ýØ®¢ýÄéÞc@ =þU— /Ì-÷»³ºn‹õ|7ÿ Ç]U¦]ø³X:FvùNMζå<2û%`ߎ3m–:¸’–wŒ›æMÀ,ÓÿôGí§U:µG\®ÚɳV[À
-¶ñ>?;?Ðïá -îñ:—jƒéý¦¶ÆÐ"‡µmûôy÷ƒõ«Ï®‚7)À ÝJw)õHgãŒêNù½‘편7ìZîétºÊ³×!ðb`õzʼnEÓøâ2Cjkr|ëÜ­G[06yc²WFñú, j¦m•ë4íدj¥QER·‚`ü‹]b û¹C¬¼0¿}ŠƒØµ±^ÚV îüëdÞEwÜâ®vÙ\Í}ò°;ë)èto[Ä꽶˜yo\Y“Û}šíW§¢¶…s¥m|\Ú1Ä„î9_ t¥ Muh9XkzivR·ýÛS5YV£¡ØÚMÊ"ñsÒte×OV²;û–dRé ­;kÿbJÎz\P;¨ö4¡÷®§¨[l<söñZ¸w<^;Y yßXLõz6yâ|k7¤××ÔÖçW¤úéJŸ§µÕ£Q×ô@—Ô]ÑÖTs3´”ceì*öa5cþ:•ÝwiÓJD:nù•ÑWz _¨ÔeAª/1Ý31ô¼Ø”.ƒ­þ‹hÙ.‚E(×ÖÖ€†!Þ]ý²}y_k€M’ö»õ9´AÉ\­<¿ÕÕ"sÒŒ
-sSwCý«¢©WTœ¦Êqfe¯sä[ÉùØlùîCi±lJÁ Ë<%©.7†bx¶gbÓýÿÈ:ÏEµµ[_A]ÄÉ9#‚b³(f1g½ÿCÙ½÷Zß>žªÂn™E˜¾ï¨Á˜«­9ðÝ´'圙­\ecÆ|Ã}¾†::¿ t‹ºfœ¿ˆ°Â´ÞMú¥È-µõp*׉¦‹×´š*å+ÊÑ›»éçK±„<§î§Î. G>Ú„p}µ;ÙÛǺ{
-’’Ì­A@~à|æØïšðµ>0rÏÊD'Aq®U+­DÝïûg•çG´ÙZ¥^QùzrwN ²êåuéÉw\ipÞT%cBõÅO%\‰ý¹‹Ö³†‹Ðð£‹ÐhPO;ñØ*¬…Ø.¤[' Ý:Áó_ ~se[¿P¨üWŠ´B¶`ú­p.9‰õô¢ybwc‘©tõò‚îhLª=<QÚŸÜR‘"e/÷²úå–žEý! såŒdœÆ˜øio1²aE´³Š-B»V Äõ]Gp y. ŸèÂ/6B.ÅZåýªUåq^ð~ÃRÌÒmÅÁ/f³OÉ°rÖoât!`üx¤dÝZÀÝì^•Ùæ£ ˜ ±ß×ɪ‡pÛTB}Þ“o«íXz&óX2ÙíZüÑßW1 q!Ž-DpkmJ@Ù¹È/Ž“÷Çbzöyܪ·¸ yŸrÁÎ>rÁ 5¨Éì΄Ê)ö3v—?!ìÎ*ÉÕ_tÑ­ýu§½F{~çq÷z±†dkºu9Ö)¤ÐS›áµ^cr±Ý^R9”€æôE{äEÂŒh,w;Nø%3=ñþóúäñq›¼„s¢ÊsÔv¬±»êÕeëšÒ`ÙWÌWøži•;¦°#R Ÿ¾ì½èfD¦›eD–™–[Ô¿èÈz³QÆS³lF(U ö[P—ÛK~‚7†¢bµy!ºò½8nI£ôJ (ÖŠ"Óã—]rȈsßXs4^>üÀìî2¾³õNXNy¢Ì ᦵðFôÇú*fjtçšÐJw¹¡šü¦è‘£ô•ëRúšQú„þPp⩇Hk_´_–Y¯]G/eãcÚ%¹ì¹ó±õÌàl©h­S×ûTQ²ï®”·ª-fÉ:¿ë
-·¥Ï!»7}–‹cæTÁ–Œ¸'úš6It—÷ž´òf©G”Ô 
-vÔxè7Bî2ŠE§ýòdËê°üãÖ¢5Ù¯‘ѯàKõXÇ*¦Ûu–Ý\]¹Œs‚/ÐãBNЖïžQqËf‡".Å¥hšˆ¢žƒ¾¿ŒÜíw°nyYX·sJöuU³¯Ç0Óê…u$áá¾ É•®»u½r‘
-ÝtŠÎ;ÕëK¯öŸGUªi)¢;3KN#¶Ù•ºtï“´ÉIÑM« "*Fûý
-f0Êg õœþvðëdØ·ïtÊ5ÓštZ‚A³eì+a‰^~ýàø8ѦTÜKáºÁ8ÌZ ÷9ƒ-b8…æOwû5lö5,ÍÎRØkÀ*á°…Å°•çãWOî
-ÀN›8`·7°7Ëþc æ²…IŠôx³ا¾ðÂz€=®Ò·8µÓm뢛b×,豟7WF^P¯W‹œ]åY5ùЯžÎcÄ
-­œ1~a¶šÀÐIÚB¸sNdz €ÀùçpÍçp#츥õë nþxƒy¯à‹cðÂü|Ôü‚Z¦X<•Þ¥Ï~Ť/­ÞSÀG£;à;: ø.pSDý?nê&¥Ërtpzqf€_`Ò € ™þâ–õ÷×ëÉnãøxþÝËíôôø-Øf Ná€Âú*áBh@Ä+Í{ý?aŸ=Û½,#Uâ$“žÊÉnÄi'ÄXK·õ’ûF/­Æ)GvT+b´%ö&9Ê­
-vœµ0ä]Ë 0‚Ïá ³&­ÉX毞ütûuq 9 >Eþ¯lúMt¨.Íßô†^¶¤Ä®™\wX ‡×'mÈ[ÅJñê
-ÑìiÙ#ÐçbÈÙ¹uÉ`3çþ¦cï}â¦kë$MÉø¤}ÕÑG~Â,¯…èPz{¿}¬Ò1Žz"=©×Â|8T+Éà3Ý68eû±#ò}Eë½Ei¸è-ÊØå_ÖÕßÿáü H<h¯¤ù¶:8©/Ôs}€¤3©Á‡qtð>ˈß`û±´G.#õô¼Ÿ!†ÆÍ"=‹¬7N  1ˤ¥+ô‘XS{>ª™ÝuÉvà.¹ *¤w:Ìá…‡Ÿ„üµúl‡Ķ¥×µÖº Ñ×°ú=«Çx’ÆÕÙ&Ñ
-ÕÅüäclp£f®(zÌ[ÅL~©°÷÷c3Wë»@éô|Xvמ2í’k}Ù©QʦÃìòû°Éé§?ïís»ònK·*Ôºõº¹–úÓÍçè$7M(c5"—+7l´Õ­Ç¥Ý¼Ž$ò­¶¨³ò\ó¹¨Tóy¨]ÃN·Ö烒Yǘ^ÄM-:sÄH=HÐÀº²=
-àn€úx§F\Ød¥}n†V[º ½VO‰*Íç n6O6>Ñzð7"û5 Y×ãâmUw1hW[Щ†í°Gu]7³Uò•šÉæ¹ASWÿÞÎÊçh •Ã‚"—e¸ã¤ß-½/ööQš/@Ô.Ebv&ýÀƒîäºÁtX¡vhŸÔ©ÕKOGs¨Ý_(ÿ†Pœ#ë.JóµE‰SjØV4«ëjZ¿’‡¼_IšÅJ…¹êÁ¡S ƒ¦Ò”σNTå²t‹Žû¸¤ÁÙ‡ÿœPßÄú¼÷Ù
-»Y¼.ìöÃ_ŸR}ˆ¥EîPÕ¿˜O›b{4è¿Œnu`‘-£ò|×=÷x¨VÕܲÂEå(8e­ipì[‹rÇâ7¥~M=ù£–úð3ò&Óó`¤Gg‹X(›çôÞw——ƒé–:OÇ%T¬ìT†d½°ÇÓÏ¢ú¦1µOô<±[‡ÜÓºšeÜêâÍR¶•jþQ“WùN¡)zbŠHþbZ=5j$niíž›`õEØL«‹¯P[îQƒyÉh}F¾¥?¨ ½)^›çt°tW|°s‰¨wu¶öúãг\Øïx¡eûâ¢Ý–ͺöeËêê®—¬Âz~PNúæûŽÌÓêbÜ/ŸM(—déZ 'Ü{¢t&âô3â²|
-Yü"’Y²ÒÝeh¥]´Z;Q÷²ÖÉlý¬ÄÇÅÅ0¸ëB¶í’ÅeËÙ®6ýÂþ¶‰ÒóÂk—¥Ý½vÖ g«›¯ü“U üàXÈåQ‹6£L‹7­éD5bdiΔ ¤%·t?ÓŒtlûÙk뚟~οFMÆVAMÖâH­UðWŠ ý§_v¼šlîÂÈœ¬ËáÅ›‹õ¥ÃAÇÙ\ýBn¼.â‹ÃÄÙ)Z¿Ð\ÍZö9Ñ«¶ôʇ–zåzù¡“Ÿ˜ŸEq™–¥Ä„6³w6/yl3úbpM¯1Ý7aJ[ohA *º¦QJÇUkƒYUe}| ñÚZi^>Oùâø¤|qKî ó®Üáv¹Ã—¨}^î`-nPÄl¯­ËU¡FËÇl)íyÏ^Nj¬`§ÞéEöeuïZ}­ÐÈðkʶfÚéǼáFÛ¾¾Ìž&:^¼.´ Oì´à¬\Ô¬<ÔÚÝ˨l¿*Çô:Q„ÕV”/a./wäBYV²Ë®Ôoà‹´ÓùæU|Oâhê´ÅQRO[­Aˆ£™ÂŠïlëUlNN[9é#ÈŸÒʯã—_Ä;¶ú·M7ŸÏÓé´·ï– ôì•u|gÕµ
-g¥½˜º—*5¦Ê1¯'òe¹=ËÖû)ÝoPFê÷xLÒÝ2'¾Ù¹.ŽŽï¢˜ZbÆÚÄ”ÒÎBa·Ax`«üÜ„ü<Ÿ; ðh ð8ÇþÀß/ÝúrYh¯g&èJàÍôÉiä±¥õˆØQ>ÿêtŒ9¼¯êËO¹¤Uf«ÖWXUim? ùÊ|BYi!Cé!2SIïòKñíx{qŒ4.b~1~ýÀb¦yC„©ˆQ‚“qdÞÎ~^ƒë¼§µ&|î ŽÜjÕ‚¹r€ÊI-jIo\¹ÚFSìn5M§LqÛ²ëeuÍ” úËåÓ¡ÐîÜùO¥w%’)„z™ŸV5zFzÊ©µväkwQ’ÃaE2À°!Ž qWÌÌã¡àðI,ÀçÛŠŸw=ïŒ;Áµ Ñ‚[+=‹#Íy…MÒÓÊV·“ÝÌ2=bÚFdo?`ŸjÂL5}¡9 ¿h?J¾Æ5ªd5_o·š¬¶:ˆçyH» ÌQB‘«¥Ý:eÕi$Ãw]ѪØeÁhÕô¼ †ßæ½(èsël0æʳޜ#ëIÂ&ÜóÌV?ü;E3Ç2ë„cÌ`šJµÌðkŸ> :ôïZ&*uKpŸºíø -Sˆ õÅÜúàt¾r¦Âw6›—ÓD»{Ë87g&2Ú µÄx·”sѪÈêtQ#A³…XÉZüÂÃ}n]~•92yÕؤÏvXæ- ™ÃØŽ™f9Ü0ésrN{d:ìSÙ5š–‹ºcŒGõÖÝ¥uˆùRF/røäÒ9:/Éá;ä‹'É/šÎl¥·Nxؾó,„yo—·ef`×þ@=D§Ö,ßVR%­¢j®à(›Ç¹ÉQÒÒaYwæ3Íã¦Ê­K‹¯÷-÷Јº»Ú’ê£þŽÒ–½+ùj]2äHÂq2 âÄ!&E¾IrÓ‘=ë¿xöü ðY§ãà³îpNdï"Á‰t&ت­}ÓNÜd­ßm-½È¾Â·–<‹}å’]µ¤aZnÃ],¶NöM¦¥µlºSjyT¿Z,ýÀ”®öähØɼ¹’p‰‰Éß…ªv"`¦öÂgÏ]/ŽpÏåý<¶ÊjX)¶&Q{\0¢ÞÅs[^´r• å¶øóŽyÅJ£^«Õ$åoÚ‰s¤¸»e.°äð}4õþWø'ê§Â—h³ÈîV÷#j“ê_ #œCLÂ# TðyAoâ\êá¹y'ÂVÍ+ó¯=F\Øôˆå¶R6W-,éƒà:º_4´Q‚F(O´È)!‘'i×7Cä4^Qa´¡šXå"ܤoÚIA>ž®ùìú¼ý#{_&\_z­Ú-a6<W~õdƒ-2­Û¦@=ZÅ<i1Ÿ¯÷yl½s ·õsÕÓµšcB¸dn€6îù)ÊÏ:ä\Üœ‘Ë~R”DZoøÖ‘}¸§,úpZó&)ni÷š}¶JöÙ.¶auížR\²pàXù5…"À°õºŽ/Ærm4NÝMåœëK©ÑæK—¤ÊrgÁ§UvæãkÑ&fÆÄj ¡ÍvÃF¸œvˆ\ë–Slð}táÞ‰ˆ`­­/SôÙ—t|e‡w:—5ûŠÞK²#¹eíd™™ÁÎ+ãÎ?\ÆÎË™øµÛdâ·ö€²Ü.ÁÅ:b0H{äoЉ¾åÂ*gSéÝ€ÂÜuÚC/jôMÊä§5ûýhÑÁ‚èm¡G½›V9PÕξѪ—Í—¼R6CT«Ðd;hC…êj™öÓL±o29Q9ÿÀ Ô­@¨[š®§8V¡7c@ðÌ=Å™„0öAŒV€ ©tY‚¾1ßö@w€éáÆYkXþFQñI,NWï!O–Ô97 jØÒ³O¸Ó‰UpÅE»GQÚ Öocš¶¥Lî‰y€Ä¡r
-¾ž¢Ü¤°š
-¨âR
-ê†&Ì…úþè5XJ{dECÍäðÍ.·ÝJ®Gl -´}YÖáç TÍF‘XÐÚ;
-™DXóß!}r;½ݶ_9r¿à_ˆØÿ›èð–ûÕN‘º$õè
-Ñv­‰ÓM’ÏÍ6Ì^®›¼]ó â°
-qâ²¼UèçRÝKÐbÈØü–¹¹uè³X¿–fHTÅ>,¼bl¾dþYëïjYÿk^ý5†Þ¼ÜÎGávTãÓmóÏÎ9DHâ]bj“M~ÍÏ4iy+SÚâYËš ã˜-Ì#1ûŸüÕÇ«/Œû¯õÒþ]“«
-Ô4Þb®Yy¦aC©»u½Ž,[vmQêkض_®®«“Z5`–­JÒœu*5a7¬0—û4hª`ðOáXMûYºM:h©W¸ % 1 ?°?ô£¦oÎÆû$–b¥¦¸š_¬ÎÛL0I>;q0<ÜÙ!‡K[ÖëæPƒ£† ®³:2Ÿ/k>¶Jª5?U’úþùkɇÁþŽ¤ÝkùÜgø²ô&¥ÒmÌk¥žeXþ3Vè:%ßD«5/*µCÏ&Vãb\½.‹.+žÝE«¹¾xe]ìV°ut@?_À° î‹Ù¬Îàáë3ÝÍû4ßu¨çb^­åQ¥v;w‚è×+Ÿ»þ ,=ƒI©g†+ÿ9î}Ž.^äEÏÆ6 ¸èRG¬ˆì^´»hdy×ç)ÅY‡¬ù;l I?¨jÅuÏ>¬¡¹Ý «[Ï°Î Ñ
-™À’[`kÉ£°äJ¦À© ç›fo¥Xxk Ä÷ÚªTÚ§ ýÝ¥¸ë¿¶á†h3=/æúžŽz§]ŒO“¡»„f±‹»Ë•³a_‡j½.…„> uH
-l\ÈÙ-4OرÅ[—ÖDµ”ÌÆÊßãl9¯³Zh¾ŽÃر“™|Șķ´N6
-õnÙ(4ú6ÙOŠþÅhPÜi^:  D.¾™Y}eZØv1wU]bLx.aѳIèzaw̵ œHìVWœZW$¿²:‹Êþ¶¿sÉ?ðÉ3¯W¦À|Ó[Ä=Þ¤™Ò‚1¢f&WŸÓ³ºžfGÚÊ ­ n˜ºŒº­‘¾ZåàeŠÉK­0š~÷Fˆ¦H­g+€“÷sé¹,<äÐ8I}Ó,4!1°Û‹©kK¸gÛâ¦á[ÊÜ ò¾Ú4ßa»gæïݱ™éÏçÆTߧÇa|:èó
-Ùôäg¼ óî'd~`ni¯5®DKe¬†ìf¨ìØŠ¹Ê°•RKai2貕À:¦H2ì&:dZ#¡+Ç•öò õÇîëO¶úɬc:ïš^
-UO£Ùµ­²WY“/eZõI÷°/KÚ}bŠ#}d‹`<ñ„4 ø™;kðEt×áÑSvÌ-Ûìœ+Yé‘" Þ•Ý$—t uŠ`i½©0ûÜÇgêërá‚dž>)i'ØzÝzQi CŸtdŸ¢ña¸z4 âš ®þôråñ¶Ð†ÃI~Ìö;Fn°ªj•;ãý†·XrgpW$Ý® b¾¨ðB¡¬¨ü, >ÇŠ6Wj‰EŽ ¶Ò-4~`–v:=–®^¦ÌžE×i‡gžn¾éSé‚ÑmRiñ¹ÔµO†TW¯(_äc½çÈÇf× TbP*)½¨®e}ÅnD–ÈåQ$âêÆîn”Þ/ÓR)Ô‰s·¢rdz+wÍ”ôõF3õ‚ÀÏÅ´X©‰#†W•­â“ÙWÞÓ`r%úÔ$jtÛÔÃ1-á»%uÝ‚=ÕíjJU;ùD^üL–¶M¥¤I|$oAŒo1¾Y”bü¬mˆóy{mô¥±9»»ôËX[ƒPó©ÒÖÊ I\»Ò Éšbæ>RxÏ"x®ìlÓkŒ­6WÓèLúôh´äM-ê†í=ª»~Tȧ·Rèrð¨Ä¤1_&ÄÇ{]‰HÈg ë2b¨›5ñØ ë¸‹b1Ž,WlQ–Hl>ŽlØ医øúŽ»àðªî;,æ;…ú­pÎ`«üøŽõ5B·ÕÆΫÈjµçˆã jòówIfæÄ1sÀÐç‚CS·Fú¾ÏÈQÉ¡]6‰Ï¬\ ¢ú¸LØÜ*í+ èôèâq˜ã®]Xáh¶sÄ»ûó
-ái­š[_¨ LQ.˜z—å|pt‡®Ü¥of¹`à^rë}ïY‘¸ âa†x±oÊmi:ÇÝÙûVÂœHC¦ç
-±ü2¹µ•—™ÃpÏÓa¥ÊPšA’¤0<a÷IŸåH O[ GËŽ‡-¥vóoóÃ{§a.x½g9j¥ïÑ]¹õ@ëä5‡Ö©ßµÒPö~/!ÇAm„´Lä˜b!b¦Q@ZR'FŽ!{FŽù(?¥ì&væl ´iðÅÙð+|˽2|eo~Ñ?šl’è
-}Á·Õ{”Y„¿•>«Ý¬”O„Üf{Pr•êÍ@wÏO­ÈÊåÕzŠv9eVS¤•À[D¬åo)¶(Ü9å„£bzH„~Šó>ûP8Û2Fö¡)#X©]Ò
-VêBÚ¢ù¬“¶‚§¼m×æzPM‹’„ïøâºÜú½4™£¦¨Ô½³É<ïpLaé—1‰î‡œ†= i›‘†H`mÁ×ÍÓƒ»ÕßL{XeÔ0E7Ê>ûuvÐʳ†èe ÷uË@ãžbA–¶kg¦cm™q¬ó;ãÈ=13íLÃÌ´«,¡ÌvtòüÊØw¢z0Ñ¢6ÓØf¾/ßõnSœ ‡òÌ/ÍewåYžî”•í§•Ñƒî·=
-i/j,ÜÃ{rvHjÖØ× èÓ:PįËu¾52±õ2.lÄdÞÝÛ>
-ð:n¦0ݽjŠsà ~’¢›
-„åF_¿7#}zu2:e¼„tü§.¢¬V…ì;iÛ32,ÀgÛ¯G‘b'…áJmTUMÏÕ}tsc@%• n›= ³Âë?¶`JM•õ”F€F3@½¶  NuPgs¨ ¥8 &æ~ÓN§õA66›…€ÝcV¨ª=*OEm|áõúDm(åldgJ™Åqœ¾ÏÔ+:3(Z\€.]«€nà @• W•ág0“»/cüf¦Ñ»fÒï—âifä5
-"}o®¦Þïf¶
-î?6ܯtû^TbH} ì÷K <K ¢4TöîU_D¿«˜yƒ'Pý²Ô¤è÷þ%ôk¹ý&#Üôç0Ã{ã4ïõþ9€Å¦-Ïüè¹=IÓÃþ¨.âãwݬ_ïhexß[ûÞkóýÌ ûH’^Üø–×™ WÄuåW!1ó—·Z¶³TÃÝb(ùäŸpãv3¿øZW¿rèÿ ó~ßÕ½®Ù"v©^ó̹ñ,*§³Ùú]-Kt÷Vòö“…8¶äЫl˜‰Q_ós¦¹
-12\Þ¬·ìQÌhñ¬3Ó…qbóHâ·s¨§žfÎËzüæŽæ›pŒMcz }’”ªõI,&Ì.—û×YM.ƒcXÿe]sÚíÂtˆÍ±w{¨
-m,Œ÷›ê»yY7¡ð½’–•ì¯:Z-`óHàÈY¬ì äþ›À
-ëSr–ÉOjè»0aV°5Iø׿
-×ÇÒ‘èŒz¢8>»…åÐxvNƒÏð‘Ø™<7€b¹Ñ‹Ð6…—Þ/}7gÜþ
-ïÛ‡TµùڲΑӳB»:ÎßfÕ8ß+¶—y-7NÌçi{úÍaûñ0M›ÌÑŒÏv½ÊYn®ën”ñuÔ.uµ%u_iþÞ}hxãE«s]R7¥ùBÝ”ésŠÂ³·‚ù\sÌ›çJÃXÍü÷¶×ýÊ´}}`ûä;y[ì@šuÍ> ëÒÚù»Õ³òZ{æˆ]TLóxnñÜ5
-26²1ë3WZéEÖÛëè±qÑJbû©™V71D©4«*Êî8(*õq.üåTšË­ø~“Åz‡’ÅFP’Ŧ5O±=§xÜ; iMÊåîΛ¸’X7¡íä³aŽËdfz8gf4V6&GA7àôêÅ®œþ.Úò©Ziè64¬uÔ-è ÕÊ$ž*{:Y)õým§pMì*Ÿõ#‹“&]+QR˜->š†8Èñðž–ÎÂ;&paìދ¸xˆ…qÃ9 ïy5ýDn«%-S­^ë;ÿ3f&.yµmÍ”ó&lŒØŠu}²¢Ž ;V++uZ+Ã#QÝ-Y¥×#SiPGáv›’|ª_j²xº´¤k˜íK][˜HjÖ^þÀâ èïDƒ‹nÂût‡Ëf)Ê65~º‡Þi4FÜüóÞs 0F8oZ²8/vÇÜú¤Û²Ø©ÑÏOpr[ÏuãÂá½lå_øöL«ã¨›Îüj2¹*3¯ÐJãLà
-o´Üîçxéú†%Iµrºø„8[Äy_ø ùŠ0>Ö[‚ÕõHÜLøÊ®yÄÅÜ‚õ_œ÷ú}oLIl@†Kît†a’þ`ËÔ >ÃÔLXgjùì€IFQ’"96\~ñ.÷¢÷¦ˆûÑÝZMsBw}ÝOÖyuG°ŠÒœOx9 EJºõ¶9I=râPœ3§:àëÐÓ~?6§:ï‚­Í#“«Ç-¸ÊùŒØf×M}ÀfkÆR`™ît‹Þ™Zµ
-0PúË  |/éýÊ>
-9ÚbØE¼wŽÇÑoI¿…$ >6*߉lÿcþÍqHn‚M“$ÞßqjW(M]ÿfX¶S ¦‹w š$ TiŸ*5r_@ X!–y.^ïÏÖ 'Õ#]סøÎÍŽ£5´=þ³‹¾;æg'…$.àïæÙq‚n“inÿøí¿ÞÙÂøºmçí¿ä„ϹôbqôtŒe=¾8}‚Ç/´[ û+èÓšôîÇûm$#lµW”;gÐ\¼•ž˜Ô•ë¼}çûýÁõ–)/cM/©•µ<›;a}Êžíq.Ãa¥ÞÏûÊ{|Ù2㿹YÒjoÔÝ„\÷¹“´Iô2êêî2ûÚÅGòbn-ñó•ƒ+Óƒ[æ|éò ÿß´fÝùî\ÛQ½ô‘sI-öÊÉg†Æ¡øàÓ»Z´5·Ò¢ŸÝ¨/¾&¯S»° VyµŒê2û½Å<%·Nhõç+ËžÌÉi~1sÑæ!î;wÿìî _:á\|ElÚã [[Œƒ^:§ÂœŒÇ™Ñ+ú—ºú—ÞðØòãs‚COpÕŸîjïõhssêþ:(µÖëÔn|Z™§ñc1×
-¯yñ£G3æáé!ÏãS~ÍP~“&¿ù«˜0éðŒ2š¤>Nݱôh¤“ö:2_©òÐ7ÆöƒAY.û«"tí“Û"Ú‹[±LÏååY9wNñÿüsò¿ÄºúŠìùû׺
-WKýM–q癞m-ö;êiûÒfWøA'æ^›¨Gê¾*ŒGf€Ì†Ùðùë`ýÏ,ªË¹·-o=—¼=fû|w=öuùŠwšͶoEi«ÏœÕꧻåVêóî5G¶µnZHý h…9 ¿4üOîj¼Åë½µ27+‰\ýÏCü7´¿Êv°>9ïÓ=ŸKÝCy›êzthwšü­Ð¾5·­Þƒz«¯ßZ  ãÍšÁ°iFá¤áÛÁ¬a£ðº/™C=OòWoå¦B¯Ä6±Ú¶¾jÌ ¶ª‡N¥V埩{¾P÷<:fÝóXpÿIÖðÇ“'·ò†ÌÓγǬš§vGÜ}qèôÔ4ß­KÃÏtƒ<G±¼ˆzû°Þª I¹‡´Ú¶F¤kÌÍTMÚ©òw´àž»tÅmêJ½r*íJÇÌ ãN<ð«órß^Jáâù,Y¤ˆ£í@)úU¶T´¹Û¬h ËĈe–Ndy[3áÉýÞâ⦫F4:ëØRêÖ\&T=á<vÏ­óìu›J´©Üúð±Ò1ø{E}›ïr?cAeÊc¥‘c“% +±Åhå‰E¿ÔQ‹ð®™*Ì«~¶çÅüªq«åK2Ós¶ÝìÜqõå%waPγbN€¸xu¯‡ìcN@p,‹M$‰kHjlõÕÜ<)/®Ì®UnÝc©Ü7ë_šs‹~!ãáM¦U˜WªƒBžLc9®ó+ï¸Ï—„çÅÙ¶î÷¯CUy¿&@¢Ü¡O#9þMàöy¬°v3““³·YÙÈvœi>¬.^¦_Öƃž­ð
-7ׇ5ª|Þ–Å2ˆé×ÕxkÚbENÏÛ“L:¯¡µ4ö¬ŽÕà}2Jf1J–e¥Œ3‰å-KÜ{U86¦^}ã^žØ ‘»j¾Üz9¹zSMÛ-{«fïiKÈv*¬” æˆòƒfŒø^a…kʲFe-oY´]1ýšU3m¾Ô2á³×KÏ›Q:/û³4vß®U÷v0ÈWxKmGÌ;åZy\?Lû¢îåÂŒ.`źv^=fZ³\¸iÍŠÈþ ZÓÕ¼X¶¾Ö¬2»öý>xtîµ(§g¥v~“ΔL›y|Í”`Aü‘5§Íq,Ô@0.'¤ó¦(¦±(­%;6(¤`§¶ÇV1åÖÇÕ¸{eÅEC?|î=]ÈÞGÚAæZó¨í4¹îÞÔÎÇTÍ´7¤†2`W1^µ‰üAylMHyœ™–åqVÊãÊhÕGÂ%1)oæµk|µÌ¼^°iA¥¤—Í#olr9Ê  /Ô M‚Jí&&Ueœ~ô®¢.\šviC¦&?>Yõ>çŠj7¯¸ªŽgÊóÒê+ƒÖÔWÒÊe-çÈYÎä­wÜ‹A‚’rmD—PÕ+‹K‰…Eï$Æm(!%½Ëe eyY_æ×ÇJJ$ÇùÍs]·Õæ$oe's#]\ãrjÿ*0úéºO­›@k]4þ\”r‘T»û,­êµŠ  Î5UI7Û†ü‘'Y9Óäe(w­J3ôÓ”r+n ¡¥ÌL,Ü[{‘èaã(˜@¯Z2¿/#¾¦Œ<ðîÔ?cÜið(þ ÜiXíóÜë¾ðº¼/ùÐyäð“r-3Ò³9›{)ƒÙ]$=¾û1šÚŸajªeBÊëþy+&ºyËŸá’'Ò“¡Î”fZÀIè"’Åe‘L‰ERŠ»$‘Øšy¡Âf+ýìµøý`?âkEbŶú™ktf€“tšg¯¯Í¶Wr‡UK« Ð%ˆ ˜ZŽ XºËªnkVmœémÑ ;û6Wª–?TsF|äë?¨~>EMcQZ ×mLöõO$ÃÅáKšÝœ‡„±ÙP\.ò@$ * ¦Äð5¯$ð¼1Ò¹Ó{eqñ-ÏI¦ÆÞ˜l—m“«. #Ó'ôðeR× C‡Ý¢GÚ®A›/{IEÃèMEcÌ¢Í÷¾E›ÑwÕíi7¶v?¼Q7ß©#DiÚ¬
-Êß„vxÄU§öÉv*ïïäbþ „!Ï÷‚ˆk„ˆ“Foœí€7ͪ{Vd‚š¡3ýTÓfRá¼L‡«¨EÊ꘶”Þ–0ô¤üy…¤ìïg±['ç7jNæ;ÛÌwi2_+ÖPr¾M*2YåY]èeÞòµ’^3·lJè!šú´Ó¼ÊRZ`<"–üÉGp©'ï•Wî¼ïŸÙÛ¹ó`5¹2Á½1†Þ…éÑ°‹Çräh«âë (Á¤ü{©@ÙÝ‘G!¹p@.øìšÌŸgwo1±Î,SDÖ«5?Nñ]Á ð]±™ÂwS#¨Ñd”„R;Bt¿·±ËÏ3ºüzjÊ{@sñY™ƒz¤¸6#XpŸµ7/L°€“{þ•ÕFö‰
-_k€‘  Òùïô*=oÊd¦±´€²ÐPrO
-WT|îÿ1ïçƒæªÅ?âoÅà`@åõ¸†~+¾Í< OPO\4kY€Ö:y@»¡èjªÿS0}´ÓF
-Ð4¿wý^E{ªu`jòBî—~ýÞºB¤èiT‘ÉŠ ¸ä4Y´OÉ4bé8 å'c"®¦ŒÿAåì…tð€ö)ñ»•­o6ê˜Þ`3*¦™ªfÕë
-iW˜(Óu(2údðÑ6ÑÁ<•†pKý!îå6ý<9AÉ ¼ýgn}¼ÿãÆCÀ/‘à_öúüöÁÛq@è3V,Ëê™%ŠÈæåëd¿ÚÙæ±$FDä{p‹ ŸVZ;Ó2~å¸:lŸò°ón8ñÞ‘r%%Õ$Ñ EN
- U6 iåtŽ•\ï:áµ3ߧŸR‹h4/ñª —uÎ?¹Úoe¿y_kò¯!ù_„ÃïæùË?‚ûÇoçËð¿¸ÿ‡nrÿ¥¶¹ï碄—"PÞV'–`”O/Ê-¥
-;222Ÿ>ôÓ,5Ì~4~0Ïjÿ—Àš·{ÛrÇí1ûC¯ë ä²snÕ)à…öméµ;éÅ*þßqÝ2àôì;•)OøY[_žœÌÈZf/cÆøu>™?5îóWy4’÷ú0ê^3è'–‡ÙP¯°)Ñê“‹O·çŸa÷PyMºüá1ë4…ë²#]›vG¹îжúø\ZýÔçÑJ½¹¨9ʨX#šù† ú¼ô(Õ±}ºï­jÏ“WYÝ#¯çÆ¿ÔÕš«Î‰½6‰BHbV›<ÄßcV_GDç\m>;ÒÉ{·;Ri«·5Ý
-:÷ø¼\´¦ù¹¤~ö’mÀó£SŸçïñF××[•ïžW¢ß­Ú¶öîÕ\W-j^õcçž{îÝ•Â)TéX︫hP)Sî;·fÙÀ÷—R¸9)eƒÌäþIRãÔCÒlâ¬íz”uhíê¢aƒá°Ž-k¾GnyÍeu,ÃS9îƒê¡þŠªüõ›í6Õp¥'ÌT:FÄWÔ&—û™H-0f”Â9Ÿ-Y8Ÿ/FkÓ-Ú´Ó,Âûá¨çOëüªEßó%¥‡çÉ€ÐmÿÒrÜtôr¶Ã³”Hž|…qÿ’|È Onßê»uR^Íeü†{n±n9ŽËåT´¨—Fö¸Y²u¯-î“b´dWE›dwEx« yV¾°£ñ̯êö'_Ëpž¼ÖqÇU«Ôê0A—Ïú 5Ç¿w¦}ž E[†µfö6M³ž2ÁÆC2}—IeúÕŒŸé×äw&Øw±D†QgÿI*¬çQ³ç6¤R
-}Ñ.Úø$]Àö©ø.–'ϒ鸲d;Ì]ÍçÝl%–^3çé³^ŽmFvÓÜLm):-³7ÿ±Ívì×!«¡è5Ó/BŒAÒo+ܦkäVh3:ödÓ¯_3&|ãªéygwé¼NÒØkŠ¦±p”KcïÍ*}ÒA:Ÿ.üRù<m ÜfK«•
-"ûèé-a¶zIã|*­ÎßÏä _ã©-Ï­Ø#w* NÜQ7öZ•_?(«œäˆy42(Ó“Ê£Gc‘~ùÇ=Ì!9Úä¬*5ix]*kK
-ætrsŒÄø¬A,Ï×QlUçD±bDDÑ•ÓÄr»ª”`¬Ôµo©WÉ‚Û«ôן\]‹š(Å‚Rp|C†"¹`î3^y¾gï¹Æ
-¬Ùëmº`Uv°fÇéžI‰ƒ#ýºN¯´©ŽÔ'Ø}¨Éüï›MS°˜“ÉÙµk’Îä÷b$f -bÅögYÎøÖôPÜ°†3Óž‹qŠRï;wg^9q§gƒæ¦hbÁ(­Ÿ—]A5Œ=)Û)W~;˜wxãâÛò‘½5ñm¼ÇÔínÅô‘úœÓ¹mNrʇÓ;
-Î+ÒY‹gkž± ±Ê\I¢£Aâ«ïÖëæq×x6pæcL°Ãf{Â<7¾É
-ìYÅ®á¢ç3=;‹fóøB›å©Šž7F1‰¥Î„»^!M ®¡Ëf]PF—%™<.'lŸÎ‹÷Z·'óù#ÜÞ[Æ`§+Ú"Ò3Êf Ÿœ{ЂÄÞÄ–(YŸAAèéÅ·3µÜgùŠ ‹y£Šy벃 å…‡^TvŒ6ƒÎ•pË\Fîfª„t¢Óé‚î éB- ¹«”ãxéu3ÐbÞp×yCÓ:>¾ÂL¡ž<Ü'°uóÅ5÷ó+«•äc¸÷-mêKÊ®ˆq·í<âc¹´œâîn³ÂŽúrƒy¯ý«cÄVbˆ^JYmÉC&–‡‚Ê.ƒÜg­ø
-ƒtKÑqm ?׫<¨Xœfn98Ͷ{Ðû¤œ ÷Š‹¿†­3¹f»Û°SuRuHN©Vçe¤WÄEÊß^Ø0OöÌ
-Ðó…
-Us5’Z~¯M`^hv­œ
-àWòðÍ<þ5¶À§úà3<xŸŠßÜ?´Œ½[¬h)ÌÊÈŽ˜Sþ°·ãìcâÅ+%úsBÊɹbáWœŸ¯Ï˜ôîž'”;Âï”x€¦Òcðçò
-±xÍX~öK
-hß5}›ç
-ØÓÈì9;ìšû
-­¾Ôt6@[Ø(ÐQêHè+»ð^¯(°çœ8’ÁŠÙqA|·Ö•+’ùAop‘»¹já<"3•SöHWXëáí·©I}w°Íí9ç´·Ò2ÛÛ¨[i°î³Òd5™ùÒWÉÍîKç66Ã99+a3Û*S–ÊþÙKŸ“p4•àÐÞ¶¶½ü ý>"ŸXW“ÐЫ:é­“iYÇ9îÅÛù²ßjákWû\À¦ƒ·ÕˆçÐeööÂÎóDÍ‹Ÿ3Ûf'ü—\͇ÒÔÃ{ê”_O ¿I­É­6q&êyY§îËÆh¤?†ÃhÄ­‡ð4wäÑÙ_•Ö•~‰Þ’â:ç.»KæO5ù8M8h2Ûéæ1ÿMF<­S[É^­­3_¥:…99ê»3Ì[ÓCn;ð›äh2QÞ|œºæW£‘šß £¾}fßÖe0Ïñ–!ëÙ_9Æ»O®ÒPo[*à=fWe»×U~ÐNS[í[ç^i«/¡×ê›ýmË
-‹KɊϢ;óEøt[æ-’¥–*äGÿ÷3Ð=”JǸ..îøØXcº{nuWzØÝJ'e biNcÙn*jx;–ûÖíúŸ'ùÏa1Z>AÑ&ïHÞ¾‰Â¼Š0…<G ì$«ù’¤¥óä­ä8®Ö©~éèóÜËy&¿úN
-icÕ©f’Öʧ¶ƒj1å¦[nŠù êúa²èè^ö8Ôø=ÓÎ v«5 ù›zÛt¢TíTžŒª±yS ŽA]é7K¥ßt ¥ß””~Ûö•àÚ_&Çb¹?ó¥}%½lÁ²Ve<½`Qšd^©íìqK¹©ëC?Œ®¡îYH@¯ùÿCByZk:*¯É˜)«·•£«RÅT5ªa+ÁnXTúÕeUO›¦<j¼²%‹ )ºWO’ß=~$;•æ$8<Úâ|œïˆó sç~VçS1>Æ$Œ‡Uï°m‘…˜·/ÛP·Æ³7—Ž,Å1…vY=M¾·¯jçÅUMŒNJ° /J¿Þƒ‰9<bïX4XÕ-\¶D›’ü¶ÅJ¶ZŠW}xš8ï,1oló"öŽjÂj"u…R¶6(øtâ· âÝÂIæY²PâYŠŠWì4üæY†´béÕ*:d5ò4½±3/±©¤— J¥ªñNk]ˆðU^\í&Ç ÈIÎd{ü½4Åݽd—­ƒ„@ÚQœ÷„“˜Oi7 ­§°å?BɪÂZ8¿ŽÞÍ­EžEŸ)î°bsœW²]N F]ö¼‡—?(Ûì5¬l`s»´MævUšÌ톘Ûåcñ³¥ñ
-x¹úʱ¬ £IFÕÉ$ÿ^yu7O9sã/Rî°=ˆ…u~#l v%”kÈZ(ó`+PÃKÜ‹ñ;é¸çYw¼çŽÈøÄy‹Å
-»'{ãEoóF`¬ìë s·Ë2ÓEÆ&£ß%úÙ0ÚôÀœÏé4àoÔ{:'¨±£±<ê”õ®¯(ëÓ"(ë†Äk˜"ªµ*¶²ãMÓÁÞBŠû|pµW¦?ò¤Q{Hèáv6åü–ß;`ÉsÃÅŒ«ßZ±lKNÔê+ö²È­ØV!·aî}Çt³™£3Õ;ý<tCzà;ÝkÚxÔûCÔx“3¨Le\  i‘ÓgiFæ·+±ˆ,,–È
-ÓF nAy%c ç7¢^ʼ‡TÜ~M9]R÷˜2œ¾ÞÒlkޅͺ¯-ùšC­¹†¹˜³×NÙg•£8fz"1aôñÇgô6:§_ôgA§kõá?;jü¦ÏTf¬<((“û3¨‘¹ýž#–üK#
-Ý!ˆñ¸o²ˆÓï÷bû:‚a5±ŸÂjRÊøíu‰q»ŠÕè²âÔèOÁú\GºÁèuVS½!*O^›P\!ÌM`2Í×>Wl»Óš1½:7¦_—×6éÍš8½!• £”‚FmŸœÉµ)‰NKb™îˆ"º<Äòà›ø¦‡Wä,…Ó÷žŒí§¯,Vsô*ÆcÓÆ Ö m´vÚh—4TR#•ØṞ
-*5ë}ä–AvHêDˆ:gãK„1*À½:„{‘Âtåìöhè˜XÞP¿·2RLX¶—À¬®É{&p§ñYI‡…ô”ŠÊŸ1;½>‰Yj‡(NɾE‚6În=¬¶9 0¾LгÍÑÆ“Ü M¤xA¥Eû‰Üêg¹5x阢F§L•6lpã%ž¿³Ÿ QsÇAmØ Ú=Í÷wÈBÚt¶w¯äÒä˜R´ŽMв_c ±¤9O^€Fg¶S¢vŒ –´ùQ¦Töq‘NØèÅ;W¨EmìP8´1þsî}©uö7Là#·C0C:uxh"s€ƒó€û“v•½YF†¬º“…@úT~”žÛ?Þ
-¸f¯sN˜7=ªW”ßæ¦ä¼¶«f¥O÷TgžQó
-AmNÎ}äÎœGˆÖ?Làþ{5…ÞåíÓ·dà ˜ü—Ùï<±Ïd#Y±Lª
-Ò+–&K
-j `éÏ
-`Ò‡
-ÿ/즬3 ǹhW×Csì–Ó¯£»;™¢Ê©æ#)Òœ@‚Å5¾o€µ‚À&d¼«¹اr¸¸¼Çò.Ih,56–k
-àrºË® pÅÞ
-àÏÞìþ
-àÇL ðåÍðÙzü‚–‘
-ÈÚ3Š‡4ôØ
-üÁ´ÊÜï••k(©óˆ¸¦OÙÃ2{X)E{ÏŒÈÜŽ÷ÃüVZŠuã—×}fT]Ï[F-¯õƒ.á^©·ÀFùñ¼¼åÌEû§©G®B¿É!ôäÖèd'ê}¶I¢`V›ÌŸJÜ¡¿$´¸¿\zmzË_Þøõ¯V’5ÙÕÞÇxu±mBëù¶ ã‡MG®«7½/æZú1/~è×Ì…¡ÏôàDÐïܬ&“[õLMÔÓ™÷¥ƒ8
-;gmd>kè›paûR}€-œQ¿DÌv=—%¢´{¨¿¬.G–éùÜ$8´>¯Vú‰;4)ï?•öºOš¹…óдãå)¿~“X“[ešŸt˜KuÜŽÍ‘ùw†Ù°;Ì­Ö8™–ÕšõKh}ÙÛËë³-캷zêòÇê­Ó«Ïö­]Új0Ä[}c/4à a5-¸Pmøùã¤o¼g}îž uì¤v«‡¾çÅçÉ»œÀФ¸ô7wõ›iúKkáAí•›ö˜ÕùÕåw«O,o´Ëï5¶s®ååvG–µV_§Œ¸f`5¢ÉÛnø6RhÀ P®Ï x­Žm†·ªP<Pƒ´¶õ´i¹Ø›ª§x÷Ü[E®ô¦¸J'ãe*ÌwËÁ¢'1«¥‘Kg“ç÷&šLñJfd%Å%¨1Á¡‰«Ñ[ÕW"‹³ïV\gKoËéVcŽ×WÕ¯‘{nßW
-ÎxåÖèŠú¾qå`ˆ‰µÎ"£4Ê“Ùb´f
-E¿lÖŠð¾Ò-Ä Â¼€]èk¾¤4Ð<ЩÔÙ¾ãšyÜa¢‘<¿oŸ2ó_ñ^\Ù©ò­ú‹Cwh´àŠE¿ Wc)4bôb¹øExsYü{’?I7½œòäåys¶mðt\ÿä}Êy‡çøwúû$A±eh`e;αœÕp­Ÿé—GÛŒÁH‘¢”žê[+<ëpòü~fÚ_e±{2»ëMhm¹oœÂ¼\IåK<¬$84Ç?K¢}tt»™î§cYec ‹vÓäkÙ›Ï7³[íf5Äfúuœ1sf…ge*µ½e1½‹é{ÃàË`…0á+L¦çí¬’Æ‚aÎX è¶QJO7å Ôv:rSÛÙìËõšHâON`widÙ<y
-äÄ°š f-Ì
-W
-lY
-™~ž[áh*‹¥ Å2H™ðij¥óÒØNc·EÁXuv£¤]<ƒ|>[©íôR®ISL¤-t϶vº€tîÚyq´fQã5™\Ùêm—j«êkÿ¥£µ«j¢ÖS;õÃ:‘ä“.§¢t.©1{_ȸ²¸mÍ‹¹§QRÑ{jÛ;]SL¸¹ÿ’ÐÃèý:B½ Ç’et*
-ÚyVS¾U§Òþ?ÚÎsQQlíÖWàE `Î9ç,$gPTôϹú3qUíêÝ»º¿U© m\Ý>ŒaÎáË´g:5ÏP†µzZœTý½µ¬²«+^m2\åqîißž*ÝJð,¿®«BYbáQyÐâÙò ]ʃÎ}Xt5ˆù{OÆ™~cP)¥³¤ ¥3±–áï û¡»u|U8Ô<ͳjõ¤jV}˶«ìâ|þš„>®ÕV.
-)µ1)uF±>}³m0ͼWÌzÇÞ¥dÀ‡yr!9r0‘²àºM?•5•Žò),5|=°¤^7Ðd¥Ð„U±ÄÜša‰L¿‹Å±.dÉÄW*%ÄWöYçјœJå ‚>©RÏ9¤$ÕÀµv—â &óI®ž¶û8wE\j1&3žÇ˜lY5ìû³×vñZ+sª¦Þù|Y‘j^q1ßò岩e¯·ž”áˆÓ6Ý/ôÉԨÒӜºIX(vDd,0ý;,h|«lây6½AÐG°A°D‘DJ΀B)°K¨—“ýf
-k¥»Ï‘;YË<’I!-* “RŒ&™Ô%¸e7‰Ìs É€ó+äÄæ6Hé¬aׄ1˜œÃ\Ë$À‘»^ë 03’kŽ~”3s±h‡À Ы
-f7¢ß_C}öª@±6˜ÉÅ:+_ÆP¬bHP,ÃQ+]n`â3Yy5Ü ”ûNþ\(î²~PÁçåyÇš“ŠƒSL2•Û¡‰Å„Eãk \ìPä¤æÖ¶Ém`7€7pma1æÑGÃ!£Ü=ØF;FN†^³®IÖ…úïÅ”VÈû^јÚYyPM»C1n^‚b|qÅÀŠ~¬=Åo¥:é•þéÁÙÉ—ô.Û<®ÔwâRãk&üy%"aÝvX"Û–ðøšœ¡ñB­»‰ ¦V6°WLFFcÍË ‹vƒ$Ì$¡AyÏ@1ï&B0T7PÇ ‚3ËG‚³Ø‚s% È-€`D¨@p|Ѓ¦ÅÜpŃÖbokl‘‹¿Ó ›ªtÎÕ^7+÷{ÊGæç§LrzÉ’‰ÅñLÄí$‹Å äE0¿¾†½ À¬94ÖªÂXBL‚;ÁÓ#$
-|Äö ˜¨D!XP ,–{@,ðçÒÜ€`:ö€¼VÁ¶1s„à “¯ï]åç ¤4,îïUC²,åX™ni¨¦cÌ,’ÆlÄ$Sr–Jd5o’,Šàµ`´»¸Þªlb-"F¡Õ ü¿9`%|
-(‰·@º"\‡Âù!Ŭÿ5^~” ¤4íCH9J„yrY0!$=»š©·!$ú"!Ø¿ƒ½:^+uo®¡ƒu ~¯q’»Äg§lkp´Ò’XUR*sÞÑ|b9L…©üGpG‘Ê‚Âàº:F£‘
-U$€S
-g 8¡Fó!CñgA‡¥éþKoðöîC .
-”D (9ñrP²£Ï¡d…Ö¡d†N@ɘ½y¯ï](¡|ŒÇÂŽïà)íÉ̦mƱÊókæÝ!ÕhLËJP"“¾"ô¯¡ò÷òÛÕ JuAéRD4þ^Ñ!Ì`ƒmÈ­ ¥ÜúˆÊ@)¯fA©Ý!€Ròº ¥˜öJmŠ{(Õ†’PªÜÁ‹ët3õe¡5þÈDé±÷^…%~NÌ_oε -‡¡cGÌü+Tš~É“ÁµäKGðßÜ^Ø«å¡L..Ç;ëBʘB:…C™ÕZ‚2ÃçÊ4IÊKá/åe’ ¥];\#XÊAiš[¬ðMNvHæùxkœü‹‹P¦àÄ„fûM¨«ýáÓÒ;º5öÁšp­í÷baómø.ï¸tqûº|Â;ž|‡·œ×‡²ÎÊ,Êʵæ{(W¼< \ ÍCÙWbe½3ee·²ëEÊŽÛháœ^ç²…¿]¸ÞønpGèIâöÑCýAúôõΓßÍÀïˆ4L‘?º€ÿ{‡/K8„‰é·èöc¥‚vÛ¶*èƒ#Tà¤;TÀsi¨ÐåÛP!SàBôjBy[¡üvÕ…òX…Î׋Â{áì÷šÙÈu)Çb¢;üº"Gؤü—<ùK:úŽ’ÿ³„ÃÅ·ðöJ~ûý´wbú^4á[jKÄõmTng³P9¹nB¥²‚J»­ •V•0·,5‚T*K¨,´l¯³(§2‚þc7{Ý‚ô—¸;lR~wK¤Ûo¤w:ú^x÷Ú¾{ß ÿYx7 ߥk¾¬+û-·}/.ûKß9é,Zúø²ê9XBUs#@UìAµÆ'¡*ÜïC=ÉAÌtÓ©úúcmXèJhþ*†+„d1¾ùQ· ýoÿ§Ûö£ ù[nûm͆7È·
-¦ag
-Ž)¦G5¦,×L³ÛkðØóeéð6#± î“è t™P†›²®ŠeÄ×î—kÚ¨±fÍ®­ct!íÓZÛ9LfyÄV²Píø<žgç&®lªFÜó}üŠ ¡éÅë|ú:r'ïQso<:Kþ6ÍËÞìÿAÁØZAáÕ6üÿõñ¯.Oôi‰ýŠAN›î.‘-‚äô˧ÆE±3ñu&`R®Ñ.;à@#…“r­ObTNÉcª2×̪œJÞkÁþžm46ûnxÈ¢­Óu­€árÏëκ%0ìi1¸Ž\o1lÏt~ÄdéãØ=Í£ÓÑ*Ï–õìxnÜŸôŽÖª7áœÛ\­Q+¯ª¾)&Tbçúpï’ô°Å5áµZ²w¥+pµIÌx<‹ öáZ“f·ÛBÖø¯FûÜÒë¨Î˜½²á-‹c«XˆÑ»¥ãZ‡ÄëÙCe_:Š~tz¤×”S³{fxhß½cÎ^ÁåwðÍåòöø˜F þçB3ë±úÄ.Çûø9§‘ây{¶‹,ÿÁPrº÷3©¸9­¦cþsڻʅ4 l’ô«Ô*`&þž9Ùë–Ç`U6p[¬Â5ñ\ëÞÉxxH·€ËÞ^›w»;›µ3}yb¯F =O ¬µH0+sÍÔ:vÆ/•ý<#¦¶8WC›8•0(
-oùÌ–ó—ðá7Š-tÿLü‹ãdf3ûe†=øÖ:F„ 2¦µNÄ^‘¶í—gü´h]*ÀÊ­ †Ÿb\‡Ö§(W­¡--× ¶]R²;OØ—Oþå[Þ Ç`0;9¦>ÿ*ZÖ:KçêHÀÔ`:Ü)ƒvé)Ç×çÔæºMÃàZ‰Åˆ#
-`ÜWv«¹wF± ±ëï‘òí¹=èýc÷زOÛ”Ù³c×…a­kt^§ù ª
-©öN‰=“OÉ(IqA§A¹ÅĹëËk{íÎì½Ü˜gI¹Ò²]s©dÚpÞA¾=ÿe±áè¼{„Ðâá؃WÃxÔÑÍ~/§Ý¡êF…–™<î]izæAÍoNŒÇú•'W= ÷mcßðÙ¶æzL´?u(íñ8’sš²?+ä³yP•^Ç–Û¹½-Oª½a¤t³ää³Z»Ý(rìiÉñ«~w•"Úü‹smø±eº+P¶}{ºLÏeN4²ÉH+-툕޲~£D÷Ãa¼nwlX¸Y6ì&ëûÔk§Õý)£
-ÛÓFÇ–) w³tX)ήV8ú,·*9Œ89éQ¬ ’üÙ$™ŽŸÊií›D¿møI9$
-ÕöA›_ÌäêÖvË®è—U!—[ƒ‘ÒØäLqÇ÷}aƒÄ^œ—­ß¶Í.á0Ï;r¤’ÜSÓbÜ iU#òz]ÆÜÅíÇ$‚|âöÆ£Ô:$®¦¾Ÿkƒ¶­½ëçØ­¥™ÒÔ[Ž¹üyb[¿xl‡ž˜XÒÚQºÚÔÁ1¶èÚ
-±â2^z%¬ê›üï–²OÏÆ~Þ$ôݪ’­ž"ËŠ’ðsrÂI­…cj'óçãîÌy$~e3íÄôõäŽ2bk\ð/™XÓ¼ˆcÜ@ÀH
-Ú¢ÌFfÿ&ä{[HvKïZÛ­º%Í*ÞÔ²ö Yž(|Q8bã9Ǹ"Sâl¿e7•3# ';:.
-Äï“HvjÄ ÉŽ¦ 3¢$e‡ªÊ5Æ¥ †CÂ'#C[‰´A¥k®DØÎ0®|£0žFýÝ€D[¹"±áDZ~™{ü{Aþñ¥OˆQ¿úuí·ueÒvK<õ¯Ù¨¬=iRÚtâx_Rf' £Ìr[&s]ÀñC–Á(}G¡· —3rÃkE|Ó¤ñµdÞ°Ÿ°/ÿô’&à›†Š4ê†X2›qV™äšÔ!$²0™ÆˆSkG[\‘9Ûeqg¾f±Ë(K£·Ž£-‰Â7<Æ6]­ ÞeMêøz Bèï–×è±·;-‚ñؽA_Qo^(ž¬t/§Ýs­“¤ª5nOå’É—"0Ó›q/_HìURµÊEŠ›GW42´+N™ùELÅÛ¾`áÕ‡°H× ¿IùÞÖOÈ7ÐO`F_ý„|_~ô˜`Ìÿ« ŸÀsä?[øŸ®þû ªÿg ÿý}ùÝ…c‚wù³…c‚YÒŸ-üÏTÿ'ý£¾?[øÿÙ—?Rø7æOŸ-ÈOpÝÿ³…ÿÁêÿŠŸäþ¯ûòç
-ÿÓgËð³Í„˜ÐÌfåYzcFœæµÿ½ÿÔÿ¨'Uá@'Á2JoÐ@È\ÊÐ'ìËÿýG7Œ4pÐí><m
-ÆBV:‰åU­ ç=µíÆ!¥Ç¬Ÿòp ¤InsÍRú&¦{û›°;lÜ£÷à7PòÅäfbKºâó-äÛóŸ”ÌNžxݸ¼µöæëzˆy1£K€™Q"
-õ£ìvë>Èï?(MÈ”æPÈIäŸ_ºŽú
-ê‹ú€ž¸¹7?tCP=gœ»I
-ë
-ó%åm¯•É“½çÃõΙÞbq¡4ÃwÉùŠwÉÌðñø=r™n¦K¿õÀ»€ƒ`= ­ƒ•ÝëYã<Ë„ UYkJ=
-ÛÆ¥}ažèáL+µÑ‘šœý=qÈMõæÖ!ëÇ%ÌÇþw«[ª£«òÊû~,Õ{‹Ì
-Y%.¸ÁŸµËQµÙ•å+ò‰V“®AMí…Jfg‘( Y/O»VëL蘺g6„ð›Ä–zóÊÉá²»!ðšk KpŒí2‹¤ÓhKJï}œÇ…£È™½mÓ'f€´MÊè+
-¹Lt$b§q„Ýb^gÀ þ A£MöHn¸@¦þQ€cÿúúßä Ž2[
-.ì±ÏS¶œŒ’»l©{—Ì_ç‰\n½½Õ` Š°ÉB¹£Ç|˜'ïXR
-sF?ÓgÀˆm¬æui”Í%¨ñBn:ŽFüŠ€}ùÏó½ÁÝs‡ñuK4÷i<»QF‰þ…¯Ö„0ó ÍPš‘!YùHg‹«ü‘2ž1@¨óVO-)”]¶(´§?¢ÆD‘ø=²Ûí”Ô>m4Ðݪ[† : ÏyžÀºÊ ¼»hmX%èñ©ÇSfª*“KÕˆb¯Éâ•áƒÆ(N¥Ppìhk0 7ü6mºm_K‚óH˜(þŸô˾-âZ?`f5¹„¤•M6Y¸¹gèTŠ‹Rs”iSi×Z‘ûÅ•&÷ƒ¤Hlf‹W˜, ÎÉÔýA£·²D -jƒo‚úŒØt·u|•ÒØZrá_—p_ÀƒY!cqƒ^”qerª\·ƒn¡Jfæ˜ à¡Ž{ä"†“,VÃÉ"7Æ«³Â£ò
-mw¼ÕF ø妗Û,7Ðq¶ZË“Öj=LVVkØÊ­WZZE÷Ã/‹¾-°I-š^b\ð¬L&¿(Þ¡>À:í9¨ -V­ÍàZ
-6p¡–YÔ.·ÜM–…e–¬k.ÏÏñcyŽfe^î
-Õ™ÑÕ™{¡ë3’F?#ä&ƒô3(ù]®O'’Wa3“£”<lub‰ì´Ë1ÕêÁ骲ב§<N¾£tv›S‘_¹úI·‰³Ü Ž'9:—I¾®$¶¾4 ¨ñ“û¯HùeÐO`‚߯‚~Ì‘ôSŽý2è'0Aõÿláߘaõÿhá?åØïñÌ‘ÿláÿ¯}ù$Pý?[ø7fXý?Zø_«þù ªÿg ÿ/ûò»Ï  ú²ð‰ (
-íy¹±@ 1ó9€–N!hÔÒh-sQoæÁW[‡ÑEáuß•_ÒÆ‘ûZî,Ç—³¤š# ¯¨+!£ÉEBšèCLVaN'ýoAþ¶á”â{*(%Ò
-@™‘Qš¸
-˜‰‡!(þ LèöpÌöôÖ’_A)ø©¹”^+çè²}Q^¥ZLVç¤4í¶bæ¨%xÔÂÛkz±Ûí) e¶ìS“y* ’™Þ%­ï.ľ̺¿"êŒÆ¾`:½sº?ú8bŠ£b”nwR¯u2ªÖ”†
-=ÉÆ”9ybàŠ<{%Y*Me$âXä8Ü©vì’PXÛ‘aÔH†Q#± r|ÓE‹ï¨кöYy'Šÿ³uotè GÎ:ëf…Zu:`³£
-Úä@7â†8²M— ^QÊFÇcz›žÉwç%8ÃMØ€9ÃÃÎKl-'‹ÀQ+ýŠì–õI°[¾ž=ãš$ 0ºÀwÛ clý6A–W ìfµ ¬5n<ÐÑϡ꺵y>RíM¿ì÷Ö#ï®‘í¬·š<ë=pùÊõ—V-1Xηþ2³v‹CÜ e?ú&äo>!æÙ¼û&¸hö¤ƒ—زºOäIbójb <Ý(þZëÕ’µžŒª·UzçÑÅ2‡âð¢Ø¯Äç8 'fÞù˜œQ3-5«CÛôÔ—éì”mÌ3Óæ}’›<°vH¯ðCAþ¶Á¨¯™›’Ä ÚV±p“ÂãQçÄNÒÔh=óli++~Q¦îÚŒæ”g±ëŸ'Ñ•äŒÃüyŒtf—‘æu¯£ Õ3¾Q2W¼ Í#ÙÎ'‰'ôëW$(V&+ ûsP¸&;AaT²Àgxi@öM*VÍ¥vÀŒåJº3HôŠ–ô4JàÎZíÚ9«ÌÝ?ªÍŽzRîÒò¨ppÅV¶ÇâIiOg¥]‚]9° « †þbö·oæ/ÿ½áßå{ ŸÀŒ ¿ ú ùë¾ü$è'0Á|ÿWA?Aþpá°ú¿âgùÃ…ÿë¾ü¹Â¿1Á»üÙ¿1ÁùÏþóÕÿe?Aõÿlá¿ì `.ƒb÷‚‚á\a”7/ˆ\|ÙÛeºjæ&
-
-àÝŠGYl'¹g9Z•]9Õ|If´‡˜¸”.BúvwþQ"È¿¿'ÀÏ™sŠ™
- \…~:Ç°úoÐCã? ûŠ™‡õÕGJ¼2¦ÆäJa·-ò
-sÛ@–½»4¾o¢á7a·^Ý„,Þxñ…a
-ÞÖjSŸ¹)‡~^ìÝoH`<ö~øqùÊ_À±ÚË¿1M€™¾`æôe†Ò:™Ê€1ÿGÿr'Yˆ*½}tÛ&Ž3p†$nk¢O¾•á-U²cÌcܼÑä)åÎ1?!`.ö­ÿšiаðûÐO;­ë‹0¥t²S2ÞM¬j§T€þšÚÞ訰êGc<Zãï¦y&¨©0=èÅ}jœWϤÑYîÉ©70R
-zÏ„jÚÖ½é~^e(cÚñhÏ,6ѵAl¢"çò¶”z,ÂoßÞ÷ ×6ð•í¬Ú':›šdR•ð†n½²š°¹ „¸édd}Éõó†[ÔO?$a:úõ9`¤çAñ‚¢Y­ƒÓh[ó¦øawî ÄÊ^“u0¶p&jp¯²Òì05…Í*æñe—¿…·vŸ™XûjQ©VY!
- üË ÝÍ"Í„}}Õ »™!¿î¶ÚºÏÂöO
- Ü΃R˜N`·š—Ú`Ôg³éËÚ«óœÎÄ«=É$
-¸°ÙíTÎs7öÖW[îûÖnʨq*™%âÒÇ]Ý5*͆·_SëWuE¯û –(!·„ü7‰ ßÛú= Jq€¡= íPa®]£±wj<3¾yòÛ1yÂø-¡èÍPŽz¶Ä-«æL–çpŒÑã2¢‘»ÍZ"
-{ï£ßòë]Ý
-ÎÉÏXUC»NÃßH×Nb3h6 ëøÎίf0_\.žÝâ2KÖË‹µ •…ÑåÝ~Y™c¼Výh¿t/DmF®æõ”°ßòß^ßír%wŸ.»Eí9ŽÍ¦R{0ÙL©L42vL.Ëõ4˜0+ë0´–‡YÆY ãÍ ²ãÏèÑë6«?ü ‚L·ã9míh h" hlÒå&ðê ãcÉk$ƃe)ù“bÌ8óëÛ¦+0<fv­™CøËSUÌXkm¥f³Uιà ÜngìD᧻)MúüK+ÏÇÞéu%½±=´¨ñy¸ÈµœaæXw‡­~¬“9p¬Üôý'ŨÇ;)¯vïìÔlÈÚŽP±¾_ºoRò«°*PjA.*à›>‡ÅX³×‹Ñ¼šÚ WÈ™Ë<5(.7lß—|ߎÅ~¥={žÛR{Y×{Ô¢eöêÙÖ¾ë«ûß%‚üãKAa…ŒÌõ ·òAž»ÒwÅîÞØr³GÏãû;•'PöîŠQÌ>wúY}žô²É5/Ú±5r?hUÝ>€1ÛÕË‹²£N*=Ø8*[º* ã¾JÝø@i‰­ÛË7Ìpœü‹ ŸÀŒ ¿ ú Ì0!ùEÐO }_~cáߘ`Ìÿg ÿÆÕÿ³…ÿÇ~cáߘà<ög ÿý}ŒÑÑWP=äõ'@×7/±ÐÓGJ¢BP56‹ƒdëQàç1
-0`fú
-Fã÷j{ê{ Ò'ë帳KTzc#žD£¸Lîtü˜tôJÂ:kT´ÔjÍ`äv€ñEÕÆrvRnÇ
-­å)7´uU¶ÉÖ]în¾ã„ó–òíù'0"ÀOz®…á þô¤ïÕÉâæš}`Rƒ¶eB¥•±±N‚Q¤K'à’Ζ^ ¿æ“êç_G•™ªGå¾Ãdȶè(ídÂSZÏbÈèÜD­;w…9’<~VÂÞѯσ‚œ òJ àè#úP1cß–­¦e¦CP÷ÀéNÿnèàg/;Z=3uTy”»‡®Þ=)ímú,A~› Ì/WYèÃ`zÂ<œøÜÓÚÿ¸üsuzc2÷*º¾Gwž%Sö ³Krilž‡­îPQC¯ÂyW£'O½E§n˜ƒŸn·9)¸r’…àr–{=Ó“¡ëþ.ÁÆÜæ Äï§Ø\)‹í¾IùÛ†”/ {ô h!Ž0·k©ï»ó>0¥zÝšCÈÂ@K'Vw¤¨®Wsy'ì^¾€Ï {…9¸wV:Òæ,‹(6WkNØ®|•†#ù)̇QÏ'ÅãÖñG;öš¨™?$äý
-@·¥‡"fô×ÇbãÛø.¦«ûoÏ:±m$¦3óÏtÈï#¥è¸IÅS3ÔwcåÇå+&
-žÉ.ð³™ 1Aá­ö±ïX·A¬ù9@OLwõ’¤]½öQå¶Õ@éW}XFðJ˜ÛncBîêÂïÀ–~åG˜Õ:aV{ STË$v¹¢J,´´ü=‰ ÿøÒ[
-Lžºù9Ìõ ~œèZ Þk§VÁ:ìƵ‡E1q?*ˆ¼ïöœgñ¶s¡m:¾µ°ßR o:g7œ€2ëþ¨½]Ç
-¨¼Ž5/»u¬ƒyåº÷pÌÀX ]«™(ÀTòÔJYçËøº»ŸÝå²%qÖÚ¯S=‚ˆûýyÁðŒåê‹–¾mµŠï¦KƒÜ§Ò»ßòÝj¹é4ùn‘\©ñÉvÇQiçkŸÝöÿ.a¢ø¿[c€Î4
-Šs$V?Z%Ä|nz;´cì-KØ+ênîrמÀ
-ÌdÈÈÝ ÆÀ«9Gk¡‘ûØI SFî£ß²U¯›nñ†…-’ØJeh| äÒàiv™NËby?üE~@=
-¹ »,s_ú$áÌ[×2¾4Î[r9ãMööå¿7Åó
-€>ŽBPt2ñ{ãíŸÝVÎh1ÈZ*Ô'(+×62µë8¹ž(%âTãúÄÑ·Ö:¶(Ü!0»¬ a¿¥M ­®ð­Õr`¥±•– ðUbíK³à?.¾ N«‚—Ù‡dbŽSÅ®àlI Õœœ¯>fÛþ~4§V
-Ä•-qÄë±E c‚ic²ƒrëf#N_õRgûkV·2XZYh°œ+—Á23rF‹•¡ùîv<Gebú–òíù'äxŸþíN‰‹Qs5 KOxù€.ò\Ïrz”í¿&8³»`¨˜«›a¯ên`¦g˜Ä,ž\¥ëFj™KŽÓ‹M¿’™ŸY(;/Ÿ¹™7Óò³ÚžÎOýáª0e‘yiÚä†å ÷jT?+äÛs»Ðî‘ ÐB¸ä@M™Á<'åÇ ºPÈ7ð-ã Q¸“جSÁ®²£ž¾8ížû9ÙfŽ³†]8N·Çyò¬ìÜIoÅz“(‚_ÇÃ錓Çð«{iR+MêÅ`”8¦_CÍÃ?.ûé yÜåàI "ô8Ëwä¦Jo¢á| Vgb½Õ¡>˜/KÕ>¯_ä´kqä.–éñ¸ãF퉣ÔÉP†»©¤ ³ÒFØõ±1X»Ö €¶öýs²b÷11wê—ûEï›D¿møG±Öc©ƒ›mó,±JÒv&
-mwÍ2Ñ<&ÇhœYÀ8=,<´öšurb×óÙ¡½áŠ<3ª÷kÜ«Ùc<¯Ûå4¶ßí´©QG$g“N¿6›w¢ö`ÙVÆ­uc¼= ºdlK¯„— ?)—ƒ<‡lƒüt r/qä–‡ÝÍS‹±r‰IHálj=ÛŸàë}߸m-!T3[šF!!îõÓ|º×Ñkó £Jù —
-q[/>b'½¨¿ÎšÓñÍ)?.š“ŽÝ4*<Uêhß¿ ˜½þ÷†ïÉ¿ƒ~3‚ü2è'$Lô˜ä—A?Aþpá?Uýßã'¨þŸ-|G›•°úz2B
--ËÖOÄb¯cÑ ¥B̘­9œwÔœ©÷Æô4§»…ÕO§õ’óJ‹\~HÞ 
-øI±é˜§î¢ùs1ëDÃê,vã´ÀšËTI3
-öÓÖÏ¡£Ø|ð”Â^sߌ'ÿ¨ÝI#R;G«HÆE«,w7@h‡„Ý« !÷{vÛþÃKA~Û¯ùS2¼
-qæHãðC‚?ïà'7~v,Pøð“ÎV
-ãú£Ê”yPý¬~;É9ʶÔ>®÷WqM!­GÜ‘TÌ­£búÉfÉ`†ÕŸZ
-
-
-ŸO=Aá­ÎÃÓ‘Râ\"
-
-ZÇ­¹<  ïQÜéa¾jžb´i¯ßŽò3sU‡^å“Y¦b™òÜÛ6îæÝÍ.ñO–5qàËGáØÂèÍìáèõsø)þoQXðåþ˺ÇÓÅýŠ\çHÀ2㲫,[]ËêPsÃ5`;¦‡ìÀ8ÅÂèªírÈë˜JÃdU¹íÆàµÝ0X$*”l GvvW×ú8¬IWÖùtWþ¾¿Î†;
-µÝi˜Pc!¥Ì¥UjWw芠Q,ý5ù&lÞFÑ¿ðÐ#¿8¡¾4-ìùR¯ ÿ+üßš.Œ§Œ_È£‰*·«–qÒ,ôácO½µmcZ˜š vâà’=é‚[¹žºr5s ŸZv×xžîkózðør^Ž9æÞr¹J/k°y?²QØ`~‘9lv߀c±ÿsþ{
-.{’/é›/m»Ù@ µññ{©%­l2­œ.ï¿´´K¿0Ç`z˜©1v:0÷Ž¹ÿW
-Ÿ¹¤¥ v1`éK
-*ÅéöÙhˆVœß—@'¶ØÆ"¡^˜•›µek; ÅÉ&팸ÿì"Y>Ž;f6Ÿ#Gx‡£&ž_²$}gO‡Å’rŒÅ²lÂ^l{¯ý+
-úOn1½H³ÿI+Îg½,p—í¤•9ó0Õ€E¯Î÷lÂ| °«ùÙg€EË^>ë”ì¤rmVáÄîv{$k;ÂZgž[ùI¶ìƒMí$É1óbŸc&IlÇÔéUS¹fz²,bædAq{rQ.H 1ÏÙÓóeòójHÿ
- R@: R§xˆËý6$çW—œžÏú S­)!Ó¡¥ô  #&`ƒ­È‰÷‹±Ú*^á<‰0‡Í£Çï¨J‘žP[.”z}Aoîõ¹˜Íy­ µgkjÕ%c}Ð#7äh0}؃Ñt·¤æ‡OFñþ TfÕ.¨pügÓÏ<#¹úLtÂ?°Ê¦![…±°Bé×-ü*U’ö´>¹t®Ó»/)Âz.*V¶Z6ñ…Ì„à’"ï!»#>;•w£Üäýn&¡N´Zk«bm<©6:ÿ
-·}3‚Ê󳯂«Ge£îzбw‘´QX£×åzÛÒ„9õ» ‡‘›%ƒMóõõÙF¡-²_É;ÓaÂv'ǶìOvyOm<çˆV<šK…û¨XM? 'Ì%>ë-¹ôЃùWðÕ?+ê-×ξх†)]à2õ×õ£Çù!E£KXÇap3‰ªrSµÉr“‰YZÃîJ ŽlßØÐüvOœœJ`÷‰6 V¸>䪄=¬Y]w ëÞ ©U.ø­[‰ÿŸõ–ÿ÷Uwd'm£`†Z\oIËiC.ö½îyÌ,ñNQ˜mÔç·5“‡Â~0!×ñ`\‹á¨7'DU¿M‡üÛž â–¼üBíCã*Ãâ’5ãñÞú¯ÔdÛßoñ]?ZJOå[Ú¿‚ZØÜwÒ¡6…ãè¸j²o>ž3y•Ý/9´æÍž›Ãm:AÒÏñ²´K\C†B'Slû·
-.v£ÿ>iíþ¡wè÷Skïi¥%Ñk“q/3™Íº:˜,»$Ó+îr_HgAwÅ•|éµvWн±‡Æ8CÛÄ»µ¬³Yÿ™XMŒéT1Øc?„ý_øY÷Ðf¥ Ÿ2ß×Þ¤ø|v úžìæƒ Ò±¹k¾³¬_Kí³èam¦}©·±ÇµÝ
-v÷^‹ëƒa«žÈ’¿ÇòËPrnw€6žC€6 é<JRŸ¥}~)<?+~÷R4šu’^£TY¹wÙY;`4œ­JN"_ÜÛD3T¾;uö5;µuuK«X–¥eCÏ›ñÅ+ÈÍ$ÝÇÃ(É›ëOñwš°åÿߊþ@Ž^ÿ·¢?ÐüBþ×¢?û¯Ÿåÿ—‚ÿÖü”þÿ‡}?
-GïÁ '©G(òŽ
-Jxp8<Áù§€Uа9þCs9¬ÃJº`°<8FæÖ³dŒ·W¥pVÑ;~0Ë“çÍ‹ãå’ìq™R¬i”ƒŽÛãÉpLÚ4иcëÞ¸æéLP
-uF®Ýt†~òóÑýØ]/#ø—ïgåT8¹ßødGÿ<ÿG
-²Ç³^ukî‰ßEß³ ‘Ö’¶Ï˜—ýi800¡¹«Ü”“ÔÈ.Ô­8ï(?@÷Ëä'£˜£IPΗaDcx+E: Êõ¤õÓÖ3Þ?ïÙÐ|ç*þ%îãç^Z˜;i¬­B›:̲èè\V÷Nëqþ{JÁ×ZÞòvP13ÚtÄÝ­šŠñÙ½a²Ð¶"ßQ7$¦lz£·üS|‹‚ru=ƒšEO{ãùÖPžåÌgUM‚øµE³_H”Ó• º§»gÉ6¦Nú–f­‚Êï Æ.›:ÇÄÁ©9Î{ÇJ*P*`_ð^žtÑHÊ•ŽI}*â«Èâ`gËb²¯I¿à ù»«ß
-ãù¦?“ŸÀ:=`®ßï‰N:&^Q%*veüR9Ê¿u¢ã9µ“C#$ƾ: ‹ö®¹Ÿý-­úSeSÜ[ ñ鸊bSaëIOfk±'±5×Û²\òºaÙø"ü
-iÏw”*R[:!NÅŸâͼsÊ»A
-ˬ›
-¶¾-‚?'|Û ÅÕøa¹f•â™Üî>'³,› öÜ$¹ õ&­ž6Ïöºw–5sÖ> &ÝÆî*×âz{±)â®) ¥C㦉§Æv"YnVõ¾úÓ4£:^<Ýjo×{×ô#óS€bØ HŠ)Päð(â¶
-qº
-a+ðÇ[ø…<*êä}k­…«¼§kaÝpà ïK¾ºœ‹ako-Öw'(»7…_æ ²_ž·ŽžŸÄ-ˆíÅ[»³C{ð…ürá/üTôš_ÈÿZôš°§ô¿ýæòÿZ”L; ÈîÓ (Oæ 8 \PLŠ 8?Àש#(±Ûýâ¬àg‰ïëWéšõP3RÝ‹!Ø£ÀîͦAiÑZøî­ÂøX°ž/Ñc É«ª×ƒWݤu¯J·<áî<¨ll‡SÏ$+ˆû ¾¿»
-³PTw`]5– ÔÛ:(^n(†5ýé.:;EcIH–#u@·Â‰‘\
-èa”B|æ3)”ò °0b¬|Ρ£nΡh*çuÙ9úÅ>7ŒÊÕ³›u\ŒÃ’]W§©…õ€â…®¾5nù)}ù탢ÉUA©šg@©GšO×Z€{ãºÏĽC±lçbÎRCØÕHŸYÔ^°M3^Mv¸óÚ‘D7~P;wCNwÓ ·©žÛ¾¦Öq=‚ã}Ã2¬óÉÔL-Ê=õ
- öÃ
-£ÃVåV\ë(³^O½ÿ…|~P¢dØdº³2,óš
-ü½÷¼*׼﹗F»ò>#óRɬËåã$S¯Èa@×6#Ù¬q¾T£‰¹T_”îaŸŒ´™éêv1·Ëk8zöE<Fux VtÐ4Þžþ t ®
-ÊÈ…O­3®4Ûfü‰ݵ¯m齨ø‚ûò#v×_Þèé¸^u™žµ
-ûü´5*“Ô´Øk9‰‘Úi?Fº=xWN„Ÿ<ÕôVŒ)²Yô?
-Ð9vè«ôý2Íú³ký!ÎåÍñó¼)ìo±6÷M…¿è¤4Z1¬à]ù æØž6¤„º¤¶5o¼h—ìÉQ
-hQ)€¼´šƒR±@r² °ÍlaŒsÐv¢=m|=h¿œ¸×š~þÖ
-›ÏKÖËXA!ÄBWT'¾lJ–™›'zy·O«wSú=@a8R?+‰.(´z((  ŠÃÅý ÅK@‚¢•‘Aq˜rŸh ßîÜ£Žo7½Êq=Ržùnx<œ‡!r’§—iÈ,/¹!Ã晓‚ùD;ó^þò…œyYíä· «j'>ê´Æ-Øã­±ù=@a1UaP%¨IŒÊ  ¦W È½?ée¥^fJÕæþ“ûþ³L?a ±”
-ËW|°hF)9Õ 3­q!{Ü<°³UPdZkßøÞ§xÁöV#¶–äîë'¶ß<ã³½Sû\<¼“õõ7¾¿Î(¬)XM‡ê–s ®uî“^Ž@i{«‚’7\‚Ò‰=€Òjwyb©ÚëÞW™¸WŠË×Äœm…šœ\Èûvü™KZwç¾»EY¿¼Oo<¿XѼՑ í×Ê»Z§Z>¯;]nwPܬ¨Œw&¯dú{î÷
-Eü“Ô™,>y[¬Ð»(èÒÝ
-žôKNÞ›u/÷9,Rùu;Ì’ïA`ǘn¶(«d×[¸Ëç°“µÝ¶šÍÜóájaø„Ïuw!dECqOF//Ó•\:•ÿ€‚%j0¨Ž
-¶TEy+€ÒY¹ýg58*ìæŸ]<døc ŸûOfª¿ïB¶‹ûý³V'Ì,%Žô±söj¸#œ×móèƳtdêÛœ¯E¹·~x
-²’ÙIÙ^öÖ;¦ûXIÜ@¡¤zñ¿â ùåÂ7@!ÜŸ`X=(©5P|Ú"@Kþý³ˆ™£Ïv#ï× ×¢Pµ™¼_SË|,·÷PS{µ/V¦9üžñ‚3úùv†µ³ß:»e[³‡¹ùõT#SæáÐH+ûY~´ÙOɵÄñGv+ifsÏô—›­Q›ÿ ðR¡¦uõAám~vn)un€.^÷Ï"A ”ûá”gŸM(f£ó³Ú.>o÷3“¹ªˆZ
- æÕh®Ô?ÇÍÊÈV«‰9` ý\³×§ÚÊÖ‡AZ•íCc+@_o—\}!›í³F‹
-2ÚB¤íµA¯7RcÅ}íI‹‰C@ £ôa¾>M9r}ZmÅòËPÌ™: fúŠµKVÎ}Wo Ì?/ €uøÍcíôôø=Ô½ˆtK÷ @yäÜ»ÖrÖ¼ õh¢Ç~+)ÓÝ«þ½CÈ°'ñÙæ|s§›kqV¨u ×§“°\çr“9oZÄŒŸ/ºSü
-$Wf²“àOÑ,Œ§\htHï@™]†Ä…ϲPü+æ– ‘MTÌ꧀Òðùâ¦Slòó¦õ»+ ˜÷Ì{W”„ø6„ÌšTœ"‡§ÍU˜Kg±
- g¾
-e“„ð 8gqùÆøïð…üuŠ½ ­¡0¢AFTÙ}Òwó`ãdT’bï.äuº~°ߌ^¿õ´-çQõOÛs9£×U®%¹Ûfo•ë‚žz³õA5ó…Ðð÷0êÀæÆtÿ1šÑ22%ég›š2J„ñcf#î¿1ú=@qz7A±_‡ Œè
-C:S¦ˆ9âNG“öŽÕÝpÒ¯+ø¤Ÿ`»¿ÇçY‰t]P*kŸ<ãØ•bîöŠù, :%"µ6¶çL¬ekí¼¸ã–ôVÐX’S®#ÚKšœ‹Ì¢–>
-Ó—qÛs‡–>ô‰pиä¼íŽZ_ðp[np!¸¬5¼½–É9tHkDº2eüþ{€R{æ’x |· "‹¤‡g¼S.»Fw³„c±ã¼
-üýuSJIDˆ–¯]ms]¾4 ;:YÔñê‚L”ÆÌxF[‚iÍŽƒhˆºø­RyôŸÅA®ß«~Ÿ1¶ý»ÙñVB¤ððÚ&+ûA ¼(~!߇(Qì ͉Àœdïü½ØòÒ«»ÚNGu«ª¸o“®„L;/aåŒ
-ì«K×i+¯õ||“Ï—±yé/ owf‡õÓlƒßKµÿ¨ÛÇø£w ù\/ÜÛ½Ôå¶é½öšØïÆ…U;gýÅ“¿(]íOkYžœÓž4¹ÖX˜' ³¾JYɶ¼S-~KJMk–wV¹YYÚÆ°ê"ê1ÝÏ;èøغéø¨×FÃu>˜ãêŒî¿R¸ØO€î¡7*âv÷4^Æ_H7+ïÓs€6:ód@w'ͼØ&5¶78r«ß ø;òÔR,J dí½Âåuž»75îlÀ ×M=|!ìð&~Ò¡çB¨v’HÌsc{ቀ_Ô†Í ßÂå´Öï+!7êµÉ¢«ïq®›sq©³ÈÌô¶‹3^›ºÚ ]ÞTJ-¿c Û3äÛÓá¾ñ…üuþ ®ÇŠªÙ‘[kJcÅ(ŒZe¥×{ ‹çAã·¨8ZiÝO¿¤ómã O5ânKçžGÔ®q4ØöП&°µì§,¼ÐËœ[•nþRiuJqeØf:Ýy+àp®Us&»fDÉFS@‚K³iTͦlÔ7üÝÿ=mƬ42ð
-¶ZL¤d¶6تéqrÅO3>®Q˜uÎäNb21¦íù fØ|tÖ8žŠ¤~ÊÔÔ®A3zÇæ&Nû,â—6ö ­Ú»—h
-Ä(߸¨j£›»Ÿõ––3­ËËĪŽ£-©öö¶„qþ=NR"&”²u·‡+»ÔZ•;Œ“6m»h!`Ñ“¾s‰ñ²8F¾a$Øy\âe¨—mv êÚï,k*ÑÆîÔô?™Pa8â7m´it³£ýŸIPê\#01þÎV'õ0_ÍÄHµbl8Äœø _È/¾¡8桹=´Ó >ìî[ÌisQ˜)ïÈ·4å'yC®†Iøs¿=ôSF×ìÎÊi¯}^›Q‹ëŠ¦0 íx˜þäAó_ÈŸ™ÐZ­ª±X«š‰jø' :Ál©³Ä–=Z(Ÿ•õ¾Ì u£\I=‚r%D¿Çöv*ü…/cLfy¬|òÉ”I’©½5aÞ¡?è</ížF¶;eÅíµ‚ÍfÔðżÑE:LÏcëf¶ÕIå&W >R+ù8бeçl—ϲí•<º¢=Ñ:rM–"# ?K©U(`Å›Ój»å ±ÿ 7ëð —Ê K‘ÈŽžÈÆGä†=äjrÍ8rérd½éçÛ±³’½w2A6w Aæ
-ѹ“­ƒE
-·Æœ®Æ"=lÿgŠ¦ëth/`‹@96.ÙéÚwÛaXi0ÚëÔn'j¼—aÕÇ@¦
-Öÿ ß9BÍÀ‚š|Ò…t¯
-Š….Ô4SŸo“/e¹(£/D (6Î{h«9Ï%>‹ïAIÝÂOÖ~S×®¬Ó‹À5?ŽömŒ‰d_ Û½œyüàXHvpÐË$½9n²6{xmpJ9Îó/dO¢âø÷
-Ñ©J{ JçÍ h©ÐÖbøÙ#ƒ¥ÓN{ø·¼{‹Û­KܽIèp̤Ãqt@/ù\·éSO§ïUG銿¶÷–i}!ßSêcÏðʸïP²uŸÏw´UœJ¬ëÛõs3ø=þÐì&5gV×OòjÒo M?üì‘Pú¬;(ÃO‚™}pÖxÛÎ ã:\{N8sa@$𸣚vž++k§²jêÔ³mÌßÑX/뵺ãg‚’©˜Ý¹ZžK\Òl›;ÚlëáøT›pŒü}øG€ü&ÜÂjú‚ñ<œm}²Œ(W¼Ø(A9ïãÏ*ªS7‰ÉWâAìÃB…?ùAß:»»ÇûvúµŠ '±{ž!‘Òš¼TTwÆ´qPÔÓ|O(f‡íãùV謧›n¡Iˆx;5RÔˆéÿ?ÆŸ½ óD…’ƒâ³Õ†Á\|Ò¡íè³­m”å\ÿ¾©®É8ÉL8*¢‰§矚Ez¦©û³ãYk7íPÅÙ»2!Ö Ù^ô‹;&»èm£ãÞ/›n‹ ôF„t¬µ×¡¿Î™.o–¸ÿ ï¾$Xæ9¨¹
-mÜ ÅÉb3ì•éuQÌÀ‘8Û¨dEz_ì—ÙeÌ—²͘c³4Gn{‘¿<Z £šl,3Ó\c9^ëËã©Zû=þм Pô·ÏOkiÁæ
-CzÂ3P/Z¬J==Ä*¹³ß#/{™YåõÍ««zÉìÉ—ÃØâ\b"ä]ÎF9¢J]-sRr3[ u#¤?yä£ìTäÖ-’{®aÄfÌæXŸ£I¿>·çÚ"Ï?*¿(4«2´ Ô>¿@¹úIÞQSö~ï„ȚǛ@Ø#š;Mw“SËé/D#vY¡ùQSÚUS=1‡šCŽ/Ðcgf³å¬¶¢f\R秱¿+Qÿ<ÒÒ2N!t{ÒSÙæ´]`ëdÝPj$gl*³
-¦ÿ
-øYþûØ PXK&(SoP–”Á'ËHÝ’¥x~ 6»¥7¸†[ËoÎ Xû§Z '9¹•A*›ñ6é¾µê­z~°4c”˜]N=ò ™vŸÇÕ8ÍöwÄÌëXÃå+H —ö¦GµEkœôéÆøÕ¦kId«ÓÖuýÐp¤€bîb´'††°7þ¬«½qdgét,á6Ö8ý™ ô#™í]ÿ¾Þt]Qe ×½‚qJßØ" Š Ø£"Øa‡b*Š©÷ÒZsïyözj¬úñ’eù‘]D™Î‡.H»KuEδž³¤|±ØñUªÜ´BºÒ˜î뺦)×®Ê|FnÕ’G{åpˆ2ªgµj_ØʵÀsàh©úÔ¨X׸VAKZöÐûþ0Ûüñ{Ä ¼Å³|¸?æ õÙ^ÜVn÷Ίr«ÞüÆYçÉbe'?˜}˜•ThªÛè¼³­<øð†tÏ‹Ú†ªjû˜mWwl¢Óâ¡"{Tõg»òÈ64e¸¹JÕ>ºjÔâjAÆÈÿ ?Ø¿e@¿'+ÀvìdÝ~ždåcÐ’ö0†­¥oµ]æ—ñjÌŸ’ë®sg÷äÉÍzG kDýt‹³”QéÞrÚö"•Ô®ûT«#gÞþÁ*¯Ô|*r©³Œ(}\Fš¾\…¶üÚεŠcåJ\ˆeXXpÿ€‘a³ËT‘û¥´Y,&õšo`¶€ýMƒ—i¹)X„ªKu{õ'kkÎÏ]óñz´x?ó1R­RZ3ï¥æ=©P“4 ø{)SVïÀ–?ï‹ôÝ~•+[M—µ$-7kIK“Ð0Yá–Uy”Ëÿ€IhÿFjØì@ðëñ¶ì>‡+üxv…]~3M·‡q2꨸™­ô<½ì2vjcïþƒéÍù©µò…·ZH|¬*¢&[Y´„’Œ¼*¶ºùn¹ Ý
-²Ë—¿û÷³wå»0´.poÙ(Áÿ«W”ˆâ˜W˜¢ÇyÝzPXš÷~_ yüÎåM±ZÍS¯M/O}“ ™ÔÿŒ‘ÕÖ«4+ÎèÂØ óƒò±Àu÷ÝlsGsjxrÇÑó2Uœ¶ªŠàµ¯¨¸}†âò·òit
-˜¼‹•ð3“#8¯Ãf8ä’ã ø•ÿ¤@°\0©usì{4ý'ÿ‰¦¯™pSIei&30
-µÿY´ٱϖYëyY0Öú kÒlà+GWÃþúû–GDµ‚l'u1è3z9_[%[™ö‹Ö²¹OPšÖ}d‘÷‡užŠû\[|œ³§Ùëÿ$AñÆÚ&a©ü'µI¿.~Ÿ~…ø”ž j»ìÏåW8Z‰¡ÂÔ :l1$L9â8-0üB­2#1èi¤Ž_Tñá¹,¯JŽCN>ïžB.Ÿ¡o™=M—J&ô†µ ¬Ýè7™Ç¾ße$¶?¤g½¡K}¢É’R‹›€\;ÑÔ%úCøó" 1)þo
-Ä~Eg¾§5ù€j§Y¨öª
-°F™…˜‹
-·§Ñw÷Ó÷ò7
-ðÙZËÔÚ\™|×ÂaÃJþsó5æ¤Y€’w
-À É‚ðæIóÙ^>,õnɽ3½"d<¾ì88Ÿ¤ÿ+
-ÈRÁ$Ò8â´HAµ×
-ðk±ÕVá£Õú°Y”6!T{~ìù5å¹È@­ýÔi
-U’¾\þ“·¥6CP ºÔEºʨ‼U‹€lw€D'°éN6
-¬V€Fv1`¸û7k{
-½sß<øõOúîŸ/CyßÍòÈÆy‡&ƒa˜{H©|ùŽÔÕhßé—óãÖ=>+‡Aà5ßÎWŒ…ß‚!Ð6»^Ÿaür-ÚÏUœÛQˤ¨ë Ì‹ôéqQ®N¸ÜEr)«4~eEn\±Ø‚ý©Pù_H…ê2Uú'½L™°9óÏé ˆfƒŒ_ýŒ˜~LÄyGû‡ ¥áÂ9åð¾<ëÐ8IÓï¤JýÍ Õ³W.ýœ-+Ör»XMª§ùvÔ³½û­¿ø­8ºUÏ0®d{…£WdtÊ´Ç,3Ò?÷+
-}È[Àí`ãPþ¦Cǯ U rìœoFz†—Ç8}šrµßYÏì6ŒÅµ¸ +ÞÊ<TçMkLûÕVǵ?lòö ZÌs{ûÑz~{ýS¯8¤%´çBÞ:3™¬Õ;¬•¯Ã ‚þP&í9èN
-© S/ç~°­;_¨+ü æÖ}·tßÑ(°÷Bï:Î^•Õ@ÛLúˆ{²árYM-eÕ×gZ›9«'×¹Ö؉ƪF¦F×ëv…ÐRˆiÀ0P p•ïÊáïåo€Óú ½^öÞâ·mßO@~´
-ö½~ùî— _£0Ö_œKz{*ÉØïV¶Cn”9ô>uȨôøž˜ïÆ$^ Z}\bÕfëVªžw'Mv?#¥(]£Ê}±(Tód—­±r…¬íû"®nÑ
-ZÇ2ÿ€ênmÀLž8ZFe/<½J¹IÐLÝfþu{[n€R9®±åõãe7³Â4Qžu§¡'Ö(ûÌûsü¾é˜£øÐt©¨ñÚèm-^Rj+1¨j(ˆ%¥´õŠ¸Ùò¬P½þ`rÅkˆrRºä+÷šÃ*ƒ–AV»Wƒ¨¯ìW
-O›‹Ó˜ìÏÆÉp>ASÒsÜncÌÐvFrß›<šv•°š¶*» O-4C|µÇúÑVµ‹íWå5(ã²W¯%jÖEß¾EsÃr0óËå ÔE"I‰âz3/Jˆ\ÌIµÆþ
-À<7“S‚ç]vÏlµ4FµEŽäÔ©äŠMÇ$É…]@6É`Ò5˜>š r'K¨z³Ì-»z1ÖËŠ[‹ö¯¥òŒfAeî ®2FwRâîÒÏ”Ÿ,\PÐ)]9}Y¥lê+»Mè­ruá„Íä2cdJåfáÎýŠ°7×ûV«\[+†(.²Íuy¢¤tiÌpª:tôêѪå
-¯ù|1m.¯COɬT6}»g´zNqZµ’ÁYJ¥:ò:½^I†o";¶ïBX§Kvf™-º…»Â¿<Åâ•ÌçÀ}ÂÏy¼¥˾Q+ñaN*ñÆ­ü/à³ü¿0YVÖ¯)',2G!?©¨÷‚q›kêÔË=¿²Úa‹½4]þO:TÆ´6³eUî.rUñ}+*Ñ«J~—×Å6OtʹçsøÍ'/ÎÓ¢«ï¶ü¬yÿn‡§
-ëa9WÀãe=oJú"O½u$,B®€'¢PX—Åүؖ:5aÑ^™‰|²£“ÿ†>LA9l§sX­R˜ŸµwªÍ´§8gWueºsÚ-–üÎ
-á„$Kv5†¶Ó.E^¡W§fWZ¿-ºyêyœäØO:ÈöTù™ 7ßóÆ3£ßÌð´¹go‡ÛëãÓ;™lêÔ褬ˆ~U`ñvÎñ s&Ȧnâ݆öC½*Ũ¨hKffÒÿÁʧQ},p€œËxÉÏŒ­Ïyíé± ZaÞ,i\[ª}²½ªNfZ»ÀÚ¦[eÜΩËH9nNÏÎ…VŠ9œVJÙõy4úÿ…ìßòä9)à6Ë[h_9…é–5SÒUÖeë§ö P}8Qʃ’:­rå\\ƒqƒ‚—ø×&9¯å*=¯«y*Îë9öE˜ÙÜt2<õ¿+TɃ͸­û‚žõî>å AH®Ý̇ÄA3Cøós…0kù6ÄlñÚþ
-{o¶Ò}¥7}·,…z7P¶ýªÝªsüS*ŸçG2Ùl"„ãQR|xTÂ}v^RÐsú;OÝ ©ìiòF3<2EY°HFb4šžukÊ”
-r/•H½,Ê„?­iõ1Zx[ ñ zñ°žA0,O5žËÓXæW
-`ÄøPp‡¦¼–I€îïÊ·ö=¥ Ð`í&»;‹‡áÙ¾.*¤uٹ扣L5˜î6Ò¯€ºRPæ•hœÔ
-’|8€> >\Î\`?¥aE¸Å)Àz”ü}¯ÿ¦ëÉ:lÝ€°G/23[ÄWñî^kä{xa¼}pÎD}磊Ðb¾Ï½Å_ðoõÎÀØ·‡ÿ¤CSû3 çŒò¯Œ
-Ñò<“È$„{¤
-R>u
-/åwÀ>ä€ôÅÞ²bL¢_¾‹S„çÉk€,é‹ féÁŠE?´ÚõtU·`ÙÊÆlv¾››‰pêÆÞÖ¹ŒL"¼rôKòíNuí¤¶ÔjÜñzs_vÜf ß½›ûÜùÝ"Åó«Õè>_­Í:•´6nêù_øÁþ-ž€Â[Öw‘ Øò üþ®_*^¨§O”™÷)åRûöë•Û
-jF]!³lw~|àãIlžSýÑ®-ƒ¼Ó»ôáw>kùýƒµññƒh¶/oæä™bp*b\§ú4.÷ÉÛÌÞÇ/óhî^Mf°{6›~ô;
-°ËuôxÞÐrfóxVñìvÉÃvôZ‰6’G Gsz¬-çS:Lm£œ¬÷ûe…?tSûaØÚñÉÃ<S6bð²Êê‡*j/àwµÙ>¹é®Ñx7JÓzòƒ5nXçipÙþÓ°ÊýøW
-ä§.ÅXpÕûßðƒý¹
-I]dõÏ3{û°åÚ°i–xÆ_ÇÇ7Œ}Pˆ:>¿Þô~°í+á׋S—¸M ‡pV÷ 4êê‘j9Ü»Ù]!”Õf²ÊØêãYc"2M=ÃÙ±Ú£–i
-¨áR¡r§½FÅŽ/‡ŠÝÓÅZÞÕ.›}ý`5¦Æ<k»vÿp&2:€iôÝ ßEëAv4Ÿ'Šu57–õn/òõº;}
-ƒ‹Šo`g8•µ«N¹‡LV0zm·üG˼~x«1/]MãOm¶ûê¥7º)Å£™–“—åoHïuñ UwGR–" ©Dõ]¹å ‰béÌãW|çÊô¶w[]OÆ1u®VüOªkÅ2*^s“Sf·VŘTó­¾³‰WK;[ïFƒ²tGzu¾˜owØ–hÞëÖP6™–¦;óÚ˳êÀKoAJ"y¶ºÁÑRòvl^B™iC\?ÎG‘ ›”¨²´”®îQi^¥d©Yý
-8W¦{çÛe£ì™ÕUZÏ*¬àÑ;›Ÿ•ðžèªuÆ/vç3k oÙœgMO¯KíO;'Ç”éÌk|£V |«†š}={ÕQyéV¯¿–a$iì4-ùk¡¼_4Ír«mËÌ%CÈ•éR‡*'zJ"¶:¦~Å•"2Õ`3ŒËg‹óž9TrÓ˜{æí:çFýü¸l9õѼ»ì/õÔâ÷ĘE¦\Àª§·Âÿ`Õ;‘R÷p7+)niIëçü{ÀìîP>° Î…]Šjc¥4̘“?m§Šw*Èom•-Yì“({Ô¯8¾ž¤
-fU½NÅÓ¤¡ä·ŸŽØ.<!t‡Û’]m°¢«U¯¼BNÍæïI¦Ìwñj1×–µz¶Ws¬L¸ŽWž¬ÞÙ[@æY»“±BÖõ!¼ý¯˜÷¨*ê,»ýô`9ù
-ºú‘}6K?ÑõµþRþR¨ºbÄUT¬ÎKf&-”OÃcEà^V­èÖEW(ªÉ!§[§€G§AžŠ}'Ǿ¼y6Ÿš­3<æXÛŸŒÛA‰ï
-UK*QŸÛÌ ¼1åRjyQÈkÅ‘ëyµõ+\åØ-yŸtõñ'6ãI/ÖL~Unþ¨¨èHÔIL•s÷aJ¥™æg Æ!GÊùƒ%“k—;ÙlîSÎgx4[d+3“È´’»ª”7HLr=~[„?Ã&ªîñv}ùÄ3x–ÆNþDÆN»Lë5oþü`ÿ–ÿÅð"/Ýõøv3cYºþѨÀAx'™Ìûå•ŽÅÇb¶ç>;éPÀ/ب„Î!›{—Oìm…Œk#ZÉŽ®”ÊñFê‚ø$L9ð`‘Oã„'±ž.eÑp§—PžqUDÈùÝ´Ä?&©W\ R3g§f.Gþ
-€:Œ
-"@ö½&@F§ @|LíÔMƒôóDƒt–@ú¢Õ@z»h´Ý›ôlré9š@4pv(x—藍% ü=ûZÏ|B­†Ù'Êìß
-I€tà8ˆÔk€”§æ÷Y²ñ ¹Æê.9BTágÄ2qæ¿‹
-VI5 Ÿ¥Xž”™ìÊ
-oˆüJ&/C ŒÄçëñ®V®ó–%„ óQ8g+{žä¿øÁþ-CÖ¡P§ZØðn@yjà“`ðK)
-ô.ö §œõ·ÁŠÚß,ºÉUé¿`Í¡ ±¬¼Á€ wÃd‹
- kÅ ò½æ% â"øÁž½Ê‡x„ê«ß
-¡—j'íî¸aç–D7ûVa>Þu¡ç×ttÂBC¼.Ì=TŽ¥ -í4ëßœ
-"½ºikléòjÚ{-ùÔFâß ¬î1E*ÀŸí& È
-Ÿë×3íEÌ–×´sߎßN™k¾Æ»øü¾#L´BŸRÔ££»½ hv…Þ¤äÕ ì£|*ò·zòýA¼>Þ8M©PÜ‚³×³£¥ßZ?ö›Ë±®G4ýX•'×ôR®­(/uó ôØ•¿xÚœ5™¬7툘èsÆÛQz,ÛÅ·]u“ÄNëÉs´".¿á?2 ÁÔ`«¤Ú€Z½§€^€1¯ç¨QÇ~`€:K2Q+¨ðç[z]=T¯Cs·[NûÛÞãæ®í.ï-_íÍΫªáNàÏÙ¾¾NMœKMúçç÷n͉3ÔhœŽ‘ýn³©ÑJ:‚¶Û¾†3‚ì»Úý‹Ûß
-†\åz¬Vy)Kž†ø\ªs'Q›¶>"®ä¯v–e
-_ÞË°‰hX<‹^˜>ˆŸäü‹ìßò —¥ƒš®e·ÃŸYjÃ5 o ÜÏߘÝ2§ø@¨´˜ÞòlñÝœ§ÛÙª50ヿ÷í¬mæúC=ÌÒéZ=²Ê¸f+2Ѫý`rj¥uÄiLÊ»Î4(Ó/ò#ÀQ_ Ú+uáZÊÀµtR&gMÉм3»¿áRø`Ü.ã…ìªF ä<w^üþ’‘ÍŠë±ø Ýãb­P¢ø¦.ÕMuõ5yrë­¨½©…¢UKKT^Fš=6á$-ºVDʹ˜evö ½´¼+ róW‰ ¾Ä½½YÑF>pFæÜy§iFüýp?ùåfÿ7ø g×SD æ'ª˜vAqü¶™Núe‰ëÖ³³ñ¤9ž)cž½•õ°Vë‡Z¯¥æ#óÏ2^e®>÷2ºßDñ8¼Ë‡ùŠΫm¡ù°ÅÝãt‡¾
-S^6''ng1®º¦5.]@¶\êZºêÌë\PWÞ©à­ìãáûsÙ =z±¿4‰;»ÙŽŸ–Ø«ÄsëßL‡®:üó©ûºP»®…ZUd£²°î=Gwc±5/Ê9©ã \s•JÝ~RgÆW–ÓìÆÕ¶[© ÝÞ­¼_¯OóÔöpɵù™Ë¤gVö¤³~ö”ÏÙcøÚ~áÿ Þ¶ÓG&a'±wöõa‰RîÖnúÅHŠwèÃhT½|¨rD™)“BÙ6ÉÌ•òi”Ö„xm–„Զǿ¶£!÷ ¬ ‡œ»Ë~míò0H¸äX`½²ù´÷]¿úØÛNk±sœ3SÿÁ¸ý%lÉŒÄ #úuÆ¿b:ÃdLØû»åèìµÊÙ˜7Ç:ÛHvŠÔ,­el1艈ŽC¤dW|ŠmzÎk)p+èùL1o 1Ç&w%›ûœëÝ™¬@nºŒÛ:éYï Ñq¢G'EêR”'ñ·®¾‡Ï³N¥ .ajdíoøÁÆëÏånÅ=*êP7édÈÚ0PO…xWQêáBd‚p#pÏǾèÖÖ'î³3/=G„yêö¼gO“Í#3¨}OT%ä7#1\šVrF©<B“ºðʦüà0<ðÏ %ë5, ÷±Úå3I¹]šUÄdˆÓéo OTØ1)*;ûÿ(LeO ¡_ÝÙük‡c2§ÒóiÞäÈqœ“Ì êLY¯Íè×õ(¯[’zÉ]¦Ô^ãíª²ÅN+%Àò¸rA¦#vGi‰“Ñ”"ÔYˆHN)e³—RDdáÜ~°”"±8D+÷7
-û*À˜C`¥¼ ao
- ~¥qj”£\€|´@nÓ+@‚ë KŠ‚Ð8€Œ§ˆ7¬§1þ¦—O¯µÔ~}óÉÕ!ölçä“õ‹dÌ=Øuæ$ŸPמçö5¼ý
-ÀÊ\ ‰±
-ñúâX—U‰g^ò\û@ë1Úl”
-Þs6 ùÅÍìb„%™˜ ßU÷I^×oŠ“·®Èç9 ýÆr{ JãóùD4ãÓ%–?ÇÑ€Åñ!— ’‹(ªkìker¹Ã>åp»ßÈïÍq÷~-tîºøÈîq¾f…ýÌ—RÛ?øÁþ-ÿ@$°h,Àš&*ÿ¤CMã{o²T¾Krbñ;Ÿº-t¡m³‘r9œëæ9Œ­£06`ÅPÜjïõnûݺyŠ~°î‰O 6ȶu8g6Ý0%­C¾×_’›¿tSlìÍ2¯x®³êeÌî‡Éé0߹᥺þ`÷Ér
-³È.¼©Î×óÃ|æ¯éË6 "4r#¬stì³?kïíXZïWÀªe(ÔÊ€ðÚU@ú¥ ë¯ß¬m÷¸—“ým)׎áap»Ÿîj!|^5ZÌ/ÌŠÛcD(›B27V±Zï/'ûôØ«ŠûÅ¢NOws=±.3óÖM¦í³OÎ…—0ÉÛ«‘Ëo {G¸/6X_;MýQ½h¬‡‡óþÅöo`óðgJÄÇ­}³Œ½ïßÉ+³®¯ïàc­¢æñ¶9ýxH3Ã箉è6¯g²ëRÒ–•õ»ê!iÇœo5kÖLgšmð.“‚äíÝbqvuÊ9ï3–é(cÏ»nÓNq9ª7GÇaéì{<·0Æke©pñ7À¦Ùáa÷¡E@¡öO–±Vœþ`Ï"™Þ0÷ã\`ô6=,Ö›õnobѶÐÒS«çrN-S*É-ˆtWšµiD„·éŽ\©ï8ÍŒ;–“çÊNÛÿ[÷¹¦(°6Œúú HbÆHV$)"AÅ,æ,èù嬵׼»¯ùsCw3úP‰zJ·ÛfîN'.àö¦´ìBè†ýšÙþ`ÖÑX-­>5Ÿ[Õ§?5/–:úiw@ ŤÙåGNs»eÿU9mÜ;»çbÃ0w‰µ°6«;YžÐÉnÞÌ|^SXie~°ñzìÚiõŽÍz¾™oyè`¸ˆbÙÎòɆ¶>¨.û=¹|²úZ2/»iÈ3ÉŽ»é=²Æ²çM˜i¯)V&_F¿øÁþlÒ €@#žIsBIŒ^h^g\:\bÛû¥Ž´EZ_Ç_oe3 Õ}’CÞPxlsyÿŽFE*´;Í/„Î ;>d;ÙØ ¿÷ôžfÓÞ£5Øveóêr[®b|zBßøøù•1Ð܈ˆgôebD™sø/@Ú6Rü*ƒ0›µÎÙÈâá"Þë;Ι€ëþ…7Ì&¯.ÛËzä¹³Ñ>·ˆ2Gõ<ꥋ4 ù î±oµä¶V纳>v»ôxI–Sð4“µínZ®·Š‹+}¾hÞt<»/h«øØÕV·ñ\[õÓVÓáDÏÜ‚‘žÙ:Á¿H3û $êqS—½”w¯µNÄó¶Xräªòâ„y`‘ÖÅ“±WöÁu×yx#*†A¾ßöñœ£·,¢40ÊjŒ'|/X‘rW
-U#dýñý4IA }ŸyÖK&{¬Šaq‹”?…u_Ë«Êa_YÐú•™Îà½1)в:òví3«òeˆVûoŒÓ™þIa‹æ£²¬ö¸¶Ø4fÆCÔ³_UwŒéü`Šµ“'geîäáöËt/iËÃÇk,ßÑlÔi”°QÇ‘²Açl`Þ¿Hq)O¥Ù㜹à-¸´{9Dn£|æ¹U%ð‹ Z”‹?ØLH 2ÊžŒÎ¨_+¹þKpæÖq9 òòÙ?·Ø|–àl‚ûeCÎgZÌÎ9•0%¹3˜åM¹É£A›£+›Ö$½["¿’Z¢à­÷ú2i‡øô—ö«rôeZ¾xÿô!ŠNså+w*]&…-üZeVûƒŠ/†:ŸŸ §4åÊ7bt*¥bàíצ‡dèÉ`cͶvu”\ÌWŽsË”îP?qÍxžªÊ¹hÐJ«KíQøÔ[uJr ]‰*%?ÅÜËàD•P<qÕ ÇRÛ Ã|½–{î¿
-B¥‹6¸[6•Xþ×­MiÌ@ÅÑ¥=ç¦Ä)v¹z£æä£û —ã\æőο¸Jùlq;¡Wض<]pdç-hÜIмÓ?+;ö…ä®æ&Þ½ÙI-›—ÄjÇg^Sî÷íP~ß´Y»Â±¤WfgáØS~§2}¬ÌÛȳ l1FØ ¿ÐÇçÚѧJmr;›ÒÜûˆÒ¨Y@ãÒ`HË%Îþ§ÒÆ˯ãƒÌÙÌž6·$ðáÆ}ˆKáž Å“9™ÎOF e.`L¶'ÒG¥Ìq¥3Ú …öü&è­|­0Mÿ>êå–óG½+ËÓ⇑8µÐÄQ•¢óY_¡ =ñÉýA?fد’¦ªÙS·6jËlÐè[ÇaãXíÛ?ØŸÍ/¶Âk„.n…u–ù4$5ö>œÇ³‹}Þ}¦X–·úÞ¼m•€pöíe¹uigÃÖ*L±†ØϾE¡±›Ü˹줹[ü`Lëî›Ùpð  ѣʋ¸FV¯™vc@)ƒ‰ewõû©P®ßÕ³Q{Ñg¿,¯š~„aÍ¿bοX™UžN·ògT«t ¿HµÍÅ©"ˆãcݬLWÔ./[›ìf-ÖÑò]p;:Æ3ÅÁ~Î=†™ÏzrSU•mtuŸ…µ íhph¸‹0©?«I¡–RÅfzzuš}ƒY_Uºn“ª´ƒZU”\|+x+wëþ‹Yº
- ÑÑw^Ä-ÏŽUøìMáEmt–qí=“vÅÚˆƒÐ˜ôBúƒ±X%‡1ÙQ¦w‚¢¬!’ Jtœ3ëì!çÕ&lsV‰â®²4Á$,{Ž³„.Ö˜ònîuËDµº(?t®tÜVÀ•³LY%ë•ï•ª!dþáû»ÿ‡ñN\<ýv¿ J“âÁœ”™N¬­Er7‘TžGJÃæ:šÏé}}™P66GHò:Ï7šÏyµöÙDͲ÷ùÊÊ1ÚDì©ÚFÛ.W ;(Õ1wV¤róCÁïâP)»µü¨ÿ‘ó|}2Ê}î÷l.òpPr³èü‹ Ù}_Æ&·7ß-þ?þ`(:NÅ>“±bœPûÛ#É4«'sÿP‹4õ\• æ^QëTJ_Y¸L|àLñ:ße õ¦\`
-»zž'6ÍœTßµ²2}1p•‡‡x²âL<Cß?XÆhk™ÎØ~£Ÿ±}L
-L^_å>Gr“C®¹]6óDNx.}\3†ðI°ýG°
-^/ õÓ@(Â`ß¾:ß»VWÐÈ»'ÏôˆgYâ9yÿ—ïêèÿ·Ú…ëûÊpñßRô›#— YaÝjK,ÊDñáY ®Œ^x,m9?2d-Y”‘•)(§æ¡—1ø±‰í§ž–ÝZÏ}¿c¡J­”\ªSˆ'Ù `|…x*‹
-Oa#…[´—Âå`•Âè‘B'ÔÁjÚH¡1Ôð=€ï¥³Ÿ¦Ð Ä `}ÏÅ-~Ã7R
- «&`~¾ÿcù] _&èq¼|JåÙ£ÀÓ_¤ð a^‰|Š(="EÂY=E–÷fŠØØ÷Ûµó]_ŒSFw)¼“Òö¦à¬L”IaYRS˜ñÀuœÂÕ8—ªx
-fãĆîµ½ç\}!œ\À|.>ƒ9îî,AÜî$£ŸÍÞ”+³ø:Ò$Þ/@u‹ù¥gßÛ¬a"Å„¹þ>qäÍô
-}ƒsï„ûÑa›A\{#ÞÕÕtû¯oY£þ.XjÑ]l{Eç 5*¹‹ Æ24’iƪËif1ê¾ËË!·MrFóñ$gø~Y­Ë7šW6ÖÚ!@ퟧ—Îð´Ø “SVGMëÛ™v?”’¼·ø]y×È”Ûq0¡ÆN×-ª0_u˜Ýt±Ý‰£Ù%wò¦t ÛÑ‹eú¿
-YÙŸÀ»ç`´ ­‘ÂwÍ_¤hw–O1-[H3ŒSVØïKUÒlž¼¶¯Zx¿ã>hÉWAÍ/Ïø{z<´j²s¯#,NÞLyɹnßÖüJ9NÕ¥9Öb÷t¼QNçµ"ˆy`®ïÓû%‹G¯ÇTœ¼ß=AŠ¥ñ¸Ý{†a uÝ w,ô0¿ÿ¾ôüÚdÓýEŠnw Ð3[J3óE5Å]ù»nûPÓìHq1r®buO:«û‹ýZÆo‰<n0x•¬´| [–Â21?ïÈ÷¯éFœ>vž%«¾5ù ÛÉxÔ§ãy-ÜV¥M2Êõ•zX•ÇFàŸúÏsÅ3ô;厜šñEÿ¨ñ{.ÍT:¥ï
-I1m¤ÙÜHL³«¢öê ‘îõ£¦Ê)6:úÞ%výXŒ‰Ñ:Wð7Ëò­t7&ã÷ô…‹x4örHLbr,?#a¤nl%Ü"n?ØŸ ß?Ýí…_'b¿x®Ãä†þìÓ¹¹âº£³â¦0ÑwØ©ëàÊHû Î¿Ïš0‡(Ê ²å•øê¹±ü 7rû¼Z²ì¡®…\½Š*è•ùÊ|¸°ùül潇ûh²ù{»ã %¬$[©–º»£nEoØZhàØ\ȺmÒµ9ò ç|¹êÛëþÞéo]³×ïR²a‚
-x—ïFùEŠË q΃rŠ_êÕ£$æÒ~KÇ
-SËêãZi+ä®õµFŽZ‹s¯nÍüçbIry=V1ïîKÄ+èo¨Of†…lø²U÷­”–²mgq¾özwÚ<»è— ÚÝ:<º´Ue!êv¨¾élЮÙОZï^8(_:¿
-éL{Üí¾6æ¹þQϱŻºÛ@‰)5ÈÁå{Ø©´_F‹mM²-­ëëPj¤‹Ô:º´4#Hð»f­ÓÚD»5îÅV:#~“ââ4…Ÿ
-²{–É×Z;Û÷i£×l-¦—IÞ/B§;;øA|…†ÓË•hŽËÙÕ|^³¨÷tÐãÏUà-g -~r;µR¸ž;×Ñ(‘›¯ÚúÕ’4Ïhq…41'¾ oê'A¤Æ6UØĉ,*¹¤%a6"J˜’¿øÓ8Ïʆ€ã©~úOQÎFÆù:Y“Â)<o'[ïí×CìÂ=:£æì~“¢,úy½²'ì5Óȶ.C­ëêå¼É,;tfuh§CãÖ’® H­lNØÂïÀËmî ·ÎÞ—œ½`jœ<ζN2o¢×¿GcA(Rûÿ8—ïæU–§ÿ©sÐÅÝûüÁC I¾­óÈR/{?Ì57®2ž/b4:õ¯Ý'j&Æšè!z—Õã¦j7ë+dµæÉaï:m‹ùÑFZ*ÒYÔžùx—ò
-ÑÖeÉØ-™_RîeÏ…½+íx»Z¹qä> 3‰†•šŸÍ7ÅÓØj"Ž´¡ç “Ñmÿê…n›×6=3c©)ÌçBs¼ø_œb@Àˆ=æ~½MÖbç6º“?‘µcÒÜLÙ`lhNv¬—ÛìN½ä»©B÷õ¼<>4AkcdN’4{¯‹å²ïðç«1↦ÅÒ‘*õ´Ù*ºC8 ¥Õ•¿ÛK*ÿØ—È-K¶Hã’k“%á$‘±6ç©œq¿øÁvAYL—}¿O¥Åö6ªò÷ƒ71ˆÍ 83–ÿ<DÝ,ž ÔÆGñäÉ…ŒdD íŒ|…$}DÂ^QüµìKœw5 6<ÈFð“fÛ—bZq¤ÛFéž“!{£u£q‚+j£¿Kfþ¢V¨_.žT'‘¦X»û9¡Þð>|½Ñ>q¿Xo˜9ʧÐ}Ü5é³rÊv ó•õ¤žÓn¶R0uÀ)®Œ8§hN™På S'îÙ-AlÚ§Š,ITsÑa$z­3µ5ù!yp¤)Y¹»ÇF=Y}êC!_©=gv»˜â¤t¼l5ÜÙ*?Ÿñ?Xbú|%:‹|EÒö òD=&©]ú8عÊù´î»[|Öí˜ôH(½¡ŒŒ÷¶hnK&›>†f3{o9ôfw˜ÑºIé"³
-L~²ÿÁò|Ù;ç¤Zÿž»Þ_.†çÞóRƯ¶_2VÉöè)Îƨm,a´^îÐÈõ¤†ˆë(oÀ>ÿ/œýÌ_™pvûýL¼ÖºÚòò÷r¥ßTZoORªÌ•))]t[+¥à+®šçKj7'U3+“¥>®2“‰Ç‡í§·3Ûè µUh¸Fº‡ý>tƒx
-ú|×`)‹€x:ßìýï}«`ňyˆg«2Äsü0ºüÂϹÖ¾Fíù»Ƨ®<hæ4Ö¨ûÙ"Ö<ÏSÏs3ÇrÈyÈd3wšÊÄá›Ê” ˜ÃLéΣõ¬Ç!TQáa¦Ò!¾A´m0q
-™6~gf“ÏÚ,&Ÿ‚QKÞ»9Ÿ¼ýŒ‘¼e%
-à8®ÎlÆ2àÖMÞ|}˜¼Õh™¼µæ0Ç“·žGê
-÷…ý/`BóEøþö&é Â&sþ½{÷1B¿ë–ï-²óUD•’ÏxÞH>:"%²m%d6JÞxЀš¼…2 EÆ"à¦&ïS©0Âä\ÁY¥½ä“÷»M}Ïå=¯˜=Êÿ£óEØ(ɧz×~‘B2÷Iaäû rŽ¤°xʤpñ
-Âœ_Ë)dL
-Uð*肋€9êw¥÷ã¶ö€mš|†å [¬¹äãAßÅpª0]À~š||b“ä4 À ·,ëI¤”»‰”ú ²y&—?{æS•Æögó—Ú›oœ@ ›ï*k”É¥°+ÖSXò„.ÝÁqDz—Baw™BÊúœB|4Þ*t
- ù@Ç ¾ó­—Æ~”Bd.öN€N!)$´³k½ðÁËxæýùØ23ëaœûæë~ÚÖ­~|¿
-LûpŠÕ_¹¿;Åηï#ƒ©n¢ Œû,w×Á½!iók0a¡R~žÑ]=á+¤tÌGIã`<?üÞ¼\Û;{kÛ[åêl)ç3Šý±Þ¤Lï¾ô\eµÀ a©îŠ öÆq¯Ì5_žW\¹5âO>
-Sæ)r,@)êˆqƒ‚àèbšaßåå’”(JÔ†–~ ÷/ó<Û-ƒãfª,åk\+wõê¿šögó®w³¡kUÖ-¥C­qW\eQK[jÀ^l'‹Ñ¢ŒBÛ¹Õ ÐYƒL©)ÍV”ˆÎíÉx6–&pFF‹[– 7è‘þ ˜)}7 0éOŠA!(ÌÑ K3²C€Üþù]^æŇ½r„+¯ïÄÓj'v•Rbm}Fò7Q9­ÛÑz·ÊUÛ²Xì~®dçý†HÌM‘žÞmQÙ+½U´(,“·²™M„mõ:n½.•‘•¥PG_RX8ÜÅ Wq~ ›Þ@.’¿HÑn „Éo4S©âiæ±­¦¸T¢_¥ñŒÉ×1; NZ=©în ‰Ž’×x8´–Æ¢ÌO÷×r檳ýÔ§÷hTÓ?“åñ ÂòÄ8CRÔH1y)Üœ #,F~Ð33[¿?Ž³Þ!Y”IWÁ †s“úµérÓ5ˆ0»þ‹Ý¾Eyš,ž¬‘-q{F}ìÒÒ>ȹãIÔ<#1Ü›VVÚQàÖÖfC/Dé”ý`“i Yåùê0Rÿ=
-ö+'Š_;jM¼ZòÐ/ûnÒGg.w=À ãdisμo²NæÊжJáu;¢µ_üù4a†¤Xò‚Aajø-ÊÉq—G.ûAÕ?ï<ѼÆ\y­ôa!¿¨‘rúÚõÚ<DºãÎfî
-Œ1 »ÊÆ? “w3ÎÏá³³AÜTœå]¨âwHÚŒwäÞN·Wçr`ç·Gßð¢_’ŸŒu¨Üš–yÞ’VÅ™ÖÍscXýÅë¼™~^[œÎœÖ§Üi?`Í}<Yݶ›9t
-²òêæ5¤ÔbíЩ¬*D³ýV¹V5¥7Á<YéùMB陵â/Ò q{?ì×ðsìå‘sŒŒÎ›å¡Æ.ç4¾œN…7žd»`êYŽ‹§ qÉC÷}(¹˜¢ÑŽfa­¾Õöt«~köA ²W¯Ëû~dHŽ¹Ññ uÒò•*û°ŒwNn£&_­–$»Õt(“7ä%SЩ"»B¦&»õ!_5¤,_ù¤ø‹?Mó:–l?¢ãz5¯•]Lß o:Yò™Ñ¨üvGÉD[ë­·ÝurŽ.Uëý£sÌ;ÏÉ=Özt»pqîꋱ:Ö4¢´PKqºW*‹çC¾‘;¤ý¬\@í·R2Ë·xè´ø`õhñ¡]n^qµ•–÷D+yEÅ6Sž~‘fæ4zÁÞ};B¨ÝÊ8Zë9-¿Q›P¦ã"uú¥¡Ç݉»sÕx8±Bcýs'ÌÑ£{\«Ø2fƒ•¦gÏj_ݵóžb}nQ§a×2­¯­7î|Z0%4Ù1bG M±#W±#1Eqáš ½ú„$}ÜÒ&MsváÉj¯á'=#Þbä mçˆ^M'Âf1ÉñÍiXÛØÁðs›Ú.^ÛNcñEäü6Ÿ°—ïAP³aÈÕ‡ Å²ÝQM˜é}Ÿ [» dï0µ9Q[´D¦s”°»ˆÙ“’
-[â{fð½
-uâ{Y4Ïï:ÁïX¦$h ©(¬|þ·§Qxúîç²Îwñ6§ƒì*j{³åˆx~"Ÿ‘)°®±–m±tØo»±8Ö³;µIÌÀ ¡u‘¨©œIêPýTm§¥…ÙŠ6–'É ‰jƒÞ
-ÅSõÎÛ&ÆÕŽýÆƺµ·ÊºÒžu i–u‘J™½’õW#óy®/â¹_\ùõÚŽHù°´'žNœûjlÔ•E@é£ñž‡v•¹ôÌ0ã9=á¶YR[¾OºŽßêQå”ÆX®ÉA‚3mÁ=·[Xulˆë½æ]ñV»±æPùÂR¯&Ì0Ÿ~µ™N jsÜCñ˜xfšc¼RnŽÒ|©™âxa2iîû³ùËiÓë?68Ÿîæ^Iˆ£Ìì² íefæAk*t¶ŸîÀj“ž¡±ªõÏP#q­¸wë4× ÜŽ2h¡ÕŽÎu)ÇŽ9a÷ÐäŒï;.7ðC¶Y/Ì®\>4Åšð¦Û¥~‰Æ^U™ZŽê+j©¡Õ¹—ŠTg‡fPFoÏì/öäâtYŽ‹Ýtò®nG¨ú‹Ï"Q4Ø`g¿Of1»;Ï“†Zg*­ãUzò8ãŽÛÓ|¼kÉÇø!å)"ªÃ"oï[uÎ=·x–é•; oWûM©[i¹ÏÆ”jhOÒ°fy²Äµ@fÑ8@Ò¬±ßQHÃlJűÊçÄÍ5å†ÿb³À©ã¼YÒv“|f³ ¨÷gî.áÊÈ®•´aOL<KÛ¿cMN§gIÒ´$v/–ùƒ Gññ—¾ãîzåɾÌʼF‘{åF³ËVuªÒC²ì
-ó†õ_ëÎûŽÕ‘ÅÔî]w\»7{Ÿ­Ú¹êóÆd«A7Wƒú~°¿ûËj±Ÿ"á:eqåÁŒ?uˆÚ!ì}fG/õ‘n'pêi#µžlOX&¢õ#¾6fs®–'M9oíh•?¨8Ü¡ä>ÚÈ
-ú³‹F=ûë®QíÕmTM.Ó]•§ðOB×d%Z·•È^&dãļlgˆöRˆ WA1ãÝÃèÀÏbïM>Îî„ŽÍ‘^³ }Ks U8«Z+û™¶yÒ›1 òÊP䱩úínòõ¡w2ê´Ü j/<\ׂóûZ}‹$\ ½B6—T¥u~µ‰¥È:Dv¿^•7ó*ÞçJiï­¬´ëî.¥î)ƒ•ÊÜ-®#¤hü‹IÞÄö~g–ƒÍŒõ‘mùF~;p:/9ê¶rÜMáÉûoÊÁ‡$+)S©±á¡B,Ÿß9?¡b”LäŽ#»lp×q¹”'ãÒ~Û»–Ìá .ž3¹bÑ^)Í­¾T
-î½êçŸíé.TZh.@ln,q«Üè™@9Þº"9¾³G²Ÿ÷þËög —í«æÌz,†¡¡Õ—nçåïM)®=Uî‰d¥&æè†3fªU±¶(—ãj£PªÖp±èÄŒV¸Sj¿@¶Ÿ³óYî=¸ns"š»egòÞ»9\cÏ¡5%³9ìÂŒvÏ™¢Ú(`ûB^ÃöÅÞ ë™û Öc"ëU|äÃ6HVû×è6é⧗§|Ÿ[#Å*®sRý~Ê£)S÷|½ÒŽ¦DÉ$á|: ynþ”rRµbd烒‰¯|ÜÁsiÞóÊÒÛÏêKÌl«ô´rh=¿Fªü,þÍðPr‹mhäé1Ä3ú]Qd«mˆçìÄó8ô/l»ŽFÝNóÏ œV.á{\ vjÇq|-)‘;8D±Þ¾äsü«†e3ô±‚ç^¯zÆàaæÃöSXÀ*è]DëÙM ¡Š“ÌTÄ7ú&àèC<Y]
-Øç“ô‘©þ‡7R¬ÿFò.ÖÈ_€?ßçÀCrê2‰g
-áÈD›¤É ×ɶÁ¿žÅbò6sßg¾é>à¸LÞÆ`¥€]&y+XÀ‚ƒ‡låä­æM€~דµÜ!y;s8™™òkÆd/lõ¨i<—êþä¿øo„ûÚ=…‘æ-…ßçYø5«i¢ Œç¥äóF˜ïzò„”“>è'ò8N>½M>%4›ÒJ>åïs¹SŒ›É‡N[ɧI
-={B
-K=…x˜B5v–B¹ñ1…òP’DÛ–H]­üƒ½æÇný%÷Çìsu¶žª{ÐñóÙa%¼rv|³§÷•Š ü%@ëÔ9eRê̯ÔÒ
-.hS¤¶üÞfýj¥ð´a¦p«¾ŸÎâ¹~vví¥s{”Iës·ü¿ÓYùÖ6äõß¹+Ý~·//¼l\XMžß…Åò;MÓÒëØ™Ñ9pÕ»cé^ßU;auël”ʶ¡sD<ÜçJ1ígþ)<ѯ)R Ö°¸?Rk£ßåårŠ$p3EV¬üR^˜ñƒ=zû¥}¯i“ðúÈx‹K vçæÝÏ"¾O³h…Ÿ2è¾|T:§úa391‡"’´÷½N±·ëë\¸øÇsÜtýÁ3•5’ßWVí®O,—G¹¼\.yÐ÷›+^Xèƒ4÷—Éz ¼`x^®)ÚeÓÝÎ2€w9EwBóYZLØÛ!ÅKZ~¨gɈûÇÕÆõ†lÌö¦ nwõ ÙRú~ì·t“„lnÃ}Z•u$u›k ]È«y'í¯2±º\ÄÁ)›ä³0³™uiz;Å©+h…) ¹ˆ!²ø$9¾3I‘Î ‡¾n Âì÷y°ä|WïxŠiåÒãHé¥kpÏ­>S;XœÛ9¶ÓŠŸÇVo36Ãõ´SV ±°Y‚9þq™g ã^„ç‡f-7¯Ødev®÷ØY}8S§n‚ù?Xä× ¼gÆÓÚ»4FÝMa$?Ù?„ê›DÃü¤ˆü%E÷{Š¶à+ˆ½§˜½RìœÅ_El’¹†=.9)U7Ù÷56‡îdâëÙ`Ò\eÏ=y±k7{ó#_Î.t1šÞkÈjJ™c,2É;[‚'‚Xɧs¾>FSCu„½®÷Þ.Øž?xdò~µýÈz—Ìÿ’Þó&¸¾ ‡[ú hˆ0t[¸¤˜Ú¹=wÇòýa«ø¤J«Óª¤îw.ÔÝm"Ix­Ô"/Ì|R›]•7õžv'â’9åúpÜò“ÑÒ˃üe”=•Naa‹>‚^¹ŠøG….úÕX£¼Ai­ ï}y:¤oÈËå0>;x/ëø`¢ä±˜ƒg68C¿
-^u€;Ñ™;îf/øÙVæÓL?Æ-ô Ò×Ï]¸_t¤µoPï¿¤è´ å…ëôõÃ1>à³íÓ.›iÇ®;Ŧ»Ü:ÅѼÁ»)«ä^“–|Ë€[{ãJXÚ²´æ0É»‘/}ø¬m "þà“x³TwŽ\\Á„9‚ú±±*ô‹‹„¶ÌœÞ5OÃÖÞ´élÖ30òî]—·wÏU¶ÉÀLéû)z+ƒ:_Ï‹„Í×û³¶Æ0ºóV„t–euߟ7ú¶½ƒÑr‚Íýë¨0ë@u+äý†õn ƒyȹcG—-‚ì:(ãØk:3úÁúÛêgiŠÉÑ<ã§YñL’©Z÷‰ïÕ.£ÏÖFJµÞÆè©CƵ>_¾?j‰ÁÂó/êüµÙvg¼æ®·MÖÙêeq=ú³ûRêN¹RÝ™dŠ•hTꇠ?ʧžgmð!Wô*ƒ™@ÒN瘶ŸÔ~7ˆ,˸žé˜æ´7ÔÔ¸´Õ«1æ»Mׄ.%%Áj™ï½
- íòÒ`F(¿¿¤ÚBÏ>ñêÜxRËnÁár7çÜ9Ù¬)åõI{¼îŠ£EØåsìùÔâî~ôòƒ Úc¢àäèÙßÅsÎê³rËŒÑó*§Ëî ÐÂÛBo¹çƒ¶xåßêúÚÈ«jÌ)Û—?Vº+å®ì2»Ï—ôË Ôòòñ—ìÏŒEÝûu$wûóZ¬—]°èŸ wš„¶5™›gmd4[Z`µ¡÷Ì WC(Û¹ d¹ú¶ãá5Û'b›0¯žîyT膧[ǘl·¦> Ç {ÕÊŠT½jm•^ѹwŽæïT/tS¾¸u_¾ s€ž~yuª·`Û{|¹ÿ%×Ü×Ej=¶Û1œ®ôÁ$˜“·dE± ²×q^›jÁ9÷n{AöÝBAa:è …ƒ½å_¯~¥?ÂLwÁ{Œˆ7ŒÏiÍèó®ÓÒVŠ¦«1Å:ʾJ;§"½‘¯8{m?
-= »w²•TƒVRÏ?X+©i»Ùo&í¦R{´½¼ÿ"QìirÆûñ6nôdIøº?M±ý`"?)+<xŽæ=ž0„awÐq@&¼MŽq¿JÏîæÐÁ˜ÜM7ù¼1mªº|ÒZ^aå€f;Sú6åëýå·§÷²•ìà³ôY>’”T%d×êIÈ^ÝKRñ“HòxJPú¸™»ôÑ?·¿ü`÷Ácp<v)c³É`…ÉüºæühZ‹ãBµÒvKÂ$É9›¡Ú=B÷,PCK“¾r§î¤šIŒÖì€iÈ*ªÝ­+–Q`; üÒ’ixg´ÒÑôÊ4œL%´¿Ü‹¸úœzl–…¼iBÞ©ìu=}y«tuñJ|ûrýËÁ•ã¾¡CË•~¹ŒgL“Žá»a~Z^Ø*¨?˜³=Ø~?\µ-Òxô{ WœvEÿ³Ó—÷ÕMÓí
-Æ–kð摸ºA¨,Õ© ¾k°bsÖÍÃKÊ"8-閤–Êü‰êŽhæJGåúåûA–—ûþÏÇ1>CðA¾8pñZµ×w`RîNŠýÁÔªñ&:^.ËÊa‰VÛï ðZ3q<—–L°uغ ݤóá«Ó&Î5B‚`i7G3lPl7…aÒ-_œP§ ×÷Ljþ„!5ë‘šbÜÉüµ2 2—.¤ú©ü&Føñr>d6ÓÉrÔŒ‚ëÀ †ÒpêØsg˜lÿ#ë:üdä×{I´2Z³*å<Ìå{gu!äO½ê’»ÚÕÃÆ>º…;“ô‹póãæòMÄBªtfã©œYÔÉ¢ÃùÞ}×OLö]ï§GªÞ¿BãzM2¯µ È”j—EäO¿X•8z1Ì2y£´âòŸ–mÑ3]7Örš­¹?¨ðöÕÀÙ§åÖX沘4"{Œ€ö‚æ´.è…>ÙÓø~ó òç&»k¡a5²~íÚmÖv~°•LæÕ@«>«láU«²h)¨¤ÖèT½ÕS…PÇ
-¯W~óçs£InÔ[øOÒ»z;ì7ÖG³Ûv?ªj3¸ØŽ®YJ8x˜'³l§ŽSu˜!wÃu…ì5ó<Idìn£¯Î‡Z#3¯¼Èdî^kª.È¿¶«råSþ°Ñæ bv›‰L³|.¯2ïRyù®ÊŠíÊÙ‡{(md~÷ƒ•6 µûEÔžmVa½“L‡­F>°û%aÐCø¦¡žö|[†Â.'–…Aƒ K~‘ÎeXýªdáJ´ö
-Ú؈ù#Kò¼+¸¼íÿ`nQ“òšuãr~ßJ[£„”º%»Z<XW©hq½aá½·§»Ã ŽœïêçÑ:ÜmþÖ0·ywÇÇ¿UZMpÁ©¨c§—{`Ö÷iO,ÍœDª,Ð[Iìá/†å¤S…Š‰[¶î*¸"­;Ii¾“BcC¹×å„ç^…‘'äÂ-ÖÍqÃŽŸýЋeöÓ¦nÙˆ˜bY1­“Ydë?>×{3\¦èÇ1–Ç3+ygìÑ1³ÊûÌòÆï~á¥ûQ4(,Ï9*¼þ³4/w¨,ö:ežå¶ÅeÈ¥bíÉѱpºï¬x¬]žù&«ß³ˆI<ñ•+áø‚¨eÖ–Îe´ê¤ƒm' ÛÆìëºÓ=<ŸwÔZjY´j£,ráW2(ô÷ðÝ$s°—u\èeÔЋ*aZʃ^ùgó7;«Œ­æ¦ìþYš—ߣŠ½EKb>7Ž&•zùÿ1v'Jª*Û¨Ÿ ±WD”NQé¤WP[ÄÐ÷¿i­µö<gýûD܈XS‹AIæ +EÓ…Ôö-;S¾ÞÞi‘¾*/A²÷|y8ÍÀʦ×Ì]ÐA;×ô$:;É*}°•iC!§¥¨ýØÏ úYóî¢_ÄÀ9¢ã
-ÃìvÏib’½™>’yEÈ1FÿÉ„.0À…€˜V¥àG€½1xkûÏÐU®üÍŽvƒï±Þ?IÐ 14¶$é¿2Ë2â'\¬ú
-[ "b’‹kÏSÍ6Ïjýñ(0›É®µŠqæÁ;ïV°ôÿ‚åÿWòö7äØ|«9ü;k‹Ã‹ïôWm·øÌ>.ˆ5|XíÄP¦
-¸Ï~sã÷Ù/ÉûN“Ô
-
-ØãI•Y€k$ m
-ôÿ‡6a
-Â!ù0ÌÄÚ
-×¢Ãd§{gu*ìX!høìt¶¥â¢ÿÓË.ĵÊ9úêâ-¦+,ë/—·õ3Xâéó²˜öò‰—¬ÛˆÇ FËýìqÅYO½ÍÜw·y)³ºÎ‚•}™J8«æç/§?€{Áwtú†X§¹ö|ÿ<+—Õ:qã Wz›QND§G³Ð´÷®˜ßú¿rÛ–kùÏZ“î…•9ŒËNfÙŸ ë¹ÌRô k©»l¼›:›æné “(˜ïjß¿—ô4ÝäêôÜNY;â×ÆùвªÉeòÒüó—Ód†:‡Ž/¿Os9ÅK×Þ.Ze-ë|”CíðPñÐ1×â>ðʼ•ŠCw­SÃÃò±f :Sƒ¼nR.¹ð$n8íJÌÅý•+±4 ‘PŸ¢Ýpj›«xmÝÓÌÑêtÑçd¶R 5Ì㮸´Ìå;˜0‰MZíäïâ`p.|Ùÿ!;”ï Ãýá6‹17¬”kã1+Jûì`8ð··”ÝVЃ°GËñ©6^V^ž¿éÆsé¬çfõQž6É:¨-í±Y'-[É÷'ñ¥2šÐ¥úx܃‹ssÅã¾ /z‘Á禾糨^BMS:¢¯ÕâÙI çÚA ·Vð]Ûý pBŽw òÚ‚}‰Vãh˜=}Ÿ}¬…íhôê­/^ŸZáiõ>IYq‡rÇ·Ö~Ö@á«};>ÞÖÓ?å'Nß©?óikœ¨´™×†ƒß ŠdG–vBÔ¥Vï:`+ª¾ºÅÊ !+
-.åEÙ~n—21˾ì¿ì¾ø_¶Hsì*x´„Å* k0TSñK†À¯Í‚Û]Îòq{u<ÊE&+œcÕëÑššäqc·«óÄÅ”×x 39\”
-†0ƒêzp…:Úé1êÅ?ð*5¥ ßçò”ü‘ÓoܤÏ\†¥…À²[nºRö1¾ì¿€ÖÅw±ý²ùCš[<N·Ø2Vçú£;Ýmʉ¼Ñú ngåî"íÛ.r#Ú³óµÙŸ¶†=Ýš=øŤkôæ&,^÷Lt™Üä4­5mKլ˨b•ú„<ƒ©þ(¥»£ÔîN$vÎ÷áx
-þó„Ù†J¼?ã¥úþ‹/”bûeóeý‡†Ê—k'—‡çç8þ}‘8Éë–žã^£Ûu¹ØnÏk —=m­.Œ5ïæ•IÆÏÏM>wÛeÏ?k!9yªæ£)Ö¥…ȳC¹6r·\ZzFÊ=ß‚ˆD±!”Žo——ÓÌE3åO´5ŒfØpò¹Æë¹ý²ù²þ²úC\¦æÇ(?B[õÆÛ3-cïÎyƒ.Úƒ>Å3ÊEcÃÎxN¿ù1~Xúñ=]jút¨x‹¼ÊñIFïÅ#'­(¯(ÁÞ¶)¦%”M{À×[åPa>šËp?xäÑxÐöAG¼›ƒŽ4ñ¿lÖ~±þ²ú¿‹åW2ë‡yûܵg¬¯òh´ðN;Î-*pwÖœ[m@Åñ Dp³0C]E]k>YWyšØN¦ÃW8ê-v)O™±ˆó ,Tt•¯—›-®™¯w‡x  ì>ø7§•-û^„Öë+U¶—75¶‡´A<Hfɾ§Â¿¹?œ§ntg®¿{VôÕ#dp[“~~Ú¾{öT¼`ãõè\4F½YCoQW½WrŠ2™ Õ¢µ´–Qàä«0êu^%ñg´*åᤞm¦Å„ê;¹„uFÖd³m|ÕËSJôw·ŸJ±Ë/Q¹ëgrëîö‘ÿÕª.{³ ‹?Üæ‡Àÿ}x´Uò}éIÙD‹Ÿ·°g1« eŒ¼~^3ÒNUm?DBN}ýÑR^Ž%®hybiÃùü¹‡ž¹ˆ,<†“ûõ3˜†~¾ïN•]l¦íÞz¿ôìIëÓÄcF=:¤OëKž>má}šoL%~­˜J-˜Q-Àw÷þ]ü­iaóûðhÓÄ.ú‚mWe§ºÒ„i§ºgÇ&45sXË+TÿX3Í“¶p™÷;&ÈçÎŒG¥Âjø¨¿ƒ¸Fý7¼MúÐçûׂlîe”{Èu„uK§Q—©FS™n×3Êlù9ò.íyòÎÊ.…-6K
-›¸eK÷_„Á«ºÞq×±µšÖº‡hˆ2G Sú-÷­÷Œc­ÝT¨Cà€Îˆ5¨
-ÊxKóúô!qx÷j "tûhë÷3±}bá›rï΃w·|e¦vb4ºc(ªµ
-dÇŸXļ”ì je@?pç=œ:oª?'(ÍZ§yÄlfºÿâx·Mo«L{ÖjN çpE´içÞÇÛ)ÞÕ®û­Âm^¨»û”›—Âp*æ±Ar€–RáH
-»¶x«çÏùE7˜Ð;æ4#.ôe\Q7ȧY*‰R Ú'ÞA5ÛëÚmÛ\ô´7çl;ßëÎÚù
-çµóÙ®ÛôD
-\2ü³U]ÍìÜèØØ)í»Ø)¢ì´kÍÿÅïã¥[ûØΑ&v‚YêØ—Ž‚v‹}\/›Œ†ò&ÚCúËCïÝ­M‡7zÜÒ2tëÕ({Ø Èx7äIºl脧83"sñ×ø¾>´ùÎéŽKÍàÓ:ZP ç C?ªÔ³O·‰Ãã;úð=âFbŒÚÙE­cwŽZ«Î¿YßRiîqÁi:ŸJc+÷UC^qG*#Ö˜:¤NõBO¢‹oÊ~”nDv±{vòçk¦íë­8.ÅFâÁâÌã#¹j´Na{Þj4Ù fLF§æí弚m*Ê£$›k6œÍpЀ
-'«¾¤s•u´Î}½žõåYmµìÚºTû7?ð²;À§Î93›íAó€¿e5g‹´ïå(ÎÞfš¬%EúvJ!‚u Gë,Á§¦e<îèëÐÙJª Ô`Ûn¼…AúJ£ëºÓF¦{_×ûkäü׶“Ô¸èP©îqŒ©–§Ž^9RÄ®"ƒŽlE>PJ¥Öíò9ìXåóÌË“?¸û{Ñ›NUÌž sÙÐe]mg“þ_iïáPo€zÌø:N>¸<›ÝÑØØžêð§TNäR©³ÏJÝSóåK/h”j‘*7Ͼt›mÍÒ„//Kí¢|.>ï™Lqj™X‘$ªb!Í_–gd
-Îø j˜‚ÃvíýªYz“™ü‹ÙD2濃çõkã¡ÊƒÑ“šIÚío*œ‰ÂOÌt_0^{½4A
-ךOÓÇJ£áùH¿ƒ~àü&l_óœ>JóÜüUʬïKÓ>¼/g5X|( X|f.pyí!pyÃ1¹ã¼=Í)Lþž«—¥~N© óÜÿ’…§_f°–]d
-Úüa›2•o*ý7ñ=è»Tµ±òÚ¥Ö¥†B(ƒPÏZ©)…el×Á¶ùmûµ+è+È^ðW˜mn {æÆaŸÌ5KÐÓÛaÐtTe!²=Ñ~`ˆì×W€ý"•q"§¢
-¢ôË¢|Å…¨¨ATz-@ÔÛíAtqêB46N º»ï}¡GÈ >þ…š´†Tå’Ñ0S;÷»ºû¦ÉìëÓjaÖ²ØÈ¥TÑ>á«HKÍ[Þgœ®ÂÌ)3yîö™š;ˆ®27ˆÎµ¯ß­TÕ°É@tû…@t§ThyÒèUžƒè‡gý=tµ Cÿ ´êßéaOß™ŠU¥ðúòúƒt€ëÊÐË4xІ¹ ­ÉZ4Ñj•sµú–ƒ‘ò­TþØ
-ý„ÍFúðQäî
-0
-½Ók}èE/¤6x>?‚›
-?ªÕiõÞ@âfLzÚõžÛ.¢õ>F³fæ‘ï÷/ç_~à?ë¿$Ÿ ¶
-üÌß%¬¿>?Gãô|»Å(J­ø²Ðqг‡ífù\*4›ÇÓ©B.Q±Üy.˜¬huÿÊ÷Æ{Ràç;ç ¬vŒµ?ù‹øñðsLÞWzSrPm]]Š‹Uc[ó–f!v–Ø>ü¸^~¿¤™Ìt‘fÊC;Í´˜qš1à¶Nú«õæ¡IâüJÁ+'ÜpÄê$7ò‡C«ö¼í_Ÿä½s7/d—)æj>ÜFð-7«Ò›ÝnÊ=rô¯Ù‘¹® ùJÛ9ë*ÞÎKóTO—­iÐðâ.ºoÕž»“wþ£9w`»8s`%;ýi¦ë¸ .ÕJ3i0UèÔ¼ƒ8.Wº4à£î6ËŸŽeŒìvjì¼Ináç ¹`³–îkÅͽW—L-¿¼åË•%Δ› {‰’^wúÞ|+Jî§hšnoä:n¶zß9½z›oo&2/öÙÁ<=§“i}ä8¶~f_¦vScì‘fvëùß1: +Z8žpÞ—Þ+½:‡q(·öô¦EmýaYXŸŽk…1Ôzñ‚©#èï'ŸÎ݃r·Ër½¼3ìá广¦±¹0TèYà*ƒY5cËSu°šØÿº´ =[·£ YíF—š­6§Ù| åwÓ/¶¹ðÝÉ~àßÅoŒi–Ë/nä˜ÓÃR<‚×!wËIõ7Ⱦ¶9äleÂRo1cǪ×EWŽ›{zÛùεO³ƒ­ß§gGyOw¶ÍΤjÝõ fµoýOfÕÅpœj'uÌ\?ssÙnîLö彌 Ýkê;ö*饰5ÕzÙú2ÑäffüÅüCš%?Þ³!V”K ÚÁFœþnPÜ›£xµå5*Å¥5;U=÷y!\xœæ’ÏjǼg_ù§o=FÏÐêlžÏ å>c/!ã ÕL¸ágß»ú.͉z¹U›·Ù¥zNUsÙ¢r­à¬´Ô¹-?úä‹ùÅøivÖ\Ý­\jŸ•²÷V,»­h\g5NÆõE’;!^fMœb†lÎgÄÚ·šªXöMµ'ó³ºúÇÞu˜«Û]ûe3-H¯äÑ‚¦0­†.»¤rS¥õ‘UÙn»óQ<K£9=ËJïƒÑ—<¥8‘zõ¬ùÅø¢Ñþð}šðâ·Ww<›Ç#\ò}é­^­½H»î ð<(³Ó ½«ØøëEN’ $ŽZÉ4‡xÎ1„zºÑG¥è¨©ðîªàªÜØUNÁg«²Lx+ ô^çÏcWò¢£(eqØÓ¾/æÉ4x/¢…âÈÐŽùåwMøÅBýÃó”¨NÔ_ËpšÞ„mµzî._Ä»í±a³>Ò*¨-§—í0µž¯~aÂŒM|œn†Æ®¼QõÑŵ5õ`-TŒïûÊdÑåé†Õ°‡¾¥Ï³‰HÙ¨R‡-š|…çøÀ|åp\r'…{põ”#¸ú»ªþÀ`Aê_´/*§RÃÿÁ#b†N¸7[ã=[ö…u„Θ…+„mùäë³Æ=ÍY/üõ˜@ã lrj”3Ý®vö»’jö[¦bñ-ç–gly3rÉw -[×HÊ)áKDŒSV(É~‰m/-N vÁuˆñ’7˜hЖãÖ ­ìdÀKû¢&§œòEþÃý¾$ÁVÎõÎÃðý‹À­îžÕõ–÷cg.ŸN5ÛõðŠÜ»YÈÛ~„ŽUM Áþ¶&ï¡S±:zãW[ZFž+ns_,Ôí³P.)w¾ޜƫ…¡Éªè<¸Ï¦tÿå£>ùÊÎØtfŸY—ž£¬Ëˆ"`©~QØÜƾȸͪs㱶=` ·œÄ®ËÃ^g†FÓêä=â ³0 @ÏB¯YµD½ê½‚b³zKžkÛþ¨W±% ŽtS,ù¹Pöé_;à§ÃÍhh~*ñÀz!¹~La5ö· ¶«Ž„Þ2
-ìŒã‡îæEÔº›¸Ì÷àŽ®—\å^_6ýáÚ½¾æ£áÊßü¼#ésÂ~fFÕñ€ª~ôÚ-¾¨8ºÈIå™}(•ÖY‚}¤Ç ÒWyůÛàÓ—Yw8Þ|üí]Nýøy¹³ï(ø°™GTê ÞåË¥³W“‘êŸ=SŽ>e¦|}pL9¨ÉŒTìÈŒøA%fOSÿƒËv½œísÝ jË¿2ôÊÇ&-Ú¯– |«¸æ…2}ê]¤µÈ§¢o¯ËBàÜ:üi™ô¹Ëö#o‹›9xn.ó~â­Wìg:ݳYwõiÚå/3„‘î›æLŸj/–®mÒïë-Õ´yª©ŽYJ_¿å/#*|e¤/âŠ)N}±îÿõ Áå-v†U%r¼žÜKz#¿y>'â$!¥`ÿ £mòäϙ碾ÑÞy‡¼FßO5GëC’a±¹áÐé w#¿+¬Ø3rÈ­.ûYêkuòöÙ0d»ÊÄt., ’a bjò=b*îGÄswmâéEOÿƒc»Ž7ai2ZxÏ3ïTëµ¾=}7 ³Ä¹Eur—SiÕÏüynì¹VÕ¸;Ôú3 ¤W¹ï¾°»|“ýÞ6KJ½I ÷ZîbS¦F”´f”ö”iU¯¤¥—ÞÄëÖ¯tÒ³LtºèYê@·¡×^ZßÉšºÛ^V£ö’˜‹Hñ
-Eá„„é ™Q¯T?ì©;ŸYîpë ÏséôqôݳãR{³[í
-wñݵZxï‚êk*N±sj­›×Œ{n¶ˆ(E-­4âŒÅ4¨aN¯¿‘ h=²X= t¡î¶‰aÝ­6¹ÊàKGŸèÎá]ÕíøÞùçxøkø­Ý–|=,r“•÷f7èôÊ ¥Íð²áß+E ykvˆKóÓæxû,6q¡ÞDŸ%žFíûVh$Po̓¼þa(¿Þ[Z÷ÚŽ‘Z^èw~àª_z)Uþ¸ÞUùu‚V‹(ÏU obXÙ‹ýÊ^Êþ~óó³±Zk– Õí å%rÇ…Æk^dJÒ§[[îä\׎m~·ÝbÍÛÍýL¯=«­Ó6è]¸ê©†ˆ—¸º«”àªðêÕÒtATäsP‘ „V©îçnù<ÊË3÷.EóL³„}@ÓÜWÅ»=©ïC|XœDÙ~qâ'
-må0¸Ãa¹=3çFw›ßVËæ–ÆsËF>ZÆÌçûIîx¹ªo²çrí”UÜp„³)Šf"ÒìfÌBNË`{u ÝGÅdUƒÚ µC…‡Ú‰µ‡ÚÑ…ÚWp·nï‡Chòþ“Mmfê¦ëdøµðlIõ‘á¼I[“I©ÃùÃ6Æ»·F*Jª®‹Ïmä"ììûŸ°˜¹N²ç èãX1?ƒ:sŃ:Ûãê\Ð+Dä="…
-D —4Dh˜ ³Ë"¶ö"üA"¢ŽתÁ¼¼ëà8ÿØ—ïÂÐ6°¦dKQÀ\¯Ïeã6ý “z‡œó>vãú°æ]Ê—t½+¤Fn•ç8ÙÍñ–“á "–+ÀýêBd¦µƒÈ²|†Èîá‘R-óÍ'{³*DÞªD}¢~Qbù+5Þ µXo!jéä jQ!jºñ!jÿ x~ïï´wîFQL+!°Ž“•æóú†~àÚ®v½—[ÈçTÈäÞoîÛ¬þWYz{ivÖÉþ_É[ª± Šƒ"ˆÒ˜l`–…¨ª@tmÔh%/@ôq?‡˜¬v˜*õºZí³£ÿc mØrëÛDu<åßÌõ±"ˆü{bí­ˆÔvG*-ÙTï† ç Wâö1ÓV-ÿ¯¸þ
-išžÁV¨W#úÍ-Ct{xÿ+K/1Ä@Õï[µöÏhÛßY$ùŸimÚöK ZlÂ,.ÿ‰uŽB %ŽþðͽúÓ¿3Šê[OW%IWQ
-GÇ â³‡sæMÉ,²Ì½ÕÁqÙwÊœñ7™®þ‡ä3?Œ“n* Úò0yPí­«€¸å1Ùrâ¾Ô]=ËP¼»kôþ|½Ïì{4ëßw8Ã~Ë(Ÿ9BmüÀ§3iK•:Ö`ƒ=hüT¢ÛZ ÌÉÓÞßãürß¡‰ã..^ ߃%bÛ¿y†ÏÍåõžãGk©@Kÿƒò¾)þ’|â”g¨‰ßù.¶Ô
-õ_z
-u\¬m¤xÓ'šz$èG#_ï]í7F„¹Û>ÖÕw—§òí˜ÒÛòY¢¶Ú"¥Z°¬îu=šS¯Õ¹(eVj`—QÕ«/1m‹/îÔ»»h/
-¼÷b»†GnL×uÑôìB·èä¶%fŽ˜0«7+î <=¨‡Á¿H¡åKI!+’_åvG¸RÁ ·å´q:ÐÒñt•rA[,ý%–Ç7;½Ø_תMu…R½é²%I«EG•oé÷Ýõ^?°Û]ùg•§ïêóm9ßž”zw¶¯óÒ¬lÌ'Sùo¦5{ù±Ñ]§mµŽ?±‰>7é$á86
-ì¿H3™ªžfZ¤y#ˆñà‹ãqÀ·he÷ià™]Fž§ÛÛ†V¡DVKzó8=cª;˙ͷ±¿ší?ëý¬ÂáTÙœÓ:A¶ ˆu«6êÖxÓgAíOi­þÀãù+ïéÙênöÔXW¯C#¯­ºÚý/¬ÎïùîÒL—?ÂMwtYËÍþarð]NÝ—7ø–Y×OÉ}9>NcÏÁ–ˆ³ÖwØ<Ø{o6ґѴцLÛ˜•kâ!ëÉ+[
-&$YºŒ·úC™NÆ\¬Ä¢™M4Ô2KZ÷—wQ/å¶øþQ==&µAf»Ê%ͳŠá$½/Ýø»`þfvÎôö”Ê£sÕ»°{è#byÅ—–÷ÿñREˆÜŹͅýë=«nZU;÷ ËÊÜd&jÊØU´‰¹¸¹™;ˆkƒ«ÉÁ¬ïxù¢—ó¥ÉU/§ž¹-ˆgÿh+fµ<ïgÈšú£×䌌(X ¤tkô$—˜ÿ@K.ÍR¿¼*Í»q…êÑ¡ÓmÓÛ=WnþÀ«1S)zo¯ùq¸%r™<ù4EòÓ²Ž2¡œgäGׄõX0
-“XÓÅsliòõê¨!oUT}3ûG%“ʵ^Q&ŽJî‘g¤L}%ÿÀâ2j-D/@Â6un“ë~a¾Ð_(›¦ä/Ïúä`\åXÜ{uЫ·®è"i'Eg›œÒYí½<ÛfòØNæµG4}OЊ‡ 5n‹
-¡ÏR_ ¯’¤6qÝPðÆÀ–m“÷Fñ‘÷¥÷ep–z%þ!®äIV„C¿*ðÅ'Éïå¦È—Ãùœ;fÂ)]çê—ùBsµ‡E~!~àßÅ/,·3ϲN ;ø³#W·ÁõÚ­4¯&‰O¹Óô3Öæ*ÐOF‘›ÇzÅû”ÔËðÓTnRž–Ÿjž%fVч)-êyGMІó£¸sm³W^
-òoî”Ê\ð¡¾÷¹Á­Z±ã0sàúàE¡¾ƒ±ß%¾t~¹½Ð™yl­/ÃmP‘Ë©a£îÐóK 3æL<qÄÚÑ\7é•põ@kdñ»Š5ÔœÒî®ë29ˆ#}‰í/qÈ;šà/¦>Ø_yNí9ç¡ANŸƒ›{Îð'„ö§$ò‰»6A_Ìé)g–É)u@L±N&¿¬Ó~·ÿpež”ÌÍé`£R2¹p¡qÓ)­¢Ý^”^ã\çqЃu²P£ÌÉW&—ÛE&WÙ÷ˆ¹´Á¾HìÁÄaÌÒ‚ða†ü¡MJÜ™j\Ã#gCãI®“ ú¯{ï“Š–eíõ‡;Óc•¡Ö]§Å »¾Ö+€ÙË¡Ç_:½\a‹ÿòÿ."©éûž=쯱^‡ð–²ŽÍÎ;¦0qÕèiìøýAZSW~ìräö…ƒ´œû±¸ RDØ…¹¸!w>¥]Es°ÕJÕ¥¤Vÿå ÄÒCºc»ù\úÉÕOwÓï–»ÈÖ%±”“™Ò!ð™ÒñYbJ'ü,;&¾´á©àÌ·ÿ"ïm—wìª}j‘î&䱩y,!ã¾é>¾ùä¶ȯ ãŒ2¹h&n>ÈNØWɤ´ JË*‡žø°µÛл|öçyWbßÂÆd3}kÚëo—ëîæs83û\3eºP¤åסBP‘QÚÖXÿÀ”æ¯ ”æÄ—uŽhü?´~9…s[Ù‡»HÓéHÅ^ËŠõllñ®Ž Ä~”aÓ™Xðä œ.×\¸»‡Ãë³”ñ!zBäýùQ#XÏçzl¶$ ½<ÜUº<ÏYÌ~!.èãFèÚ{ö šÙ#LŽ)#[o“#l¶êvŸ… »ói»P²-²u¬
-zâTsßÙ’ø‰»SÄÎt1F;ô©;h´œÓ^K™ö‡¾µÛŸæ©Õ¡õ'€¿`ø}0³º_7¬»]¾ééË·ÆyË©·v|õüÀÿy5kÍS94ûPqe³¹v¸ê ·µ°»kŠi·4™#Ìèµ­Óg*ìÐ ïÚ¥Œç•#'i(¯nlä^u·vn/ý´#¶5|è–»8Ò=Û­]6ùüÀ8R]`8’[´ðükÚćí5†«Nó_¸Â’zÎúŽ?›l0cÔ«eÝ_E9õ‡wDž³ìM7º"UјZŸÓÚTßÑèðq§Ì}ô÷ÉN—Hë©4‰˜“eÚlÇ}xR{™xFfBç¬wÐÚ;Bz“Wßéwóî¸yNOIó¼¡Í³§bÍóX@±*xù‡ ÚÁ¾ßƸJµÁ¼Á¿Ù ëPÍH®™Ñ²b_…êVÝ ¨rß銛I]_!‰ÒzBГ×ùä› 1¤g'‹­³íÕýYnçÅîç /2ô°%-y;Áöôn^Š«M³)gnè8ä篆}×´†}\?ötØhØÃa³a“ Ú°íÆ–ñ>åSkL±ßh(¯û*#ÊkÈÛOZîL‡×Þ„H„…ÖÎß Q+8W­V%Øéí1Õ»=°ÆË6£ªPngCïÔ‰F'Ÿ¼Ðx±¸Ñ 7ʢç:ÄV Ú2·Âj9¾3ªåãZ]?Õ¸º^ahumWÕµ‚Ôÿ°ÈžRiŽæ9Ð4Ïûº^Hr7¶³|hׯýO¡´ïJ÷Ú‚|ž»½U;OÏ#´3•úãÆu÷îzõî2-¥zf€Ýj«º Õú—]±›P³ºí2L•Ï8Rµ°úØ éí+åÝ5-+•^½\;gøR¨7Î¥*¥°TBK!”CKçà^ÿƒs0#ÙŽ­š
-Þ|¥2öFåúze”.ÃǼd -¿Ô¼Šañ6^ÆÅ ›ÉÛ9ªQxnftaª# ¥T ›†‹$÷b„8–_D˜Â""¯óŸ½Œ ô;j"ô~ÓøÏ­ÿ2;u².<C›}™-”Ǽb®Ÿ;?Ÿ *¼ÎD/oñ
-Q÷~`ôÉ1Vmí˜Zù\8ŠÅvT Pxâòp1QáÍ¡8HK˜“W˜S
-O¸@Hpn—ќ袽\¹ëêÙcÛfåõ%ÍÖ8Ë„Åž­ ‡4+»¨-³‡h†e;³™+¥Ö_X‹%›£©'¨3ôe§ÛxdéÖñSBÒá9ƒ]4ÛËüª¶Q¿ßåRz\ÖR~5Èrp±pÙ:7A·ÊPù¡ñÓ± |zY@ø?
-¨ëÐMÓ–F[Me¹§ÌuXaÇ7¨×‹-´Å{5EcÿÖŠ½›_šÔ^.²˜¡Ö Ç­™mÜ›à—q°¸i@D­7†ˆŽ=‡9Þ@„ â¨]!2óú@$.V rQ¹X¨yl òÇùˆ[ù<ë•óO_8£­oÞ²1ûæVÝý/ò  ù ³£ÙéatgáWÛ’aåÐdH=ªÁ¢y,¾läΦ›;f 3è±T&aͧ =\ˆì–—)¢+ˆt»›ß<éw+Ht(
-‹!JÓ2 »ðª@4lP=h*m?V½^ƽQˆ ¢/ô¢S¢ÑïŽ1Er0.¿Æ°Êö¹v m&vŠS´-Ñ4»yWG=*ÎVÓ ÏWÓmöR‘WGöÔŽÛþ·Uï $6¹ðïÔíïØ`vô€è‰9ä`ˆ)jÏmû×ô«ñ7ŸüûMdíBæŸ/!;ÙC¬nC*Õ¿ç
-þk‚SMR5Ö’±ÅÒŠõ ÷}é™IÒ+¯
-Ä,zJüúŠïõÍïZ4­Ð«‘¼Û)yg·ƒ$òL’8'PXLÐþç°õß<8À ãÞN|¾G=óä/zá~Hw½v?uìÖ½>Ÿ“7ýãõnÍÅž»NrÇÑß<ôhZˆ­K"½ }.lÂ
-èÙ±™ž¯vâß\ÿTôúq”iÇÊZS§!§ü´“¿‹ä=)ˆÉß² X{8p
-‹‰.bÉʴ뜗¼³xïT''Ý­ù𔺳
-­gµL=ò:•³jjŸ‡3ØÖ¨fEã*iaOp¼OŸóñk¿ŠÁE•¯üÀf—ª &ôÎ6Œ¥y©ý‹ßÄ÷ãlŽ»Qff´c-.ìzÌ5Ýì{þy]ƒëUƒ—}雷‘Û­Ø#ûÊl÷ñé1w§5ó;_Ÿ­=PÕºËj9”3yÚfÒ9XÇñ¼¶¼©ðõ1=¬P43…ýØì°ƒ˜:_z^5©ÎÔ£1ª«
-ÆVÿ¢voWþoøïÓ„›]ôN§zŠíêÙŒh%YNÊÌÉ›PÏíºÇå|K„‡Yùþ~Ù᥉Xã%ј<k
-9Nš
-;¦'cÑô^¶jf©ùÄx+ÇÈ÷®[_¿OZP(<~`­"U9)UåÒØŠ~mÉòE2¾ÙÀ£iá^ý b(ÿ·)ýò<¼j|Ô³òÝàkèVÌÐÈò>k&îâæ¾xtg’Oƒž¸­Çͅߤë8ÙŒ?æç}*›¹ì 3äF邘ôµàøµj#«ªªY´”Ë£î)oå[¢\ä6㥣©u*HIRlI #qT¦V"« 1×A/IXGýò—Òßì¨â/-¡@]º»% :š“Í{îãôš‹œLŽäX·W0§Ù…g.ÒËÁ>ó/]Dȼ&·†5U#†¸9#ú;¦2†²ÕQ¥Ñknè#ò3J.»^IÐ,8ˆì;y¶‘À!kð;îÙçK>ã²s2W¸j—¸jx-üä—;.eÄcD² Nö d\_>&—¼ û“çT{¢»I WæcæÙ֌؞éå<³ÕjØ䪢}ÿ£´ô{Q¶î:š½ÒŽô¦!Fê.N\åJ²S%Sà¼Æœßg™-_&GhËàP ÃLZ¢C†\‘Ïx`™ç 5ñʃÖÈ.~)|A-4Ë¿\b/¯#Dl”òª¶˜oÖùy¥ƒÝ-[·ãÌ8˜œ‘ªš¼=L~`]ÜòCÏå·GtUƒ¥ªUÄÕØÂDøé’O.Y~ïn¾üبœBìahDËÁÕJƒV‚Å}›ÑŠ}JIv>0t–þÿèzÏ5U™vk{ z#J‚"(9'QÅ,fÌ9¢îÿG;ï¹îg=ëýþœÒ³çÑ”…V]×8ƒlëlª9 K¡b?ˆ©¼ùì/Ðq‚ó {¥7&¬Ñ‘£1=ÎöŽ*¸´ÕÎ4í ×«ûʼnï·ÌJ£&)õ§ºË•kô^WÇZá º 8Ì^SiM‘OgÌßrJùH*V™ uÏjmJÍÒ½X–¤ÆdmÖ§›ñ)QÃh4}zÍÖôé?êV÷’M‘dõéM±ý ÿâ°-{‰Œ›Â”Üâ2,a¶Û66çæLµfõnvýÖX÷¼Áëý›…–ë8ÖK™U«xý`¯»é"»‹¶H…g¼œ®8Œu‰ß’%ä3F©WÊØfã ã³Æ{† ‹±>«ÔÏ?ˆŽ®°V…qFÃæKG]Û»­º®ö3Tâò?€¿Ø>h9^Íu~"çm2ÊËÒ‘ËSX5ÉiZ…ŽQoÇ…¶»ZÕFáb{Û¨²G¹mù”W®e¶ÓÈXíg7Wz¨#²$·G¼=¦ª ”UÙ0[+O/÷¶mmñÎLµ<OT¯—vE»×™R‚QÝV(³½V¨RV‚Nýòƒ(A-€•Ý¦÷›Õ3ç;ZÆZÇ¢úuð€ÚÀ)…:4­=˜kÛ…ñ­SÍk¼U žjPnbnϺ¶ãØ‘Ì©Ô·‹‰ùZKˆ© ˜Ô-úWµ>»’^á}Ss(»ªnš­P-lGC¥N>·ò©)¾dö6(HמhIÅ\I&Ÿö^ KW[K¡
-Ð/2_¬ÕŒùÇD?‚cžêqÈ<“îbs¿xNÍÝÄšËv5¹v…z$%«Óº»¥þjšoÚ˜˜úh°3¦Ðêf å Ð+Ë$«­¨¨áÊ©µ¡*‡´-Rh_òåæÑHMw)>‹·û"öV^x³7]xóùXx—ð†aø¨ÙÌ¿XZ!ЦB†9†¡;O¬Bœ9ì|Ñj]„®·*´HVJO¾m˜#*(V&ô3"ü]_Ͻ°…¶ZÚ'ÀOÕ÷#X9ǘ° Jnuv¢t{ÞMIb>®8èáýtcÁ`â+?í9Þc•G’͘GN½„G–{ˆ/½N™/~¾tÚ€/âµ·ÿc£l=‚iëáSoÀÝ­7bµQՅĦÕUQÛ˜]·Ó¾P#BÊUPn)ÇRo¬¤oj-_Bô" €K÷I5+ÉHî/bd·9á3î©‚ /l~VIš<ºæ§\öìºrYbm‹,±iXbZ}°Dw±„߬;¦è¶?_ÌN¹¦:*MVbŸ‘/t3^·;›ĵJÔ¨rxåš%uŒ::6-ÊqÝWäö|R–zçeM|™pOÂòLÔö½½0¡g7Á<§×nç1¾ü Hn©È"—UM¶E>³/ß#†Z©{º >i'ÎÎ%Žº6”uÕØuÍ;€ºóC]®ò›fÙòç‹Éã^Ñ¢Õ!–»Ò6$;i˜ÔÔ¹©®U0*ó×[Ó˜õ.ŽJ…À”ýš*”¬§ÌWš¹ò­2JÀ9ÓNŸÃýkÌn©üž­½Ê¶8ìCL#3Ázú`éV6«R7G®Râ¶×%d²"•“ÿ*Žxˆ.ê÷[½¨Ïç¢Þ`?EÝ.¼‹ºš}}ñƒ|_Æ™¥¨ÈÏTmÃùB!¸\KOw¶øllŠßJÚ`ÚÔóË£'wÆ/K˜œÊ`$2ŒÝÒi¾Ý­PwáP§ºÏ\Ÿ’âJL&vOFÌõAªWJÏ2E¼h<›|œJ…2 BbQjψ*JÜ l±.âëæ´†¯Í w÷ÀÝÞõ»Áþ…¯v÷ClJ›½kû`6óóáËúéä'»õXvFé
-SiÚÊÙ×ÄQÿZáܮӗ/‘Zpç
-åíQ#–RR&ª/Ò'òK¿‡oœé¯á· ^¸s·ü¾çgòuy[ÈSo\šnÓŸBv˜»î£S®Ó½£+TΉe—¶+¦“ONèöß9Áo¾¾P ºÜÑW¾Ñ Ý!áM.¹¤rV£­9µ*cT])Ê·¾êž†æJäÐsÕBŽÛ ùF^ftoÎÊÙA»`¤ðܬ*ÌZèûq¢£˜_¥\QÃN Ê«$2½n ÄêêMÄêe7*Ï!Øni2_V Ý b±#±ò¿G ¾HkËg-g·0ŠÔI®‚Ú&V‡{ÝcK3¹·³úBöÐn2ç´¨%ß!R!V+IÏ3a$e“AžCahÏÃÕåF…¼i_‡
-Ö¾šÙgáF&8™8qá¯>ÞŽgÀöØLŠ ؾUì ¥8]MHÀ-À¶Î7À¶%°Ö$2_´­Q\ © dx³.Wøã¥ÎŽ¼“r}––"2tÇ?Ûh·»”ºÝ4
-y$ãæÙ@²²C1Òù˜•a¼|A3qdÀEup‹ ¸e¶¸“7H±[
-øüpx¼z<!§}%à |ðÅþð(G§™Ñô‚®ÈŸHwŠl‘J—ñtóoá]‚Ú•GI~L éÞ°€ƒa »ÛZ6ÓE+Hî•2‡7¬~»Q~Ïr{è@€d'EÕ1kA€F@0í5Ú·;6~·œ”bèá®M€3/ "èï“WnM fås²„whÿ‹ºˆBVºZ~³©úLd–“‡\ôá‹´s¦F¹ ¶Í|„If±‰Îð†{ÌÇ×\µ „UµDzæQY{@¬\| 6˜ãƈÏm $I<ÉŸ¿=½;½
-õ„Ü’ð°vŽv_P5ëŽ5kÕä¶æ:þèö›×4ï]Éh9ºµk|a&¯í¹ng~ÑDO=¼ ¿#2>á:úâ¨/ÃÿBòš5Œä%鸪añ{õ½BŠ1û÷#àÖžkÐ{BÕÕüÖ»ÛšÙ^¯;aûº•|aFGì܆.ÅÓ½|gOÒò.#ü®ÕjÆæ &ì­ßÙÙ‰”îÈ[X«M€ÄÉúX5˜5³™–V—ÚÊþ´‹£Ê¿HÞP÷Wõ$¸$‰´ôšj–"$¿“ú@=Y¹­¼u9Êÿ|Ñ…îOZÕ¢ìø¨nòñÁ8ä·{ëwXïtÙÃÍcd6ïõÑ:ÀkfqÆVíü­¸¼×ÞÜR:"Ê"bérüéTê±ñ\Žç3ÍKæèdÏV–›U‘ûÅòïñÉ›°Å䵃Èäe-ðä•vtI²“Yî”?_ÔrL*~á`ìl~·àTm³ÓPkÂwů.õe¸·uÄŸæe·{üƒÄPÝέvš-tâ>«f40][ÕÜ”X´©I_+ã£Oxcæ¸G—aå9ð87¼ß¦¹ao:úo$o×åÿˆÊ¯;FÝ6­Nºï_ØIý|¾ ¸ËòÑÝ–è·O«KPN–r¦‚ÆŸ£SœÏ:~¶ˆkÚ,Ïô+S¯=ô&{xN¨Ê¦;>1`<fÛp<ºšò~$ÌË·aŸî€èÕšcÑÐ,?Hæ=(1Ò¬?_?“~Nd²=§ÿAz¸rÿ ÿèɆÅ]k;©¥Ç{oS«Ã¦>ö&ëðõ/å¨9‹á³›9Bó9Ù¯ð2>ÝG…Ñõ5åFbó¦ û·w9zË7Ò—x#Ê8bwPÚ¦íâ×ýJ29ôVÚþÑsqín}‡î³sÎÆíV¹µn¯r¦Õ]š™–äiÉ€iÍßL2èû‹ä“;«w÷zÿÍß_æ·Á™~._B²­¤?˜ç‡æ 7ñÙq'# mí¢÷uôLÓ·5@ÕO¡™¶ç0¹»SùR×ÿXNçèùõ¤FÝö¥ÚmY·îcúÜ’ Χ™ì·DScŠJ
-¶|‡ÛçÊëß$ŠO¦7ê-ÑÚ0)­ë4wûUe÷
-üçÔ¥*īö´ÝªÅÖ£p-ùÔSš¯æ¢ÔÔ3G'œX÷zXʽÆÜá§
-×Ý×—ÝÕ£žAhPÓ-î Šîû4µßÔš#ù]ã êå]ïàù_¸¯_ õ”Q4vÝMÑkØñ½x]3ËnwS{^??ÏV»{7v¸,;j=3åMóM†×ôºdÒ²',mö¹F\¼¹æë.È*u|ÂZÈ®°Í†ß`ÆQíÜ>.kÜ:y]UúxâgAºƒ’TvÞG:vFá&q2×þólš/~ïËÎØÚ~µË²Kh)ÁÓL>†¦P‹ûDD´» ]pÚ7ß1ZÏjßoÈ°"Ÿý¼Á¡N¨ùGà¯õ´Ù-Tò>SwÈZë\ãk|«¯z=h™v|n"/=wðmçcPǘ•·Õ5{VÑV·üØ°±~kRY«ô­â~èÇ/îbœ»UˆvæúÅE\0ÚæR«‘quK"ã>7»ò­Ü¬s…w­¤•L¯NÓ˜äôU‘j}-à ȉC?4êëÚe·¼z÷ÓòåÉú q£é›pµ2Î8ãeQt`œÖ«e_±«Y²Þ°«Õ~¿²Þœ–•™¿”ƒ°†–)½VV8C‡[žžSœï¥Ëkzý\¾8&¶zatq¶?È(ƒz—Æ“Ök6Ãy¾Smäs+-‚®å³z׫ þ¡çÉÃÌÜâÜþ×Ó+éwŽ*Ÿê\ke«ÙÉ `;Ȉ­lì©T)üºê…›[¦tÇj2μtmÏO%á‰@æc0L´{¦’±NÆkêߌW×¾ü~Â+Kóþ,L›—#U®ì¹sc»“f)ÃúfÀUj櫵Njžœ0¶ 6jè”J£qµbÇ+{yyžm\Ì<+µUŠ*•ëc‰´Î°Á[\ÅÖ~RgÕ°Í'‡¦<GÆpUܺÛë“G‘ÑKª¥—"h¯#,qùyô¤—ªäù‹}ªÊ‹\v[˜Hð éoû×c[yJ£ÆJ‡ÝF*?HMäÙÆ Ñ)µ/åj®r÷mç’®ð>lÌ+ÅýèPnÐñÍ:·¶‹»‘RW¾àæs˜ÐæÀ dã=“ʆþ²}ª:2½­5;+&Zny Õ•»oü ª[ˆ¶)’«ê—ó/NªóØÕ•p?mÙfVœo¹Qa¬VzH¯Ñêï[™:¬û¥}½Ö•cË>wb54ÖvsU½â‘[n»¶u>}ÆŸÖéŒugê©$Äœzñá"Ì0ü¨¨O3^GÙ£¡Ù]ÈSW‰ÔUÝ°»P¶×ç]!%—¯’'Þæ:Åì"ÎÑé …Ì_¬åç0]Çf É%F[†¿nêp£€±û§:]«·C¡²=ÃL¹1Ë*VëD•KwÝk”¤í,2#òŸ!´7Ì v5 )ÿÖ˨†h‹ª‰kØÆcU äDÙÙ3[!×IK‹Ò\fñMj³L^âoˆ-ñ;x‘Â;Kü¬|”ÚPp’Z÷êá‹U«sÓÖÂ.D‹€‚ÚÉÞ6¼l4¨Ý½ŠïB¾UªìrTú^ÊÌtC—zlŸ7£ÚÆ0>I¶f˜šÐÑgo¢—k㵶xîNZuðIÔ €3j¡”Ç”`P åãGeÖ¬ZR{> Åû;™ˆ²©…|A…è°* ÑbŸÖ0B4dOBÔ,„ä$…dIí¿XÄB‰›HW©0(°'ÐOÞ›:…Wû^ÔýjU#Lë2½²%Y«S&(*´>û”=ëõm­ú8…êÆÎFj “Ó³¨…K¸WêBï*Ÿúã·ÜTöˆ”n´Ix
-†µßòÓÅõÌ[N6áâ-p¶ïÙÕ±/±{µß/´éñ½¤MâEo;ž:ïžê<¯§k2uî;;šÞ×RÌ+Û/&ôÀENëC¶õ´4©Ó
-³p'ûyÇ.j-×[cS‹^9ô¤Ôª¸ð²ÎÏŠ(Ë£Iãj£ÊU±mÈ®½[ÚﳞHÏYâYÚ2»AçÊêæCÇOŒf‘"K]âºI Ø)${5y^L‹{1
-C¦9Ó^12ô}1"èm1‚ðM11¸íc®åýC°#›v¦Ÿö•¾¸=ÎÊ»Ó)Ÿk¶kŽÊUCsQæ‡1%Œ«ÎUëí´#Â"}’ÛÝÌ^ š]aumYMªÃw#J¸¯æä£÷Þ‘JŽ¾_+*ÝU±öHºWJ´ãàókBT„ê…È>Y’Èí‘";"¾·D¶zK¡6D9zn¿‘äÝî¶Zhø‘~óF‹ñÜÞÞ+«ž:š©Û5IÔü.Í-…„øA˜º`ä“} Eýð(¦Ì, ëdT‰¸4®v1é¹#3ÇW¡½Ã]mõĉ –Ío§ >O¢7;,Ó-¬áf¹ónžÏçI˜;7kŒŽã´GÆèÁh‹Ñîæ‹i¤«Õú‘Ú"ruÑI0¯„”Þ5Mó´‚%XRŸVd¾Rm°ÌAIHJÊjùÂô¹Dq®d±ãH/`¡Qc1š¨¹Ëîeÿ ¹vªçºÜËÞÏÑ,ÛCǬloô¯ hK:ªÙç
-òõ 2ÞrbÕZZ ©+ä3ww¨úðSìíí½«9Õà ÝÇjÑyu©n`‘Ö0ò4×ÕòåÈ–…ÒVY¿Ö(i¶ 
-³.EàÞx˜Ë][9}%™\Ï…t'3"Ñ
-<O*åË:\Â8§k h•_ <€áÌ6ë¥}e¦¶Bp º#@׋WPEÐpöÉg—©Ä>³™‘ÐÑ[†Voö”œW2÷J³-,LÄ~÷•óôR¨rĉ3©ÓPŠðòÈãE6O¦3v« tà9eÏ9ˆhŒÐxÀô]0󃘸XMQoæðš
-.à{Õ¤=ô
-®pî¹@x_B 2Lˆvc
-ÄÁs$´óRY$Ô{Y@ê÷º@Ší#¤%÷›ã@-tñ( ]-ÿ?Ó\çv’ʃóŠÒw‡qNÓàÍÑ®x"§Ê'ÆqÓÏŽ³‡‚%R-ÃVÂÊêÉ1Zÿë¶Ûÿè·Â~õ[¼8ÿMoÐë; ¯·BxU˜Ê`aeáF@9q ¼q¨X!
-Ûû_7ñÃlÿúuÛþ/%ô;Xÿ$°þ`ãI”ò‰º*ÚÏ1±?½|ú¯(Øo¸ÀW=_*ñâký*Š_¡6bþâW[ÔŽÒßl„UçïMüÃó_Gð7#ök´ýæ8Èv¢Æ²÷üØÕði¬«'ä…ÑcVÏÖþ7ê¾ ‡»}î·µÀB7÷Ñ£®;Ur¯þg;¼KÈú?ð>ð5¬þQGk»ÿ׫úUƒâ_̸¿“ÚªÓ¾:xm—DÐòñg·™Ç ßæî rU¸cá–¹¹×ƒx݉õê?ßÖ娾«fü®/%¼yæãbït·KÓ“´®oŽê~x;|~0.'k?Ùæ²·žBg
-í/v nýñ²Y¥–¼ÐÏï|šùBöïQ›ú~žcä^~Ìòhý¾(2ƒÛš‘æW²­/Ì;žùš~ Ÿä9F8œù_Ö,¹G;yn‡ `iKŒ^Ú&€³•u˜ËÖVWî®ø]´\öè2²”Îwa þõ¯þ9JÚ„ñ/’—•Ðßdã|zA5¤ ~? Uânïê¹ëŽs¨ •¤SÍc„éîªÓÝ‚Ïu¶DtèoÈÉv¼fâélÕÆâÕòîÅ»¥´O‹ˆ^Ýêùö‰ÇüýUGû(1·Þ 7[–>]—»µ©—+-';÷úž{Ž˜½ðçè#yu/…$YhÈŸa>÷Ïu©Ç¹õA.‡Óºí¬ôþA6äè
-¯.å¾¼;v‘'9³{c>—å9:ظ3û³¯O×æ¾5õà×`²³ÁdB®áÅ8,äwcf¯ÝFmº†÷Ö0?”î!Š”²;øŒ‰Å`lvÓÚr`ƒä yãù/’×4)¦W?ÌÝ««à}a;Î)m9ùÙm˜Ãu˜iFKiCObã’YÍÑ~æ4ÃF¹d²+CÐøè@Øïm ä¨MiÇ7¼‡„4”®¤%©©OÃ|~80>Ý~fN§ý2üÜö6~ëaízµœÜ-Hp¿Û»-.íSuvi7ó½ó¿øŠÊJMÃ~s¯}\ÞÖ\,†››
-ïÍì$r'»ZÔ³Øl<|ÀÇMô¢“K<ì=0÷ÒŸ+2ÞÏ®ÊtÏ!ªB/ônM—»…×±Ö©»P»CÒøi7wݺ¾â[«3"ÐæHM¥Þì‡#,¿384¦Äuÿ(í6»çM¨+c¼°z™¼W½v²™WÒvPuܼRê˜}æ­èuxéu™¬àN¿Ò+L{¸Cmºµ›yéÔ3iŸ«5(-]ê¹Ö­3'[âsÉ5Ÿƒ«ÒTóÙrøÞÈ~hˆA·1Œ§ Kƒõxc}êXñÂn´mú;¼´òÉniûƒÔŽ’¸ù$½þ⾺îè“æ ±uÇ:ÜçË™¶wˆQ+ª•Ú«Iý¸Y”z.‰æXk·b¥Ûê^œi3‚››ðSŸ_Bã½O3ãœùAèî«/êx±Ž½E>X-(}Ûßí®¡OÑùa-•×5ÖØ=½ö\.¸†\y|ˆ—ùÜ8Cø°v´þhù/®Ç8ý€;U1·ÌLZé'yÒ—ó¨´%Ã^-xX“KíËǧ[÷¹¯45Ã/‡f0m4²ÎvP¯Þ3q°‘ñ]PXŠW¿Î•^µS׆jM©…y×Å”ò:Õ³è>6oÃíwõšóJšÝÄѵM\Ló—jÉŸcöüÔsìÏL*Ë»µª8=iùfñŹ/T™õmÔ…çkF½?¦>ím?»Fû¶ZÍ·9ÂÉ0)6æþ¯;Úo®BP”0ק«R»Ö¼úcï&v—žÇwÀn®ry¿‘ˆ"N&&ñêÔ6˜*²öU;öbÛÎíßÍŠËpãò¶ÝÜ—ýR.“h¶d5ªë¡ÅàвtÞÜÓ΢tžãqœ¼Yfù)[ðô¸‡núF&¶R šã¼h6l—çêø±WŠ®žäuÍÐrýuÝùä>}Çð°iuúà×UTQö"×xü 6æ¶>•5±ÈVˆ`W,û§;_&[Œi5îv­t‘§ƒ¿ÊmÌ»Ûÿ˜½BM1’†ÜO1[Ó‹ ç0øx³ýªû eŽ€Æ}|éüéèi½Êo,æo#(ˆ«]D™ðº«SÞU{Ö1ΔQ-Cšk/‚vÛÆNãaÅÓwq¥ùìÊA€]ÊÅ'VØÔàÒåVΗÚÝcÞ“µjÊ:äÑTêü †fÅK}¼ÄŸºé<y&m¶×â0fÿ OM·L­T˜§=4ÒQóÔm²VÔ4“G-Øó­ÖÞ,X7¹
-R-sÊΓÃß\/zTÊ{œj”©®Ù·Â¤:±ØÅx]êäg‡’°¹ÜÍ~ñþ1^!@!Ë Ð)KºùŒ*Ú\½7µì„Ÿ©ËÒê¦:h‹VóËNKÙ¸ð\Ùè¯Ù?ˆšoé랊³ýàGó |èˆ"9h,'}×o–}Í} Æ1{Ì^â\:¸D)–©ÈYM±i–®ñÒ+‰Øµeö;Ù¡©ˆìÜx#ÞÎÐíàס:Y·½ä-am¾?áZŽyÕiË%/ôJ­žLäýÇ>Ëõ Yi‹kÈ´´™ýr>•ëÖòV€8ãÓæx œý~ßz+I¿^‹+ίžìHª3Ë´íàz¶¼œ!«é°R§ÿ¤Íþ:§oA©#¸ß02•yOŸÒ¯©Ž´ÁR‹ê åúìM])劚9ŇæŒ|(?4™^ ¾tvgégLâöÄQ¼Õy±Ë<±›oNÿà¦uR°õÉ‹¹ã“na ÷‹«æ¶95½ )ŽûöQ¥š«ÃTyŸäP‹ósscÄ·
-Ff¶Ó³èLI‹[EO³ §­®fõHuË“¹JP×­â7_g…ä /¹ÑSPéürH‰çú²Øí>\Q’Ëa0ÜíÕ³üxüû©L¾Ô¢žÓ]ìû;Nêm¸{Þé›Ð–½ŽÏrUgÚ8Ê•msO–n^ ›jÎ
-¤+æAâC0±÷X0éuyUUbdEÐ.v €v·Ã›Ñ‡çéN?·ñ—]‹véµP6¿ßÒLÁ zß®‡t]„cê4ˆÞÔ)ÜYÔÉiEÔI×ÒTs"ý·t¯ìžèï6ãw³¬ú±/0›¦ƒ&†U>®dÑ|
-©åeV¨Îô# æ) ƒ$á'£,Â#„Pàæ;çrr¤³Ë×±Ê:#¨Îâ®Ôc¶„?ej»éæ¡ÔöL×Ϲuæ­Åõ¦
-yShŸGÃIñijâ
-°LX^Ò%,Š« þ`j~Ã
-Û¯Ùõœ†—© ¯¸ú×ï]R¨¬¤g?™¢|ÆɬðnW7wOÆä+ÕFÀ”>9PŒ<:ûƒµB…,|ö¡0îŸÌ‚©ÂNú!1‘…£_ 3^m”3ùõeA彎ZÆvÏU "ç€Qz‡Ç7hb1`»Ö"…;Naôú߸ï¤gê×Ú“ ÇUg†Ô­}±ÌŒöTJ‡#‘hŽ·úZ†ÙYã„jwØ{QMÎDvéÜq<ÓùÍtšÍÑUÛ/Þ<VwŠFsN5wºMÂ\³ûþ 9N–×Ùë+ºg;+GŸÄXCû{©‰*õçy3ï"ªèÙÚwÊ´¯k}ôÑ4ÿ {ÛjxÃ×ð³gäͱ]LÞÒÀÝ•u ™Krë´¢„±åø–
-PQÕÔª•I
-“ñ}.cM3ǤZÀ²“RBÍ»¶Ô¯×5¾²ˆú<:’Å.àvé X¸Êd²ò±öJËÀâÎUnÐÈú  —½LŠuÐgŒLa‰€~¯,@ð
-„ÌCôD\C³Ð×°J:@ø¨c 2ÛCçó›Þ°ÄéË
-ÏáH˜ÿRÞ„—Ú@â½;„™$‘ÿ•ZÕf•†§x ©•×©‹v‹›?É9*ßÏsk¼N§¼^ÏúŽæWO6
-&Ffˆ¹ÈùG"­ßý|·ˆÔRÉïüqºJÛÌ È¸³²sºyådÂPPÔK
-õërI{5Ú2þ×úUB¿FÛ¯#Ø­ý}¨›²|Ëâþú¹ë s¯›{%á«ÿÄr—£J.Ïœ/&/œù9ŸÎØé^±J'ieÙLjpýÃ'h´Æi4ÜϸójöÄç>ù-1í¯.û/ÖÌæ\]ö£ôFÿ®
-xf·ày³ScÂÇʲâWcg)í¢`QQ3þ4£nlÜ¢h>“ÆÓ¹•¬—³…vÜÏ°Éý:õÏkJ,„ì„Ühä8,öÔÑ%Dë£6ûÜø› {’ÿÁ½ë#_üüyI’‚þŒQïÞ·59<ž[ïn|06Ér³Sòñªn6Ki³<ÇŸÆòCí-2[(ÓütmŒÈ)1›r“ Ëã£ëcf[£6¹rFüñ¤gé±ÏöPºáÃ(’¸xð‰Jû šþ¬´Eûè‚æ{ 'ßîaÛöª»öקÿÒï…—}Žá^r ª?ZíÖ½wê+>Ž½ßë’¶
-³…toL‰É®7>Ú»éèâ×Ã{ýrJçä©÷ûg0–ð
-÷Þ„ÃYîf²¹[c²äÞ —àúüÖ ~zN°Á29k®ç¿¶-µýbw×ê/öV£GÞãvëºÛU +¾îýÿÂõ0zåöU³ùZŒßár|%Za}²fÏO¶s¸ ØÒ¡{m¤}z -±;æÃwua¤úÅm éw§nçÑ~°ê0Ó
-mF®ÏŠLWî–tfÈšÔ¼¨M‰kû±óhME±¿Ú,s”µ‘Vü¨0bøL#SâJ§Å!솥ÉÆdâ²q–h°óZç™lp…ÕgÔg–8ýɶ•!‚–†¶%7Ä\¥6-a¥ì|Œ´j>ióõg¯:óÙ6±bkv‘Ðñ%+
-MÏB•9ÅÌÅ Ì
-Å4zÕˆ£¿´ýñ³BÝ–œ[6\.z*né.æ*yÆâóHÎ0øÜ[%è$3F¸»§ìJP7×5o$àÌͪ…„+çKHú­hت8çXìyU™õ¢Pa¼ªæ3…|Ø¡ƒZ4¢)ñ³¡Âˆ¿S¬6N÷²=EÅbÚ#¸ÅÞŸe7e3oe¡ì{^5(öL3=äÚÈpåL;ÉÁÙ7\ˆ$õ
-©_i3)²_Ù[!èE¼åÿÙ\W\–©¥}%›7;{¦Pï\è=½yÓÁÉÒÔX$©“é»ïèäµ¾´Éýª“Â…íã0.*ðú”n,Tбˆ%&5Ì&JÅiDÀÇþ‹€—sƒ€GÙažóéšL˜+Ø#Æï¬aÑîÝ‚öÌç×õ jîšuñ—´1V¦Y ;Þ>Òeu¿ÑRÛsåÃfÍÔ
-JL5[È’ìÌðCñ™-^‹ýSåSTšÝláÍmÉÂB~Ÿ0¥Ï8£);QZvBi>FxÌË[<׋^ù•R(æñQT¶fZ¬ãÌ«%ŠŠmÑ¥‡m’‰›Ç¥—ÇɹÛ;Ìg˜‡ÑÉ×ôm
-k­Ô‹úô¢ÏV£œ²«ø0’Ÿnàf³î¯©3M/Ši4%¦“Ö
-­=n7¦WcnŸü¹¼;1Òý¼Ô±²21ÿ˜«adXéå×aœcºÙk¶•ÔÓ«Ÿå‡y½ë‹&ÚƒºG´û8Hè)¹Y^¬üEQw:òls NúxäÌñ›Wß¡jj›­UïœÌ>»A/ï¬sÌiúÑÙY³|#­“óë1É…½d™½æ ]¶½"/YÁµÞ胲hï~$ÑÞƒ”P¹ï–‘—²j Ñ!Ú¸¹G@ ‡á 2asaÐ$K6 6ÛEiþ|”ôêß ç5çSåôЮâhìY"ïi‚T¥>Tsß»¡9››=èÆ>“VeGÌ¢ó*ïì8×ä?S´?œÍ}ºÞÀSt}€K‹û Fœ€b\Kg Êù•Y‘ %ãœÐ*Ørj Ônñ{âû2ÅÒÅF8Åê:ŠN×E}ë"»_4ŠãíÞŠ`Pi€–WRv¡ákš‘ºiÁ›®0Ö¼ 1dÒKH¹þ¸ór阯ÕÛ7¶V¨šMbÂw  Ç[à?µ- å# ãÙ
-P›ñP×ä
-¨ötÆÌ
-K´q¨ÚÔ£§ KuЖ ºŒ6-o·€¦W óp;E´4h/¿H«ñqßÙ»ÑuTÒ;P÷h¡$ DäðOSÝr/Xƒ!’d{‰“ “ZîçèÕ ülç–ªÀÚ­¯ /¢DP$IÎ (Š¢"ŠYÌ9Çû?H¯uÖþöØ…¶¥
-êc2«þ€ɨgÀä­ `äá;ÆLÂ
-$3i±šl Â€Y`W• `ÏCp¹8–“§UMÀ9»øDÈÀÏKÀJÀpŸ x0}•Þ«÷ÜÍ‘
-ð õtˆ|Ýå? Ù¬•?*òWµN^éNú/Ç¡ûñþ(¦b­¤êiòõôn” ¹ãÈ-òH0¼út€|Ù’ÚP@Áu ÛPÈC¼(]ãE¹82g$ÿVn©ÌIp”ì:¾D¢Q>æz¨$d›ðœb*©¦b~Ý¿®äo£’¦ü‡€ü?ÓþNö+ÝÚ» P¦ì¨Ä: Ô¶MõŠA\ €†/n@Æß¾¯‰ý&ФÎhršÂÙ@Ssã¿Jh¢&Hÿ=Ä?iý ³õ÷1î¯D ýk´MföÊ™I<Bⶠê1VíßéÈú>}ªs~õåÔÃÃX×î÷ˆ¥ïÖ¡ïHsãÞæ\}š ü‹‚Mœµ‰ku[zßýß0Ó?2­ƒ'zr"‡:øŸÖþæï&a¶‰#X_þ͈ͦþFp䪈ìÝÚ*ÒmžW´[éX´®+®è\ñNù;oV»u¡úÝîù íâ»ØoäÀÙ’ï'~¾À!Ö,¥-Ò?<=tôOJNdÚäùý…tæÍ¿
-mâͤþ¾KŸ¸—Uç©Nþc„L?ðÝZg7´ÑÙ\¶Bíx>(¥ë™V^'>²SÇ›íeŽÒÂÃ}Ì£öŸZ“Û‡@ÞElhìvälVjßÛà£m¸¦fÈbÕDÈŠY×”ß\~ÿ‹3yIl¬‰0úûÿSËAÿ-‡ªc6w·–GüZ9vé ÕéÊg¦?þF¯.ª‡>Únlç<ÝÝT^©ÁÚ×ñêP¸Æ£¾3»®–úØ/nîã¼vïÇ¼Ï ©Ù' Ð™q—òÓH©)Sd¸,GNZNV¥Ü{â¢]j‚¯ü_Œ·n™5éTnp“̵ð«óíû¥v)!´<îuÙ–.øs]{_R«&ÉøÅ%?ÖÖüìÓ\(3¨=6¦ÖclG¥OÛ‰ÐѸ6qÓãæx[œvÆÔr1*÷¯³/½4_a†ü©
- ¤[—è?»„ÑWߟQodÖÎÿ˺ڊ¥û¿6ÞæØë|fº›ÅÞX7»«ƒ^ ÒjÌŒS§7EÂV¡ƒ^\%MÜÔò2¦æÃçˆY‡`£Ì d‚Ü@:¨~_±½Ow$öFÊJëAíՌÛE¦x+t²Ò D—­eÇÅ7—ö¶N!mêt2‚¦àwæ~_&øƒ¦˜^ýÿ6žøek¶Áê·Qµ08Oàc šÙEaÈo§•þÓ7{ŸÎ´Û3ž»I×ëE8/w!:;ž:.z¼µ·îñõ·=â ‡F*4’lŽkBYóoÝ®ãKïu³Ù7ÓÃÆgjn£€Ðê`Õ£ªÕŽQ ÿ tzN—¶Þ¨;œÝF|…ï´´8 ô Ú6+XÏxPD¡lgUD”ö¶‚ÛÁÁÃÝ€92ÍVÀI¡ë¨C_zªQ³¯©‹¦Jñæ •SÄ;zT¥ê6zÎyó*Âzù­Åj«F¯ZÃÏ^ÕËûj©3îá˜+¹Í\s› Óû‡kÕðÁÞJ§Žs)£SÓ3ûz„Ñáb u¥òno4É1hñçAÖ—ÓëxÌßÔè‹Ü0W¡í2åzFaÞ"kw¼\ÅîÇgo8­a¸¬îìñš_Üîî±’O»ìÍ!+my$WÄ,Z.w+•ÐyÝS;'ìÓNŠ;1vÕÒø<uãºòû’àÔщÏêܤ6/;lôÓEëÔö5²u=š)_y„·æÎÍ)Ä÷ú–ªg!÷°|‘«‘\Q©Ö'¾åžnÅõçqñz ¹J'•þÀ凕™–{»vÞŽvrôKóí¤Úñ.+<s|q¦ÙV±”»ö²VYÛ¹EY›!V´â:Ôù#[J°ÔÅ;•‡á‹ñBwQVZኯü¨wu´›»x8WßÖ6–¾¯î5åꞪ•Tå:âåÇjÈ”Ua¯8Ãé£à¥l¹49Óõ’èíâì^èKÓöÔ^eÇ»r7k+pi‹êV©Â¡øŠ~Yiuóì>ç&ÿxæŒÛ|f¡³,¡6)þC­`ÚO?"7¸RR3}a1õÞU¶68Un—Ôº³eù©lŽÎ_ÞK‘ýãã‚œ²èðg¯¢’j»v˲¶ÇaÅòüM£pL];…f”X[\˜Á±z4îÜøm„·,®¿ìª¢2÷ª*ÎX AF3ª¡¥{¥¢–nv‚8yYÞŸËÛØøã.8ÿíÎDoÃÊh"Ô–_ý茋ËuiŠóÓRFV·Å\ÙºØÄ7Ÿ£ŽDhá謨‚ÏA¢y™P†Ù¶Ô’qŸU£Ûlµ~`Ca'=}ÐÞDºna;m<לëeÕéÕ¬T/+‹Wn¨”‡¤`ÆM•7iÔþÅúY
-&àöB¿tnIJq‡Éfœ&ü¶ø§³å÷üòü¸ŠåÈZÚÕæ-²vëçªpÜßöæ S¬
-i£ûppCé…¬>D#Y×WSOµÑŠVxàu î©u¦ÖFjv5[+Ë*|S°½È5uÆÉT\+þÀR£0îJ ½%&3RÄÓâl‹§ÁÖOþ¼ Ñǃ5GàÊm
-@:lü¬ÄJcJ<?w¼,2º(”Ù¢pÇìš ×¼€I‡ ¯ -ôÊ‹3'[œfxµ›ø·°™Ê`Ï,ˆ)Ë,àœÉfDâ/ÈŒ1üðØ9¼Ó˜?°‚{'›ti‘"ÓÖ1ÝL¹&ítÓôfê|p*nÍïÉ^¿=‘šëÁJ¼ˆë£ØF¾É“ÂÝ!ÓB7§c‚|i³ü«=•ùx)ð`ž®pcGð¹BΰÓj´d3èÆ,šÊ`à£ÐëI«N“qMïbž&NGƒ®Ò/“®f/½VîÆð%ÉûøŽÜAÝ=íÊ€Ñòŵ§ íÌõ]j§eêæL!:Ó¡tt
-=±-Òá>+Ì…©ïøAнòºy|
-†³\¡„‘Ìè<;=×5¶Œ‹l¶
-ò ïP‹)¨s2,X[R&{Wâ¹ß|ˆ~ã‰K‘
-¨xU½JÔÜñŸöbÎæÒ©/wúä=.2° |,Ë >Z=æ»Ù½Î³”=ÿ³ô$ØeNÖüšiåÈÄg/Š\}—A:ÜJGÄ^…a£÷x+ï!œ~D)­ß×õ´þDîé!õáÒo›W`%”~Ñt çÐU_rÑ£Mñ;çc!‹isO)ÔCº Ï—¹ãìÞ`A %RVŸÐƒgˆe‡N ¥2 ‘á« ‘fÇÜg.#X½déO[ØÇ鑸N§gš€"M!„ÅBÆŸVÊA¬X9§À' ðˆt
-ˆQ¸D{õM7%:ªˆ_HPíj™°Te­R¡+§E}ZÊ’òq|†Ý»ÝÙò3Ì·Šå51|.gºgÆÙ#4 ÷²Ö…u)BÓÏ¢ 6Šßä²=Š1ý>ÁMžÁí#ü
-·ã?íBÞÓÅúé÷æøGOö:÷_+ð¯~ =>€%
-àoŸ
- Lä¯ 9È]v äF>ä¦õõZËýw¨íØöBҽΈݯÂe"Ý:–Îʽz.¤—küjÚ¿®ä¤5‰jûÏm›7$Òí¿à†¿Òíw+ÿBËmW{
-®¸ŸJï;ñ£ y”¦'á .Æ.Ê/‹›ÊS-­©1官â-ùåÇ_„ø³=zÏÞ\=>G³÷™Í ZÿÍ_e:1Óiã­³•ÇÔFªšylû˜ãžýM6ÑhÃj¿¯! 72g¯ÿhã7hàZ9øûoFÝt‘«ùz«d¦Ë³µ[-nÎå4VïÏÙ§ñNO#á„F¥÷Ÿ¬Œý·vS‹ž4jb=í¯ƒuæ nÍemw¯V¿/>ú½O?;ë´Â¡»ï®¤Èpî쪡ƒÅ{ÝœO‰Wõ÷KímÓÝýÕ“?fôºÔ.ÜfÿqæýÕA‡+suG•¦H'r&.ðªãx›þ¨‰†ƒa@„ÓAH‡ë~Ÿ½O^{ÐÀ{tí”÷é"“v:tv6Dçc¢ãæ¦L{[]K_u”…àÐ$Ü€¹˜íÖ¹M[ü9û¡æ|9Õ«þzUûvvôø®ûmá–Õ·;k_£¾Zm4—Òñ¾™ŠäàV;Ñ}õÒaàÔkÈ]dÔ*„N|è:nvÒl{ø°¼É `Ž“I+>`óÝlüPZî}éy½6ûÚõÙÔRhº1²¬Í-®ÿv³Ž¬5o^+ <ô°;Ô\n”jøÍ.W·¡çÅïÂú?Ü\À¶æó—:,wè…ÈTé÷Î3t æÕÞ:/ªw¤un¼ÿ¼Øæ³û’›ê'ShŒÌœÓ€¦_wGÝÎÍ:²dÛžƒ³=Ýjãš›7ç5üØÜU=®u]ÊmÊQ9l©èÛrùñ½rXäÞÎs¹çœçŠ3ÿ §Ë¸{YùÓLïžT'óB_á|g}šC¯­®-¡6¾tìŸAùЀ&å[™×€‡®ÙšKvÈê¶1äªÔy(¹‡`c¸Ìý«%v¯•
-ÿ¾zåÛÊrë;Ï]1ó;Ý>”â[ݧdš"^Œvcµh7òž=ÿ|6¶sùàv9ÕRíܤ¢üÃ~"ÀÇÙ¤¯ƒÇ#£u63kIònLp¨gËúÒ+®S/WZ.ããBµ•{̶N•‹1{W„í)wóOÜy Q֌䀭¤—Æ^©XJ¿jnq:úÅljÖµÛÔÔÆòÜÞZÛo‹Ôx¡)J¶wžyÊÎw&øl\…³ø_ØPÊ.•»s¯.·ná!¾LŽ¼G­v­ïÜÖh8­t¤_i¿‘QE4™óÎC'Å!çø¢Í¿‹3ÊFŠÙ¦‹ÛK6ŒÏ1G’µ)lu‹œ쾉T ô…j™§¶50¹GgitJ׫!匌ޫNxíýä*ÚpYhF%—Ó ÜáÿÉ-^éí* ÿíx,®’šæÄÉÔ¼eæV¹çÈ­ó9©Q)’F½’Õ”ƒ¼ÖÅìÃœÚ8ên­Zпö÷è]`ŠGÄ<£
-“`$žÅaû4¸ëËÉ“®<n…T E³'‹áð¥ñ8k#ÝÈ :Zaƒ5ÔlcRUÊŸSð˵ô¾'íëïHj¨âV<ô³Ørý—È“´Ð©ÏPARÞ4ÿøßé&÷IW+ÜpwìpCÌX+ð.,"‚,Sê¹2ƒjL‹^¥”½‚² ƒòXÜ+“Åaz0 ý@²Ú–W›Ïóåá‹ö?Í›x[èÃ{n¨!\½£,{§º\sU©Q/ÕÅÓ»Š|e2:ÛÍBºðï½³W^]€ûTjñ†á=‚3n'žä·ÆZoÎaæFÙgh=¦WuáD㧜߬˜§î‡Fžzfïyê°Éç=äDÿ¢öÜäûÖ`Öó?šbÖ˜±K:‘ƒ?þäDOÖ" ••¤´eÊíyâY‘\áVÁ«ü3ä^Ë}î³hL9“n8èº?³Qçýdm›I³™Œ…1N¹B39l(Ó«ë»H2YÏ{ƒò Ÿ×ïû˜jFˆbí;OËfÜá™ Æ 2F'Ož/½<Åæ†ùîJ2:ñg³†{› DÉïÂyÑ9èŸsžèÉòv.vÄ@±j‚Ì£.¯Y‡2g6?þÌF—O‡ÍXøˆY ê‚q­½f;WÚ½ÌÞ41þdò;‹"óuĨ£Ó0(Ÿ½ÖÈK‡î‘ÂÓ_÷%ÕfðW$»ø X9á•ÁñWüYBžYÔœ¼„y
-}ŽÂ`íîä¦7h‡ÁüÃ`!±‚‰’Ø8ÀÉv0|o‡·Ô²¹Ýav~T~JÚ« E›Åý¥Ž´b›x´yQ›£
-½~ØN¾¾"Ê¿ òZ”²“u¤¸ìψGë°%ztÁß]ô…Æl@â©åAÂ,±1xWñs%z¡Ë@¼þÀhE8áÙM/.˜kZ¸Ênü ‹b‹–_Û_´^-·Yc¼ìdŽÝ\á2åžzEv‰ð-ùNu (ʦÍÁy¼Î`Õ¾›o ‚C^££M¨úÚëýáæÒÄ!êÒÆ&¯Ü³òCtg››§ú×\i²ýäPÈ¡•cܯq?Ô³µë¹š¥Bk˜i¼öÇ 3¬¡H†u$€µÒzæaäL¹x†±<<Óˆ/²?°Ÿ~¥=·;þHÅjGÉšÝSö©ÇÐ^Þãù¹Ø¾”‡¼>œ´™eiä÷³ JÞÒ‡Pc³‘‚Ëbu«åJíNÖk †Ù<³že°Ë4Ûìíΰ…:„\à5óœ„N³ ß1¨‡›Î–=‰ïK%Ý_.úéþê’J¿€FÀ2kpèØD}C¶ÝJª1mzNf ýzz¨Øt»“N^f.ôD}_aà[¯C×Ú·Åì*¡e^e,š´‹è:G2Çú»„´+W‰T#†Âݺ>ŠÑ]Â
-½;¦_çÌ+=
-Ù´.ŒÙ¸ìx™PAuýÔtt›§²på×û‹9΂ŠÕ
-ðƒñE­cÒø+5Ž¡Ä[ÌŒ/_ 6›…bøy@ i#FØDNZ
-jGÖ€Þ“¬J€áK ÃàÀÙ³é’ÎOc²;Wûqë£6Z³sÍL벨Ã}U¯¦MsSÎqYÄfXqòqƒ;€„”! ñöüeHS~Æd
-ø']B†˜!KÀ@@q 9}øk|Fð×¢­çªø®O ì,åx £É«øÎÃÆ´‡sYØj^3)ê#A•äJüó'àÉTþÅD8$"î?³kžP ÎZ_²déG …)HÑBÒ. €ôhÄëž È™®älx2zS ju…Ð?ÿ䪴(a6‘}«zöÖvDxŠ¹ÔîªÓñ!é?Mº~Óæÿ´"ÑŽÿ“èÝÄw›(¸IpÃ×|û¾Û¯t«dÖ; Ôí7Pa‚*y°*M†@µÛ ÖÛ"P{Ñ7 Xíã~j«üõªþ{~ÿÿÏ?¥=Õ¿Óz%ÉIFlûð×h›$ÚÖÉ?ó™/õwz¯>,—¿ÊUI®=F¨Óz@®Û½[»æø6§ûËÚZ¯+
-”éÜ¿ ëÓ¿q ™ËQŠ¨ñºö«su{Ö"´Ä15+Ã
-ÖׇG}–ïnjd©7vw¤[¹øž_ :Z»j í<ǹaé3ËÍJ&#l‹Q ‹™´ý°ç».dçènÆZ½×„å/LaG
-´kuÿÌ.Ë72p D‹Ç–¥Âj]+ÁÄÀ+¥§¿˜YÆ£ÂÜm0²ªòbQØ-.ûB½•»™Çñ6ýPL›œ]ÎíE•2Är—×»›±ª+!p´Á+ßÔôAs¤NR‡
-ÛÌG™eæô¬d+FY^šíƒ¼,ˆ™:úQe·o&ñ¿þsÐD<ü .9=œ—"kÞ·WÂË·6ïrÕ¢ TÉ"Ô[¨S ³•‚;ÆÕ"G†xP?°þhV÷º
-ÚWí=¿´aaŸÖR³ªNšÙ¼
-_HA™µ‹¦‚ƒª\)]BÏiK©VÝÅý3‹þÙ#µ™Ê ‰qÍÄ‹{$A\ZÞÜÙ^³B#zi÷BùGÇZ³D¨-4[qlÌ5Â\Ç6¤ªQÐq·Õ>h­¡n'Ô a?Q­é{¥"%ì ”VäUAƒÂG^ 5XƧ=\Ú7ñ8Y¢–U<¸œ#2w?å8øyåCsò2ìÜó0\p}ßJqÏcáž‹œ`(ûP5¸¨q•–íR(‡âÂç…c#w¯ØÐ`_ùµÑLµ4èôÔÕÈ¥Ê*²c<}ó¼–27¦Òv;ÙH^x:‰‡×õ.6—xJd+**[‹¯'ñáëdóòkr¨=á€ý:±æ²ˆ°é€Ð~`f*JSf*á †³éšú‹þXŒ*­®Yajõz”Spvo“ìvb¶‡¯P×u²®¥÷²š ‚âlWºì#KÚq[WÊw ñh£]‘‡ ?°pñ­¥ \­-Ÿt.|×Z¾y¹ÁÜÀG NçTžwj[N3]ˆC&‹ôbËÁ4–_Ëùõé6ίÏËå ô/Ê’îe>¶ã§²xþ®r-óSšeO;‹¯"C‰­0ëÊâS)ËUï\vƒ¦&7Ž!\NIµf€(à•ê¶Ï½ÉÏ”ð5§÷—Òj¶0R,\Ýæ˜âþùÕ`³M^£Ë—Z%¿÷Ý| )悔s…(zSÈ“×ìSô®õ¤èé¢ê÷Õ/ÂM:_jÌ°Uyx™W±‚·æµç=YÍÎöž\#Ô²Dæ…Xä:¦Æ?Ô»Ä+ë¼Í É|™Kõ´;)]ÖB£13sçs¦$<wLö_éeOzÓÕËä7«(Ÿ¯¹…Úïy‡b˜N‡lµS+’Û¢ÓÇXBÒÙx<FHu#:-/E\O!D\—ÍT‡¬­z…ŠÈòûðzÙ5¯µMüÉšUö;
-ŽÎ<‰¡QG¸nÂßsr*g ‰Lïf¶<–˜R®1¨ÀteªÅõ>Ý(¿Í†«|ít8å©
-,qm#qPsŸ˜yèÂXºyÏçŠ)ACVXCËj’]—‡×,±eðÌ®W²ÄL;üÀY÷±úd×äö͈xh®tº Eü,ÞL™BÖ¿Âw>¢@—<^“Vk“& _¡Ž²(‘ÂåÄ
-|UñAã]ÀÁù]ÂÆm¬†
-…öŒÁp}›ÎƳ\]lÐÅ%}EËm%•]?êx¶Ú»È™=*º ¢žþÌ!\ùTFâ²CüÀ{#ÇsøÉÐhÿÓ@ßµ š˜¾ ÀVñ]lZ%Ö}„ïþÈaœ}®Ïoë*Ù.cþ†g<6þ´„\ñÞÑÑe±g¡Ø²çd7•¥—­áv–ÜaÃ̾[XdJ÷˜¡ßÇÒ2³Y„OWù¾Nï%¸Sòz°”CéÇzžM«T%.ìñ2ýèÚXÜ9¿ðò¶$9ö¢œILßÚTè/å5ŠÂnðÚñØb®_¦‰÷«@^3eP&p|ô±‰:rÙ»Äf)3LHéÈYæ-¤õ2Ê?h4à›> á0uÃR„­aiÛ¾§ûùe:­žHú´ºÈؾüTD{Ë@0r
-©a“ßy«S”yCŸ{W…ËM(V¥,l¼®Ã‹Z.zKéxŒ„n}ßæ
-6Ug0Ñ+S'þb=½ c“ÞIŽG_-1[{Srž<y8œÔtÿò4ÓZ*B£'âþÀÙç}(­•z©)ÎR™ÂfœyêrN ñ@®Üõ@®bÎAÎD>1ž2ÈItã.ƒIä‰uB÷i}‚4.Jui/Å+ë~`~ðÞtجÕó F+“’¼¶qȺګÙ|Ö‘` ñ°|8 ip¹i©b©¯Œ0¿Š
-9#†š1Ì-ßónæ< ¸ÿXøéôªÞÕe*nÍk
-˜]lú¡–,WKÅßÃR£3`ó.ج䀸Y(9À\û`nsá -U^’j–¯Ô]dïx6_>e[¥åÑü:¾Â8ÛêO£’ö$­°·?‘À‰x›ä8$æÛ$ÇᯂûÇóÚ§9ÀÚ:àó  x/è
-£°BU槚‘§9OÎS…P¿p¨|ZÞþèÉI“L
-úãþg¹E”o¯üuÞ&réozÃÿONøñ6(‘AÛ@œM¦ .¯®@|Áq]š9DÏÇ@R·´¸ÛKåK$7©Š8âîš?0KU{2s&Www8òÞrhڧ쯞ü«i'JÒ€ùÿgîþJ·ÿ‚wÿ#¸á?¥Û¯Û6o“¼„×å”z; ”ž,ÆÕÊ Þ5 ã@Es5 ²Ô¨/òdí¯k5±…²È_ý6±®&“z%ɽf2[<ŠQÞü5Ú †Žþ HX ¿±¶ê #”›®Þ­]¦ù7(V_ñP[%±çfê˜9í•sâ—êàx«”¢8ɆMäÐdީ߇øÿwœiòLÒÚ¯¼ü›ŒdÄîÃD^ŽGÒÜæaÙí´\®•óþ~©Ýg¯ø|Pæ©33œ#§
-3å¿‘~c?"ªÁÎ:)á ³½ Þ×Ôx?^5áýl ËÕâænö iwºÎÕÓéýÏŒÛ33ŠŽæ†¡Eh´oNÜìî:ÁWU"Q‘gm¾š¸V»vV½ý×þü}’¿q¬ŽRÔÙí ³ßΙÏy½U¢{2[ÖZ™qv!m||öióÓH¤™h®fùe剛†µñ¶ÆÔ.šñsxöHÈÅÞ äʳ~_ò÷½O÷î™)ŽìA[ïÚ™ç&iÒW·\2×ÄÁÚöXsûï!þÄ^›C÷£\¿÷k]}º†3ƒüO%*=絉 æ­ñ¶pŒ©Ùg6 ˆùrÒÑ®ÿlE§_ÿªñ
-ãú¥éÁ§k§Æñ@Ê£!:Ÿ’7·`;øú¥¶=Š(‡¦Ù ˜KÔ
-ÄÏÞ¿õìê“ꥮ6>óÓ a憽ĺz>ˆ©U¼Û@뎛‡“•:¥‡çò>×6[do$ùn¤B87 -tÒbgUìÕÚÛJ«¼Z;`Žµ^+àj#ÿÖ©D¾ô¬,šÏ~cÓÔ@ëØ:·4‹@=þѹ¯:º¦8Ï!+…Ú*þLÍe‹‹~­ÿ¬«ÿO¶k‰Iy[:]ü™q äD«í}‚Í;tRÏs›Z»çÖ¹!ßü[À¾|é®Ã?p³¯±¦ún3 òź©ªÞ¼\5=k—j«š_©¹Ô ^Ý6»~Õc]÷Ð^\æqœWÎ}âX€ù.‡…V–‘Œìô¯êôË¥•£á ªôÙ^µ8yIàhDJ?¨óÃ`öñVê0ˆk…D­ š$Xù!_ˆ#m3¬#³Nä¡«Ú¼æMu[ï«Ôiòt­T9‡«L%Ïxù68çËrêוÎsò”œ¾è¥Ï±J£2ï– Ú,ÚT¥WDË…ípðÅF¯5Är¥«`¹ò´aáïíÕÂ?YØŽšT‚x±Ÿ_5}Å{«5×µw‡T« û¸‘.§&µÕòT½¼Ys›œÐ¨ðÏ\PµLèô é¡£Áì¼4*ÉÛ´ÒNÅÈuîEdç¼íyÝOÛè©ž±V­.n¹ü‚)lõXðä—a†¹²Ù4œx cœ£(2‚"u6„ì(£‡.£èaµ8Ñe*÷ŒQHÿ"¬UáDTî:2ðûŸGÎ×WUÚäûåG<|stt\)Ó´U‚×bÑÆ®{^»z?°Þårp¿°íd'ê™›‡>½1›šr4Îcåj…âËàVZ¿Í&9]F7´ö\ʦ‘bI5ü–j²`¦Bï¦D¡Ø6ÓP24¼U2J=î•J¦Ø~%ï'¤Õ7Ãe\S4‡ª}©î›iYMõ;Å™9­ÙX .ZÕÉÄ,ìæ–^ر†UÈ(ÛdU¤l+¦aA)Ô»éÆH—§½™6 'kM;í?p܉7ulR@MOD™Ök”’9õDyÑze,­·¤jq<•H”½‰»ÕŽëÕUM¤¥ÉF¤múùÃŽ˜QÛ ¾Bê¥.8U:÷ZTB4!>.Vm¨»f«ß³ŒNUõG}.êz®è÷÷ÁÔÞЪ¨éö¡ªŽŸ–Zhá=ezÃGJ12JÖ®låe¦s–±òð)m°CZ"C÷²Ä‹ô QZØ5¾#óWO‰øN~}á-ãz‚íq½‚µ1¹q=±wåíÙ­ÿÿè:ÏEE•uk_Á¼ˆ"çœAE³˜sÎ êýÈìuz}ûìógtÏvR¾UO•nNÌFTðJ•žüq‘™xÌãÕÌ´L´˜èi×I¯7–=ÝgT;+ ¢í¾4ÓZ(‚ó¥ÖS'g1¯lì‚jèȃ^<¦ÙOôã$ZéúÙk—%jÍ ÿQo×
-^|-5ǹóô%q ÏsÙëjßduÆX1½êúÅXbß`,é0fzAéÌ<–Õ_ùA›=Ö*ÂÛyåçëÑÖm,2äˆu«0NûFm8Hk×1Ô^«!+ÃÇ˓š–æ/ÅÃU\-߶HÓ+loJQ(wܺÀµ_[öF¼èo—?(w¡^N©Pwöf”QV̦!)Æš¶‚ø/h¨ÐŒ¨)“Õ¨)ÛÅíÉ':5qÎôðš97R"É—n0åÖpe“i„ƒV šY~ðy½ éø[ùEÉJjž“e4uã$"Û¡E:(2BùÚ”ù£ÛÑù:ºHñââ’ãšÒ»Ì)WºÁÞÚzí¸µk óÓÏŸ¯ŒMq=j—9znm*ëÈU
-›xœLæ³öƒX¯`™XÇs ’x?Žä¢ŽŸ P%äŠ}ìúLLßi~õmâx«u Ëk¬ŸVÞãƒ!g Kו5'Tä4Å×]’à.G[äâû@<c;ã´É™J†‰ØiéŽ5Æ®½ÛôèCèô8µ¢áLûLe竹$!’̇ “Øh¯2ÁôK¼†!ηgÎwÞ]¼r_ñ=³=L:n«}×YÒ wÏÖ ü:•6·=‹‘v5½9Œòj ¥™R¾(ÊÂî4â¸ã)önÝ &*† cß?=6#•Î¼CÃkÛ£fÅb‰òÔQƒ\v=Ò7Ÿß#ßâž(ËO|¿_àxµÆ©ØéÒ+`AKa²vº¢­z•G[ÁºƒÉÂä„ÉxïˆæðXåA†ö14wsÕr´r²ÃI/ÁÞÚ] óÊ°)Ëõâï‹XÜr<éªsì½ÏÐÌ y"éŒ×"(¯1àÉ4–ãIØL'¶ü)E”NŸÁ6ø
-~HåÛx ê±sv½Æ8qÅäUA¯…›Œ¶™ByT}¤'§1ã‡bn‹u¤G»;ä‘jœP­Ñ>•Õ܃ÈC¾mrZî&à[:›¼OØ´D®k†Påß2×*WxæE’ ™ÍH
-ú8Q64
-oeŠ¯¦Œ5ÚžË ƒ)nXDo í¥=@u¿¹DžÔñŒôv€ß|ƒSÁ3 CJ£¹U°óóPñS‚Pi=‡\Ÿ>À ÒÅ:Á=þþ͈H[ÁÂb1·›€oåó2Ž"i±T¬™|0x*l÷YèIf)ü5 ˆrGÃq1À ôÖ¦8Ô@Y y.d éç3üÞø<*uËpšÝ· i-ý PVR7`ѪÜ
-ÁÙà|7î[—yO9›Zlú:±% ;íZâÄ7(G<@Ã[Ð,¢
-è#ºÁ5]ôã_)^Y@§L¦/Z{íÂ'ãâ…ÖGÅœ{I ‘™"Û?Ï=)b?ošØU•ô/OÆ" žl
-XK²èP–
-øJ™®ß±rcšœ‰˜eÚëôòÄ¡ŒºX{ÔI!ïjÚ1ð‰«É·tÀO6`y, جôMƒ0²€6‹_ž¼ÛÕÀ©©!àÒ½àZÈ pãÒ;–øp“ª¸\‹e½\w„®Öv—oÍ
-ø£¶œ€àF:>KøMjºù<zhµùõ6 §TBª²‚9@@¶ÝXCÇïÚhÑ¡à‹ÃVPRÇ)3uá>ÉWÍÖmŸH&,×ÁöVýÉßB¾<9¡È ¼-k3 L¼Åó-5Þüqàþ\õ
-ÄWç$óC
-vå;"žŒ‚v rêå9÷W¹}þÖôÐíÞQ ›“ËWÖa®­Õ Ü\u™Og9îƒÅ§Mé;¼žg_ðqæCäcºÉf°ÉÞÄ ¿ƒscéôÜŒÂÆ©·64"NW»>ý ;Ì©uü7Oþ݆껒?q‡f\w²Ý›ñ&€¶óµºœoWÝø|-Üá¹€[½Ïliáé&Å'{Ï &üJeÇÒŽF-ž”‡÷€Ô‡Æ•‰çûƒ.yýOß.÷ÓŸJ»ç!Iw™»»äƆ:%µãzØi’,Tök]Uß½EÂDÿZW/ê¨2ër+ËóIÍ–«O™ñ+~—q@ S£°¸ÊÔý¹:¼×ðÎÀ¾úýt´÷<0™w—îdÝ%Ã]'¾¨Ní}©¶«ìüÙ:Õ柖tÙaÍ–zc÷ª6Œ·åƒt»VÿÌ^“z†î?ßÜÕe:ÉX­ÃÛf/ñ­V—u¦UÙ4÷Á¬¬Î§ÈÃÆëÚÏÍòχœ ÆþX›¾ºËtúÓÙx&ÒÞd¢Íï¾uªTµ–tj9Mõd]=ð¿tÔöKõÏدÕÇ™j³Ï«ÝšG”Õe±:­úÌ`]ÙTgÇ
-sŸåªJa¥SדJÒkéÃQºSleܨ¨¡®ý/ת†s…n¾=ßÓÙÙ7ÙxQ÷&ûLŽKhmg“]ž[ÒẢ®µ¨Sܦ6Ë¢ûš‡‰auéëQÕ§ŠHeS®å}=Ï–ù0/–N­ºV’³öš©¢únf ÷ѨP0áEíõÞ®í;:É‹ú.ïÏܬÑ9ìR°½eKîx¾îC޲ëÿ!‰I9>¿5¾÷*Ï„Õv<©a ©])1ãzéÔð›?h1ì8¢9ƒÂ}PLlüh2;û:»åÇùY”Ï(7+°œÇ^©v¼çK@öÈ5³%Mθû^¦èV­A+sEóLɆép¾ÇÓᢓúAÓ-ÿ°N·
-C$–-ñWð=8$Ô:mC¡v£ò~Ö­[ú<_0>–›ÿÄÓ•<¼zû9~–¼eåYó|hg7 z-)úÌÝwôÕסj¸ûÌi:e§pËÈ ñJ·Ü&”ÖÐ)‘º/.|ʤ ݉¶VÖq¸vÝþœ©‘K¡ ßpʆï|Ù†ú1–^ô+mþJ r—UÞñ5–bæÛr­$õý×ñUÉÍkœçù·º-Õo-5—,­L`Å×m8ÚäÒ­ô½œÖ8Husp;eÌÀ™‰ã0êÒþìÓ;{\ç ð¹r·f1øA-O¹Sæ²KʦoV\c3<F)í. ~<õý|¥êûÅg¨WýâAß/›ÇD†CðÍØÜ«tZúPÐÊåå¢{ä›éŒRŠŒ´nUåÔc¤}w
-{õB“mãŸ4«]$Ÿy4³5ƼW:ôk¶žÒú§ÁZP.Ó!Èy 2HüR. L ê1‹ðm?t *Ú}÷F/ðÏ ‰ï¹Yu‹T_~æR_%éΤ})›eoŸÑâiµ®¼)Qv•-á‘ ÛÖâµü‹;ø'§À2`ÛUgg“bzÃ’ÀX©®F¿¡e<†¡‡»(G§ªL…šœ¥&å6Š#rM7$‘½]‰5žÆº°Öðò^/aGa5Æj—ê«mf¬ß®pοLñòà6­ká™Ï©ùU¦Ý¼vìùqZ2j«Y|izþª+È R®Ó§EZf0þð˜A\cd¼X½r0½èþ¢ß¥S;„ ¡ŽÀRn$K:ÈäÂoeÈ<µ,ëò©Ny¬GÐQ~‰WœÑ;N>ðŠÕ³u“pºˆ6 Ã1ªÂÚ U‘’ªh¶‡6õþ¯ÇYéº{=r´)-ÓVwÒ¶ÖR§”€oÕÚluÙ½p¢¸æ›´ÀµaŒ»X]ˆÕ÷L\ÜòôŒ{ ºvï†N
-v’Â.V¿òsLj×Ïhó¹¨:°EäîÜòˆ1Íõá~ô8Ãý7®ÂýÜDŒzsÏ+;ÇѬhÃ[öè|©Ô«Ý6w­Jé|§‘ž&åé· ì‚"Í×uç”wfl“|Ó°¼È%ZºÅO&«¬ a§^ëLÅ21™x?(n¨ Ú*9ETc[Mä~8Å£òº´‡£°ÁŽ2иŸMCðçÖžžÛ/~r€YwPƒà?†Æ¥ì´
-ê3ʤål®¦Åw˜õî-
-<•¥¹Ë!™ˆ)Átzðy“Kw%Û{à‚&<0¹¦T‰òHëÒƒ]1g ~ysâWMª
-MT¯!Ýîx¯{ð‘ÇóJ|ÌØ
-lñHäC]įb> ^ÎoODØÇíˆçDÜV¡rtpŸAëÖTÓ¨øë÷.¥ /Ëkée^ÏÒHwI‘ÔMÃpÑ>À˜2žÃȳW
-Ðê–t €nÉ* 7UÐáÌ ù€qìú—Áú£>`
-Ð2–ò0E¥g
-¯Ü¯“Îr¹Ñ:.3ßtS´mdxRöE¤Ñc<.êcÊ€±«`êã-øyw
-IPr®Ñùuÿæ8ü7~›`ÓvâªþItïrE%–§$»Ö’ÌîD]q Ñaˆ÷c< ;<i ¼>ƒû^ïîgÙÿ4V|{ÚÓ‹Ú¦KH+ª™˜”¡Õ\©ýñ'Ç%}©uRÏ_pb¹ý—û÷î—˜þç&jaŸŠLk@ô\ ¬Ø –å(£l”#%óþ^ÉŠ_b²ßõe|`QÝÕò.\½= ÖK✎&h|¾Æ¿!Ê¿]´--Kú ”øRä¥7|m¿¿äØÞ1ßwùoðö¯å6I˜}ß@Ïק@÷‰è΂ºRËvÆ@{xÐúñùÓ– ÐVIÚwöoι®TùFÇW26ˆç"ð
-&w*Kº(á¶_œýËmÿÃmû7³!©áoÜî_j›¸m¿)·&¸ ¿nÛ‚8æ니ïnæ×c‰‹·Àå»WÚE‹´€ÅÁW`ñ¼ñ¿WM⟬$áãü“›lAFL·mnË$Œåõþ H°çÊŸ ¾ÒkKz̘”þÀª)ûwƒ¯â-W¼îZžœvÿºóåùî#÷ST>ëDZìIBb]ý“;á
-ólúÅ¡ÿ²M ÂÿdÄF)ÆMðòsŒå›ì6Ý¿“ui|ÝkØ<<™ÑêÒ‚–›sìO‘?8ÿ ÇO¹áºÿ8`­Ì{·±x[…9ràŠ¸nÑ®½2NµâÒ¾É"½ðù,åé «MŠëÆÇw²õT²’ÿß»x÷ï$kàM¢ß˜`õOzï}i~*ðE/˜s¹(Çô¾¨í6z¨mùñÀ\‡9ß^Ý‹NzeìoiŸ…üb¬Ä³“™WçØ€jÎ| ô§%T˜Nöyo?>•‚Ç:
-k+|xoQúÐxJãÁÀ~¾’òPÛæ¯ÚîïJþ_VûÝÅë¶á‡§‡&Á¦[~hÕV÷ü%XF¥]{ñ©í†‹ôå¶H~Ð9\Ÿ&ûlÿ:>ùõÇ(,ç_Ã{ÝC#4‘Á@3‰þ§§ÑýôÛz¬©Ý¥—qºä*ð;%zÓlWùÏ´ujd/-éÎðÍ°—êü† |ý«õ±¿ü ¿;P%‹ø¿a‰y5ÙÇë7wõ‹CǧAÔÝMDÁTØ×…Þÿ´Ÿ™þØ  =l|)wÉù1è0ëE«]e½Ö©ºýÍ_ýA›êm½mtÝ)ˆÇ[à€ç§>Î’D^¦åšGÜ겂6ªä©·IrWÿƬ–NC¡T
-Rx±NÎþ%´¦Ë=ÙÜ ¸Q2FaaM$«?h§„ N­€ŽÍ–Ä^ñz4Œ‡‚¨çÁÀjðõqº,×áYͨyxÍùõ¯’»‚W)ñ…By*åªÜh”Nív·$=‡ãbËÞ® ÷  ]·€~½£‹ƒâ;”SÈvê:?®V¤Xvö¯À玙›5*Æ«S­yö¦iCã¤Â «mª—ö¢þ‡ÕežlU6%rPÞW?ãrU$eþ¢îJ§f>üAKÒ½ø,ª¯ô»ÐMeà‚ •õißÁ!?ö«r>Cuܬ<Hå<.¾<—õ¨æ‘W¾ŸÝ´››,ó|FnÕÉs®
-#VNi‘(ƒ'¦I“…êHn>ëI(Y)Š¹R³.Ú±/zï¹@Ûú‘/oîˆÜX®¶(gØ ùh²mwÇÜø®ÀÜÌz™Uºï.Ûx½$Nù-<ð±\Ne#mcž©•…ËhÍýS÷Ql}ý”GùüUN}ŒPNm²OÊdßÒ)Áš+áâ‚è²"QìŠÂZÝBá~O ôœ÷ù
-¡VPž[;\éLØKu·c• ñd:j…fôš¢ûV£A½ÇÔ&~h5ª0%ê=-6i;þÕˆsoïè}ß=©zÉùÔ±TbûÕ¥ G«]¡ÉŸ
-Æe8ßJ˜Æ‡âbv?‰ya‰sôÖMø-Ðw
-Ìpyâ÷¿ãùJ+äNX÷ÁIÁàýƒ²¡¼BØxÑÌÝ}ñL7¾rc©ÙtyÚ¾ªÔXßw©tÄ,È™_ Ilb„ϧu|Ëx‰.ϱ}µ@àÌ¡šÇKì=À7™((Kb“óe¯ûƒ¦»ƒgÑZÞ—Ž~F·²jVŸ´œ©¨ˆ¸ §oas°|µ°¿p§ipä¤HÛ±-G>2÷‰veºe/¢£cæCê5Œvì C}>‰O€I!ë’³£WŽ{ —‚á·6S‚Òù^Z ì
-LεEâ½G¬¬žJøïC
-ß–€—Y³jÕVïL}mh¡ŒÊÏJ¹èñŠ´Sàƒ´U<ƒ\›³*¯—Bô˜®²B´ ×ñMvUµð-ORSJ\ù"°óâ‹;á;{­ÌB¦'›GÚyœ·”KôÖä¼9?’¼½o~ÿA ?¼ñíÅðrSdpNMIØáÞ°°ÚìœÇÄ ufˆ*Åå.þ¾KoD¯ø)9Ø*­ûÐðX»Co~eÖç×áÞ¬ÕH’Y2×â¼iÏë?¾[Š´g«–V¤y§N
-Ûqóµ\ñÍ)PtgËàB¿¶ò‘rs‡I¨å5AW ;¼üj\°c¡}Çêt/ÂÄÝÆÄ=D¡MåѦY0Qå5Ì"Ô¡÷˜³=¸ïù+è½ÚÜ¡4£Ñ`Zݤº6Z
-{´•Ê3› a ‹W0GžW€×ž€÷%K‘ˆe!
-_)Pxík^)€ªQ z%?þÛ2
-óø¥t÷(­È£c@a×W,¯ÅfÛ­{É×”LÐÍK”¸uxÙ¿)Ì”8
-?·Hü!(¦l¶Ò¯•!hzGÞqIóèÛcÑã—ÂÁ€ªZè/Á¥îCÐðY
-á(é­â-Ì€|*ã@*@nÞîÒ6“ZpO,?¤Ö£ kàÑ@&ö°ñk™þ‡''½“
-¥î㻈²MVíÿÊÿ¬äŸ?=!‰Bhw}š°ÚbØ>ø¾¿SyxÕ4½e…ײ›€±³%YŠß%Ë\œ»ogK±ô.ÿìw2§þb˜‘>ÓIº•™.Ò²Þ¤îóË1e—Љ6P|ó(Iˆý9Ø´=®õ5¾\²Ö¬å¶,O{m-ì9DÌå ,›ËzþAã?ÄÛ_I.Ää$'˜ÐÚœG§õ,v…Ì©'0épx&S÷éœN™ØJp¢åVvþYw<å8´àÙãŠP°3¼V±á“|ª²Ó¶°«?0—í`júúxmlúË£Q²£‡Á Õ«nUÐôãj§e³­q¯É Íj2ô4™ƒ7ZPf¶‰$h>9ÏÅVûQÌáJÝúA]!ÓShE:ŽL@v†¼¬Y­ñ²°K6—Í>fúêˆü‡„%£d>uƒyC¶¾Ñ®.ÀDN;ÍÄ’xV]“ñBG W½±ªÑó•r߃ËסZu!9:ÏyŸ6ÙQï}éó˜Þ¤OÄy±¼F²câãDšál+l+~L2¹¼[sH#e©o#W 7 Dïc”îÜCßG‹‹^uúWí4é<~P-pû/MŽÞj¸X¢±D´ª‘wN¹oaYé–I]ŽŽ¤-ê’+;Rº }Âz]·=)£C qÖ×Ï¢g/º*,'ײàg» ÂO¼@»x¾/P$Ôü<Ý
-@·¼*¶­¦Wh<³éöa©Ùî`˜tî‰ê¢§¼ÔXÜTËž•G_:)Ý>+¦^äh¿åA5|ÈŽ½¥ÏG¤ŒŠà|g™TœueAôÌŒ&b¯ª#,‡ãœ@Aû*¿™a]¾äå—Ü~µ¾qÕ¢MqsK±§C»ÍõàÎÁÌfƒ_J¤F@èÜžðš{4úg¤:²¹v]ê'®q_‡Ôu{*Ö"Ê©1|”&÷åNr½Á^rñÁIBÁYœÓÕPijÞMXñÁKðOCX ‚ÁoÇ—!DæÙx†RÃL—NÝ
-Û7V¾‘ó”iÅÑ¢A?†›6ïh6àH½êˆL½ú3Ÿz-öÅ
-g7Çy´µªd”«ê$ù OVo+å#¿»4-‘gqáÍö"1ô7B!.H(Låí—ZW´ƒ@cÚ™/ûBÈs²óäjmçÉze/hf‹•È*ù‡Á´·H†ÑËf‰î=ƒ6mõÃ95Š¯
-rgé.%‹Dýc@, ÆŽÈÍz‘;˜ÞJ,ß/5uè­kåRêù„m‹”‚.¥/¸ÒßAo&ó71_ OB±PÝñ•,µâŽýÃœ«““9WûlלØÚîØ‹v8²Jo{any1’†}£à?(Ý×\Ž¶ •YC‡J½¯>9ÍP {"O,Oøº$£x‘=™Ø®ž­aYÙcű]ñbÁsEýõ³•¢Xp>âÉ2™ò×ÔÙ—ÇÜí_cKVº
-ÅÕìÈósËIùë’mŽ{3VÕÊSæ6OMƒpWôsÛÒýbùHÛLûJºÃˆJ›;˜‚^O’̦!žÄ˜øvš¯–³)lkx±‰±ÝÝGX<…1Þèh}ÌWP)ó\£R–æÐzçåìùïÛ¸ëJ•·oÏÔiðǯ¯&Íò‹W<Ka®|•î9iImXu<_0]¤6£#KÓvã=üA©ÑšÅÓobEÎpzGfWâ‰Ä
-ÖX*µAvš(¾1Ö,^ŒÞ*¶/(¬J7*¿{ Ð@0w¨t>
-¢Þ£"|¯æð½~¤à{PK!êrŸýü4*u2êr—·–Õ’¡Ë¤Ëý‚oì3z ,_¹ ëXõóX3&Ò[Ð+5¥ÆihDÁÓÝ€ôâQ± .K‚— ¾™<x)‹†8‹‰ñÌñ”Gâ«䣂í·ƒÊY·„\±yÑ
-~ÐÝlV)¬º90ê(ž8× ÈqE L^.Zi“šæÍÍÊÔ5-#²òx—FEJ«D|u]¿>ʘîø±¡½Æ‚”)…ÀÐ8¾¸F| *œ-wfØA_¬1¡?ÚÆr9£ÁçvG”
-¡ò6O"×r_D´ãÚ„‘‡Íkª õáê»û †4@¦™,@ºÌ ½":jÅbe“l–@óžq ]í>hVšó**”ùˆ n›Õó@¿´ó†byA!*7%ñìmLPÁhˆÊÅøìc³2EõÎ
-¹†õ Ònuˆ®-®ðãqŒà^F 7)1Pª”V ˆe€[»U
-ËNøòägÅÒð~F:±´âc.jüK!¦|ól|rÞÍÄŸ¥Æϲµ®ïª‰é[Ί®"ÒQŸåÅà e;Œú¦Ó u#ó6~Æw÷Éáë?çv¨z·pt¼­¡q8]ÅíØs€šñû={@°ï \ý ˆráˆÉÄ bb±”X†i@Üñ
- öÕ p|Äa†
-¿Z€"ä¯-8¬‘lKçÈ«DÄòNrwrvíe@å0n¥q×Õ‹Tú“ž=úº >ñ¬±Þà }%Jõ ‚uG«ó NUáߢþ@å`×u:¿ãB ð‡ßzÖ×Ä;du)€feÐ¥n6–°üe°e»Ëz è¬Ú¸p€6‡y@‹­ >Õøèë¢7ÁÆÍvS¨úb˜²<Û:Yq3j˜\«Ýèñ}IÛ
-Ž`VðAž9ó C·G”pîo%E ô‡'ïk ™9 ¨ÿo‚ë(€±Ç6`X0Q¾XãÒ¬ Îc^
-d£¥Èf2Û§2j82U~\|ýù!þû«´~Þ_p
-rÚWÜækËÏÌçÆk$_k'‘Uñ|Å—•ÛŽ2¥ç‚YØÅ¿`ÌYlÞ!f)C‰Œs³s{VÑ=eÖÔÓ—ÓPË=°Å´²î¤Š-°·oIOêc»­9[µÏïv軜iàÖñI—_ÕOtÑ|í“s§tÉnm[2\‰– …Êôu¯‹Ž´G߇#òÔHog3?_¨ër©R«¾5–©înäÈ]wÄïûס"ŽÞ[f-°AÂ;qì–Ukö^æ^ë!–ìuMù,䇶á­úÕúÃŽ—Gô­X}­}®}Ó ìP-w¾¾Çq,ãÆqÄo‡ÞÐmOl¨ð3ÆP±¯&ý„ò˜‚lï5»z%äXîšÕ£Ô­7¹³nܺjwƒwe[À´Í³Õ‰—Ùoͳ¶'›Ép&ÓP+n¯þ°Èç‡M[Ùç÷ÿ㉥–ø˜Mh… xµZÓiº
-‹Ý|ŒÛÌ™µœ.¾€³á‹wñÕ±'G½žßLøuÐP Uôc'*­"3Òk-¿óW‡ ÙªÙšÙ²+5ü൪õ¯~nB•?*Ìc&¾Ÿ¬/t{eh«úñü~22'
-Þn„;…/¨µ<Ä_bI2ª»¼„lNÕšÙ¸7jU&܆Ôp§<­Ö…²Â*v¿¼¬Èñ–]vÆ §ÜIw%Wë^KJ~âÏóR–tÁ[=£µž-äÛQ+¯µÙy>ϯ¯9£_r¥ÄÝ žÚÏš“î=[ÍÖnɵðÞw[ô6¨ƒÐ òV«ÔÁ{'¬vøO;t†rÅa‘“H,¡š‡ V ži6 Âh絆¡ä^;m˜3Úpö\â#‡¸Þ*[=¶!,‹_™Sf=®<3ÔcH¦mí‘HË…f=Í"˜žrÌ­—êHD9Õ©·).:_¤×~:¡!T¬™.w’Õ„Õ¼V„s†¼}†°²×ŸÙª8C È,~:E²ø2ë!—ÈÔ“ñLÚžˆù´œÍVÒ̳\O9³V;% -%éš5©T·ódŒvbØΉ$3BãÞÅÕ®Öˆg¢EØÃÄ—{\ƒØÃË,ˆgU3¸ƒH*–ù[†-dð
-y™z»¤åôê˜r´Þ!%€ö)pB“Jyü€°<<ÑHK ¥—HÒx4îm™d\…ÓðØã(Å´^¥ËGÝèël©Qc„-£È=ëŠæÔBÄj¾œ‰0ÚÖ w+¬—•¬°^ÅG"ÆbµÜP)Þ}Y‡×ØçS…IäÆd—É'µIåÒtÃåk÷NÚ:žaäuìá(Û˜ÖQÌS,/¬¯<?jô/ ZŠûXñPJ4U–«™dLÄýjF¨äÒÛƒ MÞ^<†¼\Í™<K¬Nœc)®Ó|8ÝL8å!Ñ€PisN»Ó–¡TºÅ«¥~ÉNäæÚˆ†ád<f]㓈Ζ‰ \WFѺ?ÍíÑ«©ÍRÄïÛ°žnm·½Pσ“@Âãí9ëó,Æ…9g•"¸ŽTc9ÅY×ÞX¥E7ÙW1ÃÞzÅ$c¹{Ä»<„ˆ:~×P¨êrQ§t‚Rxw­&÷cPm4Nå I9 —adJìdŸñɽyŽ…®#ÖôüFhŒn&¿=èßÊu ^~µ<+—MιÅM®Óå–œ Æ­\¡ž²«4³.cjWæìt}fØ™¡L2sg#Þ“KDÔY£DûˆÞ¢µ%¡Ñ€T”aÐ8U*Ù9ªT^M©R•$(”˜gá»m®1'{®2.æ &!¼ó“³O<ð“c…3k¾²"ctÅs=}ΉÂÎö÷ä”í/¹ÛïŠ 6öÄÌ¥ÿ4™Q侊ÜÚW+2ÂûHÆçδ¯g´^h"t!<¥i°»ÇCU"
-=¶Zd-¾’„—ß›Î%¢’!h;ÚÇ·åÂßV"1Ùt½Ðó;¥ˆær˜¶åR½ÄOË«[´Â¼\¡/ÙÜ¡·1ÙÓ°a0×.ÇJ&u<¨‘{a5‰L®³id²[Í"ÙÊÌ Ÿø¤ õÙšÇv;j~¹©ò»QX:&—‰"Éú4JXô½@DÚ¢ŒïøÉçúÄ;ÄçÖõòLì<”†‰=îá*`¢’ÊJ˜<oÇì#“%/69èôØl:ðDŠ0÷|»-XìÉ-˜ë>5‹Ü7§I$èY¥=¦ÃZzD‡•ìßbE*os3
-½÷ kwiC’ÓÁž°$ëJ4©û ßµposEç³<Ö‹^›˜xɪèi´Ý¢ƒt-Œ\µ[´’F¬ ’F{,’ºRU+[hrâ:a¸“oŠá ²qå*4umÏõÖ`Ã&JÝEäA’:ý
-/Tº˜–†T%Ï(ì‚H)é HòöÖä5%š9d†ï ÄÄÛrÔ†Ð<â<;{`½®bÑ΢§W®Äѱ¨! i©¶
-?hÔçZ“(xáÌ6‹f³^¢ÒN`R¾ûù4/¥"AvE`{óí«ì°çÜmä'…y$7 ëtq<U©Š’¼}þ 5 ©äc@4'vwÈõo[ÎçgëyîëÝð D÷è9[¼ CRˆ×´)$í<¢aMŒ¹ӴŒ$6ÅÛò^ˆ"4Òo¾½ ¤™`!ŒSåhúPËUÌj2Hûž( ŒoÎmWÆnÖMLÍi#rÒ(“¨äšæ!Ãî]È0kpÞ2‡˜R´'èÙ45tX]¿sz“„³DÔ¾·E2 üÖTþÎgª(0t•hÄË”i¶
-Wð¯Àøf‡ZÒ‰<nú:p¼)s|ÐɵÒT vи³<÷ß~²è@Ž–3B/p¾€Ü:æ4¬ä)˜Ã™ @™„Î
-`¸³Ayd‚ËŒÌå!œº
-ì¾÷ü°½3[ÚyûɵɆF‹q“¬¯:ÁŽŠ\8ð*ÖÏ!ct4p!Gdž e )• ÇëPxÄ1m
-ðê®y³»9Àcpêóá,‡3ýLK0
-‰,[£$^!ƒ|ovTY_"þœÝÓó¬nÁ®4b­Øl†w[më¯r:z1S$ë¹j ‡}m I)*ÀkÈQAŽ§„²½„8;"{½"E!ôXðº#òå:„Û…!ü\"O‚V‰+¸>×a[Žk5p–CXê®çãál\#õ4ÉÈæëËø¦–ÖÄ&¶>¶Ä» .ƸñMG+FøÅR:¨í)üG¸ÿ˜A6ÑwíŠ&d¸\ì?3ƒ¹ø;w”,·ÃV +XBã]ubßd¦¤2‹œ
-aP}Ø=R}= ¨ZT³Þ‡ðXJ¾e9 ϧÅ6 aÿG­‰»0Ž¿h:¥2ÊæQ*(t)ÒšGQQú„»B÷å]vǶ`ÉÂ!ŠØ÷6Ÿ”FáxWÇüäòåŒàåã ºÚ ­nD@߈ˆÀ‰ˆ vD°èÐ÷ÅÐn
-û3¨0ÏvÆ…jv£1<—/Èœ‹qN÷‡Nÿñm?„yWoøH
-Üþ‡Ã7i¿AÊí—kû‡cúö`»ôµ`@\©å lê ^€ÃC<lïAÌé VKT@,šZƒ] AtakÜxÖéµ)â—f1ƒ´×gÑ‹ j6{P RúO¶í÷|Û Àmà“þ)Û6¨‘$Ú¶G©OŸ40l³^¤V¤z°HÅÚ(H^¹÷>‰Éñe’‚í„e¦AÂ8Ìt€¶H±•’ÐWâPò"WùÈÞ²¥ƒÔäcûÈ?(}8ÙÁVmÒ‰ý¶NÃg¶mPa÷?‰¶em¿,ÛËAûØ},KL,
- [O6í×îNNh«ú~@>x=
-Ïùõ aFt{¦fCîÌê^ï,êéó#¥ån¯âÔÈEå‰YªŒÕum¶Û2ö9ÝgaÄ_X+Ð.(³<¿Ø¡ U(»þ˜6mtl“‚j':Fä,±»Ã_åâº*ˆy-iúÇ›3µÕ:zêeÒŒœ¦¥Žxg¥ a5œû«Õ q]Ù¸Þz¯ù é•ð4ÿV¬>+vñ]ä]m`³‡ô2¥À­ ŒÚç÷ñk:Y­§ñxö’.#/Ø#+ðò‚ÔƾšÙý´·t!\®Êc‚>ƒÝ²âxÏ(rt׬’\ßÑN=‚%ÚvË´7œoubá²ìŽ°º½“íæ0'žQ˜52èh[×j·G=OõÉh±u q›× ®@àÐfh+ÅH@žhàÖÅz}oÐZ~“ºú~’_Ž^üfs—ªÁ&Tð]]‡ï³‘ò¦®•åôZÉ®T¢äËÇNTUVy½Ÿ¬ïEUuªbæ\…ñ¶‰²3A‹eþ™”KJq8)ÅPþP</]²8”b2R}æn
- â<Ñ ¦iPZ÷Ïñ¿k­†°ÀÈ«á»D²b÷œhEŽºð· ÏÙ²3ÂK„f»Ìß›JIÉ5Gų!MŠÃRÏ(x˶YPkc+ÿ°ÆN^kZ—|ž¹?sFÇs%±"fÍÁ¢øÎMÆûYüvÙfÖÓ •©rZ†?ÏÁóû_åLƒôÚ€c ]@R2ÅRÔ÷é‚Zi`ùÇ:Žäó4ν¶‘3Z)BMaðÀ<™+qz&‡6Ål5º¬dñ󶞩'·­ u»(i8M§å;K9Fl•ê”äCÒ]j÷¤"t2F ³‰ó6ÑO [O'‘²éàùý¸wRWquÐY†°à}p :JFÕÊVr@ïà ]¸kÚNiæ1uSŽ6;C8=Rüõ•ê$åè9*%„slÒ]TÄd /Æçµ”N ë½Âû·l{•¸Úš5ãîÔi½ç4–¥ÖÑ×E¿D1GFKém>ŠøÊ8Š<§Ñœ‹ýI
-4‚ yÛ¬˜¼\=œCÏ’íÏR…çl“svnŠsœq7
-ýÄ©.­k¸B(O¡óç·CBÙîÓ ä ©9êªZ³§^ rIák²j'ö$!KWbÃj€¨ï½AKÑ$¾¥¦.o¹ Ζ—œMwiÌ9&«˜sZœ0ç<æq6º«‘ð»Ë?VH·¬¿—§×(Ö1vü.u[²§RVgFþnÉ.*}º°Æ»Ôüå´)¬dvÈåMë’˽Ö#kÙΆ}’xª#b3Ó&D£hΈâ,ñ­ùþ[¾]&Îx«Ö~áiÓØÞf’XWH˜È‘ô¸Òh¿^¦Ðx-¡1/a¡±=C ±e…/ïR>7lÙT„cÏió"’›Î6ð“+92OGP±Â#ªPå³Ó&WI­E’]¹EX¢Ü!V©CDšù.)æ{øÉ÷ñ–Yá\µ>… -°áØX÷„Ÿ0q{¢§„F£}ï‘@®Ùt=­Qø^ÊîBXxŠ…ñpvªçÀ3¯ê`VÐ=„+õ·x&»ŠM˜ä@Ⱦba;
-/ôkÒbOFwΤ‰ç”žU*jQÇ{äJ^· «V—‰&Yoã»f¦·¡s&݆Šq*ÝÁº¿ƒõa€‰›¤Šžúu‚±Aã×õ¹Ž_7dœÉ`á»®áiáQO³¢€"qÝ€°5C@ØhdAxÔ™ðX…?ª_£çtÆj5Þ±7"Ïh¥Äœ>ŒïD²1Lû‡ ~ävöº$yS[DS¬·ðÝ 9&2œsÈK
-GóM Ó~ ž£.@¥ýÂMh5 Ô-€*ÎùíÁ~ÌÐA¢Ðæ¸òÈh¹hEn4sºT¼f
-°I­ôÎOÎOô 2äœ\¯ÇSBnñ#\È:}L± !’ñc0¸ÜZÙF†_v,ü×ÒàUxã±ø,jÜ’¦W
-ª†€¥qútº¿ñ“ƒÒ› .pü=ëve¿]¸L× å6°'‹Xp'}ÁßÎÈß
-Xý™l‰Ã/0â‚S ÇØ ù¢i"Î"øqX÷ÑÉ ½ƒ•Ö üä·ïþá'¤u>A©„À"ýßÒ»ŸÖmàLŠµáÿn ö8QW
-<í@˜€M@$¨Eð•ñû'×60K?kÛ~•” |Ò÷ö_AùØtÊšƒÔájƒT=û€wÙIÉq_I"oƒ„•a@Â(vhêõ,à£D.ƒTÀù³¤sP}ãÃç†R½ýäÀ· *Vr ÌWYÛ HCàÛ~%Ú~íHTFèzío [½°ÙÌf ²7árè}gÛ„(Èöœ&ÈÆ+Ùå©Æ+ }BÍÿÿ¼&sá›Õ«¢ýËh
-§mëIµœeª§R$¿º™Û 9p@Ïp¹&ÚåÌ Ví· 0•ä¥Óƒ¨ÖËò…Å&gË›W¡:>ÂyÆÒk•'îÓ¬&(úQsã‚X—K‰z³º«-p“½öW¸nBW{n~®õåæú4$FÂFsç^R¡Îã‰Gâ{ÍUÄLžeósb[,æž´]æ°ºò„Qz£ä´®Íö­Ívcì_Nyw‰r)¼åzÕÈò¤ô„Ç…Õ“âuc·òµfÜ_¨ ïB?­±àÁÿ­Ú{\ÿ_Ý~µj!ì{ºýjÕBØ÷tûYÕBØ^m?£ZûÑ«ígT a?zµýsÕàÊáÌî•
-aȨ{h¢§Ø\Ã9OÙÍi5L® ‰(¢dõ­Ýˆ™4l‹½²Ó/ºmVh
-ÑN ½î#f¼4;]zyE~¨·ër¦×NëYGŒòÔù çWPÌ}¬8ϵÒôÆ•”Y¶«)æ×ÜÁÕÇ+6ê=Ki.ã“å[Ôk;«å©Î¸Ègºg,ÜRøõq•5ÝÁ†¢#ô(ÅÇ…aJR§iZ\ý·¡EÝSïTfülKvKo•û‹r'º2gQÌ[Þ/WzP7Y(µÚ¶öᦱ¥—Ùã®Vç0g»ÙýsïÖÝ´²˜‡‰þîäÞ«¯·äµQ¢ÊÞ
-»BØ=¼Ù®9Y»IÜü\ÿÀ¯Z-ðžš¼/Æo_¿tþžÊ!ìWëü=•CدÖù{*‡°_­ó—ÊPEÚCaáꊙD’Ï^ ¹ìï2Úß6†˜¨] œsê6\{{—·¶€”¶^„Â7RœF¼g‰6ÎÝVDçi•™Œ›ÊF\|è¾Ç¹·Ðy±¹÷[ѵâÌBXMÌÜDþ>ÀßRg`Ç`(Ùöæîäëõl¤8¯9­JÊ麯×3MbÜÚ´§¼™ì¹Êe9$æ7žQešè¦ÏP§…hÔo~k Ô
-DÞWéBö³ë!â7îÊQl¶0˜¿%rwÄë,=b÷áA, urj‡¨(îøqÕ¡X]û#ýóYHuÁyôe[Ưīà‘Ñvã­]ÿ¶ˆ·ô{‘¸làÕúB«ÇÇôì<¾tüÕ*†°ïéø«U aßÓñW«¾§ã—Š>w7}îP˜ù<¶÷|!~ËøbÖ3|ñn’“‹7=„¡gÇ^så8…æí`m©âqunù®ù@Éó"<NÀ‚A&;w _‘ilÛ~54á<äg‰þ
-k“|•[És¸qlæA}ø8‚šŸ*½þBØ|èOà @‡D7ûjÆTÿ}rŒ-”­öª°ïíæN†E´»:%Æ´¿EûÉZ„°.²¥žmª™÷e>¯ß§CüQ¿ÎN¾4¤Gm¦üŸØ–ÿ>à ±mÿ>Ž ícYîìN*J®
-]ª9ç5s¡åœÉV¥¤Õ¥Ubçn¹ý<·é–µsn\"è¹®®ô³¤ ³çšÑ _jÈæW¯ÁË/_ÐÑáÙž´F[fØž­tÕ Þ;[*ÕÊÔ"Í1cDûƒÄÞë•“¾jí.»MsPÂ7ÔÑ°¥g%fIØÕÊÃí®ºÜOöU’l~
-#ë×À»JôïwÕE [gvBaÞîeæZn·¹BŽÅ«’; ·¶ŒÇ_Ís×$êZ¦*Br±lu]ÅŠ-«f¿‘ÊNw+—;â¶SrónIIÌû„°¯÷? >—m|Ž\õ|.*Z>ŸŽS¾`ßî¨`¹{_x•Äû¥KË—%{ºn+c8Óúii×2ùÅFîe—ð¿V–Ë·^-î%v3÷ý3»ÉuFȇãßCûð—D€fûi¢?Þ–Ÿ!ú4\±ŸÑóýßøoËOëÂ~sà?Ûò›ÿ«¢ÿ4CØoüµå×èÂ~sàšïèÿÖÀÿ‚èÿ¨žpü{ÿµåÞH!ì7> ùŽþo üÏEÿéÂ~sàÿ¦-ßÍ¥lŸoh_hfZ¾H!®/æ”Ø}4Iv.µTXw•QÕÜÍ.ÖÚ²ˆüzÝyqëå°‘Ø,¹Ž5ŸunN3Ê»ÖiVÓÊÏéÞª~ |ÒwŠÏIYëíŒk_”Ú#òÅž–¸ÑŽr!ËÜÜmUk‡l¶ñKöª?$msæwó—]uŒŠ>wgä#{›vŸÍ«zM¿ö߃ö—§þ|®6(~í•¡ž‹¤iÉÈ0}öŃ“ºKÆðB^«ÃhôvH¶æå¾ß´7%gy•#ÎBS‡9*WO³õ“}ê,náêØŒz£Ù\ÛÿKa:ð-Ñicëó»>ã ']IW?Š=2÷ti=:Û`dÆôù°­E"§µ»éœ–i9u^#ƒûÓ’ˆÞd‘ÉãàºrdèÌ}ˆ¯:‡_Ÿ4³'8m^uw>°ï™ÒSíúâ½ç=Î8’½iìz|¶•£sH¨3 zÊ[÷‰õÍô©ísn6^áSáiÜÝúãBsuWþÙgåÌá/!„ýýù?Ïu§¥O¢‡‘WôKÖŵâG¹ÙíîIçŒ÷Ú›ã3[÷û‡^¼ÙÍþè gJ©†q›/Iò¬w’¶;ñÒÛý¸˜=íVÙ+Ý—víõ—ùÓÏ@ûzÿI´vø<6‡Dã[γŽò8s«ûía¯ÓZ3ÕS·€÷y½íoznøj†s·½¾ÏSë‰Ú^¾ Û6`bÆ´7(µÎ4Þ‚sþδ ö¿¾¥Ém`—Ù¸ ¾ØõàZì‘XMo7ÀªÉËf¦ªÇA˜8툕wY¥—¹a‰qs:ÊÊ–í@æ½Þ‡a›+íV%:Sä•qšþ=„°øP
-‰K¢E,°h“6cueóŠKÃ…úa?ð!ŸÛï*°WŠ }!œCPM‰{FfØ9·ÎÁõ6tô
-ê þùæ7€;öíKÕÁ¾iõÛïz´ëì%š3„™•ž ItÈÝ®7±'t]ôpyËhS(ÒH}¨t”ÁHP} fá*Ò‘Ø–¿=9b5Ÿ¿ìµGÜBîgVjNEÅrVleéËE­w_0ÁNõù#2b+"©¤w*Ò©ÔZ qõW³{Ç`Ï߈7ÇOéæ3~ÍßÚÏê\ª¿*Ëû‹
-}^uŸç|H4òpEï.|QªãSn]õfá‹zj Æë}¦¹±ìÕ‹Ù®»‡‘½Ln¤-¼+µÃë4/%µûLºÞ¯ñ=¿ÞŽ
-Óüb–òóŸ€æ;úo¢ùœù|…~úB‘(øböeúâJ%ƒœ#yEÕNœeÙŽ?ó÷6uŽî×Qnï.S{ñ6ŸkÌuF7‰³&ÐåÓ$q:\GÅ”bVCz1’¨‚— ßèÉEÃf[€wN“-B)óhKݯ/Î`½â c§«ãègöhm©Êyu^äo‹™~:Ï,T=hÂc⨷ìî]d$íÖRÇé3ÕýÂÅø€k±¿:õIÔ’ê>—#!Ñq
-À{( ‰NùÕãtXS÷´±–®f1??º’xtÂçÌÕâ¢So™‘ngcÍ7Úa ÀèOR-ѯi½ŸÀÛõY¹ºï)墧–óŸxUòÉ€f0Oæ Ø+à-nåK0æ‰Õ#Ñ3©[Õ¤+ÁäGeZ¾ìð’pY÷oéóbžœf,`¶ÓDû¶Ïj÷õìS«>—S6½ª»É…nv“ãÉ<€öõþÁD+0ðÓìÂçwe¨ç©Z†1¯lîéóôJ5¹z¡Í \‹¹Iƒ<Ú2±?.ïúy?'É‚£){×Róôd5\33³ßn¹‹Þ T]wîVæÐÖÝɪ­kÝÅBûÞQH”?5aàWeöJ]ÞìJå1è¥W·|²Ž_«O¹z:dª«½®÷ÚuL„—-ýÀ/–“Œ3F„xŸô;jÂz »4éäô£ÞZ<ôe«RßX-ì2Zý À»<šü¤yo™ÁsI:ꋵuí>>ó+¯´¯ãç]¢^;&âìbG.*Û•úº¯ ¦ÖÕ&÷š1¬­cn³›I\¤v)’­ËÒk'7™ÉLi2«Ô¢)§æÖ„°?øø$úì5`ç9YùBc‹ûâÄ­y/Ó[\6V =E«¥êþÕ›kVO^ö˜è,:цü¡7ÆÖÛZ¿«æŠÝÌ‹€ëé0™lÊÃb¢în¼´”ĵ¼”$(YvÚÊ?‚·;ú_|NL§ Û1$ZÞ¬}aãã÷qS­\«}mvê¥oÀõüRukoNýU®½]ï@MùêÀÁj¹^êâ%Úeu+ÊìÎ5ºI‰ƒ¿eqùZFS¢Õü|˜­‚²Zøð¹l1 ¹Îšð–/ŠI
-ö–‘)œöëÌäðhÉw§j—Ó›‹’k-¨Éµ®¥f›òh“°3ÊP&£âÊfek³¡#ëñe›¨ÝUÕ]‡©”[šXÁ0%ú'aß;ú—às5)ãs݃ /ͤ}¿bä…NÝÒ‡ûí6ØÑBÿdÅù"¿,7«Eý¼Á3*Æâp| U¡« Wªµ>;xÓ™Xý¬ÔIEïHõ•h"U„àñòjîQe©|Žüsa_ï}nÒËÀ)×ñ…£æxH} ÜѾ!ní~¸³IQ–³¬
-atïY~R²“Ì·{doª±x{"rkDF¿Ù|Փ׫淔WÕxÑ/¨XUÝ…Ëõþ+Ó‘öOÏí߉àÛIÿ~-hÛ“0¸wT½Mùeò,µL)¯fçTÝ›Îô
-qqõ¥d,ÎïTËøCvªô­qæ·úxö¼I9ap¯#9¿ZÁ¿R;¯_åƾ”#µZø{
-;8BrÈ]Bæ{¼º–6|EfG‰rGl¤¡bî V()‰F¥õRñ¬¶šÅa¦Õ.&üV¯ ­ÑÏ@['ÖÔjA®˜½¦Ñ«¼*Ý*=Èt;upè6‡‚«HF>¦V)k>+w„6Üâ0ݽ<­
-j¾‡åó&aÉkå›Ïc!÷Z b9C'C|™¦~|æZ¥}fad|¦rnÁõÒi'yáóx¿æóX¾g}~*ìsýBê6*Ipæê–Z'éTSÜ6-õ÷Ç“1rF‚0ÝeZº¾ÍGS†m”È¥t®–µð¯ œn«ììþBØߟÿ¢?@3„ý4Ñ  ûY¢?@óÿRì×èùŽþo üÿý_ø€fûÍh¾£ÿ[ÿC÷˯Ñ3„ýæÀÿM[~aàš!ì÷ž Ë‘OšãWûíØa®@¯¤ÏW–uŸïkŸÏÔŸ;¶2Þ•¤ ª•ºG9z­äèUÕ­¿]j[ ¥f6ŠVU˜­7ëxs»¡*ÅãŠgƒ9Ĭ
-®ç/p¦ïä-sâázÁ›Ê³V;×´ÎÐí8‘±ãÕ“ísƒêv¹—šY„9›oèBb¹f1ÏZu(ÓYÂõeþà'Ã
-Õâì BØŸü=|eÃnÎg‹H´×p|¾]c}¡˜l&Úž3üýÒ%ê×Ò–TØЀcå}ý\ØKU67,Å™«h_™×•ë˜©³ãÍõgþ>[j“ëT¨<ê%ž©É­;ýG¾ÞK´Ù„«åÕè
-ELÃÊkEÛ
-ÏúgY»¸~·R¾¥˜a{)c"½Å\ç_*#›C…îÇWŸë”ö|oë­Ù¼æ5§îxÒš´L´7îê’ô’ÿBÆ=gþ‡
-×V¯%‡æxáfõà*–•lVÅÄ—És›Ñ.;·YjÆõ´äTÊ<>7ñÔöøJµIÓÆ$3bÊÂðÊ~îûòë€ÓV¥Çs*.c†d0rn/a÷8±Ä²{ÐÕ²dÌ:×ëF¬Ñ¢w+¹ª8…ÄR3ŽïÅäÅÇL¹¿{ÒM4OÖÝE<ÞÊ€"Ö Ç+!AÐÜ =šsÙáÍD
-?
-J^å3Í<ž‹¢îf{}b‹÷à ³~gw±Ø¥ÞÙØ•<¿Ž«;x»Ë§{l./{ ‡m=z¦ý @9ü~4àw¡LúRcý QŒ L*¿G‹{65trä?(ígMP±¬_Ì>§ŸñÒÊ°ÐqíÓbCÓ0b$ŸðÎtU³·Âò-%teÛ{f¹œX´Ü=Ù“×¢ïÞ µìnT®*8$=ûÄÙl‡D£J‚¡;÷߀5ö¿¯
-PÞ>»Ñ/ Ïtw ƒ ³Ü•kZ á—WFÆ6ׂ ”Ü
-göJíf°'Ïüåp1Õº¾0I+yœ±˜ …îZ9{æ÷ĵ
-,bq|œFNê|-Í›3ôÀÞŠÂ.ú)àwù¿OižëžŠéq¸ŸrØv¹¹ñë÷B8K×!yãµZÝaQ£0|ñð¢;Ñ(;%óU(—è’'æ< ®œNeO~nâ_Œj‘ºüœÁ*ª8\uueØ;}  tcÐMîÿ!N Ûûþît«Æ¦¼Þ ú ‘ؤ/ò¸· bH³¦i“Q¢kPèñfWöæøÆ }ù6c#7ˆ´cq ô/ÕA7qiôc¸ìkĽ×ï#Þž¾<§¿ãûtôß þæ»WT6÷lz£šU¿ |ù½ùu‚öèNXï3{zå’Óáª-Î÷ îúúÚh©ãÛñÌÄG9ñ„§Žò­gÎÖ^ÂÖÄáÙË\ k±§dwZ¹"Qî—ðõoÿ`%7
-N¶
-Óú
-Ýå—£Õw¦½iמMy0 “^SpÏ·@¹‰¥zÁ•‘v"îÄƶYqg ß<°“ÓåP†ŒÑ1ÎçmŠÈúäåiÓ¼+‰/ä/ßúM´Ó…õiøŸÄÐp ãO÷ʲÞ•&¥A˜¸^ÙÕÝLcG\rKª»¾>æý<ÊÖwÇœ|îL™Û3ëÀ-š·}Ý÷=³µ7ÛTÐ;j ;K‘ŠÊë¤ôë
-ìêQŸ/LƒÌkÃyî±½¼áî”­ú6_æ^$3¦ñl1‡Ý`˜8n‰òí¦ç¹×Qåµx­¬‚·üÉP%S«_Ço¢ä¨
-{æ“o™Û{%@%ôAå¸ÝÄ®ƒ‡:à̉äÔ;cMå.¾ÎÛ324×vqM¯÷«Ápmà+Vß’[×õÞN›k]Å6¶Ü=P²¤ãüJJø
-ÿ÷€{Ë?)…Í]üQ …¢“† ;g5 ›;=
-]Š^+zþH. ˜ìÃú¼¬ fï²€c(q‚ÓQýBψ…Ù£z\l>îx­T>•˜VsßßwÚ›+7o©qúÝ‘ÆÔªÝY‹ë¡l{‘Î]&?mã4»‘Óú,d&«[Iž´r9e"¾ñw|!(øK€bÊÂJÕ ¤¾XØ5[—ØËuÑ(Eg{ÞÏ‹Ž|füËÄ] Vhß*F®à×4)U­ÃõÅ·uÁÁ{5nm”k äÖ¯Ï.ä¾=õÚÕî¤-zƒq½L¨}a©ÁŒØPz³­ü¾ï (6¦Yˆ+Üq>a?¨ìÎE‰ŒzÞZN'p‹¢OG~b%ö)¾ß,y­¤l¤²šSJe©¦K¥EÆ7QÚ陉¼?"ÔëÚÉ’Â>Yȵ2:NâÎè8]ÐÄÁÔ·¿P°98ØS-Ø5ç¨f¯÷ VoGºËp7>q^Óc}iì};·Woþ^k“JV:µŸ^˜<»órYf^¼&麒NÒNR#ÌH’{‚ŒN47¼ö3¥aY*·†åÝfü|!Vú€¢ ä@©:ì‚JÂ^=ž2ûI œË!^£v€âãýÎ~ovóy⤩SÏ—mêôë+#Ímû­Ä2?Fy0«>«`Ú6—`¬Ÿã•~3/2ûh§Fg:Loä¸Óce $Âίãó×ÛʃÒã×s·®ÓôN»"ÏûÎö_~vO¹½Kù•ÖIM¿;GÑ#)o9˜µƒÔ™›íÓè®ü„ã½yVfG¸»]n.ÜʹsfXKí°ØÕ+¿PN”Ï ò#öò¶Éã¤í{åÝiô³Ûå¹g˜õ6››È³ÆŠbȪËm:8,ŽvòÄTO؉n p¬èVú6&ZºCs„GÒ©RH0qnõ UæfbXŸ¬2ƒÕ–Íÿ¾¿|ëpœ7ËŸÄÐñu ùc=;šû`µÛÖY§x“Ø”Y:w·Ã™½¹À,ùË…<Õºom’ZðÛ/dœéwM
-mg-ËÄb¸»ŒîŠäŒ–]=z‚ð6.ó÷@Ω_(Ÿî ‹¥;´…Þ<6ÇÛÛh³JgMÕ¬·•CÕ‚å{U|.Nä0ÁðE?Gw¢Um²Pø8cåI
-='h»,ÁVqäˆ7eT‹ÎúÐW\sØgké.ŒÄݤëöcãý:®/dp±V™šeJÍ›®ds#•ô«UÍÒÔå0’´ùu²5FGÂû0%¦gjŠ}hVHe/—ñÍ\ J!u(•l”þ ‡JÉü€Ü¸¯‘…Y¿Ÿ©røÛêIø(ßVÿ_È_¾eyemd›Ùµ Ó³2‰NMÑŸGœÙygS­S3{•!®l‰®Ú‡Õ@ÁÛ~¼½ûýôýŽ¿÷að9ƒ¿b|„&ßxê”I÷LÍõ¨"Vèenår×â:î´Šw~F¦C°šÄ½àº/Ïú|$®P)Ïe4ej×~n²Åé<y¢ÅQ-¨U—ßÂߦÕÇSö–êe.ʬ;-+\u¶«Î‰7•S·ôœví«t=´ÙöÕ†ˆ¯írœr¿–£eÂ_(àÝäßsä¡
-KŒîA1|ƒbKîÂWž
-~§öäÜk?
-¬:*hâ€õ·åpé§ê†ä‘í™ê&øÆ¿IÛ9¶È»SãÁ%ºÎIû ù¾ü 0éÃa
-h{k
-.RP Ž›´­cb³û¾ß_ƒÂ’Š@¡&e MÑÇ Ñ_ŽÐQD@iZRŸÓ@)±ó¡í{:§I/’C…
-6£ãí'ëNÏCÁÁ^§ï“åõ­FWà§\E9ºÈàž×­ÛÃÞÇòé0bƾê½7¿PX3Øúzø| ¶x†…U™üÌ–%ü·§ABØ[¨D TÈUŸü[†Ú‚Ÿú$§².m­—÷­nuªû9Y¾mÎ1>ߟñÑàrÚpƒÀÎMkçý}líÍfŠßìž`¤~ã ùýõßãßE­z¶y‡E¿p¥¥—å²4åL°%7ÇUéYyHÌd&:ìç¯ “לwJ ×MV¾¨‰Û'¹ºgœRÔñp$éÍÍÎÅÏôf•½Ñ©$¶ÛÍù¬nLÄ–~Š/äû
-ŠNvP4îw@±Iò „¶¯ ä yP^ØŸÄåâ>¾ƒúë娷ïÑÑx—™ V7)+äקÞØ)ö`ÚhHÚæ /d¿|8ίÓÛñì­õ‰_•4¦X~ ÿ¦‰•§Ps¶a‹7X‹ÕÂç<Ùp¡h4²ž>]|E1nTC<ú\dá¾ô)^4ŒYuC´ •¥|à_5ƒ"³1¢×çh>ê^u«ú9TNòº’Ý*/Ëßñ…ü¡àÏ
-÷ÕŽ&;°EEQ€mÎÝA™$Š ’Ê~—ùãã‘Ì¿ÂíJ¬ø“Ð!œeUš]ôž[ÿhIc-”5»oLÖPÕìr—0ôÕf_'Öº]"öŸCeU­7Ê+¥µ¨-e5Óa ŸõåwÑÅ
-NëGcJÕeyE›&R«Ó£{)¾ƒ}zVq¯Ú´“/ê4f»Ôç¯ØÔ¾yIM>E ·ˆ<gtzõ\h¥œ!®«©öÉ齤T L4^ê¿O¬”8E‹_(<µŽ¦Ô4L_¨ù´]P¾¨ßùÀìçIà&Œô˧{xÅáwÅÞ%Eà¸=ìþ^ꊃÝûÍ 7VAi—SH­«GrªHñ{.«A,Jƒ‰©ˆ{µÈ‰cŽZˆ¹*3û¾?+ýPTõ¹>Ãz±z ”ó$P.¹¨$í
-¨Yöñ¬Lí8€—7?6+·wnŸ¦¹¸sðtÇÐáFö Ùf¹DW»ZÕ¾*¾†}9Îø„4,MÇ+¥XqRddþR°üe˜Ÿó‹TeöKøÖü´þÁÍbÒïÃQ”T`çLøŸ Ö
-¨æÌå£ûüw‰eŠ×dj\·¯‘ÖØwV…æYZM½””šjÐ:´eMŽ;+“ p‘€Q_ž%àºÏy=ç<g?ƒè_Àmü›f!À1T€šr1€mž­Ç!»ˆ6úÔ‚»‹S=ývš;m¤lÕõVÅØv•ÍlDUÖ‚Ó®ÊÀÖVûºÒNït‡¯Tô>ç4ÅFÇ.âyuAÏØÎyOÿ¾¿|ë7Ñû… fŠÚkØ9[!lóJý)§ØEh(ÃáO·èñ2ßöêüí²eI[¾Ò˜²f<ì ‘Å»,œïõÊR ô&ûXT; =Œæ»RaƘžÇÌG“Æl>“_ÀJ€s|"ÿoYƒëù“XƒJZUsTãñ¼ò‹À’û{—¸Ï‹¹®¤íNæÌ$®£›¢…¢ª"ïr’Y]çE¬n–bó†±ë :ß½½&3V |f{—1}¾^_ÈŒn嘙=jL
-¾ØË\SZwZ~ﺨ›±:'»t˜FÍé`a'l_eüÙf;T¢]ŽÙLËÑìw|ŸŽþ{ÁŸa‹—¤ªSµªÈË»B¸`ÒrH+õU0Θz@”ï¯Ç R—/ümVR=*d»Ó’[ì0µsý i_Wv»]~ØxËQÏ£Víe›þæL7WÃÛ¢ÙJ¹ËFdbC¡€Úèæ²[ˆ–õK€ke~¸»4:?
-õ|nò#¸™RÖÀå<Àn" 0î¨,ÞAa›ÖE´mgðpâùR‚ùB¨·ãÂÎp.kª­ø/¡ºóFéäËçͱÕÅýêNWç÷»ãŽšë?È‹ç\‹ÜÏ/JçGƒüo‰¶*,:: 8šA±uC姰eÎÚDãK«Ü~V I‰ô4ìV9&À¯ÎòwÉ3¤õÚCÖ ÃŸ‡V‡ÞÕµVîç<yÆìqÿ¥Y…ÒAù)@~sƒ¢ÍÇvMºð¯D[Ì쨠Ø|z xZ—Aqû‚{+¢ôù5yìÙ¡í‹Ëi¬…Š {é=$šUÖ3§ÁµŽì7±î®þá>‘s«.¬çiЬÚv®~ØJR5½*þ¾?+ýMt”€c×0€•S í·ÄeôR¥|•Å€Þƒâ\ˆŸÎ+<D×ê†O«õÉ°žÏ=Ê18}~>å~mjêíîö·WϨŸ® §w—ðlÑ»¡¹¿ã¨n„¬%íÖ–ÿ)@þÜAžÉÂÝaßÏî°(X™²Šþ ¥É«JüxJ}Ý~º"~´§j‹Q7Hµì±7ŽÖ9Ká^*Êu•Öçõ¶º9mÔ’}4Ī{¸´SSÄX}÷´»p»’Y~CNö§€¢.¬O&ƒ~.ÂÀÎù<(ö¸¥÷%«Ô
-a ÷ÉJ»¯µ%ðd‡RÂçgâ~\Ÿ‰ãC‹¹œ6lÏ¢~
-¨™v~ÓüÎ>.ØâÜáû¯ D2v“ ÷èåÏË`¼[.G.‚k_~€ãìÚOìÃÙ=i$îZz3Õ¥´Vö9µ9K¡2^gŠ+OWÅ´…c5Aòó‹KóókvÊ—”AÁ=Ì÷å
-cn bžò…á7¾ß_ÿ% hÑ…‰
-¯ÆkºìÄéO†jý ÛÊÀ{“fÒ›N¼f’œVgÕÑO
-Ë.Ü­!.Ô<bmØ5 TtþüèÅÚË?­#;ÒM¥.9, ‘4#sw¶z”aòm‰ç×Î^»õ‘í_¯ÆŠ7úzãü‰o"ϱÒR”F¼1òm5;äÛ j?)*Î&G¿ã ùCÁ
-¹“S)bϧ
-D.1lìó“!¨¡ 3D¨Ÿ¶8åß™R‡ ¦ºîƒJÿ±Š^ZÖð*3û|5dé}t–µö!´&»£íñšôêËò¸zPþIi\Ÿlç裳£ù2¿Ÿ(HâHmSªCfƒhtŒ›Éá5îy_œÝaY,† ’f‡—1û)@áÉ 8às ÜzcWϯtO¯nÉóS;:ÜñyÐ\¶ñ…ùt¯¯¯êeZ1b—ï×õŠ{mGòü˜i¯i÷En&*o™Q« › n£yãöVâKz ô_¥~`´ñ¾$?–ý€*Ê}ßq—Àòg¥ß
-±Øìw#s/C?k»Ãæ`ÿt:껿æå þ
-Œ¾™?;xÒAˆ?Ãòg¥ dÆÈ5á…¶ågнI´±ËÆOUñõ¶œ[ɳ×Ì”eq$.sõ<:ñçä­§3ãÌÁ.‘'FoWNŒ‘ß¿OχMÀ}b*éýØÐ}<_ñ·uóñQ>
-³ªÉ·álY¥êƒÕOÐnÒ9·p9¡ý(‡A¾u&@~G) ˆážÿÒϼ¼€|'
-jŸ“^T'€ø4@ fä.V ädg
-rÝòd*>Ïssõ`ß”ÕÕÖ&lÍ;_³Tõۦk® Æ_â ùýõ(úMø]þ©è4?çcÿPôšÿ^c?Í]AÎ@Ñ[£ òŒ ë3`UP`pÏ_` ÐÕ‚üâ-‚|¥s¨»øäà‚m§@“NÚF$È)©9ÈQåU\¨GÊã¶fäÈeZZØÒ;”UÓÛž{{Ç:^L'­·¸·ü\
-Ü…lñ“oI}þš í×Ï€ìÞCâž~{eÅ«Üðw48.¤ötßÛm[›nóZ½­Ü¿É«Éâ ðwÎÑ8 ® ý 홽Z8ÍèBèÒEëO¹BVÂMoz›!p¼ÐE±Ñ¢™#ñ€¼¨CÑÉ(ÅƶJ{o *  ?T­x Ð*ˆ ë/ÙÛ±üñ‹2Œ%5ƒñþy.Tµ±]J”*ˆ[_H\4Ô”ÅæüИI«½¥/thM«šx‡„Û‡k†zòdkRÉþ¤ÑEÚ“Fiþ%¾ß_ƒüfú×ÍEÁ©À ) Eé¢ Ù“ÇoÁ½'s§â5[ÛƒÔz°=µòãuxÚÐ2aæb k°ËÖ½¶\lݾÀL';™f«íó›\eàbbr"ß“E@¦-E˜íZÜæŸCòxv(¼ü @þhŸ
-¹ÇvÎn”‹ëf,ôõ‰Íà‚æ"Ò^ÍÐí~Tbƒí•^¦´ŽJaò„ÈÕoêw¸»ÃçÔÒ T§©´x戩ËÉÃ[¹ã—[ïûA{ö[k#ƒ?¦í6þ ‹<íìi¿¹Û
-£Q­üš›õçr ËȺgpæÇßùöJóOµ/hÔ
-í^f
-Ä®UȪ?€{Y?µÓ40åýºûwyÒUµG}(V í¯Ò„;%÷Î<‹î^òÌçÊÚsL!­3yb²ÁV^‰Q-¼g‡ÍøX(ý{«ïÂþ>x|„¾8<u®ª=ªÔÛ÷2wáÖÖöÏ.´K“$u¿ñ…üþúÏp¦ê ·WušÙÎNálýx=yyf¤èOõå0ʵç×I¹KG;œ¤¶7Š<ͳ‘ÿ¸aóy”÷ÑøBúýôá„oÇGO/ž9‹“½Ì-…v§U´ÚE½N·Ã4I¢£Äyûª\¤vù•4!§àÐÒ ä²¥ÉѺKÆ#iFÄ´ `GÆÃã̘ÔTkëiÊ¢^9‚-/‹P/SíkÃS eµ~*(TwZæ™Î‰_ñ,XÉí«dnÛå§eµœµkÕÞqø…4ýön®ˆ~®¦å†2Ñ:§þ°µ÷©îºc±ÕÙÏv—àvâX 7.³UyeO†¯ó‘d
-…Ëç~%Þ¡^ÆÃSÖõÑ–øW‡©Í‘6Ûç[|¯Wjú›v­ÙJµ[ …jãn– ëMLëýÇÕ¶ IªÊûM-åV•j$îEÿw|NGÿOÁïXËÓJ}uƤÚ'fZ2­Ôiœ1ÂåÈY¢Ü xÊe¥.zÛ©m¶Io[5Ð0‘‘„Aæ!<×û¨÷ɵ-s÷j©Û%ªRÕc\ÍxN²2m^‘
-E…òIMUÊLk–®¬Wb‡8 1™ü
-
-Çít4ÕÑ&á½` ŸÕ_ñƒü} ðÍìkO+(ÔŸB¡·!5Ê-(ýΰžuBQ@M[„©2ýçU çq­Áíï oŸG/}õ‰~YO&RãBålXWžÒ¶s6N框`«*î&÷Ú á•µž_᫪7=ÄÒÿ
-uøvN1ù®ÀZ´Öê~'Ú.³4½Å³]¹£n\½0lª}|5vFˆ¹lÓo¿sàã|iâ-8a¶ÎãÅ<÷$ƒÙ©²ÚM­9l­O¸›»¶]§²ÁM‚ù7”É6Ua,úÿÀ÷ùÂœá?vö€ìê໾埬êwÖåk´ endstream endobj 71 0 obj <</Length 65536>>stream
-^Ë*“¹†ûMé|“Oâ~5¨v¶†þÔ;Z÷¼Ïbc-Ö÷çØ=èÅéôJŽæN­Løc0Ýìl²ày`Ök„©—Üp۲Üo׬½¼¬Z¶)þ
-Èã+ ä_Cïéd;çäî©ÔåT[N\eЉf"­‡ïAg57ÚÚ+=÷Ø5Ìéh»M^Æ7w>
-bÖªjö»uRön”JÖÌsœY¬ØÁåÁ–ÉÈüÁò÷ñÃ_BsÔ¶çÙÿ|ç[~'†^uÀÔ</vüñ¶åw4ìö郸ÁÙmµAâ%i ¹Af¡OžÞ³¸>I&íÁ8#†£‘¡'V¯¼_˜Åõp=¨,Ç—~-Ø~z/S*õkçKµ÷êÞK½—‚1_äÿ€h¿¾J›
-ŸbVq$¶5a«ôšDÑÐe°¶Ô=Óv”S®íw/ùQÔ-»™¬RðñªR‘‚ÒïWèÿÐ'!K蓲ß%©]fG«f?ìÅ©S~te˜ÇüäÎÌpwTrqðJŽ¨‡÷UÚŠTÉfϪ­T®u+’2 .Ó­^ú¬¶uÜ©ªqèõ»×\uܯ©¥< ÇDæõÝG~ ¶S+?
-q%Mÿ€ò»šTáü]ØùÓ¬þº#MõÞ¯~d[»ñA~fVÛ2{ºBo™÷S †Äñé ‹òãŽ8/è¢:p®~­'6S ù–ÊÌwr·j5tyvF‡íEH,¤Õ©º—Ðâ H>r®µa§/µùWþøAþÛYè•*+@¾äÐ[Œxæž<È×Þ£×>-R##ÌWìY
-Wîu‘츧m¡íùª”#ÓÍVß<t›eze
-lñ0o86²opâôÃüopÈIjLÖS¾1™ÿ‰ä'
-¡²ÿŽŽ{Ý•×5›ssø¯¼m&©ÂºXIÿùéo„¢[”…+×–”7bAê3ëjË®µx!YRã Z#³ËX<zøL9¥€®êáëz¥~­'­ä¯O÷-ÁeØr*ªWo+¢]µÛíÁReÑ«ÿ?ÀÌ7<¬ª#æ±êÈÌ<9³5^==Û=hÕhyêf÷¨­“Í»Xº]_ÍúÛ‚-†Ñl1trq~êÔíTù~Éϳ¿¿ñ+U»•8ÈN*ž[–“–J¿•>Çå»´ìßñ’X,” Êå_ñƒü)æ§I¹à´¦AaT
-ƒì¯ì­]gE¡»ä¥Mí‰6ô0ÕXh5–ÒVäºÖ®Gi•-%k£âHÚ ìv[£’Hã¢\H¦…Í0YˆÇmÅèõh?ºÇ0_HO´%¯tIÊVRiŠÍr¤c°’ËëõäOñï
-p­¨@Ìa¨Ïæn
-6ÀŽµnPkrXŠMônQPë‘èŠø΃E'u ªm÷“î¦n½(1±ž ïãRË=ª2gþ;
- ×I(D ^=BŒžgºüüAžE>Ÿ‰‡­4—xé1ÆÈƃòêëÝëÒkú‘¢¼S¡YwöÏÒÆ
-çÙ~oçýß°åÊ—ܯ½l^;@·ß†y@æÊòw†õ*qdSGAîár ­Èê3šeíøVݯËðpõ*×;oáàÖd£ìÕã}òšÕüÊEvB1RF™á™.|3½Pž< Sl¸í¤·½M.¨ë|ªÙùwÀ^‰Â»oÍa¯ÌÃfcSßu.%@ZzÑÇ$hG!ñÍ''r-¾ŸžçHæí³¹·Lc²¹¬Ô1RWîõl(âë4Èç3Çr˜ÎØ
-Sò`´ÅV5smi#(Òeu$ï•i 㻶íÿuâ F
-v´roe
-]ÖRßÁe@¡Pr}(g}Yi‹'{š½/ª†tËÞ½KŽÍØç~Zt#Û[í_‹Úî èã¸óîëÛ6XOÀf»tÐMî×ô§®úÃiU÷^d"/ßõH\¬r¿@Ævýße#Ø5GPæQýî”GÆw :¡
-åe4@Å#/)V·øÉÈÈ}Ù Š×®õ¢¼éﺷ:Esç·“-!1ó …ÇApîÛ;ÿÚT¢Õ£.¿V5kˆzÓGª¶lnØ¿òÉÑÝ
-‰Ë.^_ŸãÌj‘j`‹m¿s ÝZÞ‰çÝâøÓØÀà§ÃñC ZV~,uW"ßïdÒ›îŠñ¦¦qoúÙç!
-€[](´¥€BœЪO|°†/×ë\÷BF?ßáx— SޔΫOŒ½Ú.LÍFµyvò.¬0;0cj¨_s´i¹ÃR?>çëÆÇ™}wËòÉvGƒCäªy­™rÌŽªžÉÓª×rj˜é`Q"ÿè<Í È-Æk@IáÐÛˆLö,<DµÔúA.ƒeÔ9¾ce°3žä<x§¥'o¶w7r´—“”äϸ]1‘áuqs89åúS©Æ^u]Ö±fƒSu•”}Ó»åRfÒ±íö¶[VÖDך#¹n´-B£0 ùÿ
-Žd׌ÑiS˜Ó*ëõäum£yTØRxéEáÙ–Ñý[ %m1a#/Ü: Ûˆµzûᓾfònááó øäÝFPã«6êļôï
-À^aš¸ZDbãåÖè“ö9hØŒzîšIöcõÖslªíÚJ©L8@ãSoéwјӠyy]a¼<äÓà\çç»w—OÓ•'M½ ‡tÇ'¹bó\§Åy9ûƒäïã
-Ö“ÿÑ
-Á#ª^â:·YßÕcã©“sfZ;¨ëS­GõˆZþøæjùiQúwì¥çT
-âý¢±Tå¸>‹—Ÿtò–8*G‹¹ÕPÇ O°IV/É´}¥1 ˜Ú©U¥#sh´nµ®Ô¬/KšÐ8ÕíFëZó~µµå6r;∭öªë¤ƒÔŽ“¨Xc’ÿý _eËéѸzóÓÛª-ï2U»S,üä'þ`Srå¶à–g·\ov^iX¹Ìëƒök·3Žv¤ÆÖæÖÍ,±¸­“÷XºÙ¦Ã‰ÆRÖó¼¯*UnÓõÐàH©NÝE½Æ¼‹µŠË–>.¡ˆaT‰ƒT8"‡•“P.–]})”…<Õ‡ØÿO–íâìA\òãMµIÿ ÖxüÊ÷6ËwU·HËUÏíLV0r!FæȃòˆucÙÞìytßê¡)<j}–¬Å#éêmã•xõ¦*–.•]©—>‡¼T™Ú÷ÓýΨ(—=ï)lƧ° Ô³75] üwÀC@Ž×G„°ØuïE&§UÏÖÍÌßšt4¨n«[ÝÆg•Óy4 úß»JC6rŠ“ªÝL»9,˱
-J"=ÙýÁèXD¯£KA©Žb&t&†K4ßo†y:ZÅ,]ÆP‘ºmëe«¦M±äjþü ÿ81i§ß˜eψ±SCDájtFV¤,–®lERƒ"î^…:u™”ÙRRªV1†í´s¥ÌÑ ›!×fÂI¡›?ºY-_H¥z?m‰À¢nÁªÀŸ3ÒÑžË\rJmrB;ËQáAdböû΀ÀQ0Ìÿ;
-Ðú]å }™7€!1<JJe€F³.@·¤ Сq¨úH´Zd
-Æ-É]:·Ù~+ÿ
-€v8x×pÑ„M‰Î¡ÆÅàÍü àó5Œòwù&À† pí´8[N
-
-OÂý¥óâûE]øwv:5/ÅQ'ÕyØTjpwP0¹~ÆÁäâwa´±+½³._»gÛÉ¿ SY‡÷ÜÿfÛ €oÓ@ÈÁA­øóŸ<çìB?¢ëe
-TóLg@NœV@ÎÈ*ò bsNÂõy1QxBO*<Ö^åþ‚qÊ ÜÚӛ𬮮Ë7^üC]ÐäöŠ”Ü=‡=¶rbö¢|¸ÞÞ¹ùf˜(ú6¨¦¤ŠÎùMn3¬ÿŠ?oú:ÀôdpwåÂDßÁ߉Ëw9Qd9\&Æ8¾<‡¬‘~<©tþÞ¸wÙ[†ÈH—5gk‘:¡­³Q:9§B
-u@n¾ß%%ë³|ŽöñÁ/RÉMʵ°‹2r çc3˯7©µ wpžhÆÎÛׇÛ`FL7[-ñÖ{9×ô½ƒŒMúÇ_Ýß½¶7=Ö…åPÜb•ŠJ?ÈBò6…_Ч¥<W…=PNC¡vêÈî‰
-€-£Þ_9œÜu¿T>L
-m ‹vJµ5É«ÖW?H¬¯™‹Ò)ÙIè·ìD9ð+
-‘>åTINf½4¯Z½CMýz';L×)GsY‰-pÙZ!ÿ+®ÝØéì¥i§¹¾)a•µKüü<L„©ëF0ÞŸàª?ŠÜÃÖrº‹gß×Riýh4Iµz\—;Ÿ^½)£v¬HÔ¨?h™€4««œ×HÏÿÁÏtÓ)µ‹t½ûT¹ZÈïõšNè«šž’Ó5í~Ìÿ 5í€VþÇgÃknæ̯D-©Î±<mxvœ sÂõªŽÙ$´CO­Ä7í2…Ï9èÕ)ioÇåD,¼}¡y÷E˜ªú 1ïéSÞ³”Œõ#‡#ËW$¶HÍ0R%öô%v°Žm¶¨ìnl±YGª—ƒY¨^VfñWÀÑ…z8×WŸÑ±4?µ±¼ó>Íó¶îHóÕ«±ýµMy“wêÄàÎÝt¼½·µvˆ¦ ÍÉÂ!L,62¤Àñh]–9Bºæ)víˆØ^1CøDfKvWo5©V×z©w#©R¿·ìJý‘?—“Þ,±F…ŸãÒ‚®ÝIçÝ‘r6½r&ß0sFø|Õ5›áf?H÷3Ý/dã‰9_Ãf<íž!ÃÜy_‰§ä·™:u›5æ9̳?®Vo‹¹P‰ýy§ÂaÛ~ÙUŸÓÒç˜[—–}åZ ÛtÑ¥hK(Êlköý~Ÿ5½_±Ç÷Ü”/’¨M) t0g3YýpX"J"òJGN_u©Ÿ/é­jö!­ y9‡Mêáà4¯õ«sŸ-cûÓ›–Žå¯e!ë¾4*ŸRæ\‡—/µé‚¶+L8µê½3òÇ%îäû¢´Î²Ó3­‘DýÓçàû&ÑÖ„^fà׽Lj©®p. m8V[·W„Լʣa±V× 0³ê±Ê¦ºr².©ÐÞ3½¢ß¿
-›a8*pÊPÉržï KŸŽ<GÝÖËó7K_¤£ƒl.9˜œkê\N(ù2ñ¹}LâsG‡¿ÂÞ•ùÏ 9΀žï&¯Î²%?ÅóÐH ‰›Oó2¾ÈÖ© •ýö±—TQÁJŸ+Ể,(å€a¨× DGËZ™.g+,Åâ8G:"ä’#"ŸèÕ%ÄòKÇýIzˆ£ 9á ¡÷}á.ÍŸ¨ÞN#(¦±Ÿ¿Šÿ€ãÈNÆ
-@ZØ
-6 Œ¦óºB‚¥ *ßÜEÈ^<Øf×” !® âÈÞ¸4„CBD%½gjÿ7ؤÃË¿â?2óî7Óû'o‹;PhÝA´
-CâÔŽ9²‘<
-ÐQ­PmÐhukJ],€f³Sa §%ëÁ¼vvŽ~4ŸG…Öò¸:tçQÅ°ö}b=[·™çñ×b°¿ j
-è7uà›z䪵ì•ô P½lêyO¥°[Ðç‰hp¾2‡ù!®ïr‹½¼.çw½Õ Dö¹=§?ÈœÔ*ËÙ@Ymœ»YÚO8gS¤|·ðn ³Â.R0"ΛL
-•IË—š£ÝÚìXÅ­«jnÎüAzÍÎÀÖ;õ÷TÝK½…R°©uç^HN²sˆžmAÙg¥å*[”²ŒÝ‘–ñcÓžà)sVB¾ú7@So@™×¦½¥›ÚÙÇç†VÃuð4¶ÇÝs°©°ôØoöÀz©v‡w·üG˜> ¶¢âu+Ò«­A}¢tz-ýnèÝ*oª½Ünܽ6Z³N­ÿYµßäq/yÿ.v$Ú~k»L‹Ì)RK.|1xîc Éc/Iªa÷_m¨gÀ®i8çè€I{i:loUh¶ì°¢øÍCÓðð½:ŸOäé™ò®öw4j×Ê`Š}øžhq¢žÃçŠÊ
-™%gw{@ÀQ_»JÃh¿#óÛªØS¼¹¦tÕVžUrÑñRëm[ g±ù<›÷ú>+8÷)ÙÖÃ
-/†Ã&'Ÿ†J]¹ÍÚ¾,Ø·ß±…]îY½hÃ\µüLÁ(©râiånöN•{ãTî¥3ø›Áž*zí-Mºe½‰N¤ÃZùV¶ïõoY½·Š)u’­èÝæá5’ññh*žEf­²rÍì>Y^ø•$ÇܺÛI×w¶JÖÓN±–x¶”ÈÕQ?T—ç¼R¯ÒayæëÏrC¾çJŸ¢Õ,-nm·´¯ÇÒÂ#ÿÀò÷ñ*ƒÑ9×Ò+Ù‰Ô›¥‡æ™JõÅ‹ùÖLxwßsSt¦I̹ÚoUãd$iwÊûŠìqÄ™ÞÔŽvêÈFÎóV½Í/¯J¼:§+z…÷¥,ä®…ïæSõR&ÊËE¹Ü±
-›ñtQPê©cHä7ºw†Ñ›KÑ[ÌôWÌ™°’qR«ágh Ÿ­”žêUß<NæÈÆRŸvÙ–]åê‚:ñ¼L ZõpÀwkLœÖª7÷:¨8ÒjTv»§´ÔÍEÑtý"zÕ·όÎõâ|¿i¥éhåStMjÔmÛèR¶:ý™¡ú^‘ñQŠ ™_á+ σë/6™X½ÒÖ]n'÷kk¸öP\åeü€×õB›`­z†ªÄË)»çϺ
-”R+¢—2W ¹&C½€˜g>—]ÎnUÊîìd¼;Ù¹ä¸wsBá¹&ÄjêŒû p™›æpÜ«ØfQ!úúÃò§§Ã³¿l¢wõr.r;:]šöq½ãÛ‹ôµ®3‹ˆ-½ê·
-—‰î¥¥Ú¿Ѩ3á8•äûüþM—3ÃÅbÝ É‘ 4'0 N,-ŠÄýqzK}eʘÒ@ëh¸¤D”ÎÖ5¤ßÑFH_/³–ö:d-³eÚLÿ
-EÞ5E‹ß¬í°ô³ªì
-þ?ÆÎtIY^kÃGÐ!£â<ÏŠ€"¨€"((‚ DÏÿ‹Ï»k¿UOõ®úþ\¤»i¹I²’µ–!`›0‘–ÆœO
-`R\ŒO
-ð
-ÀÇÍÀÛ, a ‰uódèÌS‡˜ÚÁk¶ä?ÑBY¦Ã¥¶,<CjY|6åIî7;Ôc‹7Óm¡Ÿù °ÅËß5½ÿI‡VY@¼L £úò1
-{ò}\:Mà5ó¢W~Ã*Š{gÃé3ûŒy¨o“» <Qsã}Ì÷¸%È‹œ)‰lõðp–½C#ïÍöª8µŒäÛa—âÞF?µFŸ:¼ô½¼z|cä?‡¿
-Pïý÷»¤l<öÃd¹»Þ\ìî^_Ë¢çF|*>Òl RÉ80»æîœÆ[ïÄLÔçäÄ*êu¼{}R^£¾»[ÆÆ’œòä"^s£p4²¨ô·Eaum2?ø¢bH‡E q¾X*žÿÀYnÿ@6Pè)3T‘A¶ãYÉ|Û¾>‡tí”îôá’Š³ -ÿi­toô«9h•™F¿ºõ•m[ É@é f½gSüjìoÄ%5ì+âõžÖÁ!¶…uïâÏÕ¦ŸÌ-—õRÛþ,¹m®z‘+4öŒ÷ÅyþuOÿFâÿ-ÃIhøݾº…²
-È.žV˜°µý}ú8èž|I6ÎÄh›§r˺Àêò1ÆóTF».ÊåÍêÄ4”nZ묥üp•nîiÆ7gb ¼—ß5½óÃfþê­Ì™sWÞxpåM’oëmÎ"X•ß$gÖ¯×/ì/N¿;?€6Ôba×lªQ¨ÅߌSûÁ¯›iu~Aä†d_„—n)©þe¿7•dçv÷ø¶Ú¿ç”d_¬Êè@h­2Ô³'Í+zqŸ œ _¶Â¼3å”Y*®èœµ&lÖ^dS—k ÓYΩMÝ}zýƒ³ö-â&¦yùâOéøà
-½¬øWm*
-ÞƒYvÝ}¹Ö?ŸëMÚž›£©¥$ÙåžÖõÃn>J‚M8©¥/‰äÊ^yÉë“•Å33kΓ۽;sš'ä"ËrgGøîxÐ^+“{8ÝÀ¿ÐñSKè­R*Ð[µ>+Îh?Y%ywòh5N“G±dýƒ ²:;O½ö%ñ²-'ÄÝ“¯]¾ßWÖÝóð`ðú\w„ÁnûèšµËa¯5S("Ë‚*P‹÷JsàÕj³rnsvu0`ó“„a$u=›4²Ãœª»ÑgßpFèq Mä†cêÁŽŒMyÿƒÓ½¡çÐ …èä¬ß
-ÇZÕ1ƒâ©<#ʇOn]4(„Ìi°³~Ÿß/ž-W_ìêÒ²6bXÁB¿O3òá¼X+#ÌszLOÚÛn6¢¤6"³ëöÀ9é¾0ªÎzR·¡vXÃꨓõ£8)â3é´©û¶Ù ûï®ÛûÓÇß¾&Óîµ%JöŒB f¬¯óÆ4(Mz,ÒêîݤÖY.¯ŠÊh(FÍÂBúŽ?™3+NÖwFi“É>Ö›[”Æ×-jx.åAa~jõî”4膸Äw6Ž ·wÖÚl#éàÞñ=²5’¦µ¿”µ6‚ìÏí~ß=µû5Ëú Á¯U~p‡HˆÜ±¶0ó{¢úLkÁcB¨»Ýû»O!¤F…¦½ S›[¨8áùC}ÅV‡Á~С;ÆRà1švwïÁuÓÅûR=“ëÕ“¤ÖIäk¯ýÙl]?àhÙ"¶¨Ùd>ƒ{3ã|2 g³ÍÌa¯73*vn2WòÔdÌÔñ7\¶6“?-Nî€ÜRé]ñÑÁÔ]íZsÔ %F«[}Æûœ?]çØûìÑcbÞä&ÈJRè4K†3ÿuíßó›gO>O>ÝŽÐ";ýe«ÜÍëÖDjMš¬Ì¬³ãöÐ(LÓúâ¹…¾Khñõ…YÒê U8Õ‚
-åÉ0/ôèi½7
-}Rê?Ž·mOåÝS·WÞû?x…n\›
- ô–*ôaŠŽ" Å\²^J)a›—FëCnͨn6r®Q¶] *ñ…¥‰šêU[Ræó<˜C%â7(X7¥Z‡
-™©gäfÖréL³ìôT6·o3DëܼJÛGý±íFµ6úyU>öõ]6ç{´4­Îˆb.îd
-ÅO!›¯bx1× ãJ¶õë”6¿w2†tfÐgȦ‰8–Èi¯°ûÁ gϺ?ò‚§;‘'6uüzzð«MMƒtÏUnsB_§MdçŒÎqúÜk×2û¦;Á”úº¬«Ú˜4*¨{³JÓÊÎbÅÜ«sÊzÚÉ­éðšmSÛ+Õ+ÌýÌ°2¸¥ÇÊ“<m*1áè™7Á ü«Ù¦ð9,aÕ츅®çêQ%S@à¥v©$¤Ï)M9<!üø~ðË
- B6Ž
-°C¹ùOßÝÆÒËßõÉé“ðq¸3xœWs
-egM@”žP¨7žÂØ>‘¿;cÀ`ovy
-®ÓÍŽíß
-jðGf¶‘6åÄÖ9k›«sœo<j¹Û,(`m5 ÆÈ›EŸ‚¿`KÚo€æ³«CË)µÿ“¾k)ÔXÓc¯=²Ÿ;~~¼±ôÕöj™Ràì‰BlgÞCôXÔ¼¼YïÖªûíøÜþÁ Žô‘Vgwé|"hÔÛYoguGß,Hí¨.³†¯<ék¢4ì|VÞ 'ZÞ ¶²¼1:yãŒvrÜÝüÁæ7
-ÞË÷ð
-úôXÚm{vV[ŽîËŽˆVLUøH—.‚‹eA¡~p!DZÅùFüÔg}Ììò˜.M8R˜
-,Åò›i~®ÚŒpCc¦´ŒÓü1;›º²'³lŸZ±¶Ý^þ@&È’þݪŽÊ?ø5ļcs›7’Òñ¶qJf§­u ë$Ì4ouS7 ¥`ÊŸç®Nôõ!] D¬Ôψ °rÞIÐ<È«en¢[,«¶GÓB–ä˜2AÉ“Õ0ð±<ÓžãfQª~ûü“¸“™Eì­¿ù’~àÇ-™gÁ¬ãçÝw˜¡Î™O;Þ&ëœ熹ý!ÛnèY9Ïlkã…ôƒ+;14ÖãwF®½5·*d$¨mù=ûÌ‹8O§ —)O‹Ó‹Yj0b?ÕŸÔ|—7oIw<°é•ámÔV‹t—Y:öš«±²^.'õŠ-ýÁþoù ñÍW›¶½;*fúxMŸKÈXÍz›: ÒÔ¹®]Ö*éýPÝö›‚ŒóÛÍÒPK\ŽÆaS>fûì(áÉÊ#Å:Öú»ƒn ­æ&éU«·Ko?ûÉh°Ù,†´nï†Ä° N8–Ò—úd„®åÈ(7¥ÑgÊ¿ÚÔ¸“#$ÙÖˆ´í¬¿W±ž«*yèk.®Ÿ}D«lš¹MËìtdÙ·àdñ~ºî…m¥tžÈ}ÀÙI!d ù#`nú›4n© fnq´ÏìZCóµ ¦úRè;‘­õó
-zJ½ëû–îç§èx@Ѿ4°sååä:âo
-/î:q3låê5™Öe ãýñÀ­ £S:V†9á°ïÙ¹Ó[Z·nk–‹;]†ÄÛž*¶è Õj2\{Ú8_×J#Wú8\'"¹ÌyÔÈ¥jb#ûü‹¿ðƒÿ984£â–œKÁ.)’`»ºÍ^
-V¹?—‹Uë&¼]õÊóù¼Ç¼æV0ÙMo`<*â9š|f¡“\Ž'ý›z^ô䚢vÛ wèôSÌ¥=Œ»Öøó]©Òd±1Õ˜¥¥FÝãœI½äeäÚ²,žkË®˜®-©þzˆò¼V•wb­:“¿áÜIt?’‡­Ò^¾c?—ôÿ(„³Xîú<3/zæГ#~Îf4­9ѯsb¹›´·ýΧ¯³m“P¾Û¼)»¦SX×ÊÊo×z\¯lNDmõþT«ߥ«-o»¬$báTѺaª¢Q·Á^éò³ò§U’ÊŸ"%þ†ÃNÛ!šon^ÊgëßWù{ jÜK—¶ƒ²5:§·fMŠNo“®½»½hé`»n¹eÓõ¬±Yµ2j,š®¾ì¥ÚÓì`ßìZÕN™ó+;]OÊ{Ó!Ë£I±^²î+¦”®‡JñŒ-¯Å3¾)Y ÙÞp^d«½Ùoøn*çƪ†‡÷ÿ®û‹Îs 5šž=RÚeuÎè)®¹éŒ.—g;|RÍ‹ûI7ü
-‡Ž1ºÛ˜W~ðÖÔÂäF 3úºÛzÕÚXñSùœ1¬‚^STé$yù¢#Û•Âu»oäCnç«Øf˜k¤e&«r{ÒKÉ|n/33¬WoiS]"éq'UIož&Oz²þ®P5Ž9u±ß°>y´¿ˆ«k—ç¢Û4Îë´Ñù0=¹™¯Í5¥µW*;u(›³§]šVöN1÷Z\ Å7{ËWÑ~øƒg#;û¢÷d>þý“V"<=nyÚ<Š„£?ê?Ì ð«5àñRZßb“ý®Z]Lšá9¬Z˜´Ð‡o3¿A”5 ¶ ï Þi¦Èa8pûŽÑ* áÐ*» ¿&ùúAÌ;f™[Óu9«N …êåƒM½«Û4M52Ú:Á÷Û~=4l\ ‡WLš¶oèþ~p$òG©”¶î©^cWMõšyB[¥z­œ±ºA„ïß
-¼—<³‡Ðá™ùðÐB!(NcØ©ˆl;!`ôgšù•ëîô¨8ÜX¡hMöaeÒ1ÂÊbd<å¦þƒ»¿
-áV4}E¾˜ÿ€=C(Óî@™‚Uäp:üæÇœD
-ýÒ1÷)4­âõÝ7+ö9¬ÂË|¯‡•‘TÏšÑù']ð»ŽR]tGÏâ¶v"f¬Æ$OQË/AË€Ôì ö_üàÿ–¡å Pa…òÕŒ–“ïN‚B|M1ëgÒ–V7ƱVžx-kn·2°ìcM»/©Rd•ÓçÔá)péý) ÍÿÔtÃytuôuCŒ¸›¼6͙˭#»mÎNÎ!×z©•ÕÊ›ªÕJz®V™æLyVj¬òìv˜ß
-½ô,Ê?Yˆy^ˆ s¸‡Îß
-Š–G˜P™Åo¾ çaÊ#@]qtÿsä4À¸ÃãÝâÑéŽæ7ävªÏTjð¾£%jaçlTî´·"¼ªvEœý£‘²Ï 9kvÊTž2µGýÆŽ›‡ô¶ìw%n›ŠŒ%}5É[GÉ­×\Q8…Á¢ÚTÂyô ?³ÄªüGÏCŒGUªÅKŠf3óÒbÊëÃ4·¼§ÎdUg3qgÄžöò#)»ÿ
-·µJÆ
-u´æ-ãÎ|&à,;ˆX¶¥~¦³ê2Ã,
-‹Êd™YôÆ2&sôkòÚÒmG¸Ñ/éZËãCRCßýÉ’/t õgþ x¸>«ÛÏù˜K’c€/³MQÑëì;LÀ¶zú®½f2͵ySé%ßKÍD©¼\ JòÞÎ>…Õ?u›cJ‘Çf/Æ“ñ{ãd²Œ›ÄX~Ô`ëÓ¯ÖíÎf„ävÊpïõüÒ”
-#¡»tgwèÑ[òÞ¥ãñûo
-u››Ýµr/ôÔŽ3¿É£·”Z±`ZÊÙâ²<ž§
-xIÏSŽD÷¦ùÐïVC|Ø‘[#±Ó
-˼/<ÚÛžä•Ìncõ}.OH…í‹ ­á¼PlŽ¥~·IV]¡q
-§ÇÆT’“…6›$6è5‰W«ýÜ~·ŽeúÚ_/h/ÚâV¸)ïsYñµ“½xR‡ÙDhjÓUw«1
-º“n%Œ‘W.=bjIe˜M‚nß—IoÕ•„nóÕ^w:ï†ÞîG%»5Õ[s6> 6™äê—ÞÖX½p g5Ÿ6Íš?Ò5¿ÜmÔü4שyoºõàhiÆí™ífjÿ®Æ¾î­§äÇåTÕšãõ¥ÁVðãflt*›UL h•ü²å eþîW{B¦×­«á»6ž´±ôPh‘¹¡Ú¤JC³‘¯¯ua.Å5I²2ÕGˆ5«ëƒ:«6Æ-«ÚètÉJt?6*‘~éTÔú¶õ?ø¿å?°Ä8Öm}óÜ„û0‰MΕªÚô4­v{VœÝ·cc’Yó’´î¾>¤ÜÑóU£ƒl´ =zGŸÖq˜Ï5Ï“R­™½ûB4œÂÛ¼T[õ­Œs%>9ÏJ·–'ÊïPm”­[FÉã¡Œ¼/DéÀ§«¥C£Ù-,¤õ kq‹¶+êÈf¾u‘¤€ÿ>e3Ò­+ʱ666ueàMÇbws¿-Z ;“š<—·×ëÐo”Ú¨WûYkÌÝBU ž
-¨¥•M²åá©$•,j¸+‘²æ§q©Ó4W˜QW8ZòZÊ{jÿ–÷&Ù|Þ+³Í¼pî·~ƒVÞeoÊ`=¸,K´j Hùf²âÙ ««à+uôœÌ799fêµ¢¥Õd@Ú?xu›-½X}Um‚–ñý„*¥}¶Tä*‹Fa>\öó¾µ™ä+eOÌ­Ö©m6†n¶51b*©4
-Tw­õ3ŸÑ@ÎD'ÊèIœÏèv¹‘ôÓÿàÿ·¬|2óëòžÎB,6@²úx¸h©ƒr•_v«<kÌýó¤Úî䆕Á~£— ߶K™ÇþR̽ö÷‚б^ß'ùAn=VЬʊi*¹(x•O°ªf†Õm;=nê4yÚ† ’J•w„½Y‚§Ë(„[ǯvƒÅ¯g„?øÕAÑ¿°âÙ‡#ìŽ)‹+ökÆx¸l婺†ãØÁÜÌëRFWzì£_<ÑI᪮ļÔçäÜšl²ê´¾£´YnŸ–#3=®_OäI½ºd\}‚ï?BüzH>x‰$ILb«Et=¶‘(0X¤]#6?x* W—”¦"ïT¯ÍåS½>€(ÿ¢Ó̹ù²iŒ·”µ“Ò¦ÕP¯fLyxqúyÏz6rëщɶ3½Qæã‘tÚ\>™oÖZ±¦„£-Y"Ÿšñ¸0b,8N$ôátÖHä•ÕTrÏîR½zÙ‚Xú/‚ƒñl§zMAHõZÄB„m£)ˆ ú/à½| uU1€Ô¯@¸$ žÈ¤Q,ƒ”•©ƒT§>
-±ªA„ðt1;ùÿ ¨er‡€2"”¹®—
-/ÃÅg³dÈ49x/X¦Àþ‹Øtðé_€Ui¢
-@5¼ÐiPJVò|ž
- dž‡¥“üº’ 8&‡+Ñ2ÛÉä|GÔÂ-˜¸÷ÄÏvá,⽤Üeɵˮ<.5—Ý:¤Êœw°KœSZ{mRcýd´ËiBdÞGÊåËV>6»æ‚ F‡ÛÃì–†ÑýÁµáºýEë/
-GöÖ¬K)îXp¡ÍÅ!æw_jlÓ؇Ù}`Äd!mtv»†®g_QÜŽŽníݶ»ÃÜû°*u(ÓN§¿«Ó…ey¬ñ]m;HؼʄMjCß±ë}ìÏš¿4tCrRÙüÖ&{ëèLfWkÕž¦hãà°Ú'ø^ÙY#~\ËF7méú$êpäãw4FÀY;N––>Ç`Ë5ÄâæâÅíÍ%N·7ó#ÞØÌýl}S‘ê_
-«MÎÃèž½uî‡ô¥îfŸº»¹¡?vÆ©'{„}[2oýp{X·GÌEÿ<rwõÐdGƒ¢1¡—Ù:E¯´ÍMo­ÍÜ#5 ȹZ™ö¶ÊÊu<9*òiY%‰š¬¶é¦Ü&µ/`Ä'·KLù/
-ë3Ëñ¡[•¦Z«+:OŽýÁE:â‹k²-¼¶œ]x¬"æ½jYÌ¿ÚÅ/òšO
-&Dt»àDMèðZß<žÎÇäzë=OùÌ ˜ëÕ™2>—Aí›O^GƒíN7êµPÂíN‘·ùþn݇òW#%t—“éñ&±£m,º[_xk5·(yfC¨Þƒñü¹î®ç¹Í›øœËŠ\ž‡ˆ]œ‡Y/?kߜҟÿ
-<’ëÚ<Òè"|ßMy½Ú)ðom–ÿ"û`×,`€\y¹[ú°Š.jZ  ½˜0p9ññþbÝÖ#÷°á
-w{~Í]Ÿò›%Z­+ªkÖƺƬÛŸKNK\Šs·¢.ÄÍÇV«‡=WÇŸmYóÅë­ Êzû<‡Ë^‹$%è]°iíz`ÓöýÃ2Cž=Zqž#
-ÙGÏjÙ¿
-‘Êûßãºïg_Ï^Ÿgÿó-«_ÓÔÌüŒ †Zf{ç5Éxµê€ñ@Ec{Q f«ÀIŸÇÐ_<Ò
-–^&Õlx(>¡ëfÆ÷=gÓÎœ–Ã~{óƒXÖk¸œHˆ;÷;‡íhÌmoÃÈžA´¼Ô{ÚÆ äàYd¥Éè&‰o÷:í™Ý¬…-øܸºå
-ƒÒ•-+Õ˜©õé=Ú™º©”úÔ£ômKŽp–P­ÀÔ¤IžlßÜ‘Ã;9Ceã¶ÓýëÕýP”gŸö«Ã|’‚î«;n- ¿‚ú,[²‡Ô?÷×5<Rð îU9\“å±Ícbä'”`kÛn·‹ö{¼”euNI0‹­ÌÐ5S7nõшꌔ´³IN«‘Ôà3i]  •µ"Õá†è—Ü/~°W£Ã¡Wñ7³Éüêˆ\㲸u…ý̶,ÇìùWK'0Oï¯ÃÑT“‹Mï/|¥©š‰ôÊ+¨HùªyÜ:üNŸ3œÚîKì Î˜†W2il‚£Oá.r$©]ãE°ãkxáÝ]£‡w÷Þ]¾>¸{ã D¦®¡_ò¿ðHêîôwè»%]튱;Yѧ°›HÏ–=ºGÒ´bÙå`Øš§¾æKŠÊ…ƒ¸¼ÕBä!~:£œ&ÍëìPL+Ïrt'ƒ)™kŒHª.Á¸ðÁï=oÂÂöÙjŸä¾ÒÖŠÚ©­>séÒ>•†…/hû”Qr¿8æoÌmCh¶¿R6èeúÜaÚM¬µá΋ÁÇ{›ªæ—…EiAî4el¾·0<®ÊO¶!M³ Ž=ËýõÎw›dZb)2“úRlh8ŠT'žÜÝ´ûš`׫—ÁÍj½u{äÖxº?´Æ—¶Æ„ShkV¾5ι_ì~ÚJFûÁâæÎN3ölÇ—\ÝÆwÖÒŠîÀqq¢vwòYdeT _$¥Ó³dëP±
-_ÉÏ°‘Ùq5KäfÕ.Ç8ÖQÃ*վค4¥cMG·V{ëzM«
-ª•,5¬ ‡öªRoý²±š#å_ÇK!K“ÅýQš(\ê@í|©Ör¿˜?«æyšËŸ¾ý±G»}‰,ÍìC›Bn=2!
-žéWlÛ/xs±&±º¨(lí`ôZ©ÔüàV®±yª4˜Õ­<>{ïÒ³úÊ–ðe¡T\év!íøûö‡?H!³¤t­Ü(â±h~gÁl^&_v^nì¢<ºŠ‘<ª¾r¿˜®­×Þ0”úz
-™ŒÜz‰¦ž/æÛåq¶Q-ØÓQÍ­KX¾ð~·ríµ‹ãp°]‘ÙÇQ%3Ö°L@KãCA Và´0u€oý'k;¿}s°4óhÛÑ’2àµø¦l¯€ô›c¦Ñ_$Y‹È¢“Ú)XS Ê“™ø3îäãOI¬Å©çÐq:ûôâTäÀ•?NÉõ&N)ÔôbÀ<G¥å8¥± GÆisÎnà=­ú`¬â+ß
-}rÜÁµ †šõ=-Ѧ±–LqŸüDï/¯_ü9æ¯`GA.çqØv>ºÚ .£ùæå¦îâóý´z•3—§ey<|Z"
-ÍÊ+NVCµa"ë\Ç86÷ôÈ«X‚~MÅÞðö"GƒðV·x©µîS¹ÊY³™ÎSu»]X…wn³·UÈ^O*5÷½í
-yª*½µ«O£/Ï_$¹Ü5ùs̯>lœO3ÞìË+ßÞ<ìöÌwKcµÑyk©‰änÞÊÁÁŒˆñÄ)«ÈxŸÉ– u´oj°‚ÿ ÃûªÎž,õßÊUëSîÕÔØÅÁV»“-ˆ'
-Êáþ†”R¯Éçè*ÈýÅ~-{µÕC)Y w¢f±×—ðIŽH>w·DƒãrÁŽ­ã1×e×Û`³X®-¯0sø ¯ÛE.?ßZÉz5¯—‰sï¿Ì|¾™5ʾ“×^¬Í´Þƒ+ѧ—Ó¸îTQº¯÷äNw¦õÞFöÔ¾ÿƒH¾¨ÇRãàÅ»ÚeE³Â¬¤&Äݤ‘âE’¿>%?HÃ_üS5¥ZÁ?/á~’Kî&Ì–.ã?¦öA*õ`>²pdŽþ”…ûGSÊâC ï©~+¹a‡ª”ú±w­kŽ2m«¼K÷öMLPN•’&_PÄ”‚lD#b±Íâ‘0[Ï
-!–è.¸ŒÏB}ᅛїðÛîîñ‹¨öRóq=q†»Û Õ§³žcÂÒ?ûé²?N†ÖÔÅûSvR™ÛÛç8õõ›¿xq˜Ìöm,D5~?­¨ù.ÛúAzEºA*•rÊÉõü½'µ2ž!¶ããR ¡û±»$2!ÿYryž‡Ž8Ÿ]»ßŸeÚ_ùÏ©ùì2M!ì.Gƒû/Â(ë‡WŸß_¹i Úý–ut\Vh/ícÇ™Íïƒópº¢|Ù܉ÞØðfþzÔ8¯¼!~â¾fS ©ÙHïp–JJ_®6d½ýîHãºÇˆÓÒZæ¹…Þµ¡ÙœwÞ‹·ùìÀ(‰Ëw>Yvÿa¬²ì™ì!/ž9p}rÛJ3ürûŃ¹ÍÞLmöšŒmÖÑaá8ˆQX.k¨2µf<0w/µk Öô@´ä8_ˆw诮å@Ëe.ïžÊŒ³JÕÇP鮦Uñ)úmáÍ®é®Þ å>·õ…)hMå [‚gÓ—}=ÑMZï7FôÕ«™~ï2çÃëΖÐ,Ø—?‹¿Ü¶kî~Zŷî>A7î*cºöñœµçæ«>™ro¼o ±§w
-Þ`9'}¾ýY«ûñÅ땃I(U2•Ú'4'Ö½Üý` 0²èfk‚Ïž+ ´ÊxNmÌÔ`Á¥©z¡Ln—’Ïm­F>w¥ù\${Ê$œºÏN/Á/üþ'ûét¿™ZéÖˆÁôajóÓr¶4BÓTÌTF  ú.¥ˆZ~#{çÞp©è5ã(…}2ç…â[`6ÏL—·>OŒj\±%wØJ•f™z¡­Ð-¸9¢:(½"ɬp&–â:þAm×ðÏ)£â'Ú 4 ‰e˺±±¹ý›­xow¥»{7{[[ ›î¼Ó.&Ûê|lÔ“•:ÈT†lÏ«(¥ážeÛÃpV¾ûyWX¡É¹Û½„!öÜ„+ &ÌVµÌ4ppT1š (¼ÓHªÑl›^àݺ|ìlÇ»¨#µ‰J'!J'M¶ 1î€É½³Å­Û~¿ëÇž6Ó-²srÂj·0ô—3ƒÆEk|>±Æð-p= MyN"HKpà #dõn¿›3§ ¾`Ù;ö‚é& ô'ýhIê… (7ÛPbŸN»Cd5ϵÛZG
-³¶:6÷˜÷|¾°¥–±…IX­YßaÕÏäŽUÆ 4—¿ÙWv㣻²ÓÃòræ¶y1ì Z½Î@»=õ¾0ù(ŠQ‡XWŸW™qm¶¾TAËUôu: 6Õ™L«>Éøˆàµ .FåBç@5ís»F¶+'cu{`¶ŒçnÛ I4lN’è'7;ǾØìLDÐí­ìïÞܯhyûÅ¿bÇ•RÛæS4^O¬µ4špw2àöê 7T I´«s†;õæ
-±æ†!d/ü‚ïôšŽËÁ²s4ûNéuôÛòa¾gZ÷u\lµó…VsÖ£ùÆÛ3‡ ºÚ×ÕêæçëÙ¬Ë×3Wk][S¯[­{?µîqó_ü ΆCÏ‹1Bìf™ºáŒ«×ÒÏçX­H±&Q%Xà{×EÏ”r“Èqd ÜC¹Õ¡·­fAlÓ:‹ý&ÙßX„Èn˘¸6 FŽê.äÀ?Hî?ª51(ÕCKPªJx_TÎîUú¹g¶R9l™JÅÜ8åk6¾–‡Ö#(‡ÿËa8:ÌÒr°1K1´Æ«ÆT=ã´.Íß9½üq¢óô,;DîhÔ°t(4‡*ÔPö^¬ ˆg½RMªd¥–·{eÿ™å‘Iº€¥WnrŸ¨ô¨ð¹’yÝ4‹/:ÇgÓ,çê±°¬Î“tÛ?úé) ôƒ=<ôSÎ=ÐÕúqû…5_}¶æqÖZé%ý“š—Þ¤¥ñÇÇV¤-bMáûû¦‰µÎ×R#S)åª*¶†K–+FæÁçŒ)$I.0>,@˳…v¡ÐEa¯åå·³I”ÏÇg$w8´š¹Þx/æz¦<G¼lê#^Å+ }."UÅØ!ÕV"UèõüÅ2Ùõ¨Íÿ$çñK0äOÍH¡­uÊáJúh·¦nR­ 0^¨ÔÀ¥§huÒOòi„•ßí\îVÅœ:¥4ä‚H2ØMçpÐÜ®á¦y?Hv‚Ÿ«ÉÂâsmAñY”!¹Ì!&7
- :i :ňþ´€}8½ÿ2zL®v_Ê¥3yÖÉŽº…}]£çÙ†€—
-9¢ùžAûR“çT©Ü FH‘üO^ÊšiN= eäâìÚÈ÷)ØVtv¢˜Œ5xh9&DˆÁd °›@Luý I!¦£W!¯ ÿI®îf¨
-Eˆ¡PbèÊúxÓ˜+Ø£=î*5~@G+]éxÍ6Ý\x|»zÒ{ÕRG1ó(Ÿ>2¹ž¨¦Hm£p+ÿ)f;%'Řÿn¥Åƒ­´† €–Τ־ ˆihóò`
-fõ_ÄŸýþþ_îÿ²Ü
-¿H !áÍ>Á¿¯
-ºôÀ^Uqü©" úT©r̨zœmö:ïõcL¿s¹í¢k?*ÐÐôy•yþ¨>m7{‘6zŸ%côNtô÷¤ümY¢r·eCþ’dʵ ɨm?ɘí+XkLp€2ê+—d:ÍFE*@óÕ÷÷‘!)5¨‰­b¸‚Þù"õ|.ÝôU©«Èór3‹Ï:6«…Ás×[„GƒÊ”ŠÛÐïÖzìÜ#¼0}|q‰ä¯ÊÉC.çÊ,{Ñ®ƒ WVtò® üób¼s×$‹ª~’mÌîIVÎ|’,M’la†%™“ÇÆÝèÙ‹ŽÙÙðÕ·G³gƒW!Öv.÷ùH¸ß’‡
-Fâ7{benP´Dƒ.åT8 0_âbúzØÖ”k YžnyÞé™9¾ŽïÚ#s¤ŒÕç`‡jr`§\|ÈàíèI&•Ap’ ÐgþŸ_ýK_ \徿B¸(%Yßo½ Ûù êYæñB6âæ‡Ú-“ŠF€¼Ä…&âæZz’GÏ_V.^j…g¯Ç§çËœðU8.x©~¤a›:¬¤¨÷ƒìדáz'SK«ªA²ñ.Î{S«k¯µãÃÿˆqqK²×]ÀP$ð”ú¦ngÙv½bÔ‡Û¥p KwMjA>
-nhNÓ»íh}p¾üYü%Énw ¼ïý±a¹%HQÿ&o=ø]¢ÛPˆ Íøßù÷µ
-¥Ù3^1‹G¶L4öÛ^ŽØ)ï€ßjŸ@Ý £½¾¾5ö³uKÝ€ñ¾;¹œöN”ß{Ù»<VKï•®˜a½`;7³aì$-EKuÊÁ»ÎÏØ;œkOÿ6¯Ìvþ—ë¼²öü¿$0좜ø^‚´ð{4@`_ïóãü ‘Óå†èÐÁ»wKÇcjÝû
-ÿÅòl‹´çWæ•í±{½Ï·£CÁt—´2\å’­²Êwvf±1>á‹{~¼_ÃÑe¾´ôæK[¬Rñاw¡¯e;óPÍ5úI¯P¦³J9ß,ʵR¹!„ùƒˆ&S…ç´=꾪K=fŸN ¿ê¾)~%„>½L6]ºì¬» õä~qþòˆÇ5ïr³£Í½¯¬Í¤ø1ç$êËsiªXagêØÄ ´ÆXÙñôèZ{zËäÍu«¯úrÛ©ÇözJ£{W´2ö–‡ùBF2 8/šïKExÑ/¼w<ÿi<ú<7)/¸õ•;q¹Æ.aw³ÃåÛüA8Áf6Ü&?\óYÑr¿8¹;Óø|ž}gwÉŽ¬5‰æJŒ:úBôÞl®›ìøЯÔFz;‡áóaÑèCçh¡ŠŸùºWœKÇD©˜T Ýê wŸ!BN¹.Ê”ºLÇÁx¾±d9±½QÙýð1c ÷ÚÑÚæ›)GD“)¿Ùsš]¶ðìüaÅ*ÿ_Üòò\ùO™iÕÞuÁr!ycÚ%´¨Ï1£Û›fTùè­:œÞ¦X?¦¬¶.º}•ÇÅ«ôY_a{ #ROÄ[þ] ªëw—-XY¾ kNBµ{à úaΤ¡ÐWÖ™ÐõÙcCÝHP!´P£ŒOuHÝè›C×—°CãÊê~¿£²žÚ›Û¶V[g9Yø<š-úž‰‚®èp6WÀ5™#J5uw.=u„ËJ­ƒÒý^]ˆ³AºÊýÔåªë€
-æ‹“aùÃ)e¼6_£ý:CPwL)l01ÈiðØoŒ‰ù3®óKÚ'ÞôaH\ /+rz†þ oú¼mwÕ³]›ÈYv/šLçmâ6šf©·b ¡ÓÏÎJ¥ÞI›ä`5jÊ­ò³+¾nï°ø“®£m^¬®ö Ž)…Ñ…Õ`áÎ\(!¡ŽA¨Ù)“/¬Õ&b‚é´aŒðUxqñ,ѼuÖñ£ØYßÞžE§KÀv…sÒ@ì¿œ²Poýç3™ÄAèx¾ðSm6£Ã©n^+YïÈ­åݺšeDH–Ÿ
-4‰n·6y©53¸¢/[lå!¯½"Ÿèqƒ ¨i¹‘ó|"’^§H@B«…Ã
-Ãý Ñ5†í¬ÚE¥`çâ«€3©Š^ú¢],o/«_ìµBÆq“§`ÛªöZZ/«>ˆ#j8º±œ4€®$Õ«2XC`ƒ
-–Ks
-Ëç“gTŽhVM@*¤<€¯ùãK¸nN_Ù[)d[z´û™°™e&ýŠp†¬x¤@ä¡jº[ˆ´©Í_LIÃXEþ™“.¦XKæ:ÆR Dt:²^i’R=xTRºó‹gæÊ÷$Ÿ3ѺÊö±anxËrÖ¬YµÌ¬¨5¡wß Ê·8@¬ATÀÍ
-v¥2ðv¹B¼õÓ|ž¬½ÊùfÂ@4ܹCL †þêÿ7ukÔ
-ÿ™mûgZðü‰ ß{ÖÆÿæ˜ÉUó/ñ§EãCâO±²‹ÓI¸‰Sø°É>Äñýı%qÌwK€+Ç]pòÅ]kôƒ€ÅkÇBs \
-X¹ß}É?O1ÛKƒ8S.½ÞÝa)y#õv6’Æ¡˜\}õfƒÖ«DÙgßFúaCè:÷iØ=ÝÞ8è´Q»þ3Hån¬
-øãØSõþ—ov½Ù'çlÁÚd@ÍM Yà%аöJ <“‰?£z§vüiƒ®z6ŸU£Ý9E…\Öz•‹Yç9èö¡ï—½p4"îûƒŽíÞŸÑ÷ÛOw‚š”oï4èÜh¾,Ù†9¿î³ëýE=ìn^m&ûçQܼœ›Ë‚wzПó/’L)Ø'ì²ì×I†}‡\íšdÚàüÉd÷ß{€zP}ç0„sy2 yö1™ÃòÝ2¡Á-~'Á'É/ž­¬8C}Q`®×ýž\‹E%¾h}ö†£iù|Bâ"üðh=,çÀÌ—§½‹NÎ?ÈVùãn[îv⥲ßå‡ðî/I¦ƒÈìzx­“,JŸƒàÏ,áXÈ:ЫÃÙ“ƹ;%RåÀ]—Z>ZHÉËyësž®îää<î§ðvŸpÌ_ç³»{Hâçþ`ÛÈõÉTŸû®@C»íÞ¬ì¤hßK„>YûÐt½nôíƒ;ö{[±çÙÄÖ¿H2÷òá›OF³ F©¶I²[Óû“…t>G¾áßöÙrP7¼xšžÛØ9¾ƒeé°šNšûõbBî‘Ç„ß¡‘!oUj2Ø–Òýt3àN˵o6ëF€±˜{_B·]³Îl¸o®Þw¹o¯6‹…Í·Ëõaµ^æJêê‹ÇÙI²Ú.Éêe7ÉFòî­€îîÓ8óÎÓ˜j»Ûç€/®üusz-ãíáã¿ü}.ÚGÛÓj›Ý É1º6Øqݽ¶óZêŒC„}aµÄuuE¿Ý±í4]ËÎNÎ륅çenÑŠògŒÎOÝV׺Œ–¦Uû|Ö³Ày8?ÈÌàOö¬;‹_$Ù9±ýcÔÏ|6wè%ýÃù8¸V>„v¹f_½c¢ƒ½Th-¶•;¼[‰Äw;á-Z%#÷³‚&kÔ†u³üƒ,Å£ÙZ(—1?çÜ\;,zÖ5³YuTcßLÃêO'^ÿ3‰êlBÚ‡¡
-ta2—ŠmBCxnBVñ7IöÊmX;‚š|OÑ›å«%Ä8?7±|L×|÷˜iÞØ]oÕ6±4rñ½d¯X;؈Võ0ÿ~νÌýc]ã=2»…Ëâ ÃÆt:Zâ“è±á&Te¯˜¶&t|ã2îV
-û1|< ©Gç(zýîlTÂõÅK?¿¥é/¸bž·½ãÞ‹mymë9Ï÷mKm½cµ³6vhz×ûAlAßMÇ×Ê×0õ0»Äuú<7_“÷.—šé*‚MöÆëzX7vصc ƒ;êIO÷J°¡WÕЯY—ac gãgÀÌòj<À.þl€½žßo>‚Åä‹ù—?…ùxãÌÊ/³ÔôÄ 9m_,Vº›à.‘ëv¼n®>r³½ÜKµî¢|i­æ3;›¾F/w²¬œŽ&wœøca£„†l“ñ2:>ñ¬î%T¯µõá¨áƒ»ÏvíBoПisK{_ÃF7É·š†u\]¹¾ºò¸éS]=åñã/±T9zw®·½ÇÈÿ q¶ému8éºÑ°D8NÔ–û;1¿<jeJŽ–cÓ¹*‹±¨vÖF1Ÿ?*Päëµ÷96v<˜TÙþKZûÄqÝÔèÍŠR¼'«Yömü  aë^NÜ>ùØo(òƒï)òça*J!+{%g|ýåÕ¨›[®Ù§ŒöÅýä›OÞòŽ½L [jjó+ËWfÓV½=I-03»p}`Ød2Ò⫭קóÍ°5êŸõû¤Ôµåªš¨Î¦
-›sÄû;»ž÷èÁ
-D9xtézò«^TàÖC¨Å!‡
-ÇÊ%EgŽƒ“˨u5bÔÆgŽ#JcQ<dÑ÷|ÀÊU»ÿ—@©äÝc—™›»k îõ–Ú
-êfE`=E$X¥’©Ér=WÓ¥”›‰íèe Äý´éÒ¯ hëÎÛ”¬7—lslA9ÔÕ iú’k èš2ù~=(5Cjti¶éš†ª
-¾häãŠÿÃògáu|±å±ËÄ¡]´¯ÚkU¥‰û*SFUJjZ—ó_½Ö¾Ëú²ý‘Æg­$NýeG˜?6|׎6*ïÞ-Û^†SöpSl¶TwL5G‚£O7Š5î2r*K%"ræAÁ¡‚ÛrÇÂÙ ˆÏ¯&ÎfV2ns™ncoOLä¿8e*wkóhÅcæ}q}ú3êzM4ø–˜ÞκUUî ©dÊ_xG—w7M#¤›­Ô¼ ‹ '›¢ÄªC¦Ïx7Ѥ}¯3§îAÝ¥ÚÅú‘$b@,äNŠ¯xÅ3Ûq§# W©½ã+Ó¶\¹\~6º;ÕÚRlŠ
-“s—­)¢+Û*ŽTÎFGÒoóöáxsÛ¥
-úcXµ‡-]m€>Ø¥_obõ+ߘš-£·/ÇÞ‰Ëõh7àëÑâ¨Õ£ÑZ­Gò¢÷—5¹.[¶
-/gÖ«±‰j£[©)  y…P®!ò½ãtJ¼®t ÞQÝ^qAÇ‚ŽlâQûø mÕ:ÖÚe %±Á°šÚ´FÝl>ês»ÙowÙ3 ê1YùÔéq·\[=·t³:z-K»ê:}êú4ëVþ¨U…ÎPY¨ù'?ßT™éÔ]DZöºkCªyâÕÒì€Kº®ò²»ÉÑ“ú2Æ7Ýdž³Ù¾Ù™Ê×Æ™½äîF|õD©UëÌ™îԡ錯¹¸¯Õø1kð’ZU%H?WÝëÒË5ÐòY™å~©Ø/Wž—méjhéJ ¸Òð¾ÓJÃãJ+Õ¹Aï/Ë ,AŸÿŸ‰é\קkNÑä†ÈÉíi·ÓÍ݈
-cœÄáÖ:ïv%¥‚Æü̪»öf[öÆ“s¹–ÙÜKþúó)ù¾X‰“f©Y0Åû½¬MSÛœÆû…Ù½Ʉи€6ÑÅc« ô”_åWq-ÍòM&ŸÞÌ~>= ´üŠ¥Õ¿X¯—8ŸHˆmŽÆ7oÐø@’Æ™în^Çs[e2S:g¿÷žo_…r¼Vwì¡ôøul†ë<¿=ìsÛÆí’Û6믜øèesyçPA]hÒCNÒ«qpú{ø<
-pK¸òš›Ùë\ ²×Åœ•Ù«ÑÖàÊ’þb
-»·©¡_K£A¶Xî)†Xáþƒ“lc
-Í6 ‹@èsc»ÚpL b?jAÄíCĽ¸ƒˆGHˆèAD¸
-õ4qå
-nu9,ÔÇ2{ºÆ2hVh—æ Ã`?Ðÿõåvê£cѪ˜kŠ„yõ>%B=wƒÉ0©øR
- …ôª<Ûe·!lOwFؾ
-ìúõËu€”Ó;ÿ~;}™ËˆSùèT´ˆÉSšwÇüùRî=àBñòj¿Cãeñ·Ü_ÏG]£ÇØd¯ýâ8-ŽPEMÆUC%n%G¡“¬/Gíd*çÙµ$²'qÝn¼~@±ªb%Aß÷ºü±µàø¶S²¹ <ßp¸ªrN^ ¸‹>c>PÈ_.¸ðníµ¢/$ æ«"ÁtàvýJvQõ:çí2²O¯ÊB§xï«ó*Ø;ÕJuÝ9— sß”Jš± 0ÚZ‘yÑ7$Iuq=3}±VtfBövü1Šb¾ýÜç8‡.´Ø8")+L &}:-_E‹Lr­à?`ºÁI#5êÃ÷ñåL­Nà º‡>ýÞen:ôpb<mhxhzÕÁ£d
-XÀéÙ§s¡L à
-‹œL.ÍhJÊÝ(K.í>”²%¨Âù†À~9(cÁ]òáZ‰ºø• B¹NŽt‡€\w+ÕlÎÀ3½³À­µQ#Ùþ€Jˆ,βðÞ½%¥”E½øl ýêåí‰âÜÊ^dÜRe^ÒÔd¨étH‡à2¢Ab¿£„)ð åQ±@lÞl—Ð&‘¨³¼òÜ›¨óP'ÅNÏ>¡EöýewäŠÎ÷7Ó‡²äÆ¢›!‡f…¿Ee«Ô3Ú#Î.•pªÎ¥ÕÛ‰ú¿ ýÀy;Ö¹¸0ƒÙ$3$˜wÞJsK†& ™§–AÍGò€*¾ ©0ã ±.oø!¸xë^icç¡ÅaP©ìaP¹‘`·0›â°(vëÿ‹çŒÌïï;&7äÒ»¥
-¾(Ïè·¨Ü﹯ŒšõwKI->ÁlžV¼.Žð ›,…
-óÞ
-m†ihÍ—YšZh‚D•æ¬NV×”CôrÔ?
-ò»ÐÚƒ¢yöD½b¦‰$4N#~õ>@ˆýå†øຉøù†¤³ƒ´ü²š¶è~d×%ˆšcaÔ$n´‹!ì[T6:Ç[V^–/ÁÜ-λYóϚËÁž™–÷ “s+Eºà×›” trƒtIbŸž>¢éTܼ·,Ì9=ôug(Ö£ii/xrÛÖ`ÆCÒßsfBÑkq†¢‹W‡¢kƒså<ú~6È/ß?˜&¥¦2.W4aع<Xg¾ÑoQY^·9i›©¹ár:eÀNeJ-ÅU…©­Ý q€U¢eÚ¸•Žx콘OOoï!¢éÃÎ@ÆqÆE2Íb³²ƒWHºËcPîÊVïln£³Íú‡Îf¯V;›Ùý€t6ÃüËì ­{¦VPG{]“Üá~õùí[Ñß¡†Moj8rsb_o_Ølf6#uÃõðKÖpˆßÕzb¨MçÑQ¬×Q `$xÎI$Km…ô†|Ö¡yrsºkàt«\eÝÑ}êÞ>Áçï÷Ûˆµ.ùa¯e/¥MËør˶hËVÖH˦#ø—Ð}˜½ñ²ùÔ¾MßNhÛ¬©O#L÷ ƒ†¼V÷¤ê.çgKÜ F>
-tÛ“É¡í<Ë»¸ ­ÞPš0— i µº›tk&GwöWî4¡Ù6¿u%Áe  צ÷O2ƒ4ÆÀ@k!¿j_n
-½[nM-¶ý¤Ù|—tŒ5GDƒk¼&„ÖÛmdfÛY}gNµ9#æjbîÖ­®DA®*å欪dàRUÞNj…3SPþe,ËsÍî䃃Ô?ÞòŒ$ÍaöëW'»µUwE6X´Ü¨}¯ñvïƒ:_ÞëùmnQ[¸Ì©&¡Þ³VJöùêz\hTU
-CªµŠÏWvÛØHsMÈ/Oö¦lÚÅwé÷›?`ÉV„Œ_§%¸“+–` ‡ãcD~µ¡¦=`@J·jüHê᥈–·Ä½J¯Á^-éŽrì¾c.èY“\I£šÜ™Ú?`ùtiÙ%ĨŒŠ‡gkWÄíå­ð‚3™B£ªj6„ áÊ2}ÕʇíK”g¯â-ºÙ*8Gž‚
-çAœ½aœ]Hœ­aìËøݸdyfÚe5£ÚÔbP#÷Pì0R7_!œ}!‹ÌH ]“2â¨VFe[”»¹5òÜ-´sk?åÔÎ|š«^ëìÎm]²=T~ÿ€Ùf~[É—8e(f:•»\vÒpŒì €[“
-ÍÛ%Ñ°Î :M¢æá4Èü€ó<fóí>+µHd°¨Ê"\¨ÏYuz,Yδí\g“KšP§±>[ciÿ=ï°>Sè?dWWê—'08iO@Û¨ÉTût]O!Aœ±=Ö:cx§{"¶›În]|tÖNÅ%–>iK‹ìcdÍ$Fñ"հðg÷—ÓS68L;|x8ËÕ3¸Wv¹ÀÛ&åñ³™mŽÉq”˜ºÚ8šåÞˆ?É»¡ƒ%O+¨»—Ò5>kA5·-|pÒ‹Ø/ÏL¦Öf*óÚ½Ü1úè¾’Ì›skžß˜1”]ŽÁEa^˜y­¨žõÉô¼X–/MnÒpiâŽ)møÓC4÷Áöz;œÝi¸¼ã¡<
-j.jQw;Í`-j¯#¿<3²äÜCD9ÑW”ݦI´ò•sy™µª™ù\$îѶyyN»Çe1i×î8ó¾R£ùì* W«kÏÛîNiNÚ¼ûn»{
-¶{]þ€Ëí×Ê]íÇ­ü´ ´›·^‰Ö°hrŒ™áô$˜œ. ûóSõÚ/Qëš¡DYĨr1üêíò»î/ ¸%‹WÍ(ûM1fVÏ‘ÕIÇØRÖKѾ=z‡ígtž >|gûE`Tšog×!×ä»túèíJŽÇÕuÛ—Š–õÞT<‹©×'f$Vff~ÝÚö¥Zš•öÚËP[£bogo۽ƤÒìâ8Ô Ý$š+í²
-\gºjüøCç?ÄúdÙ?MŽ[e3°0b!Ì*­ÈH Ò1èw@&ØÑçéqXãåØ5o}йKv#ñë}Øš¶mÚœÁi‚¸l‰j¿l+¦¡ÆºÛÛ7E¿×´ô™nÞì­vmŒ®l®Õ»&Kg:ŠŸŒ$…\RyZ­½e&^6SNí-9ç-Óœÿ»ùr3k3ó°Ôúò*h¤…NšS×IŠA&ξF«ÚýàXf5h·“ý|?^+ÄE³˜ÎŠú•fŒõnLõZè‘×-s§hƒÁÂPï‡(ÍùU¼½)ÏK<S($»—§ýê]Î]˜¼$À^[*<²œ(‹®'VÊÖC¬tñº°¹±Íÿp‰_ZgLòÂ|/±¨í®ZÁÛX?õäãñåγÃ
-uéÈrXködÐè8’p&qUeb¥gž„mó”êv¹Î±”^•|Ë{›ÜY¯)«2w–2 îlŸWµ_Îã*Õ߸͈›+3™Æ‹Qk~q¸›zOÚY›n—Æfñyœº~<èçkš³Äy Ÿ±Ñú^S‚Ù¾¥d‹WTÎgg„$òKN\g²XÍ, Açö.X<C¾)ì8›Ãìma•XWz¢,ÚõzÌ#vÌãN˜$7o|¨¨}ùTGÓÍ)÷,«×gf3ŽLüØô—U¯äÿí< ÚÑw;ßhèÒT‡¦Xúɳòvzo9µ‚œ·µšTòäŽXµpXÐo8ÁQŠãÛ&¥þ€œ},6 >‹Ž¦+&i?c†tótð°º4½h*tV®nS’µ¹MŸõ”•Xùå°νe˜4騵`Šp­‘†©%w öÒ¹˜=íRGc7vF:
-ñ}™~5)®~¨|((}ù·ÜVæªz§'ÏÅñW%¨íٲ쌜1+~å¤áåœ'Ï”®)n,p((ñ–ÔÝs×pgï1Ãâm½ÈŒU½NO ±C³-§f¶ËR…+§GLnÎmbcÝ>o< nq£É>±“V1‹Æ¬›+ÓWõ‰Yì"ý2)(}(~YžiÖnèI¦sCG[§ÝqÝ©Úá^ÈöúåSOÎ<q›?èü¹¸Á%Øá}µb^bæÂPëú‹kPž ¢F +´E®ªBVz4Eh'QĽ·ô‘YÇó½u[qûeä$2|î½t&>|]Èð—G»÷KñË*»õÅðºÓ8=cÃþ,ßø ²fIE*×sj¯‹,
-§žÚûX&G‡8£óÙÑ{Û{zÄV§8K*v©LlwùÑh– ¼o5Hì|ƒôvlh(Ú¡]d4pðëq»ÁIá,°Å¡0´(ôœœ¹ce8³ï?`ºF¿,¤…*¦ÙÅ06hu˜cžƒ— ‡‘àzŸ­çtL¸]¥êùpöé‹uJÊmrÍç'dõDlˆ^W¿âG×}á&w,bWÅ`àÒA=6Ædþfȧ×><a¡œë3ˆ/m/Ý[»¥ƒ‹tKGÙê¬eæÜ-¹BJ¡Ø-Ù@þ—™‘>&™Ezí9áz¯6j¦Í†aaEP*Û›Ø\7g? ˆEn*Ž„Ÿ:¼w¦Þ€»9«GtØî(vU³È1Ë0r0óöa879Ò¿H]镘 M;µ™}lïÅl®Ý\+ÝÖIkõZ'îóŽŸ­ºÏ·N}¡ÝÔï)Ü)ÿ%t‹OaœN
-~ÃÓœßG´]4ˆq®MF¶y©ÑÕcöÝj®I}¿a¨p^™‰ÝêxÐëô2ÓA§±ËEícÛµÍfïÖºXΫåt7…œ-4›q„¡M¬ q ŸrôO 6Ü ëÝÖ³ËàUã«Õf-¿;ȵü칯åG°–…¿FþËx±œJC˧$'¤EÚÔ>ª'ü´©”ÖvžÄ^Ä…-~m¿õdmbuöüTN“΢Ük Ñ êˆ×
-zÐ?=½(":
-­#@4E€hÍh€ ¼@Ü äj%eE}ú`•tˆ|:…Í
-µ BܤlwårÛS6¯Ú¦mŸJ÷­³Ê§)u”Óm+ü[Oþ†ô­'ÿvÛ~K·Ÿ±ò?¥Ûïê ˜ý§n Wâêuÿ-XÿV´ý®¿;ëþ[^ý{÷1½–²…¿$Ïè¡'O>”“ĪÒIB•˜BúT©ÀJº¥ŒÏIÂ3)V#åŠ% ÿïJèÿoy±ò¯Ñ¶Î&~qé&ĺ³úôŽªÎíj³†tÿ¿—ls`h´’’ä QIB^°ÑöÓ¨×8 SK÷LÿY¡œ²„Òà
-ô·Û–WR|3å2L#«†‰Ÿ‡– ± wúW'eûþÈjîûÕwÅ{¾ÿnÅâ• ãÒà1¸­Qvñ-É^w$»û}õ‡ôØþ€ßMò‚3JòŒç|òì)é%'”„Hc¤åËø2eyûW4b6E“â†~d•½pçv'5^4¯ýX<ƒ¸d—ý›—?k©U½Îâª?áíåH1—K;ì½ÎN~S9CK•=y•yLzÙqJirôïàH/ã/‡·¹ö¿ü)Ó¾ªs6=¨"‘< y$IÌM#lpß³ÿ[·¬LÝâEßÖºp«ÄÚµ1âÚ—þ[DÎF$ÎNÎæN±`K'¯èÇD ­#±›{‡Is;ÙGÝÃrŸ÷Š—íšâ
-Ûjx@?ÕÑBQØ4–-um–_òº½9Kÿ!y­‹bòRæTzPQ(yîD<yz:†¬ðI"+êãÍÙƒX<4ükÃ;†ç µ[Ÿbîx:&Ò.þomý:Ї}nÏ]–ÅÝ^V·k|ÚÜìèAgÓˆ†èÚ,Œ©ÕE^Š+h{ê-½fa¸ð»ÌzAÄep>ÁøÖ<;È2±OõþËg-èvO^«
-Ù¨¬¼z¡z—§aí@¾¦Í÷¬1±œ;\ï3( ‡Ý`0›B" º_’w?Ú¿[ò˃ëÑp¼Ò¢ö½ˆ,à‹%›?àq ?Zé„X„×'¿D®z^\</ÙÞ"“+ æ`1ïÏ¥FË]uU0hjcô2=TÄçÔØ:¹É¹1©Lºæº¸À›VÆ£|8ôƒ®p…úç=¸Gà3ÓŠä¶1,aý?$ï‡,$ï9ÎÝšH žÍ{õ˜MŠÙý|<ö‚µº­Ïõêc‰ïüœ«Íh•Þ×C]Ò¤­}•&ö´Ðÿw8㤔 §úo[ùô9øYÁ»¸Õ.ªûÒP¼×:Þg(¯ºÚõÝ:Ú Lüu.k´î8j£æÀpµfÇ÷lõ—'ÀΔ0VŸ#êôª9оbÊ•õ`Wy.ŸƒÆañ^9ÛyÞ*ïÙ{L.óL>À W} 3°Ÿƒ*ôˆ÷ZâPZvuoSA,Oݲž»oÈ·ijóÁ©3Þ :Ó}:’øÊ8ð¢[±‡e ¶žƒ“hQgbNåöÃÌÝüjæš•¾€Jå~!!KŠ_BI.7N¤%†V y6Hf•x²÷×ýlÚ™àópü ºG?÷ì>‡Ë-]ô4“h¸Æ”ƒÖœ#[IäDUd{¸× ëÕê;Œ|+Cæ&=výy±÷…—3VU·nTz7¢·Åv¯¾–Îz¿vʧ¹ek*hgc™ÿƒÝƒ_bmVOô OmmÐZðš ú˜Ä[r*>õÙÛh2T
-pêY-É‚S¤UMÆS²°Iòmâéë·;€ì(°ýænc1™øfæ—w¿´¹ µ‘«÷zígG?Ò©ýÈQšC5ž”UË5M%™ñ¾BåO…²8ÉL­œ‘"ƒ¯K|+áÄÅä<%Öxˆ’vΉåú*û!#–ÁørAÃôí¦^›çzh½ã|@mÑ*wÚ{Í$˜8÷¢iZ“qÓûÍB£
-Eºý¶ÒtŠ£9IÔªŠ¨ŒGh0Dºß™²ä앲gãjÿÊ¢=ûÉŒN^ö¤ß]¿D·uƒÎ¢G˜âü7Cå)H#ÅPëüjE(ËÖßUF5|W•E\ßKK|Wo<?$¿¬CÍôs š,Tm0¦ðºBzÙSY;÷kÃR¤&{\—d–vøNäÍêÑàœfì±^÷&^iÍÏÆ‘žPÐΆ蛊8)Oåj•”Êf‡,m$¡Öcߙ޸*é=;n1ÖNˆÖ~V8ô”gXûuy¤Ä_®FFíÛ«äú¥úp¿$‹ƒáš[³›|1Z­ê\aPkµu:ƒ‰UŽõÆ|úcü°g3@#
-hÆ<.©èï©ò¾’‹¤ú"Ëd3G¨ÓN™¨±|ïÍ{v*M¬ÃMÔ™WCÝ3rï4Šˆw=Óæ^#Ä‹'1âí&÷éS ¹W×÷/Ë|ûJ„0÷€Æ…ó»î»XÉy9ZÆ\éÚ­×]5–ÒÒ=k¼ÕšP,vjÒô:ç7 ª0…=r©93²|ð7„ÖŽNDír|à|Oï0xóQ(aQk × Œ HNâ¡0éÃÏàÀcU<ÁÀ~—ƒ¦ý~:ðÌñšÊØ–½ø/céöe¾f–Ääin!¿¢f›î-„ËN¶fäÒç‹îS7-É–Vâ–ûbOšÕ–¹¼ ²oTBKüPªxË!—Øî°îй¡7<z£H°É#£ì©†à³E˜34Ÿ>¢Èï΋ùÝØV^¦[th´[hãnQ/ŸºE®sûƒàÂ×/³&> ‚é4€FõøÝ$(Vµ‚ í+«,»Ž…ºÍ¼³ žTÂûx‹ÀÎ+ALÇTµ Ôõ–CÅžòx5·¡¤¿«jÓ=+g›³
-ÄÉËvw¾½ÝR³©t«7looÇu[÷¸w»ç¡vƒèŽÚöéÐnt
-·v£ \¿ü€ßM8€b,‚â]°wÇy'|ÃT6¯ß뭻³[þr¢<:ò.2Ѹ 0½Ý0„HÎ4<‘+*ÌTXŠ\+€xt¶€òÉuß]Œ ·n9Sû¬Õ¹Ùb§–7šíž4ÆZÇÍUl™:é6/ÇhÕ„»Õ¤ßÖ­F¿ÜF¼ïñlmÄÃåå—oýhW²Ó£2~C6í4Œ“×Êkã~+IŸ/›i¼ãð
-ëSåS¬axJÁL@]ñΦïò­}èujWÐmï§TØ6XcÝJ<§–%n­4Ü\s Õ«M¤.#aÊןל]Ìex$°6õ½f¥B§ÆB®Æf­Ë¦ÐàA>S$‡¦3"T昛C®Ñ<[Ee½áÜ_ï™&DëÈkvâ»J'DZ6“Gš®Ms˜&Z„ÄÆHáŒÃú+>„õ`nê4Ž\êÙ4·ª…«m©Æ©•nu¾g™ªhìÍÊêÏ*Š³¾—·²^Þ&}«¼]¶¶å­%\ÿ"S—/? _M2´{Ÿ¹”-,ÖH¿u¾7µ`ú*Júržp~ÎÜS*Ðb–µ¡…½—Ú&»"$¶n×
- ­J¦CU˵TY_ßýŠ¢£JS¢ò>îʽÅíö–›r;[2·b­ÔÑ·xñÚD´"<^N
-wš¹¼ø^)`ÃX+`âj]ðüÖ-}ÞTÒÀ? -²Â—§6·› Úó²×¶"µçE>N¸S á}z‡¹Š™aËo·cðµñ|‡t­ØÝÁecSn‘Õ .<T€,ŒjM¡€ïù^þexn>Àã(è>O½íG>3¹À% W".¨QnNž91£¥yr®aL®8¤g9á¹çÒÙ×#7{¤¯>|×±VÏ*e\ú*ªF[¶!vV ÍÝßw²%Ý÷(Ÿg]½N'Fº¦ÖDÃfËýã+$ý\'ÏT÷Pº—År†gסEfUn&dkù{/³[6½LO–"à¸õ÷€©' Ði2å”:-·tÚø蔞o SÞ @'“@'ëžv|xþâäÓYNš[63Yú•3Ò$K"'FßÄ`ßÝqtØLVAMb+jÙŒ®0®;8S H®ÒÜÀÀ9/c@WÈ”!tÍgèZ°›âE@7È~Àt£¿SÞu ;±ét4µì”ûèºÃÐõxèEèö©$e[N¹Õ¾Xµ¦.èOG%dm!t¸×-Sú¥`$Z¾A5ù±i>(H¯ÊO›r¹K´fyP,yL¶Ñ*
-O
-ØMǽÉTk8Þ*€Ð–’æë:ÚýiRF߃až—V®æsF/ÿ©'£uÚPÍvt0òþÖI¿õÛJ}`”±0k°Uó `¯égÅœÀp
-
-!ë3£†ëΫ.žþx>›Çp³×SÃ.߯ˆåvƸk£þ8q)?#…ˆÝÌÕá¼¾ê‹ýíÀ[µ_W™Ö—®"·>·’A¿½-8çA%½Ã86»Qm×4WV’Þú,B‹Ÿæ»¾KÌà=~yp;»š£¨s˜qZi}ÝeK`xÜÎ ùM­î¯A¨ÅÊ`eÄp<2•ŸÅÛp~QÓkß[çÌ¢W¼ºÛ°ýî ûè í­iÇ)\D;–cÍöª%ÛJ<tlOqa¾ÇáÉd*¯w?ê¡Õ>Ýc±ÚL2L^{ê{ôjxóþEß½
-éù»‰×Ï>qÏøÎælò‹pàÞ#½Éo¦ÖA›ÃjŒ‰GdŒøšãzëÕdæ617èÈëؾ7¢·ù§‚5®U `ï-“9æþ¬S û…A9ÉÆÁT£<â­žVòƽÚú²Özéª7N^K“ADëV2ž:Э½rO¦7eè®ÿázÚrä¡çÚËwOgÕ qŸÄns;îõÉ8±ám†5eprO†ƒ”OCk<:ÍÌéØ÷grl,ß…—Qaê`O›ÕKú¡…4ô–wµ3$ãZ×3Xuðª*2>9Ê([˜Ê¯³“ƒæâ%Sg¬™ÎÅB¦aH\î¼’ÀC÷*Îû•Ë‡³(¶3§/çQ'Ol.šÖ˜/nÕÜôŠ½ã
-ÑßË»4Sâ›Ûã’³—{5ã3 _“;swËKšEú¹PÛ4Uö Ø$
-Å6 —ʃ)PÅY̬Zd1{uˆå¬·Nq¶d17Ù}ø¾Ú®ïì,=/3m«W&næFë²ópìà`O@{ÖW,ÌÑn|ÈÊÓ Óåî4>Çð­nAáÒ¨ÅüÎEH>d†SiI¿@uGSbïLgÚÑ“š^® "@í$g !‹D'–ï‹ETXh†oë«®•:^·´>^·›Ëróí,m¿¬ÆýA7j%t% W=p¸˜Éߢr¿?7aÍQG–ͦWeqXnñ‡Æâ¬ë
-õ^l/¥æmõ‹òaùÁíÌXZ3ßyãåné²³ú+9"í“·¼eMˆÙ^yòF‰™¬é¢Ú»ã…Z2¤tQ´lånªÎ•¨©X·(µ§*ä Éqe±–›ùÛQ:ÕÁC
-(¯-#©ÇDéÒ“…G8‚ú,öø÷âºãGN€ðE¼_á‹„5æGÆxù_ˆ½Åt³L1#Èb}÷) ‘qß>\è]{Ü_WêÛî™4ò©Rˆü~ö{nRÅSž ÔÍ¡.ÇñÑ‘›-¸).ù®LŒ‰$˜¥xCƱ(—7á™{A‚VËçùQlˆ|±¹°¹è’ëp¥d˜ã2% b¨i±ów>™‰'kÁe˜Êy—#3L+¬÷ím+«FªeçÇ·ú±çmÜT;Z¶dŸñSÔ*P'«P “Ù0KK휮Š·ªS{â¬.Ê÷ï¼qa ¾Bä§X[~\mùô~ðæ,fŸå2g‚g+bµÄ¬û;Ÿ©jÅ%C$5½Û"½‹ö!ƒß¸ù/vÄ색@nØpáŸð®Ÿ²I £[é&föîµÎÑÙ:K<¬;ú„}Ê*QbÉÌó”^øœ
-“ ¤T²È#©ÂÃEÇãfø¤ÇY»ã„C=xÅVNù˜Íƃ©Þ<„!zGæ ¦oºHÝ^‹ò |Nqûù“¼4çy©tzä¥p™QÜ0•üCë>û`4ÈõÙOŽvG2…¼oÞÚÈ'¯¸ªa殼òð±)í½zÁÞä
-ò)³IFdA/vÎÖå»Ü–iÖ©£b“© ¡*CêŒOÇÒÞ¶?£™ú~GhôFñ>‘W¾C’R÷R ú/¥A¨Ã]„¿‹å>"Ê>|Hm|§_ðgƒ¿‘Éìƒ!Lx\Ï«_鶆‰æêh!õà\}ºéºÛTž@í4Õ‚’\¹p|&¡t<¿e¨Óù†QAç(A*jäõÑ´Èî|Ûø‚I¹üîÏ<9"´š´ €Ô9â£Çàé–Ǧ©Ž‚eÌW5¿È4Fùò¿äs.`ó9
-ò9Ñ™ås„9Í— û¡£Ö„ÎupbýiNø^¨ÏB“ªO«ïJ¥%Jbéé¨àùòdJÂx›’X‚^a”¨a"•meñ¤$"°énÀaVïVÀP5gço­‘ ìåóî6Êmd›«îÍ{Žðæh¶qF’±2K·;´õ€C” ‡Ì¥Ð 3¾ÛB¹"6E9‰~Ð
-Èi/v©=È?„VžÀ©úEV²îD5Í Ðá'Z‚¤¶¤V‡s—JóΕþ‚ H<dòΔNg½ËÍ2]”@O²È£A¦¥£übZÎ\+7/ÓŨ~FÚºsäÑOH¨°¢¾F ü1<f=X¿ö0æó0Ô°>ˆ#xøB_0<<¼çt…¯ùÓÇVô<&M×Ô«`ÔÛ …Q\X…­™Üíò!£²5úLì Äè¹bókæœÏ²Ë|yÎg0<ns°!n(8}‰pú¡$£Xz6Ü´¥-‚4šJ¡Å¤¸…òHøH­9,E¤\4̇¨gm¨—øÔÉ2uÎõ
-9ý!¼)“Œ¥Ó úr‚‹ [¬Æ›†€iâ«á0-*ù\åÛ«
-<³#ª5(íGOR7 |F‚Žà°|·„áÜ ê
-$”õ€D?ߺ%3O‰í(@â¬
--w6³—ÞfÄ”›œ—Î Zaš5G(=÷"žÛzHW<6ì§r«¯*6¨»y©mk~¾FÆ}º‡¥Ê¦à’{ÚXž+ƒÓ ŸkG.¸¯Ê“ÅŠÖÃÚåÑË™•‹K{ö—‹C}úÇžPfÖ>:LÏlO½ŒOœ¼ wè°î^g÷\Á™r­Ç’›ÅYô2ï6r¦ÔñfmX«ŸýYµy¯­Ü³Ý‰Ývv–Œ/ÎÍ=y·‚*Ï>”¯hoŒ©€‘©– |X±§£o[ŒÙ™÷îb-Æ ÒÊ“®WZ?‘Y©>¦¿hž¢bc˜£—j]‡¢º½ Lr¿ôçËÔ¸K®N­ Óé™­”¥³E³ËÔñ{Y¬VuÃ=ߪsGç£8Û°2Øž¢JJ~¯ÊÆà½+Ã:v¶­ˆ|XËŒ
-åŽ4'ÿEßï0dMÍK}DåAñýÜöðÍeÒzs¿UÌfcyÍ&YwÅhA9Êá;O©’š<Ke“¢êö¬%6zÑBË1ËQi3w—%2çnÍýº{2bô0Ž÷'bðZŽ(^AY)vÆ«Šþ É®Þû+]èPá­¥ÂÏ„ Øqa”ÆG_ðgóÁÚ¿sØt ŸR£^%¾†¨pÞuŽÈ>òŸ¯yÛ[b©Ïœóà§Ù
-”7p{ö08k*ZiK´ìéõj¦÷^Æ©¸îAú6)^­gR[»ÙÜNÂE…ò[WoÓ|a¤ÜøB1[,i‘;ji%‚œkÈ}ÿRçᥨÎÓ®:†j¹°ü¼úÆò±|å£FR« èú#*wØIô·&ü¨Ó¨z¢]Æ+®= ØZÙG´TŽ¤ÙTî¢qZå‹Åë._.Ê4]×ÇB k¼Ñ×ÔšŠ¥Þ²Î¬c-Z<oZÉ/dÔùµE«åîMWÖ¨–œ}Å]®&
-ÔîòNôTy'Ú Úƒ_ðƒÅèºÏO¸b750‘Ñí“*ô׳Ys…ݺ—U*ÎóñvùBÃæ!íÁF°´sÅîÖIæÈzøôe†F¡8™” ióØÐJñ=Ð2-4Tœ8U+©ÆVY›½³REŽ)_иÜàZŠL]AM:të#©eag‰Ë’¢ÄåR­…Á7B‰bÿ þlæVf’‹Óz*´ËÁ­sÒDZÿ®ÎæÞŠêöj|‘s*&,B¢3†ðâSú@zÀ…qÁ é Ãk©jꢩ›jîl;JU´ëJÕXv¾$ט¼‹‰¥L³b,έ—ÔßóâáD±=;¢Ø‹BïsBï6ó„Þ ¿ÑzûTïƒY>_ËTÚ…úιyïÐøàC÷É¢±]„á\í
-F­l»hËpFlŽÏÌF†ŠQVÍ«sJ©ŽbQ! H—{Ì–iOªIGÆ ¤Ö{˜˜Ñ~&^ x'Š{å.ܽ>*(§ Ç¿Ú†Å[Rõñ:ÒÜó©C“âSK»–`ßçSÃe—/¼Ž½¢=)e‡º_„zu£þhËõÁ±UÚï× ª ÝpZ¨ÛX¯,Ñ -Àqÿ¦ægÒK!VBZöOÎ˱p’¯ÌUñ2ÜšbÇ…\QÂɦpßé=¡ßKfýª²ÙðÃáëÂëEæ&»!Ù^Þ䦰ö˜Ú°öϳvĸ¬ÝítQ÷:ìlÛï~Á“cÈç%HKÿ¨ßyznVÔͦÎå“3V ¯‹R1¬˜–mN²7‚’=x¥©œ(ù2-ô¯EQP»M—æe~”¹6x}™íð¯¿`μ:KéNŽì\
-õ•‹Ó{ö¡rçó^D¨ÍŒñon‡ˆ´B5w1=öYá †Kјð ŠöÝÉNÝ`¸€+Óàš páÀLpvwÐÚ€{Î#À£Òðô <Sϵ·9à¹5x¾«
-ˆ9âDv‰±PѨç :×ÝUˆÕ¡ÄNk ÄnbO“„樬ËXV‹Ý Òê9éÇØ–4YÓ­æZoÂˤ6L9íñÓ…_ùÛüc¹ýä8Xñ¯Xú«ßÚm Ë&ô
-È©öÈ:yyæ¾ÓVÍ
-ÏÒÈ—Ô(©; ììÖ@!ê0P$^N°©šoÞ'’º¨ŽHc³ôäh¿p$áe<Íù³A‰
-ÃFg³.–eëŸ ø[µþè¶ù¼-Àÿ'÷?¾Ûg ”iù Tü™jµ)
-êüà;u`ÉïýÒ<ß?ÒçGý€úšïúLfnˆ«©×lÃ-_0?hžÉnØ?ž
-ÁäÐEÜEæÊÛýˆ(öW¼ì@~lí›6Ø…ÖuÍ|Á«¸”Ç–§
-L-ùM^XtIQŸ?šg®ž§™þ`wÓHÛe¦¥”ÀO‘ ÅGs3ÃEeøÉþÃãѤ ÿÕÌ4¸ÚÛÜãL¶§Iuqôß$~Xß 8až°3ž¾YIºµ&ǘ³<Yïúâê\[ i{íÌCêÎFÜv4ƒ:ÛéÔ|Ä«)>öQ9]&+3ûš`s!3&×21jMyxòÕ/xÈŸg«ÁµÃ=“™¢…L}^ýûóñ˜kð§y7Äɜϵ3·9òÃÚt?Ê#ËÍJ(/WMß/®•ôuþ¨ÐlÄ¢Ùi$¢dd¿îl2q¡£8Þ–.Ú˜\\ŒQ3±‡§ÚÅòñ¥1è²÷ |tRa¨>Ш?Ò¸Mç^ îCݹý¢»Ùõ´ÖYÕ´¨ã’£¸ƒÅÁþƒö¶éî>ø^[i¢·Œ5ÇsµzÜ)}¾qõƒ¿b&©Ú<Ä}oñReÌp¼5Éù¨™ÃvÀÀ΃.ƒ=ÃPȤúï^éë¯\¾é¢‡D9¶;/±R7»
-_pÇÍkV{[+×Úd´ƒ&;û§öcãóéÑêj1Ý’SÃZó¡ƒfXBGÍäüîés){âZ™çnVÚì——;œ§ÔWcš9¼ÍɪÉ&{ÅÖ´0¸ÖVrz_TÛ=dl ºe¸1ë¸LkÓÞŽz‡6•î]‚fcúòOÇä ü,ÓêF{¼%[0ß \¡ x£ì£ÿ½‡Q#ãËq}QI¥T¯ˆP¥¶žÕúµªçkã þáGT†¼õky]½×gí„\úáå\*ß`Cмð½ŒíjÚ3ÚÔÑwýsä·|‘š…-…›L¾àæ`²Y6SÈ~çåý±1]ï¯ «úJ.àG©ç5¯m€#Ô£_¬6ö—š{d‰žëƒñÆå&ìt(¹T¹¶ÝJ¿u*j~ô»Ô4™‹­:|›M‡ázBÕá๼~ô¦Ì® îl{ïœÐ€«4±–™fªZV=¸Ø tÖëµM/N~ø+žT==ž»Çè´q“Úûä\ŽØÝ‘x6õWP«¨¥¹P!³¬ûvÓŽ }d›ÓêÝF¼–j•A®ie×Tð§k•Qùc
-½d/…aþ•.¶­MäEQ3^lSKŠŸ…:sãœj‹Kµ%ØSmâÕø‡Å›âS“x]cl{øå·éµÓJ7N}»Õ%·‹Þ²åI»uMŽXe{¼–ˆÁþmÒ“SÆàâQìp¯ß;˜ª÷M½TxÍõJAÏ™õBjíÚ¤½j¦xŸ«³9‘Œ­åêKÍ掘²¼ª‚I‹š¼Í”"yK×¹vÒ“¹X²Y6~±šÔ?˜G…ljÜÎ<®¡U<l;Gò2õ_Ê£ç-΋j­E銣9·¼íWn&Ã9Çâå¡ßô(¥
-o¸„t¯Ij“S—×Ì`žÔÉê<›ÉõðvÔ¬yÊ*«vçäOä­0ÛÈu½É䬆Jq3%IÌÙrÄÓŒ<ÞbPºÄÀ²ëߨýBÑ«³ƒ‘’Ÿ_ú•Ý.éù;Üã5÷SËk¿±1¦µj{aj•ttÀJÛwåQì’ä¾ðv“É”Ô|2iµœÎ䔕…SŠKEyë—4¹Î7K2y¹R]}©ia‰¥¥x:.“j\Š,ÜÒNè {ãjÁ"ê|òdíPâýí¯ú]SÖû¶¤ç-„?…õý}Ñpû[·‡)f¶ã©'3·Í¬eÐ VsXý¬¸õð-oSD¦¸5&5'gF<#7Q<g(] ¥²(´ºžp+Ä=¡a3AÞzG~@mS¼v”h ÷%n\´zœ‘ÜÒœA–äï¤ç äZýÁXzT'‡Q ŒG÷ÚÝ¿ÖqæîËfz ëÌl×t†Ç°6•aˆ å¥MÝÕZ©BÚN®?©ƒÔÊ wñ\+¤Ä6ÙÈ
-·f‹zì8™Y
-¸%f’)ñƒšVã d³ÍƒÇ)âÆfÏÁ©Ú‹n!’µê^‘E¢Ã,^ç³!Á¼Ê,Î#—EÙU•Es‘3¾àÁŸöí,þ¨}Y%½åjk³n9Цc•¼É˜Ô_Kî­.ñÓN:<Ók±ÝÞí„Ûý| ¼øW.¹
-UãSD…áÆÉ©áŒþÎà` 8ì,'û¬µnY´}Ý0•sÿ‚™|aô¦"èZ~ߢ‰m{Kíc†&ön…&få_Ôà¦3º7ÜTÅ&UÀïN~Úxm;ù=©ö²·v%#ù¶HSZ×—NZÙìÞ±Ãî_0?d*+>4bn"Œo<ݧؙʲv– Yôd‰Ì2hGX”éÍôæÑ5›êÓd¶¾ ö§Ç•òÚnŽ<Þc™ôçµÉW¸É;Šä‹‹ôGBå &ý€*ðYžñ“RÝ–£õ¹•y¤vŸp wœ;å\Ü©ÝÇŽ+”?£wé*„à°àA\²Y…Þ2ÎP<1˜^yÒ[l‚еí£ÉF*©ú¨˜¦Ê{UJäIoUÉ
-syv±Î®/Â+KHS
-Ý=5 m ¡!J'=Ú^º[s¥,‘+X_p–
-‰7¾?Â>ܬ D¢g*"¡÷ÒQ^?èr ôÑ"ÓÄ./P»Áù«3Í0» ø; øÏ,†“>ÍåÐLÖÂÕóëܪOŽQæÙd„T}–`¾E®“ëéÖÉwÒ­3 F¶¶ú¼ k|ÇO¿¯¯(=êUÏé¢
-ç¾`(µ4(gZr ’Œ±PTŸYi(Zþà7§c:@ÍÇ1UM.Š{¥RabóöœŽ ‹Þü¸€ùé¼Ï14ïf‰AŸ}ä 1F'uþ#½AÁ)ħry•†sÝ4]¯îU}BJRùT¥YäRy6ÔAµ}ªB’ú Ž;@È> š“<›€Èn“÷À‰DÊ6tÊ
-!ϲr‡‹·ýÊmÉ Ávèd ¨Köž¼*¦„¹ÉÑ¡!^MЯ
-s×—Uña ífn¿×{½!õiåj¦µËŠ›6/ÎåÐ=o¥óðL†ÏÙ).°û3qŸÇ
-:1Ã-z  -v¸–¶I½¿Ørq˜ßJûw-.ìõøTÚEìÃý|Á›•†„ë­¡®W±}E’ö8ò2 †Ö§Q?‘ß3ýÙ•?êèÿA?¸`€Þg‘¿8‡1{&;cõÄ„kûÈ/8~Øëöþí®»ˆî·s¾5Û8Oc¹®§ÄÍ*6¹ýŠ™s§eï‹kU|/¤½ŽÌCÆÆfïÀçfP¯£NÍ×щæEcegøsâf[øxëVˆ¾àq/ࣸ‘Ïÿ˜WÿwÿäPëpäG©s¬.f÷™Ld7Î]C×µw‰Z1SMX\V?ê”1{·rö ê
-aÕ1ÿay‹'—hS¯o>Ѻ½Âíã+Wi½V÷ï]T
-òµ*?œëèµ)¿yscGód͹ګ´2¤„ÍÃäjeW¬IžO’Ñ4Þzñ4{—ŠAsõëšôônÛîé²8œÂÙe_ÐÊÊ['„Vì…/XK›‹–:Í{µt µôfÌ_œ0ãƒEaí]&LEÛ  )7éÖËL'±ŒÛ4o­Næ’}‰QîY[˵•c¯Ks{ŸoŒC6>¬ûx}ÁÅàŽgô›Jaº<béÂÓ-KmWÖ
- ”´â±ëhéáÉW§Åì@ÍìÌ•²hÌ®JE•rJ>»Qäj•«ÉÕµ– ™%d¢t2’WÛâ?|ý¨ß£®‰oúóuØ1ÖõA T½œrÑ«IGV† ðJFµ~Ò¼YsZÓÂBïYÚ®0ðK—¸ÖßšQê!œY`ªUYÓ*š? Êâš+(y™JfâòúYLš²ue¢òžI«z”èî
-–.ˆ>}wEî4ž‰<¸aÂeR×?¹KóS,Èž‡aœÛöÖN~Ú‰l¯•~¦ëõ¿/ºÝ}ù;U£”OYêìŠâ©8)‡H3&»¥jÅçXY²Ïäè\ oL1#דöe‹–¼\K”èóº(Ûϊ蛲/òHw,tš½ q%À?R†ïo;É,‰WʘWûí,¯†rW›ÂQiäòÉTîî®è,PúH¿‰V@£N;¯’3ðš¬3î)ã4ðö…·ÀŽT[jŒG«LåšQYKûY#©ú$Ï›ÞÅãi D?¸d„ËíŽ Á
-’]PøÓ³øþéÐàÕ1ro£»æF$öâôGDqÐ@*±‘ÙNÀ 2U362€öÁøL]“¹X8=wc žûCxNoÕ¸ëݪŒßuÎÂï¯tñÆù-jàcyËr¡äíS#ñ¤ ‘q;¡›OüÃRî|ˆ:)^=³ÜÛßSܨˆJ\1-&×íz56jœ»lI-.Yä½½3óu™`rD¬39iÖ§WÏ}Š^½Ú"“Sv“£ê£[k{ù,Ô×á3ð‡fÔØæÙ Ú™¦ÊøŠ%º™B¾`}ÐñOjùˆG‹ß»Âu¹ðídÂkÔrɽ÷˜+r¯ —†è7E:–ê>Îf¨ÇÌ_©SŠ&ç ÚôOÏh÷\©
-rT#ÛÕ(j­&c%Em/ŠÚ*<ÕÀÚ*Õ€ÊÃWjuím»}[j¥–-dDŽäEî¸á–íÕJ1¹÷+S˜‹Rõ…¹(ìî]^‹¼>W\ØCvš¯ÍØÒf¸ý‚™992åÇåÁäD¯ |Ž®æk o&
-µë¦lª!Zäa1ž-?’¿@‰óMSˆvïÝ"Ä2q'Úƒ›€“‰óAüÁ0eŽ~´ï/8 èú“X\gM¡ëš®Ùnq«ÒÍdv—÷¾»z÷|ŸøS1‘>½žgÇtµ,-i‚­ÅÔî<¼QöP´ ¡dkŽ‘$WÖEâ“™hŸïI2±†øÝ<Ǹ²(¤±Wë)bC>l`…ÛìŒ Å!…½ª/é\Ù r8 »·.³<ýÑÞxë¢9¯µ¥Rè_bêßb½ŽB+SPRóËŒ?ÚóÃ>7dò›l›ò²óytWÒÇ3’Ûg7Ä¥¯žˆŽZ{â÷QÆûîÃUâ°×^*`Ãþ°ŠéÜÏOÆÖ:oÖàT!{\nvÜœ=´“»27;éDn¶êy$;ó¦:rOý|öÓzßØÝìeµ—‡pé°{›úØ°hÕ=`iñÍ\‰1"šœm¢sk¶ñþ±ØÅÕa0ÆÞz´ø‚±tÚcúº`PCùˆ®góæ1¢ssýªäÊi¾œËN“ÈeàE;õžè¶ÍÑ(y_Ø™8\­PòçÐ:-ñèÖRù,6µ…O˜vðŒÎ×j*Ç/¸~l8kwXvÇe‡·óâeí npòáÁBŠÎlnT™“g‰ïâ€.ùR=äæ‡t/Wn±“\®P^eשî!ëNV÷,^it—a1”j¹BæÀÍ“J)Ó¼b^†&Säl‰7¤ DXµ,¸G”fˆ0éf!‚x$¸"?è²ûà¤,ðhbˆu©]ÑÚÖ‰’I„]»6ºFÿ”­hŽÝ$ ~gxx°º}Á´—n­ %ÔyË—›èî<me÷viõ§a†Sréuí„´×Ý7"Vw(|'s Ü‹]Všq=ý*˜ãô0u?§ ÝZ.Rò:4~ûÐ|Ï+Ó)6bÓ…ò–OæW¡}WÐ4hÄeëV Úþã¶XªÒû¤+ÍbEF”c±ÉêIvÑÖ‹€3Én¡r;ÃW§ßaì–«n£—~ãƒq²—án·LëˆÓÃÞ¡É©
-CæhG¥æpZIÙ³²VÙU`¹IpJÌìË
-Ó½-Àë»3Àt*A¸—V4Ý/àÍì Áì
-~&½ÈzTDüDK8¨ìŸ—˜;í»
-7wî¢
-CO$Q¸·RùüÀJ~ Ê­œ¢<OÓ´‰°éM€8Æ Ö3@œÀ&pJÐ|%8 €8Ë\‚d($.L›Iˆ­qÄ.Obº¶Ñ’/·Y@´üïtS¢r¬~ЬÒÓ|½}Èg~Â%<;P~=S½£Óõ=î°õÜ]#Õg@æW®•F©pE4|§3©÷
-lÏZ(CžJ,¯tãóó·kB¯2’ K&xÈ€*Ù•—. ¬jòq v Ø (Î\¤JÌ*mUyÛõ?VàÆÑYŸh‰ò–º¼LõìµíZ‰’êB@mÖùÕT,³$Úvò0’…'´8Ï€n>v€^dã?0§ö#A
-ò"B¥o¤SATD°ï;ì{½ÿƒf­]k¯ý?o™™æC$1cÔˆ1jNß@môe 6£¨½ú ¨}ª?ÿ³ÿ‹¯¶øŸMüß0Ûo[¯ÃýŸnY_£í7r ]ø_ñ“Ö£LJ:»ïo™ÿÀ÷âÝÜ¡šz¾;ç}Cš1qç,ýŠ†xïâ<üí7ዯuõ«Õ®ÝŒR[žjK+’œýGýÄ „ѯ¼üÖ¾Q¶_·í·­×7¡|ô óë>Ì\à;T¹c7có¢¯s&Å_Q?%]V<^¸!nœc‰¯œé^Þ=íµJûÄýc
-W5‰;m»$¿
-ö ~pGöÐ:µ”kK¸*O?’‹÷èYOKÕ?»Ÿ†F7ß„æ›RÃÄSuw^Wº.ºŸÆõ*ß¡êÄU4kqäºÿÁÙ}Ü®Ûi_],î¸L³Y¢<bNÏü@Ä—hO=Ó™ŽñÚcáʌȸMoª¹€ÛWå–p®ê¾t¯Ú^OuëÍ÷ÐõšzÚm7&e·Û@–îÐ;ÑÌEãÞº^e†ûZì¯n5úrƒªžŒΩ¯ç1Õ+W"jWäÌæ`÷œ0ù[ì^/þB#S…/ö/.\^¶úhjµSþ°5Ÿ—{§!vÊ# “•×3ðòöÅDpõÔçùÕ„Æ;ØÛKÜE×;¶Nì–BÍå6J>]’z¬ê‰—²sê\'PSÊu™¤zv¯‘ŸZïWcgéÅé£<ÙÂhÙlTDsþ:WL{5œ˜Øh•1Öõ¢d¬ÃºjÔ$CùâWT†®éÑÈ[.[?pä#;Z-
-R›¸^Š8l™:×I±µ®ØîÉ9g¯ÊÍ]Áù°Çí~áÁÚ`ü¬‘KkVú@—ÊS_²ËÙ”ášà L ŒšwL>c¥í?—aÖÈ%§û‹Š¥ó3*¶odº¦÷ùb~ÿ ËëÙLj¹Åh ˜aÐYœìJÛ¯óŠÿ,CdyO^õ8U‹«­´5©tÆû¤ê³ öda•Úñ¾\îÆWs‰>‰·3£vǃêæØÒNÕó%v¨«z‹¬:¿íU‹!;÷‹ù4(tõ⦠¦—OmÐäH­ÈÍŠZê\‰Ôñ8x«†›ËýÀªÉü÷õóQ9ÞŒü»?ê¼ÓŽè´YmÝçù‚;ã’·>¨Šv~kñk¿lQ™Ž‰ÚtÓi0/qYë­y.^®Ì£F¨(™>öº Ÿ*¨•¯ .kE+†OC?3UÕXØ¡2LJSźÒgÌQ¹š%$™8^|™8cw)­™î/fÙbo3¸¿+ã.Z7Âv•k?°_\Sņ¾¹lC•B‰Ý—ôudÐÇm¨ }%,J›Â Ð“ íÝko5tN´Þ>U“Ú¥Td÷Ê*¶–¥ 𼼕Õä3Ú.KñîДܞ–¬øòÐÛå½M.Ï…±(žåº+¶³ý³ØF+TŸý‹I]®núCRfÖ(ˆ–fÃ3kyÃ¥ïOB¶fMêhìÀj¬‹q»U
-_hUÚ|ªø\æJ[û‘ƒOŠ›©‹›iÇ 7+̲ ^ô9xeFÂEŽ»‹,? yPìù£‰æ}~àZG¤JÚb¦[e¯zŸšQ¨µåÚ¶XÏS7Ï»H ¶DO¸óôXPBnÁ¿ kÇæ™/ÌÇ/>å]‘ܘ'¨œ‘r¤¼Ù”9‹=.ûlO`v9À®¬ãL – MƒÙÜ›Kfó°–64KÐ3Šuê;zðDȸ³n±³v¾¦ö}Ø5[îN-TªÝ§ÚÙÌ‚0ü4/jj¼T­K#’8V¨‰ùǤöQ­AÔà¥arvf“^ÎàâI>]—ܬì8«¤Þ8vSìr·ÂYǃx–Ð ‰ÁÌeê›üˆ¡ÃÙÞËŒæ–é"Í­è)Í­Qˆö°E{àÓ]ŽÞk!õM©îPÅü"èæ¡gÉնˡåªóÚH«ò<Ó¥v'ÿ,è§ýZ!¥F7/¹*?8WœÑkÜì-{œ5´“
--]°Î4š±D#Ž™˜}'US o†Úz_³´G!ÍÝë5êÔ½÷©Àöäu“BÈ(œª¤,O¿2Åõ®’äu'”HÉ~ú ¶;¡­AW6W/úÓ¹ml•~àòæ˜æôn–iÓ3²“Òt(Ê-ÕÍ!;ÆbWpXâ\&î0m†~åzô~ OhÏ ÖtŽ˜¨Óõñ ‚SbÙ¥É[v%“ÑIpˆ§vˆ>Ìn`B›-Ó°Ë>âÍ>ê/8œÐVAhƒ7ÞËêÏ]ØrùU ²Šã&qˆºµëªÓ¬Lêu³L0¾øÎ:ºlÓGé(ݦB¶¸
-l; ã.ìäºx‡E:ókjC C‰rDÞLyAv2Õ)&7¢ÏoSD" Ll¹û2^bÕ66m-WXY·
-{NñцÜà¥ÐL®>6}¸/¬Ü[d±lË¡I}PBñúÞËndgž­½àg–Œ¹L“l42»Ò䜥Æ&š­]ì_tèòóô|>öìSsáú…Õ¨Z×m{ £-èÊ' øµÁ7ùkÄGŸ\ç¬xÙe8Õ­‘*î—qÃ-lVË:ÉS”obÙ])D—Ýöu’J Åß·]¶^Êܲ4U†3»ÝˆÎ4½Œ–á´¨œRôi—÷ÌäIù:|E«'D°iõr¿Oƒó©5Âó»æz5X×Û—x┶ÛÈ¢zËzé.Em±|QÒ¹[ ú‹9RÞ ¨ë©×$ M»ŒVÓ3YïÓ˱•Ù;›ZÆ#î~†Ûf;È©‘#[Y%XŸá§àë°B‘¾U`™ÒëéÇî4J÷¼úz_ †Ë2ô¾eâ´Fnát¯Ð/Ú7\“¹òÛ¯oW]nkÝð:¯X[¯Üì½<}%µN¼˜¼24Þ¹Å#³c|ÿ8þxNZX…îW2‡òÎ@ÄIÝ„;ÇN0nÀòᥟ­ì0Ý”eZ»úÇ8 ¢íÒ_0¥e1U†¦åTf*w@%»ÚleÂ
-ç‹_˜ô’Üzî’YLßlˆ£5æDuÃã Ÿ5VQvç-êH¨ÂVú-ÈHYNÊB¤Z*Û+z`©5;
-!¸`(+Ö|@S *L ôTF ú‹·= ÄÜ=A'óÑ`É'(ªZ µt“7e”7 ²Y¯m§ÕëS㢑À0EåÎhrfÄå^n¡ÑF‡÷ùÒªï¢áø%Ž³ž*ÖÎÉQ°z¿sË„«Á.öß õ´ §‹îtÎÉ—]l‘ 9'tWß%ˆ®€ž=!@Ï52Á\ôBp
-<ùä]äD4rš¼:5³¿âí¯‚‹°?ܯ–kIÀ÷¨àç5ðµ &×
-ÂW«ý¿½¨¾Šã_ßêÿÚÄÿ•—¿a¶_Gð·­>~¨es/.
-§›±QîWkÏ¿/«œ_ˆ¶„žã¼Aé®Áöj=ÿI<6µãI˜Ga:vQvãíν»W·øl7dkçä¹­q;8¿Ûï7hà;¸ïvþoOªÿ—uõ+…ÿÀ÷wÉdoÆJÌ_­­^º¬X¯v®_ÝÖñTÐ:‡«!÷;7ݽkärWÜ‘ñv‘‡-—í¤ï¢{­ÝÔ+½Ú›0¶â8³ ð¼´ˆèBiþð:x®^ÈÙl(d:)èâÔLÉâW­ýZWåÐH2Òÿã*›·ËŠ>\OÍ{å~¸êØ«K"³+ƽE|BXÇê\Zyé^á“› ŒED¸öüẵ¹zp›³!_mÍ °MGµ?™kîd‚Ž‚Õ¸
-÷ö£ØZÝGôê =*Ç|»eõ¯mcÔ—î¯Û7W ×ÓÐ}w¯oþêÙøûô¯0„9þ<ý[±ÁÊKu‹«]›Í{T%žO¥ÓÔ¸•Ÿt ¥ÆÄDȌ܌D =œ¦§:Á ZÈ÷¯§ô¥3Wü{vÑê©w«ÞªõVvû3½YDvö~ WU
-‰í.Ÿ¬Í6}7—O¯îv[~Ñ^ÙCƯ¯ž|ˆ iÏ9ÐZžJ³úé/6™KAy—Äy•i 2ö#VöÔ+6íefÝ™°]c§ÈF°[„ΙWXÅX¨×ØLÛ¥"Ø7 lÀ*R+YM—üHéW½ÇàzZš™}ÔÑrïÖ„VܘÔï¯aõ_ÖU´¾8ì&2\Ó}ª:Wã“– .ÍÜ´Bö¯õÓ}·¶3Q|d§ÕBH,9³íR5ð¡ù·N¾Ôö¯!Ýñ#Izž4õ4 ,šÃ’°iê°qlL,ëÖ@V.pm²‡ÖW}®·ZÍ‹µê¾³T¹wíî%%Ÿ`a9"Ü/ÿÅ|˯͚¹h6
-BgL>tµ+¦Èî;ؼ:È ølÇöõp»~Ê¿í¬×SjdsX¬å³"5E­àÚxͨ¯ê5»NìkµZìùÍ}öƒª—÷;?p•»'·| ®—•ëðv¨È0ö´54ŸµÞ«‘héTÚ*OšQ¿læz©2r¡s $ñ/¶Y^XÌR9Ób÷»å­Ü™ådH rmsŸÔüÒµœ˜»s뾯WÉݥ治WÕâ´sŠö¨#<OT%*œ8û1>‰v2+Ö{þ(Z:ö.[І¨•MZh™s¯Ø3ÑskaTó»s)îé’«…¹XßñŠî™äF÷ܬç’ø‹• z“ɪ” ‘wuºÈu¤¶÷–Eµ¤B4ÇÄmçVJ»qÍí@çV{•HÓÇv¯¤-¬¡%Çt²“ueÙ«s>õS&Æv2Æê8% ²¸fK[è–/1æSÓ½#ié¹–Ù,¶¡a¿p3ëB‡užÚsp¥´¾Þ4´ÕYh)¤œJ0Åÿb>t˜ñ<ò^—v¯DÍ«á¶ß.´:¤Ê4'û äýõ¡ÚÒQE©›UJ/Zæ¢XŒµ[ëä³3+5
-£~ج:O¯¯Åóþü*æ )¸pOáXA1(Z{Ñåäɯ¼ZAKåŽZj?e†è3¥</J¶¢cråòÖe'Í/d|z2>Ã32¾c³ßWSûq:“q»³T'õ6¿ñõßØZÃZn¼>W4Öš&glvÎøF¢jº¿îÖŠí{×+Ü­e§ ¬v#m@çZªqÙ¨c.uPKoþ®Ìtþ­Xi+£d§-RvØ™ 㧔.ÕÅ|]¢Ó‹A¾iaÛ<ÇMÓâñ¬K?°Ø×b+®<Œá¿oÏ‹q?µèôÜÖã³ov´Äz³D¢Ng¿¸ZSÇYñ=ÓÖ…ÞÒÒ^'ÔÒR×·£ÂÏGC±4TPBüÀ²ãJS™µTï×÷]/ù=¾y®~͈'† ÅÖÓ‘…kal Á†‚t]¬ùžÂ¼x-{æsïÕ5̽Ï÷+¯ñFú/Fü®=î!…nrW†Ü6høCÏ/7ª‚%ÕX$*˜ÞËxd­J<šŽ
-½ó²¢"“Ø‹iH±á:=šy‹ÚyîÄ ODáþX ×9}"[½}«O¾×b?0¯ÀÄ0rº·ôsi^™sÓÔùÁ™“ÃežÇešá‰Ëô(yõNqæ…†’êO:«z½Óˑ秵Žín‰–Zº2e#£íˤgS¼WÓÝä3óª\=ôô¼×Ãt1S¸ÁiG­LƒrrÈ÷Nö€¢=ÉÒ½uNŸÆÇ\º‰<¹)§e8ó=äØ…~ÒØ
-e5Xlw3ëže¨L0%•C‘Â>Á0µjœúb ®Ó)µz| |/³nWꇨ©9}Nc,»ýJ•N¾³-¼Ir fg;Wby· tÄ…Æ÷Y¿ÀƒA¿œ+A£j.=Ùz?0WÎlÛ\昰‹3c+E{ËâPtaÖñ bjÉPJO¡·o¤J³ÕÖ€:æÙåß7Å÷úÅ/N1ÕÊ&ËXÿ弩£€¾.Öf3oö[ýA/Hf±J»_­ófXtÀÛäÊë:'gx(@Sf¤ê±)^Âj‘/4Ú
-7y•Ë2l‘­ø|™ÅùR©…¥&C툡êç1½c2+ºñÔO4Û’ƒVžøLµ-O^¢‰M†ŠÐ%¥ìqOÜWÍ,Ñm—M¢+â~•Þ_¡¾{f§4 }»9h¥Š½öo´D(ÏŒJéä eÊÈgu%Õ=i%7‘é÷«õ )0rð±&³øü.1õßiW»—è&­PGw©–VhS¨õ)Û.ÈË&½'ÃP{÷‡Ÿ!ºó'O¨ÓÄßü;Â×p‹CeÆ&ÙW›`ÌüÆ!ûúÄ‹ 腞ȫ[Éæíö¹>ô b5hjݨ>2›rAW²Ù”Êx±¿_ÔŠb/$°ŸxŽ}…³^…ÞƒDà±B Ö¸H^ÑEJÕ]5Y¿<ò°Otïl‡Pg• þ¶ú|È=¯xñœOãÐhÄbƒ,aȾ s_X£6¿O¡4VQ,}›¢viþDçíÕ/:µ–²î£ÖØ›]W]·y?$Ÿ±jyUl+©ÍR#‹©Íå¡l”Þ&å>?2‘:[]N5*¨m$â1TEBK«
-þÞ6 |Ø8¸Î.8t¼‡ØdÈŽ0S/¯° 9=£vãPL-P?pvõ^hY²”kf¶Ôi‘q÷õW†é¥ 3h2îI»f¶œûÈ’–÷ˆšP~ÙzSÍIseÎ{õÓUÅkVµz*"2b Æ~+´²ßç%Ðçf:©”˜†³ÕÉN~'áúVÈcæ‘°L‹.  A-£öÕ©¡XÔme×江%¯Yfëð»LCh?3ÌõŽ!‡iMA| ¸öfðy-=ávˆŠp;* àó»üÀOj„O‹÷°)ë–æMR> ë✌œô€rËÛTú7h󉔖=9 ïRgÊ9¾Ð¢èY&
-»M]¼![ Wbfû˜Ë™Æ<Yر´’åˆ ÄßXa‚åá£ì¾È¥;fvœ_æ¥ôÝY×Ò]ÒC¯Æé ¸ˆ†¹M
-lrÆÊlž.ƒÔµëdó7átæM«1c™”’Fº‚#Ö]ÍÖ¨€´¼H€/ç@‚Ãö°àjÁ’A¸éR ÓÝyk”VíÝzãø*†AÒ‘ÿSF_±À<µîkb
-S³Ž¾öu©È­cdŽ­XètJUªjËûB–ÂPÀø™ßYvÛX“ƒœÔÇ*q¦‘9RTîÄE5¡B*ËÀIíÏL°útÿÁ)$H` ,7
-p†Ê<3r
- Çu;ÁØd¸ñ\ÚÿØ‚•I‚ö&ÁóÈFI°Î²©™  íp ÈŠ‘d‘Ò)‚> )1H8–<´ø7±ø¹SžN–©ŸÌöœ³Á,”CL´ ¹Ë¬
-“yˆ2+vÿ¨Äâ^Ýœ´Ý~˜;ÈGë[ã¢F±õhÎ7ÄèøXÇÆQý …ý¤ üÀß ïð~wòzQý?ªŽ°ÌÍX.Ð+êŽèsÌòg:<”ŽÙû‡Õ¨ïÞÕš¿°…0ž |w³’ñÁ:.¤’3¶¦G¯Ùʃ_«åÉzm—Â:uZDTö14¹ô\=‰ÙPl
-Ó‰2ЧÈoMl8}¯¬ùkªý¤ |µÚ¯kõ»§ÿ?æÚøWÝçñøA³ýnˆ'RÄî¢óx¯öÅ[f),¦øBÚLÙ¹ºï ³â¹-O'ùvaŠtÛÆÄzûÖx¥ûÕ11õ#7ë·FôrÚzÄz28¹·Í·[VúÒ—®y¨§>ýO·,½žÌÖ\ü·QV4wÐó7r5Ø·ÉõŸ¸†tô¸^eû+‡Zdz¿âÆ”7TÇþ¬x¬‡S$²´ï$ë—Qò Ž‡{»xœjê­mrϾtÊ¥z=1‡ôÔ›Œu‡ŠLu¡Ìu&E3ßA&¶Ù¯®*C7$6û¨MïßÓÀãÕcÀ]XKxnªþuP›øQ±üé2#CÊø×Á:´—½¯æýÕ“wPÍŽV¸Wæ=â]˜XLò„˜öå¯uµ/£ûy§ õøf'©öÛ:£zaeÇí¸ÊÎÛô–ZKmà€;òÇV ðWÿñO_zJ×+Xó=®³M«‰}¯4 ßvmº¿¬¯ü6^¯
-¦U'®Qã_ÖUW6“ÅF>µÚ"M,XD¨úIA …OůZëÀÝaÊDób/ öum<Yô¯mQõ¥»fxê[´›ÃdÝ„¦b³afs­²Ô:®MÈýúÊÕ&õ*S]ÕbßÛ×èËð^õ¤ü;AЕëXV+‘±ríÇÂZØaàÖ;¾hÿÁnØ{·:îN*ø¤88—Ël
-×Ù /Èè†ÕkXÑ4Š/«ÃfÃÿU»M”ÉÈ<+fé‰)zoÉ‹Ì}%/XÿùS(á Z µŽ}=ëíÜl'ø€²îªA^jœu_Tºü0´JÕ~ÍÄêK»ŸÕ²î5?ëÊâé-4‹bµ¢­ÑמŠ3Ñz¯ÖRNw«ŽˆÙIM»Ë»2•ß’ ˜¼pŒœŒÅaAªÉ÷ºD¾*ÃüvŽy–¬eÄÃ]7Ä#Ò\ˆþ¾ñ‹G†zŒÝõFík=ÜeF«sÚä›åz„×™£øpäê}m cl|E÷Ϫ^è´†­À˜EuÔ÷lNu¥\¶äÅ~É/ʸöžKµÑ;©“%Ê ùÆœ»åYÏM‹ÇÜœùö#/´’%äç»÷+[^¹ÜÓ¹W´.æ^Ó÷,÷šÕÏ_ð*^†çå+ê–ï×F»U9”ý¢¸‘øcHU/E-yòÛ£Î%6×¹¨_ÊA…z¡;}«*Üψre7ÊKu¡IÔpmä›ém%ÏNŸ ±Å¥‘?‘]áÈc!í%Ÿ{¾[^ÝyÍ ¹A ³¹¢¸Ò¹ñLH®>gXË9‡ä*/vvÉK¬51ì<ÿb L6Q‡àöÍ JmélÔú>ÑN7.CVùuÙÑpTì0JCƒÞPQvÖg>߬*9Q`ád%.„­¬,H¯óÝIÁæU³RϽ3íV®è÷;9ˆßŽ¹ñ¬8c"Ÿ8ÄlÖ:è*S…æu†Ø:n¼n´«îxÚ-¤»´[Yè¸ÿ"™ÅŠÌ²ÑÃØkõê‡JÓ. õ\.ÎUÞ);ÃÔ±ÔÊO&_{­²¨¢F~ŸrBļ^ÝŒÙÜ 9È›)œ 6:‡Œ.;7à:k#l‹E÷夆aV^gÆ`½¥ã ù Ýz-K3Ò3Oy}Ó¡r4$ÏDx"ƒ›Ãb·Ý&ƒ‡¹%Ï’·ÿ¢gôgÝЫžZ- ݪêë¢ÿ6DÓ£jÆCþúëá=žkc¿Ñ–7$g‰çîV࿤8Ó.R¬]ã£T©6‹
-CrŽNÇïA…v‡›ÍÔR!u øåÝý •ë®/dÃaR\û9âb!?¢îŒ?Òï;÷ƒB ž™®™-¡`ò®kãã^;Ø®Z~z~®¹Ûå˨vj{Ñžº[Âd‚Ò£øØ=Vêœït¤ÝVu„» ä\ú2#™u %è­rúø`™Áž¡|è$P¹É[!Ï Î ÛlÑ!ÅWè·å®GtªÙ9¡ˆ•#þ¼mRx¦°x
-•°ÑY°Rû±EgÈEg™KƒË‹%Vš-6º§·j8è'3ò­³o{eïéºl
-ÇJžŒ8„À!>—Å)“¬øÐÙƒ¤PT#¹ì
-ÈRÖY»z–¨ +™8ÿð3õG²¦{õ%²·/WÄËY„»ÜøùM8P˜,fo)XÄÐ2,‚Ë
-… |êWâö%Žüñà‘Ü•ú… j‘^qÿø€¢¨?j0¦Y^x“›E{-*;ª—Ëæâ}ˆj*Ñ{$–Áu,K¼×ÙL<ÜâW¿1†"óÈ~'¯Yµ7lÀ§÷;¹_à`$Ía±6>Ãb]Ȥ£ý Ÿ–}¾= ·)¤MܤM=êÃazJÔ&-‡ù8¸¯»o.¼î~£EÕ§Øö~]ÀÞÒ”u­Ä’êÊÛ¼¤
-œq€À)†R¥<Ç¥Ò÷ ÊZ¡²àùÑ.²©g”u¢ ;Ó`¹ú¶Lîbìæ6^¿
-¶Ö¯ø¼Œ
-:58•ô!(/ËÕ]n^Í®;IŠ¾QÂÐt‘Ï4%ƒCò€¥»ÙñC¢AB…¸ŸƒRîZN•´‘‚dÌŠf
-`z. °QLþL*,
-ðUô9
-¾š›
- V§ Öã Æ ˆ(ù y§%Ó€P«‚+Ö”û·ÅÜ¿\À¸Â5¥Îvªó•Q‘còý4BdÍö9믊 øÅ»ƒä~)ûÁç¿MÝ£r©ÊÉú òQ‚R/Ac”`º
-À”}~
-8”úøÆ9t=V½.•c.`o© `ï0 ؽÖþF8|VúϒΚ[õ
-ö9–Êî™îÕ‚“:ƒã©´]…9s?DØM8H›•ÿ7ö«‰þZW?­§¾bèÿÚ¿ÿo|ååÁꘫÜ!›n^ç]œ48ÓÑuzj>«cÚLJ«±?¤ùþ²Øç^]ßÀnHÝàÔ|&Uß ntlÝÓâ†<µµ›&í•—ÕZË€˜/`_™ö9ðMAø•C…Kˆüé?õ‡y›d“ÅÒŠ¡RçúÎ|<½½u¸êw~¯.7ÊrÇzl]êåu¬qöj_B«+n†6–Š¶×*.¤-Ò›÷Xd4{·Ù¬x%6Ó‰,œ¦HßxMìTW‘ 7rqÈîë—dFzÌ,õ7mà×¼Š,¹Ëw'ÿìµç8WHÎNјì†8´Ø¬Dm¶ÚÓ«e€<÷ i}¾ÎÞÍí{:ÇéÉ\ t0H®Ë˜˜´˜‘›iæFô¢+ =<T§z¨zlõ¯Þ²Þ—λVO½{Ý¡–]t¡QáÔ1áA:²1JŠÐ<üÛ(ëkbýæ¯~…Ñ?é ßôÚ×Ù,þ%‡>ªª5ð§Êíõj£¸äyC­Fƒ€¬ûkÏz=Á\w‡²¼íB}ùØ1SòµƒŒõgd#®ìV±
-ÖŽk5ú³³~×›[¸®ø×n:ð¥·>õzz|m¾g{µ9´ÃvZ·:_|]«.z¼úWks8¤ =ÚQÍ]H+NŸQÑSþ׺ÚSÏ-îîBÝd:œëª®ÊªÑŽ©ì]Á ¸ƒÔj¼ù×PèùÒƒz=ûøW¥esX’â&4S 5îî¼ê¥]t;!ëUö!Õâ@²kômU=µ”ÔÉÎiTú¯yµYã«yíµ³!3TÆÄ°A„M ùZW#¢m‹_­SÓ~$V¯§”ñæ°X SáÈ¢ »6^(üÀõU2׉½bÕb¯T­ÑçR£êåK-çÔ-wœ@m+×áhe?¦‹£­%dkX-P´Ê“¦Ù.#gëiÎC4gÚÂÿbÒ¦*¬ýÙðF=ùtzOº•í úÒŽm{Û
-ØÑÜS“j§1)½Ö.ºšmkq#<V÷­æµÊ][/GxºP%*¸™ŠœŠ»gDŒõž9kh% Z'«“šæ¼9¯üÀ&z:yF5ôJqW]–\uvÓ÷#Õsp¨Oóþ¨Tª¯ëlQÄG™/:ß×ÆóR_Tøh sÙÀ÷®7ïéL?ƒ³¢úÊy„Uw“•¸#<ÄŽýakX¾Ëç0/#ñycÚÌyo¢Gp1ªø4q|¾K®œ…õ}?‹ê^§‹§±"E$YEvÛÖëmKÓhr¢¾÷½³:ôs˜
-]®f²ŸD÷…2é4î1µÒƒú ézgžá…6ç¼QïuŸÜåCc]ÛžŒ¾#†éš­¥óvÙÄw¶‰î»ŽAœ[n‰¾×}{[añ4lö‹bº9þ Q¹9/ÈÙîFë9áNÓˆÙEºË§ª3d -„P« ȶ\/ÉèóîKÕba*‘Ðᚧm&ïZà ïÚê*³Í3X1Ó-«Þve#ܦ¨üÜ’Ý7ñ†@‡åänaѾ5FÏ®Y)lô£_“‹3°åBdæT­W!uõ½!˪N3Ueâ1 Å̉-9ëÙÎë½»3©ªzë|¼ónõúúÅýAE¯ë Â}XB°v"þ–Å|ôgxy±­òò«7IpZ1MÉífVb¹ÍÓ¸ìúÊ­‰‹T5x4¶. #s•Þ6Kì¾¥îÙ@üÕ‘¶Î)æ¬ÀÊöŠç¥µXP$²S(æ·J¥œg–ªxp:MѶ‘pŽ¶}¡­€[’1ßqÌkîyí§sýNšÍ¥²®ÁVP›ƒÉúŠÞ…4[î}öX±å9J /ØY¦ºì÷ ¨Õ¦™rëîájsVDØ:;ÝÂŽb·ÏVfBO F9´ŠšZêªñreW óh†‹~?$…K*d…¼Ñù;2SyÅÛ”~àÜ+w¯äúØÍ¥¤l‹#…>Wšûsv†vlyžÌR*áLåqPéMÅlÒuü1£©x¨]çX¦©ûtà<¥ë˜õF¢6ÌößUh8$÷ׄò-[)æ÷2nJ ý¼¼…­=°;#‹ùÝ;‹
-!¯"¹WóŠä
-§ÊÅ+Å•îPŽ©PžµP®ÀfWÅ2³¬ÖkŒCZô¦sÐu_ÒÔ»rþ©fuS¥d«»uHA³‡ÄçîD‹ÄU,ôH!èLH¡ê»xíÖ‘t|hÄênqb5R3¸m¬×O“Î믽ösmUƒ*E$gì-!‡¤Ý›}‰)f¹´³ AؽIÊmšf‘Ú=WªÙ¿–)Ρ]òDXٺΦ¤Ð÷D”uR„´¼sxO¬Y¸zÏô°wwuƆöCÁÞ‹KøãZ6?ú¢ã4^päj¿áŒ)IÎ%Ik>ºÃË„»br«ÔòýèJ ?(2OçÒ
-1΋{ÑtxzQÍÇ!Eq½g† À'… “Ìbĵ.ç‰HòtBzÌü±€Zx¯¢qÇ8€¨ÿµ÷ZS]I·6¯ /"÷Þ"„á½÷ÞÃI_}äZ5WU×îg÷ó÷<xS(E*H"bÌ¡ñ½h×k
-4JòYÊ«MZ¡ûrŽÕuŠÈÖj”7z ¨ñ5ñ[­¯öDèben¤rUn{[â–§›$š9=§ÇÔ@wFvÐyÅFMdÔÞ6#ËÄLÀ„ha¾¹zÜ}°×sëÍZFaº±åÇG5Ðb’œÃ<í6ÆÍ"]ÊÛ§—Oo?9O%Y’­ÓÄÊËÕ‰¢$îî¤ÈDQ1cbOû$½ß šûå»^s6bT¡ï©|ñüÌ;…áÒ•s«‘AdâëšB¹pjmb¦®_ÕS^MësS*ì8¶ä«öb­Utgœ©õ ‡”þ¦Ñz
-£&z¦¼[C¤rèÍ¢ˆ)!ç¿DÒïA‹X ÞS¢X,]žSøvßtðrÏ®ãRê¹Áªã-‡KE!ÆËÃ&œ‰4•Þ¬[z¥\œæ
-Ec^Jÿånæh÷N2'‡¶V´/tôVM.*cýéˆkxyr—š˜T£õ¤&KúN‘ú$ç[!I"‰Õ+Ãÿ`D±_Õ>=Oá;Ž Â^¾í'¸Ô1OXšX’˜zaªè¥¹Z¡M«M¢—ö¾ˆ©÷Ê
-;æšQ°ã¸ç`5ïìcš¤× ÆcôòŽ¨é~þ¿y`‚‰tv»râ­d¦‰·j£‰·æç‘dˆ·‘ÎÒì×Û;ªçE¯Éùv&ç뼟_OnNÄô[ª ÉÀÀáðMxNµÞqÚ黕ãÏÎ]c2&0ÊçO|ooØIÞ±ÚeþÆ´æôâW/£¢-¢á æá\@ºQE’Wox³mÂ%õcà[­
-1¢!^2 ÆhçœèW!ÂÄã
-žcoþíéÃE!ŒT‚ r:ÄÄB!ÂÄi(4{xP€¼7@>Ru@ˆ-Ä“äR€­^_e¹²
-ƒù©…Ç$L•Þ¯ø¸ê”Ü´è¥í7âô>*<åÕi¸ !Ûe&Q"·îËÅõæ[C†Å'­AÚ*²ðŽY
-˜ÅÿZ¿Ñ_ðßiÀ_0ŸF¯&YJ1·aÛð_ ^¢áÍXJ
-ÿÀ÷ÖÏ]špi=*A«¯à6|"7ùh°›Õp[
-€tv7Ljj çGSV«½Ë“¦C6Ë[ËÆâŸ`ù¦7|ã?©»_ô?‚þ#÷k|ýÆßf«Ð6¢tdP:ªÍÎ#
-Tÿ,æ…¶Wª´:ž…Fõv¬½Çþ‘c‘Ý;è-ŸøÕ&IËuµE´¬y‹YW$Üé»Jä¦é Z˜"MºôƒM²:Ï®9¦†bobÖt¸ÉûÛÁ>Œ®y»ÂûÚ Nè[ú¸Ô}tF‡oÐÀ×Yûëêç™þd |¤ÆãÉ;e²~°up=´–ò(מ·h¾7KîÈÉ©½–ãüs½…‰ÅyáÓÇ ¦;ïþ©ØEûÚ®Eô®•Ó3O¡ÛÕ»r7y[šôkì´Çé¥×ÆÇ×RË'ÙVsd§?X“ÝŒN áÈRõX—¢ßxOe¬êµ_žüZW]ºßù-æõ±×~Ÿäÿ79ÔµF! Rƒ˜ì¥úÚ¦êõÌC5ì&/Õ¸ƒts¬íb¯åc™as™ÏL›!U\56aaÛ¶¹C=–2çº|,?ku­’¨^[ªj>§bÜMÝíÊÀ#ódž«—=f;fÑŒ|i”–µM\
-µqåëZýÁÂ}O áçˬ¾zò·Ž×©†æWýc]mãýÕ\zu¶1¾XO«Õ×®¶ Ç''ßNP¸NTA&V\çÜF_¸w”u¥eäNJìÁ_#µ~
-÷ÍÙ;”ŸpSO9f¡•müÇ\ùÝ `¾1«ÿ°®ºâÈþ¶ðk¯çï7¥*,Ènòty­«ÕzåìjÚ ã®5<UÜDùZöðâ+òé
-åÜ8PcϱzvYÅÚ™MãÕÏ÷×ØÝwÉ…«
-‰ç)ÔÂÎÄï›n-GÚj>S¦zºÐ’ó˜M¤ä X”íq%£Ùø)cý`–¯gRæ²Éšì+•76ýBшÒÕXß« =ö†=í4ŸO49¬Õ놻ª–˜Ã”nu"+Ž¦çä÷uÙ’];¹•ÝdI‘Q`D½Î=Ljàü¥ÅUsv­­g¥
-1Sðâ! ®…î¤?ÏÍ·™XÒO7Ñ“é$ðgŒ6—›
-alz¡ïG,­+8ËkuŸ’4–uõzÎ:ªed3ÊkŠ“ï”0ÈGØ”úk(£™ÔFò¦»8WŒèŸ«ŽH7éX(âã…ÀÍ[¤Àû¾À½ö]´âç‡KΩ¦ÚY¥ÌÄ66ÄÖwk/\ù·î1áæ¼¥½mçégòÁ×ΫwB½Uº@y†~BqàtZí+gÈ®(£‹™&åØ™%×GFœ·Ù@¤_rEX-*]gG3~{ã/¼dWîHñ6§†íèc/¼>e{cë±ç¢Á^¬c³=_º~ýR*¤ã¬]Ò¿%Ñ‚ûÆùi2±Ï–­Á×^›/Þi‹mLD½æ ÕÞž2f=®R®º‡ÝrÙ|f|Œ¹E„5(¡8§y~ÇÐ2_^ë&/•|—«>Z§v÷5¶™À¬±®ì˜{„ Œý¬iô«Ï‡téĤ ÓüÞ£ÓB²J÷KùZkízAíþȹ?X%¿Œ’< ùÂÛK!yJæO™cc3ùc¯5ÅÌYÕÌCS*¦~ø™uä+´ræŽEåÎÕø`/•Æ6åÍï¡ÌÜ‹édˆìÆ$y¿L÷+Ýv¨5*›ErºïäÈ|Õè’”Æ=HÊuÓd~ð¨ÓÓ»ÒÜmÝ°–œ³åe­bëÅX,¸VÏ…”}ÍhÅÇ<•˜W6&ýÌPq`¨Ýçš–fõÒ](­ëNãVÖ”Ú[æ~™¤Ö»Ð¯ëêE÷Ç/ŒNçx–F¤œJŽ½•í?
-w­™ßv§$Ua¯Dð°;LfðMæÞúÁðH8\ñHB“ø¦<.ìvSiÊe·ø›Á¥›Éðf´äêõ(oó.<ÜV–Z9Ùù¼c•Ü Ô›¸’T†½ 'ÑõÑ››­ó(×ô
-lgljšG÷_U×Ø;®159ýÌ÷Õüë„^hæ6VI55¹k ±g˜›xù™R"užt‰¦¸™G/°ž¥¬DÇ%À†pˆ ç9€5ATK ~õ7ãrÃü
-p«eÜÎV.óp’›«D
-“;@¹› 2
-¨¬Z”æ€W Èlõû2ÿ(½À8FGI›‡¯Y}ôõç…(Õø-àÆÊEݸ(ùg¡É\&,V4È:ãFºä  0Pƒôè_Ð×! èÍJôø |MÁ ök .‹iˆ(€85
-èt} h݃ŒŠ€Æ‡oÈD©ÙO®B$žÍ
-ÔÝ{õßHã‡VΪÛßgy<´…KòŠ;sH<šR¥×À›»Lˆ"bà6逕}í/P.l÷ÛÓsŠ>ánb–ÌrïfÅV *=À /+ÀŒ
-p:7Nðçð¸÷q»mÀT„3`òo0)¬
-M|ÍÀEG v×CÖùè­LÜ¡Ü©&Å—Õ‡f_‘ˈ‚ñÎq{¦¹NvŠ·\u©p%3ûÅGƒm¦½¿VdåÌ_0eøÒÌ jps¡C¬›€¥ Dû
-.Yrÿºã7
-ä[ @“@¾Ã›¾‚+3 
-­6ÐÊÙÐ*´Ë­ŠÎ€V#H Õqø²È¯’‡Fqn`ªÐ‘ÕÃ!âòåZ†4ááüÿúC ýÖ}ûX€¿ûþZ€ÿˆÅ_Ÿï÷?3þ%Ý~âþU± ˜F¿Ì,¿fóŽs¼úäôšÛq ˜÷é ˜û© Ì^» Ì~tú”Ðo¢í·¬×Õþ;aT»¿³‹Þñ“ëŒï,®T¥¿½§Ñé¼Ñû×ì,´ûÏSåÕÇSº‹µq—:\½¥p0ç{mßeÎîQùRÊ[¼™í­CPÛ®"¼$ÿ¦ ü+öû8ÿ¯uõßëOý‡Û–FoÙÅ¿RÑA=oÔ•}’»½Ìáš©úû.•+îÒ[µ¼ÍùÚ&M4ÖlwÝZE`Ñ]î3‹áRžN'‹:µXίá-¶x,³®L!Óô §'c;­OðþÔS“ò|RòÛ¼Á¾Ì0ßæýZW?>Ñÿ´×~¼¡çÒY]µþn·O΃ýv,hç Õ@î?ØrŸ¼Ú¼ˆÎ¥9}Ç;E’øwÉ,ÞSÆ…(™±ÉF¤TìõS2K­÷µC¦ßk©ÕE·kNÎwÄ;nb˜l½åäÛ®ìûã«Öþj¢ÿ2¯~åÐoó¾rè7m`qÊ\Š³.WŠ¦HM®ŒgÕ…àÝ
-ÓÓh
-…BqçŠEᜫ„±Qh§N¹hïö´ÐrW;ÿ1EŸù÷Ò óƒpnç‘ç<¥ôüƬ~ž¬o
-Ú/¨ûCù¶ñk¯
-‰í>b6ÑξÌë׺Z½ÖŠ“Ê»'-Êv\FÔ²¿.nÊ¥]Q8VΡ| îAÝŠ@áÚ‹°‚•I¿›õ™Ö‡Çb~àGJYEFn\„“|7ð<_^³ËúµžeïÂ(#¼ó{7v7ˆ«`y=]÷ífZg¼××°šº®øß|Ýa¤„®Cã‰5Ú?Ûó"îZØ
-,¿¨ Âî`³‹Ø‘1÷“Þ9*\¤yXm=Zþ³2rãB`fCy£º±êiuç1»É÷jk'‘Ýб=y˜±ñÓÊ·|}ZÔíPùÁÌÐ>ÔMöõìQú90D”›ëqNßi§…wÓt¶©×-ª¨–æ”Ç i+Ýz¯8ÆT•ßvâÙÿ¢—´v‹m,¤šùì|Ý‹{A…óýB§z‚?׳¼8é³m N×O‘°e ÊšÕ¦”¹l5cÓ 8CL’¾Õt]Á+–všuÒšN7³êu5 T‹_”•ÇîÒP%Ñ— i!»FùüƒIãΓ`hâl¸*ˆ~Öˆ4a¾Dš 2Ârq©~Ñ[§O§JÆtÞâ×o¥1—E›kGnÍɧ—¦Hö¤!áfØR߆Ïj=-=Õë2ýV-ÎA”nÙ!GòyPóÙÕ"U·"Sò¬nZœõÆyÑO]ËÂrLµ…ÐËÏøÍ|zæ£À¤¸ýf‘äâr&æ™Û°§³"±gpÊÁ™ø9mÚë9uƒšj•ÉzÌ–Êí^"°•ÂñöZó\ó’YOT,¦Czµ—x¨mÙ¼(N4;ÊnÊ?H^Ö:‰³™~}ß…¡”Q!l”ÉLà2¦s•càpE÷9eUÙsf?duøÝÏÜâ%ÆXÓ Ÿ£{D÷¼á‚N‘sŽNɾK§’³ Å=‡éš=XåEvÆkÒ-¤ÎÕË×\ ¯åõüÛ^+º†±§xZ3¼¥%\ü(Î×ÎVXUnk~×¼¸íí¸C{{áªöíÉžû÷ÛyŠ58[`Úí¢ÁØö$C¿(8IO…N‡ÞfplIe:N‚œ¼7*™æ’ÌJSb!Ú4Ä3E’e+ß”ª“L5ÍMÍ2kž¤ðJn ´Þ½’WZ»·Øu2Æ"´ÂgœÔOKƒS“#ì-M[ûPÂix&sj95ýœã3æÎ2 ¦½Q·ôKTtï™»Ó©^-A’ʬ/…E¼Mæ™<IVçu"@ÄÁl6O|]ö%8v¢
-8Úqþ‚Ñ“^RŸÞÖÐÃl<º­í(ÂJh¾žô_1»­é>}{ÃäÔx•ÍíaÖõSUVÜ’†ŠËrâ+çœ5^üˆN=úCj¤”†Ö&ä4ÓY‘ylº'Éé~ï ŸJ’eæÜ×ðõËâ¥l!Æü<Æ*UÿŠUjÉÚÒCkíl­M;(z«&›ól½¹žçb|rtJû¢Ý%ÊægÉÆÞú˜NžâÉ–Ì—ÔšYß9­}šëò¤"WNÞ¹ÓLY3É…4¢p:ß#íw‡’HŸ`)yŠ¯—é5^ª×N».‰í±¼ŒUv;“c)BOÎdˆÖ¼ö‘kéÀ -1rÕBÌS æ™Ñ‘k<ôjÒ<_ñË÷tIéQFàœ!Ox,«´±kPË…½,ZƉd êëô´åÜzÁ}ìäBëÈ
-2ëÁ`¥Ù`[%ï
-Õcá×|FhÝuŠïøž€˜u¶µÓ™ïÃod”¸{!åГ.ÛéÁ6¸"=\ÝoÒÙ
-¸µ™.0)ím?·cgËÖÌ$úÌ)¥bEçß M}+·ámz…ägîð/Ço{Øþ«rÛÿ˜Þ
-ä´\²+m€œ1 ›­Nz–̬ë5ÝÒü%QÛÉQŠYí  k),F—ßýýêÅ_©ø«_¯:ú'©á¿f6$ÿûCnåõ1ßVS
-€qÙÎþÁö›mñ_uô› dïï¬V¼i¡zÍï¨ö…­=úçÒõý‰8ͧÔi}ÔFûÝ¡…oŽû‡¿¹î“«Ís7à·‰R9“Ûìü¬6é[jÃ&-NßýÁÚ6Dæ-Yv¾ißdØïãü¿rè'Ýô¿5ô«7Þð ˆ\‚ž…&IONB<˜“£¾°}{‹Wó©uð`ÝOìàš]ÆèÕ_œr§p¡-öѼÅnâÙ#Ú4fÉæ3¨§Ñdlî缇ÆÔˆzŒØ™E#z` ö¥t<…ûo/óa"ßÆ}çÿZWÿ©'ßÓ“èþ­Eu¬½šÓÝÛŒ739š¬J/tº”G·ÕÜ\õvÓw¥zžŒõÜ}<³SïÑ2m¢—ÌÒ˜Á¾ óy-HýºÀª½k,Às¬gž…T·k˜ùλ“/wÒïN§=vóÖ,Ï\ZÔ²Ï6C~UûÊ´Hq7ß _Môc]ý£'÷•C—òpçϺ’žd/Ýì6Z:Ž7Œ0%ÈK"ê]£g­ÛUíλy†cÅîjÜöÀ
-î43_µ¨édÛ\æWÇ&»\]·z6„í©ÇÒ‹ªêŒT½¶U»j¾Š~ì Ãzeã?XYªìñxô+Ôú2Rûæ®~­«—¥ÐÛÿÊ*=âWÈ-“é×úˆ³Ti¿éÖ,½d›Ko&5"¦«×c¡•¬Õ•Ø­^qÞã î&£Rœ|×ãÊÀ­7*È$n—ǹ/º“ÈgÇ«Ò2Ú‹›êéY®"ÆVdõÔÒ/\ÇÁ¨`‘Ö,U÷‹XWt·ó—žü Cìs$ó•CsW#ÚÛÕê2q¬š×í©òîõ®åq¶øˆf~ˆ¨Ué_Ñ«%¡(œJJëœÚy+¨Û¥TáÚ‡³` )ù?<‘úåü{Þoä]f=È#r“ù§ç«k.»l¥2Yö®2›Çü®~àî'
-ûm᯽ö…€´K÷fˆw÷_ëjåÝÝõÊø4€ãäRȱƒp_]‚ºÙZlëc¯}«òƒ||Î#Ëøžó¸è•Ã· Äó¥áQÇ!› µ¡˜Ù´&ZFxn7N=óéÓX©¦u"¥Z…ëÑyl|ò£Ž–“¹¯yõë[ýƒoÂn¿Îô‰öØÎÞÂJYþ3F¿A!;¨§Æ9ðƒj1?ÈÙ¥œÇb‘Gíw•l¨ìê™Mc×Î÷<7NîÆ®ü¾ÌÓu÷¸JëèkŸjåî'ç±xÝnÈ&’ï­F%])+ÙãZ3iã×Khùvªg.ûpºUÆä°}ÃØÌj»?܉ÚÉÐYx,íØ|V­×sS&ŒZ·‰n©p픽üÀ[$=_­Ì¦~Mº±ÝM¦uÄsR¡§nÁÊ%ßk½”Ü(‰ìØÇ^ÃÆÏ^Çš5¢áßOò××?˜É¾g'#rO/}?¥)]¡|]«‡_Óù|OmU^'µUµÕÒ¸„7þ¢g×2J‹é°d­I?,šlŠ;ª2(Ü.nœwÛ 7»¬ldwßV¸OâAvÂ9]ä“ÈNâmü„‰u½Èfh]t“}¾l#JÝS†ˆ`ž{ _W¦¤Õ |U½®Õ¶Ú*åFÊc_])Ž2¿Èƒ&‰Ë®ÙÐ¥q $/5¹´î|q6U_t²¯4*KŠŽØé‡í!ÔôÒÈOt¹Ø+ôž[u—ZÊÊV‰$²Ë×ò Ø$6¡ï‡û„všM§º¸Ú
-»Ÿ
-S7æ•ny,+Ž´ÔåAmiË®vÍHãÖ» y¶‹³~º#ÒHm&,Ç÷³À‘Y’ß,î6…ðÜ ·ßÇ*·?h!„Yl-S˜Z»Þp¶âUž‰¬xH¬N…n»9ËÍ«‘Ù]1?u/ÏŒd&n3Ý/<aóòG­žNªÅžNòûP?Ê®_¤q3ºKžY‹³n}§G
-ËáÂÌVá7Ó³ÅG> ïÉÜ~¥9…›ìiwš³õ8{g®çÏ´š¥,cYj±ì"N?Þ´ ádšÑÓ«=çË @±ð<:_ý¡=Zz+:î~íµÎÛ¾&mòÜæŒò&÷þÁ4ÃŽ
-ðâµ4nÜæâ¬3_ËOa-¯ù(WÜñ"Y=qqP½q
-Û{³õhŠ³ºxá˜ë‘ÑK³ÓôãÚ.ÒŽuëPï—¿¡Üô ¡P´nã©VþÁHÏOI¯* ¤×kÛªIšñðH‰Qñ,’Áݳ/ÛìvÕ¤oQ®â åZìp%鵨‚(¯Jö$MžÑJ(&'3^ló#N)¬l½Yë3pl=ùÁ˜Öl´`,½¥»çã‰všØ“â2F¹ûŠ@¡ñÚ"s Æ'‰Q¹AD°$èCà«š®áEíZ¹Û}óØNÏ„Œ]oÌ0+Æú‚ü[¹-iq°Çòù$sÌJ«ý$mGíz’XÊž€¦µ¬¡ ré*.ªáŠ—êÅkŽ}ú¹Ïvh8OjSà գÐ;"'mNæ’ÁŽ$ÞÍ 1_žÃ#4¾ºçõ /vÎ;R +¯†s¬¼.
-¢hñ:ûèoHÏÔo„@¤–˜º«»uíƒLÉj Û
-°yhl‘„ëê`|Ùx–~°hש‹ðä*ÆÙ|6·™´ìÌuß“Ò®4%¿Y»ÆÕÒW*ŽŒZb…Ò}öe š$Æ !.Ã'¦÷†GPÓ9À_ìàG.-ÌÀûæàµìþ£ÁÖ:7ˆ
-ðz’‡˜Ú
-b¡
-ÑdõÔHÛ[fÎ=O&]zü¤-´BÌ‘h‘Lü‚zÜÞ€Ú^€šÝáËÞ's¢ÊP*û9–BAX¥
-îMoøþ<”C tô5Äà„®Î!Þ§PíÀßÖŠŸÿåÂœ „ŒW‚\€ ®3Ù{››§XtÔ2“E=PJçµÍR.÷­Ü†½·µ]"ôà 3âè/wïH·ßàÝ¿Ã>é 2¾¿úâ«ïþIç§oc¸ñÂÔ .–Ã1†ÑH£8¤qm
-ë~YÝÝ«mm½Ð°ç\+@€¢cúCiÖö!jö—_o–åÇÀh1˜&©+QBR\(Rº*†OYÉêô8~¤á¢zØ´
-Ĭv
-Ùkçá «¤6vÇ 9ìCÇ©#¢þEPÆ`Fc”Ó<$ôa ääpuÎ J×Úd¨B„ûÙ ÑØ‚¢ÚX@A¡ËzìáuŸpnPÿ*Ž8–8ü!„cc…×gCÆ ¨³ÙÒ»L® K[Â~+ü¹¼%g›üȘº”âÞo°^ÃÌrÕJÓS(•‰ÚŽ½ÞŠÂçN TÎϱ¦fÕ;ˆÍ®ìÁ NœšÕ¼ g‘”çidœŽšîøÓ¶<¼ùñ¯Gý¿Pþ^PcêÛÕ31Ýk”ët-—(ÃÅMp,ÍÔ+ž7±¯–¶î°Aþä³±\ze´êC…n>!¦Ìë$šÑdð©?ªs Uôµ†:¤st9fVTû<}j± ͬè/¦˜B…Ǭ
-VØJIIÙF£0lpà·6³BÁda×Ák„]•iˆÂæ½} ü©yšbe´Û¦Õ*¡Ä59ä·NúsÑ¡˜úúPëT2Ûþ¤~ õMøÆ8(§I
-œŸÃ+ˆ¥ˆµò¨nRc%eÜODûµe»êÖH%
-ºâÉZPÞ”ÖçTx¿Ìø{òÑ/”ÿP°ö° W%C¾Á˜Çœ_v{dm2zsm@¼#¾$?¬Y’­Úß‚áuûL_ |#—϶mû\ŸÏbÝó'Ò‹d'/÷œËöùJKH#;ì¿ëd£0”FÏðl•å
-4­JR7R®Øâ°Úþ&9”ÃAÅðgpQ73ã–ЋU†?Õúr¬ìpç¹·'Ô1=3-­Ng"õ¢,WèÃqFkàí±c­Õ®ŽÔ‹º‹{=X—ÚΡ¤bI¸ž±}³1-ݨs𧎤•í«ÔÐ3©Æáv£Që+°+×QBV*“í½qž”!¯5<ï*§ÓÉÔ£_ÌÃXDÐ'ûâ›_(oƒ‚}}zGl­âöáÔë5Ù’MãÒôÚÞ¢
-ˆö~fz¿‡U¨|qí°1`h.f„è²%h-o …@ùÐ8oOŒ‰#™õ£õ TL‹ uâA?­³x¡lºè:rŽõèJpXØ*…)Y¼AC÷ˆ|dGû7ã:[•pT©Tlm·ºÙ“R”# ‘¼âôŽåêE!p0q³~ZIê“bdçÚ}¬@¤½ ÀÜn/­ó
-Tù Lö&Ø^j`¥ý’‰i€*¿äé8-.TÕv¸•,N §’·Ù«”vw’­ÙVvB?ê'b Ñ…©¾BøP¥ªÖ–€*qäË´¬¬ëþ‹Ì–ê9°ÝصxØF—,|ÌŒ¥Õ‹ž¡`ïKm
-ý]«KõÖšåÊÄË)99ʯr]Â
-5,Fv¦ð
-L2kIÝG;dšq_ÚRÊEšx®h$tŸa;Ó&z¤ñI­“$3ÞvÇDM*ÉLù«±™û!R»ãÈDÑà°QÕÌÎô±×¦µ5©÷hã–uh]Z +ûªq ;&$Óz®êòÜe°ÀjˆÓZÉlQMºù•Àòž“jïÆr•†·=—cbn;þ'Pú/”ÿy¡ì½‘^¤¿7ì[e+óuZÔ<ùt¨ê_ÍXÕ¨zÛ¤ï¶h>eæô&·ÓæI™|í±gÉm… ¯Úû„
-sÖ?ð³¯Õ0-¹#±Òf0»¢¾ýðeÈ/“ëQ I8E#ʪI6z•ä}jêrè “7æy¶íÝĆéŬõjd
-n‡"îåº óh2Å?Q¡¿D©I†#Û|¹ç¾»ÍU/}ëºÍo0˜÷›ÇÅ@–_Ïk«zöa+ß2¯àؽ†”¯ûÆ?˜¡üBùç@©}š_çÒ¸ÖP~çëÕ±AÖ?ZúÌA‰:·F@^µ.\¶”ÔéðH÷:çVjUpW¿<Ö4Ÿu‹—äÍ*rç'[ä6\&mÐ=ò"ÝOgù\98ï1¯™ãÞ:x'Q Æs êý-4Œà™Vd3VºÃscgÛòEHc \“ûžG*çÁ ^’ÎkIßj—~K”ÍR%r·Sp½(ÛÆfß5Ñÿ ú…ò å
-ñáì(ÊÝ|èÚÆTwC]>vÛ]¤Sî[êŠR=ˆµrAéfQwŒ’P2Ššk‰û|ŽÝ1mwn:½A¤jõrŒ­?ØWŸ‡ ”œŽ~è¼±q\rjGÛLÈ_™?µUã)wK"û\¹
-ªAð¼·™æZ{…§ûG-¢“ʧýe oW»žÆ;¸ƒ‹”…šDY‰F笰ýcÝÝLƒÆ©x7¸aЮN³Äó¯°/¿PþÒPŸÕr^þ#rAÿ¡PÃ_hÖ¼+ù_åÀûGN[ð?±í伞mNJ‡í|±šý‰N#í ¼bŠ-&§Åv3:üûç©°=Uf“ía:›¢Çæ?¦4øÆ4:‹ñù4;š›åêx2N¶ç͉Dóÿþßÿëÿßÿÿïÿü¿þûÿó¿µµLõÍb²Îªà7›OÎ_'‡ùaOüœ˜¦åOz³ü“[OàœÈ‘ÃÓíxö§K€¹ÏŽ³“ñ{;ÞîàŒ
-nËzFƒ­? ï¢ùÏœØ÷ÙáÏö|¤2ûsšý7Q›„6Ÿ¾KB Éo7ÛÉà××r,ö»tvûYevÜ®ÎP‰Ã…áÊçÑ )V3ÏƺÿϧÝùô§$Øì°ø{µù#.R Ý.g„‡ˆ™<õÒ› Î
-çÞQqÇ!xN¨rÍÎ+4ò³ãב!'À@düûÖ&ˆH7*‚›O‹ š,UÔÜ¥4.!.¨MÁ³v€Çoíß;ã‘E"&‰SØaÔ¦÷å8éróíFèD]\ĸ“‡§¨²í€¨Áð/ 65{<Z6“åôyè¸d“ÙÙšŸ9/úNsvcJá%¤`凨•BC7‚}Žûï` Šw_3£
-¤ÚØÝ?@»ýsúšý™FÏÀÞpƒþãk¶ùsý Nv´ùC5%::Â?߬¼)i¢ÿ
-IJ~­.ÔÔ¸€šîx€¨C®¨6^ íž9ÑKU
- |Ê"Yêk'Q:6j‡•çùæà,öRvž§§“Ëè8¹Ÿ¦UÒP±/£§l}L–>y³éŒüÈý묹—Óëígž§ŽA!8«OIŒçÙyÉãl8í*t,ZM°ÛƒO1¶¤2+®;ɦøœC%QÖGÝx€ç¹OÓˆúš!ž§]SqXDxž¦°AÔQû@O90–'¾ýZ«–û×…Ê×÷q×ó<m}¯­GÎxzÅXa½ß–3÷¯Û½ÒEwæxÚÓu¯ÔÍ~:؃ù"9žZ¸_†9ÜOg­Bâ$+θŸÎͽ/õwZƃ1e³<mh¤… ׯÿ l •5øÔÈ~ŠGÒÅršŒ¸‰Í•‡ð`}”öÔ±ÛóÀNëÛQ,0(fî”âÉÂ>‹t “rN>[ú"Ǥº¬×"Åb•¦kô«Rl0­I5]í~+A ØšÙýf¿[s»³©†¼dSÞµQS°u†ò\„ãÜwÓÇòrÓÂ?Ö-M?ºJ&ºì;Èpµ¿d T[hçPn@nU#Ó#ÐÎYÞÄí (”É6íÇ ,¨,Ñ7ðEvP Ú;g@ÕǨkµµû@“R;?Phç\Zo@‘•äJAýÿã²Ö䊎ਭª ¢·ªP€NU*ù (Òþ)ú˜•`¨ýï¸ÚÚm~ ²Ä§™ (i%!ýŸk­ÁPûó
-ˆ8u7JÎbT‰€‰z¶fZcŠ&
-¯˜S®—À?UpŸÏ:Æ”$JŽIy'EÎFîÁÐOÂçÂp(ÏÑ+7Ÿéè£Bµ«9Ö´dsÂ냔Œ–9jÅ„wÐlÔò÷öË“ôBØ4—õ]m1b…^0²Äï_²º¹Ñ'qŠÝC–À` 1Ä.QŠ wó\½o=NY7º"Ö‚(kk)Ô©'1OÇ»‰wê¾<ŠùñQ¬d |J:.áCŠž6¶aŠžøGtGp]=Ÿè!µ>önôã–xaåF`2«"•2ÜÅ?Š':W²æƒd;?ºT·) wqhgyÄ6Wjy—fUx³¹'—¡‹ûßGµŠà!¾‰˜g£AkUð»ÑüP«B«â–ímlG?&D/ˆ&aâ1#Ò¯lH£só¬dTÑuuê6’{Z.gåCˆ™{4¾Sº|%šÛ)­ dó<jì>4/×A=yŒo™|7’嘫~êÈ%(¼Ï³—X#>Ƚ"‚l²[eÂÛI=÷I)ˆÑœ<’å-¼ƒ™¾¶z?{^ž=ß¹?Æ÷x¤ãÎp/‹h8´0þ-
-k£ ´-¿®e­XÑ“„hI±$öÁt_g¤ìï4I—ªìc ‹£8²ˆý]ºÎ¯hOTÞ“K…‘×gº;%·L଼ÍG„Jà}Éù¦ºñ,Ú?2fÁ¿ƒwTºÁY-bÿLž&ï©tbùsé:\*ÊPWæáÁ¦êQ\ì¼PôM`°{v‡¸yÁ}ƒÝ§y±‹äÒêžÆØu»ß1ºD{p‘¤_ëê‡Á#­¶n¸¦ «Ä_ÑŽÉÙœ0Ž,Ö”à–cŸ)êµä¢`së
-)¦%þW~¦ðÞ9’}ÀP&â±Ø râ†ÔúÄbG¼ÙGà ES‚Û]Z‹5øvúÈ%èüÂ3ÚDD™xŒ‰P,qb*÷¤€˜‰ÐuK0NÝòNî±=Ã2[µv<¢"­í1›†%IFÚ÷ ­¯Bumkb§Ç
-!–õ*^¢—üA†D“܉ ÁÁð—%ÊSªÊ^åýº°DÍûõW$ÚÍ~Aã¼.Ñê¢q¼¡³yvª›Hºè`_hÚ
-°û`°—}.Q°C3Åë§Xó—c÷_×ï›\gá§XSX¿çåêOfŽóàiÈŽd0bõžÓ…0%cœ…(ó墽x¶„ÎÂ"8_‰Âë3ëŸùæECåM9å¾AcáŽF)ZÓCÙÄIþûÜ ³ßó* nÆ6í¤žŸ’["ù\(z
-Xáæºæò\ÝO§cN‰ŸI Š(Ù‹q09Œ´¶ˆcI"ò`Œ´»™kL{¿ÍÌ¥çC¥抴–²7eÛÂÁöüG "‰Øè ìôó`LŒ?™/2@ßÉ[ò­ –ŒGňMÉ·TŠ0Ý$ŒÐ¤aЇsU©¾ øH
-ç€G»]¦¢pJ±¯ï*¬ŒËÁ fÂtå{jè„+èÈŠ¡—kè„+è$Ê÷ÔбR+èØÕ‚ÏÕÐ WС;UÞPCÇJ­ #-¾—kè„+èÈ;U^®¡ãz« ãª|¦†N¸‚ExßPC'\AǨá}º†N¸‚N8^)¾†Žä&ž
-:º{'!™¿ìm'lôräÀóW…˜Ùgb§D·^KªÃ½ÄmÿX#¢^Š‘åÂa#‹u1•TwrÉÅ{zžJä’óÇøJê;™fbñĬ²¡ÕŠ’vÈb0½X<݆â¶_à`Ø›Öëæè^8V&Øõïñ‹øIу9L‰YùxÇ &0%¡’¹[%×ß±8YÓÆ\f+sø^ÕS© \_?þ¤Û˜½4ƒLT–Ú¥‰L‘(…‹ÝÉ ;‘¿øuOo\DØF"®Ø_çp@1 L(ä@3Dî™!p(Žú¬kÞøýÁè)XÀfMêéJD‚×&T&d-^Ÿ¿Ñ˙ۓQd*®Ät”@â&“Ÿ·í‚±ìØ>ןãPÏv“L“ÂDD¬–.þÂ~á*0ºKÔuOïªã»8[øràEçÙM“wk‡`ÎÕÍi%0©S0ÃsLŠ*-¼yàÁ¤øsà¯['jÿÜ
-Æþ=EÀò`
-íßÝ:¾»51bˆÈNO2îAx²Ø%2̘Å#ƒqgÕ?‰1VÍÌ+ã…<¼HÖUaŒîøu˜©õ°Òç^%—8]ö3u·€1¿eÔƒ1ü–÷ëåØC0à8ŒÊÇš…ø¸Ãݧ “»…˜ë­³œ%P'±v:§*†GÚ2Õ›[îÑܱZnûÌS3ÂW*÷б##ü6‰Û=Þ¿!ƒ¿* ‹^dܨ핼èÒ\R÷¯<‘ ùÆéz$Þ;Žt=2}¯*–¦E
-Qrï¸yÄm!Pw¯bˆ.uø+¢„UŒô10)1EL\ÁM¶>Ö;iToÁ“š‘Aô4žxÝ; ¸ç¹Q'bJÈ~ålÂw1¬)Y;Å„*ìòÈðf§£²¸§ñD÷È-™#ëî«Â½»cÓ‰ñÈ-YƒÆž+mzÀ#CÔðò™ ëÌ{<2+-Yõ«ŒŒ°Gæšk}· í̵Zн9A8Ãë‘aV¤Þ«Ï{Î#CóÀCĈ-ϹSœpãEÉâ²$BgVª§,½Ÿ7.FYÞeßQ“¬[„3ÄYäÒáõÃ<äÔÙe…3g%b|`i~í+Irè|Ùeyo{¨|Œ7u^-x¯®îÙ\FŠÅ—}<_k‡¸JH8*…ï'ˆ â:þKªØÜ‹nHÕåjF$üM#œ‘Å<èøì—÷Öà øùßX'þþ±Wêá¨YзŠ¸2T9ëážÈP}¢Ž3¯¯úîz¸—«EÕÃQnåÍ|½ŽV|­ˆ£qÎêá®~ZEÜk17v=ï-o­‡“pVÄq¤Z>UDzÅxÂ:ЗòzIªK¯ZtNäí’á;º¥˜œHV–Äs¼_½¼
-!‘™"Æ¡]kñ\„ŽÃ0žŸ› QgñR`•œÐ]¤Ôøû­.èã/' Ä+lÈÊk5IJ!ƒ YÞ¸/_
-½]|•–/°aü£!‚sèrŒ— ãí—ÊI‘6ðý6lïÞr0G
-Y¯hœ7°!…Æ„OÝuCŒs·:œq›oš5Œ~Å̽ۦ¸½Ò¤eW¨gø°àßî`â êVó=©û7V¤‚ÁÞW‘ú±CEªEfÝׇ*´0±òN¨"Œó¹ F1IÞP‘
-ƹc>‰«H 4·K‹æS‚ "piê£IFP<`ˆ éP<š;!’ ™¥p 9öhµŽÈR8²úIØ?ør)c¢ü9—Â=á·|¢NŒ]ùz)ª¦à çx=Y
-Gñ*ˆ¨4}¶Žî—vÏÏÇn„>‘ÇGz‚Ä£7ÂÓõ±öÛ.Tƒgìœ@®»E8á`ì‹ ŸÔaÆGú%ÃÏ •5šD…pR`•Ÿ€jãw:y™DRåp yG‰ã 7–‰®qœäLëîœwçÎX'Ѩ†L§H.~èûþZli‰FL™fL>ËT%°‹xµæßõð-Yoª£‰ÖGbŠ«²q!w/ÅŸL~£»‚ÔZ,z˜Dy”7Ú%ªûŠVðD»m¾b·o±Ûá<ôXèÑ7F±›Y—çê+œm¯ØíN…ÝÎÊ»VsRÞ©óU§ÇÆO¾Z,-½ÂŽQìV²ã ô°£Ú©ºµze»Á—+¾
-;›V ÂN–yšY_‰¨C®´bCþ
-»P±›ÂÁ4Y–w¸€’ýø”ÅE~ÄWaW¨%,dü@ãñz‚æ`Ä…—od-ÞYç7ÑwŸç=kÔÌû<÷¯°‡:OXĈzÏö¿`ÍmS½pHÿý@
-åÜßM¹e¤ÉëÂv-ŠQÎýØC NB¥=~fbgÌB\Ó/º9z7çŠRÑ;ù¤"«üŽ÷s®í$Ç5%JÍû;:ɉõ±.={OÛÛ1/.¯Od9Ž)qxážo"wg}´¾obsuïMén¯ÑHQ+@»Kíùþq¢§ï¾/Ÿ+ÝõÑtÜžÞWªéóÃ<[MÇVÝûq&Æ^¯¦ãÖ“ß]MÇå¼òËÛªéÞRùøT›‘iÿ†j:®Z:ºoüÕt\C‰Ê‚~¨šîÑù¹j:ŽíL@Œ½·šŽ72òÖj:®Zº;¹=OTÓq)†|¹=ÏWÓ1wa-ݽ{¯¦ãRnˆû”ÞYMÇUKǼmþõj:Ê”7¿³šŽK9¥{zßQMǵæMÕt\µtœ=…_ª¦ãŠˆ¼¿³šNÆÞPMÇUK÷2Æî)†w0öl5wÕ»«é¸jéhºåÃCÜ8d-ÝíD~W5W´„Ô”ÞXMÇo½¾³šŽ/2òÞj:þóåÕtܾñwWÓq!Còöj:.-’Õïu0¨‰ ê/öy§`_d˜”ï%Gä–¿ðItí-Ý›ÃÔ.^ïWw›’ vñb¿:.ú¤DEùñt·³-7žnX"2!Ó" q$;qõ¡eT=ß›ÔeJ¢E1%îrOÒ{JƒÃC·œ àI¸û,[ÂLj&–{+ {ˆ"a8bÏë ýHàH³ã™Ë¼#ê~›;‰hñ+mîØÝåÄćmsÇÝ¿òn!݃w‚så'³Ý=µ j›;Á.3‚eJ´¹ã÷(fô/´ûaà†ˆ¼ßit÷r›;ÁÚ7qÁ#k°®— ¯YÄ=W»ìÛê,‚ž²¨â×û)J`iÍ˵<»¬¨\ }²¢<°NT¿Áf‚ ã™Ó/®îÜ_¾³Vò'qˆ¯/tˆº}î¾Q#¹SQD €
-‹žžÔðØCá"{ QÎ.^T~Ït¼¨äí÷*”C ´5-³ü¿I§%ΛC]RuguÊ{[C0Ôû:6¶"
-îóþqùXŸZ.BC•^ÝËã°o)~*ZÆy¶ž“ÖÇŠuEñ³«¢§Óo8|,W2ˆØBQ^¨{éXõDêýʱxXøŽwŸÒ«l(ÐáîѾÕÏu¸ã¬||C‹.z‡»—:å‰fŸ;òÞRÏ{K]ÒýwÑõ!¯t¸ãì÷Jéqw圻îÄÞj“TDµ‹¾WÅJ×xöÞQ8Ø@D-,¡æ”Ì_X;’ï¸ îß%+ßPXû±¾,GÜ=WÄ8Ï{³nwD€qÞPX Ga':qÙb÷Çá¿Ž»ˆ‰¢'3·ìÉúv®@4Ú­ƒ [¯°!½>Í, Ǹʘ„Jr^[ yàÅ—1‘‹|Ôlçß—ÖÛ’±Z-âö9ÑeLÂãµÝµ+a¡çãELL<,3lð 拘À”˜¹
-ÞÊÏT £FK1ŒM÷omeŸµ…Û=RrHDv¤û⽩¿Ý#Ÿ>5Þ1‹D_M†²‹ò(ŠªqÂó¯Ã°ò7.pô|½Ý#l’G;òªžïK´¶àoŒªg¡ãáÆ¿fSb`à‚w)3›E‡ EI”èÕ‚Îv¬“h×bøœ•á”£–‰FŒ“h4bÊÂ4Îêîr*Wôé‘Þ%F¶únÕ宇óI»¨rŠâ» Õþ•=%*)ÑêáôÞI‘¯Ïþ¥Sú¤[P(aÈ‚-þÚ¿£,15ñ5'j‘2P‡ÕˆQiŒ^%6
-Uþ­™å†´ª´Ä¶VãªÊ;¦|@gBExåMZ2Ëð
-Ý$PWŠÖ¼ ´ÌØS2&NN
-æi=0%2K‹³kFˆ˜;7–.®Œ[Vðºí¸tÙÇ{¦ôã‡/Ùu¯ô{ã^¨FŠßÌ_áEÀýø¢<`i¯úÇ`Mâë×@Ã=Y‹º×úeÏ2‘;Ç5аPl½Ø]«ÆŸ¥%Æ?ÆHã[fÕìH–^³X 3ÆÏﱑoÎà;·‹ˆz'sæ³#ß’Ç«/!ã¿ìJØewÁÝ«BÜ AK HÞ¿u_aXâÓ¤ÀáøX!™ëĈ%=}Ïëþ±×j¬îåÅÓ¼±ì)]ê_Ôþï="´qê”îN8¥›>ö`) ]Þß)åDš)à›î©@veÃðžÁàPœ5?ôs_ü`Ìغð¼ÐYÉ?ØÝæ¿`ìnñ‹ä, zcœM~žÅ˜w0V¹0¿vè<^ëg«
-Pl  ø.f<8Uxñôòm²p Ø@ÑU6¼èSHæÃð¢ã¡"wÞ@ÄûOW2§Äç+¡T ±6™¡=½Ð”ODG¶74å#n¢="¸žhÊwó*üg6åãëÈöÞ¦|rìMù$´¸îVS¾›Ö÷ŸÙ”ïN·¬75åî_ùBS>Ú”`]RÎöÁ3©b]Ti°%sîê÷üÝPô¾~žÁJ®7UEÀJ®7Ý %ØÕOt¶í¾~âò”^íëw­ºã4Ö»Š¿¯Ÿ°Wˆa‰?Ý׶C¬®~ôìôçûúñR2âµKÆÝ«}ý„vÞ ¢ûúñTrY”w|JõõÞI‰H‡î½¾~ÂK»ô¯|µ¯_@°«ß@ûú /ˆzŠ½ÒײM·š¿Ôן´Œ3šÄÇËx‹½¡¯Oþ ÙÕïõª´»­HÄÞ@%¢¯Ÿ°©KÓ”^èëGÃ6««ß“ýøÞPóþL_?žQÈ#ïå~|¢*—›ZÆyCáûµ"õž~Ô€
-»«²‘ßÐ×ï†Ü]ýè÷<ß×O8Iðþë}ý(qâ–wñZ_?á„k¯|G_?á®~d÷Ë}ý„]ܵ¢÷õãØSJW¿Wûñ‰‹ßíÇ÷ò-—~|ïèë'¬Ä‹­æ`÷õ»_÷ÀŸmûl_?MžìêǼmþÙ¾~¬œeZW¿WªÒÄçgPøÙPd_?áx3‘Eðz_¿€`W¿‡ûñ=•¤ÁîÇ÷6duõ{¡ß¶4ïí ì¾~µâ£žQç¹¾~z¢Ø‚§«ß½ÊG±}ý„«pÅW¥½¢æ0hìé¾~\óºYÕOßÚÄèë÷¬¯ï±¾~Â]ýÞÔOdoôWûú‰É¹âèëG‹?VóÄîê÷èÝéL6¼ôõ£Bawõ»ãÝ×7½‹zŠ½Ü×O8Ñéâ}µ¯cLoϽpbjžh}ýžð[>Ñ×OŒ]ùz_?½`W¿Ç³¹ûú +†å{úú +†Ü‘ÄÇûú Èã#\Ë;úú»ú]õ±ûúñáÈ}Ì_]ûX_¿{{O_?á®~ÕµOõõ>8«8Ÿèë'p8älF¨Á2Ž‡œM`ÊĹÀs‰é͵kU¸—¦›c—<+QL; 'ÞÓË™.-ä✕*ÛkÖT—Ì׆ ¨LàRå¢:»é–(¬“jºÚ³D)5˜Ôy£5çV\^Êü–ê>e“AéQY›y{ØîпҦíy¤NÍ\n]°«èȤé“VNTL²vßáQT›ò˜r¹©æÔ³¯ÁQÍíÎå4÷)Q†–ÃÂWvVu» ©}£jÙeçÕ¯òbUOšòçÆ ©Õ Q½ö»mÿ.®Kzï|§ï„NeU£>¬
-©l;Ûš”fÅ—WÛÉMz·>¯ ìëœyªÜć èÉR]/™—â‘âJïØBæ„90'jÍ„9)ßÌÉbáëpX ‡óW@}Tc…1\¸”¬´ ìãz¿«Ð…["EeoæxÃ98?3r³©8Ós{zÉ}Aõ¥ã)ÖI„s Ø?¹µ€$úª#û
-7²V[õ«®ØBGAÚ,dõ%ÿZÏC£B§R¶J
-—wQ–ªÉŒzXMûmnUÞ¡¿‡‚múˆœ9Õ7 }â(K¤ Òâg‚œp°Ì.™Q*û •+šoª¤¿5r[Úíô¡â!èT{T[ÜoFö ¬¹ÕÅônÛ؉ã©øk>š×k…pÊ1,èÝv0áVT¦Ñ^FžB+Å#m}œ iÔ /lj`|E£aÊsB“J§-ñ¾Ç]ŒL¸9‰2>YîÝfSkiÀ©)f6öxÆ+`F„þ˜þíҬˌ(Xs‘ír52†Ì&»M‹þ 0Ú‚zô蟀™+{ðÏŒò€gúfUø|ÃÄ@ÛÍšçýÐgÈ›“À¼³}¼ÑJ…³ÍfÏ<Õh<äD]x½ÍÑê
-!ìö
-+¥#@Á‹«ð˜¡«’Ñ]ö4e@lþ5VRëºe—›Lí ·nmO›¡]&}]‡6 P?ÛF†,E+…}i‚ý•”Ù´Élg!Ïf)´…§9–ñmÍà•¢å*_ûƒ[—ôë€ ü@ñ§¿êcÉŠ¼TŠ‚I/ A¤ðD2R2‘c'‹f8­Uáý “3LÖqb
-Õ€‘>ÂH »P²Šæ¿‡šyÞ0'ÍYË7Ðpä)‹E¿t-ÉhQÏã·¤˜Eg­×<+¥ÃælÔéƵiGëšU.ôó"eÛ^м3_³“ÝœÕ(;w®Š§Š¦Å¸›ÄçŠÛbPê"æÌ8ê#]ÅøÏ"EOæZ¬À ¦g:ÃUÁ´HÖÃw}fàYt‘i €úÎãqíÈbZÈõ>¨X`×µXða¡WEkIé,˜¥nÆü`këÆ;X j]nˆt5@A¹x #ó, šV/ö=³…õAÜå,×2B°ŽÆæ"›[Þ"@oÝ  ØÁN'üRáŒ$R‘®‹¤¥ã±®/AÊCª¹‰cn ¿Íp‘ùÛ" _ç2/‹\€ßDRh‘¸æ³¢»-B®RNß›ãžøÖ>ã—[ïÿªø}ÓX•ç£Ÿvîó,£ô£‘-йí‰eZ|P›½t#à`æélztÊ2¾G@y¯xˆÝ€†Í“Ë 1<¶ö%M ,‘²ªŠUUˆGñ¸Ô#ý÷âäÊMªH”¦|õ4}ÍeN«*6rY&iEÂ<[¦ƒÜÊr?{Àž¨ûfM}ÐóC¶b¦”62N•c¦¼kfòPg½‰ŠËD÷ HÖäqÒÒ‘âšÕ#ÃÑcˆädf£cdìúMßȱ­n0¶ÌnºáýMi+ÄʤŸÂÐSŽð«¤oœ"ýéC|ê, ªœ o¦N»‡ð×ÈÁß\g³£êàŠP nÿñã(ƒˆ¢ÌâL"¥JQÕX[•¸,i3
-úTàŸå+
-:`_8¯;öÂH8œG¾Â ÖîÊâb–}]Þî#¶DŒ7ÚoI·¦8‚C¤Ý奆´DùÏÒ¤¶cWuEBK€`Ћ·
-™u7 ØsvÒšÜAh½_vM¤è(Ï"ÈéXShlkÄeu9 £ Ÿ4ð.Ö7±ÊZ’Ñœ zÒ¬tÏ+Êyp#›Ž1˜7Rièa¬¨ºƒA#ýAíKJãF˜Žå'zðÀ<Ó¢Ô²Ûü+ÔWôé:ô
-\i›>,ô½¥°+F4äÍƈ¯Q‰ầý0AæxIM¥5¬SÇ¡°>Ó¶¦,'Ò÷ÔZ6íz²¡„9iÚú ×nEž^«*îÄ2w†Ì™â‡Ph݃<-0MÞaÁê]ŸUå+W‘{Òl²7G»eܯ»I/¹*c³`–¨ ú]ÐÃq;ôF
-ãZÃg˜Œ ¡)ûKFÀŒðÃÛIÆ$.uIÔG^VÂm‘¨hÉ,ìÜ"Þ)•Hž¹æ4À”ƒ«§—û¸°´E÷ˆvˆøÙ%þ¢µ$-!ÙÔ.otç¨û=Ñp]åÝ\BšÕ²r¿¬ÆSº€\ï¶@¸8ìæ™Ìvæ 0Ëq­â30¯ÕY&Nu Èš,ŽÇB‡ék«ôZ&©â-dÁµªôš1n™Í³±Íñƈë5Þj»ÄÅø¢¦œ1Ó[ÑÆ…qí”…dIŒ”‹-³œÜ}z~Õå*çËžPÊDJ²6d=:0.Û‰ä=Ž!9Ñ«¡R‰k쥋¡X `•`Þ´Àf¤
-LCðO ³i»®«Xk¡[g¯UÍÝ‹Lf„Ä2I½G¢Æ{,ó¼!µ¤F2HþH Ø'XÕݳGÃë ,AÂÊOlC¸JÂzd,Dw»C—Z}»Es=kYb[ 
--åX²Å„´ÔS e²ƒ `•ñ®`ÁÜ'i5l`»;%D*æÙ)‡ÁØœ‰Ìùtä`®f¤
-
-f»T…-âT¥EÚ Â
-4@¿ÅÊö‚`+-Ø^
-,,Ì„ù¤mª´DÚìž.Kɼ“È«Ë2QøOÛÅu‚o-ºh·0Œ¡Îí7l/ÆÅ"’‡(b¦Ô¦˜4‘'Î
-©,Q'ƒbç3îFŠˆÿèÑ„ú¤
-¸©…2²œà¬T5‡Y|X(¤a5<gq­S‘$Ò
-t8³¦·Öô0m2ˆýCÒTÕI‘I¥4 @&3} Ï*Ë7 _V`¢Ð¨F¨ožõ©`eˆFD"SÔœŽÐ†ô€9L–ð¡¶å³u9.%¯¬È
-tJ!+É®»\¤…X³En@”âl™Íq 9
-%M°CÍ
-åXßiµè—9`|Žøí—P‚ž«Ìñäá29oN@ú¾øÀ”|(uÛÒ’*€Ù:ÃæÌ÷Ø…lè:‘Z! N­ÞÖȯ•3pUiØl$ÀPX'u×t—]ë§Á wŸÇä|Üà §åtì<:u“«ªGu33I¯5ã7—Š¾ä
-,Ã’~ÜíÆpº¡»ÔìHR[é&‰A„ÿ^˜q¯3„”ü¨ÿÞHUÔPK¡–½â¸ã×ûÅ"|–TdØžü<—‹ßjŸ¡ÆÖâƒÔ1…¦fâ0\óÙ
-Ó™X|——ÔtÔ/Áe2áõÖƒÌÍ—‹êB‰äZ4Ožbô”’ou*@Ä+ÙêÔJ €–B10ØÒLÓp¾Û°^L­`ô©Ø/Öb.JqŽºeblo
-Z²fñr'fäúí"½Ä¹þ sQ‘áµQFšCAe'³ðšåÔ­mÎã?{ÿn„»¾>ØËçE7BæÿoïKÛ£8’uAÿa#Ԫܪ*ÙA«l<l¼…Ìj–;g¾Üß~ãȵº$º[øœ¹Ç~æ?ô«ª¬\""#"##Ôæ³~¿Ý؆ZI¾þí <Wqkô|}´`Ü¡~Ç2³xûú«ÐÏã ó¬ùâío»¤q<öêú›'Û2*¨±,“yñ·SwΪë»o _<¶WáN+•-ãâ7¿­³Ëý(­h¦\â2/f'öa:ÌQk¹øJFÏÕQk‰å=šÅ·§/¤Ì“b®¸?Ή%CBÿ"~Ú‘•”ˆ»ó_“¥sö¢ºÑ mgë>®×¯á4ÌÇÛ[/5-Ø·éSO¶¤š‰\"¥·}a|×éçªÅ5æ+øʳÛãg`å€h]v~þfƒ·Óñ¸‘yGž~‰È ˜Ý€Ÿ?“ç*• a&‘™:l§i|j-ê¥&|´t˜1M®‡µy5á£i(T0 ñÄ…Â[\ª?§®«›H}Ò˜/N´;bEì˜{ðä?)AâZ%ÖûA(ݵ¾{†(A#[êñ›½khg¡É}üÐ| :ÞMþé° zý7?`3æ|<»'Îìo\œÃK¼ÖaWù³¼äDɼ­Í6;ê%¿töÓ£ý>ážÅ؉„Ùfµ©­õiSû&{¸þÿñŠM­áŠ9Ós(le*óñåOìÞÁaéºï?ƒÅçN½#Y-ÍÉs;·Êlÿxwøá)fäy Ï 6¨'ð‡÷§ÕêÚ¥":ÿÐ÷jn¨ëI\áÅüÚâO*}"
-§ •éÆ•Dƒ¿—ˆsL1ž{%…_[Ëñ•¼´·M³ýrf%¥"[ÔÆáp[¯å­÷¿o™«_¼½ŽÄ^Ÿ9ÇŠ8­Ðµž¨dç+ÔïøSEœßåº coï]Q7VÉ~ƒß§ãñæm\•§¢ÇñæíË;¶|jžËe±‘T$
-¥#=^Ÿ¸´­®ß§‰¦-ݤ“n9—ÆX‚&<d>½ýã»+ч÷…3«ONn¡DC?<ÿxHÉduTòI.ªxÜÏpbý»‡;'Ö¿ú~'žXÍqñ«Ž²<F~˜CŽ´Å±t oçƒýù¥ïÎsÚårS+‚ Éšzx¥¸•vüürGoj’çêX¢cÙ8Z·lŽ…ÿx¹­Ö¾¹>³©­ûÒ¬~¸Ù¡R»gÅr±Í,Åu&«ñ˜éôUsåëK»˜QKLsç‚Zt‚™z>Ý(®Qê×~S»—ÕþMÜŸ¬^Ã.ögY“Ù–œ¹þöí¥ûjûóƒ¯îqåº ÉËÕùoeFF‹ï8†¤$ß<f&ŠµÅ ÉdFnœ©î‹ÍwÉ`ɳÞÉêŸbHÌHX¯ \2XòŠü0 \2XòŠßM˜ÿ’Á’W &ãúté!jû³ÒCprˆä‡ù³ÒC0o³õúg¦‡àäúŸ—‚'#ì•^zˆiÿ禇Hg9K{¼ô)·P×»¡×nž¼÷Î]sò¬½¬×H÷$Uô÷íc'T+öý¤‡ä4 ?lèù¯~%uM’+ð"VW‡ªˆÜHÍÊ_d>µ¸ðÌÅ™ÄUT%º•¯ ÆèŽxÔu>uÁÂæÌDÛ†O¾Pβ R~¨¼~õ
-^¸KÍ­ë—׫ãîßZßù±uA§.«õž¸Ž;’gÕãÝ]Z«“¿7Hêñ ém÷wª$—GÜÃDÔÍËw‘mIÑüð&æŒÙP®g¹;î½W‡Ã"“³s¯,_7áÝAÙ]ñò»M]vq°BáÝAÙ]âý?£ðî ì®Üßÿä…w™ÃrÙ]|åO(¼{D…Ü:æ BîÜ5w¿YT‹ ”Û=´Ø®dýDåv-¶‹3¾OVn÷Ðb»<–OžüyXl—¿ò©ÊíÖÉö®ÆœýÐú‚j$sBv®(ÄœÂ9{ŸÝZÛ7<òÝ )†qŠ•jüu3kºô³{ËBVLÆÓW.¼áìsÝi‘J{Ÿ}k¹mXêD[óò,UøÇÀný»·QKéBØäo÷ÏþTVæ ¸‰õ3Oêdµ˜`–¿d¤‚žn¯•Åjý{DÆÜ>Sb»gÀš·…hI%Öœ­ê…ãìªcöêšÚ8yóŸI­ñôËÜ^ßýlJù^¿|F‚Ã’¦KØK]ÜZºù†~Þ}»ÏïÒ2 +5 É<rYfÉ
-^ù¿'·j…ÿ³y÷˃·wÞ>{úìÕÊúäÜdóÊM¥î¿zòúÚÛƒƒ{ÿõ~ûõþ‡—¯Þ¯œ]Ù¼òíÖÍ›½Û>Øýä`e]²DtI¿X½Lç%‡8µDlÿæ¯?¿ñùÝ {Û¿5?\f­™Pqù.ά.>?bíëá<{Fúõ·é‰3Î~‹êËÛ'6š¯´ø&K ¼<šüÇöåç7~½öºûÞ4OnÔ̹xáñ•õ7_ߺ|Û¿»Øß8ÿýôÚëíw;oþ±aõüÚ…+öùŠB©Ã.0´X& N†¶z nÃ/ø-~^“º 9/LyTt„ ƦÄÅvuëÃd•Cü·?òagë—ëw´_o=ùŒcû/o¾{rŽOÜw¾¿lžûq÷ÕÅë/¾{ðó•í‰ÇgÊ\¥RPã×gÅô>ŒûÕ«t#ùûïeÑMÛÚ‹©¨ØAÿ‘L¤)k_A@ (!üKâÝ$Üû(øôÍÑ=¢pÀ¾ãRÖñÅk›IkJnüòŸ’J0`ݽô‡ÿî#c_øÓFù§‡ÝAúÃf]´z ÅCørTõø„ŠG²’gUO¨x̼y¸—P<ˆ’—mqÅC(yTõø„Š‡ÜU=>¡â1Y=Tõø„ŠG‘©w¨z|BŃÆ2–çw¤Žú|®9ùâÄÚù¯-¤/ß+ܦýåävÿ¾…ÿ\Ÿnáòáüá‚)ž`§¹qâôŸ¿-Â&8Ùïœi©ã Xœ­1 ×kìû½,"yaPº yšÞ=GyyœãS¿©Ï6ƒr@’1‰¿ fuŽ|*~çAZ²5µóË»ë,-ãio*‚Î…žÝÍ&VGGMtþÿá¢=Å®ÖéÆ#¬ì6Fƒ‰xñæfã߻ޞÖ"³‰zÑ•ô¢‡Mªwf{˜²t½è!×~ý:(Y×ßœË}Mÿé¾»±õëó+4©OÞQw‹¶9î°­:Þ;qæú7NœùñÔ½_Ø›ª<Ž»s BŠ·š! ¿œnŠüà{¬'úŒ>‹”ØKžK§â_V[ùÏïÝÊQ‰ã!×î@Æ>+µPbŽÊªâôúï„Ú$Wëæ³Ç«gPø
-!c;ß Ê¶Ûüçë³Wqrýáú‘™]ù:ÔYAI¢F=þç yz3x>bíi‘c—£¤ôèQíç—àéßÛVë_hÕúw_î>þNnð×Ü{wæÄcP7LnY±ª’d^.ë"»×׊CVÆ$¬)Vþn¤6óZÙÀú³ªV\Û:yIÎtXÒ§üfPDú³Ï.^º‹H¿>]ºÒáýþìÚµ²„4ªP—µ¾¥¸îƒo®¤&žÕÁ@×_d/Jzop²>Rˆ¶×Á뜭1䎟
-öË»G&d¶Žb®®‚ÉL+
-æ-XøË4 â—Ó—¿?½7V!™«•Éù«„ŽÕcDÁ#Yzï³ëgÂl¿û–§@êdþ\N‡Ÿî¤IxPO™< Õ‡ÎñéÝÛNÂQul9ÍOAø¨LÁ?yA “?: °A7Q${³¬Ž>o…èŠÖN³xX©ñÉê‘M” ± -®­Ÿ)k}/\ð<­ÎU1³61=î0š¼“Õ¥Vc}1šŽ5Ø«&ÖibÞ©\ç;C3Ã0—ÿqêThbïÒº 5GS9¨[¾®cíçy5Þ}výöVõÜæéüÜÉWæÜ7á¹k/u½8§ŽOckǧ±Íy›8¬u|[;>^¨‰‘6 DHÙÄpKLåÆšc®Ææ(»òŒ•3qdëKö!ïb›ÃÉ\t56‡ŸIj²:ç0ŽEØl‹m6dž:tÜ@àý#‡¡Û3ÏŽ|Ã^øjëŒ4ñö¢3Uzž=`²zT/ôúqû°QIËefBO祈C¥¥Þüø0ŽÜ‡tAR¤'/B—!"<Ĥ]­Ü¥W_²
-ÚýÑ9tÓ]Ẵç1rèÆÒU±¼êE›ŽÁoçó›_®ç|t5ç:²oùzÎÔʽÍCÝ\G~¥> ŠGAKä#Ÿ¬.Y–p¡|äå}ôÔ8W™è±¤6ƒ«?9â°ðô~<æTRFðÎ]$úøwSæ)-1ÝK”‰>³ìÝ”…ÊD/T$Zr·,Q&z¡"ÑC´D™è…ŠDW•y†ðG•‰>³ÈU²â+RA­oÝ9{¦ŽUÉá%GC=´
-ÂduìÑupKGo 0GCb u$·º)Ê~]It¥ºÉšW[Qªþ¸±½¹wþ‹É*—ÿCñ¿ßÇ¿’=½òŸàÚÍÍÎ8Y=N\à¼Q“ÕÃâ穱Z‰¿Ùâ
-±šÍ29Ú×r‘r8ô§J›UHýôH B©Ÿ^›#”²ôôѱ€¸ÿ4Jka_¿÷%Ò}¥ÆqT*õÓ½*rúˆÂÒÈ úõÎuÔj8Ëù †…¥%·Ò¹è5Á+ɸ~ZþÇɸjv ùZBªÁ.ru틧ùb:¯—¾˜Òå›â\eó *ÄœÞRçÂiɵGéxú›×Q…¢mýéÓ‹¬q…óçŸMù] %NAA•§$êê$Æ>¸±Ž‡hS »!ÿ<{
-jõðs׆&~»ö}œŒ›MŽP!ïã¡N·VÆÜ•#¸xáLñ‡½“[â¶6Š(½«?Þ¿ÿps³Œƒ9÷ôJüÃU|åaЮ_È‚Ë/_ßZ/þP|q0¨­ë¦}¾¦y÷û> ⟨]Ìé¾¹œÛ~Äêa×ø
-29ž?½s†C}ä´ú©ÅŒ}= q<'/ÇÁëwšF.Œd¡xý¾ŽÌïþïÅÉ9’7•z´óêIŽ7Y]%äÛƒ÷Þà÷èêÁÓg¯v÷þ}ðv¢Vä ýÿíüŠÒýŠvŽ~8 »'§øÙµ¶²ûj²úhóÊÛ÷ÛÏöß?{ýjïí¿WÎzðÕîý›Û+gWäÙGô칕SÔ›æ=MZC à#µ²yõõëøË·×¾_Ùù¯7¯ß¾_‘æ¿{öîÙã+÷^¯l}ûíÇŸ/Ÿ£‘?š4+Wèÿþ5ù0iÂèç¿éÇ-úÇïýkE5+_­üôK³òÞè^O½íõʆqÓÖwýÊËÓnÚ÷4»¦üÔv¶]Ñ]7팱„Ø©n›Ž55d.ed¢[;õª+r~Ú5Z %$~nk’1î–á.Póm£ZÂÚiã­®º»¿;y59ýÖu›xgÒL]«i-§Îø¦5ôÖè^áFµ¶iWžS#ý´kMÇXO]zY`åDLµ4˜N­è¾¡Ï+šƒ~j­¥ÉÈsÌ¢Áøâ!g¨Í¶l(!åDŒ»Å=°ý´×F†‹qTXÛO½3Å£äœí€yCÿìiöZ_ýä–:U/ÎÃîä7šÅíÉ콜Œ,äÌZÄ,ÙÌ’Ö n®ô(EŒQÎL÷10í‰ÚžÖ¥¥·mσâ™ë0™ôvkyZ-ŸÒá9×ôfz"¤Þ2–Ö‹0šÿº7´½³©×Æ1æ{ck:ÆsÒ^^j ï}¦SaqÝéû“û㲊e…_9µ¶òà{åô·³"@õíˆ º
-ÎÍ,z„J1Ëä“+ vVH÷¢@ùnV¤K •iPMGiò@µž™½œŽ!?–EBj,Cåt$»WK`3bAk?#€Í²4«ßÒÚ@4¤Y™• ©›•pH«;K£”2BQ#t7KŸ[ã0N*£D5;ZLhÝÍÊ ­ÛYAÁO%…ò~VT08”
-(}2aÜÙZ
-«ÞM}%†RÊáâ± ˆ©$1CCQLüHT[ÈbE[¶©…±ê‰Tf¤14œ8&¨©åqD*œKÂkgj‘\NPÂõ­ÊšöŽ¶’Ê )År~,‰ÜÜX†ò7¦<Yb•hVž$Z%›#Í„sg%óEÉ›Ÿ%vîHQG* ­¤n)¢µ¢©Èh`]-¤1t_Ki­HûŠi¦ÛZN£ªÔeg#–I9‰êL£Å eZN26?—qn-AÅG ,²Y–ü‰óQ0mÙÅsQf3T mAR[+’õØÖ$ÿt-·5)4n(¸A”º’Ü™¦îäœDn~.ËåDÎÊs”°LlY~'’œ%Ýù%8RK‹ö/Û¾£¡nXš9£hz_ò Ã¶N ÅŸ19LÏÑ2X#Äâ2'òd ð|‘̇&B •IÇ'Rëuh¤-!jrRþ†‰ãðñö¬Z“Q³…å`§M Ë‘Ö–Ïæ0[¶V@*l
-]—¹w-Cd[y•ž³ÐI$~#cv…[ëz#ш+»!Œ”ö妵ås¶£ïdáœ![ª€ÂüäßžtDìæ¹!²cy“*$@XKE¬-Ÿ£Ï-fÊÖ
-H濉HxÓ+ð™“je)þÖ}WŒD¬Ä–)'ˆ(¶k«gHúQü¶ÂùØ“ûŽµî®¤O“ßÐÀQ{DGcä‡î /¦ò6 Ü3YÓ8=ó!MOÍÊòúL Ør¾à-SõCyc+Hºš~'†@ºš¨3ÏMAôa2«Ïu¼?¶ek’¿#_å†÷å\
-'„oÜà¹ÖÙÄÍJ §˜öuÔ­-– ÚòŒ‘\äÝB¦3òUZ$݉ðn¬ãÉ'úsm„‘ëYŽ)6Ö­iìí™:‹g*nálu®|Ž£ž_MT\@2Céw"°ÜP"ÃYr]Dr[’ endstream endobj 55 0 obj <</Filter/FlateDecode/Length 440>>stream
-H‰ìUËnÛ@ ¼ó+xl¢—Ë}^£=¥E`=ö ÚuŠ8@âùýÎʲ;ho Ð‹är¸# W»øÜóâ¦w|õ¡gZôKÇý’Ädín÷dÍ6MÌËþ©8U~FöGdßQnƒ•5KQã.©XLÌ)?­h Hu¹Ar5Ï- ¨š*G/Õ§}Ú#9.ÓÙáBè ?ì9;vóÁ»ñY'G98ñ1ŽQRôÆã–ÚÀ–º"јF .˜”ZNîüéñ&UÏÈÎ^¨Ís°F:¹À½*|>ñO;Fò¼Ã1y{ ø,©FV¸U1Ü4q˜ŒÆöl¤»Àu…8DLT‘0ãA*4:û'Ⱦ ŸC^•\Ó-õh=¥æ©'Þ¾0›·-ÍëâüyWèò_¬E¬“ )IÁ”¢Z~!C(€ ³ñ=uQ‘ÂAr©Í5ñÉ·o§)ÀßLKô/n¨û™÷-] §ßóï:®ý®ƒ~m4†5:S½çaän¶žsk)ž=ö†Ò¾¼x.Gðèl†hʇ-½WO?ïÖw«oï‡t=Ðõ ö®_
-H‰\“{lSçÆŸÏVÇÌ‚z9‡ã²i…Á
-»Šu·6cŒ‘µA -M4µ `4Ä7ì`ÇwŸ»ÏÍñ-b“…¶€¡¨5½htcÒÖ­šJWªiÛ•ÆämLûNûeÓNZM;ç¿çý½ÏûèýôÚ0‡³ÙlíïÜÞ·±Ó»wÀÿ¨7è]“²™kæÚú4úþ‡ÑWápÝJ¸¹ýùµÎŽU˜Ýfûv×wGŽF|‡žõû6x¾´å‹[<{#žžÈÈÁ}C=»ýÁ§½ÃÇð<|ø°g ô{|^¿×òî`óöÞÝ‘£^ÏÏ~ï ³aÛÚ°Ö‹aa˜ËJæøþCœÇ›øïð¿€.pÈÜÿ
-ß$åYM6XjTO×uAåT¦,äCqÒïdeNiœ
-“èRê cG*Á&“¬”¤ú‰§êœÆè[8õLéâÍl¦Y,Jž•<Ãû8>‘qñ‚È‹¤ ’bh²DgŸ ï?pÈõ˜x¥zó& ï=
-ˆ¾ûýH¸á2ü2\;/¢­hówÒÛÒ{èËÀxA?ÿyŠ¯
-ú'·{÷4³°.Éh$s|øø¤@ ¼À y6Ï3\4K¹~9yuþmê½æáþ£G‚Jœ’$]•I‰—xš;>68?ÁQ‚õñ2' ÌL's椴F”r™ªê±øX<cri=›É†ü‘ô™lFS‰Õt²V<Q£ ZV+*7k”®%¸ö!ʾ21wX1È
-{á]H'ÕqŠeE>Ãdäsõ(£ðš 
-.Žgy20ž=óLé,m½uXÍ:Ч¾B\úy2Ã'3IæÈSúàphüI*'Ô—'Ÿµž™+O+2…\ÿ ÎOŸ“˜²‚?í—‡ãT:ÍsÆÏ%¢\€õgc!7+žž!ËbE™¤I“Ô¼+&×Æf(¸ée¢¤–
-23y&›ˆ…ªŠR4˜œ¤¤‹Úä%¢Qc’ctEË«ª+§ª¢Jé†ZÈ3‚®ŠU
-kP²(ÉÆQïR tÀA‚åd•‘UMQ)Qä2˲9mÌ'É£(²"“
-ŸÁ•åYŽ¥^_ØFT@õ¥ô×ñ)P†íø(wç®ã>Cí–dÜ‘ÖMná)£Ç© né@ÉЫ‡ë„výãÒ¸Uj€|×€°šÓgÔ¼¢IFdž§ˆ(Þ¹ Žx*˜Äg,Æ¢+
-“éÆß¾Nü?½X÷}çiuYÊvãð§U"Ô«øìršÅ _r ò^î?§ÿf–Z¶³ÐÁ6hÀ
-q¿³/
-֮ѦÛy­~òܹz¸~èίœÐÑ{aëíBzs"Çk]ƒØk7 ƒ~ßé[&ײ]²Ìîö¶K«a'€öWÞ€þËj~ì d§‘¥=t?qn*ÒÇX}¡ÈýˆÉ÷oÄhÁ=Kmðóæmö´Ðü¿wÁùêpc mî+S!x¹ÿ—ûA ½`qvx®k¡uÀí™
-}°ëØaÅ°° ÙûŸVg³‡—#Z›¹jubF˜~Ž„˜ó­Èüî}µÑ¸ò[òU'Äúç ÑƒK¶Í&¸V÷ïdÝÙ£$´½ÃšzñD°ÙîìõEöÒ?†ÃÀý³©y»eƒ+-gc1–sá6´›·¡³…Þî´a®Tá¯?ªà{j]4;TgËÚÓ'~Q-M¬XñfefÅ'ÍM÷ÂkÄ
-H‰ìUKn1 ÝÏ)taDR?në]¥EàE`ô³ˆ¤^ôú}”FJ
-´@ØÌã÷ñ#ùîó)ÜÝŸbx÷þ¶»Ó9†Ó9DÊEý©†gQW.!œOŸ6¦È~Áú#¬¿ß¶êʸRƒb/LšRHJ9üüºáb±ºKÍÄb…Ì,ìð´b!J¦Ï[ ­wü úž¯Ë-Äãn—§í9pRE*•„y.×Íåþ„BjxÄR²³Sj–Š1!•Ú&ºl;+¥ÂK’4çå{ÀÔ­Ž0f$A´TaIÌ“þؾm¯hj£¦œ½3ÕZ{áY(7#
-¯2UÍ [Ð>É’z–X&%˲´ ®‡ßFHXèéRg¹û8Š„]„0j°"¶#Ü7è5ÙÐ÷vNA¦=†w@Z¹Bß3 êÝ¥ÁÎ`g´Âr—h­ÝeH|ÛƦpßÁØ^áÙ—‰ÙËÎ>È$%Ü“ÌÞè²!-LȉŠµéx Ù›"+û,@Jê8ö;릙pVŠ ÍF9e{™ðŽÀ1z`i½<1Šì¾vç€dÚ«(ƒµu¢bsAŽ£ #ìuùÖC€*J=£)—¬ýôè<†>Ãù.^—@ÕŠ¢Á¡ÄÒ–¢H–Oˆ-2D­K=RO߃È}YĶ¼˜w–ôº6·c)yé—Êuás§•¸Ü$$¸±p²¼Ë“ìA@˜Š,Áìítž­^|§
-H‰TTKŽ1 Ýç¹@¹cÇùm)«zÁZ6 ,¸>ÏN¥ªGÝ]íç_Ù~Nn_÷x{ÙSüðqá-¤Øý»á÷ç{ø‡Û~Oq¿ÇD¥f{ægÍ&g®1Þ÷/Aˆ«Ä1Ü>ÃûÇßð9&|8jó¨ƒrÑ¿‚~…©jŽ[B,Ç-ã¯jY⦤µEsI=>Â&$½˜SåaNƒa­¤£žhPíî{`.ÔTãV¨ÛkE7@f'‚77¥^vê]¯ð…ÏôK‘}+žI¬Ï>eËÍÔ0´ËV¥8GÚ›¡™–‰D¡†çÖ©¡ïLÃÞ%ô£Ô«;v*Eb¡ìUbzCj]½MÙ
-Aéa“FR¬^¼&_ðjkÙ;qѸ¢7)””ϹMÿLšË©
->ÐÊ}Àê}`U
-Ø_|Eág¸‡×ç•©T†õˆÜÜëÓÊt¬…B4v2<³÷vAÿÏ>Î¥”ÄF£”Jw:óAFï2¼2Lº;Ye6ÔÖR¬k.zc3ƒE™<Œ>P´>á« C3@¿ï®—ƒì`5-áLßô˜²b:s.…u9B¥RΞóüHpî§P|Õ ªAå<¡Ì]qâ;Òªo:³w¼ÎJëÖ‡ iÌMÈŠIf¤?³-5‡-ÃKz„>õ½ õ™vî'¼º;“â›Þm c=ØnfWÔ dUFE…%¶{ìע̵ Ž¨Ð0ú9*Î Ž¦»~zÁUøþ 0
-H‰TVËn7¼ÏWð†b¿ø¸zmà‚ù€Eà Ø:ø÷]Õ\+¬v‡E6Éîêê=ü})Ÿ/­|øx)ÇÃå©•ËSi5ºñ×~»qlÒKyºüuHm"å'¬ÿ€õÿ¯Çàâ(2êÄÂÙ¥š{q«Ö¤üø÷x–Õ·Œ¨bE´®µÊ‰«¯€ÛòûÑÊÌ¿_LýS¾m·®¯¥Ý>åõúíø^$oUCŠÌåúrpòå8[uÅÏ©ŒBÆ(§T§XÂõ×㌪}–ôéäößV GµYõ:¦À¾fÁC5Wá8~§D¡½h¯.z3¶®œX“ë8dHÑQód¯:f",ÂZ¬Jó¢³.ïå9'˜çD<?c¯ÇÚ°­7ÈýZ=ÖýzÓ„#²ÔáFèHC¶¼H¯ñ=#7ÑàÖCqsæ¤Áž6ÌÏ̸€ ƒ€¿¦\ x"o¦À]îWÁšs#Û¶}Db^JHW²¤&mWm=÷*Ž0äÓ×FÅ §w.
-çj¬Q:f ¾ê5‘]A*¸eåtü®¬YÛ¤üZð,Ê–Êl)I¡Jós=þ;ïôÝ¡¦Ž¤ï½Æ'|lÔu‡À€­C0ZÚÇdký&ÖÇVF@êÊ øœðŠÉ®O£ŽIGC-•¬B’Ö‘€-åÑa9ªÄ†F‰ÚÄÉý7æ Tôw&±1ÒCì~Ã3ué«ö]ZˆWEØsb-ì@~FVS§ÁÉäIOç×ÜÕ¬·#„õ``…>c¿oæ3}tãœé°Ø+ÁV€›ÒË£éÛ‘ Žµƒ»›çÌê»K,$üŒžÊ>oeð†¹µ¿î ¢H¨s÷‚¼™8¥x*µlû†ì4 j$n¾±¦]ÍÜ!Ù>NGÁsúE´¨oÏŠçƒt°v`ŽV7‹@zŒ ’ò§¦tt¥¡©g¿D
-:t¨‹‰Ì’щÛFu^ ,ô“g=èŒD©uJ…c§úg
-·µ]-œ²ÏÆóV¸AîÈŽ2Ÿ¸ µ a’Oð¯(Á©‰xJ©ã8vBv(+^éáË]–ìw–&ÂÇ
-4hŒÎÁºQçžËy¶!Úͽ#?¶F‚}4GL1šgßEónffý §_˜7†yÚ­ØÑIðz”òß?Ë]í#‚ÌA©wuÖ½(hdmt]ãseÏž[h±{«ŽÈ·ÛD Î.ˆ—Œ8ìYµÙT€¯ûµ¦ìy) äÆ
-H‰LR»NÄ@ ì÷+æâØë}¶D蔂8!é à÷ç
-PÚ‰ÇcõeÃú´)îî7¤kRŒã^ø|½¥W|¦uÛÛ•Ú<Þ>ùng·ìÛsÊR´ái}$ûý;]aP^kbcTØÚ§á|I¸¤œ¥Ö‚EÅÚÀGàƃŠÚ
-MßfÃ~Ìbý¶!ë2øai&ÎäÂþÔb½;©SûA­b™þ8é9±0sr•]Ô‡'þ!§ô+À
-la endstream endobj 50 0 obj <</Filter/FlateDecode/Length 122>>stream
-H‰$Ž;1 Dûœb.°Žçƒ[ Új—"g@ôPp}ьƚ÷$ç‡#θÞ)ûdøSëºR-²ëê*˜~&!Á7è=è×'5È K [ÒZQ•”ïgš¡¥ŒFR RÈÌ°…iÝÐâ,íÞøã'À
-H‰$Ž;1 Dûœb.°Žçƒ[ Új—"g@ôPp}ьƚ÷$ç‡#θÞ)ûdøSëºR-²ëê*˜~&!Á7è=è×'5È K [ÒZQ•”ïgš¡¥ŒFR RÈÌ°…iÝÐâ,íÞøã'À
-H‰ìUËnÛ@ ¼ó+xl¢—Ë}^£=¥E`=ö ÚuŠ8@âùýÎʲ;ho Ð‹är¸# W»øÜóâ¦w|õ¡gZôKÇý’Ädín÷dÍ6MÌËþ©8U~FöGdßQnƒ•5KQã.©XLÌ)?­h Hu¹Ar5Ï- ¨š*G/Õ§}Ú#9.ÓÙáBè ?ì9;vóÁ»ñY'G98ñ1ŽQRôÆã–ÚÀ–º"јF .˜”ZNîüéñ&UÏÈÎ^¨Ís°F:¹À½*|>ñO;Fò¼Ã1y{ ø,©FV¸U1Ü4q˜ŒÆöl¤»Àu…8DLT‘0ãA*4:û'Ⱦ ŸC^•\Ó-õh=¥æ©'Þ¾0›·-ÍëâüyWèò_¬E¬“ )IÁ”¢Z~!C(€ ³ñ=uQ‘ÂAr©Í5ñÉ·o§)ÀßLKô/n¨û™÷-] §ßóï:®ý®ƒ~m4†5:S½çaän¶žsk)ž=ö†Ò¾¼x.Gðèl†hʇ-½WO?ïÖw«oï‡t=Ðõ ö®_
-H‰tVËn$7 ¼÷WèZ¥k&‹
-.Ò€=‘ÆL#¼Åª4/:ëòQ^s¡á\.ôŽÈ@Xl{_¶u‡Ü¯ûÌMÓ)K 0èmÇQ“Q×Ií Wi œ‰‹³– µD  i¡^3Ó6<tK€"‰“ ñ¸#¸ÏyǯÄ#,qK^¼¥·B BÕ7êÜ»jé«s“ûÉ:¥˜ aðà}l[£|TïXBä|:«Û‘-êFÂê-ù5ÒD}ÐUñ€í ¡‚˜ÚW”-š¡Ìì
-â Ê’‚Z)NAèäJë<‹Ò¤x[ÊNP—–?×ããùh7ôA¨gAv‘ì½õDÀB Ø¢U),tj7A´[
-sÀÎ ©Ú‰ƒ©À@VÀFݦ(ð¨AÊ<(A¨Æ–nà‹*}C£$m"Á1O˜àe¼ó0飚Äî7<IÍé«Í+'%rvª.ra-Ä‚bEvÏ ÃÉRÊÈàWÊ îŒyA’ ``…1c¿@â'd£#™Ž+‘œHKgŒ¸9òæÈØÎÞsΰYpwó\YCvl¨þÙG
-û¼éþŽ¹½¾¼2{@Ê7³ß]H
-[÷ ªY+Ï1€|czžÐø²œZ*9.NG‡Óbìþ íÐÂÄDâù™àõXÙ֧׎‰#Ð!ù pÁ=oÅáºÒÏX~žÌ3ÌS\T
-¿•–„ |M¢æV#v%Ð(”šlÍ¡±M–è}o#ø¼YÚnÖºÏQso(Ü w”‡ »cÚɤŒÀQÍTXyp2pgŸßd ²:Hñ@þòP&û^¦ ` ätÐnºgÿr]M²eæÞñ]ò‘‡`ùÄc\ŽÝ5ïVf6`8ãÂ:Ê’iíÖÇ\Á RÊ_øû¹<4¿â(êCãcX/*eÄà%Ÿ ß+§ôÜJë{òjô|M$✉÷pBçCv ¼ä4fR|¡àùSNÀà[ ³
-H‰ìUKn1 ÝÏ)taDR?në]¥EàE`ô³ˆ¤^ôú}”FJ
-´@ØÌã÷ñ#ùîó)ÜÝŸbx÷þ¶»Ó9†Ó9DÊEý©†gQW.!œOŸ6¦È~Áú#¬¿ß¶êʸRƒb/LšRHJ9üüºáb±ºKÍÄb…Ì,ìð´b!J¦Ï[ ­wü úž¯Ë-Äãn—§í9pRE*•„y.×Íåþ„BjxÄR²³Sj–Š1!•Ú&ºl;+¥ÂK’4çå{ÀÔ­Ž0f$A´TaIÌ“þؾm¯hj£¦œ½3ÕZ{áY(7#
-¯2UÍ [Ð>É’z–X&%˲´ ®‡ßFHXèéRg¹û8Š„]„0j°"¶#Ü7è5ÙÐ÷vNA¦=†w@Z¹Bß3 êÝ¥ÁÎ`g´Âr—h­ÝeH|ÛƦpßÁØ^áÙ—‰ÙËÎ>È$%Ü“ÌÞè²!-LȉŠµéx Ù›"+û,@Jê8ö;릙pVŠ ÍF9e{™ðŽÀ1z`i½<1Šì¾vç€dÚ«(ƒµu¢bsAŽ£ #ìuùÖC€*J=£)—¬ýôè<†>Ãù.^—@ÕŠ¢Á¡ÄÒ–¢H–Oˆ-2D­K=RO߃È}YĶ¼˜w–ôº6·c)yé—Êuás§•¸Ü$$¸±p²¼Ë“ìA@˜Š,Áìítž­^|§
-H‰TTKŽ1 Ýç¹@¹cÇùm)«zÁZ6 ,¸>ÏN¥ªGÝ]íç_Ù~Nn_÷x{ÙSüðqá-¤Øý»á÷ç{ø‡Û~Oq¿ÇD¥f{ægÍ&g®1Þ÷/Aˆ«Ä1Ü>ÃûÇßð9&|8jó¨ƒrÑ¿‚~…©jŽ[B,Ç-ã¯jY⦤µEsI=>Â&$½˜SåaNƒa­¤£žhPíî{`.ÔTãV¨ÛkE7@f'‚77¥^vê]¯ð…ÏôK‘}+žI¬Ï>eËÍÔ0´ËV¥8GÚ›¡™–‰D¡†çÖ©¡ïLÃÞ%ô£Ô«;v*Eb¡ìUbzCj]½MÙ
-Aéa“FR¬^¼&_ðjkÙ;qѸ¢7)””ϹMÿLšË©
->ÐÊ}Àê}`U
-Ø_|Eág¸‡×ç•©T†õˆÜÜëÓÊt¬…B4v2<³÷vAÿÏ>Î¥”ÄF£”Jw:óAFï2¼2Lº;Ye6ÔÖR¬k.zc3ƒE™<Œ>P´>á« C3@¿ï®—ƒì`5-áLßô˜²b:s.…u9B¥RΞóüHpî§P|Õ ªAå<¡Ì]qâ;Òªo:³w¼ÎJëÖ‡ iÌMÈŠIf¤?³-5‡-ÃKz„>õ½ õ™vî'¼º;“â›Þm c=ØnfWÔ dUFE…%¶{ìע̵ Ž¨Ð0ú9*Î Ž¦»~zÁUøþ 0
-H‰LR»NÄ@ ì÷+æâØë}¶D蔂8!é à÷ç
-PÚ‰ÇcõeÃú´)îî7¤kRŒã^ø|½¥W|¦uÛÛ•Ú<Þ>ùng·ìÛsÊR´ái}$ûý;]aP^kbcTØÚ§á|I¸¤œ¥Ö‚EÅÚÀGàƃŠÚ
-MßfÃ~Ìbý¶!ë2øai&ÎäÂþÔb½;©SûA­b™þ8é9±0sr•]Ô‡'þ!§ô+À
-la endstream endobj 28 0 obj <</ArtBox[8.52979 16.9048 70.4722 61.4292]/BleedBox[0.0 0.0 80.0 80.0]/Contents 80 0 R/LastModified(D:20131120153904-08'00')/MediaBox[0.0 0.0 80.0 80.0]/Parent 10 0 R/PieceInfo<</Illustrator 47 0 R>>/Resources<</ColorSpace<</CS0 48 0 R>>/ExtGState<</GS0 49 0 R>>/Properties<</MC0 5 0 R>>>>/TrimBox[0.0 0.0 80.0 80.0]/Type/Page>> endobj 29 0 obj <</ArtBox[16.8232 10.0 61.5586 70.5557]/BleedBox[0.0 0.0 80.0 80.0]/Contents 81 0 R/LastModified(D:20131120153904-08'00')/MediaBox[0.0 0.0 80.0 80.0]/Parent 10 0 R/PieceInfo<</Illustrator 47 0 R>>/Resources<</ColorSpace<</CS0 48 0 R>>/ExtGState<</GS0 49 0 R>>/Properties<</MC0 5 0 R>>>>/TrimBox[0.0 0.0 80.0 80.0]/Type/Page>> endobj 30 0 obj <</ArtBox[8.08203 8.41699 75.7217 70.1484]/BleedBox[0.0 0.0 80.0 80.0]/Contents 82 0 R/LastModified(D:20131120153904-08'00')/MediaBox[0.0 0.0 80.0 80.0]/Parent 10 0 R/PieceInfo<</Illustrator 47 0 R>>/Resources<</ColorSpace<</CS0 48 0 R>>/ExtGState<</GS0 49 0 R>>/Properties<</MC0 5 0 R>>>>/TrimBox[0.0 0.0 80.0 80.0]/Type/Page>> endobj 31 0 obj <</ArtBox[5.89062 8.14307 71.7246 72.105]/BleedBox[0.0 0.0 80.0 80.0]/Contents 83 0 R/LastModified(D:20131120153904-08'00')/MediaBox[0.0 0.0 80.0 80.0]/Parent 10 0 R/PieceInfo<</Illustrator 47 0 R>>/Resources<</ColorSpace<</CS0 48 0 R>>/ExtGState<</GS0 49 0 R>>/Properties<</MC0 5 0 R>>>>/TrimBox[0.0 0.0 80.0 80.0]/Type/Page>> endobj 32 0 obj <</ArtBox[8.08203 8.41699 71.916 64.1318]/BleedBox[0.0 0.0 80.0 80.0]/Contents 84 0 R/LastModified(D:20131120153904-08'00')/MediaBox[0.0 0.0 80.0 80.0]/Parent 10 0 R/PieceInfo<</Illustrator 47 0 R>>/Resources<</ColorSpace<</CS0 48 0 R>>/ExtGState<</GS0 49 0 R>>/Properties<</MC0 5 0 R>>>>/TrimBox[0.0 0.0 80.0 80.0]/Type/Page>> endobj 84 0 obj <</Filter/FlateDecode/Length 117>>stream
-H‰„Î1ƒ0 …á=§x¨ÇÄQÖšªí3 îeàú¤n¨,¿ž¥op|âd ÷Ñ¢õëHTTöJóªì[Xn¯©`uûtûYBu Šæ­¸)“È
-H‰”•ÝŽ1 …ïç)òãÆ?Iœ[
-âj…°p± ¡}‰ã¤ ÓéÒeU©­3Ž}üÅñœ>ÓéáœÓ»÷ç´œÎ_rz|N™JÕøÖŽïªñ_¹¦ôüøs9}„Ó·çåWâ”ñáÔ2I­5I%6K?–Xÿ±¬Xpµ´r!wMO»¡Z+9) üûŽ§NÒ‡{Ž
-º:Y—ai«°³õ-d͆Ä/ï”s(@šâ *\e3 µ´0ÄKŽÊáÔ[ÇCÍSû×åó P©0~ÿAõjÝ ú-ÔÓr`j¨­¡–¨×Líê+L‹˜Ö=ÓF½·k¦WHe”í©ÝAª
-¹Íÿi»×§oEêG¤vƒôÀT_iT}+T¿•ïA-/@­›'káVöPÄ£¦2jÚV˜¸LYÔÝÒÏë:B´Ž":ŒšÔÍŠÛ0/Z‘NýrÒ«Êk§É‹„,¨¶>Ž¤1HU̱1:*&Hvju© ‘5 ²ˆŒl†¢áÞÆv%<Tbp R2…·ÜM}Tj<æNi8¨QFå¥kC-\¶ôq¹ÉMw6ÆÈœ“Xzq¹È×ÞƒEýù'#HÖyK0G
-ÇUBFÝ2xÀ»í·
-H‰tVËn7¼ÏWð†b¿ø¸fà‚ù€E# 8:ä÷SÕÜuV I3Sìf³ÕM=ýv)O.­üðã¥O——V./¥ÕèƧ-<»ñÛ¤—òrùõÐå_èþ Ý¿ÞŽ…ÞËÂs”³K5ó"-á?/wµïj|9Z™ù{âK¿—ÏÛ—ëÛ÷}y»~>¾) ?R¼ÕE"_?\ýtœ­ºâ ï©;eÀ©"À×*×㌪CJT1…lÖ˜EV ŸåԨ͢¨×éTö5 ^*+Å}M‰Bh¯.zÓ¶.\X“rXÁA: O¤c&‚ÚbUšuy/¯¹ÐlæB<ӺƖÇÚ°­;ä~­Ø÷ nšâ Yê@&
-­3Ã6|„e€Fg&ÄÇA x"€4ç;Ý>,qËœyKKº2Iª¾QPwÕÖSWç*&÷SuJ1êé^§]àm¶­^ :ªŒ¥/!r~#Ð3>””x Éì4¹À› …Çã»<…o5Ö(+R
-‚$$y3øá'-O%­u ’¥ò´ˆÑ䚘š'¾læÉAr:zŸã\8ÑêŽ4O¤Šö3¾ë±²áO¯Y„™Ì}FÞ"õ<Æu¦ž±ú´°ažÜ"P÷M4!³:^“¨¹Çð] ”}Ò ™¾²9tl™°%"ö.¤Ï›¤íiaä}N¡{s€á¾£<<ÍíœàÎÔÊðeÑŒeg½Ã§¢ßXlÙاÄ/e²¯ešH
-H‰LRInÃ0 ¼ëü€j!-]ë=EÐC`t94Òü(I[N`[‡Û ­ÃÛ ‡ãLðô<C¸‚æoÔïï3|À%æw‚å„,ÅÖÒu•bç’à¶hЫ}ßÂ> ¸¡Hë2vN–s0Ç9ÄÔp’lÙá7ÄÒ4B å O8·§–Ínv™ ¨â©# `›ššÓà~ìänë@^;w=þìÕ*a1‚ä©BÌŒgà¤,X¯Rë0-®
-‹ìþµõHÞ¬µö2ˆi‡Âig®RºJæmÁ+Á•½"ÌÕèöVsWW»O)ê–°j¥zg»šJ ëpewo£¹ÃÜén€÷v¾5aÓ™*`:î@Ô!Ôîlì÷˜Œ^F½ÑoÁ°<;»¸¯p
-/G½{§ð/À
-H‰TTK®1 Üç¾@{â8ÎgKƒX=ÐÓ,8ÀÁæ!=Xp}ÊIwzÐÌt§۱˕¹}Ýéö²Gúðq§ð"µñÝðûý=|£_á¶ß#íwŠlEý©Ï¢¾V)D÷ýKHÜS£¿nŸáýãOx'¡ˆP.ÜE…,qê‰oÁíoaNF[ä$¶Ì©5G½+m…£ Á[°)ÇnîÓc¢M8el6nQeA:8†$¬©ÓVq<bSã+ü
-üdaø§ Ç|y¨àý”àÄ× §õŒT3pµ²˜ÈË1îjk׸æ6Ð
-]«"°³E£ÂÖg“ÂÖŒ*8ÕQZ€Ru0‘÷WáÚÏ]õqt§­X}‚Ws‡]™ç>Â7Ut{¥?1"2Ré2
-H‰LR»NÄ@ ì÷+æâØë}¶Du S
->
-P’•Ç{×ç ëiSÜÝoHפÇ»ðûzK/øLë¶+¶*µyœ>y6Û­ûö”²møAZ‰~ÿNW”ÁšØ6¤öÙðzI¸¤œ¥Ö‚EÅÚÀGø†ŠÚ
-˜K&›q
-¤®Ç0ÌDÛá¹×`tÙ¥O#ÁT2™¹3!Îb=”^:µ6–mX\f÷Ða쌱\ƒ{Vh§ÛÂű4A£p‚1¹Q(ú6öcËè· Y—ÁK3q&ö§ëÝ ÚhË¡ ³&÷P9tvpÀN¼çô+À
-H‰\RËN1 ¼û+|,‡xã<k â„PÅJ9,„(ôÿ%&i«Vh¥x'NÆ3v¦Ç OÏëÛ Ó´yò¼ØKö kJ¹¯­`UŸ™Ë7M÷8ô~ Vöø”C•µpöRⲧžØSb…‰6å/R•ª¹ã¬8‰5@M¢±
-H‰bd`ab`dd”tr
-ór‹Ôö­,ÊLL (Ê× JM/ÍI,IÊýfü!ÁòC†Gô·áï¾_¿~ù°~?Êÿý”àB LŒŒ·ž;ç
-ò‹KRSôsrÀF+¥§•!RÈ,VHÍ,ÉH-RHJ¦gõ¥¦(”%¦¤æ&e+äƒd¸ix¬RÈÌS
-¼þ[ÄÕ³¨(Cn±7ëüå{í—¾³&6ÜÎ*Ë[>Ês›ð‹wS zäCzÒ]~³Hû-™U$²èü÷£ç¾ëÝ`\ûèû¢'Ì?L~jˆV—vµÊ[6:g…†qxyÇ©ý‘úmûì7Ãw¹ï2w¾3}çù.duÿ7»sHfbŽ\'Û¬ï —ß—_¸¤QïÜ.ŽßÚ–‹êEÞþÖ%?»ú„©r»ï]}@úÎ`=½y¾†i?ͦÿŽ›ö]ÚžiJ&±ýðšøÛgâŸüi;&®˜È.· ÁµiæÎs\¹÷óð
-H‰äSËNÃ0¼û+æ²Éúí+!!TåÀD@…h¥’¿ÏØQ9 õ@‰×žõzÖ3JƧŠqW'ÜÜV˜±Î–“„èZt…1º¶vu9™ñžEo«I܉…1aˆ*ÎyèÔáç‹y½X{µâl&äþL=ãÄÔöôfgh
-Ío,˱×M”T"† !YX^9(†>X/Sö„^cƒØ0h–œœ$'ŸD‹ƒ&ñ!±Ô;q¹Á¨žÇ£½lzrƒYò%Iì溫R”*U%Ó¯_p1\(›+9
->Ìê÷›ßuÆä¹>š€/Ê}çxÀŸÕß.ß\˜éÂÕ¯­¹aéÆ¿pánÇpo¾
-H‰LRANÄ0 ¼çþ@];NìäJAœ
-H‰ìU»Nì0íýS^
-;¶ÇÏ–€¨
- qV lŸ”³œhÜÕÄQë`JcUÊû¨ý§ë(fÕJƒ21¥n=[£(?cðVsÑÛ–ÕºG7ZçÑRw³Ã²2¹LÑfŒ $¨ýOVi´ÄÌì‘™òSåB8$¨ øèŠK?튎ږ ~¤|)¹WíQéW4+²ê/„§WúͲl¹0[±‚4ß¾½E"£‚KÿeúdZÀ×1ɱ²ìß+à´üè=29¥MA{•¡…·õµüᢅñ0õ{%ŽÑ æ¦T6xÌŒµ4Œ$'ëŸoÏㇶ:à†Ur‰áMÚ3aÀÞkO ì\¤a'þŒëç—»ÍÝúïÑp/NqzŽ¡7
-H‰äS[NÃ0ü÷)æÙdýX;¿„„TP•¢•J?¸>cGm%$.
-mFg*!DèÐÜÏ÷z.þ’í®i+-é]Ê­À®»n@ioÇÁÐ3 ­OkämŽBM"Û‹+Ȳou{g’G#¶¤ìáI')º6ðQ†ÂŽ8',Î'ñ9±Á"¥d„(Á¤äXQu Ð,1e–F¶\ªkZ¹Ýü9‰ F‰—%ó´Ðøx•Q©‘ª’ýá.Ž åáJŒnGöÛõ.¦Êóôè¾H÷ã–m¾ª0S…_¿Äª†§ÿB…» έû`
-H‰ÔT=oÂ0ÝïWÜØ>üy‰WRÔ‰V(‘:vH¡P‘J@%þ~Ïù‚ uë‚’Ø÷|~罓g¯Ζ…ÆùSp
-$VFrNj·x@ÝTÀm$Ž)ÝÑ”¶œØ]PÃ4ѲÌHàPuÀÝ™£”ôÔ`3bç‡Í͈' š XTž)cŸ$ôQ;Í©ªš–¸rŽ8ðE–N•»Yä^/O)·7°ê¼)JL¿åÒ袌ìRì #–Å XòÞáïܬí}Ûµ…R »Xrâ“cbÍWˆ%шRc)Ï-îA±£È(ú,AOÚG4â ¸mûàßË&Ö¾×¼‚yu¹þê´ë[aV™÷$¦Ú€–³XÕ¨úèŒ"ƒhISÖ°”y-G;ÒA¤OÌY@§IG醪‡z}üÙmvëÇê ,–r[ý
-0
-H‰¤•Ín1 Çïûyñ&¶;WÄ©BˆG¨(Ú÷—øÛ3-;ÓŠR¡•¢µãøãg'sþt)ç»K-ïÞ_Êé|ùRËýµTêCb•‰uHü—6J¹Þÿ<?ÂèÛõô«´Rñ‹•j¯ZîN¡ŠuÔ­—'ä<Ê’6G'-Ë$÷v# ±Í•&ìÉ5÷…dZì›nûR¹,JÍmóÐ WÒ¡P4RA¼J6ÞI»†elÖê(G•!}ãîeédÍ÷&âLæßÕ;äF&·2r´–ĨÃWš4‡‹ÈÏF¸té[¾!Oª™ÿÓøI_OŸw8ñìHÓ4W78yÓ÷4ehúk4yOÓ÷4y‡óHÓ_¡ÙŽ8ù9ÎyÀ©{œÿ §(y·g8Ç[q¶7òô#OùëtÊŽgûßñ|Γ8í5œüNAŠ©£ð9¸ý¡ºÄ<5ÁëzT ô–å,R3Jh¬†ó…FÚ4ê©A¥²âÙiáD˜D,óñ,YÈGÈŸ BsÍ4ªv£h ¯=+÷í]Âaòl˜sh ý™™Ê¤ÁqDF¦‹l%L¢¬¡9Ðàˆõ0ÀÐX̼×<ˆ«¥b¶¾V£1<J•Ç–ÊÀ
-H‰LRInÃ0 ¼ëü€Š)éZ·è)(‚ú
-C\áßgø€K8Lïó ””bï2ô-ÅÎ% ÀmÖ¤WMú¾…+d@}2Ôœzå”g‚ùŒ?‡˜{jBVÜ~C,]3"&Dz ¨©Ç’Z'ÃÂÝ LCšU<#„ÂFØG -¥¼$x< ô°ˆM@ïMC?{·Š)‹˜ÀÄ­B$N 8«Š6«ÔºÁY›«Ã"{|½¯hé=oÂtBá¼+W+C-óƒ7ÏàEࢾإT_ ãµçî®ßRÔu`õŠõ®v*€t¹²‡×ÕnµÜ宄Ïv½~«b„ù¸Q—P‡«±ë-F0š<J}xØ8òjrs_á^ŽúžÂ¿
-H‰TTK®1 Üç¾@{b;ß- bõ@O³à
-H‰LRANÄ0 ¼çþ@];NìäJAœ
-H‰”•ÝŽ1 …ïç)òãÆ?Iœ[
-âj…°p± ¡}‰ã¤ ÓéÒeU©­3Ž}üÅñœ>ÓéáœÓ»÷ç´œÎ_rz|N™JÕøÖŽïªñ_¹¦ôüøs9}„Ó·çåWâ”ñáÔ2I­5I%6K?–Xÿ±¬Xpµ´r!wMO»¡Z+9) üûŽ§NÒ‡{Ž
-º:Y—ai«°³õ-d͆Ä/ï”s(@šâ *\e3 µ´0ÄKŽÊáÔ[ÇCÍSû×åó P©0~ÿAõjÝ ú-ÔÓr`j¨­¡–¨×Líê+L‹˜Ö=ÓF½·k¦WHe”í©ÝAª
-¹Íÿi»×§oEêG¤vƒôÀT_iT}+T¿•ïA-/@­›'káVöPÄ£¦2jÚV˜¸LYÔÝÒÏë:B´Ž":ŒšÔÍŠÛ0/Z‘NýrÒ«Êk§É‹„,¨¶>Ž¤1HU̱1:*&Hvju© ‘5 ²ˆŒl†¢áÞÆv%<Tbp R2…·ÜM}Tj<æNi8¨QFå¥kC-\¶ôq¹ÉMw6ÆÈœ“Xzq¹È×ÞƒEýù'#HÖyK0G
-ÇUBFÝ2xÀ»í·
-H‰LRInÃ0 ¼ëü€j!-]ë=EÐC`t94Òü(I[N`[‡Û ­ÃÛ ‡ãLðô<C¸‚æoÔïï3|À%æw‚å„,ÅÖÒu•bç’à¶hЫ}ßÂ> ¸¡Hë2vN–s0Ç9ÄÔp’lÙá7ÄÒ4B å O8·§–Ínv™ ¨â©# `›ššÓà~ìänë@^;w=þìÕ*a1‚ä©BÌŒgà¤,X¯Rë0-®
-‹ìþµõHÞ¬µö2ˆi‡Âig®RºJæmÁ+Á•½"ÌÕèöVsWW»O)ê–°j¥zg»šJ ëpewo£¹ÃÜén€÷v¾5aÓ™*`:î@Ô!Ôîlì÷˜Œ^F½ÑoÁ°<;»¸¯p
-/G½{§ð/À
-H‰TTK®1 Üç¾@{â8ÎgKƒX=ÐÓ,8ÀÁæ!=Xp}ÊIwzÐÌt§۱˕¹}Ýéö²Gúðq§ð"µñÝðûý=|£_á¶ß#íwŠlEý©Ï¢¾V)D÷ýKHÜS£¿nŸáýãOx'¡ˆP.ÜE…,qê‰oÁíoaNF[ä$¶Ì©5G½+m…£ Á[°)ÇnîÓc¢M8el6nQeA:8†$¬©ÓVq<bSã+ü
-üdaø§ Ç|y¨àý”àÄ× §õŒT3pµ²˜ÈË1îjk׸æ6Ð
-]«"°³E£ÂÖg“ÂÖŒ*8ÕQZ€Ru0‘÷WáÚÏ]õqt§­X}‚Ws‡]™ç>Â7Ut{¥?1"2Ré2
-H‰LRANÄ0 ¼çóºqœ8É•‚8-hÕ@ˆ ‹´pàûŒ»PÛ¨SÇ»ëó†õ´eÜÝoH×”1Ž{áóõ–^ð™ÖmÏØvdinqÚäéï¦ìÛS*R³ãi}$ûý;]¡È¼ê¢c4èÖ§ãõ’"pI¥HkKõŽÀYúˆBEg€©©Æü´§ó?}›¢Ù+t2±éŸ~–9 JQC+Š*j&£:št-S†èˆ¢-±Õʪ(M2ó»´<ö@P“B9å¨ÝŽi¨Jö™µ4¾t“>•3”!³x(“b¬ÖƒIïµÓ¬³¬c1™Ýˆ²5ÆJ íÙ,¨ÐjXH‡£ÅèF¥ëÛpØjl£ßV¤]?,®b¤Wö—5ö»“:s?¨M´„?,Ìš\DãÔÙÁA{8ñ÷8§_
-0000000016 00000 n
-0000000144 00000 n
-0000053721 00000 n
-0000000000 00000 f
-0000058273 00000 n
-0001024777 00000 n
-0000053806 00000 n
-0000053899 00000 n
-0000053992 00000 n
-0000054085 00000 n
-0000054179 00000 n
-0000054273 00000 n
-0001020530 00000 n
-0001020873 00000 n
-0001021217 00000 n
-0001021559 00000 n
-0001021903 00000 n
-0001016215 00000 n
-0001016569 00000 n
-0001016923 00000 n
-0001017273 00000 n
-0001017657 00000 n
-0001011200 00000 n
-0001011583 00000 n
-0001011929 00000 n
-0001012271 00000 n
-0001012657 00000 n
-0001006479 00000 n
-0001006824 00000 n
-0001007166 00000 n
-0001007511 00000 n
-0001007855 00000 n
-0001001327 00000 n
-0001001671 00000 n
-0001002015 00000 n
-0001002369 00000 n
-0001002713 00000 n
-0000054388 00000 n
-0000054732 00000 n
-0000055076 00000 n
-0000055420 00000 n
-0000055765 00000 n
-0000056109 00000 n
-0000056463 00000 n
-0000056847 00000 n
-0001001136 00000 n
-0000448440 00000 n
-0000058572 00000 n
-0000058459 00000 n
-0001000945 00000 n
-0001000542 00000 n
-0000999431 00000 n
-0000998780 00000 n
-0000998074 00000 n
-0000995351 00000 n
-0000995860 00000 n
-0000057191 00000 n
-0000058343 00000 n
-0000058374 00000 n
-0000058607 00000 n
-0000448514 00000 n
-0000448866 00000 n
-0000449943 00000 n
-0000457047 00000 n
-0000470647 00000 n
-0000536235 00000 n
-0000601823 00000 n
-0000667411 00000 n
-0000732999 00000 n
-0000798587 00000 n
-0000864175 00000 n
-0000929763 00000 n
-0000996062 00000 n
-0000996343 00000 n
-0001006076 00000 n
-0001005425 00000 n
-0001004719 00000 n
-0001003606 00000 n
-0001003097 00000 n
-0001010582 00000 n
-0001010191 00000 n
-0001009093 00000 n
-0001008385 00000 n
-0001008199 00000 n
-0001015719 00000 n
-0001015313 00000 n
-0001014968 00000 n
-0001013401 00000 n
-0001013816 00000 n
-0001013000 00000 n
-0001013987 00000 n
-0001014267 00000 n
-0001019908 00000 n
-0001019514 00000 n
-0001018807 00000 n
-0001018360 00000 n
-0001017999 00000 n
-0001024376 00000 n
-0001023758 00000 n
-0001023366 00000 n
-0001022657 00000 n
-0001022250 00000 n
-0001024800 00000 n
-trailer <</Size 104/Root 1 0 R/Info 103 0 R/ID[<C25AEB0B7B94489ABD16D6A1134038DB><D3F6607B34C54D7A9F1A2379FEE3C06D>]>> startxref 1024983 %%EOF \ No newline at end of file
diff --git a/docs/theme/mkdocs/img/icons/star-icon.svg b/docs/theme/mkdocs/img/icons/star-icon.svg
deleted file mode 100644
index 8a22ad5d1d..0000000000
--- a/docs/theme/mkdocs/img/icons/star-icon.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="29px" height="28.7px" viewBox="0 0 29 28.7" style="enable-background:new 0 0 29 28.7;" xml:space="preserve">
-<polygon style="fill:none;stroke:#939BA7;stroke-miterlimit:10;" points="14.5,22.8 6.3,27.1 7.9,18 1.3,11.5 10.4,10.2 14.5,1.9
- 18.6,10.2 27.7,11.5 21.1,18 22.7,27.1 "/>
-</svg>
diff --git a/docs/theme/mkdocs/img/icons/star-simple.png b/docs/theme/mkdocs/img/icons/star-simple.png
deleted file mode 100644
index 36582bdf9c..0000000000
--- a/docs/theme/mkdocs/img/icons/star-simple.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/img/icons/star-simple.svg b/docs/theme/mkdocs/img/icons/star-simple.svg
deleted file mode 100644
index acbff6f1e5..0000000000
--- a/docs/theme/mkdocs/img/icons/star-simple.svg
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
- <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
-]>
-<svg version="1.1"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
- x="0px" y="0px" width="24px" height="24px" viewBox="0 0 24 24" overflow="visible" enable-background="new 0 0 24 24"
- xml:space="preserve">
-<defs>
-</defs>
-<polygon fill="#807C74" points="11.716,0 14.401,8.191 23.431,8.513 16.61,14.136 18.956,22.283 12.194,17.873 4.476,22.283
- 6.759,14.136 0,8.513 8.968,8.191 "/>
-</svg>
diff --git a/docs/theme/mkdocs/img/icons/trusted-icon.svg b/docs/theme/mkdocs/img/icons/trusted-icon.svg
deleted file mode 100644
index 700f275f8b..0000000000
--- a/docs/theme/mkdocs/img/icons/trusted-icon.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" height="16px" width="16px" > <path opacity="0.702" fill="rgb( 170, 180, 192 )" d="M8,0 C3.58199999999999,0 0,3.58199999999999 0,8 C0,12.418 3.58199999999999,16 8,16 C12.418,16 16,12.418 16,8 C16,3.58199999999999 12.418,0 8,0 ZM6.75999999999999,11.691 C6.75999999999999,11.691 3.07899999999995,8.00999999999999 3.07899999999995,8.00999999999999 C3.07899999999995,8.00999999999999 4.49300000000005,6.596 4.49300000000005,6.596 C4.49300000000005,6.596 6.75999999999999,8.863 6.75999999999999,8.863 C6.75999999999999,8.863 11.569,4.05500000000001 11.569,4.05500000000001 C11.569,4.05500000000001 12.982,5.46899999999999 12.982,5.46899999999999 C12.982,5.46899999999999 6.75999999999999,11.691 6.75999999999999,11.691 Z "/> </svg> \ No newline at end of file
diff --git a/docs/theme/mkdocs/img/lightbox/add-button-icon.svg b/docs/theme/mkdocs/img/lightbox/add-button-icon.svg
deleted file mode 100644
index 0714e6be91..0000000000
--- a/docs/theme/mkdocs/img/lightbox/add-button-icon.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" height="12px" width="12px" > <path fill="rgb( 255, 255, 255 )" d="M0,5 C0,5 12,5 12,5 C12,5 12,7 12,7 C12,7 0,7 0,7 C0,7 0,5 0,5 Z "/> <path fill="rgb( 255, 255, 255 )" d="M7,0 C7,0 7,12 7,12 C7,12 5,12 5,12 C5,12 5,0 5,0 C5,0 7,0 7,0 Z "/> </svg> \ No newline at end of file
diff --git a/docs/theme/mkdocs/img/lightbox/escape-lightbox-icon-over.svg b/docs/theme/mkdocs/img/lightbox/escape-lightbox-icon-over.svg
deleted file mode 100644
index 3120d0c32c..0000000000
--- a/docs/theme/mkdocs/img/lightbox/escape-lightbox-icon-over.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" height="14px" width="14px" > <defs> <filter id="Filter_0"> <feFlood flood-color="rgb( 36, 184, 235 )" flood-opacity="1" result="floodOut" /> <feComposite operator="atop" in="floodOut" in2="SourceGraphic" result="compOut" /> <feBlend mode="normal" in="compOut" in2="SourceGraphic" /> </filter> <filter id="Filter_1"> <feFlood flood-color="rgb( 36, 184, 235 )" flood-opacity="1" result="floodOut" /> <feComposite operator="atop" in="floodOut" in2="SourceGraphic" result="compOut" /> <feBlend mode="normal" in="compOut" in2="SourceGraphic" /> </filter> </defs><g filter="url(#Filter_0)"> <path fill="rgb( 0, 89, 118 )" d="M0,12.133 C0,12.133 12.133,0 12.133,0 C12.133,0 14,1.86699999999999 14,1.86699999999999 C14,1.86699999999999 1.86699999999996,14 1.86699999999996,14 C1.86699999999996,14 0,12.133 0,12.133 Z "/> </g> <g filter="url(#Filter_1)"> <path fill="rgb( 0, 89, 118 )" d="M1.86699999999996,0 C1.86699999999996,0 14,12.133 14,12.133 C14,12.133 12.133,14 12.133,14 C12.133,14 0,1.86699999999999 0,1.86699999999999 C0,1.86699999999999 1.86699999999996,0 1.86699999999996,0 Z "/> </g> </svg> \ No newline at end of file
diff --git a/docs/theme/mkdocs/img/lightbox/escape-lightbox-icon.svg b/docs/theme/mkdocs/img/lightbox/escape-lightbox-icon.svg
deleted file mode 100644
index efae83a6c6..0000000000
--- a/docs/theme/mkdocs/img/lightbox/escape-lightbox-icon.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" height="14px" width="14px" > <path fill="rgb( 0, 89, 118 )" d="M0,12.133 C0,12.133 12.133,0 12.133,0 C12.133,0 14,1.86699999999999 14,1.86699999999999 C14,1.86699999999999 1.86699999999996,14 1.86699999999996,14 C1.86699999999996,14 0,12.133 0,12.133 Z "/> <path fill="rgb( 0, 89, 118 )" d="M1.86699999999996,0 C1.86699999999996,0 14,12.133 14,12.133 C14,12.133 12.133,14 12.133,14 C12.133,14 0,1.86699999999999 0,1.86699999999999 C0,1.86699999999999 1.86699999999996,0 1.86699999999996,0 Z "/> </svg> \ No newline at end of file
diff --git a/docs/theme/mkdocs/img/nav/caret-down-subnav-icon.svg b/docs/theme/mkdocs/img/nav/caret-down-subnav-icon.svg
deleted file mode 100644
index 87e765aa59..0000000000
--- a/docs/theme/mkdocs/img/nav/caret-down-subnav-icon.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="15.4px" height="9px" viewBox="0 0 15.4 9" style="enable-background:new 0 0 15.4 9;" xml:space="preserve">
-<polygon style="fill:#005976;" points="15.4,1.2 14.3,0.1 7.7,6.6 1.2,0.1 0,1.2 6.6,7.8 6.6,7.8 7.7,8.9 8.9,7.8 8.9,7.8 "/>
-</svg>
diff --git a/docs/theme/mkdocs/img/nav/caret-down-user-icon-over.svg b/docs/theme/mkdocs/img/nav/caret-down-user-icon-over.svg
deleted file mode 100644
index 642cfbcfed..0000000000
--- a/docs/theme/mkdocs/img/nav/caret-down-user-icon-over.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="15.4px" height="9px" viewBox="0 0 15.4 9" style="enable-background:new 0 0 15.4 9;" xml:space="preserve">
-<polygon style="fill:#24B8EB;" points="15.4,1.2 14.3,0.1 7.7,6.6 1.2,0.1 0,1.2 6.6,7.8 6.6,7.8 7.7,8.9 8.9,7.8 8.9,7.8 "/>
-</svg>
diff --git a/docs/theme/mkdocs/img/nav/caret-down-user-icon.svg b/docs/theme/mkdocs/img/nav/caret-down-user-icon.svg
deleted file mode 100644
index 87e765aa59..0000000000
--- a/docs/theme/mkdocs/img/nav/caret-down-user-icon.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="15.4px" height="9px" viewBox="0 0 15.4 9" style="enable-background:new 0 0 15.4 9;" xml:space="preserve">
-<polygon style="fill:#005976;" points="15.4,1.2 14.3,0.1 7.7,6.6 1.2,0.1 0,1.2 6.6,7.8 6.6,7.8 7.7,8.9 8.9,7.8 8.9,7.8 "/>
-</svg>
diff --git a/docs/theme/mkdocs/img/nav/docker-logo-loggedin.png b/docs/theme/mkdocs/img/nav/docker-logo-loggedin.png
deleted file mode 100644
index 8a3d58497b..0000000000
--- a/docs/theme/mkdocs/img/nav/docker-logo-loggedin.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/img/nav/docker-logo-loggedin.svg b/docs/theme/mkdocs/img/nav/docker-logo-loggedin.svg
deleted file mode 100644
index 434a21741f..0000000000
--- a/docs/theme/mkdocs/img/nav/docker-logo-loggedin.svg
+++ /dev/null
@@ -1,1985 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
- <!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
- <!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
- <!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
- <!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
- <!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
- <!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
- <!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
- <!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
-]>
-<svg version="1.1" id="Layer_1" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="47px" height="32.8px"
- viewBox="0 0 47 32.8" style="enable-background:new 0 0 47 32.8;" xml:space="preserve">
-<switch>
- <foreignObject requiredExtensions="&ns_ai;" x="0" y="0" width="1" height="1">
- <i:pgfRef xlink:href="#adobe_illustrator_pgf">
- </i:pgfRef>
- </foreignObject>
- <g i:extraneous="self">
- <g>
- <path id="outline_7_" style="fill-rule:evenodd;clip-rule:evenodd;fill:#008BB8;" d="M29.2,17h2.4c1.1,0,2.3-0.2,3.3-0.6
- c0.5-0.2,1.1-0.4,1.6-0.7c-0.7-0.9-1-2-1.1-3.1c-0.1-1.5,0.2-3.4,1.2-4.6L37,7.5L37.6,8c1.5,1.2,2.8,2.9,3,4.8
- c1.8-0.5,3.9-0.4,5.5,0.5l0.7,0.4l-0.3,0.7c-1.3,2.6-4.2,3.4-6.9,3.3c-4.1,10.3-13.1,15.1-24,15.1c-5.6,0-10.8-2.1-13.7-7.1
- l0-0.1l-0.4-0.9c-1-2.2-1.3-4.6-1.1-7L0.3,17h4.1H29.2z"/>
- <g id="body_colors_8_">
- <path style="fill:#008BB8;" d="M39.8,14c0.3-2.5-1.5-4.4-2.7-5.4c-1.3,1.5-1.5,5.6,0.5,7.2c-1.2,1-3.6,2-6.1,2H1.1
- c-0.1,0.9-0.1,1.8,0,2.7c0.2,1.6,0.6,3,1.3,4.4l0.3,0.6c0.2,0.4,0.5,0.7,0.7,1.1l0,0c1.3,0.1,2.4,0.1,3.5,0.1c0,0,0,0,0,0
- c2.1,0,3.8-0.3,5.1-0.7c0.2-0.1,0.4,0,0.5,0.2c0.1,0.2,0,0.4-0.2,0.5c-0.2,0.1-0.3,0.1-0.5,0.2c0,0,0,0,0,0
- c-1,0.3-2.1,0.5-3.5,0.6c0.1,0-0.1,0-0.1,0c0,0-0.1,0-0.2,0c-0.6,0-1.1,0-1.8,0c-0.7,0-1.3,0-2.1-0.1l0,0
- c2.5,2.9,6.5,4.6,11.5,4.6C26.1,32,35,27.3,39,16.8c2.8,0.3,5.5-0.4,6.7-2.8C43.8,12.9,41.3,13.2,39.8,14z"/>
- <path style="fill:#008BB8;" d="M39.8,14c0.3-2.5-1.5-4.4-2.7-5.4c-1.3,1.5-1.5,5.6,0.5,7.2c-1.2,1-3.6,2-6.1,2H2.9
- c-0.1,4,1.4,7,4,8.9c0,0,0,0,0,0c2.1,0,3.8-0.3,5.1-0.7c0.2-0.1,0.4,0,0.5,0.2c0.1,0.2,0,0.4-0.2,0.5c-0.2,0.1-0.3,0.1-0.5,0.2
- c0,0,0,0,0,0c-1,0.3-2.2,0.5-3.6,0.6c0,0,0,0,0,0c3.6,1.8,8.8,1.8,14.7-0.5c3.3-1.3,5.8-5,9.4-5.3c5-0.4,5.6-4.9,7.8-7.7
- C39.9,13.9,39.9,13.9,39.8,14z"/>
- <path style="fill:#008BB8;" d="M1.1,21c0.2,1.4,0.6,2.7,1.2,3.9l0.3,0.6c0.2,0.4,0.5,0.7,0.7,1.1c1.3,0.1,2.4,0.1,3.5,0.1
- c2.1,0,3.8-0.3,5.1-0.7c0.2-0.1,0.4,0,0.5,0.2c0.1,0.2,0,0.4-0.2,0.5c-0.2,0.1-0.3,0.1-0.5,0.2c0,0,0,0,0,0
- c-1,0.3-2.2,0.5-3.6,0.6c0,0-0.1,0-0.2,0c-0.6,0-1.1,0-1.7,0c-0.7,0-1.3,0-2.1,0c2.5,2.9,6.5,4.6,11.5,4.6c9,0,16.9-3.4,21.4-11
- H1.1z"/>
- </g>
- <g id="body_colors_10_">
- <path style="fill:#008BB8;" d="M37.7,15.9c-1.2,1-3.6,2-6.1,2H1.1c-0.1,0.9-0.1,1.8,0,2.7c0.2,1.6,0.6,3,1.3,4.4l0.3,0.6
- c0.2,0.4,0.5,0.7,0.7,1.1l0,0c1.3,0.1,2.4,0.1,3.5,0.1c0,0,0,0,0,0c2.1,0,3.8-0.3,5.1-0.7c0.2-0.1,0.4,0,0.5,0.2
- c0.1,0.2,0,0.4-0.2,0.5c-0.2,0.1-0.3,0.1-0.5,0.2c0,0,0,0,0,0c-1,0.3-2.1,0.5-3.5,0.6c0.1,0-0.1,0-0.1,0c0,0-0.1,0-0.2,0
- c-0.6,0-1.1,0-1.8,0c-0.7,0-1.3,0-2.1-0.1l0,0c2.5,2.9,6.5,4.6,11.5,4.6C26.1,32,35,27.3,39,16.8C41.8,17.1,35.6,14.2,37.7,15.9
- z"/>
- <path style="fill:#008BB8;" d="M39.8,14c0.3-2.5-1.5-4.4-2.7-5.4c-1.3,1.5-1.5,5.6,0.5,7.2c-1.2,1-3.6,2-6.1,2H1.1
- c0,1-0.1,2.1,0.1,3c0.1,0.4,0.2,0.7,0.4,1c0,0.1,0.6,0,0.6,0.1c1.2,2,3.1,3.6,4.7,4.8c0,0,0,0,0,0c2.1,0,3.8-0.3,5.1-0.7
- c0.2-0.1,0.4,0,0.5,0.2c0.1,0.2,0,0.4-0.2,0.5c-0.2,0.1-0.3,0.1-0.5,0.2c0,0,0,0,0,0c-1,0.3-2.2,0.5-3.6,0.6c0,0,0,0,0,0
- c3.6,1.8,8.8,1.8,14.7-0.5c3.3-1.3,5.8-5,9.4-5.3c1.7-0.1,3.4,0,4.4-0.8c0.2-0.1,0-0.1,0.2-0.2C38.3,18.9,39.9,13.9,39.8,14z"/>
- <path style="fill:#008BB8;" d="M1.1,21c0.2,1.4,0.6,2.7,1.2,3.9l0.3,0.6c0.2,0.4,0.5,0.7,0.7,1.1c1.3,0.1,2.4,0.1,3.5,0.1
- c2.1,0,3.8-0.3,5.1-0.7c0.2-0.1,0.4,0,0.5,0.2c0.1,0.2,0,0.4-0.2,0.5c-0.2,0.1-0.3,0.1-0.5,0.2c0,0,0,0,0,0
- c-1,0.3-2.2,0.5-3.6,0.6c0,0-0.1,0-0.2,0c-0.6,0-1.1,0-1.7,0c-0.7,0-1.3,0-2.1,0c2.5,2.9,6.5,4.6,11.5,4.6c9,0,16.9-3.4,21.4-11
- H1.1z"/>
- </g>
- <path style="fill-rule:evenodd;clip-rule:evenodd;fill:#FFFFFF;" d="M13.8,23.8c0.6,0,1.1,0.5,1.1,1.1s-0.5,1.1-1.1,1.1
- c-0.6,0-1.1-0.5-1.1-1.1S13.2,23.8,13.8,23.8"/>
- <path style="fill:#FFFFFF;" d="M16.9,31.4c-2.8-1.3-4.4-3.2-5.2-5.1c-1,0.3-2.3,0.5-3.8,0.6c-0.6,0-1.1,0-1.7,0
- c-0.7,0-1.4,0-2.2-0.1c2.6,2.6,5.8,4.6,11.6,4.6C16,31.4,16.4,31.4,16.9,31.4z"/>
- <path style="fill-rule:evenodd;clip-rule:evenodd;fill:#008BB8;" d="M10.1,5.5h4.3v4.1h-4.3V5.5z"/>
- <path style="fill-rule:evenodd;clip-rule:evenodd;fill:#008BB8;" d="M4.7,11h4.1v4.1H4.7V11z"/>
- <path style="fill-rule:evenodd;clip-rule:evenodd;fill:#008BB8;" d="M15.8,11h4.1v4.1h-4.1V11z"/>
- <path style="fill-rule:evenodd;clip-rule:evenodd;fill:#008BB8;" d="M26.4,11h4.1v4.1h-4.1V11z"/>
- <path style="fill-rule:evenodd;clip-rule:evenodd;fill:#008BB8;" d="M21.3,5.5h4.1v4.1h-4.1V5.5z"/>
- <path style="fill-rule:evenodd;clip-rule:evenodd;fill:#008BB8;" d="M21.3,0h4.1v4.1h-4.1V0z"/>
- <path style="fill-rule:evenodd;clip-rule:evenodd;fill:#008BB8;" d="M15.8,5.5h4.1v4.1h-4.1V5.5z"/>
- <path style="fill-rule:evenodd;clip-rule:evenodd;fill:#008BB8;" d="M21.3,11h4.1v4.1h-4.1V11z"/>
- <path style="fill-rule:evenodd;clip-rule:evenodd;fill:#008BB8;" d="M10.1,11h4.3v4.1h-4.3V11z"/>
- </g>
- </g>
-</switch>
-<i:pgf id="adobe_illustrator_pgf">
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- se0jfH0Ep48Y84brViYXd6DbC/ny38M3Tzknslh17P8A/L8M/c/tVcsOdqpAxSF3ZtplcOjP9xiD
-PmXRDferQzBi8TrsrsPrzkMUOjSXmWTTCBI6ySlLdNAjO0E62wsA/bmbiPlJxPrcEOMTiesBnOeO
-EJ6VgB2AdIDJicTdbITTACYDfIs+2Xj28acdfaxHrU6fctaqn0j845N91JMNYmKWqb9QwQ/zRgU/
-z/MKie9KlkdMDI7SPFbnf/Q8X1UktyGX/2duVgXLdV6YEzzlEJiBTLpPupZSY1HjSUSq9+XCH63J
-vFxtokIPT/pZm1VzzKfZx73JcIXN97OZ3U+a1T6dkXgU7yxchS+Wwhw3js6cq748k/tf+OOiIP+Z
-GvwkIX+9JOOvO7s50yYhe0+1JO33TNDuzBHp2e8tMQ/YsyZB1j3yzjbFaEo4tr1tMv37tunf4cYP
-Jl/b8SqeX7wdrDKeqzIcSiULedqfRnVyENX+EKoRB74/gGo4impMNfj+M/OeVu6nDzvS6PvLX79B
-tctpKt59/BNsbrC06TnpKuW5hHdsiawis8IVJkW+sQ2c0di6g0Oes6RVLZ/4atnZ3HByw13i3pC+
-C00ma0unRrzv1MwlmgJptrRVCw0mcIR74rVqOc56xFIH1A7ukpNkZKdnfTPf1eWSLpZ1quvFkj+2
-TB9/6WdqUKdGz7rmqeg81b6et+mJDYv92wa6p2qGgTd6lueF7o4xKfP4P36PSa7nId31CGR/Et79
-o35+bPAJF9ghGLOsxhsR5HEaLs7BnXn67ZGn3kLQWyjkQcSDgAfxbuVxtjMPsoVkN8p1RKw8JtYN
-gl0T7W4NeXFtWeT97Fk/LiJOwyHenhq/Z9QfT5kdT9zezqZ8ywi5P6/+/afSP+nQ6u87Xv6HH8vP
-3qCaYm7sHOhEk8wI7qqW9kCTHrSMB+8/1GRqB3jkvdFpZ+E+DgmS3MLtSZJGI3eo82SW7nvLp3dr
-9u4bs3kfW+ynbyQ9YWb/GTJ+Tid5N9ezEh8py+UyPfJF+Ngyffyln6lBxTp0n8DoFXC/QDhDQDj+
-YTx4vOfGE7lx2aXF60nSn5IRb58Tj5m/PHQltjJGv+yRXyeBNBcPy7ybHovKOcOuPK3cTN8Pcvmw
-8tdvcDTw/dWl4h+iwffqFtMjX1w+dOA8e/qYRZ1a0XTxCIJ8ll1yn2EynC0kX0bHydbQZmsnmzdu
-3R1nZAdcXEhxE064PZP8g91HWuTvDcyrNvkou/m9PPaRnDwL716q7it/dan4Uxq8rCKsj+gUpnFM
-ZyrImbJyklF5hIV17adpRFNLA+17l2aR1t1F5R3NNXtjYOgjtbBiiQBXinoLBS0gFG4nSn03lvSv
-GBCaKf4ssx9MfAp8hoEP5r2Z6OYb0RpV/lOrngp/x6nJfZT4TM6DfAepDmIchLdr6hqQw+JfPJL2
-xwbPfvb6mQUaT+2Dn72znCh8e0XQQUGxHeWz1zS3aVA164mqWXZKqhVTVT6xY85+/iINvl81eOy4
-QivTxSOhTs90GtWZpuWc9SK1osmQm+PhBTcDbvO+AbZCS6YX7VCwPKTUsxyAmlTPvYijH/F9nsTz
-hIY9nSEPEtia12ifx+uGmXYWWpaQlJ/nEOopln9tqfhTGnxEd3ikmMYxnakg58rKXpkZ9JxLBwlM
-/dwAK0fLKtKPB7gb8ovMLcfIe7KMPOY9HX2nftb4Zh7TfrDfYoeL64F+19POlL2YIbvS73dD+3Wg
-5y/JA8NerZCSv7pU/EM0+F7dYnrki8cVmLtLOk/XiKYhC38vo0LV1SzPCdB1sWxuhNLT9E+mxPXj
-2o+m6J1n7B9PbO8gv2yuBHMeTI71OzsfV09iz7uzcW/ubk9QZ0U4EvBhwrZwcm/DjbmLDxp+Subq
-KfUKB/0eynoVUhmccp/WDF1baV424qjnsGQexyM8MyTN7bjGbQlEMwNfPfryQjys5UrYcn+YT25J
-Tz/6oFeq5bCsV2X3HB/dwic509IlZ1raIVMv4l5O96snJ4Nd11MEzCkGJgznsCL/05Dl1g+K9BOI
-/P9+wOH+eMguYsXTz9NONBhPdjwVEiBwibDVzu11DOeHQzhNXTzJhzod90ce92Tqj9kHiUgdz2+4
-Hw5aOz/AYRsOSdsf4bC2IxyW6dFTHLoGfj2YpyBshn3e1oUniM1LLcVPzcqzLKCFcQU8MD48mqn1
-wy/Wc7ZkSdDtLHNiXYpdWT1mYVMc62VY6kdc+2lr7SIMPP2IA/8RB/4jDvyz4sDzdmmlCfUsuig8
-Ibro8dz0ptF9ZpNM22meONuekMLbJ28/LujWzln1I4P6oUG1HRqUh8OL+oGhOBnphPd/MCfdzcKP
-ulrPSzg7S2E34R77/pPmVrkoMpX0vsi1R6O+3nPywQ53fDmkrMsu+dLUHZp3C0XaBaw9GqfWG6wn
-MWqnJwecPe3l8LTHJ+/jzHI3hR/nvk/lv+9ZFU9j6U/Kk396YmuQTYnahcxZCOugzHnbbIobm21z
-/fRM0ZN18sltfe5It3/+w4t3D//1cHz57Pl/yLLYffxLnAJybjb7yHNAprOEs56u2tPNjqlmb9tx
-gvtc1Z5j9gaoqztLL7sMePQ9Vv7x9Phjcvxjx8d/Cvz/Zsh4T/z/9PEBAFZaCkhP1HhqdjmxmvyQ
-56ucWVY/+oSVSdXUR2aK5+5MdhSlTpaen9hF4J6jWETfjSEALvze2YGnT8hzfpKf2KyG77MYPi3e
-4vywhY+NuNinFuiHLZymkLi9kKTgSVPhI06umT/X2TXThYmwC9Wh/2+cCOOZpD4NhmTV75sK35ew
-ep+u2szIU/20AJfTSXE7fXyIyzBFhokyPXIsxz4dxeeTnk2G/ss1eMkzdelg7LLnbtMF5nZBv7iY
-eXifd9gCiqZPjCgqGlPUQ4qmj48pMs/CUY0PNDvE23WStbFPO3J3IfHID3V00ceY6i4eXjR9iLGu
-YfkcyeeJ22576rbJzBLM3taSt90+KX3bPnmbRSNNnxaOpFG9hlplPNL08QFJRKwCz5ANqQqQqiyn
-+5P0MOVCBpkfp8KPU+HHqfDjVHgsbdQHJFU6yw/14df+UCYnIXz5929e/+bti9fvXrz++osvBl17
-/GL6+2/wTdRvfvPs3buHt69FCb9++edvv30m6rf9cdi2qy3HFZ7TNed4WNb1SrZx+SPkK5lLmU96
-zf//5U/y6zv+6T7Hf/kzP/4P+fN/C/FP8vKHXx/+9X/Nh6/0kt/KL7+HN3l4JcSzGx1+NVL9eX41
-XH+Jtrv6tfz72fXbd7cvnr978eb1s7d/PvycJoufHd+8eSlv/0vriS/vvnrx7s3bL4/Pnv+H9NaX
-v3/x8uHL3z48f/fTw3+VC/5P+Wev+l++YwO3fJt/4HRYcFSg2iDDkjgxVpkQ1ZL+2QGq1c8KXLc6
-x+3wL8/Y0K7jYghXc8wy7vUqimSvHSOvtojAdUjbVRaR6iAr/kqaSodUcFirvHOV6nWJh5Sugqyt
-w3NcVtOVLN56SMtVRgioSP5Xq6yqw7pdidCPs2PzVZAFeFjjlay1xS7brmbhCocoXxY2XvRuS71K
-Cwz6db5K2yZTtFxFGF95WVmvRAWRWhmBuXK3LHeZ13yIiz4TCDHV7RDlNUS61cuEGEItBxnmGmTs
-c7mCvAn/+IYoUdGCZDhTAWGJ1V4tz1dQSg5rvsLZP4dFuibIWjys4SqKfnNoNWK6Wv2icCWCam6P
-veSEXGmaMg3JyXK+WsO2HkKSIZVB0Kvy1RZiPuAGoW58IGlR2qorzsNN8cqYgDAZv0jehl32RbgS
-FoWujvVqTjUcVulDYX9CkKfAfAhkJ0mvkz4HxPMQir3GKixlwzPLiKNz5fOKcFiM92YDFjHzpT/l
-VTmaaIXLQu6ZsrxnXHW81nQlT2rjFcOV/C1zKEu/BnkvubyKOnHIq4xbkluui9xE2s1yMxlavUym
-XJCOO5SMaO3KThTuvOIy2ZGEIIsypiDtZJllobRJJaskoy1E/R7iLC+0ybjXVcZZhkkmPmewTEnh
-9zpi8lhXeZY+lxkIJ5NMJdxM3qzK1UnmVJTZxildFp11vEwGWBSbhZHXRTogovfkXvLsc4rL4WyV
-4ap/54K+5ZBXprJDfa6TVyNRJhbyEXK2bAi6lmmFN1jYAXP7rJNHHku26l5HVo4odUMjRvBb+exW
-oszdLaOWNSNzjS/W7uWENlPxQL2Wv0dr5+TF/L1jQEfIsJQoa17m1asdcdV5FWVWyn68gSDbq3AI
-YbVJRrERdNBklgVZGb3Wqnft7TjB7qaXOXG5Eo1VBq21E65WGf3hbkbQy/yZWi1/6tbOybv5S/+X
-f5T//vHJG8Qvv/3y189kT715882fv3zz79wwfvH2zXff6A5x+YrfPnzz8Ozdw1dfyi12O8l2+MlP
-D//yzxf2FJkYKc/EFAlf2ejxnEuRnsFuIqyoLGncTYqey627yVqvypZkY8SCWXXmdiJyE8BVKhNE
-9H6ZyjJRqvBY6WWtgYS4Iuyxi4KwlQVEmSx6maxGRB0cStLGG2GzGrzMiWHe7LoFu7TszCFkowjv
-y8s2UHjlajt4rycTV+vNVR+sUbaqmzwvdKIwGc7z9sYVDG87nHXLfr2HFf0hTKQu0q3CVV7tiCJ/
-gGMFYYerCL3OsQK2GhkV+6hvgPzFuVdBF0bZlVobjWB3ah1NYpDBrLiTNzPrMm23mvuy7Y/TKvkD
-t2ZOXms38XdTLsa5rkCqzbI/0Dk0pxKyZTqemdOzqp9d/thW2bF1wi2yd7JH0woHbFJWiZUL0F0K
-IlYIv11m+TYlYciYUtiuZ9lrZD/As87BeOUs3DnLSuZWAW4VhH1js9tW2VqrbH6ykjfZfA6b7AIi
-Sehl2AHk5TZhDsL4D9zXZPfZROgR7UI+Cx8IIsbIHrJti21HQiyp6j4iXOewQLYRjQm9KcIcCFK9
-irghXGOOq10mxFXe6CB7HmyfvFmuIjrIJlpXSESn/XGys2BxYG+V+6ZZ7v9qR8T7YieW90xr5DTC
-rFmExwV0uX1+7n1c6tLryB6PHCW9ESfYrfQqJ8oIi/Z3aM0UdO2a+72coJfZA/Va/sitnZMX2821
-cLj+5pNZW4D0KFsmBA/Z+3WRNmKSUZLBlSe/ClXmigxbxQwGLxFFtTaC8iiRjGUODLWkF7NIRr0d
-J9jd9DInliso4IfejojMSYa/380Iepk/U6vlT93aOXm31nuqW7H3PnmtBpkqCfIupoxwRXYgdARs
-ulnGRuTNIKxchFc+WigLVqqwGRkiLN0NC0Png0wyMFphvAmzXCTfqwXrSaZ/nmVhhAoXcl4agR0B
-WX/OvZKsGvLtGJ3fG0E0loG7G1GEl5xl9QcIluTmq10m0lAt2BSE7Tp7D9AbiszZQF7D1kWKKtx1
-kgq0nbLI9F39ykYViRhGEO46G8YFLBXukANa30Ss7BReKTvsVmX4ez15xpLWlVse1Q==
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- X3KzGKvE+TP/9bMd3ULME8j5bZhwwKmnmeN5WabQcOEiE1WBj4dazRYdm7FmrmylWFTVQdbGDJVY
-d1sSNOJe7KKF/8DzhYVUr+6uSdwxviHW27D9YVEyh5Yiw+IL1136p46t0SOrBXaLfTQo4gwuPwX+
-WS1PF0fS4ZzqHp00qdeMYQF/a0JCypLNOrPJZYMkr7r30/mTHP7o+H0u93yZ6tdJiSotba8Bhl87
-Fk49EqhREIyONTVXjU3qqd2dYPrRqweKR/VuVTUXYbE4G6lwPGS3zSWp59OHnVUkMB+3TlskOHHd
-lNUlZ6HPQmJuLWky6i0kgsy+4ktGx1RiKJDsZLefI7UMKhNkyGsL1aalSZPR8KQmv9PNVhlo4Z4s
-MkYke38kNcUj6F7ZkG7KbwPxV6xAa/Y96wg8BQCmOLTDmbj0+JA1RjIHBX0VVczbouxTVer+bIdV
-FWdBwHTqowiW3p9+uasWg33u9/KnhCgSHQmqK8kNou5TdJb4nJFqYqAMAJURPLdqGAuTfyQOpdwD
-u1L2nlLfEdrCAPI0axovUiWeBWy4JQsdfu1p7w9KlPy4BJS1F+AdZNaOuA4SrwVXi7yvlHAVteEp
-SccnIcCtfxRsZJky3YM9xCIsGT5DM1iP1QH0GXJuQcVrX3wGKjWqvJRRzd1TpJHI3em2S/hGmnVR
-2rF7UKQUYPJ5qxE8Zeo8h21BA88Yeo51etGKqCtHMcD5OW1DLymP0Ba96OGzne28uqLThLz1ZaGs
-xDuGsTVRi4nF4w/gU+eCd7+uIJXAidCTRDAeJ8s+uk2cnU5JbDbE6DEpn/er7fJ3FrbpnkW8dflv
-iroeYiSnLHXjYvDYqh4Saa/C8TQ9WqoKaKndzt8e7UD6orNNCftUlYD7gi3TQBG/KgYmpRo93JAL
-J9UNajJ9WVNdTAqXDiyR4BAGou0OseB7pA/C0CYDqxB9QwhMi/f8eEX6wVyjMSuWJhyuKyWZ4igB
-1ALDQwkcdmRsiayR/V0BckShfBJpmk1Mux2r9DiuP+jyAtMSiw5KioffD7uIyX4qBP2NY1/2pI7A
-UIn6NoSNKalG5xuN/AhQ876C0TnlFyhGTFLBFrMj6iOPrCW7InpEePtmksuyO7XlETpgWEe1z8eW
-vMVvD53ARz6Monaw4JlpPH88zFD4VCUAZz2DP4HC+Wh0+xF9DzzbSmoBRaSIHfTmT6X5jpVI9YwI
-soCgw7cM1sft1cWuok4y6XFpyUR8foyvNcKfrJvGIEdAWpdFMzvLJkgMvXr88BXnjcHDTk3ksF6o
-OsYiwmuH/thxXgGNQ3MxpVqAZhsaHt3np0pLinluJztoiVXZbrLm7XbqZDDsfFkg5Vs9/MltRXyY
-ns8w0gWVgHwZvzr5sQbIqJOuqI6HMA/vpFpkIfPEXuxdAbAcBLGM6QHzdtY3uLgNp2gu26txbrlY
-BpLxgU1iL5pe0883IB8gl7mjmzB20TEwHqEzAhRnhZwS1VrCUJEAoqH68mGlFv21IxloPH7S35mq
-FbgtoafF4VneTvkhwgl4uxdDRlkqYFwEnG+ESTmT8BIBxRrcDB4tL8gEoUzFEn6yuOU4T6FaIwmr
-EAy8AMQ0wMhlG+NisB0saKVCw+7xBfUU3jEeDt2KS1caMtPvQhgVFtQE8CKbVSL8RQbMS9O0gO3Y
-nUrniv+v0hziYhk40o4ubcPzbonCTXi7VH0OqInx4FsgBpaI0dyTKGpeUtLrmHMVSgFSQXQOykrl
-6iJ37JdvlmgES6kIPpnFJ/jInc6oh2DYHWNkdUofVsWSYUWAGxbFkdFnBQIlGJgR4OCx0t6RTmWu
-bgjCQ2HhCAsLD/mTadlg+VWmJhWnWJPS1oykM9jPl4yh3KEKadxpNkCLkN/+kAbCF4rTARxNZDij
-U0WKZVjGCsR+cZgaZXcP0wVFpDxuxmf5qNs5DD3XvR/D7E3RPG7DsDgIFAqsFetwyaQITPqzARJF
-fQoUJ14aKxbCSYxC873EIx6W8yHu3CO7QMAoWw0jjIaQasuIE6G7FU+V0OPoO5BEYqQRoki2vyV2
-CBZO3BADkV4EX7kESxl6IGgyMn1vtju2AwaLOx0kv8Dw43dDKKJI2Eg8a5mVxbYdShUVNh7vUgHl
-GIl5mbh4gkWA/6lZe0qx/NghYkPVJyu1w/jhjhbOoZgpo4/q8+oUUIc/rl60eDXh2e3vGdbBmP1U
-oSyPpYA3BoxoUju0Y46Xh20fFqOX9DF4V2rknDDO8AUhrwjP6LHqI2eDzZh0QkgL94DAlQfaMD6s
-x0M+oCorxjp0sWPk+zGHNie3KmLf2aIdSSLjXUpmSNFKjjqubDFz8hi29pjIltkNbwxb8vm02Beb
-dymn5fyKzmEqa1WMuHkgknB7J7xc4kijZIyfBLJZzMHP5TEet4eNRMlXjk68+NCSuzlnTIL+FmWh
-jJLfa2VyCCq6aA8AspbWqS5iyFT+Fm3H9iPchpEPdG/coXgIyOEWr+itAiUMQ3PLsRwMvf3ReMDG
-BHqUkNWzXXYTOCoTyj0cveVEV5y/4i/uRE4xRlUhbIyOJVrMwgL1ICyq45rlVHfCKk9kSh2TqdV2
-F+39kySBsGV2j9kZgm2uQilHxPsJf2vqkXMRkREpyrxGyGe1G7rlsG9ydMME/6NmD3sNbyks7dE2
-PRTysk7dMnY64KFGl4VjHH6vFf3iOr9YJfhEYmolvLcI+XCEQiGh/IOuzoo4d24jV2kq8s+UAtyZ
-TAKhk0D0ncgGWRpQUkRyYJ2la7xhwRQs65lO7jGvhm1W8+QSbw6BMPA/sODiTMMGWc4KdizYYOnd
-6WkqlbWn9ZWwsmsLrokkL45YlRSzrGJ8Je2cd4RDKNQT1NScpBAnoW+EkQTZjIzITxuaDHre/cOg
-SbRRjVmZ3tdUy74YMDTmadetwUdPsqGUNCPQPFLjNPVoEcdfzHRFCCfwLzaDH5AzZHUiXUKl+d0s
-JbMhVffwilCqfEKDWTApcGFEl4UjNfvc0F0mRwu/uMHPOWS8GJgKYiF4y9YDbykX5bszA7N4l1F+
-45oWGNvEY4KviqqHzMAs6nq4mS2DwwBiQcXqsEwNRdZ2jW8ZCUxTls/yUT/5XhXs9QIG+7qX1p9X
-mesFVDlVt5RmzzhYiJtCVF9OH3LuTNt0VQRqyE5u6Dm654TEaiT8zWJrGDidcYsx1t7vgRNDa/Ms
-tJz1ZyCABqXu+lnzYEcKERjuXk2JUyUs2MSL6epH4I3q2hQ5NVOyQ4bVkxLRrO9G4o46SjgYO5V3
-8OOQzSrbHNuNGvcGbXQQDxmmmFH4USPuCivvNQrBsrcTh5ggmUeWFqHA7fbDyqlWDbjziCTYtR1z
-WczA9UdPUns2E0UgPmcEO4CxCKcpKAYsJeebsMiRKnJ+znarGXQC9Qef4bYAXpMCxnasj7vILM/v
-rC/naYOXwEVzWHRviwL1Z7PsvgY1ahu3hZHzwAcca2V75ETCr89ssMn9nA6gtnlSxMpzUmLk1gGw
-sNsA8xRK0Zl8iEjyiRDN6J6L+HL3duy7CAsb/TB3v3JYIoo+qwk1balTDzPgcAFQDYhmRchLEJ6H
-IDTzNIxGIBXCsFGL4Aws0yfLWizm85moUZtyvwVL3yoeHDrBMX/JUDhkO5iI0u7Pi1q4cN4S2/i6
-6bmSrqB6MP1IslfRuaqrBI5VA6I05LIwQ0WWP3OoCDGVLkcTV81PnNxDX2GTQhoBqazfe4T8YO6B
-/wGLQqN4W3J8Io+JvWBgQ5jA7ajY1gSlcDHVrTCUa0dluGFFaIiU4iaC+qSaBxY2ikHvoZPf7G6E
-XItDYGywnJzKoPJoNzhGX5Ac6O1hTims3s6LOFpmUiA7S74M6EMQc4KgTCuzaQhtc8CAhdXcfRlQ
-lEhp2EGlJeJ5lXaHlhIV/nxb70Olc2MjAQy3HUW+aUQOjE5GukeQsPAymXRym5ak7YzMEOAT4UhU
-k3AoCYtGEIN0z3ZruC6WlC2cBZQyaxOj2h60jMsvyiTSIm4C/uORZkFX6ak9diSKSIx4Li9L9JTJ
-TkJDrs+5htvEmIUWBlwO8JGM7FU7+8pMLvePAWTY6CB+WZdVn2w8MofDvEVT0Ij47dNdk4YJTaQJ
-hOBG8wKV40UJRUza2IKuyGUsqdxhx0E+WIxAcANXWJTqxTb1aKLISePh6DjB4v04sdDAkSGDZObd
-dvuhEdGRIpYao+dQn0kKhhvIElT3jMI1qtET8vu42VwO8kYzDgy3Jid1VcDtKm7bTSMvnJXqVd4f
-BW+0YKlHDRl1Woqwl72naq2L3igaOLoink6pWbZ4lJqA2uInH/cjqk90eHNeDqHKR2K+t5v14w//
-VSG/DESSucx2pAZC0KpsbbeojOHJlCzXKQ5FzvN3LFElpIL09OmKrvj4UAs3Ra/0hoD9kt01mY5d
-mZLAfhx0Bbe0UO5Zy+dMxECXL3biwEW1PkwXLrIbItXcdoy02rlprxhpVSiKWiN2BsQPUByBIlxk
-3HKJMntY+nNCnRL1sTo5ye1ljQRK2RsXoupPTZnF2hcZzjE75zJqkLz2B5+Ag0J2M+jEwu4095tj
-69SURAszDlCwsL48P9bTUdNSxt5TZRDFkSiKc9log/ThKXGuRhgWl89wmVeoTpI+G4oZCeRDhUNe
-ctu59sM2MxQZmfUKcJEZrcUKN4Bt1IkzsfA018vgMexYMJR4SkhlLyiwJu5OZOmTeVQ0KFlRP1En
-jt4wNr54j7OnxaMFt+EIRsT2PBEy9xt7rIZNjiozWTybf5IDOiwjVo0Miw6dCIOgjKkh0khLZ+Rq
-GA/BPWNAhyp/6dRYSAxPmItq3AwJgVaLdmnuacOZEqWFbB9WotMMWsmzPKu4Ka6qBSjhyif0mMjw
-6mqr1injItWzaCpg78jkqjkaYlbfNWHF4RcKzKobu1AWnISs0kPjzY89lXxnaQBFI02o3sS8SdWs
-LjoGJESWLE23wKnJinGocAmTR3KWqvLhUCe+GqpgY/HzMFLHLglcOjqWCovmyZEtXsVskcNDg5Xz
-JFuge8ElFWqt4cxEEheWnTAcw84qMofZIlW2R0Ges5JDhdrHYUnQE08SojfmKPGTXBVgEcTPrbny
-n/8hTzZrVOFPwtosU1QWFKlGBuUoh3VKX73nYCnRIQwaDg4ZFC9m6z7pYFIya9GA1iaUzIYuG+sN
-cEyxeqbkjyLA/FgrwKKEUUMYYjKMrnO62SHWV1zDqCN95bg+qEmDEItYppGu1U83xhPINurWYVgy
-SI2Ek+HgiRqAHO8d+bAQRMPamoRqas9278leWDr4lrmKg51YAscVvtcmzNxSNTI8ratnRSy3kn+R
-+kYu3N0ChH44piCGQygQG/rkf/ZLoI+ScnGcT49Jj3Jx5KexeujWt51Mfu9qNjgcquBETTXHVsfC
-MqxrT+GCcLmgqATGtKLflpMI2XHjemtCuhd553B8vTQcDrtiSJfYYjapainU5koXGg==
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- +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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 9x/m10fNPt72As6osAT++DIAAINen/EeALo1AO/vz8YvA8C97fmor6Me4+sMtvk+233U+7q+uwe/
-8uLjdWvPF3udwvm2r5O9Bof7wi7zuQnX4HJu1/UZ3rf2+mKvbc+3fR31GF9nsM332e6j3tf13T34
-NZcfr/t6Ptnr98/HfZ3pNTrcV3WZzx24Rpdzr67v8L6v1yd7bXs+7uuox/g6g22+z3Yf9b6u7+5B
-TOdDhQlffB3CfdIXR7C7vu7lPVzGlxt2zJfLdo56OXfnDG5f5/sTi+DH/OrS87Dly3qHJ6DFwnGS
-L+NrtXHM18rkHPVaw8yv3vzrdHCK/0Jh1X/0+z99BVX/c2Kt5e8Wa1XBw5d46wmr4gX7A0bv+tPX
-Y52Y6985Lsj2Z5o2sQT+vDx74sgK69nsyQBoSq+r09vGJXg904atWK2P+u11TK7rZ/72+v0w7mlj
-jfFl2ypB9/uox3ifwLZep7qPeV/Td9f/q00a+PcvtzW6CrxOARPB4ht9zvXY7qu6rOcGnGNet+r8
-/uu2UjI88pdtLfl+H/UY7xPY1utU9zHva/ru+n+VCYNlGV/uKYb2kb+8qpgEUnm/qsd2X9JlPVd/
-jnndp/P7r3uKgb32/mXbZqXC66jHeJ/Atl6nuo95X9N31/+rRatQ9uThsqwTc2D/v23+jeIIedQY
-vcv4YqxKT++Yg81F1SDvo2ZpG99nkAMr/RtFB6BIfG1LNOPs76NexvsMLvN1tueo13V9dw+umEOT
-q3vfnOrGBa+DII4Amcnr5y7jfWqX+VzGddRzwdcZ3DcH0YE515cb+aje633Lj/H1eI75Ottz1Ou6
-vrsHv8LSer8ckYq8LCj2L++3BcIHuAKvZxXGL2/Lte15A85BL1v9+qaOncs5DyhO8LLsY50ndv3o
-uV+vEzz39r6Y/RSuqz62+vVt8Qn+ih893Dj82pePPsyv2wP/Ejqft7Hqcr/cSvqXbb4f45dAo8/g
-a6BRj/FLoFGP7DrqZbzP4DJfZ3uOel3Xd/fgu4/+dXPOw74Och7N9XOX8T61y3wu4zrqO9DoM/ga
-aNQr9CXQWL/enMv4ejzHfJ3tOep1Xd/dg7/7R1/cOePLfUXuFYr39+8/auf2PtNjfN3XYz534Drq
-OwftM/iag36f2JWDHn0H6mP4x7FTvs0+iz7blwH1GF/D/zGfgfo66hnSrzO4h//vT+xXGRaON8zI
-VP+6GLD15eEz2OWF5FkgLPl/X1YDDKKVHUX2CmPIq3174zZ+WQ3c2x4X/zrqMb7OYJvvs91HvS7r
-6w34daLIcoXve3q89vPjx72/zvJaHdxXdJnP1V/Li3OfLlf8vqeX235te/z766jH+DqDbb7Pdh/1
-uqyvN+DXiiLbG75v63Hcz+8fD/860WuBcF/UZT434FphnFt1eeP3bb0892vb4+JfRz3G1xls8322
-+6jXZX29Ab9OFLlHmG2O9N33H+bXR80gV/4yADAg1ubXAQDBM3QFeo8qCLN9+fpo+vLxn+3O53wd
-7xhfv73N93nuY95X9N3V/8qhgNdNPd/qdQrnq75O9hoW7gu7zOcmXMNK3Kzr8zs39fpO93bne76O
-d4yv397m+zz3Me8r+u7qf81AwOuOns/0+v3zQV9neo0I91Vd5nMHrhEl7tT15Z07en2ie7vzKV/H
-O8bXb2/zfZ77mPcVfXf1P/+Xhzf/xe9//ye/++2ffhuv0OZ/QXCzZrbPqt9qATsHgJnfwfoUFacf
-808vc0YnrN6rzHGMX7Zeh/g9z+3XUJm+TvFRP+195nD9aJb/JuOw7emz2taez2KCRvbi+tH7s3CQ
-ZvZb/+mXf+0n+JYV3BsW+X+ud31OvU+fxucrap9XnWbilGWk76efRImAjOQv6AdnjvOobO6nTXvs
-/hmSli8NNTEyft4g//7nY2x79+fzIfr3P2+aL3ntgyqUL6NvDcEOcRfYn8d3LDdvyQJs/T5KK3y/
-MJ5qy0RUpcyEHOq24Hn6pNBeVUbU0vmqnjB+nPlz+ehy7PP/jMexaRve/9yALw/gRz0ZVC4UHzej
-8fLvbGVfaFqbgvWyjuSf0zcuI8p1fQQkOX7hqP41oiEe/8PzWQzo59A9jq+jzIkHZks5HeSzAPj8
-QtjwGtDWCRGwGXFHb/pkb8uePDoo44q/dAJxZqCkrq5D9FGLzwy9PnV1UyWhNqKSz8bVwvjEhos3
-ODZdPmGU7dqGckHZAMT+xd//Tz0gtk2hmd0J4gkRn+qtdbofYy3DxoRT+1ueEIhbK/tD+7xbMdSB
-GNz9VmMxatseG9gJF0YAqJq/iVqH7wO2TSjYoRkFfnHQ+FTZ6d3G2b770A0C0+8/Z8u5z0k39/vz
-j/vI4jff9dVS3EigaFu/zD/ZTACNzEmnlth1TDY2krANZeUyJlbz/OKveSREYTeKR/UPINf9zuYE
-2IgOgxfBxpz8WXD8shHIYD255S8gub2uNx3Dmz49hhcSBGxEoaGMSB7HAfQw+WHgUce2I24OHsYv
-XsF5dQZK1HkI9qWLV4eVpzK34YkP5v0Gk99k44wrLjEgf3fceKRN5dS6aSt5cmO3grRsrr6Xrqv0
-cyotjC374Q0OBl+tM/e8988ejWZb69svnoDPDKW9vWtWfx6FUmyt/jYYhAmjZ4Y1Ut627o9gteoT
-gxkITO+vj4jGcEKe5xhfvx/ntX0Q1PEmT8Ps4iljWzGUwDibH0WrumE0Pn5LSNb/zliWZ8fvfstf
-APoBpuKbVj7vskdacOpmD/PQqLgUPf7emEcYZwy1mJO6h9qMLgI2jvC68LX84gn47ggl4I3Z9vB3
-NudcfBJEW8iouV8vWZk2Nn8v+OD8bXKdUkdMRCV7088COb8nlu9P4HxabByiUXHN/WWxjU0Mis1f
-C/tq2FjiE/q8p/UMnzGoclXqAVQzJH4KU5o3Xdv4+v1zx94X/LtfsNZfuDWfAexfxy0fPcyYWH4K
-M3otyVyfuDvsBiNjyX/olvPM0EodIBveSs4jvwtzGn53WD4vI3GtMg7dBxhHuBokovz4Q5hziW1H
-im1n849ROPdLJxBn9kgH46E++2ECNIKetn6hmj9D9L5AK1yZR9LvPWLG2ajB6Pvjxg9C+zzXtfXv
-bA63YAqAaGPbo+SctrWyf63FFMem6+ucWY9t2alAJyFPDsYUH6yHSf8WBkEfNzattcVBNeh8f/5x
-Yegj8ozrx34X5vDEWOgk22eKWTGfzxbGES8D+xL/6P0JmrE599g2bxcza4KF8YmRhKzdH3/5vDz0
-oQ1ei1UMPYjf2Zye5HF9ePKHEaASGZ80wshRA8aeYh0wm6Z3HTdpHQGGA0q3ZPys67/94hncfl/8
-HJ3pGGI+zkK93Dkb8zbaLfiFIcJWILZsbTHLy1nR/nuI+QN+35jbnUzbb8SXJ+NzvNH3BZzX/+Nb
-xmSISFi8/uxhI3Pb39vwPE/zjJey+yb4CL94WP8e4h90H3iL87RX0ue1Lp2AjvwU5qeO64H4EKwc
-l1GO3/fHjQucglx9vcAljIC8Ba2fYNtuNGGXMqYe0wg/mHiLCXCTGctBG1feB9CjBwT5iUdPSsGP
-v3xe5zMgFdFvcSnnM7hebq1mv3/j//Xfvu3ruP/y84P/43/gDniGy8+Q7srvbGa0xGZ5oaBr1OI7
-HYPFNF/M32N8eainqH7r+pNj/zRS3KSxYn+ipvhLKdaHE/TCEm+hp56JLgzJ38LHlbWNyD7Zatxj
-mGtEJsgYtjHF/nxTbERs2E+5nhM439LHTYsb2XL4EHNpuYWudxiG5BjIOfFN5yBKsyc/UmbCh/D9
-++7hxO7UV+tb9rhK4/IxyeyL3187ElX3/mdAe5bHzqo1m+Iio9imWAv3TzV+H40DY+hkgMvGCI49
-NYZjthSXEbyK2J2tthysqo6UAH1znKic4w4w7ufIVF3fGdljOY6r5YoCbH6F6ucdKL7W5FX4rKYS
-8qht7854lB+AQgw4qRUTAl+mOGbsLo5m/HysrIGxjKtim2y/rDkO8FnKxGC+4pw+K5l1bRhHJaRJ
-n8B49vnXeFfmmjICpvNcY5f2L/dr+fhZgy81faeGXRZs2eNhM3CoA+Q95pu+LiN0porAOoY24Zam
-GBJLeCwTLRrisAwbyJgxx+sBDE++Rt7bi47p7LPtZ3yN0R5zsm4s+mJ9GWlBvmnFz6DIE/rYct0O
-/9rfUFI/P48NiuaCFQY3W0a4I/6hFuc6oEiOA2TcOT2vPuME2P1BP1a38UED6mOMA7CBma9rejJl
-w6J4j+zNDVSfx7cdr+ZY1xW0HGFmmPcL37PejY+RASSPjjWMBCX7l2YcYILrMuLt1kg0PlP8fgR6
-B9CwwV8hZv3svbvip+GXJV3ViPAfzYpPjwhc6BHKTxn9fEVrhHuJbm1jf0VxA/7AMeld8uRHTBnY
-v8ZX0Fsv3vZE3rl68Jarx7xcSt8HOLG4WHqOWBjxdXMoHhi8Z9+AlOKuVk6APtfpMW9U1TLGrOkD
-kMPqD04jMftcx8PmZ6ajIsQeMwH7aPxksyJjuly5LAPo/Dix4mUGG4fF1zFz9RSN9mG9hQtqbxFo
-pzJi3vWanGin2DCXuN+YV2KGkeKGRqLB/Fs6gb4EhvNBh+83unW1EhGaqhe2u6mzLstB4L6u4aF9
-ljr7AOE6YIjsbbuOA3hybT3y3Ga2pLOLlupxNH/Z/ySq1S+O4hg4RFp77Cg9jE9MH72EA4FOxSPm
-ZTL8YBzX/BchOBqfuOdPhIZ7x0gYrxNKZH+y+YygsfBFQUSJ5QCpUzKSr+bJgn0HdICxnYjPFJHj
-APtDj4ASsMyeQsA6jJgqm2btF1rjOjZtsXSJ76ybjOZxouS9f63xPpEoIyMv3YOCImi9qbeNH3CO
-F6eJr6z58rNG8Z2BJxUrF/pUMFYjqRwG1NkW1ZPZGCNIN4vNrqB8Lhj35KqkF3YvZYeCql0udFhs
-bY/qTzywAqDbeg/WXb2yazjN3n37keyGEEcN50LrR9nIofMv+R0oXrVrVBt7d2LV/EGWsU+q9Hhe
-MS7jp0oMYGvkOC22qdC9Qhh0Hze3mC5W5biIprcleWXDkULGmLBvpwfm0j23ph6pUnQYt9+dtFqA
-ESTH4TXCx9vsNsakj+GjeBqBOe9vtOfsbZ/94XIIhBFgtRUuplaqMtceDkYsPJ3xfL0ZDfHftSf3
-8JyhM02x9AmvA/Ke7U73qpRscwsSD/gRIMYBRixGYyJvU/2rPdpquG/rShTNvf907JDWJveCFfVz
-f6COywIGFw+RHXF0gKFMm71EDeLsMBkDM6OxNqbwb8qadR+gzfgSuLqSsaa5vxqNGy2CbfvjiAMQ
-pO3JrXlQhrK4xwzJlCuMaJ7z+I2JeQwNplqEcGePZwvzmQrx1v5kc0FHav1ciphHq4Jo+iw0ULEh
-zv7KHy0iG+iLMUisHgNKK+jhGX6p7kLZgR+Pqb9RsLbefmrEx5+ZfGG61IDB84Tspw==
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
-lqxm++DgZNDa7HWt6tYt3z8T9S5+F1J6Zp30D+zatTtfMvKRSovrUqN5Mh9tI3UunLT3rU6n92dZ
-+jrtN4dD+3u1AcljS5M4Xu3CqXTz46qszFcpLGLOrvkMriVemeCWzQRHQvTum36r1b1rJ2frrqW4
-/aZ3912712kN7/Zbzbu9fr17ltdlZZsbo2tlm/sEPVZ+CV96A93qquaVgW5loFsZ6CKRYEr7x+p/
-t49OhmfcaRl3Cpe/8OGWl6ap1bEPcxm1ohqXZv3ZaqNZYweWrkuOndmi7cqOW0WXcAKUt9Qctxp2
-Qeg/+OvYLj1zWKMmK16Ca25eKue2uU1WvAT95ipb3eyu6arbpa6SIYfnw2Icb1kUcbsy5iybMceZ
-bsiY4yw7aNNZGXN6K2PODLm0MuasjDkrY87KmLMy5qyMOctizLmMteqTeeBXlqldt/9aXtPUlTxe
-fDUTc5xjs7+yX1x6FOUSp+con0NhwdNzlCdklZ5jwaI7Fz09x7xRjgu/dl7t1BxX8g6ZTnv4rN4+
-y422WkIX+RTCoi+hqwxXi7aEXpkMV+fa16yW0ctcRuddcZZlBV1ltrpSma3m7tZVVqtztONy23Bl
-slqtP9rbPaw3e3+u7h16+XnkfbqCh/1LpyxbHfZfLAVhuQ/7l74OtFn6NloseuFDrDwhZ4jUmJC/
-FnyuLLpQ6x0cDFpDmBn9VnMucb1sUuApUvpZ7RHO37lXeLOwKJ1zMeb65emX1SZuwTdxQiXXyo7T
-P9vNOYLjXOmLN/yn5Sk6bM0Tk+WLXzhNYau9SrH8IVvtCya1KrLSQ7G8nn8Zav48lJRX9P9amT8u
-eaeQr8wfy7nxWW7zh7kq5o/yhKzMH0uwQ142KbAyf6zMH4sk11fmj5X5Y6nMH7CxHtbnCHpabauX
-2oN90K83hvXOk167fAg8VS7JGX7TRcdW1kpn+dmvD1rb/dZ/T1rdRnnteqzWJZyF3x22h40zzI/x
-fhVKv2h35sipMVLn4u2WpeNjuydHT+0ofjcHaXGVC6esMZ/RsqQqcBlCtvHpAvMWtk9W+ZcmF8xV
-/qW7l5t/aZWFyE/OJclClNRK36sz7JVXt3qXQMocGtSy51NapVMq31WXmU7pItMPLe7W5qDfOyq/
-MmPhZcmm9EksSS9O+vsnHSvFltbUuMoDswSH7+bY/y2JKfgcp9NWZthTbR9XLgptDoqWKAotrBh7
-ZxybX5nMe6eZzC9aiSo9GBc7Dq08HVc2Cm1YUmlbNgdGsvJg9Jbbg1E6GGrZHBgw5RbAXL7aA672
-gMu6B5xnCq12gXO1Y7ULXO0CL5Cm0V1gaaVttQtc7QJXu8CPxoKrG8hWOqPEahu4mNvA0h242gau
-toGrbeBqG7jaBq62gfGmKbty28A5KFqibeBPvV7zTb9eXlKt9oCXvwesiquyC5yHkiu7D5zr3PaC
-n664knddlN4NrTJsLNaOaLkzbKwSjJ5GyGVk2OiVyNWwPLJ6lS9kGWXaR8sXctHW7o7datD95Xf2
-O/XG27sVAvWO64328P2dOczGg+H7TnkzuCt98THT89zVvujCYi5ilm1ObcNAXL4p9SF5dFa200u5
-ThczgG5+toJhpUYsisj7HO43dPekbva6eHl7+b3FeL2LP7NbWhM66R/UG63dRn0ehWik0sWb0ueb
-U/PRNlLnwkn783COdA0dMPvb36slRGhE4Xi1Cydy3uuHF3wBu0rb4Dm75jPICyPS0rK0/nf76GQO
-V6Qvf+HdnJfOM9Xq2Ie5zNFRjQunC0Xbp8s0dUmq1lYb1YideZzCnyhbwBbJhx23hCyh7ld65PMN
-vw/+Ou51W3Nof5MVF1dD4rbOreJOVlzpuCtF8DPWnM5xIfhKe1ppTwunPa2Up0+mPO06EbG82tMq
-ynp5PAXzr0erJXZlVf+AU1tl++RteYHw9jLkQXlCzkh/FBOSLjQhZwROxISoRd7Ovj2jZEyIuARC
-5rV8L/zaWe+3h4dHrTkuz1imNfRKBiN32sNn9fZZpp7VErrIjulFX0LLE7JaQheNkAVfQs+1r1kt
-o5e5jM674qxW0Kuzgi6PqXp1qeQCa0afXIQsT5d8unYs37C4qhmQVolwx6hcvgxIV/cqv3M5gRZb
-oyub+Wh5dbplzu10VLeoSqfjWAb5LiqJ+2/aNw8pSzJ+Ky89uPgSTLNFFxwPbdXB2XFlyys38KjZ
-4xITcBEFxxVcqa50KpHP4dzccqcUqZbelyx6TpHqlUkqciEmqwum6elnc452WdNxnL+HFt8dczUj
-AufWVRddSICfAgbgiyuck3mJoxnO0z2LPuRE+YuIl1EBj7us9DHKZZtSy62BX0kp/vqg1d9u9xfB
-irIo/Tys75fv42WwecpKaY8I0v5qPqPmSJ3LSwR20m08Xz6hcuUGW01XksrnMdwerobb5Q838bkI
-t41LDlTB/RBkVXjRr3cHB+Vvu1ic0X/OUwUro8llGE3Oo50ug8ZNg3BBdO6V5WS0gzAab73TWYCu
-WRSWnG/MrsJAz9GOy23Dea6wurb+SCR7D7pNf5UVgDKA7D3pdZ9ZFJjnpkrgjdabdjf+Ye3JMeJQ
-9NPu+6P9Xmft+nqzWdmuv+v1QYisJZV1+/f1n2sn9r+k8nQtqeWFtrvamlBGaYrZqYk80UbZL7lO
-MmPsF2NyqbPK6/paiPF5/d4+/GC//GFBf1ZEUnlc+fW3pNKENzxfqyY1pXJpiooUNZOprHK0VhV5
-TRSJsoVrIhOqUpWqlhWpqUBpKYx9R1VmUDGtVItaLozIK5trASZkLTeJruysQVWdFbaqTGpJogr8
-IrMMvqS1xOQWvdC1NJcpQtK8EJUGtiHTDuaQZjUjc0kQ21SECKWyAIF6Sa0wUkWlippUeQLvkzUp
-KlWLJjHwfmFqQqgUWu65UBWiZl+b26arWiHyLBTbWTO1FBASHvuipEjS8CKhLF3xmxtrFlSk8E5f
-JrO9ZWSgypKp8kLGpIvCfgNmM3/sp8m1DiyE7shSGfi8ueZB3B07CFIF9lCWi0xitQ==
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
-pmOINZmYrbv1d63HVrVt220pv4sNbRtt7qf13c1Hj0y21QL9H35U3z398teb93765qu79de3fki/
-fFrduN9/eHR45033Hz9s/+PW9a822/Xa4J/5y+8f5F/cuf/y4beP1Xd3dv791eP7/ZOG3n4gH5tr
-QqkvkmSw9cfWm1vJP+/f/U/t6/v3bh0P7g9+lLfXrt2/u/OPPhf6Ybjx5vt/7dy/p1q7m+1vvm1s
-1WpfvZl41U7zZ/s+vbV97Y7+5eFw64/fNtQv1VvrR72dgSV3eHjz2/yLk+0t9c+fNv7ofPXT2rWt
-g+SH/anI/qmLA/3qX7/+e/3FZu3V7JfG5e78dv/e2+3f7t8Z1I5ubt26drJ9/WHzYO0aMmv7972n
-J1sHv/2kNzr3O6/vHGwcDjcP9S9ihB2/f7nVEDv/vX/vu69+Ijy2yYPN/7z5T89++/K/W4+aj/6x
-UTV//HN9t/pFl9rwut48WbtW/HH9ZuNBI/vX9c1DtXf33vq19MubG09u/X7z/uZXL7c3Wydff/vq
-hy8O7zYa9bfwrX3zwcHOIb1ZJLfrut/+5+932v/5obnRufbdV9X+zX+frO/sfvlfaP+N+3d/OEzX
-ruV3X/12f73b+Oro5jeP797WR//+pq317cFBut5vPBI3394RHmNj64fBK8s2/VVL/5QmzTvtzdt1
-27/i8TfXq7daGx397Igo+Hnn2v3NR/e++OnBrSIb2H559Gv+xbd6s/efm/deNX+9I/e/+A3Rftu9
-Zgn6Nv/6C+iSX/Of8n91gU/fbry9kVfd0HzV3EnEb1883rpdv/fl9j9u/tKHt+Tww38QCxZZu5bs
-/+8jhd9vfrt9z32799ODH6n45q0HvxMy+bN8ZIfu6+Tmt98+uCW3vnvzjcPz0zf37jb/ePIf7Enf
-YIvv6Ubm3mILbfzgG/BbaIC4/s1zKNRSCMv+sbG1h6zeag2+U/kv+R+N9Rdbf9zcOrj9438f1Otf
-/XMj33/5r+LZtdcv159ubjzbOtht//f+f3+782bt2ob6+cUeMfOXvPnLgz1x89WGer3+dHvrj5/2
-Ntt/5LfvHhxde7O9efC1sAz89netnzd74X1m979HP64/3fn6x+2tG80fiTfMaBr7tveHx7V/3fzu
-Vf2/RNC3uanfv/ti+L/rL34YnkySNsbZiA/cEa/7/2BUu3bmPN20+tuDX5rX3sjf7323lWz/+36K
-Q+De7/e2t+zo+PrWzY1e8Z/xvhrlbNyx3BE0cr47HJwglywtMZ9+2Hm4vveDwBFz7+bx3d+3rx/8
-WFtP7r34Rd7453/uUUNG2ZGfPC9a29e/PL6xeZg/f/vg5k5tO4xUOwF+7oGE2X3QhBF6306qoy8t
-aV/c2Hxz+GCg7zZePl/Xv8ifxvvg2fedVyO4//fhg+qt/WJalxRvWz9url1bf/G4edNKmG+LrY2d
-n99Oay2WjMo9/Fkf2EnzQCbyoXo8OXKGz7ZvPOvc3d7KfpE3v334e3XtWqDLUtU42H6wlemNvPr0
-FQqcmvj+1S186dbt34+/3vhj2Dza6HRf9dZfHL7+p0Xx402P4PjBrd4Tuf1lVf+6/vzg8Ctb7bcv
-N/KbO4ckLW9sHXz1fW5b2zskKfjg1evvWYTbF/z424t0+/6bb16DgP99a18d/rT+8lpjMFruy/Xn
-L37tmD861Xso0cJCYN8Sfu/9kNzbeHv9uL1976G4Hsn2X55/XY95YteSSFiLZP/kwfVv/vtTWGnG
-frUj+fpQv7HNa+1O/G5+v3n30eDASuzGF9mGOOn8ur77+w+b7tdi/ff7977frNkiv7+yUmDnyw3x
-y8ne+u7JCxV+xcJWjlnA0f1+486X1Fvx/Lz9873vnm529fODN9fF/n9erqdf/uOfD2BMb4qHmzv3
-4du3yQ8PxTdJa//Od+LW9c3vPOzbUGPtWiiJUHjcAFG4iRXxMd/dkf+CX7+h2vyCTYBtELL1e9Vt
-nVW3nsu9X44fQJF7WBget9au+eZtQKEnAQ+9Bd43iuK+b/y3vsZdLAKteYZN8uSuY0PWriGZRDA0
-Sj/7/vELgN1FZOEtiGKcRdzk8Zfio8e3697ia2Odu/A7kvFdYCUWx+YRF7tv7v7Ls2AX+enfcu//
-b++9u9PpdUXhT8B3CEkIHaYxMCQhdEhCOiQhBUJLg9DZ5zz3j/PZX9nTPH0o+13r3LvXXvv3kBmP
-ZMuSLMmWpZs6mH3tRJlM7QYToZsGCYv4DSKWChsPA9NJS45TPCr1TwxMwVwx6UPWdCwZ5ykRu4x/
-KRBFpNo/RbYAzW/FGJZsgRrXlFGprGJKLPwCONlIrFNxrFhyZHKcqmNGjW/MiKqTVIWApyLFdMPE
-NElrQZxpe1NQMIs8rUOKG6tSB5yszpZmVjMq1+LmiBI5E1E5Vnp4qygPkUnxC0n2Mdj1SW3PL5jk
-mIoYssRjZgoQD00RzfXYUJwSRYZEbYn7eM+n6OAN/iWSHw0Ddx7986I1/UK5+uPluJz1D+pg6X8y
-5IIh5MawVn7Vyh9XzXTZG4rBKobGlZJX++ghWC7FYfbpoPFV+Gm1s6XecHYkLmWEOZFY3lq7M6TZ
-EX7C7gz4YlqHBne0+BUNnomm3+158E1d4zTeFnWQffQHhML36v6leHk5y5MDyrcHuftx8Sb70Jp3
-wYIdZf9oLZYw9h3S19SofRL9KE/0b+P7wVdwQh+npV6kHs/zESZK+I10vvtVHIRKVdW2QpbSxUpQ
-CSNZYW+pG8J1I40IcE2RbyuMypNP0TwzAHjm4LPoJH51/5ZD/QJLCaz1xMs2zokL1wRZSls6Jy5c
-E8nqUzg0ioYmuswa37c1VD2U1Cg2r0pz0PANJfvo+SKPzViVTiqo/7s8C+xIy/5U9a14mef9gCDY
-zd9lX0P5O9/7EpvDSFUkTehE+iKY7TP8Zax4/pvsqGQDzwIRTiJ/blxNPo5q9dxN4xLYHaRTZE61
-I1ZOhUjPDM+HFAGo5Ef81yu2/j0+1f43dnRwU6wMfQMQr7sTFNTowa/IsjLd7wpC+A==
- ]]>
- <![CDATA[
- mLvWgq1ZOCknflHDVHIPo2wYvv6a0b37sxsm2/AKkqdaDw2AWEPOwelnXoYHhe83bxo63G7Ls/8e
-g+HGQPbzw6swOCK3n5wiIGnkGLTyQ+bUq75QmJ1K9/9GFJqmC42PzOfLJ6W3mAIlWW69hw7KpfEK
-pJLxCX8pkbMih/HXVLJXu8jf3WZhtWj+XUsdXTV9ubvrh0fka8svnn5ZicaTIyo5XHVvqdo0Nqos
-bgZzHWZJKnW4d43Z41NYspydz78bXPrq6QwjOKbOjj+Qd1egPoXCOQH7Zpqv5rlVnqIjjYVXMwev
-rZxwfBlVXtS5Wewnh32xUiQ737+olkPBCAfq6gn8m0h/DKvTfbncDnq/0UjZ7Em3Nc4+3YWP0t/h
-hx9Y/IRfzOeEdjYEMKrR4sU89CHymJFjvKWM2FKRXw0wd9LL8LkjvAKiOIyT/LJq0NFeeomOIOkF
-V3DyWfhZ/PAoqhB9vacuSrOCDqILL58Ae+eFlVuWXhbMl8sRbpKmU16w+cvB5u0yd9mk++I0nl5e
-94v9PyEiM19gH/z0M6pYqB6Ii1F04s3ExECAGD17Ok2kBx9HA4lO1dt4fhS7pwHowxibHR6fiPG6
-kXovtVu+V+j8lzc7y7cCyor1rfAdaF3+0AeUEM7RmvNV6sZffrQ2DNbYr9h3l9br2hdYSsmnq+mD
-du0WWyZP2NKg1LrptsE2OUYK5zNY6oWptxwXEO5A/T2lRFtAQs8eZE/OGkfF87+f13zi8TmWuwvd
-fuXu62HwLCq+ynsyP6T7c9JUEReU03jx/LUWQsbGPW4C2vnkwazzqfrR4UO5fXDULH4CvfKj1GGk
-eBEIBrBxo8g+tiS+fEPgCWH/+PPw4dsEKQeL6P2iFA7xn+TyhuZq2s63so+Hy6WCuQZT/OXll7Xy
-PXByoh6Lal75vdT5a+VEAqGsrzhCe/X7+Zn+8d9dgUkXyZWLzWrIbGiadomwx3f8Pnl9s2v0GEpe
-945vdE2OB63gEMfR0tdfxz+lyOSFBs2YoHMPifJ75W8Z8qN2v7KGMXDRwQLWkqtv0ZA5458rhevC
-45mON6Tdi7n3Fczm2T1McnZGWIcSKCoG5H2aenx4A8RkDmIgn5c8f1qeVU+Ko1pCNYKlSWwdeIuf
-Dx+Tws/+YQIYm7vJjTPnEzMeQvOCmO5m0psKV59xOneTLl1mj/NT0vKWenYSyM6jwgrp5Gwu+d6/
-Ln4KH/HSy2B5pKOn8Dv312HdbzVzk++bEFBMyyyKuYT/fFM7D506Oye4JHPKs2YMIgxzpXouKdxj
-s7Fd/LxbwIosqgqpt9WDciH3/lUuZL/uq4en9HlOiA9z5k1yod/sY/28Uz4pLonegCY+2M+mnwZf
-2dR03sZxSSMWcOhCeK6Ai26/3Y5UNPO0UE4qo6u/cCZZqcL6Mns5bioTxYKiLC1QmP4OuOP3KPv4
-WV8RsDP8xaoYu+9Hs+nr3yFhnMM/dX6/PC5IWy+KuM5yyHvN/8HqpyG/fxT/HrQ+ZFIPOJIc1ZtV
-sdpaLIqRbrl0Ejz0NYAXm7P8300mYeSXu31YvoYvyFI6pgOg5zgfmGr1ePGzPgdnj/r8IyTwfPH+
-UfGVvZfZ+UFrWfyczGMmDCvAqvkVRHs7z+XC5xmrio/kvyDjIIkCsaKJVT58/v2hmMTwu1jJ+AZg
-Ygi8GIPtPb4sFLDH5cB5/wk5l29IRzwXByct5CqswqoDKO/ysKFAMJWYHz+BVVT5zd3QeRbc7LNh
-9iQzPSBlUTaD4Fc/TlCRWkRe+EyDK+US0cs7pChoIxbcCHe0VWbqpmvSfrk2LvUSY8AcjQVNiOXP
-JR+uyjAHzdvcJPcZMMcClL9MWYEIgPVEfaWvwiyspPUjrytJ1bC9OC9WjK8E36klCHF9nKOYs/Id
-MNUHVeo154litjqdyY0jE2TQ8SIjVZrZEd44lKyL8OnFywVBHVh13vOjZPYQuxLSRiaPNheSoRXS
-F/fp6OfJXBkpGYK4qgap/Gg0/dA58CqPEct2t9SlTvykBS9B5MUXuVFngHYlDtBmDZW7n9SWxcjN
-rC9bSsOV0mtyfcFYjkq9ff4dPBnvvFxK3Vf1xsasel/DjvLx59/REbjtv7xqC5lYAFegsUsxPNmA
-xcamOH4qhW/8YSBgK2rXLnMFYnh5CJjLMTPMHp+C+yl7MioHSRtcD+zBWu6QCM8K1yXhAy8o4czi
-RVCVI2hLNKTTwF2wiTyU6/jPQfpEMmjlRuX2KM6DjuRH2eTzVymXqiyWaOs7Wg5cRB8LdONvcTxI
-H/3BmO+DJObM7A9bkUgnn/UGWm25yqW60y9iScAK9+WuUwVbb0Idf64Gc73qnYSKceILZWMYM43H
-x89o4QHs7YdyOfsFTP6wqved+ZfHTi+mA/IDroB9nhiwR06ucg+RLMzLV2hMYsHMWeqt9tu5VDS2
-jwxCXsdesByNB3lu2O/zj433x1TyrFAtfL/295GHtZ89uWNbxcvLk31ls1j/Gdhj5c5RKXv83gCz
-M3kXppjIrAda/mUIa+7nNHc/SjxplHDnObsIPu8XLy9YYPuD/NRMocq79rcvyXp7Nfb4oGXhtPiV
-4PdPIqu3Hz4zC5XACwrNyiflnsSNin5SVJOskyQ9tpCcituj8Gk2uV/EZwegI++F5EN/cgLW+PSw
-FVWDm+l+v1dPM53QbX4UpeuV55fnMczLMq9G88Qm163uqvzxvvpGpy382DeKjiN1Dk8EOdkUugpF
-nI3PePQJJr4RyI27XwtFt2kgtpg/vAYSZyw0YB/BeG2tgIBNH6i1u5X6VuSxp1y9kayrtBOG2d8a
-jPzvSROyRFT+eIIlakotctTJ9ZSIiWJi5f0n9WLoJ947iTQv87lU5BzBO/qBsWBZVQwiK8rLkyNZ
-eCUwpvK93M1lFW2XfjURHRhNl+72YXEYvB53nia/4L3GS7++ckmY/JRaz98NUDjRpknzD75x8/or
-aZha+c0Sdjm4PJ6Uenwwkb8KBn+S4/O7MPLE9dHoO1j3r8p+YOfDl1K0mfrKc09slJj9n1bkK1cv
-LkL87LJzdgq+cQCcqxNai0+BEjoFeemmh6fF95/mAcFoChzs1sOa82cFgr0rfGf70eL5qPCkW/Ip
-5u7toBy4zKdgXm5fIhNi/Jo4OK9ohh/kfyZK3XopoWpGDeYXZDhU+zhgLUdIXgQcU0E+Mkv1tTGX
-dKnz8RvJjc+8t+WPwDuDhOGteOH9pNTuybDbrePzm+o9n35udGEsg7JkIgKrSdrigvqC2QczLwgI
-3shYPZ8+eHd1tCghtMOlq7AAUheOgAzVF6VepgqgGkfTQ6FRej0Uvp7AR4aeVVFcPtbK1b97S9TH
-/8nI52NpZu9i0t27maKDeou9Ik5tFLOryKwvbSv1eKVUVOC2WJYShGK/k+5EbKZNLdJCUHNIlFN4
-D48VDAwfsJ92DIlkhnPM447+jK6hyffkv6o/8qFrh1OX8vnEuJpqG/8ZD0eLZaynngA/lg4wno+H
-e+i6qD31EP8G8BEooF37tvM1OB9/TrTHF3UtOdSyOOnh46e6I6lmQIlki6BjD/AB9XxnvnBuWu4s
-lk+DLjrvbdtfCe4fSuBDOUQSx9S/gU/2OvPB3vJ7sNcXc4r2pPObi73/+h6M9xadfyG+6Yz3zkej
-Fb6hfzLf+/wZwYcL9FhlO/lIdmyvscAg4V8tsH8mq73pCD6ajPfQTWEIMkItgvtCVWJ+NIgie4BM
-+XQMVNxbThCI3mDvZ4kad/ZGnX/QSfHOdDr66Ympa4tV7xt173wMcv3zNVbBiNjGMFEr6N3kU0X/
-s9hbjYeofEPMmFqmoyeD53+w6M1/psZjtWbEr89//lBemT4Nx5JbUDqB7ZziPjwsO+M+um3NrgOM
-2AEgkHtmvVdzHpwb1ydTZ/a7kXNGnZuKBACJd6br/eCLIGvA3cxJtSb+ITIoKTsk4qFmdLz5HvGX
-nDjC23yC7m2tA1sZE1GsWheB88SLfS5/5Lxtu6kH9gP5kdLxgPP/cYEGJV11loP69+qvO+78jGRu
-jDEJu0mWmfeJyISxHz7WYdrx2ypdxBeDOcKhprS5nEyCDup8uvxWzHtFNZR+HMXYPm/NiRdk5QtY
-1Om1Ve0isjqRmOJGxQPZzRjJApNdpiBOSHDJsYZkBmcSWmefc7aIrybjiYr4/A+W61x38q+t5v28
-D6vWz+fPYK5MprUwiNlq5fnkDxbS/5rMh6qmdpQIUy6wyAW3HwbJIyiVHlt8hD6zURxST8b/EhNt
-SeWx3sCJNYLIXtF+6iob3Y6l5TyhXG8+6XaWtc4/g7ku/9SKTXr4mlZTmtvR53Y+QQbB+bgHZoiO
-QGvxF0o8HS8lcOrcMEzCtWDp+dtR+InRSnm4bpDq9IYe63ps4coa0OlETV/XQ0ea1S70jmkms72u
-01FnHe5V2dBMKxPZW3qpcXUjA2vb6b8pfEXm1AVeSROeKE1mw9G9yWg06GkX16QFK7m/j8RR2omO
-lkQ/odCZigmCP/KksbY2mxnlXc6cnQiTysDO3AYPCBs1YAMpuXDgsMIrUVUXFLoafe/6ADpruGEE
-XhTrxqQ7ANf7WZjCeZa9ckZtXvrrgnGPJ8c0f081v8iPxsAehpQ+eIFvta4bL0lD/fr6NEWAMvc1
-M6CGHFbLyeVgbvIGJTHejG878uV2zren4KRLmxtTtNcloNxkZP3kkPVDjlNpg+EVkMlSkEyWe6sL
-c3DTG0nLPJBahrJqVVfMSG2gB5qIUxV/FOUobyZHCjTdpTxu7phB+aKuyYQaO9BJhOiOUGJbR0pp
-m5mTSmxjTys1HXw8US8wQiEEZIWia1eMdJVw6wjrlDNsohZ+J90YBtEZjTrarFZ1RgwfwCoM5v+X
-jd4k4dq3Wgx/pl2giI1PjZrNB8gsHKDRzO1bopVBvc/IfhVB7eVhEyM6VnLB0UxcTLoo8LZdGA9h
-6v4s/zrIstAnPRuX2unX3zDWReGGyednrEuYEqZGCG7+h+IN+uZmZNcCXy0GcsRQEVBpDd57GnTj
-jz/9wSR+NYFFbrDBomzWgcVyFJOielPRw3Y1W+gzqf3YrUeNv5n2/+D1aOy6U9O+a+Dilc7KF2Zz
-P53OpWY2cwJtJOzSPNOM6UxDO+I61aRg2Yq8n9Scx6DRD7KoYyPFU3RouJRNaJveiS3nKnKbPopt
-SX4NAOuBPu3vdf/ZK85/UFEH2ylAUMbkumBE1NPRzLqRI8lEUBPiXhgbYLpmhinHrfAFH/YKrY9D
-xSYXhJgq3K50DaejZsamoz1mUYMvRL3lWqFqpsM46tE89qfccmPVoofDAEt0w4sNdVBLZcXsivXC
-MMcxpq3n/dhkju6t6NgH1VDDTzAVvifz/yO2MnMsUKupdCuaHS9grF8xW+aT2vyLCPqat1qgm3lk
-WI7t/mU/xkVvOrKL3oltemP9DZ/6NkvCl7AeH8zTqDN1poPUzqbveP0ajNH9WHZaFw==
- ]]>
- <![CDATA[
- tVrItbIdORc3F7W0KhhuvgGWX6Ii6/Yha9wUFDwyFrW6yGZ5dmjTm0+mDk2Qqfaj7BpaNpsTRa6d
-kKKgQ5fcBXSyXpxWF03j5UR/S6N1W2KNcWEVjchwqFNjdaFzbkt0w0yKPsfLWH9kr/LENtP552Rs
-p+9Qs8WqK8ujWZhluoCBkvfbmbXo4vtqbJuMB18d9eZLi0Y9NVDm0A6Wm7E9rBHdw5Eh2wgUtFt8
-d8AFGNhQCTUaLFHIZwx9UybGFJq2lWkA6b+nMU2YyDy8A63mesvePHoHLb9MfACzdtIqqO7mmPGX
-2k4MHdq3hGXNFiXabelo3GiLhpNpz0ar4AYLmxnHDfor24iAjeaFz+3NDPDnFs5rBG71uRr3bLhE
-bCPFIhbuNnTxN53xWL6fztyXxq2cHIPeH2EuBRqxh9ieWB8QfNz+3lvg4enm9i249y/GwTX7A2uO
-MPnMbEhog5wr261wDEeMhfb+/rFx2omGk+X3gLxwT/Gsc3JzwrcmIzEJ9Wqu25//HoxuB/PPQU85
-ZmNwvI+Vynba+msIpViXDYVp5HceHJMln5je4BXOJD6S4bPHbpyKh6+i4bPvJYt+MdzJXZpVXtwp
-v/CLY/asvswXP4XKsHpwf9pBiQQZ5S0TPr3nv71Btnrqjcb99x6fN5wZnniD1y+CN/L9A68+PmPe
-8Cr94I1cPRe9UeqKoeKnzQBGn/AWgnfcgllcQeeKQ+7s5iPD5lNsin/h/15wFh0+naa+partQcHj
-m88zp91cZHp9kb0UFplU9eQpVp68cI+l+dsLVXwpN+vl09xpjw7lkmMJC3t4Fy5EQ/eAr8ZbDVcc
-UIytCYdAMUOj2mI+P17UAUnknIpzD+Iw1J4tUuXlI9OaDI+o/hGNMd+oYOfv1OIEYKdW4UzFe4QH
-juelOIzFF6kKl5od/8KflRF83Sxqkb7N36/e7syRVpKtRPq8FTNF2jq8rnl8OrQqUv7nsuIzR3ri
-DcwXtG9ujvSWfuP2mXRIRerxqWgX/shV1AJp4jvQ8TdL5ki54Fv4hPkyH+l+ucV5fAeN6ahmNlaq
-nL/MWiDlDw7H8+CpBdJmiyp/Xj+oSPGNdwraivfkiL5o102RVqpM3ZK8zEum/oGRAi92S9o5fQJO
-fltlaght0DirgSb7OqKDgJSbGFipRuUlpLd+vw5pIvHXnqpIVU4W0bbn79/jugXSbIdPlg9pU6St
-s497K6RVj++QDRy/mY/1xPu+OPge3JsjvSsEM7PDv5oZ0vDxKJ1RkcK8aFkpdPaSvTFHyjWbVFmg
-rk2R7pe/kof3f8yNGVKPjyq/v5ctxsof+Ibjq4IV0g5ViXw8miOtUDn/IJBsYqQen57Ay4PImYS0
-GQ3oCHx2zZ1K5C29DcsapC8nVC0ZpRHSkA6px7fYrw4m/H0nygDa5FTPv7XXl44FUv4gOeyXW1ZI
-i9RV6F3ASBGP6cZ6Pktnf+fX96ZIH479rCXSy8EDS5khRZqfe41SD+3gvtlYF/uX1cH160swYIr0
-0T/+skT68H330cVIPT7jWF8r1OPl9MQcaY31NcrZk1NzpNOLfTOkoJMR2sd2ZX9pQeDXG+rp7LJo
-jvQqU2q37t7fTZG+3wzPMVK0vhjH+ttM9MsWSN9S1PtiFDVHev07/bsRUqwOKcrrQmjb59GxJYHn
-voew1wJps0GVfv4uTJGmrqP73ux7FPQYoE3P9EKzaifbEtIuG9QJTfCl1glhpIw/E6hqR1qjPkLp
-HEIaUZECFoQWwP7OZKV/OtcjXUyOTiWky7OwbqTet85rUESab9LnWkUYmS8aGS9gAbQxo1Y6j+Kx
-AtLC0qAKq/u8iPSMvozqFGFkyl2LKw17mC5cYqQIi4T2cD7vdMcIKaVDOp/nBhOZfy+8OqSLxG9a
-WmnO0ncxHXn3J4OPukeyHwadNq/tVLVx1JqkLd827+i/R6u331T1w7dS3xo0P6je4pHF1zAHR+GC
-3K/fQVL3lk/R7br0djFMGaSSH3/vP5u9F5Xi7Xn6zfJtigndf1i//e60/ArFjO9zzNFLz/JtLTw+
-Y6zfdm8+j9W3OorxBzf7vW7V4utU9ah60liIbz/9M0H3bSP8Ixunn/R+2kCxRvfiYWz2XtRyxfBw
-bvn2ydeNe63fvhXTpzLFTN5/+FrJQ8u3v8vbadXy7fCRyd+pbw0U+xuWMy2rr6FLd8cJy7cXDJd5
-tqaYrzfuPtSsvj7yHp2/hSzflnJX3YHl2wvmbJ+2pljOyxwG0xZvE1WqdBqSx5wOHOvehut3izPp
-bSF2opfKav2jEsqp77kFF7nXemAFqu9/LUj658M3Qm+nkjtabidE1ZOfLK7FXxo9xiwPkYdZ8EYv
-hCZ4mL919E8MPSt7I8X7AvrnCftvivcm6ggJX+c+L2u++T7jP72NSvoc/ByNPZY5YP3w4cUflg3k
-6RASEb9Kjf3gxz6vQLXuHwG+zxMF30H857QbBO20X5qvPmJRjbqd73t8Klrs6Vgg5Q+Qn/NqjpRr
-vlgihUXkl9bZY+RYsadjiRQteT0rpH0SKfcAPjKBNnWdfyCQ9o+ODlSk2PpXkLI68iLrXxlpZaRB
-Gmxi75VEqyHwKWOJFFv/FkjBHwTrv6UihbFoxvpuiRQIvOCskSLr3xKpx4fs/2/zsZ54Y3ZIa35L
-pNimUJEi2degRTZFXTOrA0FGj39JExEsvPT/3LRrrf7GpOxbtOQPZq3S841ju8S3xHeStsjDmN9y
-krY0iO5H4A9R554I0GTKq7mkXI4esjqJR3nmEfWfzDTQr0vOOtJJor+fmQZPpgrEAAaREaqHv7gX
-GaHyWgTF1SkhzKyqmiT0mZJP+idyNZEQYBNYRqDYltAfGNzpVGykiz6B2svHvwdFn/LPPWkxSzGz
-G6VxEWGpkMP9uDiTYkrQ5cYtPDhCBu0qJFNHtNsldUyM4PZIS0Al4gYdpi4SPh/+BzHkk9ZLMuvU
-UDjXdYrsUnvlB9a9ijD+M4qIo+nCgZjkoC3fV/lLJ6Kjf6TOi868yfj8XsvxeXzqCPE/ljMoz9/D
-vvP8HSjjC0k8ZjZCZLw2bIjlfv4mmD9Fz8IlsWyA0aH8b9kSlMcNu8vEOo6uxVkqX2lWZJGzKm+z
-9SlvSncwbl4kTt6a8kz+Rbiwp7vHmlha1RM0qp5WSat6WEvV43Fi3dLb+ZwkoNJlDQGPRNVjTrsW
-uhdcJrBFfyKliPiPRDt6bE67ZtRrqbatpBLH40yH1txff2jkKoYHx5491q+cSF25PJJ2E0w7Ugzr
-RkWuYsSoBrexI2n2DWq0BFgeJ2sNyEzDAO+AO/dM0FYRQ5LPP4JH0LnnosU0RaZ059BfxX0Q4/wb
-EoayXqW/J+FTmXMITsZBHXNgtFtgZqAw3YldnpBR7jplt3JnL3WwVnb2n1e2c3lARxp0BP3zGiY2
-KQxsAZoxULo0m06gGDmh6B+YUDUQbeQNGJ+iBY28cXOndInoFx7LsmLas0ylu7AaZJYaLBtxgxVm
-nBLV47sKG6ekX3GywtyqnmFq4fFZLkwubEa1MVgzr0vLZcnjW2d+K4gm1fWtJzPZ71e0etqEWFcT
-deG16dLy7MJyrby5l/rjxqSDLlkbdPLUeXzuZhC8fFvDwsnm18zg2GdrWKwxf5XbPxWUyMlbAHsY
-u+gXqjvhBph2QVm3X/IOrwSsae/ErDNI0qrbmmLt+Q4pptVoa/Zrqo3DfCTnBsd1mVlsaB1r9l+g
-P1UzZ9DKoDVdoJn887fXQY8RBra5VC7P9ncmlfnn2eF6jrK4H2uYySraMqmptEGe+PrUae4fuXU+
-FNtST53MQlmWHcMI5oZhVacUTOXFeZoyC3sXT9cRiZONXXHQAq46orMtN6OJg9gTHRF95LDFEvVV
-RaHr1zV8cnFTUnvISDnbw7wvujEioA2/zhHPl9ZAYBHUAEvQa2PDmKoPCwE5tzc7PL51OnWwoQLQ
-akskcu9Ln/2y7FYBnKsKwK2/bz0+vwuSe9wRXWMrOMcz9Ja8Guv7PUebek+7YKriki69LyqqZtCc
-hTN1fCx8cuD9b9Ytf0o7VnbEci/ilm4P9pKAWGuKuIZYiojjL9hDYRjXCvgFGotWxE29bufoEnDt
-vrsIiV0s4UIfktX3xi4kq4uQ/F1oLXgLp9g5JAtDIwRJmv21wyQX6FzCldvwhuIl6btysdIuyxuE
-N4APZgweED6pYpgt93OlW1Mt4j4en12U7u8Cbe42t4r7ILI4x/p0qsAiXoOow7viZEJvaiINU40p
-nV3pTWngA+tgoqSTXRjTiMqXelN6HdqJ9hjuj8++P27jC+xZI+nXcQThi621EF7qLOHN5CV9F7Qf
-mjOfX6qLn7K+bBCNnl7q1z2rAXl8NpwOvKNd9DZRAGcNX8LjMOfuCNN2CNJ7dEudlS0L1NEtdE7r
-EGnLimMhljq0WeUnz2+gUcEzN8xgKXUEJxegP7H1Yt7GMT8/mK122l1R11uQAMwq3moWbRU9C6t4
-KwK2hvCZ+0sgNB7f1psUeNbslzyPazhaR3K93kh74iKcbSVQhKJ4kyoUWSevA2f9dU/x902AaXYI
-11tEtfuDfmxdRAJai7OAj6nuZIehgA+fenzOYuhiuUHAmNjae3wWRgQ6yxlyRUrC/EzPNKuYXqMt
-hkGDRlsM9Rt4LjSaaYSkAITJzrbVaA1Vo8ne6zoWvB6Ys0bzuNxBQsA212iKVFYeJzvQaDBrZhpt
-bdkHOOtrNEPsQoSzvUZDULbfe8VwbHaDIvmAsosT9/jMrAHNIvQ4sfOgya1DcxuFi9xrz1uCz2OI
-jaNn227AyuvLp39mrYZcWmYFkPObpZkwixH49dQsAHv0rqVkPT5LNbvh6QetMD9iX1rjiW9ioMCs
-6Q41WWkYZzjuTHtLKDgOA3C2PwKBoVg41Lqdd2c42k13l+Flk90EDGwXsWpxLYTxhZF1oV0N4Wl0
-G/ueYNLO/v1ia4/v+cltNIuIXViuhk9r2ff2MVgEbHv7/m1mthauu4qhWVs/pGVcxRCcbex7Aoqy
-Fm6+imE4Jva9GRTFe7WA43Y1tF8LsYZ5m229GmrWwrZ+nxhjgac7OY6E9I/pOSxprdQcnlKPYVja
-Au25zZSQpIy42H17ft4mVq2L8wOwbaWb6JeJbNuftbahmCtzV55JhMXKI4K5jLmSc5vd0wLQ8zFu
-E7lycZxO1yVLjsBnexzFS78wFWJRw7JUiMVd+ZUuFiYm/9y3PJ5nfXLNwt+HnjHuSOlCuLqL3Z22
-BWCWezdKtMftgXoAxh4eX9Z2ESEBiiXXMzEsziCimWzHXMVgRWAWwt60PXwrcoRHjt+76pRLjjAI
-l7Qii6KrrmeZxNXY1LOQ5gBnyy2+vNHxXdsbeWyVvNEc20J5cyWzDDrx5pbtc+jIVcyYQafLGNo4
-h84+gw7r5B3k0FkixRl0ltmCa+bQ2WfQkdmC2+TQ2WfQaay+LXLo7DPoNNmCW+TQ2Q==
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
-yX+hJ/CJ3NznK92UPf8feYUNGg==
- ]]>
-</i:pgf>
-</svg>
diff --git a/docs/theme/mkdocs/img/nav/docker-logo-loggedout.png b/docs/theme/mkdocs/img/nav/docker-logo-loggedout.png
deleted file mode 100644
index a0bb9d9484..0000000000
--- a/docs/theme/mkdocs/img/nav/docker-logo-loggedout.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/img/nav/search-icon.svg b/docs/theme/mkdocs/img/nav/search-icon.svg
deleted file mode 100644
index bf8e120907..0000000000
--- a/docs/theme/mkdocs/img/nav/search-icon.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" height="14px" width="14px" > <path fill="rgb( 148, 156, 167 )" d="M13.492,13.492 C12.9849999999999,14 12.1610000000001,14 11.653,13.492 C11.653,13.492 8.47000000000003,10.309 8.47000000000003,10.309 C9.20700000000011,9.83499999999998 9.83500000000004,9.20800000000003 10.309,8.47000000000003 C10.309,8.47000000000003 13.492,11.653 13.492,11.653 C14,12.161 14,12.985 13.492,13.492 ZM5.202,10.405 C2.32899999999995,10.405 0,8.07499999999999 0,5.202 C0,2.32900000000001 2.32899999999995,0 5.202,0 C8.07500000000005,0 10.405,2.32900000000001 10.405,5.202 C10.405,8.07499999999999 8.07500000000005,10.405 5.202,10.405 ZM5.202,1.30099999999999 C3.05099999999993,1.30099999999999 1.30099999999993,3.05099999999999 1.30099999999993,5.202 C1.30099999999993,7.35399999999998 3.05099999999993,9.10399999999998 5.202,9.10399999999998 C7.35400000000004,9.10399999999998 9.10400000000004,7.35399999999998 9.10400000000004,5.202 C9.10400000000004,3.05099999999999 7.35400000000004,1.30099999999999 5.202,1.30099999999999 ZM3.03500000000008,5.202 C3.03500000000008,5.202 2.16799999999989,5.202 2.16799999999989,5.202 C2.16799999999989,3.529 3.529,2.16800000000001 5.202,2.16800000000001 C5.202,2.16800000000001 5.202,3.03500000000003 5.202,3.03500000000003 C4.00700000000006,3.03500000000003 3.03500000000008,4.00700000000001 3.03500000000008,5.202 Z "/> </svg> \ No newline at end of file
diff --git a/docs/theme/mkdocs/img/tutorial/DockerHub-Tutorial-05.psd.svg b/docs/theme/mkdocs/img/tutorial/DockerHub-Tutorial-05.psd.svg
deleted file mode 100644
index 4cf37d3fa4..0000000000
--- a/docs/theme/mkdocs/img/tutorial/DockerHub-Tutorial-05.psd.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" height="10px" width="11px" > <path fill="rgb( 36, 184, 235 )" d="M5.713,10 C5.713,10 5.714,7.101 5.714,7.101 C5.714,7.101 11,7.101 11,7.101 C11,7.101 11,2.894 11,2.894 C11,2.894 5.713,2.894 5.713,2.894 C5.713,2.894 5.714,0 5.714,0 C5.714,0 0,5 0,5 C0,5 5.713,10 5.713,10 Z "/> </svg> \ No newline at end of file
diff --git a/docs/theme/mkdocs/img/tutorial/caret-left-icon-over.svg b/docs/theme/mkdocs/img/tutorial/caret-left-icon-over.svg
deleted file mode 100644
index fa3f5606de..0000000000
--- a/docs/theme/mkdocs/img/tutorial/caret-left-icon-over.svg
+++ /dev/null
@@ -1,1898 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
- <!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
- <!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
- <!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
- <!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
- <!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
- <!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
- <!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
- <!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
-]>
-<svg version="1.1" id="Layer_1" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="4px" height="9px"
- viewBox="0 0 4 9" style="enable-background:new 0 0 4 9;" xml:space="preserve">
-<switch>
- <foreignObject requiredExtensions="&ns_ai;" x="0" y="0" width="1" height="1">
- <i:pgfRef xlink:href="#adobe_illustrator_pgf">
- </i:pgfRef>
- </foreignObject>
- <g i:extraneous="self">
- <polygon style="fill:#24B8EB;" points="4,8.7 4,0.1 0,4.4 "/>
- </g>
-</switch>
-<i:pgf id="adobe_illustrator_pgf">
- <![CDATA[
- eJzsveuOJLmRLvgE/g6xPwaQBqdTTtLppGsPFsjIi47OSjOCWnMBBgeNmuqUVGfq0qiu1qz26de+
-z8xIekRkddalJWGnk6jKDAs63Z0Xo10+M/7d//GbL7+4/vrNvz98ka7mw/R3f3fz9uHZuzdvf34g
-9fDLly+/+/bdW5B+8tufHsJ6NUul61/Wr6ziPz+8/fbFm9c/51f88h5X/+T62z8+vD384upwfPnd
-q39/ePuHnx5+8lP59ncv3r18kO+fP3v78O6Llw+/f/fFi+dvXl99+6c//NRvL+3dPnsntfLPQvpZ
-WA4h/HwOh+tfo8Kz13969u23L/7fB9wy1SS045vvXn/94vUfjm/+n58f5sMXYT4sBzzK/3jx24dv
-999ezTEuazh8sV0tS1jCIV1tWwzb4Yv5qi4x1izX3b55/t2rh9fvfvP2zfOHb7+9efPyzdtvf364
-+fOz14dfP/uDfPNskk7IX92/ePkg7/vq2btDiHj761+G+NXxuxcvv/4HvvbPD2uNIKev2Mo/fSuX
-S0v4G+Ty1S9fCeXLh3fv5BHlHnjs3/7iON4Z74Tyk3/77cMfXnA0pIf+10+t2bdvvnn17O1/fMuX
-m0uKC15u3WKqhwWUGvByJCS95ncPr755KT3MLolX+fBFlv/8D6sjr8bvv0gz+ygevljmcBU2uUGa
-K1s+pE26bS6rXtP77eFPLx7+8+eHf3jz+kF76vrtuy910JZlnvV//ea33718ePtPr1+8kzdgO5t2
-1a/ffP3wUuq36+9fPmMPsYT+v1b43bO3f3h4J+P95uV37zgjq99BhuJXz/78gCEMeoN//Obh9e/e
-/DOf8YvtIB1VZTbJ+2zbdgiVba85y+vldr/Q/9dm0Qia8LaLDN1vZDD/8e2LP7x4/fMv0lbReVnH
-+RdvX3zdh7lEuSn/4ytc1eHf5v/0WeW13717eG3PLtPr5tfDdJmvfv2l3Pfu9dc3b16h77/FgpB5
-8lqm0Ms3f9Dv2t/8Ri7/7ht9B37+SobpN29fvEab0z/wm/rVb15+J1/94u2b77755evfv5l+ogzh
-nx+ey6qXkfz68I///r/lg6xrTuHD794+ey4NyOdW5+rZi29++t7m5OXePhz0S7mSH/339199+/B7
-WXz9cqXevf7Tw8s33wzNNsqz118f/uXZ22++v+nfvHz2+pkwMNBby7968Sf55pn0VG+7057QqMyT
-b6RzeAmrnNzgPRWGr55wo2fv/iic9+H119+2tvXj/sGV9v3tffkcc/Dt4fj2u2//ePjdmzcvW7P7
-r1rrRiYV9f827vEbXvD6H19rB53fySqc3km4z9/cXaT243eQL/+WW7959vLliz+8ffbNH188v3SD
-C9+3O+l3HzKx/vzq39+8fPHtqz6fBspvnr199+L5y4cv//ztu4dXTx7cw93XL4TJPbKM31vny/98
-9u75H3/14t/fPnv74uG9qw8D8PsXr7+Wuf/ldy/ePfQOevPqG8g1hy//+OybB77Guz/es+aXrcH8
-lbD+kbl/8cV7uH5YD8fXw/e/ePvs6xeyoYiw9os3L79+eH34Ldj7tPsk21c5HL+e/m2arQSW5fB3
-Xx3fTv99mk9/wkmJQ0lWFiuZ/7ys+DfJr7GUVuq87cr1UI5SbqzcDuVuvp/mey+7Bxt/4lDSUJZd
-yVom/iphlVL4uw5l25XrcGzlppVjuJXin24n+XBH0m24H8vYdXw4/0lDWYaS44oy6a9YhlLjJkX/
-vx7KUcv0f10ay8dGM+3GcxlGtY+tlKkN7zIMso7qOLpVCn5jVOtufLdhhOX/yYbaB/vYhll/Y5Tv
-xtGW//VnvjjWcdoNdJJxxW+MLMZ4Zakc5XIywtdW9mMrY4lfdyy3J6PoN00cwz5mKDpIPmSbDZYM
-0GRjhLG6sXLLcmflHsVXFl5mHMvAUVqs4ys79MhFcs++iXz5la+38VVu+cTBnnDllJFHmHhf3Cem
-lJa0piLqxpaOUm7TvYx2WNKyLHkpS1225Xo5LrfL3XIvHRlzyktec8lbvs7HfJPv8v0kDxRkli5r
-Xte1rtt6vR7Xm/V2vZe5EKQblpKLyOxlK8dyU27LvcyTUGNdaq5rLXWr1/VYb+tdvZf5Eqctbcsm
-7WxVpPzjdrPdbfcyacJ1ul6u8/V6Xa+36+vro5Sb69vrO86kKC+wHPOxHOtxk6+Ox5vj3fFeZleY
-2NvpZrnJN/IAN9vN9c3x5ubm9uZeJlvgKCy3+Xa9lYe7rbfb7fH25vbu9v5ulnFJd8vdelfu6t12
-J/e6u7m7ne7u7u4xI+6lw+7zvbzpvTz7/bUUueW9XHl/8iNjOctots93Q7kdys1QjrtyPZTNyyT/
-1aGUoay7koeyDCUNRSbgdB9bGVlYZ77z+Oh348/trtxomfjrOJTroWy7UodShrIOJU93uZVlV9JQ
-4lDCUOaxaJdP1vfj048/N0M5auHK3I3jfvT2Y+ajtR+i/bDIUEzDaOyHYN/x++62bj7pW/bn1Lp0
-35H73tv32Ek/7btmOukR7Y1rKxtLtVKsrCzZysKSrMSJa8+2TGX9bfr7m+m9/OfIcm1lY6lWZG1P
-8t9qJVtZWJIVZb3O6IWD+ljecfyOHK/K8ckcEAzCzG6/ZTdfs1cL+3FhvwX20x075siOqBPfPPNd
-8YIzX+iWL3DNRy58woVPJM8hs+VOOvNG+Na18K8qfGwVbrYIV4vCzedJJtKd9PKNML1rYX/1uggj
-zMIQk+woQXbYexnxW+mO43YtbLNuRRhoFkaaZAsKsh/fy0S4lW46Crfdap2E8a7CgJeahBUH2bjv
-ZYbcSh8ey7Ww6lqKMO0szDsJCw+y0d/L3LmVjj0Kg9+E0Rdh91nYfhLmH9Z5kml8J2N8IxvDtWwQ
-VbaJNWfZMJJsHEFkh3uZbrcyFkfZVDbZXMqyyjazyHYTZdOZZd7fyay4kY3oWjakOsnOtKYse1SS
-vSqIrHIvM/RWhg+7KLZVbLRZNjdsxCHOAVy2CbRWC/W8FuvJgtJNHfIbdv6NkoFKCiI7cD48cjs2
-wwb88n4xxI7YGcP9wOqVJWwyqbJMqCCT6dJUirZHcPfBj+5AgesSu1Dm6vWdyPYibEWy24gQwHtj
-v2ub3SqzrF7Y7lLb7rDZXeOGvLhJDMlk0OJSA4WGO4oNwQSH3ESH67Hb0QuQ0+Z7bVI+UJi75Ues
-Fl0rviG2XZTf88351joM15RK7tJuZCkShib0qISngo9KcjcUxO+k6WBCtr6OS80mJVOtYFPeUG+G
-jbA39OKLPaGPPA6UDtJOWKCkkGTki8yAI+fCiXTgXZFtA3COM/KcPlU63xk5D3mPdvEFdrTnRt/H
-i7TrT1bjJy/GYxN/vXRFpu5UnGJqj5a804xMW5rsD/9RgXyno+5VMN9jmoLWJH2W47RT7G4oQbtS
-gN/bSaknpSuR+tc6uZrZynJW0lmJF4r9TDtN90yhw4obhbT2+/ZiET4xNU37xpSxo2pnF8v2aKmu
-902Dkq9lfWLpKmUey7T/2IwN/e/zkh4pnBTTHJ9YLnXwhTI9seKTfy7p7p/089ka9H0xtB5VGdXF
-7FsrKmG5UcKNFNV0YTdi2EqfTG325e1mkT79T1ezS6i+escFe9R17Cr9+WotzQSwWsnNQNBtQ2lc
-oNP3r0z5q5klunnqZDn6grydBqPWaOQ6XlyOx51p7HxBmjHldH3WnZWtW2fcQnNpibbP09nKPF2E
-54vyvWU6MxheWqnvW78ny3MabJCfvIbft47/+svuszd4SUQdtZ9z/UflkXP9x6WQGTr0HaWNzTS/
-1eSN2LSf+0HiKDuJIw4a0I3oQNSAJlGBoASpCgQlaKYGpDrQDY0/qgfVpgcl04OgCd2IFnSkHlRp
-SlomqkKBi+OeWvEt7iDXV9GEVBeCNhRVG6I+dGv60JH6UKU+BI0InCtMphTdU8OFWqSKEVSjStUI
-ytFC5ShwKd1TQ7qhhgQdCVpSkbuiqihCkyhKieww0DRzR3XpVtQlKExQmaA0QW0qS6biBNUpkVPN
-VJ/uTbE+aplEboPkBtmtUH5bUT/hJ1B+6lwcMq2ORZfSVDKrVKBQlqlx6jOpa5Cx3JKqv0cGPIpI
-lIemQQjaMdUzxrmTXHY8cscRp51MgnLC2y6ytfdIEOcSw9PYxKPs43OuY9MWtYxmqvFnb5YbTI17
-W5jvq5P9EXcl7cre7JZPyrorZdqZ8srOyFepKO3L9Uk5npap2by83J6V85/78+JzbBp36vtwocSL
-JV0sZsk7L/mRsj5ami132hl2C83N7yvb95TraWdOvlyOTyxk7tPOcv2+cvu0Ml0gXhrEJ5fp0a8+
-8ud8E/3YhsxwMzf1M5rHQstiRc2Zbt4sVtz6uVkx2+hkplL/cd7Ql42Ph3NWV5Fdkncrrdpsl4lG
-Iy1rK27mra1sVq5bOV7gUfIznTGoS6ypm+4vc6OBD02PMKHHuM9jXGfgNEfacB7nNe/hMTumYoxl
-ei9PucBJvo+FTO/nG09gGSesYRq5xEezhmG9P8YYnsgGzlf+4+v4/eUvtI4/yIa6s6KKyHajxk46
-YSFnpWWZRNJbB1/sUTiB+mNn88jCJ5vpla0iULpn9ha+Wdlc1DmbKIrCQVsmyqfupYWf9o6eWvXV
-JkiX9NfiBz7bawrA8NtiAanvFt5bCJb04E504lZI2nTkHoUb3TZ37iziHyRJ+HQXeTxIyIVi+SYi
-+jX9uzfCL+7Myztfh0nk+Eh5Hu5eOHzX60JJfxscv3T9SsF0hCAYaGBMdAPDEQyBvNAdXKfjRp+w
-eoVvyIuwtO/pH54by3Vm62zW2Wtnq8ZRp8ZKOwt11tmZZueVnUd23jhyxNup8cGR/3W+t+d1I4sb
-2drAzKaBj+1Z1wmzuiD5nPOjQaa5LLc8xmVOxI6xTO/jGt/LJp64wX/sOjbD9b9N8wArDocIuPGh
-zleLLJdDSVeyQCKqfjn93VdPqXr89rzFqywV83yo4Ur0wPXR5k7roa2rsJZtCfJlgHYbHaWca42L
-/FFytK9jyOt2QAVtJF6lOS/tZp/cEJ9mFs00r8C3yyJfcZ0o16J8s61tyfNG7LQwxSXLHxG/w9BW
-upqFrfSH+kzt6bOtszBUtJXDnAuvq8KItS1REau2H4Wjoi0Zt7zt2srzvA3P9nna+/hRjOWqprSh
-pZrL9olDedrahZlqT75tV8LPH5um+0rSyvG2QRwdqXgZvPiPb5//8cXXP538D2k0Nsji1boG2Scx
-jimWshLAKIuL3YuvMfK7ZWtXHPwKjUKwKw52hS1TeWBR1odX+oiLtcOeeiG6aVmvUsL0/ogb76//
-kG7+8j/+LH2M/w8Iv2EH/3fff+5t14m232TzZxbbXa5tQ7kdHc+2WSyGhZLdgJKQ7AXBcF4LRQQg
-vY4UDe5pFVKRYKUwcE0x4I67BIBe2Pd1z7+mte/2FNioIEb3CKl9W83k2ItnA4CqSw==
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 0Ri2kO1Kp5KBiPaFzkp8fqzZHKATrPDi4/mDDhKvlBWXOIdlj1wh38jYXqUFu43Mxln2CRlV30dD
-6T0UZxkjYaycflTI5INcUAPrFazq2Xpi3vrGydHHOIYZ6CuAiWcoBYUDUBZZ10G2Z4TNgQvXOdjy
-kQ/LKg8o2msC85dNSrpLOP426/1PZ+jJNg3dgZM04DbFpJtOhXgob72CgxXlBWTdQdg1crB0ik+Q
-BRx+qBfl9dcwNNUIdke9sFGlI5Lwg6EpkUJXWTbDLY2iV7ZHa/Xa07e2Tt/Se0E0U+0dzOg5R5XS
-MbY1g4k4VfRgEbxnUGT8t7yjFNWydDwaFSur5sPQlqyHgBHp9zSKXpmuorDysZ7ssoBfDW01yu6e
-jdqerbXVnv/0PVsPyCph34giS8301Y4IRH3GCkvay0tVJTyIbpAwC53gzAhZZ3qtteqwtnYawe72
-3KabEpNMEYi5rZ1oL9TuZgRd3/5MrZY/tbdz+m6PS2ufYm6CjjgLebQvgb1B0XLzEtSBDIilm5fC
-IhKYaFk78xKEUtn7tmZeUoVBuICblyCizvOy7MxLaGuDwObmJfBK3s3NS4HmC+ETo3mJ3BI8z81L
-8uZXMF838xIIMe6tSyEuKsWZdQncVbb30KxLZH2idOysS+SbIjw26xI2DOm0pVmXWo1uXQLLXJba
-nzpEEYW2ujbzUogy97edcQmkUoVDu3GpSQJuXsIKq6luO/MSGG9OwqebeUkW0RZhRTPrEhaV7B47
-45IsvTyj58y2JMtf5m1005J8TAuNgt20BH6QcECKWZakiZTWzQ1LwrdloMrOriRiNjPjuVlpo4Rc
-mlVJdgbM2dGmRN63ldBsSug6CJFuUpJ7X8EFsDMpBbkrl5SblIJM1wwgsmtfwm05a0eTUoDyWrpF
-CdvnXNelWZRCjTqLR4sSdiqKtW5RkvvKpiyP7Cals4V1sncx3iYsO5NSI7o1CNOhZpGBzVwUIlMP
-5tGkhN0qQrjzOgFGS5jbvBEnjEaeTjRTUGvGjUXtXqNJqT1Qr+Xv4e2cvtjIq0UeWnYmpU40UxD4
-YtpysxWJzImwqW1nUQJHRbjPUGvWm/ZmnDDYeDrRLEG9HbMV9bsNFqX2SK2SP3Nr5uTN/tYNSh+v
-3csCj5VcyIxzr0aqLGUa6JobQTZugEqFEHS6gA3lbJZjqBRLpGaethneA+lokRRxWU5mnuRWLDVk
-23AHgdn/YdzJwkiaGV9UDK5FYSfy1DE0glrgIaCXXgmW9SIifK3mV3DCtmn7zf4OIlbDvOIhZTMT
-jrNRRaAwAmNsXAeCvlwVbYNL2Ku1vgtmoj7vzRPjQJnVvolNQIQgtUN1qjBFkeEXteLScxCjOQfA
-F9ccOkV7Dk6ItI71onoKhrac4vd0s7VRi7nkWlvQnTh67Z5O0Sv92Vq9/lbe1tl7/iCiTjPyQ85d
-123Z+9KgopBzN2ca6ok2X7o3DbJpzqv7xcydJju1iIC40v1pot3LPkwPm60EbCsi3+e9R40yXuId
-igudq87d5lOD5iBika8Zc6pBxV0LJpF71cDd+GzNrYY9qVu43K+GrStgSjfPmsgLMvgpd9carAAy
-2X0IzXMGbUzEwdKda7IO5OZcg14HFpTFhPu2Mts7uIeNKpPcanSxJXXt7HxslDzzEpuTDa6tRe7c
-vGyBosey97JRuYYa0rxsED1lN4qDm21Bh5gU0P1sso/pG7mjLWAfldFqrjaaG3JwB5352vDi6lNx
-ZxvU8y1ifru7DR04L87+3N9G9WbDO7rDLc4J4uXWPW7CREXysQ2pudwiXSQ1dJ8br8T7NqcbLKtt
-9rjTDc3VEtfudYOdkkpK87vJ1iaCmhl4muMtRmiEskM2z1sEZwx0qjlfC7POzZ3vDSYhipnufINy
-uUh/H84X5iPuN3zPZfVqT62yMcetO+BgyODLNLdYo+yccEM9c7ANbTWK3XPniAMjqJnOX2sLiiwN
-vO2ejbLzxQ312vO3tk7f88wdF6WrsnTa3h8HAwznXnN+xSAbbQndReaEnUOu17L9Z2ioUeyGO5cc
-RjhDSO5NQS0JcbihEXY+uV6rPXlr6PQN/38rRIUU1FwZEoyCNp2xG1Kvw9eiHWJnnWGkg/otfQpN
-lvZmUoT7keKKpjrYVsTrUBIRhr7A5iKcQuei3EoNfk5RjSmpR6/Xg8uNYjw4St7AEI1nhQzW61eK
-VmNXyobEe8qVc4LZBkZS7Ednr3miASXoU7CR5blvxwM16GaDdmCRhhV2C2Tu8DHATOkU1Uxk8aR5
-HeoJ56lQ83pTnTJ3RtOp8gq6fbe2FmEHMSzDPZ3y3EaSj9ar+dO3ps7e8nHZ5nP4eeG/4RzYOXph
-x9XxdU8vzPgzPDjN1RtEEIKtYO/rpaWYV7obF0xDZ1mjpDzMqUZdfE65uzdm54zu7m2Unbu313M/
-buQKSCMllT6pOhVDmUcHL3axOdsY7XvoEZ9vhCiMnP6v9lT4AOLavb5tx3RnbCPsPL+9mnt1e1Od
-YrfceX+5sVKBb21BPqZlzW/phJ0DeKjWnr41dfqWP4APGPxK+ELda4mN6lpiswa6lohpQaPKqCWC
-e4ioH5uWCIUqVGGCriXC4kB74aglNjuea4nNHOcKIMzQZY1lpyVC95sHVRImskUmsyuJ/nnUEZ3W
-VESYqVf495ruR49f2ta9jggrVlnwbK1e6znXEc/78tSOtKrFYqcjdqrrdTTLYFY13Q9/rCmXvY5I
-q09a4lAvVLX59bYaZdTXBqrpdb0t1/36PUcdsT9br9feqrV1+p6XHcqfYgpfssFSYHiG0/fVnlpM
-6VkWdxKuqkFgVc2QWRrF7eG0cA71sKPDNdfbahS7pzMPo25mRWhtyUYkXGwd7ukUN6abq7LVa8/f
-2jp9zx/EuxyxTumelY2A4j2ldlEbtkKIUVTBISZasgvN/AmpksDFS6HhH9CNzXEdMjnoi4JBPQZl
-mypySAeLlhQJVthi1Jelbc5BDhHOR2zGaosh7AELDioXpgIkU+1yaIzN1gScyhYVgSMvm6jrr6no
-lWVbF3pXaehFv0pn2ZyGip/wVrLvq94NT1clBY5o6PBbUbshhCjRD027ExVONo1A57cCaGfKf9z8
-FIArYjrM7ZDCgisYAWwV9mpRuvkC2HkqXY4rFlFV3Oe6QYUts+rHqjVLs6bBBih8MfNkcni2aAGH
-PU2kzkSjQ0qu+Wba/hc+VtWRXBQjQKFQdcjTOXCi2cVV8SO4YimLwZs71c0GmDU09EqfFADrqZ2q
-K94oOkeS4nGGerIphprHthrF7qlXNmoy+GtvK+pWOdwz9s1zeLZWrz1/a+v0PX8QKTBmBwTMpUuB
-jQqvOpXhJRg8zpcghomEfDVHc3FgQtUVdlbYUhbF0atMOPt1UBfpDxSlrUljEDYLtQ+IgmpucO0D
-aojrxtGVgy4BwveCidrrlc2hgpvegbNSoQvbKAGWEyo4ofaFzEqVVxtFlk2TADu1JJcx6TuD3xm5
-ZSKnveIQ6ygiF4OhwNinD7v6w8ofess622s6xXlD2VHVXogdAvbCQAuct7UN2hO4Dx8W4ru+5maD
-AsiFDsrsMQDCNpLfk/N7Xqrag+Qq5bsq4kdbv2CjKWaaCGnQ9CuVjRTRzGFBm6N1x5rdupJdG4xd
-L6XNaoFAAA8vTezBtUawUxoEoOzqPBgfdjE0IHVIWuPazI42Rc/n+glrwZQEkA0vQ9PZqz1Vtpa6
-qMljXaqO1QKbIzYH7Xqn6HKQji7gnb1eUV/q0FajpMFc16kZR12Fw9AWrELAyPd7GkWvbM/W6rXn
-b22dvmdzuMm0pXcL851b1as9dVMzJsAqdIvBfpDpyViBhiTexSiKdAiK3RnqyXqNeddWo9g9/Uqj
-FrNwtbbgL4Wps9/TKXqlP1uv156/tXX6nq0HZGC2jC1XlD/CEl/tqNiaC831s9tLMJLcCysREI3g
-K36m+79XW5BsLg1NNYrfUq9sVIg/9Bl6W4BSlNDvaJ+VUfhzeaX+Qt7O2Sv6y8PeWon6Aqo7mcN1
-oC6QfhWqJ8KkOhooWcMsGmsqnaK8ByYNmMidSlAXH8vbGih2T72yUaMJdr0t+AHgeuj3NMpze1p7
-tlavPb+1df6erQcS3LtR8UyiuJj/rFFhX4MQDk44Y+bJcqOoBvBvmrfQKc9NLKGLf6gHGAS8g62p
-RvFbuohgVLNa9LaEdQJN2W9pBHUR2IN5pf5C3s7ZK/4A+nzDMGOnoMdrB+rGVrUyl6ijurEFrRmO
-Iod1wySRqtvfHdgNQV+9Co7sBg47w87WoN1RRIG81dCGAFAhSJqQjRzbjY5Sh6aDu1EzZffRGLib
-ZpBlXTq6m0IOYCcN3g1+mrYTeDfejIClhu+GXcxudNo5p/uQAaHxB/WvHcQbOkxS1cUg1dypgS1t
-yOtGee7dDn4/1DMM99CWU/yergYZtWovtqbkTvSB9ls6xSVBfbRer72UN3X6lpfV88+B96bXKzra
-s1MVpdHA1ZhTMnm2jsFuFDVXGFR7qGdo7t5UI9gd9cJGlV18Jay2NVXMDtxvWQZzcX+0Vq89fWvr
-9C0bN4PpFs4+qO3CKQx70agiQOU5ICJQhKyilr5gPsR59vCPYBsrbLZlWdehXpoNqNlaahS/ozMl
-pcLEBpRXbwsTatnGezpFxTp9slarPXtr6ewdfxDTRIMVYw0RSj1C3ymL0WTo2HcslJzo5TLwO3Sc
-HgLp6Hd68sACGvwdcs5WYuz490ZR8UYB8L2aY9shbJsN3ClbGPUdo5KXQh5uIHgKjaqOGAoeLLTJ
-1g0GD2e5qhAOb0fvU4LslBUGBr+yUUWamSN9GgaDB76HbvoGg28UFX8MBt/rObw9FkMadIqbHVxw
-Mmq4IijYUfCRbh5ABBwFD2TO2h7WUfBwQ6idzFHwcC+ksuaOgocu0ZUPR8HDzU74REPBU+dIMXUc
-PFpvykfDwQN1QHuLw+AxAuSrDQePjQSJc0xAMiA8FPG1DkB4bFR8hvMpe2IHdpQ4BjEgmOLVnioq
-GI4ubohzvvM2YOGd4JOE+PVeyyDuQ0ONYjfUCxvVFbvWFIBTcUTfN4pe6Q/W67WHb22dvmST9B0i
-DpjXEjzQ0eHrjdog7pj9dJYMlDyEfHQqDFdw/PW2IGgT9tPuaRS90uDrQz2DuA9tNcruno3anq21
-1Z7/9D1bDzhcHHOnLG697lRhYQTCOPBcBNirmfBqx6c3irMmwth7PUe697Y6xe75fBoQ8dRNaEjp
-bc32Zv2eRtHV3p6t1WvP722dvefjEu/nwMXvwGIOjG9YsYaMb1ixBo3fYcUaNr5hxRo4vmHFmj9s
-hxVr8PiGFWv4+IYVawD5HVasIeQbVqxB5BtWzDHyO6hYA8k3qFiDyTeoWPOv7aBiDQbfoGINKd+g
-Yr3OCBVr7rn2Cg0u37BiDS8/IMUaYL4hxTpi3rFiDTI/YsUaZL5hxRwy36BiDTM/Ig==
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- xipx/sx//WJHtxDzBHJ+GyYccOpp5nhelik0XLjIRFXg46FWs0XHZqyZK1spFlV1kLUxQyXW3ZYE
-jbgXu2jhP/B8YSHVq7trEneMb4j1Nmx/WJTMoaXIsPjCdZf+qWNr9Mhqgd1iHw2KOIPLT4F/VsvT
-xZF0OKe6RydN6jVjWMDfmpCQsmSzzmxy2SDJq+79dP4khz86fp/LPV+m+nVSokpL22uA4deOhVOP
-BGoUBKNjTc1VY5N6ancnmH7y6oHiUb1bVc1FWCzORiocD9ltc0nq+fRhZxUJzMet0xYJTlw3ZXXJ
-WeizkJhbS5qMeguJILOv+JLRMZUYCiQ72e3nSC2DygQZ8tpCtWlp0mQ0PKnJ73SzVQZauCeLjBHJ
-3h9JTfEIulc2pJvy20D8FSvQmn3POgJPAYApDu1wJi49PmSNkcxBQV9FFfO2KPtUlbo/22FVxVkQ
-MJ36KIKl96df7qrFYB/3e/lTQhSJjgTVleQGUfcpOkt8zkg1MVAGgMoInls1jIXJPxKHUu6BXSl7
-T6nvCG1hAHmaNY0XqRLPAjbckoUOv/a09wclSn5cAsraC/AOMmtHXAeJ14KrRd5XSriK2vCUpOOT
-EODWPwo2skyZ7sEeYhGWDJ+hGazH6gD6DDm3oOK1Tz4DlRpVXsqo5u4p0kjk7nTbJXwjzboo7dg9
-KFIKMPm81QieMnWew7aggWcMPcc6vWhF1JWjGOD8nLahl5RHaIte9PDZznZeXdFpQt76slBW4h3D
-2JqoxcTi8QfwqXPBu19XkErgROhJIhiPk2Uf3SbOTqckNhti9JiUz/vVdvk7C9t0zyLeuvw3RV0P
-MZJTlrpxMXhsVQ+JtFfheJoeLVUFtNRu52+PdiB90dmmhH2qSsB9wZZpoIhfFQOTUo0ebsiFk+oG
-NZm+rKkuJoVLB5ZIcAgD0XaHWPA90gdhaJOBVYi+IQSmxXt+eEX6wVyjMSuWJhyuKyWZ4igB1ALD
-QwkcdmRsiayR/V0BckShfBJpmk1Mux2r9DiuP+jyAtMSiw5KioffD7uIyX4qBP2NY1/2pI7AUIn6
-NoSNKalG5xuN/AhQ876C0TnlFyhGTFLBFrMj6iOPrCW7InpEePtmksuyO7XlETpgWEe1z8eWvMVv
-D53ARz6Monaw4JlpPH88zFD4VCUAZz2DP4HC+Wh0+xF9DzzbSmoBRaSIHfTmT6X5jpVI9YwIsoCg
-w7cM1sft1cWuok4y6XFpyUR8foyvNcKfrJvGIEdAWpdFMzvLJkgMvXr88BXnjcHDTk3ksF6oOsYi
-wmuH/thxXgGNQ3MxpVqAZhsaHt3np0pLinluJztoiVXZbrLm7XbqZDDsfFkg5Vs9/MltRXyYns8w
-0gWVgHwZPzv5sQbIqJOuqI6HMA/vpFpkIfPEXuxdAbAcBLGM6QHzdtY3uLgNp2gu26txbrlYBpLx
-gU1iL5pe049vQD5ALnNHN2HsomNgPEJnBCjOCjklqrWEoSIBREP15cNKLfprRzLQePykvzNVK3Bb
-Qk+Lw7O8nfJDhBPwdi+GjLJUwLgION8Ik3Im4SUCijW4GTxaXpAJQpmKJfxkcctxnkK1RhJWIRh4
-AYhpgJHLNsbFYDtY0EqFht3jC+opvGM8HLoVl640ZKbfhTAqLKgJ4EU2q0T4iwyYl6ZpAduxO5XO
-Ff9fpTnExTJwpB1d2obn3RKFm/B2qfocUBPjwbdADCwRo7knUdS8pKTXMecqlAKkgugclJXK1UXu
-2C/fLNEIllIRfDKLT/CRO51RD8GwO8bI6pQ+rIolw4oANyyKI6PPCgRKMDAjwMFjpb0jncpc3RCE
-h8LCERYWHvIn07LB8qtMTSpOsSalrRlJZ7CfLxlDuUMV0rjTbIAWIb/9IQ2ELxSnAziayHBGp4oU
-y7CMFYj94jA1yu4epguKSHncjM/yUbdzGHquez+G2ZuiedyGYXEQKBRYK9bhkkkRmPRnAySK+hQo
-Trw0ViyEkxiF5nuJRzws50PcuUd2gYBRthpGGA0h1ZYRJ0J3K54qocfRdyCJxEgjRJFsf0vsECyc
-uCEGIr0IvnIJljL0QNBkZPrebHdsBwwWdzpIfoHhx++GUESRsJF41jIri207lCoqbDzepQLKMRLz
-MnHxBIsA/1Oz9pRi+bFDxIaqT1Zqh/HDHS2cQzFTRh/V59UpoA5/XL1o8WrCs9vfM6yDMfupQlke
-SwFvDBjRpHZoxxwvD9s+LEYv6WPwrtTIOWGc4QtCXhGe0WPVR84GmzHphJAW7gGBKw+0YXxYj4d8
-QFVWjHXoYsfI92MObU5uVcS+s0U7kkTGu5TMkKKVHHVc2WLm5DFs7TGRLbMb3hi25PNpsS8271JO
-y/kVncNU1qoYcfNAJOH2Tni5xJFGyRg/CWSzmIOfy2M8bg8biZKvHJ148aEld3POmAT9LcpCGSW/
-18rkEFR00R4AZC2tU13EkKn8LdqO7Ue4DSMf6N64Q/EQkMMtXtFbBUoYhuaWYzkYevuj8YCNCfQo
-Iatnu+wmcFQmlHs4esuJrjh/xV/ciZxijKpC2BgdS7SYhQXqQVhUxzXLqe6EVZ7IlDomU6vtLtr7
-J0kCYcvsHrMzBNtchVKOiPcT/tbUI+ciIiNSlHmNkM9qN3TLYd/k6IYJ/kfNHvYa3lJY2qNteijk
-ZZ26Zex0wEONLgvHOPxeK/rFdX6xSvCJxNRKeG8R8uEIhUJC+QddnRVx7txGrtJU5J8pBbgzmQRC
-J4HoO5ENsjSgpIjkwDpL13jDgilY1jOd3GNeDdus5skl3hwCYeB/YMHFmYYNspwV7FiwwdK709NU
-KmtP6ythZdcWXBNJXhyxKilmWcX4Sto57wiHUKgnqKk5SSFOQt8IIwmyGRmRnzY0GfS8+4dBk2ij
-GrMyva+pln0xYGjM065bg4+eZEMpaUageaTGaerRIo6/mOmKEE7gX2wGPyBnyOpEuoRK87tZSmZD
-qu7hFaFU+YQGs2BS4MKILgtHava5obtMjhZ+cYOfc8h4MTAVxELwlq0H3lIuyndnBmbxLqP8xjUt
-MLaJxwRfFVUPmYFZ1PVwM1sGhwHEgorVYZkaiqztGt8yEpimLB/LR/3ke1Ww1wsY7OteWn+8ylwv
-oMqpuqU0e8bBQtwUovpy+pBzZ9qmqyJQQ3ZyQ8/RPSckViPhbxZbw8DpjFuMsfZ+D5wYWptnoeWs
-PwMBNCh118+aBztSiMBw92pKnCphwSZeTFc/Am9U16bIqZmSHTKsnpSIZn03EnfUUcLB2Km8gx+H
-bFbZ5thu1Lg3aKODeMgwxYzCjxpxV1h5r1EIlr2dOMQEyTyytAgFbrcfVk61asCdRyTBru2Yy2IG
-rj96ktqzmSgC8Tkj2AGMRThNQTFgKTnfhEWOVJHzc7ZbzaATqD/4DLcF8JoUMLZjfdxFZnl+Z305
-Txu8BC6aw6J7WxSoP5tl9zWoUdu4LYycBz7gWCvbIycSfn1mg03u53QAtc2TIlaekxIjtw6Ahd0G
-mKdQis7kQ0SST4RoRvdcxJe7t2PfRVjY6Ie5+5XDElH0WU2oaUudepgBhwuAakA0K0JegvA8BKGZ
-p2E0AqkQho1aBGdgmT5Z1mIxn89EjdqU+y1Y+lbx4NAJjvlLhsIh28FElHZ/XtTChfOW2MbXTc+V
-dAXVg+lHkr2KzlVdJXCsGhClIZeFGSqy/JlDRYipdDmauGp+4uQe+gqbFNIISGX93iPkB3MP/A9Y
-FBrF25LjE3lM7AUDG8IEbkfFtiYohYupboWhXDsqww0rQkOkFDcR1CfVPLCwUQx6D538Zncj5Foc
-AmOD5eRUBpVHu8Ex+oLkQG8Pc0ph9XZexNEykwLZWfJlQB+CmBMEZVqZTUNomwMGLKzm7suAokRK
-ww4qLRHPq7Q7tJSo8Ofbeh8qnRsbCWC47SjyTSNyYHQy0j2ChIWXyaST27QkbWdkhgCfCEeimoRD
-SVg0ghike7Zbw3WxpGzhLKCUWZsY1fagZVx+USaRFnET8B+PNAu6Sk/tsSNRRGLEc3lZoqdMdhIa
-cn3ONdwmxiy0MOBygI9kZK/a2Vdmcrl/DCDDRgfxy7qs+mTjkTkc5i2agkbEb5/umjRMaCJNIAQ3
-mheoHC9KKGLSxhZ0RS5jSeUOOw7ywWIEghu4wqJUL7apRxNFThoPR8cJFu/HiYUGjgwZJDPvttsP
-jYiOFLHUGD2H+kxSMNxAlqC6ZxSuUY2ekN/HzeZykDeacWC4NTmpqwJuV3Hbbhp54axUr/L+KHij
-BUs9asio01KEvew9VWtd9EbRwNEV8XRKzbLFo9QE1BY/+bgfUX2iw5vzcghVPhLzvd2sn374rwr5
-ZSCSzGW2IzUQglZla7tFZQxPpmS5TnEocp6/Y4kqIRWkp09XdMXHh1q4KXqlNwTsl+yuyXTsypQE
-9sNBV3BLC+WetXzORAx0+WInDlxU68N04SK7IVLNbcdIq52b9oqRVoWiqDViZ0D8AMURKMJFxi2X
-KLOHpT8n1ClRH6uTk9xe1kiglL1xIar+1JRZrH2R4Ryzcy6jBslrf/AJOChkN4NOLOxOc785tk5N
-SbQw4wAFC+vL82M9HTUtZew9VQZRHImiOJeNNkgfnhLnaoRhcfkMl3mF6iTps6GYkUA+VDjkJbed
-az9sM0ORkVmvABeZ0VqscAPYRp04EwtPc70MHsOOBUOJp4RU9oICa+LuRJY+mUdFg5IV9RN14ugN
-Y+OL9zh7WjxacBuOYERszxMhc7+xx2rY5Kgyk8Wz+Sc5oMMyYtXIsOjQiTAIypgaIo20dEauhvEQ
-3DMGdKjyl06NhcTwhLmoxs2QEGi1aJfmnjacKVFayPZhJTrNoJU8y7OKm+KqWoASrnxCj4kMr662
-ap0yLlI9i6YC9o5MrpqjIWb1XRNWHH6hwKy6sQtlwUnIKj003vzYU8l3lgZQNNKE6k3Mm1TN6qJj
-QEJkydJ0C5yarBiHCpcweSRnqSofDnXiq6EKNhY/DyN17JLApaNjqbBonhzZ4lXMFjk8NFg5T7IF
-uhdcUqHWGs5MJHFh2QnDMeysInOYLVJlexTkOSs5VKh9HJYEPfEkIXpjjhI/yVUBFkH83Jor//kf
-8mSzRhX+JKzNMkVlQZFqZFCOclin9NV7DpYSHcKg4eCQQfFitu6TDiYlsxYNaG1CyWzosrHeAMcU
-q2dK/igCzI+1AixKGDWEISbD6Dqnmx1ifcU1jDrSV47rg5o0CLGIZRrpWv10YzyBbKNuHYYlg9RI
-OBkOnqgByPHekQ8LQTSsrUmopvZs957shaWDb5mrONiJJXBc4XttwswtVSPD07p6VsRyK/kXqW/k
-wt0tQOiHYwpiOIQCsaFP/he/BPooKRfH+fSY9CgXR34aq4dufdvJ5PeuZoPDoQpO1FRzbHUsLMO6
-9hQuCJcLikpgTCv6bTmJkB03rrcmpHuRdw7H10vD4bArhnSJLWaTqpZCba50oWEPTw==
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- vbgPDNGefIg1eHbEGqdLqI55WjGEO8VqDPeaNR1PK1aHPKlYY2IIa1SMk589nQQiZAog2B/Gyf3l
-t3oaccs8jbjtDJHeOpzBs6PROD1C/cvTiCHcn1zEPvWXlRtPI6cAeRKxisQQVqEYJT97EglESBRA
-sDuMk7vrXuopxO3yFMq94EaI9NWhDJ4dhcapESpcnkIM4e6woiIzzukynkKs8HgSsU4kdZzOJDjd
-syeRQIREAYTssg4n95ffGsw01zJPI2671OHeMk7/7Gg0To/TD/V+sLMyItv2R/NZJmA/VZXf4Lhy
-HE33WUoZAFE5+reEz9IO3oe6LJ1bhf//P//8oT/+z+j//G31Z/VH/kzhof/5ONw3+8fz/lk5Bqc6
-BtEpOM2xMQYt7dpw7rwx5wZBz+HeoIrjDo4x6BwuDqg54eSgvp7HzTGNdpTkC8aXfVa5I7ZzvoID
-xFac4gIZg5Z3gtiKU9wgFnpORwjWnHCFjEHLO0OwX+PuEASexyEyjXaziT7NUTIGncNVYmtOcZYg
-9BzuEqw37jAZBZZ3mWCnJpwmCD2P22Qa5U6h8hR3yhh0DocKJJ6cdKkg9FxOFaw54VYZg5Z3rGDH
-JlwrCD2Pc2Ua9WZTeorTZRRY2u0CyRInHS+YQvFcrheoOel8GYOWd79Avs4JBwx0dX4XzBSqzSbw
-FNfMKLC0cwZikCfcM3AA8xwOGqg24aIZBZZ10kBvJtw0AJzfUTOFWrMJO8WBMwos7cKBOJhxJw6m
-1Z3fjQPxOBOOnFFgSVcO9GXCmQPA+d05U2h1ilYx6eYZBZZ29Nhqk64eBM7v7MFq4+6eUWBZhw/2
-Ztzlg8C5nT5TqHXamjbhDAqAc7iDAp3Ym3UClXgel1Cg+nrzziiwtFvIK8PeyhPowmoO19AUap1C
-2EmXUQCcw2kUqL0jhD2P4yhQbkcIex7nkdd3Rwh7HgfSFGqV0HVHCHse11Kg545Qdn73kldnR8h6
-DhdToOCOkPU8bqYptCqh3I4KgnM4oALFdoSs53FCBerrCGXP44gKNNpRUXAOZ9QUep2tzYaUnd9N
-FWiyIVnP5aoK9NWQrOdyV3kVNqTq/C6rSTqdrb6GFJ3fmeVV15Cg8zu0vIYaEnN+p5bXWUNKzu/Y
-mqTP2fpqSMn5XV6iq4aEnN/t5VXSkJBzu768khrScX731yR1zlZQQzrO7xjzymlIyPmdY14HDQk5
-v4PMa6UhJed3kk3SZzYlZ+ZD+NRR9/lppwznPRP7fe+oNZ42eiyS/1Pljo6TWhbjlTyxKjCzsbaS
-NYZbZPDKHIMhBQyCG2aSGPIiq3g2CO4FiVJMj4UHpemEhQXGMQZ00DvR/hdrpSk4uKhp240KlqIM
-1NoqPJq0hggUkxCG2OAMDAKKfBKAtSI8xo24A8zjfcbYkIiqwUUXSAZOpuAAO2s+u4K0MHcJ5aeA
-pFoVMefxFAgoXFGCB9GFTMru3bICU0W7FvlSY21cuIzQcI+UlX8GZ7KqJFktM5DMwcAVTsXFHTF/
-Vu+2Onubnd6gRZdnPJ1MrjXv/RmSWSvFoQKThmUSMNRXKClv4QLi6NKsAv+HR7wZCI4nYSgepXPG
-FB30C9fAEpimqkI5OOgtFIxLZa12UvHfAV9B6Z2DNwVvDBrKmdNzTDqX21IKNw3wmUA+DwvPoX3w
-gd1geNUXrub4TsrJt4Of8JOmW5eoAv1YzbEf1RwbL78EFXKiR35aurvSl18oyhIfJpvLMB+rGb8X
-QU0taBf/8Ux3szFulMFo98eTl19knsWQNpTNeoTeVSS4J6sjU5Xo5D9kSIKBGhnB8F9fxlekoSR8
-bjyD9wbNcYP5oVdXQA5iHY3SCTI/Fcl4QsJiakGt4vEhmo1xowxGGKdpOSMpbeMHJyDRtRwPhlrZ
-DYqki2dNNNhC+TcMkcx1oSr0G14QwN/sL7EdK4znG0V1alqSLDd2ISqVlqTKCPkFR/KqKe2Z0mpf
-aALVKW3UcPDTDtOHpE5RF762Qfp2FfM/yUdLEbkwi/en6mCZ5bp3/PL4lFuu5k2CKflhYsxHBTYa
-zP9DWUlRkYr9Vy1fq0GJapzXMrprqppAVtCqXHVFjxSZDV8x1hm/+auysDLeoAUo8cIq/rYjzaIH
-WxSuwLIPIzgc6s01ft3OWtAOUHhdRWhi2FFe64EA1bhALEfum7vMCr/6q5Mg3aVcqkQkwAuttPvq
-iERXMFE3IkcirIj1AGfOyod7LTRFWiAl4PYkzLBJVyoxMSKhUcQj5L9RM6RxO8HQRkREJbdsSe+g
-KdztTW7Ix7lrK5eLHGCVVgk0bMZtW1OLTr9vaybWyRu3pheddudWoHaERDsKqRnQ2BPeD0YwRp7W
-TGoeUh5yz2hjIxGOUdCQD1cu4BarsRXebj3MxM1YkIAer+GYWljH0UTG41Mxb5TFPHpLlp9iR2tj
-c29sXgrrVoV3x+dZOAPdcG0GszWYwtVguGcQXH3ARWRpMoXgiu5GnVFY62wqwWdi3iiLeZTgH6TM
-6RyHFaYLDTDwtSLu1XA5XM7QA8n47WgG/7kbhXSAMJHRnzrr8Hf/jX4+8COJ96RKNTUy0uNjfrA4
-qefiWpElaSXVcC9bcoG6hdUwh6crFJ/OtAZioRYZuJ75aI3ym6QKbi7WRS2OFO64sgiuZoX7wfg7
-XlufppmH7AgEjKbgYQkgoHpbJoZEu3CDL97SDVYXxyYp2bs3mW2s1pClYDvKa1FhyC5XpBkZ3LDI
-BIBx7FA635G3VMfbUR1v6uZadbI/1bDDZP0bJUg1JFc1pGSDbqqzOw2DW2C4YM7U4iyp/Ex31eV0
-f7LghDydGAWX8tdN1zP3yB31HZ/2KIU9HrQshu8IXu+bRXffcXvDrrxzqpolcGYwnscqd3Ea40Gi
-KMFYKgfZEYiVmmgb35msRue2pBi2/kggOIx0ODiTYQ2eg+GYAWCcOxNvQfEHZfxrqyPPjENBblEl
-Lx17DNHB9X0pEtCJPPfkhiODis50PO1ZSlc9InyomSQuGFIFuzCYJ/Fe8cwPGT7UjE4SBVJ+/MFw
-U3z1Mcz+rZuLZqbFi/usalIYRc3P4ws0zj7f3R2Rx27V/JSCGC5fs/MNDVtFnLvEMASy0zWBlckK
-myw26CfL0ScB1rBCoSuXAA281CBRqS9SOC+tIGEAv6ixJiCLn25/d0igAblS/j0MaKxJW6QMt1aQ
-jPeoMfNqgtePd14+2qrcqVxvtPuNTmsv3rtRwSMVdqRsefvjyKkKOxpWPuUKXbpplsR420lUi3Nl
-1SWBoW8n0SjrMriMPkKXSxKB7prU8kKDDI7tYIJrOcZBTaBv8FsE+wdbNoodneFSc4tOFQlFFKYG
-fopg/hil6RA7wUB4ZmlKziDbFrh2yn4pINKgAp9ZBsazFFen8Y5sTnQNJE0B19znOuiunbh2QE1Q
-ysrKtIiAEfMUR6sKucYpMNr+lqUxxkGlCTjMqjDxlclduwkGfKAxRZuywjONkX0yDjqgtdP+EuOt
-2KMN2pxo4gXpdiUFCmRWjiuJXS8zMAsqGAU0JBWFyS9Osuy26v3G4ZTcwp9YutilC6Y4dNhObEqb
-lNu1tUDneGHiFPUudOJBDCIGOtvFNVHk/VbKkHBRSRJBqHNU6CyDlNSZ5WOIQgBGhztgLWMVaVQA
-gGw/sOZA8js7v+wyijLKflV2XkLieggXAzS2um0FSKVEu/mSxRG4AdwroVIBjnu7m7GciUqWbWlW
-wKY/gxSH2BzIdmjoBt0sUpTgsMhs9+AW2xQjvSHyTCPAUoTwjFGng6w7cSirCI5nTUnVSKdZn1II
-03wDCdFXEyMEwPnHCKMrx0eJwhjnHSdba3KkMFZt/rGiYNex0XLZKecdrynUAlywurzEMcDBubbn
-h+cDhsV2wQo1CKLOEol5hQ2GqsDuoTByyCU25JiikEjOvZnGUQEat1VGEwccRTkLdoAbV+7ByyCu
-I3PZFL/+1GLD1BQ6+oHcdqRjXHaMiXQAsjpajPdEKLiTAe8u0gUuHXDFltVH4Ug57MQS2oAZiD6y
-W5I4wu1VVIAb3iKDYAy7YJlEJzlV0aldLhO4e5qi14GRMnTTw6kGy3jB8yambYA1lyG6ZjXdAsYj
-RVa061YGg2WbrbVyKVQg2iex74DJhfdnFIb2DJbVtMJJQas0hAsbi4dynVhSokHMsqoBFsXI9Qgj
-8B1VJii3ubaN23n/Q0yxxkd2rbXtSz3Evt1iK+T6cdjv1pI0xa1nmqQu34odWDxkRreAW4hSeYq1
-3SkmO/0T+MXyQJLDDMKUI0UOM9VuFQyYoOyPWE3baY+CRTtlDRKnxgU6BSwvGQO+vTixS7/9VChA
-rHqnlI5lKPgZNIEot0whEODqNIUhiWINTocYwnEwaIZuxLLDnYAOAiYz2F1R6v+kAHU1rSUmppy2
-VhCRboqRKbYS+ukolt9QuBjVgRdGeGjDkl7htXAUyAUZIBR6agmEAUAwQiohUErCDgSN8iMyMWib
-k+N4eqQL+D3tQCnIhFrCp5jgHXxjy8+iqFJWwQc9z+7O4sKyUgJB4YZMCdpc4EXru4c9zDNR2az3
-p9jPPrnpTNUoxBBMvc6WECm6kC3SbE2IVLDt1xkFlSkw60boWoOGFQChfQWEiCnY9EewKkMkPUBy
-NIKhHR34XkCwrFDOGgvJMNrAvsuOhS7cM6wnVhe3L46xBgBcsjNqHEN2AkhKF9c5kMI0ywVsCMjY
-UxhNtm131DKuibEbqoEvAEkjELDs26mVg0GNYZDNWEP8hsVcxIiQAXjPDaqbArItAgHi0YDhmdDQ
-q/iZLHnUjUTe7kBgyXGPdPQo4eOoVjLhIpPCtiDGXkKfcEkriOKZ4UdLbtcMB3DNtBPA7ntSeYzx
-pY01frZvhxMoUpk4Z4SNNikDVKFjlNsRqRIQhWN3ohDIWrP8aiiciyA4RDne/sv1JiGCCYRU6vay
-XO4IhG+WFyqo6SFWvcwjSpPoqkEIfWR1nRAmFcEmVqMzm1a+JrC2W/y5w2aX1SzDqEAB+cZyvUkI
-Y+Jcf7gM+eYLCKaVxRrwssYgxnAyevQTmJwEr+ZudqIGypep0AsyZzfGG5MqdrZlKa437jnBqQQb
-CgfI+Q0OAXI/Khr0CveMJocMkqNzAQXKL4RoCgYG+HcwhFvhUHAjx7oB1hdbOTNBx2zVIo6kCijV
-dnQYIT/yG/nZNYkruyY73NIj8DqB2dQBYoWv4Mr8yLj52b2aK7uGjba7sVCGBdsmbVU0Y9WuDMxh
-VpswEdosMxPpi1sNX9T3N+r96rC+PxmgMk9QCrruwQ97RF/RJY5aaYxhoGASMhQLAF/QaYPyGh/R
-t4erBz9CLZPTI+bWLwKkAkgJlXu0M9OJbm1mQbBK8JjTggkoNcWcgK9cWoNPQWPxGdYCHXy3VZV7
-RO8P48QHamKVJLesLGbsyTVrhvvalI/gUK7hxnXQu/HtNt79iNn+JyJI8ZKw/IyaGg==
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
-vPOm+48ftv9x6/pXm+16bfDP9OX3D9Iv7tx/+fDbx8l3d3b+/dXj+/2TRrb9QD/Or6kk+SKKBlt/
-bL25Ff3z/t3/1L6+f+/W8eD+4Ed9e+3a/bs7/+hzoR+GG2++/9fO/XtJa3ez/c23ja1a7as3E6/a
-af5s35dtbV+7k/3ycLj1x28byS/VW+tHvZ2B7e7w8Oa36Rcn21vJP3/a+KPz1U9r17YOoh/2pyL7
-Z1YcZK/+9eu/119s1l7NfmlY7s5v9++93f7t/p1B7ejm1q1rJ9vXHzYP1q4hsbZ/33t6snXw20/Z
-Rud+5/Wdg43D4eZh9osaIcfvX2411M5/79/77qufCI9t8mDzP2/+07Pfvvzv1qPmo39sVPM//rm+
-W/2iS214XW+erF0r/rh+s/GgYf51ffMw2bt7b/1a/OXNjSe3fr95f/Orl9ubrZOvv331wxeHdxuN
-+lv41r754GDnkN6sotv1rN/+5+932v/5obnRufbdV9X+zX+frO/sfvlfaP+N+3d/OIzXrqV3X/12
-f73b+Oro5jeP797Ojv79TTvLbg8O4vV+45G6+faOEoyNrR8GryzZsq9a2U9x1LzT3rxdt+OrHn9z
-vXqrtdHJnh1RD37euXZ/89G9L356cKswAzsuj35Nv/g22+z95+a9V81f7+j9L35DtN92r9kOfZt+
-/QUMya/pT+m/ukCnbzfe3kirjjVfNXci9dsXj7du1+99uf2Pm7/04S0p/PAfxIJF1q5F+//7KMHv
-N7/dvue+3fvpwY9UfPPWg98Jmf5ZP7Ks+zq6+e23D27pre/efOPw/PTNvbvNP578B0dSGmzxPd0w
-7i220MYP0oDffAPU9W+eQ6FWgjDzj42tPST1VmvwXZL+kv7RWH+x9cfNrYPbP/73Qb3+1T830v2X
-/yqeXXv9cv3p5sazrYPd9n/v//e3O2/Wrm0kP7/YI2L+kjZ/ebCnbr7aSF6vP93e+uOnvc32H+nt
-uwdH195sbx58rSwBv/09y543e/59+e5/j35cf7rz9Y/bWzeaPxJtmNDE+3b0h8e1f9387lX9v9Sh
-b9O8fv/ui+H/rr/4YXgy2bUxygZ04IF43f8Ho9q1M+fpptXHHvzSvPZG/37vu61o+9/3Y2SBe7/f
-296y3PH1rZsbveI/42M1StlwYHkgiHO+OxycIJVsX0I6/bDzcH3vB4Ucc+/m8d3ft68f/Fhbj+69
-+EXf+Od/7lFDRsmRnjwvWtvXvzy+sXmYPn/74OZObdtzqp0AP/dAwuw+aAKH3reT6uhL27Uvbmy+
-OXwwyO42Xj5fz37RP42PwbPvO69GcP/vwwfVW/vFtCEp3rZ+3Fy7tv7icfOmlTDfFlsbOz+/ndZa
-LBmUe/hzdmAnzQMd6YfJ40nOGT7bvvGsc3d7y/yib3778Pfq2jXfL9urxsH2gy2TbaTVp69Q4NTU
-969u4Uu3bv9+/PXGH8Pm0Uan+6q3/uLw9T8tih9vCoLjB7d6T/T2l9Xs1/XnB4df2Wq/fbmR3tw5
-JGl5Y+vgq+9T29reIUnBB69ef88i3L7gx99exNv333zzGgT871v7yeFP6y+vNQaj5b5cf/7i107+
-R6d6DyWaXwjsW/zvvR+iextvrx+3t+89VNcD2f7L86/rIU3sWhIIaxXtnzy4/s1/f/IrzdivlpOv
-D7M3tnmt3Ynf899v3n00OLASu/GF2VAnnV/Xd3//YdP9Wqz/fv/e95s1W+T3V1YK7Hy5oX452Vvf
-PXmR+F+xsJVjFnB0v9+48yWNVjg/b/9877unm93s+cGb62r/Py/X4y//8c8HwNOb6uHmzn349m30
-w0P1TdTav/OdunV98zuBfetrrF3zJREKjxsgCjexIj6muzv6X/DrN1SbX7AJsA1Ctn6vup2Z6tZz
-vffL8QMocg8Lw+PW2jVp3gYUeuLx0FvgfaMo7kvjv5Uad7HI/9/ee20nszPtolfAPZicocnBGJOD
-ARMMNmAbTDJgcvq+f66D/9qXpM5BHYB5sPbYY475Dkw3VVKpVKoq6VHB1jRQk5juplFDdGbUTbLD
-sFGRRqnWht89ImIsF0RCKCK6yUKm6E+G3hvFhfk1+s0jfI668cyKEr2OmkdKcTt/bDIieEPyZLgk
-BEMHRp8/UBJDe8VACIaB4kL+BgqLpY26geTEF8cT6hX7JyLGcC5KtCEl2Zek8pCQTUafGIokU/6f
-pFoAy49TDKxawJerTK9YVZEUFnoANFksrCeyr2jm0OJ4YvsMX65LCVUwUxkBPpESE3QTySTOJ/HM
-b02W4UzqtIApepmddUCT2dHijWqS1Vr0OpREWmKqPDItbDDGg1RS9ICa+4isdlHL6wsSOZIiokzp
-mJQBRF1jpqY2NSSHhJlDpLVEbWyFoz57HX0ixQ+7gRoP/+nzXT9Huv1e2RZS1lkbePq/fu6CEUtv
-wVo5rxZ+ar14Qe/wgFUM9itKr/ZuE/BccqvUh7Ezzy4Hw1R+sjpYyKWM406Ezg18OMN1O5wfKJwB
-sRg/oEENzc3d9mfS9WuU7V/sGseLtghj6t1qi2UXl1Y/V6kcMtwOZYazdGubq6feBscx8GDXqY2P
-z8WJYof4K7EeJtw/hZ3wqddg/wRB6Ps+P3G1vZmwy+/mxI2+zHiemznyJda3gp7SyyXGCobywr6i
-dU7oxnUiQGgKY9vYurD7Jd0zEYFuEPzMvfPWWl9p2C7gKQFvPdS/JThREZpAT+nG4ERFaEJ5fYyG
-umHXyJCZF/sOVmyEEl17jiVqDDrmFeUfdV8yyI1l5cSS+v9WZIECaTqeKn3lKpmwFTCwjzPN1Kcj
-0zR/n5E7DE1FREJO3FgEqX0yXPHkyn+RESs2EFlAwVHiT29Lkfd1tZ2udypA3cHsJJWTbQguqCDl
-mQyHHcwEKGbW4fkn8v51Ztb/Fzd0Vs8VV+YZmF7NBExqTMAn17m4N4xjMedj8JVPtooJUhJW0sIU
-02/rlBP8en7wTVrPdX+qo49RkWrbMQPCWgUVgn5/f2XMLr70cdDg4ZAe/W8P6K4HzA==
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- QB7NEZNABalu6QY6wE9PKc6WtoZudOJeTQcDxLPSFTs7btFpGFI7BQQoiamVBIzA3UrdEG/tc0Ey
-Ptc+S0h2Q6Uo4RFKHyJwMhRLGSdTykNnhgceDpw3Qdhvp94s/PmcEkU/KD0fDa036hhwUGy36Vg1
-6GEJYHVMlsQgRdyqY9aF7TYdI7Z2jI6pJlF1uhQVhEsAdYKvY4OI55bRAPH8k1eKANAxtSSKVYPy
-dJUmQB1jhQ6fatsn3YaBR1qUsA3oUnLF0QAOpuKMl2sDPMS8j982GtCrlRclWl/kulFyF7TNDVEb
-wlUf9MZvmBul55ZfoQ3HpNfHWZFLwbOnk+CQGA/Mt60B47nTSa/Isq2QacPeh1cqQRuouS9sxcQU
-cd+kERP3k+e2Q2bwgLvkFMe2gbGW6MBnyGdDTiJbfwyxj7r1k2Du2Tns5i6jYjX7/RIzUimDUIrO
-JJEp/pcN/5w6CZ3QmaXAE/eGTkAuYvCEZugEkw6V3pZE46JqY1K4Lcl5sM/OmQeCnD5MoL7CrALn
-246N2TZ4dXEfzIMMJgFGyyBKgnaFPDIPzQPUZLQPsEMzFf7ZdPC2TsHcgbJtUqE3UOI4FW24amh/
-PAP1EqpS00uBKJ7LUGxNiuyk2UFkA5wsY2l4pDaY7e4g6Y233dyNu+fUo+ZD+KJNGCaK99tLhQQZ
-Jd2NYrP6xO41hM4N06z43Y/Odeb028W0zPenDbhz1Pax+uv/vgxSVE6iNwgwqcggFzDxHGFU5cNN
-oSaaWWhXPry02n8Q6EDDNww5P3x0dukD7RLA3YSPAPMpSJLIP27C4M8+RXE4QQPfZ7bx+wTzyccd
-fXinOINJ6Ae4WIrcykRnGf9CdF/6YSxKxYnDqOioC05YvAoXpfLtYZkGLPY6FOo3+Kf3AbMP3z7m
-k5/7Xm0ehN8F2daAuU+3p1n4ee9lc86ovVDI196jdHJzEyJm43gYaqiHyVP0SRTk/5/r+38217f7
-36TuEXSm7PMN89spd89RZzaDb95m58sevhAaZmbz5bY6+md21PkeyP8I8B/8NxJ78PmjD/5QCPwR
-gt9WxzobevfBZ3+ogtVl6E0fz7nl5LzcbUfHfx7i8Kturdop5x7iD+S7Q/Du44MNtIYYgrfBIzvc
-6ByCFg51xEMa/N/9L/inriM84XA0GPI/EB4i7CeCAdQUwuML+nyRMPgQ8ftC4Rj4ECM/dEc6gmow
-IPIP+OMFfPgDX/33wUc81B4+v4mHKWTQ0gU8MfCr2IM75gkGAcWHDfsV4YkG/f5o6GEN2kD4/cGw
-78EdgnzD4CvRL9e6X+mu23yeUISIxML2B+/b+bjczh9smUx6AmTf2p1H8FVO36sZcgjAgCBBucGy
-YG6M5rP2cbRcgwGZn0b/mT2Mtlv429kePHmYH2en8+44ezgtdv+F34Cf0K+Doa0XdP8XS29EIg==
- ]]>
-</i:pgf>
-</svg>
diff --git a/docs/theme/mkdocs/img/tutorial/caret-left-icon.svg b/docs/theme/mkdocs/img/tutorial/caret-left-icon.svg
deleted file mode 100644
index dd2399d1f2..0000000000
--- a/docs/theme/mkdocs/img/tutorial/caret-left-icon.svg
+++ /dev/null
@@ -1,1898 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
- <!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
- <!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
- <!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
- <!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
- <!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
- <!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
- <!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
- <!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
-]>
-<svg version="1.1" id="Layer_1" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="4px" height="9px"
- viewBox="0 0 4 9" style="enable-background:new 0 0 4 9;" xml:space="preserve">
-<switch>
- <foreignObject requiredExtensions="&ns_ai;" x="0" y="0" width="1" height="1">
- <i:pgfRef xlink:href="#adobe_illustrator_pgf">
- </i:pgfRef>
- </foreignObject>
- <g i:extraneous="self">
- <polygon style="fill:#005976;" points="4,8.7 4,0.1 0,4.4 "/>
- </g>
-</switch>
-<i:pgf id="adobe_illustrator_pgf">
- <![CDATA[
- eJzsveuOJbmRJvgE/g5nfzQgDaZCTtLppGsHC8SJi0YzUregUl8WjUEhOytayum8FLKypNU+/dr3
-mRlJP+dEVuSlJGG7gsiMOHbodHdejHb5zPh3/8dvvvzi+us3//bwRbqaD9Pf/d3N24dn7968/fmB
-1MMvX7787tt3b0H6yW9/egjr1SyVrn9Zv7KK//Tw9tsXb17/nF/xy3tc/ZPrb//w8Pbwi6vD8eV3
-r/7t4e3vf3r4yU/l29+9ePfyQb7/x9fv8NfXXyw/9btKM7fP3smX+Wch/SwshxB+PofD9a9R4dnr
-Pz779tsX/+8D7pRqEtrxzXevv37x+vfHN//Pzw/z4YswH5YDnuC/v/jtw7f7b6/mGJc1HL7YrpYl
-LOGQrrYthu3wxXxVlxhrlutu3zz/7tXD63e/efvm+cO33968efnm7bc/P9z8+dnrw6+f/V6+eXb4
-vx9evnzzJ3mrZ8//Y5KOyF/dv3j5IO/86tm7Q4jogetfhvjV8bsXL7/+e776zw9rjSCnr9jkP34r
-bUmz+Bvk8tUvXwnly4d37+R55YZ4h9/+4jg+Bl4Q5Sf/+tuH37/giEh3/a+fWrNv33zz6tnb//iW
-bzqXFBe86brFVA8LKDXgTUlIes3vHl5981K6m/0Tr/Lhiyz/+R9WR16N33+RZnZYPHyxzOEqbHKD
-NFe2fEib9OFcVr2md+LDH188/Onnh79/8/pBe+r67bsvdQSXZZ71f/3mt9+9fHj7j69fvJM3YDub
-dtWv33z98FLqt+vvXz5jD7GE/r9W+N2zt79/eCeD/+bld+84K6vfQYbiV8/+/IDxDHqDf/jm4fXv
-3vwTn/GL7SAdVWVqyfts23YIlW2vOcvr5Xa/0P/XZtEImvC2iwzdb2Qw/+Hti9+/eP3zL9JW0XlZ
-x/kXb1983Ye5RLkp/+MrXNXh3+b/9Fnltd+9e3htzy7T6+bXw3SZr379pdz37vXXN29eoe+/xeqQ
-efJaptDLN7/X79rf/EYu/+4bfQd+/kqG6TdvX7xGm9Pf85v61W9efidf/eLtm++++eXrf38z/USZ
-wj89PJeVLyP59eEf/u1/ywdZ25zCh9+9ffZcGpDPrc7Vsxff/PS9zcnLvX046JdyJT/67++/+vbh
-32Xx9cuVevf6jw8v33wzNNsoz15/ffjnZ2+/+f6mf/Py2etnwsRAby3/6sUf5Ztn0lO97U57QqMy
-T76RzuElrHJyg/dUGL56wo2evfuD8KmH119/29rWj/sHV9r3t/flc8zBt4fj2+++/cPhd2/evGzN
-7r9qrRuZVNT/27jHb3jB6394rR10fiercHon4T5/c3eR2o/fQb78W2795tnLly9+//bZN3948fzS
-DS583+6k333IxPrzq3978/LFt6/6fBoov3n29t2L5y8fvvzzt+8eXj15cA93X78QJvfIMn5vnS//
-9Ozd8z/86sW/vX329sXDe1cfBuDfX7z+Wub+l9+9ePfQO+jNq28g5By+/MOzbx74Gu/+cM+aX7YG
-81fC+kfm/sUX7+H6YT0cXw/f/+Lts69fyIYiAtsv3rz8+uH14bdg79Puk2xf5XD8evrXabYSWJbD
-3311fDv9t2k+/QknJQ4lWVmsZP7zsuLfJL/GUlqp87Yr10M5SrmxcjuUu/l+mu+97B5s/IlDSUNZ
-diVrmfirhFVK4e86lG1XrsOxlZtWjuFWin+6neTDHUm34X4sY9fx4fwnDWUZSo4ryqS/YhlKjZsU
-/f96KEct0/91aSwfG820G89lGNU+tlKmNrzLMMg6quPoVin4jVGtu/HdhhGW/ycbah/sYxtm/Y1R
-vhtHW/7Xn/niWMdpN9BJxhW/MbIY45WlcpTLyQhfW9mPrYwlft2x3J6Mot80cQz7mKHoIPmQbTZY
-MkCTjRHG6sbKLcudlXsUX1l4mXEsA0dpsY6v7NAjF8k9+yby5Ve+3sZXueUTB3vClVNGHmHifXGf
-mFJa0pqKqBtbOkq5Tfcy2mFJy7LkpSx12Zbr5bjcLnfLvXRkzCkvec0lb/k6H/NNvsv3kzxQkFm6
-rHld17pu6/V6XG/W2/Ve5kKQblhKLiKzl60cy025LfcyT0KNdam5rrXUrV7XY72td/Ve5kuctrQt
-m7SzVZHyj9vNdrfdy6QJ1+l6uc7X63W93q6vr49Sbq5vr+84k6K8wHLMx3Ksx02+Oh5vjnfHe5ld
-YWJvp5vlJt/IA9xsN9c3x5ubm9ube5lsgaOw3Obb9VYe7rbebrfH25vbu9v7u1nGJd0td+tduat3
-253c6+7m7na6u7u7x4y4lw67z/fypvfy7PfXUuSW93Ll/cmPjOUso9k+3w3ldig3QznuyvVQNi+T
-/FeHUoay7koeyjKUNBSZgNN9bGVkYZ35zuOj340/t7tyo2Xir+NQroey7UodShnKOpQ83eVWll1J
-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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- QBGNYQvZrnQqGYhoX+isxOfHms0BOsEKLz6eP+gg8UpZcYlzWPbIFfKNjO1VWrDbyGycZZ+QUfV9
-NJTeQ3GWMRLGyulHhUw+yAU1sF7Bqp6tJ+atb5wcfYxjmIG+Aph4hlJQOABlkXUdZHtG2By4cJ2D
-LR/5sKzygKK9JjB/2aSku4Tjb7Pe/3SGnmzT0B04SQNuU0y66VSIh/LWKzhYUV5A1h2EXSMHS6f4
-BFnA4Yd6UV5/DUNTjWB31AsbVToiCT8YmhIpdJVlM9zSKHple7RWrz19a+v0Lb0XRDPV3sGMnnNU
-KR1jWzOYiFNFDxbBewZFxn/LO0pRLUvHo1Gxsmo+DG3JeggYkX5Po+iV6SoKKx/ryS4L+NXQVqPs
-7tmo7dlaW+35T9+z9YCsEvaNKLLUTF/tiEDUZ6ywpL28VFXCg+gGCbPQCc6MkHWm11qrDmtrpxHs
-bs9tuikxyRSBmNvaifZC7W5G0PXtz9Rq+VN7O6fv9ri09inmJuiIs5BH+xLYGxQtNy9BHciAWLp5
-KSwigYmWtTMvQSiVvW9r5iVVGIQLuHkJIuo8L8vOvIS2Nghsbl4Cr+Td3LwUaL4QPjGal8gtwfPc
-vCRvfgXzdTMvgRDj3roU4qJSnFmXwF1lew/NukTWJ0rHzrpEvinCY7MuYcOQTluadanV6NYlsMxl
-qf2pQxRRaKtrMy+FKHN/2xmXQCpVOLQbl5ok4OYlrLCa6rYzL4Hx5iR8upmXZBFtEVY0sy5hUcnu
-sTMuydLLM3rObEuy/GXeRjctyce00CjYTUvgBwkHpJhlSZpIad3csCR8Wwaq7OxKImYzM56blTZK
-yKVZlWRnwJwdbUrkfVsJzaaEroMQ6SYlufcVXAA7k1KQu3JJuUkpyHTNACK79iXclrN2NCkFKK+l
-W5Swfc51XZpFKdSos3i0KGGnoljrFiW5r2zK8shuUjpbWCd7F+NtwrIzKTWiW4MwHWoWGdjMRSEy
-9WAeTUrYrSKEO68TYLSEuc0bccJo5OlEMwW1ZtxY1O41mpTaA/Va/h7ezumLjbxa5KFlZ1LqRDMF
-gS+mLTdbkcicCJvadhYlcFSE+wy1Zr1pb8YJg42nE80S1NsxW1G/22BRao/UKvkzt2ZO3uxv3aD0
-8dq9LPBYyYXMOPdqpMpSpoGuuRFk4waoVAhBpwvYUM5mOYZKsURq5mmb4T2QjhZJEZflZOZJbsVS
-Q7YNdxCY/R/GnSyMpJnxRcXgWhR2Ik8dQyOoBR4CeumVYFkvIsLXan4FJ2ybtt/s7yBiNcwrHlI2
-M+E4G1UECiMwxsZ1IOjLVdE2uIS9Wuu7YCbq8948MQ6UWe2b2ARECFI7VKcKUxQZflErLj0HMZpz
-AHxxzaFTtOfghEjrWC+qp2Boyyl+TzdbG7WYS661Bd2Jo9fu6RS90p+t1etv5W2dvecPIuo0Iz/k
-3HXdlr0vDSoKOXdzpqGeaPOle9Mgm+a8ul/M3GmyU4sIiCvdnybavezD9LDZSsC2IvJ93nvUKOMl
-3qG40Lnq3G0+NWgOIhb5mjGnGlTctWASuVcN3I3P1txq2JO6hcv9ati6AqZ086yJvCCDn3J3rcEK
-IJPdh9A8Z9DGRBws3bkm60BuzjXodWBBWUy4byuzvYN72Kgyya1GF1tS187Ox0bJMy+xOdng2lrk
-zs3LFih6LHsvG5VrqCHNywbRU3ajOLjZFnSISQHdzyb7mL6RO9oC9lEZreZqo7khB3fQma8NL64+
-FXe2QT3fIua3u9vQgfPi7M/9bVRvNryjO9zinCBebt3jJkxUJB/bkJrLLdJFUkP3ufFKvG9zusGy
-2maPO93QXC1x7V432CmppDS/m2xtIqiZgac53mKERig7ZPO8RXDGQKea87Uw69zc+d5gEqKY6c43
-KJeL9PfhfGE+4n7D91xWr/bUKhtz3LoDDoYMvkxzizXKzgk31DMH29BWo9g9d444MIKa6fy1tqDI
-0sDb7tkoO1/cUK89f2vr9D3P3HFRuipLp+39cTDAcO4151cMstGW0F1kTtg55Hot23+GhhrFbrhz
-yWGEM4Tk3hTUkhCHGxph55PrtdqTt4ZO3/D/t0JUSEHNlSHBKGjTGbsh9Tp8LdohdtYZRjqo39Kn
-0GRpbyZFuB8prmiqg21FvA4lEWHoC2wuwil0Lsqt1ODnFNWYknr0ej243CjGg6PkDQzReFbIYL1+
-pWg1dqVsSLynXDknmG1gJMV+dPaaJxpQgj4FG1me+3Y8UINuNmgHFmlYYbdA5g4fA8yUTlHNRBZP
-mtehnnCeCjWvN9Upc2c0nSqvoNt3a2sRdhDDMtzTKc9tJPlovZo/fWvq7C0fl20+h58X/hvOgZ2j
-F3ZcHV/39MKMP8OD01y9QQQh2Ar2vl5ainmlu3HBNHSWNUrKw5xq1MXnlLt7Y3bO6O7eRtm5e3s9
-9+NGroA0UlLpk6pTMZR5dPBiF5uzjdG+hx7x+UaIwsjp/2pPhQ8grt3r23ZMd8Y2ws7z26u5V7c3
-1Sl2y533lxsrFfjWFuRjWtb8lk7YOYCHau3pW1Onb/kD+IDBr4Qv1L2W2KiuJTZroGuJmBY0qoxa
-IriHiPqxaYlQqEIVJuhaIiwOtBeOWmKz47mW2MxxrgDCDF3WWHZaInS/eVAlYSJbZDK7kuifRx3R
-aU1FhJl6hX+v6X70+KVt3euIsGKVBc/W6rWecx3xvC9P7UirWix2OmKnul5HswxmVdP98Meactnr
-iLT6pCUO9UJVm19vq1FGfW2gml7X23Ldr99z1BH7s/V67a1aW6fvedmh/Cmm8CUbLAWGZzh9X+2p
-xZSeZXEn4aoaBFbVDJmlUdweTgvnUA87Olxzva1GsXs68zDqZlaE1pZsRMLF1uGeTnFjurkqW732
-/K2t0/f8QbzLEeuU7lnZCCjeU2oXtWErhBhFFRxioiW70MyfkCoJXLwUGv4B3dgc1yGTg74oGNRj
-ULapIod0sGhJkWCFLUZ9WdrmHOQQ4XzEZqy2GMIesOCgcmEqQDLVLofG2GxNwKlsURE48rKJuv6a
-il5ZtnWhd5WGXvSrdJbNaaj4CW8l+77q3fB0VVLgiIYOvxW1G0KIEv3QtDtR4WTTCHR+K4B2pvzH
-zU8BuCKmw9wOKSy4ghHAVmGvFqWbL4Cdp9LluGIRVcV9rhtU2DKrfqxaszRrGmyAwhczTyaHZ4sW
-cNjTROpMNDqk5Jpvpu1/4WNVHclFMQIUClWHPJ0DJ5pdXBU/giuWshi8uVPdbIBZQ0Ov9EkBsJ7a
-qbrijaJzJCkeZ6gnm2KoeWyrUeyeemWjJoO/9raibpXDPWPfPIdna/Xa87e2Tt/zB5ECY3ZAwFy6
-FNio8KpTGV6CweN8CWKYSMhXczQXByZUXWFnhS1lURy9yoSzXwd1kf5AUdqaNAZhs1D7gCio5gbX
-PqCGuG4cXTnoEiB8L5iovV7ZHCq46R04KxW6sI0SYDmhghNqX8isVHm1UWTZNAmwU0tyGZO+M/id
-kVsmctorDrGOInIxGAqMffqwqz+s/KG3rLO9plOcN5QdVe2F2CFgLwy0wHlb26A9gfvwYSG+62tu
-NiiAXOigzB4DIGwj+T05v+elqj1IrlK+qyJ+tPULNppipomQBk2/UtlIEc0cFrQ5Wnes2a0r2bXB
-2PVS2qwWCATw8NLEHlxrBDulQQDKrs6D8WEXQwNSh6Q1rs3saFP0fK6fsBZMSQDZ8DI0nb3aU2Vr
-qYuaPNal6lgtsDlic9Cud4ouB+noAt7Z6xX1pQ5tNUoazHWdmnHUVTgMbcEqBIx8v6dR9Mr2bK1e
-e/7W1ul7NoebTFt6tzDfuVW92lM3NWMCrEK3GOwHmZ6MFWhI4l2MokiHoNidoZ6s15h3bTWK3dOv
-NGoxC1drC/5SmDr7PZ2iV/qz9Xrt+Vtbp+/ZekAGZsvYckX5Iyzx1Y6KrbnQXD+7vQQjyb2wEgHR
-CL7iZ7r/e7UFyebS0FSj+C31ykaF+EOfobcFKEUJ/Y72WRmFP5dX6i/k7Zy9or887K2VqC+gupM5
-XAfqAulXoXoiTKqjgZI1zKKxptIpyntg0oCJ3KkEdfGxvK2BYvfUKxs1mmDX24IfAK6Hfk+jPLen
-tWdr9drzW1vn79l6IMG9GxXPJIqL+c8aFfY1COHghDNmniw3imoA/6Z5C53y3MQSuviHeoBBwDvY
-mmoUv6WLCEY1q0VvS1gn0JT9lkZQF4E9mFfqL+TtnL3iD6DPNwwzdgp6vHagbmxVK3OJOqobW9Ca
-4ShyWDdMEqm6/d2B3RD01avgyG7gsDPsbA3aHUUUyFsNbQgAFYKkCdnIsd3oKHVoOrgbNVN2H42B
-u2kGWdalo7sp5AB20uDd4KdpO4F3480IWGr4btjF7EannXO6DxkQGn9Q/9pBvKHDJFVdDFLNnRrY
-0oa8bpTn3u3g90M9w3APbTnF7+lqkFGr9mJrSu5EH2i/pVNcEtRH6/XaS3lTp295WT3/HHhver2i
-oz07VVEaDVyNOSWTZ+sY7EZRc4VBtYd6hubuTTWC3VEvbFTZxVfCaltTxezA/ZZlMBf3R2v12tO3
-tk7fsnEzmG7h7IPaLpzCsBeNKgJUngMiAkXIKmrpC+ZDnGcP/wi2scJmW5Z1Heql2YCaraVG8Ts6
-U1IqTGxAefW2MKGWbbynU1Ss0ydrtdqzt5bO3vEHMU00WDHWEKHUI/SdshhNho59x0LJiV4uA79D
-x+khkI5+pycPLKDB3yHnbCXGjn9vFBVvFADfqzm2HcK22cCdsoVR3zEqeSnk4QaCp9Co6oih4MFC
-m2zdYPBwlqsK4fB29D4lyE5ZYWDwKxtVpJk50qdhMHjge+imbzD4RlHxx2DwvZ7D22MxpEGnuNnB
-BSejhiuCgh0FH+nmAUTAUfBA5qztYR0FDzeE2skcBQ/3Qipr7ih46BJd+XAUPNzshE80FDx1jhRT
-x8Gj9aZ8NBw8UAe0tzgMHiNAvtpw8NhIkDjHBCQDwkMRX+sAhMdGxWc4n7IndmBHiWMQA4IpXu2p
-ooLh6OKGOOc7bwMW3gk+SYhf77UM4j401Ch2Q72wUV2xa00BOBVH9H2j6JX+YL1ee/jW1ulLNknf
-IeKAeS3BAx0dvt6oDeKO2U9nyUDJQ8hHp8JwBcdfbwuCNmE/7Z5G0SsNvj7UM4j70Faj7O7ZqO3Z
-Wlvt+U/fs/WAw8Uxd8ri1utOFRZGIIwDz0WAvZoJr3Z8eqM4ayKMvddzpHtvq1Psns+nARFP3YSG
-lN7WbG/W72kUXe3t2Vq99vze1tl7Pi7xfg5c/A4s5sD4hhVryPiGFWvQ+B1WrGHjG1asgeMbVqz5
-w3ZYsQaPb1ixho9vWLEGkN9hxRpCvmHFGkS+YcUcI7+DijWQfIOKNZh8g4o1/9oOKtZg8A0q1pDy
-DSrW64xQseaea6/Q4PINK9bw8gNSrAHmG1KsI+YdK9Yg8yNWrEHmG1bMIfMNKtYw8w==
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 4Uk+bgIPI1fmzEXwFMjCeqTwZm5Hlu33RnsmNAdgbO1xqoLbMQfBWcQ/SQJQjMzMt3J5zLRHZEsS
-Q4JVlVBrNkl3eCM0wHYXkEIOymKAJxpe9qT4HecovnZ9bgEAnE69UX0nDhCCGSEndjhODSrH1GT/
-izMtqiwdVgrCvWCHeD5d+aGgfTc9rBwaTVhVNTamiwEQTWRdKH6BLYUJe/DRd+TlOl5T12OGCp+m
-b5A8KUz/WZGjJQGXkglRQwErHXXmyqf065MhOTaUTRZP7ZoHeJAUxUJjzl8oMTl2hym+eqMRf/x+
-CGM6J4Vh6KW4za+2ThX6rPDghpbHtPTq8Dz5R9gzlFWMIzK9lR+3emaPy+Wwc3N1B71nVk+1XSfT
-pdfUA2cmbbhQKfMWOgzanOyhRU4Lyttyv7czBpkFYFrY7UwfGoCtcEFBLWt2zAvhI1XUK64EMVco
-OOuUHzve75Dt0xXYpqad5zbo/Y4IxiY3LHjv+TilmaxrooWNKpArV81Ncj1QYt/hvZh0ydyQgpz/
-qk4Lj0Ko28LyQatlsaNAiciMcf2SrGtimnT5aQ7VEQ1FnuJpcmnNIqqalefgQ4eh+fGqFA47zp72
-juw5R2tygkQajAcYb/2iGu481i/pIos5gnD5dJHFIZ0ZkXoMaByRMZaEcoaquEfGrpTrimmN4C4Z
-WBwEQ+5nRwEUEWjWu77ciBAWLgkQoOn2e/YMyaW15pTqUS4NtTdCrEongZGE0rPpXuE/xWq7qyI1
-MW2W3WkI0ZKJmhIloq0aWChhiB1VII8OSMxdZXd9TaThs1FF8RCEwN3OFZTQmcPKYRSieoZ0xuOH
-y6yOomO1hnICRobnMEfig4BhOIjGSCKPREccBf37RS9P3P/q9VGO8lmokhFbpGaGNwyluI9hohCF
-KBrLIT9pcHSAf6l8A5kkxXjCokwSRZLXZsjq9KS8g/Lo8Hayq4u3n5TJvMaMjvQFwpc41BxDb6Km
-6mbIRGLzgLhMlFRwHb7i6wUDTR/hsDgAfX2ohV5d4djYUxFt1NdzMoWFUA20FVxZx9I7C8sz4zfh
-R7K+Cute/MBSkgsON30n5F/F5xhdqSfeWZYTTOnCP1xi5SHVSh3gCsgNMxbfrC6BXzEimIGChShU
-Y4oY4nSdWVVBAi0MNdH9iJmuFtFpYWVilJvxZlSlAHhsDVBVgRLt2NxAGWMZ4XyQHzL9AeoG8mTb
-MIdCTdpxW7MDFzWKdMDbgaI113QE8rt0CaoleX97uxKrtEkORr0tqEqO5e+2rqZsR2Z/QgoNliq5
-9yvL1FppkY6u6iALvYZkc5119Z3jtaoMO7VTVTcoNKHMfhY/En36bAljB/DRfmM0PcpdnMRvYg49
-EUaYYVm1yeXMlOLAQu0nvNc94qFQg75tDznCUJibGUsGJODuZGaGnQf4yS8Bm8hoNk2SUj7g5TAj
-ys8Ln2BIEvZiC9ZZreJQNaJiZ0kWutpY+owckrFNJIVbN308ZpVhWUsyCE7pMHDEr8qIx0VKObSs
-1GRGAw8Gha/Zn4jqaxH1jQUM1YX0YJAJoFYM8s9kL3+hGzwGRc7seCvomWjAW9GdaXgkKMlJeBDw
-qUxCxKpLCFC3u1XcgAzWphdWGVrpBYrUhcw7SDCQx95RaiL4cxJrTi3V6c/xKouro7hNNA2nh4t4
-jSY7ul1qFobLZrEdxY9UitFtiLFnW5NVNdQNlepT45OkXlau+xb5Z8p157DUlBOO0+EMsXLMZfUd
-dYH10BRo5XOCMg8rBdz/hQgRLFJ8ISJG0Vy+agqp82TxO3m5Sf/MUQVz8NQ6JCvnSWEsVsQxRYud
-gLAXL+rDKeOiD0HiSV0KZGS88LDscN+zLiuVMlK6FhEKjiVPhWm157Z2V1pDdZOGtAt6F794+t9z
-NcHKC8GKpt5rFlCyS00TBVpoBvDwGtXo2elF6LWpUMA2KZae2Q1s2QIBoi/UWai2ILUotel2J5In
-CC7NiQh2u2PVt1LUri5y0CwwGcNVYLppH8jIkHx+9hvqQbCPL8uj3nI7NMxfVHooaYGN8Cw1fexd
-s1zIulSSwJggrxH5EWbbqel/VEOqHs9DUWBEQCnmU6fmqGGrLkDm+WdVnBDUo6Z4pRiqgpRwNH3W
-ns1JvOwsdGmRwNtAk8auzbzCEcJS/CIrs/A73EZitXOe00oUfMnPhv8/9u4gsklT4UJyLFCjqtrN
-2i3AAEF+10tVklkqj6eCE7QCK2S7N/En2caBUUmwmsapWVCiLCWTA1BZ0p2JpU/OWCqTAIEQ0Z6h
-iYG1DkVYFdJOj+KG3IZvOQRg6ZT3yTdFOpGRVvwA4zCwEJ9Sk+liWEnshC2QNsUpYaV6Ue6U4vZX
-9+o2JWocb0ypG39GQJo6bEjeVXNJJLo1iZPVjvqe5aP01XPE9fo0ZR4Wijlg4dnmpkhx7CmMPZYm
-kblXoD634JlMkVfYBSWF6AORPT3jEYSW7MwritIIyGma3vixIlmgeGnV94DvaUTpOQN7SE4p5P/4
-c4fQfscSUd2p5GWSPAFaEdJ22IDP4hHWQ5a7igTiCspdiFTNqu1Un/qA43JPvsOFUaKImiNX0VVD
-7erlok7HidjdR1XJbCiTYjj/yc9SpU/4iMQ+iN5I1SFgigwY5q75LM8VT2V+NCvnIv2Dc1JM0Uqo
-0ZU5rvuDhpXdAAjjqvoFlQnVCEQPc1BoOe9PcngaQGDSD05NedYaTkW7eMzFeQVeJ2v7cBvqozAb
-G2IwQYrS/+RacQ37qOetN3/nUVEV8QqQzDDgW71q5CbU8FJOGm1mGJce0rBRm87js+YLkAJqSFB1
-3ooNuyuIC1dgTanqIulo8Zsdrmn+cGIqbwQVc3qY2Wl5VjwW8Y/0YfZgN0A0ypezo4huDyPdq0vU
-LSU+/W4RDyuZqu6T8lvYcwUFd/OsYFWFV1AkuhOMtDCK0oeiKNoTjaYYv3zcFaC6AyH7h1BDUoNU
-gqImrAT0MKOFRXM9E7fjnIegskuV+Yn3ceUjkN/kOgnW2f0lM9CBc2U1Hb9tszxaRPlgpUdDKwvZ
-S3V8F42N9ItWCg7JSH/xLKvlLCEaj2cjvXbTqh7EwzjgVeNHuCdiUaqOHJYXJVWW8L6pq1qoUarj
-YbGj+pVEJacESk0W1yqjUyDzeENfvfYcBmNALI0XFjJWDlN4PR57PU+86hTtyl8qfxRllmmxLdVj
-B6CWKL/u1u4jOx1xIXbeYEQfViIQEDO1Qcm+5I7BnNeefZFdeHxOk7w2HGqqvJDZHco5UrIlSk1y
-siwMRUkjFc8n1UXwJHPlKOaLRGL4hOIOsf5rqW670D1iGZcmXAnrsX7aMxemYfBcVRHahifmZ7gi
-tNaYqk32aFf1rZogcGEyNVXrxcdKguypJyRhWlvsq5Tjho4UKRfPYUswDiWzyBkoGmCn6xME3MDd
-JKPcpzg4VkPNJIxoU/UUM+t7lmWdURY5RElUyLma+zsxA896adYOwzHdfhrCvNOzMdXpdOe7yuDp
-rtBA2R4sW/8Vug6Wxz2q0lY6PAdk7cvC4LsuOyTX9Bp/qG6TSVi+YZCn8SSCjYfsnKFxT6iUq8gc
-mjAe+4oIWT6WDgu8yt5YRRXvmhZh2VwJoEroCsEa2BO118GxlvFvzkrWswLDL0hggRhWleZYpb5o
-Fz2c0RU9DS0SQyTEtG03npAeHZqeccRFT70ufkVkKVN4OAgcK43ujdaIe+MaZwasKL9cj9YXkfKU
-078ez0/Yju84opClak/hKWDZzgaaUnK6XgFFR/pUQUdvRwuHIRw9RCW8A1whTa9rca3KI04jhxI7
-xBm6dCBExECXdm3HVtAs81mWImwLomNnzx7la4/Zh1MughKzWTleLd/DIt9xKm1wtmN4vynN0ur9
-93Okd9vKq+XEBpk3FVoQXdKvm0GXWfnKewe7m9bisqPuzRJEPTSQOrBe7nExGAjR7u7tJOJayRQD
-/OTwnjuoT0TbcAWiCFfJKDXEj4kygQSUJQHLSSO+rSQyKxIpIlMwkVeWAJSvMUcrstJj+l5BBpts
-rOq3ndHdpTF/BXh6Lnnov/j3nJBfCmnyZjKdCosxXFIVYccDMQt/Z00RgHAd4vCxDW7WTVIyi80K
-QquDMH5TYGzXM7IKjiVKiay2ZD3McpJQP5ksnl/2F7gn9TWLin8a5H8u1//HjkrbI9MwlsoFqdpg
-M2MXW7Fmicdu/SRb2R8FUSEXxFbhbRBCIkVEjNM5rHY0EpjirMZ63uEV2PIqkGVzLE1iHSfLhPpW
-0+vMEO1nW5clGQI5GdysPBrfqIjO0aQp9uQsDyt10rQQC4lOTLvENI4148amFdno+pi8s5yPYyEz
-fb8YP7ZFl5kU02G5NrfDZ/oocCg/ae7mPrZo+BiGqe7tMMMwwA9PlM44tf9dGf5d6cUaAYZbofp9
-BCd8lHEbhKxwPxXAj1uKP08VvNY0GPyYnCazyNIP1YZzm1hYAQXEYGhxVZFW/qzfdvH/seS7WOVY
-k4Ss1OI7H85Loo697dKvNrc6iHAZJqXJaer5wELlFzWXVTJqm9ZRXZlUUA1CwSpN1NWqHh7G9yzH
-e3vaexIqQWv8gsiv2SQibqP2UEVdyGJuVvw+FSPpgAxieT48Kc7qlLg11V7tgoxkJCpBnBhDmsHx
-mc0Ph/AnQpEisBMyHy4bee24j3TkAb5SObhXi8RrFKoDhtSL2vNRn8jzBNpjbsPwF92siaVEIQY8
-rvTiAjT0M0s4XJPJeoDPftZP39GJ+28c7b+Vox0VBi+MNqJkaSiJzQgjYtqMxhiijWg2Ix43Q7ss
-Z16DoQ0q/Ooq32IxBdxd0uVvgjbKM1n2ZIB2dJ7a/Gws19h/58Zn56WE6aZnkxnDmT/q0JfHmJud
-zd2SKlUYl8PBh/0K4kfyUrHazc2uT6A1jc1GZIjZgqBmN+vnXtDs6Euzmdkk2jvDSY1NtR7tRcw+
-RgOzq5tmbl420ISESdy4bKCNahEbm1NxLVqxbVh2tXLgxcpmsjGrOpkDRQ1FVZCyW8y3FygbMljx
-nB3kDoDgxmSzRKCK8BsF+W24Gjsg2SiW5ogajGxKGUp5I7KbC4g2IRu91bKF+ej8VVS3ePOx2X7N
-DG0KmXGQPA8cu1m+92JjEwDXykFjI/6klnomY2P1N3yCGxPLXHDph4vNojPl5phA7DMUYxcUG/1u
-iuVhnFlBp32Gqn0YV8MUTd72TcTmRN6FySYQm/WARo8TXxdlgy8cdlS9bR42IcPfNgybfy49mw1s
-RlWZEsBGYYusLDoESdijioZyc7CHwyQbg/2xomHya1Owl3v7vSDYWC2wI2IwsJeaBgYBeyUtEV8A
-bApqtA/dKxyZr13Qr5f7Cb/g17M7KxvsawAiOvHcRl+PJebWi3y9pnoab/A1q85KVg0BA7xsKCES
-4s0UZ5uJKhGxOOlImApfbfA1LMpu3ODrRBc6haiUnS6iS0yAr2mRoHTebLfuZXCArw==
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
-dvdNtUpgvHc+/GHtyTH8oiL6affVw+12x6JZuy1fK3fWbr9+vPOk12zB1612Y9judev996f9cLdy
-/a+jTtf+VLXN6rf3T4atwY3KrbXb6/1+faxE47DdafZbXfhdV24/6g79b/DP8P1xC367bjWRazcq
-t1922w0L3rV4u29Gi76rd06o7J/t5vDw9MLd+hGWtU1xpW8tco8OW+03h8PSXeLiF96n9Ud7653j
-w/qeKtuzdtOWPKM7UObCu9Lb/6PVGG70TrpN27aN3l9le3SAU8cWHQ5KD9hInQvvank+fF+6R+8X
-uh9nDGbQj7/48/TmLoqYHJ709086rW6jVZYUVLUkNfg9Fz2wdotXtj/79UFru9/674klQnl2Hat1
-4T3s9naH7WHjjFXL93KApV+0O63yQmakzoX3UJftWvfk6GljWH83R8/CKhfeMZhyZfvWbw1OOuXX
-cS5eRgLNaLo6penTF95gJWu9KClOfJtPIf8Cj0u7ewZ7htoIlL1wLmt3y/ald9zq14e9fukO+QoX
-3qvd3km/0XrYrx8fthvlB2uOsbrEybPZOzruDdrDOebOp2gHqpZlm3B7q3VQubvaAg==
- ]]>
- <![CDATA[
- Ll6Plm4LmKy2gKst4OL248puAQ/6dasLd5702oMrtgksbVRa7QEXcw9YeklY7QFXe8DVHnC1B1zt
-AVd7wBFmUcmV2wPO0aMl2gNutN61OruH9WbvzyvgDKzqq7JBmqcnV3aLREsOmik+2YKzqKr1YNjc
-ar1r16FBc2wbwkoX3rn9zskZq9fyqtcP6yeDQbve3Tizj4uoYJdmu2Z5sdi8DLlYviPlpWLzrwWf
-K4su1HoHB4PW8OyZsbyz/yn2cPnmfQc0S4gubPQ6vf6dPw/P3OKEK9D7Tnlroyt9Cb6Z0v05bjVO
-OvX+g7+Oe91Wtzz3TVa8+F7O28nNXncwrJ+jk77ihXeydOzQ4KR/UG+0dhv1eRh0pNJK3n9AX4BX
-np6cwVsXIuwXRc7a7Zr9U5Ygf5emxd+XsfVU8/RlwbfRZo6ufPR99CdRRZ712t3hzjwGpk9jq2zt
-uhVjx+kYy6cdncu+sPI+XIb3Yc4lZ7WCXup26RzulEWRCaU17bflBcHby5AD5TsSl+9IfAkdKb1+
-vz3DOBR2JFnojpwxdmFH1OJLr8VfM+v99vDwqDUs79heprXzYjz3F27ZGj6rt88ycKyW0HIjsCir
-7/yW5GWJMHnc6r9pASWXTyWad6pd4SH5dO1YBR59HK1XrQKPliLwaLPX62z0W62/S/ujFjbq6DM6
-f1KdgxkX3TJcuiNXNr6q2e7Uy/uDl2nLU96e2yyvq1yGbLmCIXClO3LuLdtFr9C10kkT+vVm+6S8
-sOfil6ci9/rHh71O701pYb4425arK93Kn5VZcOl2ZWTapz9VtpJpK5kG+vdVCeTdn++0yQILsTlO
-Li64ECs9JMtmTF/W8N2rmyOg9OqyyhEwq4+XmyOgdLDusuUI2C/Nmgu/MJVfYhd9ZSqvjC7ZyrTM
-WRvWS1uCNw/r3W6rs9vqtBrz7LEnK1446z0vbSU+bycnKy7w/Fr8WJ4zotmCNXe+4yOXdW6kdH9W
-y9HijcmyLUdb7cFxp95oHbW6w8f14+Vbk47qFlVpB+xS7JUq/F9l4qsa+Vq21/itvDbOxS9+ms2X
-mnKRRV95Ib7ooq/0mCyb6NuEE9KPS4iPRRR7+6W34ws/VcpP+gWfKuXPbC9jqpfSDPcZnP49mCuO
-7aDd6cwT7tW5hOHttLuteukYbLs1ajzulY+jDSpcvMu582f9/RnKzwjzDuv9ubiXyi+uPXbYK6/x
-9i6hI+Wloe+TvP4JNr5k98ZqXfyQlWbDZvmcU1T2Ehwe3dICsN5onBydnB2cEw5VUOXid2Clx2kf
-bugr76Si0hfen34L9/ilh6vZbA/b7+YYLKmwuDrXQb93VH4RxsKXtDOpd9tHc0yVT3RGZbnT31Xz
-qxI201iFzSzaPq/8kCybSWQVNjNLMb6ssJnV/YqjvVy+uJny+QqXLXCmcWUCZ+ZYZBd9bVoFzizg
-+rQKnLkqgTNzyLyFD5wpvUdajsCZxpUJnLlCy9EqcGZR16TPIHBGfS6BM40rEzgzhxBfdNG3CpxZ
-RLHXuDKBM3NM+gWfKlc6cKY8wy2bHPjILqLlCf+ZQ4bMO/MuaSiXOFnhHJGQq8FY3vweyzMWn64d
-l9uGK5Mycv3R3hamCtqbz2JUSglcnlXs6qZLupL5r8tb0j6D9Dwr+VZKvqUr+baSb0si30rz6kq+
-reTbg74FfN7qWwtIsJJuSyLdVtrbSrrNKd0+a+VtJd2WSbqtdLeVdCst3UK30d58gQtXTMiV7vxH
-8XsulZdwNYnmmETZ5zyJSnd+NYlWkyg8jB9VTOlAQOr28zliAYMaF66OWfnwrP1Xq/OsU3+/N9/5
-0UUMdLrM67aWRw72W0e9s87sL1dOmna32Tpod8+8EjWMoDpu1YdbcyTPCGpcfNhbRd3VUUUZ+29U
-sX/v2u/28679oXLVQpQHx5BiqGyvVgmGPINeVoKhkmvesiflUeWzvayy8qyy8ixnVp5L2bbMnchm
-UVSp/XmuI1/wUwJX8D7Ji93xLzDvfeYHBpbDc7Pop8DPmu3L6WabS4QvuLxr9I6OewO7DX56csZk
-X17RsMl9XD65UNrA9ra8KHh7GZKgfEfOiGYJOxJfxk6hdEfO8MCFHUkWuiNnjF3YEbUsWuiir5z1
-fnt4eNQaltcGlmkFPc+qs0wr6ZVN4vgxl9LlcX+ca2hXpxDP0Y6V/3nlf57D/zxfkshFNKGt/M8r
-//NV9D+jBAIPtI7uziWNlsXnvLrUZuVzntrBlc955XNe+ZxXPufTBmCRHRYrn/PK57zyOZcyWSy3
-z7m0JavZPjg4GbQ2e12runXLj89EvYvfhZSeWSf9A7t27c6XjHyk0uK61GiezNe3kToX3rX3rU6n
-92fZ/nXabw6H9vdqA5LHlu7ieLUL76WbH1dlZb5KYRFzDs1ncC3xygS3bCY4EqJ33/Rbre5dOzlb
-d22P2296d9+1e53W8G6/1bzb69e7Z3ldVra5sX6tbHOfYMTKL+FLb6BbXdW8MtCtDHQrA10gEvLS
-/rH63+2jk+EZd1qGg8LlL5zd0tJ9anXsw1xGraDGpVl/ttpo1tiBpeuSY2e2aLuy41bRJZwA5S01
-x62GXRD6D/46tkvPHNaoyYqX4Jqbt5dz29wmK16CfnOVrW5213TV7VJXyZDD82ExjrcsirhdGXOW
-zZjjTDdkzHGWHbTprIw5vZUxZ4ZcWhlzVsaclTFnZcxZGXNWxpxlMeZcxlr1yTzwK8vUrtt/La9p
-6koeL76aiTnOsdlf2S8uPYpyidNzlM+hsODpOcp3ZJWeY8GiOxc9Pce8UY4Lv3Ze7dQcV/IOmU57
-+KzePsuNtlpCF/kUwqIvoasMV4u2hF6ZDFfn2tesltHLXEbnXXGWZQVdZba6Upmt5h7WVVarc7Tj
-cttwZbJarT/a2z2sN3t/ru4devl55H26gof9S6csWx32XywFYbkP+5e+DrRZ+jZaLHrhLFa+I2eI
-1LAjfy34XFl0odY7OBi0hjAz+q3mXOJ62aTAU+zpZ7VHOP/gXuHNwqIMzsWY65dnXFabuAXfxKkk
-ulaWT/9sN+cIjnOlL97wH5fv0WFrnpgsKX7hffJb7VWK5Q/Zal9wV6vKlGbF8nr+Zaj58/SkvKL/
-18r8cck7hXRl/ljOjc9ymz/yq2L+KN+RlfljCXbIyyYFVuaPlfljkeT6yvyxMn8slfkDNtbD+hxB
-T6tt9VJ7sA/69caw3nnSa5cPgafKJSnDb7ro2Mpa6Sw/+/VBa7vf+u9Jq9sor12P1bqEs/C7w/aw
-cYb5MdyvQukX7c4cOTVG6ly83bJ0fGz35Oip5eJ3c3QtrHLhPWvMZ7QsqQpchpBtfLrAvIUdk1X+
-pckFc5V/6e7l5l9aZSGSybkkWYiiWul7dYa98upW7xK6MocGtez5lFbplMoP1WWmU7rI9EOLu7U5
-6PeOyq/MWHhZsil9EkvSi5P+/knHSrGlNTWu8sAsweG7OfZ/S2IKPsfptJUZ9lTbx5WLQpujR0sU
-heZXjL0zjs2vTOa900zmF61ElWbGxY5DK9+PKxuFNiyptC2bAyNaeTB6y+3BKB0MtWwODJhyC2Au
-X+0BV3vAZd0DzjOFVrvAudqx2gWudoEX2KfRXWBppW21C1ztAle7wI9GgqsbyFY6o8RqG7iY28DS
-A7jaBq62gatt4GobuNoGrraB4abJXLlt4Bw9WqJt4E+9XvNNv15eUq32gJe/B6yqq7ILnKcnV3Yf
-ONe57QU/XXEl77oovRtaZdhYrB3RcmfYWCUYPa0jl5Fho1ciV8PyyOpVvpBllGkfLV/IRVu7O3ar
-QfeX39nv1Btv71YI1DuuN9rD93fmMBsPhu875c3grvTFx0zPc1f7oguLuTqzbHNqGxhx+abUh+TR
-WdlOL+U6XcwAuvnZCoaVGrEoIu9zuN/Q3ZO62evi5e3l9xbj9S7+zG5pTeikf1BvtHYb9XkUopFK
-F29Kn29Ozde3kToX3rU/D+dI19ABs7/9vVpChAY9HK924Z2c9/rhBV/ArtI2eM6h+Qzywqi4tCyt
-/90+OpnDFSnlL3yY09J5plod+zCXOTqoceH9QtH26TJNXZKqtdVGNWJnHqfwJ8oWsEXyYcctIUuo
-+5XmfL7h98Ffx71uaw7tb7Li4mpI3Na5VdzJiisdd6UIfsaa0zkuBF9pTyvtaeG0p5Xy9MmUp10n
-IpZXe1pFWS+Pp2D+9Wi1xK6s6h9waqvsmLwtLxDeXoY8KN+RM9IfhR2JF7ojZwROhB1JFnk7+/aM
-kmFH1CV0ZF7L98KvnfV+e3h41Jrj8oxlWkOvZDBypz18Vm+fZepZLaGL7Jhe9CW0fEdWS+iidWTB
-l9Bz7WtWy+hlLqPzrjirFfTqrKDLY6peXSq5wJrRJxchyzMkn64dy8cWVzUD0ioR7lgvly8D0tW9
-yu9cTqDF1ujKZj5aXp1umXM7HdUtqtLpOJZBvqtK5P6b9k0gZbuM38pLDy6+BNNs0QXHQ1t1cHZc
-2fLKDTxq9rjEBFxEwXEFV6ornUrkczg3t9wpRaql9yWLnlOkemWSilyIyeqC+/T0szlHu6zpOM4/
-QovvjrmaEYFz66qLLiTATwEM+OIK52Re4miG8wzPorOcKn8R8TIq4OGQlT5GuWxTark18CspxV8f
-tPrb7f4iWFEWZZyH9f3yY7wMNk9dKe0Rwb6/ms+oOVLn8hKBnXQbz5dPqFw5ZqtllajyebDbwxW7
-XT67qc9FuG1ccqAK7ocgq8KLfr07OCh/28XicP85TxWsjCaXYTQ5j3a6DBo3MeGC6Nwry8noAGE0
-3nqnswBDsygkOR/PrsJAz9GOy23Dea6wurb+SEV7D7pNucoKQAYge0963WcWBea5qRJ4o/Wm3Q1/
-WHtyjDgS+mn3/dF+r7N2fb3ZrGzX3/X6IETWosq6/fv6z7UT+19UeboW1dIis7vamkryJKOYnZpK
-oyxP7Jc0i0ye2y95nurMVF7X13yMz+v39uEH++UPC/qzoqLK48qvv0WVJrzh+Vo1qiVJqvOiolUt
-N4mpHK1VVVpTRZTYwjVlVFKp6qRmijivQGmtcvuOqjZQMa5Ui1qqcpVWNtc8TOlamkdZZWcNqmam
-sFV1VIuipMAv2hj4EteiPLXoVVaLUx0jJE4LVWlgG0zmYA6pqeU61QSxTUWIShLjIVAvqhW5ToJS
-RU0naQTv0zWtKlWLJsrh/SqvKZXE0HKhQlWpmn1tapue1AqVGl9sZy2vxYCQ8NgXRUUU+xepxPYr
-fHNjzYKKGN4pZYwdrVz7XtluJmmhw66rwn4DYjN97GeeZpknIQyHibWn8+aagHg4dhCUFDhCJlVG
-Y7XYpAiIEssxANAwNoVtDBAN8RRRDu+qxZFJEU9RK4okDUEx8FpsUcPg5llRiVUtzgrb98wSJU1z
-AHB7Yq01NFFAttVFHieExzIvkQxBQBaNgIKGwbKGMjB4tmgc21Gz9LHcqYoUQUlsRw==
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
-0si2H+jH+TWVJF9E0WDrj603t6J/3r/7n9rX9+/dOh7cH/yob69du3935x99LvTDcOPN9//auX8v
-ae1utr/5trFVq331ZuJVO82f7fuyre1rd7JfHg63/vhtI/mlemv9qLczsN0dHt78Nv3iZHsr+edP
-G390vvpp7drWQfTD/lRk/8yKg+zVv3799/qLzdqr2S8Ny9357f69t9u/3b8zqB3d3Lp17WT7+sPm
-wdo1JNb273tPT7YOfvsp2+jc77y+c7BxONw8zH5RI+T4/cuthtr57/173331E+GxTR5s/ufNf3r2
-25f/3XrUfPSPjWr+xz/Xd6tfdKkNr+vNk7VrxR/XbzYeNMy/rm8eJnt3761fi7+8ufHk1u83729+
-9XJ7s3Xy9bevfvji8G6jUX8L39o3HxzsHNKbVXS7nvXb//z9Tvs/PzQ3Ote++6rav/nvk/Wd3S//
-C+2/cf/uD4fx2rX07qvf7q93G18d3fzm8d3b2dG/v2ln2e3BQbzebzxSN9/eUYKxsfXD4JUlW/ZV
-K/spjpp32pu363Z81eNvrldvtTY62bMj6sHPO9fubz6698VPD24VZmDH5dGv6RffZpu9/9y896r5
-6x29/8VviPbb7jXboW/Tr7+AIfk1/Sn9Vxfo9O3G2xtp1bHmq+ZOpH774vHW7fq9L7f/cfOXPrwl
-hR/+g1iwyNq1aP9/HyX4/ea32/fct3s/PfiRim/eevA7IdM/60eWdV9HN7/99sEtvfXdm28cnp++
-uXe3+ceT/+BISoMtvqcbxr3FFtr4QRrwm2+Auv7NcyjUShBm/rGxtYek3moNvkvSX9I/Gusvtv64
-uXVw+8f/PqjXv/rnRrr/8l/Fs2uvX64/3dx4tnWw2/7v/f/+dufN2rWN5OcXe0TMX9LmLw/21M1X
-G8nr9afbW3/8tLfZ/iO9fffg6Nqb7c2Dr5Ul4Le/Z9nzZs+/L9/979GP6093vv5xe+tG80eiDROa
-eN+O/vC49q+b372q/5c69G2a1+/ffTH83/UXPwxPJrs2RtmADjwQr/v/YFS7duY83bT62INfmtfe
-6N/vfbcVbf/7fowscO/3e9tblju+vnVzo1f8Z3ysRikbDiwPBHHOd4eDE6SS7UtIpx92Hq7v/aCQ
-Y+7dPL77+/b1gx9r69G9F7/oG//8zz1qyCg50pPnRWv7+pfHNzYP0+dvH9zcqW17TrUT4OceSJjd
-B03g0Pt2Uh19abv2xY3NN4cPBtndxsvn69kv+qfxMXj2fefVCO7/ffigemu/mDYkxdvWj5tr19Zf
-PG7etBLm22JrY+fnt9NaiyWDcg9/zg7spHmgI/0weTzJOcNn2zeede5ub5lf9M1vH/5eXbvm+2V7
-1TjYfrBlso20+vQVCpya+v7VLXzp1u3fj7/e+GPYPNrodF/11l8cvv6nRfHjTUFw/OBW74ne/rKa
-/br+/ODwK1vtty830ps7hyQtb2wdfPV9alvbOyQp+ODV6+9ZhNsX/Pjbi3j7/ptvXoOA/31rPzn8
-af3ltcZgtNyX689f/NrJ/+hU76FE8wuBfYv/vfdDdG/j7fXj9va9h+p6INt/ef51PaSJXUsCYa2i
-/ZMH17/5709+pRn71XLy9WH2xjavtTvxe/77zbuPBgdWYje+MBvqpPPr+u7vP2y6X4v13+/f+36z
-Zov8/spKgZ0vN9QvJ3vruycvEv8rFrZyzAKO7vcbd76k0Qrn5+2f7333dLObPT94c13t/+flevzl
-P/75AHh6Uz3c3LkP376Nfniovola+3e+U7eub34nsG99jbVrviRC4XEDROEmVsTHdHdH/wt+/YZq
-8ws2AbZByNbvVbczU916rvd+OX4ARe5hYXjcWrsmzduAQk88HnoLvG8UxX1p/LdS4y4WgdY8wyZJ
-d9exIWvXsJvUYWhU9uz7xy8AdheR+bcginEScZPHX4qP/39777WdzM60i14B92ByhiYHY0wOBkww
-2IBtMMmAyen7/rkO/mtfkjoHdQDmwdpjjznmOzDdqKRSqVRVqkfFtPdGUWF+jX7zCJ+jYTyzrESv
-o+6RXNzOH5sMC94QPxkqCcHUgdnnT5TE1F4xEYJpoKiQv4HMYttGw0B84rPjCY2K/RM1xlAuSvQh
-JTmWpPKUkF1Gn5gWSaL8P0mxAJofJxhYsYAvV5lRsaIiySz0AEiymFlP5FjRyqHZ8cSOGb5cl2Kq
-YKUyDHwiOSYYJuJJnN/EM783WYYyKdMCouhldtUBSWZnizerSVZq0euQE2mJpfLI9LDBKA9SSNED
-au2jZrWzWl5eEMsRF1HLlIxJKUA0NGZpahNDckqYNURqS9THVjjqs9fRJ5L9cBio8/CfPt/0c6Tb
-75VtIWWdtYGl/+vnbhix9BbslfNq4afWixf0Dg/YxeC4ovRu7zYByyW3Sn0YO/PscjBM5Serg4Xc
-yjjmROjcwLszXLPD+YHcGeCL8R0a1NHc3G1/Jk2/Rtn+xe5xPG+LMKberbZYdnFp9XOVyiHDHVBm
-OEu3trl66m1wHAMLdp3a+PhUnMh3iL8S62HC/VPYCZ96DfZP4IS+7/MTV9ubCbv8bo7f6MuM57mZ
-I19ibStoKb1cYixjKCvsK1rnuG5cIwK4ptC3ja0Lu1/SPBM10A2Cn7l33lrrKw37BSwlYK2H+rc4
-JypcE2gp3eicqHBNKKuPkVA3HBrpMvN838GK9VCia8+xRM1Bx7yi7KPuSwaZsSyf2Kb+v+VZIEea
-9qdKX7lKJmwFBOzjTDP16cg0zd9nZA5DVRGR4BPXF0FinwxXPLnyX2TEsg14FpBxFPvT21LkfV1t
-p+udChB3sDpJ4WQ7gnMqSH4mw2EHswCKmXV4/omsf52Ztf/FHZ3Vc8WVeQaWVzMBgxoT8Ml1Lu4N
-41jM+Rh85TdbxTgpCSupYYrpt3XKCX49P/gmree6P9XRxyhPte2YAWatggpOv7+/MmYXX/o46PBw
-SM/+twcM1wPWfmZVcwJHpPEbZBZIHDoGg8zK/6RnHzDCTsSnmzUBp+mF5yOHM4VE/g==
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 8+nRwRNXPlaU2eNtasBgs7/Zu1IQhX/GJ9eYfB6WuvGhWJ8Sck71+ASRK/F6Uc90r/YuYZCPCpEr
-uS5JQebgWDSB5lTpmrwgFYTN7dEGoDprSgUh88ckk0G0h41xQWN0M9jN8aqe2yg/NJ1KsBs/E1Jr
-YBBJMpjzWyPGJNgNd2zD95KUwG54/1T+wIGjLfOyySA811TJDckL0Aw8pLC6xvgpWD7xic3Yf1BC
-PqrTWaOCJqcXrUqc2zsO4FMoNUFMEfatphJ1qOzbA2ZJnWUz9pg4dKYUOFxF94IwCfhtRzJp9ooT
-qyLW7MKiwDiWkhAHpmh2qcbxXZRy4DXg+MZK+BcjL2iFh6bhQTDyprQ4B976tDDiOpWSgmji508x
-B151FsG0yI9gSs6fWhxf9KiEiZETBn52OmzsbgjRI3vygUOmaGlMWeLVc4wfYL2RY4owUfWDZDXa
-VRzjB379mW7PzU90KgkS6yWQXOpsWVHMV+xmMUu9JR23lMfLCZrANLAy8HdkiSZ+/AMf/OdHdnWX
-VDh7jMen4OzNS6qdPVwDwhzFK5pQuhoFzDNzq4Y6qNxVMzQklPcX2qSRXhYQ4qYcZNDJhqQhKg3j
-xInEXg4jp1OAOas48kQDkr/yRCdyr2TsyPhJlMpvy51VsJxzMoKT5L+ytvCOhKtEWkoKADmR1sEj
-os6Su/kV9lhZ7Ypn1zvWHvsrawvv4GF2wgyiq/m0UIg06ASuBF4ENEZkeF3i4ZFBp/xawh8yXeIv
-ZuVdTIZPQbVdks9OVwbFyXVJeHeHRxD/JSFJ94jIvKCIzI1ZasASNqmIyFBnfArwHFPcY7klIsPx
-919uj8iABmwy2R0aYGjXRGREaMHbIzIQhiaIyOAQqUr4vKCmiIxknP9FBTxHHTgHQvTAglOWZHXp
-e7BUB8E3liussYzPG1djLAeeO06jCmGQxyTuK/fJZIDzEm9a7xPUAUOL2xRyetXA0K5MYOfuLxBA
-ho8uaYCPiVIXJNGCSrg6zUmz4gxVhKtTma8ni6vjQEdlkMLKQdCK7CVVnNXLsS1lU/Ua4rtI4Xcq
-Nzoa845LTLoPHg5SuUdOnTweTvv9Y9fg4aSyoBube+PhbsBZaMDDyWWo3g8PB6PWN65AFXg4iRtB
-sSCu6/FwvGwo+jfWe+PhhPeOkoi4e+PhFG8JuAsejndipSLV8jo8nNAXwx3rQCTb7ch6uMHdLScS
-NMXPicTZlmpyIt93qnIildb+aRW41QzIogSJ29HoqB2X0uyrbEcNjgTbCmmPoXbugOQSZTLI5MAr
-azQIrsMHxMT5zpxaNpiMZ+vBIcp4th4UJkKwCLHRnu77LcuQBR9xogq3LkPQmOy1MlJ6DLsMe3u1
-y1DGGof81uYvSgrafW4DRu1oWz4YPDJo5y5AyJxX3S6m2A7+SmDMbVq4NGvxlcCKt6Hxo9KC2xrt
-LnEMC4LP5C92UnSoGUSqz3BtgghnzLiLha9CpI4MQxUgUpWI1JFhrCZkoAD1uwsi9etwH0QqbOce
-iFSIF7sdkQpbuQciFbaj7hpogUssldeHFgj+0lTNSUZ2NzX7/GXYvXkZCqBw0nrs3lA4lM8vm9Fz
-Dyic5LzcHQp3fdySzzF5312DX3kDFI57BxECw/0rUDiJqMK/AIWTjo+p9M96coYhVxVw70+WAz4t
-sLmqam6E59tjWY+CW6Q20Qs2FVIVUVQRQIaN4W+202jDiC4Z1nq4wEGj91Qe4cjdzgtUudSWx1JR
-BjcLcXVf2OtwhJsDHR2V2B7Y9Qurxrmk6FFzgEpcJuuL4vp9NMwZp5d8IWZKDQrtZCOf8p6tQPMX
-2s+RHiobnuvnj6l0Kdx+yWY8k2w2463AIgRve3o7Mq/5XaYiTnwslhTqDHpJFEbpE487izbjDa54
-8cFuj5N6jRt85hANLRzmhH6HQ9gFe105sNvUiyVKFNoZOYSdub6sjXBEf2SIFt0xDlEhFivuPHGi
-cEKwW7C7qDKVCQUQMINNDuzm8wiI8uvxPW5wCLuw0XgIX75wYLdPOdTZRh5ht2u3sUQt1dliiiM6
-k6/H1+ziieZfP4tY9pq2gcchjmiTj7BDswoWLDVq9ImS87jK9x6l3iOjCrw3g19VVS0G7Q3yPWrr
-rIYlDNFX2ktKFi5r4YYqFztWkXLLt2CdW3IsvDOihmV3H2iPcoaqMGqCr2N1UNElzrmYTKeUklOV
-8jxI7/WeleSkyo5I3KmiIrokV0lOUxTuM6c6RVIBDYnuhNSQ16dURE42r0+9PCkUkcOOT6rum1Kx
-EbXjU641oJrpSnVGBHep3VA/Tv16Kc7whYiw6a5qC9DJR3qvQdNdF4fRiqaT8gPoWpz3Q9OpvB/m
-RjSdVExQuF5uR9NJYemuRT7i0XRSsXjpTPtb0HQ8tlBrVvL+sZvQdFJNKdwQcgWa7sodWSOaTuqc
-htkr74amk8LScf39+6DppLB0KnN7NKDppGLtdAX2+6HppGYXRXrviqaTMm64uaP3QdNJYekwt83f
-gKYTd2lhxFtK16LppIxTnfneaDqp+ZPIhroRTSdsSrGm8FVoOpxteV80nXqO3YKmEzQlPBO/E5ru
-Ko5pRtPJYqzuhqaTxlbfG00n1QCgcmc0ndRpiSAH/g5oOin1wPde74GmUzgZuROaTnl/uQeaTooZ
-rDV+LzSdEpLrPmg6KSwdth7f7Q6gm3UAefXFNF3dhK/iJS5SKazNoRL4dFBY7DzmB3e4WjbX16sT
-dekMT3nuXa8Ob12o49PZadXEJ5ZLvExIiMlUNCxUigAPoIBBPeM6JeiSWlWgoroc/2Dqqi5BjoFO
-aSq7LNcl6UQKrIaR4ZNM2WWMyoS7GN8jeva9nAQeUcAU2ysUNpePzDHVsuQK3d1c5o5zz5VKk/ya
-MnfY6nIVVVgllWXucEgudUA6VQkS8vnJbKG72+aq2NurqTIjG6VSVeZOMaIIGXNzmTvKhpEvdHdz
-mTsS+6ZQ6E7d4dG+cod7rgLPHZ/8JKrHWVTulqK0r7Am99VYHjC0J7ta+cSe8sACdYq5h0ryCWF0
-0HmWjcCrAtKpyWjWKSMM8UkcqvGFgIpM2qGGJDLIHWzojy/J6ipsAcpGqxBPBC9NxY5Z6m4o3HlP
-sbG5EtjFy4YCQqWQD646Gwo0pZg/pjobCjSmLqNbPrEZ6b67IB9vPwqBFQVlrgOnZl9lO6pqu0q1
-wsnservHCkStiJDskkhhZSw7akwVsBZXA0IIrH3bioG1b9v73QoIG7tLIWMkY6C3apQZd+/CsrIt
-xUrFeq9yOdQO8ZEuROKJM6hlPXFcDvXstLoLMoW5+Vi7JSFuqnq5VwVD8KCBPyJWvfY7mgpV407f
-YOG1m80JshW5rE4N7dzhlgCynVurVZOt0ItQ6oZDbbmqHRVABk0nvHanxDJ8VwFkUBWBv7nCHY2v
-xNW4u2IZSiRXXFu3WluFOznk4w3LkBY0qsLdXSrlKeKJ1FXKuxVPxFTKu30ZylS44+OS1OBDrqlw
-J1fvFda4017hTu2t5hD9dDuw9uvAmjk471U1sBY0pmzm6NQYOmRtuuuAtULkY+jW+BHEF9Yk4dDa
-7rlC7VyhN0V3RMB27oLnrBHqfDHFdvBYWAGISad0zQQql6cF3y4FYuKeikIF4RItw7hNYSJUxLXo
-um8qYUxqQEzWp4HQE+XsYmpgTPxBKsRO2aaYecHCmOI2VQh1WbedWZVxm5pVqQbEZH3aCo3va/3K
-riYQEy6DCNZOlNlptRmGXQrDe8Ot/ALDUOKyxG6PrAFxD4xr1oO/VQz6L1or0mkq94hYibfHeve7
-mqqHTt/uhHHtYa+m0m7DjE+ayj0qVMrzXolx5axPJg1DBepZGeMKuqQa9SyHcaUiQHAiqhFperTp
-BxFvpad2buXLZrwvHznj7OVNZ849O9/aT7sfZxh8KjYQuq/Q/SpM/dakIUduPCi0y4kdU594ILzX
-5xaXKA8PpzOfjO+9BjdUxa/DFs9+9jB4ODsehHe8/MR9fJ0sgOERDhz2L2w0RVr2bxwI7wtLFIzF
-UNgHsGMlisZ+B0vUWh575rg6bHaWKIPkYhncCPk5RPnQtJM1YmHrCAYEKEe77flzLUVUZ4YMFtac
-48HwRkLsH5e9lUQDQzRsNAdfcz9sDFaIiBvKEC2awniixaaxL0UU1X2LlnjQSiHRllwdwco7nmg+
-3ynwMrsAWRN87mI+USDMi+PJy599zHuBLIF9j4uvJH4c8bSKFp3x3TnPbpNgzL2g0OhkDmuoaA9/
-88zKxImZjU5l2iRgasiOToN4VcyUEydV7M2g7SchsEkxQoKHJIlTq7BdgpKM71RWDbRJGdh0uldl
-FhTQVajMojaSlJNPrcJOnagyCyDwpiUFTQ51J7h58gZUmkKGJsklnTp5Ehx6aR0fE7WGuDvNVRYx
-XRJlaQnXi2qma8rS0pnlOoWPE2vrEtCW+Dwtqj+i3FiBusp/JR38w+u8uGbKda4EaLus4uprhRjs
-IH+vyxt7br26Gw5VoJFkw8tqT3kG+VtuomUxiaIr464Cu0kfWWu613qQvzKyzL9FE6IAb72EVuqu
-OCxeTMlrEd8VJ+MAScfH+EkjEkeso4Kmegd4DVO4m488Kgg1zLWn3iTgDreO0YmVcvk6Xs+EcX7l
-kB2qx4eNqgQPogSCVfSo3R7B1H6yPnXxh4PagGSiehY3lGWTRzJpwljFNN1zwOmSAP8yLcrFjhWt
-cV6XOKn61Gk1Z9VqhAKuTCqgnNx7rmSggEoljRXmjz15nxaVgTqqhUFQ11iyyoyGxpSq6FiF6FqZ
-xgS7ym0cU8TyqB8k/+TyRo4p1tPRxLFq8AvTmAguLGUdUhy7EgWoFgOo+h4SHEBMFQZQJjtdBQpQ
-LQZQHE/WggJUiwHk3nCoHQWoFgOIotZXowB5oiLjYQrzYLWhANViACHHrkcBsvyU1xt8jJVWFKBa
-DCDjI1+FAsR0SYQB5J5Xkv0Rj+r2onzqK7LdUpSPM5Z/sSifKKrwrxTlU6rIdp+ifCRmRN5Aub0o
-n84sYRXevSifuD7yv1GUD18f+Z5F+VTVr7ylKB83qgA7FcZ2imKREjQYX9Xv9ruhXu5xN5TKun6q
-7oa6ua4fZ2h3uBsKV9dPW57StXX95Kv6XXU3lERdP/mokLQnrr2un7Twyd4NdUVdP2VJvkddP/nM
-ECZydWNdPyUk150CurJV/XRmTQFdbF0/+aEJYhdX1/XjdURU1e+KCiCSdf3kBySVoXpNXT9JOKLc
-rebqGaMaKSt5F/QVdf3kb/5izsRvrOsnu9Fl0S52h7p+8mFhTTdQydT1k3d1JbOgr6jrJwWTZJfe
-bfX47oB511TXT74VGOe/R10/+QMVnep2bgG+CxGp19b1kzA1OVX9uNUZiBvq+gmWIcGv6se7s0sz
-PIVg6vop4l7vUtdPvqofI8k31vWTT7jmIFJvquvH4rekZFFwz9XVdf3kGYgs2DvU9Q==
- ]]>
- <![CDATA[
- k1lrp1XgTvX4HPKtqK7Hp1BOTnU9vpvq+jGtSC4frWgOUV0/GdyDYrbtTGtdP3lLHt54cI+6frg9
-/F18kngdfkuFOU+fJCotQ6W6fvLnzfwsguvr+vG5LfQWr63Hpy1JA1+P7w7Lh6nqd3s9PjUgJqXb
-G8S5GtpK8QkRqbfV9eMFtkVV/UjE0O11/RiolFxd0Zvr+smbORgZ01zXT76q3823NlF1/W6M9ams
-66cC93qHun7yVf001+O7CoUr0Jbiun7Xg+E5Vf04VG6q6ycOJXOr+uFuOdNa108+vUuwi11d108+
-0UkQU7q6rp/EvHCq+snfC6e+rt/1cUs+x7RjnjB+5Q11/VjFJVXV7+rsQUFdP1mJ4FQAua2un7xh
-SHqvt9f1kwfEUjvyzXX9+IMUVvUT2WOqb7Li1/XDG0GkDaNwk5XKun6qbJib6/pxZ1J8gCODrsWs
-T+m6fvKbgyyK826AWHLf90psD305G63ekc74EN4rtSBvVBTsleBbfGhXPvFeAFvkSRMtY+zpTfJp
-z8XBk7EpipSNt0N6dixjCG99Fmb4+crzRKsniH3znxZ6sK286J2frybC211FyJcgnkpvqiXLHsK2
-1Xsnn/tg4Lh4KSTX37Fmx2Fzb+zWzCFDlOavaePhkgnrv0bTAPj0kzKHoo8lS61+aIUOq96nzhwJ
-eYKTaK3Q9VQ8R32oWgz+ZFqrzvP0rRb+WLRnr6HDu232a/pI24O5P0O7VVnF14nubvZs2x6GkYP5
-mNqGX/Ufr89WU8BWDJt/P8tl+2Vh/AzuvmZxau0jbGey035713ucg5TePz+8OxMBa4ooZCoZovA7
-eSGKYUvrePyJ2Y6n6Ef5ZByEx6fQ+LPBIC3bziev+8MTqMYMNOztz3s8fe1gsbmYkcRWi3UID1/6
-2K8OY+lJcw8daqYEJKwnefnxmR3pVPVFilmIGWC4Zwucl4BJjx0rQjTaRtZZw/jebydN26O3YPEH
-5xfjeqqfQiTpCw0O1V9c++ArzFerbREmUZ8utNtmwjSbIn+/seOb7HvB8gFDa2Q5oDk23soZGlBr
-UnxIhs3Zi86c6xdmXVRAM/tdbHXDr9mpIeU9J15S3tP0sRAzrhr5j1RgANi2TRbX792vdCmsH4N2
-3g90s2T5TJvPuYpAKGNvkHqs6o9oVOnNDkpyuvLxMXTm37sl+AkMuLH2QNCui3Trk6HeEXlOhPds
-g9kIwzOpib0hj5X+5LOh2DHgSGQL/ow4EOoXKJzyHvz55EIaxmgFu9jnEXyR9dA/LHgLeX8tCpot
-Ec6cy3wp2Erlss9lXWzyk9UhRniTETvqKOzct8+R9T1mlyOvDzx4cnIejEzZJ52ZfpR1s4/8mX7n
-mX5QZuhVuPTcpvKCZsyrHaiM3cpXrBpGzHdO9mWd2VcceCbMIzenneI+TsDvvJR9FHolIMpo4yuF
-q374p59sezwwM203neQr470PWuhNNycGa/JbkzaYbtX0kC9NwlnYTpOAyWFH36RUR39SzU76nz5q
-rnoFp7f2tgqAp20Xeuq3h+NTmmjbQ1Mh7KYo4V+/mfOumB1IB/Fu4vr7PzbqWI4UBlH8iAr5gBa9
-pLBLtMfPG1ffIsFp0ec1nhLOzuMxnOwEX9OR76kNrrqM395/0yNRgRzrffqZif8JmBKJn8LQ/lnx
-2y/TFT30Dxc7Yf5c6QnK9IeHZFGuX/bBjdzkz03qIerTuuOnPl0+B5Rt6c/bR0Pqk38egk2EyCaG
-/RRsse+BeI2df7iuEuSvh5cW1faPvctIW9/P6c3P4/QPPUAc6weZVTnmjOXnQ5+FO80jTFNoZdae
-uSPdmPxWc5Wy/o1VJMxhTpYJDlg4MQf2JDETMF/KM7o/3140jIDF3wmi3gYsj58h6lNutGTeC1Dv
-vW/Swt7Us+3vQm5tmKRb7S+rzpwfu1MfcLNOoHw2au2f92FyLfJNB/4hsIWnNxm1Jtab9C4GNadA
-b8a/6ztb/iNTe8nY10d4SUG4lMkTnrZYbwrLDlvRwIFai6Irau3MGR9Q/9QwuisnOauZ7uBEeFcG
-j3dpaFgCptjmTBA2z4nSY0BbokRwFG8FfwbtCObsy3+l4J9xpw/sHEmoCKGPTE/8F/jNO1QpJQ+y
-62DqjQdFIqASgpGGkhcTUyoRErMPH1RsMPf1AHEWxPaHntCKg9Qhrqx5zHznor7r+KBMV4BsRN5L
-2Z9VesrTqlWCCI0rcCIqPq42zBzCyE6e16HuAwR6O7S1wKF/peF3Pto8q0YoThQLbvQK8ORaB/Bn
-1Uu3DXUp7A3QpayyJjUfGAtQqW7VokRaeKITBiq6IixQiwpaP3n/qDg/EjRiZgh5WbMSfQdvLWgS
-U/M2B14/OrlmDmoi8fzGaaD85fLwG1gkO0MHmdfXOkMDs8O7SKJ6gt8ZwXfRC2llWvr+F46pTZpd
-iXqeaaApbuBCNgDGQjZRspS4Vi+QeSe8EQHNATDEX/0Q3go2JlfJCT95mO+8zHdgXlxvB2gfHElh
-B2Lf5+xiFtb2gjWzf2gT68lPW1fAKBubWl/AYAgWhTWjqQ0DDoi8biKmZ2tHw1rkevImih6yM6m6
-3evOK9cHAVsnNS8Ze8VJ321R+vYY/jpgBM4CIOpxo2UtvvSCQvjSHAtE6ivK6vVffKzBi4qFQ7fB
-QPeGcweIg8OCz2NgzLmChGGBPdufDhDCDjHB4+YxAYHrSCYMuEzwz5uICfBBn8sCQelysOJZFrD1
-xPlMGCVeWSYEPte+KKeY1fdp7OESpQz/bywLhHWrPaz0d/U7b55kwjHT+1QnB+hqfiTYFz3LAp1Z
-Hzx9WhgmdGXkAF5YSnPxS0qUsA2weUq9vbw0KskijBLj+gDXi5phDI9XDoOOkKBwxG3DWEjOBjsX
-5KqUG0bja3+bTDeGB0ZbCppQxwnQxOwkPwzQgMOEJJlu4jl72PGa2OmV+yCrnY4G1ADiWG/DNkGU
-ar0J983eFyO/Pc7EE4XvEj/m0tjcLGPoOvDbZGx2vqUJ0MBaf7OMvW9vlLHeDidjqpsYH5UFpM+T
-MdEwFjeysrG6sDJ2XRO9oYrl2qWjPdJNjPG6T10fZhxWkhzTOhu9hfKK5/YBjEXUi9WNs9HbXgSs
-pDmmfhhHhbUh1QceNiHZuxhuE+y+0ai8I/tPX2wTeuv74o3bxHh87R7A7Mjj2UGJEwp9WGDWJ+gD
-R1vKcWK8Ot2qLcfbs4qdSGYfGh8u8n1Q1pbji57758Ro4P1pMdKRzhLpQ8JjuRgn7G37dATB7LuG
-067eddhX9a5at04ageA3bKSsCz2+MMc1Q/kUs3MqiuxSJoYz4HiTI9Pmi4yAWJ96IRL3Cr3uoQv6
-Km46Wvl1gn8yAbiSlflkIx272WkFrfES6e/Cg38X8rqpP7MeD+lu0zm90MNm3PHA8/s+Q7u9QRsT
-TLRzg5exMxPcqzi5D6pOJmxYcfMiiq5BhAnBVFh63wHT4zxN06v7WMZQIYrik4P9jhsdLWZdnAe8
-6Gix7IHBIQfg3ZeT9LW/T39AdootH/oz8NzRgz8bKbbtIRW2aBQQtx3AX5hlkFsAz2mgl1CNAqu9
-foTrpVH3wtiGCxA4mMCfHdSsgwyJeBufASYy6XQmjQkjfOoEBDzAaOlV2dDtD03lB/A43HfnvKOE
-JT7fWjs6cyGRD/5xwutk8L3YbXKP3+kzeOa0KAb6uM1KtSjVHpmnpNAifdMlatH+Em3GosVCyjpr
-58rTJz3lVfe6PlpU2tyAn309BHslFSHqjYLM0EeAyjlGTdi4jkIiLiq8Pu54qSDvuEv4xtWyHXz6
-9FHxqPHAn4yV/WCuxqMA/WkaJCPwLmpqVy3UohsdkYM/u3RQbvVJ0J8GrLSN/dbnapLqzWoa4DwY
-6ANDKi5ZO5iZsaw2YeS1BTLRQPRxNrD/ZhfhQj2zjhqjUpEWckDsP2TGNhuqOXc9DNEJyriDwnIe
-EL6iL2UDn0Y++tOUDQFPqCDS+S8o6k3o/F5w2JOPkXe3oVb4qZljZDDUMjxFiJeiM4TW/neYWotd
-woicVPn4oPboIMMxDfFB7dFBqfv6lOKD2qODkGNa44Pao4OkJGuLD3Kjg+n/TeqivmjsAfwTfvC2
-LuvZsX5czpfbB5fuUedNl32+zna6Kxxns/bsf8653eSymW3PD/EHb/otWy5HQ7nZZDedPaBkptBP
-hFEbbkpaKfnmHmnzQowoWJ7J/caKq5Kx9TTK/RK9JGdZkFbKvn3QuxZ/JbChOicetKt+6l3+wpve
-Vjq54J89cpcnmSR5sIq0ksOYmx0zl7yzVv0QnBKgYEzsp10E20P+IzNrpbynecJbSvcruX7h/S3l
-PRM7OiAIzzN52QOcU2+JQ3JgyJwtenviNah3e63v8LA8B8ZiykW9epc9lYLfvuidTcMrHN8rfPCs
-d6cDU2g1lPSOgxGYZaNDlKsqLH4nteTYra4wHNLT3dghNasjz499rvk8iY4NKH0Jlx86yaCXnxf9
-CVMabdSnvxkyDuyUNWA9wBIyJSf1Z9zmJg0ZMugMb4ihmvjtxM/0Si4T7OkjV49rOMpkDzJ1ZuxR
-JvvgZjOBPAYecGn/C2YCSsujDIV/z0zQmeW39fuYCWRoW3WLV5oJwNBhDIV/z0yAhg5tKPx7ZgIY
-C2Mo/HtmAme9TP49M0FnZg0FoZkgnxFCZSFW47jNgVL/ju/CBbpSiz/gSr0P8kApfnT19te+jdKb
-l3gDqtQS0KXPbb19uU7q3dvmF9SlMbgvmITuFTlhTz1S1YFFk7ahBccear7tqZdGBzed+BG0sYkf
-TK6GlfT+gLZ0UtoSnrBwtCW1lVv91pT+G0071JZZjwvdPu3/viTK3mX37CENj6Ur7kRpW0CP5V+k
-QOfA73qtCGYfPugAKpEjq1pJPfZNLQGBXkXZKEClwp7Z4HHGKrM2bAt854tgbRius1eM26Fs1JAx
-ggzQKHma7yt2bFHGiqFMouI8CDn26qEsElPKm3tJ7AjQTp0glSdHYxc7fjQR4B8nB9XDpLGyJ5FA
-mbO7LxJEEUCDOf8XlFQl09Lyg5DgcJBNyyPPF93c88VJtCI4X9TrzzYmfnZqiM4Xg46iJ1hK08dt
-Tzu6dBPvINRdY4+C/LZYL8A7CA0b9eaMKUc3MbGITlIzXk4DvkK36EMHvlRCA7XsgaQjk927THby
-yDiAgpZEck5/936gv+sdvcv61skmWiCR45n7VGiFH3ZUG/JDKgwOiDr3pK7Xd6Q+HCP6CBLZ0dTp
-m84sPIREt6JffwRplzp9gyEh1edvvptDdavonmZCKsBhAjoVppgQ9LJMgL1ZcY4g0U16OBbQIdTn
-+GpLM8EhOIJ033gU/XRmj+fVh105cvAcb5xVHEVTKYZSh9EUsJjkIjo/lhIlmdNsChIJGgCzr1Ia
-RU2gom7q+kCm5oibQAWpbhkGSuCnlxTnSFvDMDpxr6bEAPGqdMXOjltkGrrUTkEDFA==
- ]]>
- <![CDATA[
- x9RyAnrgbqVhiI/2uSAZn2ufJSSHoZKVMIXShxo4GYqljJMp5aEzw4SHA+dN4PbbqTcLfz6nRNEP
-Ss5HQ+uNMgYMFNttMlYNetgGsDIm28QgRdwqY9aF7TYZI7Z2jIypbqLqdCkKCLcBNAi+jA0inltm
-A/jzT16pBoCMqW2iWDUoL1fpBqg0VmjwqdZ90n0YeKRZCfuALiVXnA1gYCqueLk+wCTmffy22YBW
-rTwr0f4iN4ySu6BtbYj6EK76oDV+w9ooPbf8Cn04Jr0+zo5cCp49nQSnifHAfNseMJ47nfSOLNsL
-mT7sfXihEvSBWvvCXkxMEfdNEjFxP3luSzKDCe6SSxzbB0ZbooTPkM+GjES2/hgiH3XrJ8Hcs3PY
-zV1GxWr2+yVmpEIGoRQdSSJD/C8bfp46CZ3QmaXAE/eGTkAqYvCEZugEEw6VPpZE86LqYFJ4LMl5
-sM/OmQeCmD4MoL7CqALn246NOTZ4dXEfzIMMJgF6y8BLgnqFTJmH6gFKMjoH2KGVCv9sOnhHp2Dt
-QN42KdcbCHGc8jZcNXQ+noFyCUWp6aVAFM9lyLYm1eyk2UHNBjhRxtLwSB0w291B0hpvu7kHd8+p
-R81J+KJDGMaL99tLhQTpJd2txWb1iT1rCJ0bplnxux+d68zpt4tpme9PG/DkqO1j5df/fRmkqJhE
-bxBgQpFBLmDiOcKIyoebQk00s1CvfHhpsf8gUELDN3Q5P3x0dOkDnRLA04SPAPMpSDaRf9yEwZ99
-qsXhBE18nznG7xPMJx939uGd4gwmoR/gYilyKxMdZfwL0WPph7EoFScOo6KjLjhh8SpclMq3hyUa
-sNjrkKnf4J/eB4w+fPuYT37ue7V5EH4XZHsD1j7dn2bh572XzTmj9kIhX3uP0sHNTYiYjeNhKKEe
-Jk7RJ1GQ/3+s7//ZWN/uf5O6RzCYss83zG+n3DNHndkMvnmbnS97+EJomJnNl9vq6J/ZUed7IP8j
-wH/w30jsweePPvhDIfBHCH5bHets6N0Hn/2hCnaXoTd9POeWk/Nytx0d/3mIw6+6tWqnnHuIP5Dv
-DsG7jw820BtiCN4Gj+zwoHMIejjUEQ9p8H/3v+Cfuo7wxILhUDjwQHhCMV8Q0vUEwsFAFH7whYlA
-xA875wkEYwT45AmG/ZFg6KE70hFUt0FT/4A/XsCHP/DVfx98xEPt4fObeJhCMi1dwBOL+X2xB3fM
-Ewz6gr6HDfsV4YkG/X5AbA16Qvj9wbDvwR3ygLfC4CvRL9e6X2kG2HyeUISIxML2B+/b+bjczh9s
-mUx6AmagtTuP4KscDlQz5ESAaUHscoPNwdwYzWft42i5BtMyP43+M3sYbbfwt7M9ePIwP85O591x
-9nBa7P4LvwE/oV8HE1wv6P4vDK8wXg==
- ]]>
-</i:pgf>
-</svg>
diff --git a/docs/theme/mkdocs/img/tutorial/exit-icon-over.svg b/docs/theme/mkdocs/img/tutorial/exit-icon-over.svg
deleted file mode 100644
index 4cf37d3fa4..0000000000
--- a/docs/theme/mkdocs/img/tutorial/exit-icon-over.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" height="10px" width="11px" > <path fill="rgb( 36, 184, 235 )" d="M5.713,10 C5.713,10 5.714,7.101 5.714,7.101 C5.714,7.101 11,7.101 11,7.101 C11,7.101 11,2.894 11,2.894 C11,2.894 5.713,2.894 5.713,2.894 C5.713,2.894 5.714,0 5.714,0 C5.714,0 0,5 0,5 C0,5 5.713,10 5.713,10 Z "/> </svg> \ No newline at end of file
diff --git a/docs/theme/mkdocs/img/tutorial/exit-icon.svg b/docs/theme/mkdocs/img/tutorial/exit-icon.svg
deleted file mode 100644
index 3ab075108f..0000000000
--- a/docs/theme/mkdocs/img/tutorial/exit-icon.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" height="10px" width="11px" > <path fill="rgb( 0, 89, 118 )" d="M5.713,10 C5.713,10 5.714,7.101 5.714,7.101 C5.714,7.101 11,7.101 11,7.101 C11,7.101 11,2.894 11,2.894 C11,2.894 5.713,2.894 5.713,2.894 C5.713,2.894 5.714,0 5.714,0 C5.714,0 0,5 0,5 C0,5 5.713,10 5.713,10 Z "/> </svg> \ No newline at end of file
diff --git a/docs/theme/mkdocs/img/tutorial/question-mark-icon-over.svg b/docs/theme/mkdocs/img/tutorial/question-mark-icon-over.svg
deleted file mode 100644
index 401f5b8452..0000000000
--- a/docs/theme/mkdocs/img/tutorial/question-mark-icon-over.svg
+++ /dev/null
@@ -1,1924 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
- <!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
- <!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
- <!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
- <!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
- <!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
- <!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
- <!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
- <!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
-]>
-<svg version="1.1" id="Layer_1" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
- viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
-<switch>
- <foreignObject requiredExtensions="&ns_ai;" x="0" y="0" width="1" height="1">
- <i:pgfRef xlink:href="#adobe_illustrator_pgf">
- </i:pgfRef>
- </foreignObject>
- <g i:extraneous="self">
- <g>
- <path style="fill:#24B8EB;" d="M7.4,0.6c-3.9,0-7.1,3.2-7.1,7.1c0,3.9,3.2,7.1,7.1,7.1c3.9,0,7.1-3.2,7.1-7.1
- C14.5,3.8,11.4,0.6,7.4,0.6z M7.9,11.9c-0.2,0.2-0.5,0.3-0.8,0.3c0,0,0,0,0,0c-0.3,0-0.6-0.1-0.8-0.3C6.1,11.7,6,11.4,6,11.1
- c0-0.3,0.1-0.6,0.3-0.8c0.2-0.2,0.5-0.3,0.8-0.3c0.3,0,0.6,0.1,0.8,0.3c0.2,0.2,0.3,0.5,0.3,0.8C8.2,11.4,8.1,11.7,7.9,11.9z
- M9.8,6.5C9.7,6.8,9.6,7,9.4,7.2C9.2,7.4,9,7.6,8.8,7.7C8.7,7.9,8.5,8,8.4,8.2C8.2,8.3,8.1,8.5,8,8.7C7.9,8.8,7.9,9.1,7.9,9.4
- v0.2H6.4H6.2l0-0.2c0-0.1,0-0.3,0-0.4c0-0.3,0-0.5,0.1-0.7C6.3,8,6.5,7.7,6.6,7.5c0.1-0.2,0.3-0.4,0.5-0.6
- c0.2-0.1,0.3-0.3,0.5-0.4c0.1-0.1,0.3-0.3,0.3-0.4C8,6,8,5.9,8,5.7C8,5.4,8,5.3,7.9,5.2C7.8,5.1,7.6,5,7.2,5C7.1,5,7,5,6.9,5
- c-0.1,0-0.3,0.1-0.4,0.1c-0.1,0-0.3,0.1-0.4,0.2C6,5.4,5.9,5.4,5.8,5.5L5.6,5.6L4.8,4.2L5,4.1C5.3,3.8,5.6,3.7,6,3.5
- c0.4-0.1,0.9-0.2,1.4-0.2c0.8,0,1.4,0.2,1.8,0.6C9.7,4.3,10,4.8,10,5.5C10,5.9,9.9,6.2,9.8,6.5z"/>
- </g>
- </g>
-</switch>
-<i:pgf id="adobe_illustrator_pgf">
- <![CDATA[
- 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
-7sZxP3r7MfPR2g/RflhkKKZhNPZDsO/4fXdbN5/0Lftzal2678h97+177KSf9l0znfSI9sa1lY2l
-WilWVpZsZWFJVuLEtWdbprL+Nv39zfRe/nNkubaysVQrsrYn+W+1kq0sLMmKsl5n9MJBfSzvOH5H
-jlfl+GQOCAZhZrffspuv2auF/biw3wL76Y4dc2RH1IlvnvmueMGZL3TLF7jmIxc+4cInkueQ2XIn
-nXkjfOta+FcVPrYKN1uEq0Xh5vMkE+lOevlGmN61sL96XYQRZmGISXaUIDvsvYz4rXTHcbsWtlm3
-Igw0CyNNsgUF2Y/vZSLcSjcdhdtutU7CeFdhwEtNwoqDbNz3MkNupQ+P5VpYdS1FmHYW5p2EhQfZ
-6O9l7txKxx6FwW/C6Iuw+yxsPwnzD+s8yTS+kzG+kY3hWjaIKtvEmrNsGEk2jiCyw71Mt1sZi6Ns
-KptsLmVZZZtZZLuJsunMMu/vZFbcyEZ0LRtSnWRnWlOWPSrJXhVEVrmXGXorw4ddFNsqNtosmxs2
-4hDnAC7bBFqrhXpei/VkQemmDvkNO/9GyUAlBZEdOB8euR2bYQN+eb8YYkfsjOF+YPXKEjaZVFkm
-VJDJdGkqRdsjuPvgR3egwHWJXShz9fpOZHsRtiLZbUQI4L2x37XNbpVZVi9sd6ltd9jsrnFDXtwk
-hmQyaHGpgULDHcWGYIJDbqLD9djt6AXIafO9NikfKMzd8iNWi64V3xDbLsrv+eZ8ax2Ga0old2k3
-shQJQxN6VMJTwUcluRsK4nfSdDAhW1/HpWaTkqlWsClvqDfDRtgbevHFntBHHgdKB2knLFBSSDLy
-RWbAkXPhRDrwrsi2ATjHGXlOnyqd74ych7xHu/gCO9pzox/iRdr1J6vxkxfjsYm/XroiU3cqTjG1
-R0veaUamLU32h/+oQL7TUfcqmO8xTUFrkj7LcdopdjeUoF0pwO/tpNST0pVI/WudXM1sZTkr6azE
-C8V+pp2me6bQYcWNQlr7fXuxCJ+YmqZ9Y8rYUbWzi2V7tFTX+6ZBydeyPrF0lTKPZdp/bMaG/vd5
-SY8UToppjk8slzr4QpmeWPHJP5d090/6+WwN+r4YWo+qjOpi9q0VlbDcKOFGimq6sBsxbKVPpjb7
-8nazSJ/+p6vZJVRfveOCPeo6dpX+fLWWZgJYreRmIOi2oTQu0OmHV6b81cwS3Tx1shx9Qd5Og1Fr
-NHIdLy7H4840dr4gzZhyuj7rzsrWrTNuobm0RNvn6Wxlni7C80X53jKdGQwvrdT3rd+T5TkNNshP
-XsPvW8d//WX32Ru8JKKO2s+5/qPyyLn+41LIDB36jtLGZprfavJGbNrP/SBxlJ3EEQcN6EZ0IGpA
-k6hAUIJUBYISNFMDUh3ohsYf1YNq04OS6UHQhG5ECzpSD6o0JS0TVaHAxXFPrfgWd5Drq2hCqgtB
-G4qqDVEfujV96Eh9qFIfgkYEzhUmU4ruqeFCLVLFCKpRpWoE5WihchS4lO6pId1QQ4KOBC2pyF1R
-VRShSRSlRHYYaJq5o7p0K+oSFCaoTFCaoDaVJVNxguqUyKlmqk/3plgftUwit0Fyg+xWKL+tqJ/w
-Eyg/dS4OmVbHoktpKplVKlAoy9Q49ZnUNchYbknV3yMDHkUkykPTIATtmOoZ49xJLjseueOI004m
-QTnhbRfZ2nskiHOJ4Wls4lH28TnXsWmLWkYz1fizN8sNpsa9Lcz31cn+iLuSdmVvdssnZd2VMu1M
-eWVn5KtUlPbl+qQcT8vUbF5ebs/K+c/9efE5No079X24UOLFki4Ws+Sdl/xIWR8tzZY77Qy7hebm
-95XtB8r1tDMnXy7HJxYy92lnuX5fuX1amS4QLw3ik8v06Fcf+XO+iX5sQ2a4mZv6Gc1joWWxouZM
-N28WK2793KyYbXQyU6n/OG/oy8bHwzmrq8guybuVVm22y0SjkZa1FTfz1lY2K9etHC/wKPmZzhjU
-JdbUTfeXudHAh6ZHmNBj3OcxrjNwmiNtOI/zmvfwmB1TMcYyvZenXOAkP8RCpvfzjSewjBPWMI1c
-4qNZw7DeH2MMT2QD5yv/8XX8/vIXWscfZEPdWVFFZLtRYyedsJCz0rJMIumtgy/2KJxA/bGzeWTh
-k830ylYRKN0zewvfrGwu6pxNFEXhoC0T5VP30sJPe0dPrfpqE6RL+mvxA5/tNQVg+G2xgNR3C+8t
-BEt6cCc6cSskbTpyj8KNbps7dxbxD5IkfLqLPB4k5EKxfBMR/Zr+3RvhF3fm5Z2vwyRyfKQ8D3cv
-HL7rdaGkvw2OX7p+pWA6QhAMNDAmuoHhCIZAXugOrtNxo09YvcI35EVY2vf0D8+N5TqzdTbr7LWz
-VeOoU2OlnYU66+xMs/PKziM7bxw54u3U+ODI/zrf2/O6kcWNbG1gZtPAx/as64RZXZB8zvnRINNc
-llse4zInYsdYpvdxjR9kE0/c4D92HZvh+l+meYAVh0ME3PhQ56tFlsuhpCtZIBFVv5z+7qunVD1+
-d97iVZaKeT7UcCV64Ppoc6f10NZVWMu2BPkyQLuNjlLOtcZF/ig52tcx5HU7oII2Eq/SnJd2s09u
-iE8zi2aaV6k1yyJfcZ0o16J8s61tyfNG7LQwxSXLHxG/w9BWupqFrfSH+kzt6bOtszBUtJXDnAuv
-q8KItS1REau2H4Wjoi0Zt7zt2srzvA3P9nna+/hRjOWqprShpZrL9olDedrahZlqT75tV8LPH5um
-+0rSyvG2QRwdqXgZvPgPb5//8cXXP5/8D2k0Nsji1boG2ScxjimWshLAKIuL3YuvMfK7ZWtXHPwK
-DUawKw52hS1TeWBR1odX+oiLtcOeeiG6aVmvUsL0/ogb76//kG7+8t//LH2M/+XCRTv4v/n+c2+7
-TrT9Jps/s9jucm0byu3oeLbNYjEslOwGlIRkLwiG81ooIgDpdaRocE+rkIoEK4WBa4oBd9wlAPTC
-vq97/jWtfbenwEYFMbpHSO3baibHXjwbAFRduo7gpFe4geLyY1jJSz+Po2FH43U2ow==
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
-syqextKflCf/9MTWIJsStQuZsxDWQZnXbbMpbmy2zfXTM0VP1sknt/W5I93+6Y8v3j3818Px5bPn
-/y7LYvfxL3EKyLnZ7CPPAZnOEs56umpPNzummr1txwnuc1V7jtkboK7uLL1sHPDoe6z84+nxx+T4
-x46P/xT4/82Q8Z74/+njAwCstBSQnqjx1OxyYjX5Mc9XObOsfvQJK5OqqY/MFM/dme0oSp0sPT+x
-i8A9R7GIvhtDAFz4vbMDT5+Q5/wkP7FZDd9nMXxavMX5YQsfG3GxTy3QD1s4TSFxeyFJwZOmwkec
-XDN/rrNrpgsTYReqQ//fOBHGM0l9GgzJqt83FX4oYfU+XbWZkaf6aQEup5Pidvr4EJdhigwTZXrk
-WI59OorPJz2bDP2Xa/CSZ+rSwdhlz92mC8ztgn5xMfPwPu+wBRRNnxhRVDSmqIcUTR8fU2SehaMa
-H2h2SLfLJGtjn3bk7kLikR/r6KKPMdVdPLxo+hBjXcPyOZLPE7fd9tRtk5klmL2tJW+7fVL6tn3y
-NotGmj4tHEmjeg21ynik6eMDkohYBZ5hNaQqQKqynO5P0sOUCxlkfpoKP02Fn6bCT1PhsbRRH5BU
-6Sw/1Idf+2OZnITw1d+/ef27ty9ev3vx+psvvhh07fGL6e+/xTdJv/nds3fvHt6+FiX8+uWfv/vu
-majf9sdh2662NS3wnC7rmg5xWa5kG5c/wnolc2nlk17z/3/+D/n1Pf90n+M//5kf/4f8+X8J8T/k
-5Q+/PfzL/5oPX+slv5dffg9v8vBKiGc3OvxmpPrz/Ga4/hJtd/Vr+feL67fvbl88f/fizetnb/98
-+CVNFr84vnnzUt7+19YTX919/eLdm7dfHZ89/3fpra/+8OLlw1e/f3j+7ueH/yoX/O/yz171v3zP
-Bm75Nv/A6RBxVKDaIEPMnBiLTIhqSf/sANXqZwUuW53TdvjnZ2xo13EphKs5rTLu9SqJZK8dI68W
-ReA65O1qFZHqICv+SprKh1xwWKu8c5XqNaZDzldB1tbhOS6r+UoWbz3keLUiBFQk/6tFVtVh2a5E
-6MfZsetVkAV4WNKVrLVol21Xs3CFQ5IvCxsverdYr3KEQb/OV3nbZIqWqwTjKy8ry5WoIFJrRWCu
-3G2Vu8zLekhRnwmElOt2SPIaIt3qZUIMoZaDDHMNMvZruYK8Cf/4hihR0YJkOHMBIaZqr7bOV1BK
-Dst6hbN/DlG6JshaPCzhKol+c2g1Ur5a/KJwJYLq2h47rhm50jRlGpKTrevVErblELIMqQyCXrVe
-bSGtB9wg1I0PJC1KW3XBebg5XRkTECbjF8nbsMu+CFfCotDVqV7NuYbDIn0o7E8I8hSYD4HsJOt1
-0ueAeB5CsddYhKVseGYZcXSufF4QDovx3mzAEma+9Ke8KkcTrXBZyD3zKu+ZFh2vJV/Jk9p4pXAl
-f8scWqVfg7yXXF5FnTisi4xbllsuUW4i7a5yMxlavUymXJCOO5QV0dqVnSjcecFlsiMJQRZlykHa
-WWWWhdImlaySFW0h6veQZnmhTca9LjLOMkwy8TmDZUoKv9cRk8e6Wmfpc5mBcDLJVMLN5M2qXJ1l
-TiWZbZzSJeqs42UywKLYREZeF+mAhN6Te8mzzznFw9kqw1X/xgV9yyGvTGWH+lwnr0aiTCzkI+Rs
-2RB0LdMKbxDZAXP7rJNHHku26l5HVo4odUMjRvBb+exWoszdbUUta0bmGl+s3csJbabigXotf4/W
-zsmL+XungI6QYSlJ1rzMq1c74qLzKsmslP14A0G2V+EQwmqzjGIj6KDJLAuyMnqtRe/a23GC3U0v
-c2K8Eo1VBq21E64WGf3hbkbQy/yZWi1/6tbOybv5S/+Xf5T//vHJG8Svv/vqt89kT7158+2fv3rz
-b9wwfvX2zfff6g5x+YrfP3z78Ozdw9dfyS12O8l2+NnPD//8Txf2FJkYeZ2JKRK+stHjOZciPYPd
-RFhRiXncTYqey627yVKvypZlY8SCWXTmdiJyE8BVKhNE9H6ZyjJRqvBY6WWtgYS4Iuyxi4KwlQii
-TBa9TFYjog4OJWvjjbBZDV7mxDBvdl3ELi07cwirUYT3rXEbKLxysR2815OJq/Xmqg/WKFvVTZ4X
-OlGYDOd5e+MKhrcdzrplv97Dgv4QJlKjdKtwlVc7osgf4FhB2OEiQq9zrICtRkbFPuobIH/x2qug
-C5PsSq2NRrA7tY4mMchgVtzJm5l1mbZbzX3Z9sdplfyBWzMnr7Wb+Lspl9JcFyDVZtkf6Byacwmr
-ZTqemdOzqp9d/tgW2bF1wkXZO9mjeYEDNiurxMoF6C4HESuE38ZZvs1ZGDKmFLbrWfYa2Q/wrHMw
-XjkLd15lJXOrALcKwr6x2W2LbK1VNj9ZyZtsPodNdgGRJPQy7ADycpswB2H8B+5rsvtsIvSIdiGf
-hQ8EEWNkD9m2aNuREEuuuo8I1zlEyDaiMaE3RZgDQapXETeEa8xpscuEuMgbHWTPg+2TN1uriA6y
-idYFEtFpf5zsLFgc2FvlvnmW+7/aEfG+2InlPfOSOI0wa6LwuIAut8/PvY9Ljb2O7PHIUdIbcYLd
-Sq9yooywaH+H1kxB1y5rv5cT9DJ7oF7LH7m1c/Jiu7kWDtfffjJrC5AeZcuE4CF7vy7SRswySjK4
-8uRXocpckWGrmMHgJaKo1kZQHiWSscyBoZb04iqSUW/HCXY3vcyJ5QoK+KG3IyJzluHvdzOCXubP
-1Gr5U7d2Tt6t9Z7qVuy9T16rQaZKhryLKSNckR0IHQGb7ipjI/JmEFYuwisfLZSIlSpsRoYIS3fD
-wtD5IJMMjFYYb8YsF8n3KmI9yfRfZ1kYocKFvMZGYEdA1p/XXklWDfl2Ss7vjSAay8DdjSjCy7rK
-6g8QLMnNF7tMpKFasCkI23X2HqA3FJmzgbyGrYsUVbjrZBVoOyXK9F38ykYViRhGEO46G8YFLBXu
-kANa30Ss7BReKTvsVmX4ez15xpKXhVse1ZeBIhrDFrJd6VQyENG+0FmJz481mwN0gg==
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- U3Ya0GWBDKwsO3x6+IEUdgZ0mWlezmkBXf7qQUZQ7/tBl5ebTb2Yy2sJsLCRy6iaZ31MEJfhPCQj
-mLfWCOkYpoyCtwyDSpONW8ZuTFDdtGUWxtbDWl4BTA6EsgKKF3tZ7zNEmix5jc3AfSQ3OEjLV+Ls
-Ii1zaUBdRJCWuSBjCj9IywxzuoR045IZ6hR42qBlnpm65I0T1TTa7tOe3VBe9Y+HQUU/I0o8sktP
-Ls4y6zlUb2XOMi97sL7KnOVtuTnL2FFkk+As44sk3X9zluFVVVWtXJxlWNXONzjLsFDKu0HLdMD5
-iG7QMr20rM2YIASlQWVuwixzAz6yG7PME2MkOTDLafckCcwyS0E46F6YZRqruzCIpgaLZithljno
-sRjlxizTwcwW6hetKJJKtjdmGRaVKdyYZS6BNWcYs5xYCFek69VJYOxg6cKNWeaimHro4CxjJcsa
-kMAsK6lb6huzzLgJSR2BWeYSSd0ijFkmG61a9nki7jm00oFZJhttejM+2hwUsBuzTDUJo2PGLNNQ
-DFVmAI87CvV8YZaRsfT9N2YZchB1bgrMMrbRDbsxy0Qr9hjimepcDpevYDMtx2BuyDJpWqys2du1
-ZqF9UJaxbtTLc1OWGV8m6zEoy/Ax5WgEZRmxA8XBbsqyuEZzHMoytX/6BE1ZpoVS+puyLCVln4ey
-LMYVYSKmLHNPlVldlGWGyAO2vSh1T17tBGWZC0nBwy/KsuSTax7KMk8/ilZJWUYAS/iLC7IMo39R
-kGWGuXRihizTwoDQDVmGVaw/Q5a5me6FIcs8dnJbiQ1Z5upGbJZgXJZlNJwhy8dwQ5YvqyHL+AFF
-WQKezHCREvgXZBlLRXl3e7vspVUwlo/hQixvYxCWuZ5Trt6E5f2+vgjLTD2TMBCEZZa8UzUQhGUm
-D6N1xtZL0rrsC+qrR/aQqyURlpkDjD+jeEZKdT8Ncx2bs2wBWOY2XPHegGUJkmc6hGUHOeYhLDNS
-NT8BlontfHK0K0jOCxH5EIBlfn2R0b+62VQ7HgFYhqUXqwNEQm1V7tQLsMzYEIkDAVimRfOYAMs0
-SGhwEZZ5+5mxDsQyU90UrAViGYEAVXLeiGWirdydgVRbqMy6ugWasIyxTu3NbsIydR05midwFIDr
-o+y6CcuMmZSU34hlWMkE34hlWviQgrFMCwWKN2OZx6MqJxjLjJyovHrFZbqw58VYpkOb3UvCwTFz
-dzZkmYmENqI3Qww92xqQZc5wq9cDWeY9Y2/5m7IMq160oCzDIqVUUJa5DSVQN2WZVj6qoCyLsDf6
-oSxTRqheHlfJG6WRrKcOyjKUOxxWNmWZ2Rk6tDdlmVFrVtwHZZkFvFQgBj0Z7gRbnL0oy1w5pcu4
-Qo0RUM5tuBHLx2gSFXrjiJdjwPIXr/67Lhx4u592MGpYMxTe3PRt45XxhMvUIxZdubvb2Auu3M1c
-3Wzl7oDxRitPoxpeZOXpyOAGJLtO/ZCVZ7xzN1h5MhJ37yUm7qYqT5eXvKDKKBqj8slMZb4hLQdS
-GaoRRqpvonKAbjdQGdotDmkBKs6uf715yrBNM5bVdKGLvxMwZeaRVnmzlLMrZzZLGQa20wqUMjX1
-DolvGBrp1FjFCKWMjhhjpesEV6x9L5AyChcIhg2OcuCRNka5RKPnm6IM4RRDxAFRpj64zsNQBj5p
-vQDKpYUTaX5yiaa8gU9mgskJ0E1PRhpa2SnDk1ER0MxYZlivmNZxo5NhI40vyMklhH4BTkZOCtGU
-FzcZpTDRN5fTK1INyjj6DULRiQjZFzS5BssxmMmM6q1xkMnQezBLfBOTkcCh1x3AZEhQuh15Soq6
-tXMvXHJ/goRoWjJ2Y2Q8YMk4MENzNyu5WbK2Ucktem4GKbl5lnqRktHiLhILJCVDw8JUnznJyD8P
-/fueTbnKevQNYfU7TGIKRjK6qneFxXfFBJZ9OWRb+FiGKVibj4y92A/lxiMj4KIMounIcAzIYA84
-MvR1Kmm52Mi41u5aCEJSKVBpCqgzUAXpAQPMNxhZFWP12+YiUzPgNA8zn13gihcUuUdLkGAi7/L3
-QCJ3QzFeRGQ2UOGxDEQ+xcrmIRcXwL5wyDXwkEFDBqGXqcaAIbdyQK/BQiZohSsWVeS3aHoWJOQW
-atUbhAxjIc7YHGSyV7h+MQYZv8W2FDcGuboYY1OQ4aWpM6QTkcxdLy29NgMZWQzmhQOBDKoNv7Mg
-IJdou34DkMtu3mf+MSo0RNI0/pg0MzOMN/14w4gCflxGTH1OzcFAUOuNPuZrZ2kY5xWw5SjfDvDx
-5n3f3GPUlKne0EU5JXtaEvU4IyFlZPPVXMhxqmAeIy/bvJV6+XWxOG/gce5S9W/eMQyE6At3nKMx
-5k07/pjmWV14YMfVZMhgHTcOqKrx26hjtlYII+ZCzA8scg3SMd7pbFzxBh03VLo99ZQVYtgc/ISM
-OUZ06TEfeVOOF5Oh6duGHFd38t6M46ES0Dfi+GPCXBa8CXGcPC0H4dg60xffeHIZZSOmLcnwREFm
-lmwS7OukXayLARNJS4pqwo2nF3IBN444+RttLN3XIRuPaFVgsHGOFrcvrnFXlcXBGluYuKnGTAKo
-TPFAjZn0iKpELH4NHd1EY7wVyaCHDTRGSdgy14E8Y7zPXojoK+HYpzXNphkXe00BM87hAwTLmDXq
-HnEDZYx6t65qS3pKWNTwldwcYxScGaV8YYwt6Q6KcWOQIB2IMVdVLFO9IcZSkIxyIMaIoH6s0/qh
-GFPO+YQlZE/UisZ2rCGApVaXi/HBffW/v6d3j9F3xELaFOM63XAyIMbBKtsM45ZDSnshjBFAKKZO
-0qsG7oJqngAYk8BRbQipPJAXahJcNwNDUNWgF7fsTN7FLm6hLTC6GOlW6j2DXIwcpTTgF7i4NeN7
-HDuHWpQejonE6D8cib3AFs8UyWXZiIit40CLV1IA4cUshpFVE4EsXtG/I4jFALl6g+2ir+Q5NXDF
-KMZS8M5b4R+YjrthxXO6JXKwijedNxDEQFPQvbxJxeOxRxNGCIWZiwtO8TbcmOIwbkrx8Ay+6cMQ
-8XL1e0OKIb5VIMfGmQwnFaL4/HkRisO4AcWEK696+MQjsCI3nhhiZJGBTCcezRnroBPDMM3TPV5p
-9PoONvEIdVKAiEdzDvMmE4M7FUhjvN4zsP/BJcZns9G7gSWezc50YIlpKBeWmPHr9IYSzyA5mUk8
-3Q4skMTROvwGEoPDqOy0ecTQZDLRaBwx1Je8hzeNeAOzAkZM5CLTYWYRT3+oLxQxSpWSCaFROqcm
-pkEihiE7er5BxDRiJgoOMZhOVJAYQ7yKHcCbQrzutojwWIh6HulAiFlyl98IYuC5GOIKAjHS96rU
-MIA4mq2/+MMzOKqBH15eVm36MKsEiSM+8GGzpjd6GCe0+gEPryLJ7os7jM+NxXKBHV5RChPU4esw
-mzk8IyEbyOHp1NTmC8cw8AIOQ+0qorF5wyCH9XFxhEf1WHrjhnuwf8OIrDVj3QEbpuZ81jdrGAmk
-x02HEerA38lA4ikBhsumL9AwElNROi0a4qOkw8YMI8XV3Ktua3m6A90bMtyjsCwYw9twI4aP0YTh
-brjR5ttiSZtMs92AYUDxic/1ggQFTYFepKdSXZT3gguDHKWidrOFseIRsNJoYayFcnqDhbGaSqUf
-rjDWXIEf5ldWLSZ4UYWbRRkbKgzMUGsHKTyCbn2IwhA0ESkZQGGuzVzaxrJmkkvLfOOE6Y2ldmjC
-Wsn2AxPmWnfkN0sYq+JlNDFvNQwq6DdKuFqZ+SIJAyAV583vI/JgmyP82dH58Ts6Uf//wwh/wQP/
-gSPXb3/vH/3+r+8D40B/8Zf8nz/5v//8F/3AT3/x8x//b7/8vzp2e779vX/2y5/8+W/s9T/92a9/
-/E9/+cuff/n9X5/tf+Psr80/jv9nv/zVtTWLnj9GjT/0G//8zz7O6v/4sz/963/3nzr8T7/8m7/+
-44979D//5V/8/q/j6C6M+FuP/r/88mf/9t95j/aH7tA//ctf/uOf/fI3Hxfw53/1n7npP/uLv/mr
-/9RJ//O/+PefzvnTs/yHP/x3f/8flT/+h7//U++Jvxv+/uN/8he//6cfL9lff7xnv/udzP/gl3/7
-cbTrH374J/8e/zL1L//gL//DX/27OM5//09++Ztv/uNb+h9+eL79/Y//+1d/88N/+OEFhn6+/a8f
-//H/fJj+5lv99o+//Z//1/PtT7HlP/vhdxPZf/6/X/cfrOP8mG9/gqWZWfcHzR+7/HQf56cffv9x
-7P/9BzjXTHA90J9l/QeWn5DmDyh3AQP6WPJ9rLzwHx/jcKeFsbl/9Sc4JqV/qPtC7KWlj3GGZwlw
-Pkq1jxlGY6/Q9A3hnfrJONUO7ucf3mYIdz5+4XVUMN8/PNhvrzMIow7g2pr3tkvBp/dRj/F1Bsd8
-ne0+6n1dX+7Bzz/8mx8AVlpwMkEVZT4M6p6CqZW08A9Xe6JE4mP5i0w4CpAWijg/7mt6vv3j/Qjh
-x0o7+STdXMgx4EMfM4ztY4UNDSL77H3MHp+MRekPXtplzqJEvI+K2OnHS/A+Axt//u0T+/OPK45/
-YP3TwMKQIJ04drnNPgssWVHWg2BA+mQs0g/tM7YZsJLcv72PioqwUr69z8DGn3/7xHzG/+0F/sMv
-cJ01m5Q2GUn5WHcDYYNigop392McIAywPwOxdcIDMFhobEDPSmTxP91ahEBRm/Q6BdZJYkl0n+xl
-vC/sMp+bcI563a5zBq9b25fWHe9bS8Lj/HRrj/F1a4/5Ott91Pu6vtyDv+PY8LupEt3+5ZVVFdB8
-/35z8vR1ppfxvqrLfO7AOep1r84ZvO5rWyK8vp8BYiL50yt7GV9P9pivs91Hva/ryz34Lq8sBh2U
-k3wavwZzqrf5d9ONvMp7/LqM9/h1mc/4dR31jF/XGdzj13CJyXtbiLH756Me4+sMjvk623PU67q+
-3IOfNVR2933/dHNYV1E+HQTTReUXcv3cZbxP7TKfy7iOei74OoP75mDGGwgkvrYlK2p9Ouoxvs7g
-mK+zPUe9ruvLPfDNOXftNVefZ3zN1edtuObqy3jP1Zf5zNXXUc9cfZ3BPVefZ3xvu9+G+6jH+DqD
-Y77O9hz1uq4v9+DLm/O6OecZXwc5b8P1c5fxPrXLfC7jOuq54OsM7ptznvG97X4b7qMe4+sMjvk6
-23PU67q+3IOfP3sgmFbmxzl88kDC/PIqMNvk8cktwWwjPcbbPBRPf/s1CCnX9Wn+t/GTB3Jvu72K
-+6jH+DqDY77Odh/1vq4v9+DvPk2eqfd1X4+jcP3+cSmuM72M91Vd5nMHLqfm3Ktr8r/v6+UoXPd1
-uxT3fT3G13095uts91Hv6/pyD77LNHlm39etPb7CdQrHq7hO9jLeF3aZz024/Jpzu675/761l69w
-PYbtVdwP7BhfD/eYr7PdR72v68s9+Lu/stdnAJVp+ToU2Pz6vNGRJtkjOMYpGMinoQ==
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- J8upFPSvSJK0CHgCE4aXAfMigaNStgFCmNBoYKvEclXUMZgrqZAq9L4KNNNSBQJVUxnmGEJsIxlG
-xLbzztbUlgSiJhOdOATajhXQRhRAG+4utdEOvi2slKnI3NbVlayms9wykNR2xliCazshMqUqdpon
-aSZtBYbYPiQpvNe2106KNILY+SiKQkoA5cKig+kvAa3lmTRuCEmgzbWDtZdrKLyaa7py/Ubl9U9r
-1/amiSoLPaewsjWniCuAnk9guZacR2RBzfMIrZgikdi6tjcpuK7tzS26ru2dS3jZaucRX9f2pggw
-B5xbhGG1cSFmgZNi7NreuQSZrTYpyhDX/MLM0us84uza3jkFmmWac4k0x97nEGpuRp1HrNmaUwQb
-QM8h2uz4zyvcru1Nijc7XBMC7treeUTctb2u1V6vr3d73UohNco4r+zZ6kWRFpbUgoO1rU6HyCzR
-LL/ovADpRxA7pEWW4uy3csDOKDENRPV2UJ20zJJOA8EkL1BoUL1JCNLMoG7gWzAJCbVwEGF4JiDh
-9eN925m+BEySIMCiHttRmiRDAIaXwNBNkCIChiaH2tNgofuhPdNgcd1JsgRY3JhJ0kSsg3R5aSF2
-0zgc2Rtf21N+b2R3G+kzu8Vs9bvP7Z5jMOyjz/+F3ybZN0wWhISy/WEoklRub/R6ndEyXTAVPzxp
-N92+FUWZnaVFJbNTTFv5myk737GHMpNu23L7eavecUHetsIIvmK303ZZUO0+6WG/3fyx9d7htduu
-vbWCuIB3YG7vNGU3tXEyHPa6e713dnsXb6a+PrF02/KTbMYGKRvdHyWVN2tWYiSJgDUW5lyOX2Bn
-w9+smJHu96pbKWSSw5oED8YpaBWnlMkK/gjYXCVY+QuQ0JZMAlQw/Nyhd+J3KGlXDfud6qsKYrQ6
-Nb5hZ41eW9jdoS8OzYlaDkpVYjufClvxCD7sICm7mluhrBUs5gkVt99cQxLfTf8FChpogW1xIkGK
-Iw4Niw6ihZ4K1yD8Ar8qaSpc1So6FUc3/4oqouZmJm67ge2BJ0ICr3CYN10HdtY29mEOvOzCDr1Z
-edOvN9sty8TpDRzUagEDLKLTLqKy8Qb2eQn8A0qNbY2GTTMC7OtyYVUTK72zyuujkYJqakEpispG
-oyTGjTIYhSWQxQjDtLGx9vVLy/F2OVGBTSMyHcXE81+qU7/FlB8ZE6Jn1RN0ZDgnxtpxwWZgh8lP
-4p3OWsRSgc88hxCDxEMbD3nUycasQZalB9kWsppeTGmVVHCJHhvkdGpBafXQsUGejXGjDEZh0miQ
-L0Byi1KSO6toSz2r7V6ckN7st5rtYWWz3m/OFNKfzOwlNc5XO2L+m5sqssCNn3SiWxAAH7QX5LDV
-SlHld0/2wepq/hH3LfiFkfkvgNS+S4Jm6T5R1NFvURWHxsn2gH3kzb5B/gthidrve0VC367JtvgR
-fho716y6If2nFWO2sP27ibSwX4AU4cdqVKfq8EDJIm7bxBO27cAXc40+8k/akRo3Dx4pfcG3afxE
-GlWxMfHPcT2PbXMtesnOyCuhCVaMLpB6ZDWjit07CHFx02yrPmxtt1ud5qQ65KaYEjrDSZaldhlS
-8ZfEqMxqt7ZMYneo077gnLMzsNysM6h6VLVbb+wAAzMY+jA4YBaZUamGCa6kzhSfVbWasVXJrRSo
-mdRINTnf7R4OsJsKsphxy4ymD8eRVrtbg9XXNQNfDJ+gVSv+0LPVC3XqymN/gJVLVcIyYAW+tlLf
-bv3sgpPAfkRNL1HY/TusDKfi2Dgdh5WGYW3B/hxx9+Azc/3LQm/PpUWd0sT8zG7KM7uZn9lNE3Xz
-BHsGmnkVLBLQU1BHfY/pU8zuqy5CZ7Opnc2BJeBTWG3M/tG+k6BSxT8U2vdsssLG1AomHi/7i3S9
-kK4TiWu7/5Cn98DKXzV/JyJ9RaRjnSlO68wpFcc7pVynlOuUHxD/cQoLYqfSD+uSHikgE1m2S/q0
-LqWe3YRnN+HZLA2fH4vdZMxuZhRepJO9kTG3jZUf74R0fZCuC4lruf/4iMwmZ80YOWPGyFkzZlon
-nLvSMZeoePL7j4/GXPKs+SJnzBd51nyZ6FLieEs6FpKOoxL++Eh8ZYp4ULJRuK0/3hEqvzGt/Fj7
-JTYftVvkpsT//XgsNdp6M9b6yVkx2npzauvRqoqcIyuO5u7vx+Kl0bZH3O0aPzkdRhs/XmGk9Sh/
-jta8+FH8gRZX9/ExeEfPoL6eQX09g/p6sv3AOwo5RSHXpP7vR+QdPYPz9QzO1zM4f0rrFbbe6ZCO
-5u7vR+OdT0b5l7yh4M13UiukFIJdEOBZEQr24FbtFhg5krHaFc8UVsGEU+ctNlxljmhdoVVG0Iek
-jZqorB/jq7MKK/WwhfCRKob0+1ix9+r+DPqa0/X1MakszKiuqRxPjCsVqJZOFpWJdqptOazjGscM
-rMKYi7UXldvKwmZFJPQnrTkr5cVsaPu942bvzynmfbQdJcBEc1j5BVn50dSpwDuk0Et9NAHZYUhV
-1zL8EoFy9NpmaO5UBl3Uma/uSxBgcw28yy62oGBEbA1lGIQF2GIq4A4QHXARLDTzNBCjotcVvgy3
-iQAY3oEvKRgNdY4g1HvCOk4yMEBNZdmRQM7K7Se94fNWo9dv2tnruBC1a/uh01zUdKphaqRFoieY
-bHP90UM/318c9PpHlEEIecvyYLO339pbf1Ts2UbsDt93Wnvh1a7UdVhATGIKfSPEDG5srDcaJ0fP
-e0M+Iet5Fdr2ugkiR55j62xnMfkzUTYS1XNmOxjtRFldgECWIVwZU9P4AwMCmRkUsWaAQUUccofY
-fvEcxnyYMz/pwNCECOpJx4eZH+6C6gPifHxabK7lE3OHINQJQkq91MxK3Kdx2pSzV5zCO07qC+TS
-IGr5i0QzvUnRA2G/COwOLgAQ4QIhM7MqZRC2kuRRLVgJ5n3TRok32ZV+5CV+aVjNshmz7OsZi+aK
-Nj9NeBjHZ+3R2sTUDhOZJ/+YcJgQIPF6F4TKVNikhBqXYRNy7gzZFy2Bp4BYsk7I3nEZNFUsjcuu
-IDIJMin9xhfKMr7Os0WbmSVwnEaZkcCRkWgTMwUOVlKSRZuMRNucb9oo8aZCjr7ksxRtpzu3R6Zv
-2LeBpzTLwYujUwE+UW13a2g7V3mqBfwQ/p90lOJ2jiaR8JPoaC2lmSx4XiWg7GO5zpQqO7PUveu0
-10lKUWhx/OK13G7ABH8k4IHyHxe249lud47GNjq82TlljzPufYNNjkgh+NV2BZQMdAnbPWpN5hDr
-5kE7AQRfMBp2hytOAYWKB7jxghDOpMhRTZVaosuPQCD2MoG1RS2HEOpJCFWbqe1lfoZkU2eIzGsQ
-HwBRp8IFH+maSXOMUbIvgODhXOQwhomBCA9hGVOiey6DRkKgcqpqqczk1KpSQItTK6lkZgWK0hlI
-KgiEzsEZr2qZNGrGW42u5YVCWwFEmUoJUtHUjAbrsV28lEiTfEZVCGY3ztAMSwgK1FINFtrKb62c
-izEpBBp+tjnIKMiQWXrS4/rgLX5j08Bmp3183IZbZUcsBlvtAcyfpgO//sb+ObH/40Eoy8OtO/SA
-3P28PsDTU3v27VYePkSZ3nrXxvPK7yuvn1jArzywVbSw45/fIEIiBevy68PZZQDkyrn/8ohTsgpa
-mKA517AtW/Vh/Y6dMNKsvX70//3PB//z//5v5j//D36f/fP//d/F/D6j4avfV7//zyLw5+m/nzW/
-PuwfEAt2QQahAHLsexJbFsZC68l0YRlpFUVl++Tvv99XQHxG6/61PZCzvPrvvb7pFIf+cEwv2Wl3
-35IsZRH7qPuu1R8S+C6+Z2/sDU7GSRCqZykEI+H1L8dVibHge5DlX59gE9ePsVFP8e8bAE3oFXBg
-ZEKziICRIhGqTwXG1Q8QxYR+EQGDPuHC80d1jAALWsa1PatnQK/m1TSsnnluXcOqlufXNuBkyrn1
-DTg6dG6No2Szp+oc1/a2kV9wR4dWmVkaBx2At7rB+qPK+smwV3ETr/13K+wfJvZnT/cHrf67VnPP
-atp7rtAgmhfhtE3hT9sEh0HCEadJamBLY79IleQ6+gI+sQyCocc/5zpvLWCLBmfT7BcpCxfAEMES
-iIK0n3niODzPcoyMFu4XAmw6nTpJswDbQZgUWRZXlDU7OHmEOwJgAxwqD5M1AQO3MwpLDTofCLn9
-ojLjcLkmEARwCX4PgpzvwXUnVOQeM/IIgk3YnEIrt8XwDp6qgUhFnYUqR6MwhxgsLkLFLze1HI+j
-RY2287jQeT7SarAN6TzublETxpg0Qh5DqNUBxq0egflx9Mh5oLgJ0RBTS6MR5u5wxdBljzsG0AhP
-0ArjczP7e6bFCAVjmOtkZuVvptKIEBkIhMyMkFDVVF7E5NpZw1OriYnIaiGFSeJxjwBEQAYF+kUg
-7CIjZirw6yPycTMj+nFnuGbosEceA4h+E5RC+gGrw8nDmH4xzLN2TeQ0kzz720bk2ei8gelmV8YR
-+kk4yWwiVrUQg7asgD2GEAUDLJAwhmE3GTlTgpsQSxlqaixlqENBynCnScpEAJYy49QCGsqIOJ6E
-MQj7aKWMyFVEBsGnoZl+VsTY1WhU8CRw6nWEphBFLNM8msIjEE+/CMb0G4FBFwNyokJoQqAftzSQ
-j3tDoNBfhzl+9rSboBKQzi7AhR4lXQzC7imLQcWUsoqAyPSI9LP6SZpIE1MutV1J0ohwaU1nVocK
-iGOAJ1sAMdViEHSN8VLf+d2BZNzCQDLuBYFCPx3e+NmTbII6QLLcSgSpRpaMGIQ9yyNRiX3PLUqh
-85hkpiZTk8YUM1ZPMPFSaHUvq66pgDcGeIoFEFMsBkHPGC91nV4dCMbtCwTjPhAo9NKhjZ89wSZo
-g6utcMejI4LFIOyYEGHpdtNTWNUxH1keBMyfbIRi8OY0FoLQNDzSzogjgKdYADHFYhB0jfFS3/nd
-0bSkFgaScS+4GvfT442ePckmqONWBa+2YEaK3MQaXmFVxtzrAagSFTWrF+RBwaPnSL8jUKTehVpe
-SQt4PYDeHSl3uEPSJtbthKR9l0dsPzPjFxx8OQGCYkeQSK8LtajnjDcA8N2bk9RBkpF6EpGMQNw1
-0ny48147ikhGOlREMlK0uBapYoyXABHJGBRIFoFc1wgxd55eHpHMtzAiGXWCa3HPCW8EIJKNU2dE
-d4tIRiDuGik73HnSiCKakeIU0Yy0K67m1S/G658jihEkECxAXL8IKfecXhzRi5oXEYy6wNW434Q4
-AhDBxmkzoqzF09KDwvTx62yYYF79iQhGWlJEMFKluBopW4yYABHJGBRoFoFc3wgx955eHs9L38R4
-YvpuhIlJfeeJGQA8McfoE2tngWaSKeR6RtoMdZ0UnkAwVosCwVh3IhBrV4SWAYFgAcQEi0HYL0ZM
-PeeXB4JRCwO9qA8EkYF8iDV69sQap0usjgVaEYQ6RWoM9Zo0nUArUocCqUhjIghpVA==
- ]]>
- <![CDATA[
- hJOeA50YwmSKINgfwkn9pbcGGlHLAo2o7QTh3nqc0bOn0Tg9Yv0r0Igg1J+cxb7rLyk3gUZeAQok
-IhWJIKRCEUp6DiRiCJMogmB3CCd11780UIjaFSiUB8GNEO6rRxk9ewqNUyNWuAKFCELdIUWFZ5zX
-ZQKFSOEJJCKdiOt4nYlx+udAIoYwiSKIs8t6nNRfems003zLAo2o7VyHeks4w7On0Tg9Tj/U+8HO
-ysTZtj+azxLCZuyf3+C4cppM91lyGQC5cu5vCZ+lHbwPdVl6twr993/h+UN//J/R/+jb6p/VP/zP
-FB76n4/DfbN/PO8/K8fgVMcgOgWnOTbGoKVdG96dN+bccNBzuDdcxXEHxxh0DhcH1Jxwcri+nsfN
-MY12LskXjC/5rHJPbO98BQeIrTjFBTIGLe8EsRWnuEEs9JyOEKw54QoZg5Z3hmC/xt0hCDyPQ2Qa
-7WYTfZqjZAw6h6vE1pziLEHoOdwlWG/cYTIKLO8ywU5NOE0Qeh63yTTKnULlKe6UMegcDhVIPDnp
-UkHouZwqWHPCrTIGLe9YwY5NuFYQeh7nyjTqzab0FKfLKLC02wWSJU46XjCF4rlcL1Bz0vkyBi3v
-foF8nRMOGOjq/C6YKVSbTeAprplRYGnnDMQgT7hn4ADmORw0UG3CRTMKLOukgd5MuGkAOL+jZgq1
-ZhN2igNnFFjahQNxMONOHEyrO78bB+JxJhw5o8CSrhzoy4QzB4Dzu3Om0OoUrWLSzTMKLO3osdUm
-XT0InN/Zg9XG3T2jwLIOH+zNuMsHgXM7faZQ67Q1bcIZFAHncAdFOnEw60Qq8TwuoUj1DeadUWBp
-t1BQhoOVJ9KFxRyuoSnUOoWwky6jCDiH0yhSe0cIex7HUaTcjhD2PM6joO+OEPY8DqQp1Cqh644Q
-9jyupUjPHaHs/O6loM6OkPUcLqZIwR0h63ncTFNoVUK5HRUE53BARYrtCFnP44SK1NcRyp7HERVp
-tKOi4BzOqCn0OlubjSk7v5sq0mRjsp7LVRXpqzFZz+WuCipsTNX5XVaTdDpbfY0pOr8zK6iuMUHn
-d2gFDTUm5vxOraCzxpSc37E1SZ+z9dWYkvO7vFhXjQk5v9srqKQxIed2fQUlNabj/O6vSeqcraDG
-dJzfMRaU05iQ8zvHgg4aE3J+B1nQSmNKzu8km6TPbErOzIfwqaPu89NOGc57Jvb73lFrPG30WCT/
-p8odnWY1k+KVPKkoMLOxtJI1hVtk8MochSEFBIIbZrIU8iKLdDYI7gVJNKbHwoPS7oSFBaYpBnS4
-d6L9L5VCuuDgoiZtNypYymWgllbhkU5rSEAxiWGIDc7AIKDIJwFYK8Fj3Ig7wjzeZ4wNSVw1uOgC
-yUDJFDxgZy1kV+AW5j6h/BQQV6si5jydAgGFK8nwIDqTSdi9mykwVbRvUSg11saFywgN90hZ+adw
-JotKZmpGQTIHBVc4FRd3xPxZvdvq7G12eoOWuzzj6WRyrXnvz+DMWhqHCkwalknAUF9xSXkLHxDn
-Ls0q8D94xJuB4HgShuK5dM6YosP9QjWwBKapqrgcHO4tLhjXlbXaSSV8B3yFS+8cvSl6Y9RQypye
-Y9K53JYSuGmAzwzyeVh4Du2DD+wGwauhcDXHd7qcfDv4CT9Jd+uSq+B+rObYj2qOjedfogq5o0d+
-Wrq70pdfCJclfiTZHJ70kuP3IoipBaVIxzPdzca4UQYj3Fw1cfmFCSyGtHHZrEfoXUWCB7J6MlUd
-ncIHD0k0UCMjGP8NZUJFN5QOnx/P6L1Rc/xgfujVFZCDWCajdILMT4UYT0hYTC0oRTI+RLMxbpTB
-CPkIp+WMdGkbPzgBiazleDDUym5QJH08aybBFkq/YYhkLm2L3W94QQB9s7+kdqwwnm8U1alpSUyu
-7EJUKi1JlRDSC474VVPaM6XVodAEqlPaKOHgpyiyD0mdIi58bYP07SKlP9lHSxG5MIv3p+pgmeW6
-d/zy+JRbruZNgsn5YVLMRwU2Gsz/47KSoiKVhq+Sv1ajEtU0rxl311Q1g6ygVb7qyj26yGz4irHO
-+C1clYWV8QYtQIkXVtG3HW6We7BF4Qos+zCCw6PeXKPX7axF7QCF11eEJsYdpbUeCFBNC8Ry5L/5
-y6zwa7g6CdJd8qVKjgR4oZX0Xz2R3BVMrhuJJxFWxHqAMyflw78WmsIt4BJwexJm2HRXKhExEqZR
-QiMUvrlmcON2oqFNHBEF37LFvYOmULc3qSEf566tnC9yyDBfIozMjNu2phadft/WTKyTN25NLzrt
-zq1I7YiJdhRTM6JxIHwYjGiMAq2J1DSkNOSB0cZGIh6jqCEfrlzALVZjK3wmHOlGbsaCBPR4DcfU
-wlKaiYzHp2LeKIt59JasMMWO1sbm3ti8ZNatMu+Oz7N4Bvrh2oxmazSFq9FwzyC4+JCLyPIpBBfu
-btQZhSXcdlviQrJ8CsFPxzxK8A9S5mSOwwrTxQ0w8LVw3CvhcricoAec8dvTDP71NwrJCGHGoz91
-1uHv4Zv7+SCMJN6TytXEyEiPj/nB4qSeS2uFyXRFS7iXLbtA3cJqmMPTFYpPZ1oDsVBLFFzPfLTm
-8ptoATcXy6KWJgJ3XCaBq1nhfjD6jtfWa20CZIchYDQFD0sEAdXbMjEk2oUbfPGWbrC6eDbRzt69
-SWxjtQajwXaU15JCObtcoY0zuGGRCQDh2HHpfEfeUh1vR3W8qZtr1cn+VOMOO+vfKEGqMbmqMSUb
-7qY6u9NQuAWGC+ZULbU77p/dXXW5uz+ZcUKeToyC0/R10/fMP1JHQ8enPXLhgActi/E7oteHZrm7
-76i9cVfeeVXNEtgojOexyl2qUzxIlGQYS+UhOwyxyxTaxncmq7lzW1wMW3/EEBxGdzjY8LBGz9Fw
-zAAQzp2Jt6D4gzLhtdWRZ8IhILeo4JeOPcbo4Po+jQT0Is8/+eEwUNGbjqc9c+lqQIQPNZWlBUGq
-YBcG8yTeK27CkOFDTcksEyDlxx8UNSVUH8Mc3rq5aGZavLgvs6RWwjU/Ty/QOPt8d3dEHvtV81MK
-Yrh8zc43NGwVae4TwziQna4ZrExW2JhUoZ8sR58EWMMKga5cB2jgpQaZ0KFI4b20jIQA9KLGGoMs
-fnf7u0cCDciFCO8hQGON28JlqLWMZLxHjZlXE7x+vPPy0VblTuV6o91vdFp76d6NCh6psCNly9sf
-R05V2NGw8smqUuBC1CZL8baTpJbmwqpLDEPfTiZR1hm4jD5Bl0uWgO6a1fJCggxO7WCCaznFQc2g
-b/BbAvsHWzZJPZ3hUnOLzu51XEShVvBTAvNHCekOsTsYCE+jtXMG2bbADXv2SwGRBhX4NAaMZxpX
-p/GObE50DSRNAdfc5zLqrp24dkBVVMrKSl0kwIi5xtGqQq5xFxhtfzM6xTgonYHDrAoT3+qivt0O
-BnwgMUWbsMJTp8g+hoIO3Nppf0nxVuzRBm1ONPGCdLuSAgUyK6cVu9kpDJgFBYwCGpKKQuUXJ1l2
-W/V+43BKbuFPLF3s0gVTHDpsJ7ZLm5TbtbVA53ihUo16FzrxIAYRA53t4poJ5/0WQjnhIrIsgVDn
-pJDGQEpqY/kYohCA0eEOWMtYhU4KADjbD6w5kPzOzi+7jKKMsl+FnZeQuB7CxQCNrW5bAVIpk36+
-mDQBN4B/JVQqwHFvdzOWM1HJsi01BWz6DaQ4xOZAtkPlbtA1iXAJDgtjuwe32GqM9IbIM4kASxGH
-Z4w6HWTdiUNZRXQ8a0qqRnea9akLYZpvICH6amKEADj/GGF05fgouTDGecfJ1pocKYxVm3+sXLDr
-2Gj57JTzjtcUagEuWF1e4hjg4FzbC8PzAcNiu2CFGgRRm4xjXmGDISqweygUH3JJlXNMuZBIyr2p
-06QAjdsqo5kHjqKcBTvAjSv14GUU12F8NsWvP7XYUDWBjn4gtx3pFJcdpRIZgayOluI9EQLuZMC7
-i2SBSwdcsWX1UThSDjuxzG3AFEQf2S1JmuD2KinADW+RQTCGXbBUJrPcVZHaLpcZ3D3toteBkQy6
-6eFUg2W86HkT0zbAmksQWbOabgHjoZEV7bplYLBss6UUPoUKRPtk9h0wufD+jEK5PYNlNSlwUrhV
-GsKFlcXjcp1YUqJBzLKqAhbFyPUEI/A9VSYot7m2jdv58EPqYo2P7Fpr26cDxL7dYiv4+nHY79Yy
-rXHrqTPt863YgcVDZu4WcAsRItdY259istM/g18sD2Q5zCBMOVLkMFPtVkHBvXT2R6wm7bRHwSK9
-sgY3DaQFOgUsLykFvr00s0u//RQoQKx6J4RMeSjoGTSBJLdMwRDgaq1hSJJUgtMhhXAcDJpxN2LZ
-4c5ABwGTGeyuXOr/rAB1VdcylbqctlYQOd0UI1NsJfTTuVh+5cLFXB14YYKHNizpBV4L5wK5IAOE
-QGe6A2EAEIyQyBxIO2EHgkaEEZkYtM3JcTw90gX8nnagBGRCLeFTzPAOvrHlZ1FUKavgg55nd2dp
-YVkpg6Bw5UwJUl3gReu7hz3MM1HZrPen2M8+uelM1FyIIZh6vS0hEe5CtkSSNSER0bZfGhdUJsCs
-m6BrDRpWAMTtKyBEDCIzwE2eYCQ9QHI0gqEdHfieQbCsuJw1FmIw2sC+y46FLPwzrCdWF7cvTrEG
-AHyyM9c4guxEEO0urvMggWmWC9gQOGNPoaSzbfujlu5OrSqZnMEXgKRhCFj27dTKwaBGMMhmLCF+
-w2IuUkRIALznBtVNBtkWgQAJaMDw7NC4V9Gzs+S5bmT8dg8CS45/dEePMjqOaiUTLjIatgUp9hL6
-hEta4ShuFD1acvtmeIBvpp0Adt+j+THFlzbW6Nm+HU6gcGXHOSNstOkyQBUyRbmdOFUConDsThQC
-WWuWX5UL53IQHKIcb/+lepMQxgRCSvu9LJU7AuFr8kJENQPEqpd54tIk+moQQp9YXSeGcUWwidXc
-mU0rXzNY2y3+3GOzy6oxGBXIoNBYqjcJIUyU6w+XodB8BsG0slgjXpYYxBhPxoB+ApOX4NXcz07U
-QOkyFfcC4+3GCq7fqdjZZjSuN/45w6kEGwoPyOkNHgFyPyoa7hX+GU0OBpKjUwEByi+EaDIGAoR3
-EIRa4VFQI8e6AdYXW9moqGO2apEmXAWUajs6hJAe6Y307JtElX2TPW7uEXidwGzqAanAV1BleiTc
-9OxfTZV9w0bb3Vgow4Jtk7QqmrJqlwFzmNUmVII2S6MSeXGr4Yv6/ka9Xx3W9ycDVOYJSkHXPfhh
-j9xXdImjVppiGCiYhJSLBYAv6LRBeY2P6NvD1YMeoZbK3aMdR1eUkDJAO1T+0c5ML7qlmgXBKtFj
-7hZMQCldzAnEG3Br8ClqLD7DWiCj77aq8I/o/SGc+OCaWHWSm1cWNfbkmzXDfa3KR3AI33DlOxjc
-+LmwMPwRs/2r8YAOvCQsP6Om9PJwzLc9x1s3zvHWKXfNjcV/jHDE0dokx4zwU8xrEw==
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
-id1VbP8XhnbPrg==
- ]]>
-</i:pgf>
-</svg>
diff --git a/docs/theme/mkdocs/img/tutorial/question-mark-icon.svg b/docs/theme/mkdocs/img/tutorial/question-mark-icon.svg
deleted file mode 100644
index c39475e043..0000000000
--- a/docs/theme/mkdocs/img/tutorial/question-mark-icon.svg
+++ /dev/null
@@ -1,1923 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
- <!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
- <!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
- <!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
- <!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
- <!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
- <!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
- <!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
- <!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
-]>
-<svg version="1.1" id="Layer_1" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
- viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
-<switch>
- <foreignObject requiredExtensions="&ns_ai;" x="0" y="0" width="1" height="1">
- <i:pgfRef xlink:href="#adobe_illustrator_pgf">
- </i:pgfRef>
- </foreignObject>
- <g i:extraneous="self">
- <g>
- <path style="fill:#005976;" d="M7.4,0.6c-3.9,0-7.1,3.2-7.1,7.1c0,3.9,3.2,7.1,7.1,7.1c3.9,0,7.1-3.2,7.1-7.1
- C14.5,3.8,11.4,0.6,7.4,0.6z M7.9,11.9c-0.2,0.2-0.5,0.3-0.8,0.3c0,0,0,0,0,0c-0.3,0-0.6-0.1-0.8-0.3C6.1,11.7,6,11.4,6,11.1
- c0-0.3,0.1-0.6,0.3-0.8c0.2-0.2,0.5-0.3,0.8-0.3c0.3,0,0.6,0.1,0.8,0.3c0.2,0.2,0.3,0.5,0.3,0.8C8.2,11.4,8.1,11.7,7.9,11.9z
- M9.8,6.5C9.7,6.8,9.6,7,9.4,7.2C9.2,7.4,9,7.6,8.8,7.7C8.7,7.9,8.5,8,8.4,8.2C8.2,8.3,8.1,8.5,8,8.7C7.9,8.8,7.9,9.1,7.9,9.4
- v0.2H6.4H6.2l0-0.2c0-0.1,0-0.3,0-0.4c0-0.3,0-0.5,0.1-0.7C6.3,8,6.5,7.7,6.6,7.5c0.1-0.2,0.3-0.4,0.5-0.6
- c0.2-0.1,0.3-0.3,0.5-0.4c0.1-0.1,0.3-0.3,0.3-0.4C8,6,8,5.9,8,5.7C8,5.4,8,5.3,7.9,5.2C7.8,5.1,7.6,5,7.2,5C7.1,5,7,5,6.9,5
- c-0.1,0-0.3,0.1-0.4,0.1c-0.1,0-0.3,0.1-0.4,0.2C6,5.4,5.9,5.4,5.8,5.5L5.6,5.6L4.8,4.2L5,4.1C5.3,3.8,5.6,3.7,6,3.5
- c0.4-0.1,0.9-0.2,1.4-0.2c0.8,0,1.4,0.2,1.8,0.6C9.7,4.3,10,4.8,10,5.5C10,5.9,9.9,6.2,9.8,6.5z"/>
- </g>
- </g>
-</switch>
-<i:pgf id="adobe_illustrator_pgf">
- <![CDATA[
- eJzsveuOJbmRJvgE/g5nfzQgDaZCTtLppGsHC8SJi0YzUregUl8WjUEhOytayum8FLKypNU+/dr3
-mRlJP+dEVuSlJGG7gsiMOHbodHdejHb5zPh3/8dvvvzi+us3//bwRbqaD9Pf/d3N24dn7968/fmB
-1MMvX7787tt3b0H6yW9/egjr1SyVrn9Zv7KK//Tw9tsXb17/nF/xy3tc/ZPrb//w8Pbwi6vD8eV3
-r/7t4e3vf3r4yU/l29+9ePfyQb7/x9fv8NfXX6Sf+l2lmdtn7+TL/LOQfhaWQ5h/nrfD9a9R4dnr
-Pz779tsX/+8D7pRqEtrxzXevv37x+vfHN//Pzw/z4YuwylfyS7767y9++/Dt/vurmrdUsnyfr2KJ
-+SC/5xhAuAohlk0uu33z/LtXD6/f/ebtm+cP33578+blm7ff/vxw8+dnrw+/fvZ7+ebZ4f9+ePny
-zZ/ktZ49/49JeiJ/df/i5YO89Ktn7w4hoguufxniV8fvXrz8+u/57j8/rDWCnL5ik//4rbQlzeJv
-kMtXv3wllC8f3r2Tx5Uboht/+4vj+Bh4Q5Sf/OtvH37/gkMi/fW/fmrNvn3zzatnb/8D117pO/IF
-5U/5rHV+9/Dqm5fSv+yOiq/wn/9hdeRV+P0XcauHL5Z5OSQZiFSrft876OGPLx7+9PPD3795/aC9
-cP323Zc6PMsyz/q/fvPb714+vP3H1y/eydOtIG3aDb9+8/XDS6nfrr9/+YxvzxL6/1rhd8/e/v7h
-nYzrm5ffveOUq34H6eZfPfvzA8Yq6A3+4ZuH17978098xi9CuJKBz/gvRZkjpR62bTuEylukmg9L
-je22of+vraMttOS3KDI6v5Hx+oe3L37/4vXPv0hbPHyR5qpD+Yu3L77uI1nioep/fJOrOvzb/J8+
-srz9u3cPr+0VZAbd/HqYEfPVr7+U+969/vrmzSsMwbdYATIVXsssefnm9/pd+5vfyOXffaPvwM9f
-yWj95u2L12hz+nt+U7/6zcvv5KtfvH3z3Te/fP3vb6af6ML/p4fnsrplQL8+/MO//W/5IOuXs/Tw
-u7fPnksD8rnVuXr24pufvrc5ebm3Dwf9Uq7kR//9/VffPvy7rK9+uVLvXv/x4eWbb4ZmG+XZ668P
-//zs7Tff3/RvXj57/UwYFeit5V+9+KN880x6qrfdaU9oVObJN9I5vIRVTm7wngrDV0+40bN3fxBW
-9PD6629b2/px/+BK+/72vnyOOfj2cHz73bd/OPzuzZuXrdn9V611I5OK+n8b9/gNL3j9D6+1g87v
-ZBVO7yRM6G/uLlL78TvIl3/Lrd88e/nyxe/fPvvmDy+eX7rBhe/bnfS7D5lYf371b29evvj2VZ9P
-A+U3z96+e/H85cOXf/723cOrJw/u4e7rF8LkHlnG763z5Z+evXv+h1+9+Le3z96+eHjv6sMA/PuL
-11/L3P/yuxfvHnoHvXn1DcSYw5d/ePbNA1/j3R/uWfPL1mD+Slj/yNy/+OI9XF9kpOPr4ftfvH32
-9QvZUEQo+8Wbl18/vD78Fux92n2S7ascjl9P/zrNVgLLcvi7r45vp/82zac/4aTEoSQri5XMf15W
-/Jvk11hKK3XeduV6KEcpN1Zuh3I330/zvZfdg40/cShpKMuuZC0Tf5WwSin8XYey7cp1OLZy08ox
-3ErxT7eTfLgj6Tbcj2XsOj6c/6ShLEPJcUWZ9JdIu73UuEnR/6+HctQy/V+XxvKx0Uy78VyGUe1j
-K2Vqw7sMg6yjOo5ulYLfGNW6G99tGGH5f7Kh9sE+tmHW3xjlu3G05X/9mS+OdZx2A51kXPEbI4sx
-XlkqR7mcjPC1lf3Yylji1x3L7cko+k0Tx7CPGYoOkg/ZZoMlAzTZGGGsbqzcstxZuUfxlYWXGccy
-cJQW6/jKDj1ykdyzbyJffuXrbXyVWz5xsCdcOWXkESbeF/eJKaUlramINralo5TbdC+jHZa0LEte
-ylKXbblejsvtcrfcS0fGnPKS11zylq/zMd/ku3w/yQMFmaXLmtd1reu2Xq/H9Wa9Xe9lLgTphqXk
-IjJ72cqx3JTbci/zJNRYl5rrWkvd6nU91tt6V+9lvsRpS9uySTtbFSn/uN1sd9u9TJpwna6X63y9
-Xtfr7fr6+ijl5vr2+o4zKcoLLMd8LMd63OSr4/HmeHe8l9kVJvZ2ullu8o08wM12c31zvLm5ub25
-l8kWOArLbb5db+Xhbuvtdnu8vbm9u72/m2Vc0t1yt96Vu3q33cm97m7ubqe7u7t7zIh76bD7fC9v
-ei/Pfn8tRW55L1fen/zIWM4ymu3z3VBuh3IzlOOuXA9l8zLJf3UoZSjrruShLENJQ5EJON3HVkYW
-1pnvPD763fhzuys3Wib+Og7leijbrtShlKGsQ8nTXW5l2ZU0lDiUMJR5LNrlk/X9+PTjz81Qjlq4
-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
- ]]>
- <![CDATA[
- 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
-OeE40xMZ0Pexo1am9335EeW9PO6jyo8N/gUa/JDolCf/vK/BPW44nZlFys6OYzacqVlFdpkTxzAb
-2m3UDOJSkbu3VzM9ERCigtFksQeV6wR2p/smHS20FY+u7HtKR8kiSAqZBmR8oiUUCzHRea1IB7AS
-2L3VRQqsQKLbOhvYAWxGPWJwnSqrSs1nnZUXTcaGbixkCb7V2dzWWnyR+1g6v3K3VAezUXmaqEF1
-PWlUhEbtZq+QnAqtw48iiG8vlPNsKuoJnt9b4nQTn1yWp5TpadVu1qeW6elV/9M06Gat27Pks0eZ
-s+Uuy6JDNtZbS9y1MmHXzFRdR9qoVtqngqXmOsoso2sLRimYpGCPgjMLjix1YinI/JbptxRanj3v
-Fj1VLf1wLR5NNTUQ+VNSD58mH27phzt2fDIvk3uY3LuUDEIemlPpdgCSXw/ZtbobiS6kyTxI7j7a
-u47ccdSdRt1lNDqMUvcWTaOzaOcoOnUTnTqJHvEPTScOosfcQzvn0Ps8Q9NjjqFLTqEn+IEYm/PU
-cvOUMj2t2iOWqAtlenrV/zQN/shBfuQgP3KQv931+bff4I8c5EcO8iMH+dtdn3/7DXZf98WT655O
-hKu8xKWGja7rZStMqJJljoFSSlbXd5gRPXXhD/65XvCaf9ZWzYGOzDIhHXK4moWHjW70k2+8vtxT
-vlhxGHIIh7RcraHnd3pPjf31RVrNcT3E+SrFrVy4/rRGu76UCz7/kfyJbv942e0f4fZP7vZv2cTu
-TqDJtycQ5UcLd6zr27Ny82FFmzmFIePnfT6XM++QRiF3oMlscPHbhhM/P3qpnsfZuDFxPEauDKCy
-8eTF8dTFk/I310xPYnPTMvt1O5fNBR2K/fjsxlYrXEJCGBbC87q043LslJp2Lo+n8OhJZ+qQbsaT
-zXxqhZGRpbUqpykp4yBs4T3zwlxpdQmJedHmvGxzvPDHZezP52tSo0vzHANbE1lJm4WLHFDLOayL
-oToNz5mEh9aK6/vjfNz1eu/P8iqfvW8+kQVeZIDxw7Gjd4ZnvHDiUcONGoxxctjl9+Emyxlu8hLY
-8wStqns/Ttt8T+uX3+IyiHT3PpO/0sdAKL8X3ic81eMFPndMAu8weUTC+1r/AHjivv0W8bDnKnWA
-6e14w+kXPzjKL12a62k31w1nFk8yvo5JlnRLuGtpXnuS1zwcj6YZzo4Ts2QzpG8I5+upXNeWwvXa
-4vR03tI9pfHGkSpeprpXDMqz0Vl1tGDiO3PJd1hPGuKE4cCq06rBwDDhI+b3zuJ7k+EJMx1ZYxym
-Z0jDLG/ZXU7zu4wZXiKd7zNd8p7lZczzMgSQTI9FkLSzMTyApHoAyeeC015ebU+H057M7Q/NlbBf
-AB9zNfciuW6ekf0ghZCY0FGvFG611nXMmTnc7kMu+rR1Vi8utLpLDtkyoHkOtDEbs8NFTari4J9l
-fnb4agdyNAirXnDXUK/zAA3pl/rF8sMLdnkEb8wTnLiAjub7TbZS9A6PnEN5OXvQX+KCLrqiH8bY
-yNNsOZfy5YQL+XIsV87UAsxco/AQRw9r1B1rV+UDEupYQOPtjtMIr5nsuB2PMvRYtdhj1fS+/R75
-4p3ie1L3tLt1zjadxMVFm0BzY3A6PrQkRmENdzxkaOPpQukYpA9vmTdzlaeIck+cHrTRbJikiTsm
-f8zCAmfaBzeZVFkmV5h49M9RZlwR9p1kad4zyu2aR/pgMugBkZclqyecrvn9wSGWE/40I/zyn/C+
-bTkNqRxbXvmGi3f81mPsbM/QCHifdmkGOrZ9hK+P4PQRY95w3crk0g50eyFf/nv45g==
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- AQ5Vn/EeCvDPiBu8z8DGT0PBve3+vO+jHuPrDI75Ottz1Ou6vtyD77wYed3aazQ4p3C+8OtkL+N9
-YZf53ITrqOd2XWdw39rru71u7f7C71t7jK9be8zX2Z6jXtf15R58z8XI675eQ8H5/fN5X2d6Ge+r
-usznDlxHPffqOoP7vl4f7fUM9ud9P61jfD3ZY77O9hz1uq4v98BTO/J5SOB88ntmlkbm5R8AGQMt
-wsuTuIy313GZj4dyHfX4MtcZ3H7P1xNzOGR+id3wsOXT2ocnoIXDcZgv4+1cX+bjiF9HPS77/BK2
-mZ8jNv9CodZ/+Ps/fQVa/3Pir+XvFn/1HfsUhD2xVrxhf8AY+/705WgnFPt3Dhbi3e2aO9kvoZy5
-IyvWZ7PnAxArvc5O7ZMRa/LaztxhM5HH9dvrqFzpz/ztdQZh3HPHGuPTtktK7/dRj/F1Bsd8ne0+
-6n1dX+7Bd5s78O+fbi29ifLpFOh38MW+TvYy3hd2mc9NOEe9btc5g9etlY+SP93aR0K19609xtet
-PebrbPdR7+v6cg++y9zBqo1P95WnnT+9srzA8umVvYz3VV3mcwfOUa97dc7gdV/xE7X3T8/gsZTh
-9bSO8fVkj/k6233U+7q+3IPvFshCZZRHz7JOOIItArf5dxpx86gxmJfxyWg1ww5H2JxVMPI+apL8
-8X0GKcjTv9NPQLT43rZJDfs+6jG+zuCYr7M9R72u68s9uMIRTZ7vfXM4l7ZPB+G02dP75y7jfWqX
-+VzGddRzwdcZ3DcHM/+c69O2TSVh76Me4+sMjvk623PU67q+3IPvsHzZL0dkKy+LJ/zX6xKuweth
-hfHT63Jvu1+B+6jHWD6/qx8W+zfnEcUpXpZzsPPQrp89t+x1iuf23tvuB3Ef9RjL5zfGp/gdP/z4
-tU8ffphfN6ibGfI2+no/3cy4N++jvuOQPoPPcUg9yU9xSD20+6jH+DqDY77O9hz1uq4v9+DLh/+6
-OedpXwc5j+b6uct4n9plPpdxHfUdh/QZfI5D6h36FIesn2/OZXydwTFfZ3uOel3Xl3vwHSbyIt3i
-p/vaLIx//T5SuXixX2d6Ge+rusznDlxHfSeqfQafE9XvE7sS1aPvOH5MAcQ35dvss+izvQfVy3gP
-wJf5DNbXUc+wfp3BPQV8PbHvMyxszzhcvk+rgzC/PH56gk4OHKM9wU+rA/mtO8jsNYc93LdvbuOn
-1cG97fb476Me4+sMjvk6233U+7q+3IPvE2SWW/y6r8eJv37/uPvXmV7G+6ou87kD14Lj3KvLMb/v
-6+XEX/d1u/v3fT3G13095uts91Hv6/pyD75XkNme8evWHj/+OoXj8V8nexnvC7vM5yZca45zuy7f
-/L61lx9/PYbt8d8P7BhfD/eYr7PdR72v68s9+D5B5h5RuDlS/zIU2Pz6vBkDy5+GAsbL2vw8FOBQ
-aCT0PiqicJ8+Q5o+DQNnu/1h38c7xtdvH/N1nueY1xV9ufrvHCJ43dRrHDincL7t62Qv431hl/nc
-hOuocbOu3z839fpa903dX/V9U4/xdVOP+TrPc8zrir5c/fcMDrzu6PX5n98/n/R1ppfxvqrLfO7A
-ddS4U9fvnzt6faT7zu+P+X5Cx/h6msd8nec55nVFX67+5//y6Oe/+P3v/+TXX/7023hFPv8LYp+1
-oBkrxPD8DzBpPh5CzYRFfPhYx/zT2wxgWe9Uol7H+G3rOcTveW7fQ5j6OpelFtz7zOEG0ixfTsZh
-29Nnta09HwsLGtNDfbvMrDWkmS3aP1+5f+0n+JkV/BByAT7+AZWMffo0PnZuH686zSQwy0g/UD+J
-qgIZiWzQD84S57HYD1Cb9tj9Y0havjSU0cj48R3791nrF7s/Hx+if//jTfMlr31QRfpl9K0hCyLu
-Alv6+I7l5i1Zs63fRzWG7xfGU22ZSLeUmVxE3RY8T58UOrLKiPI7X9UTxg/H/lw+GiP7/D/G49i0
-De9/bsCnB/CjngyKvYuPm9Gr+Vdb2Uqa1qZQvqwj+ef0jcu4Vmybe//2W0f1rwHfkR7/w/OxMNDP
-oa7Ir+NU91Qbsw4CiuvcNr0GQ4i4H2P/MWLLJ3tTdvHRMRlm/K3fjxNLfzSmnjCKRmrxiYEHr4sb
-KiK1EbV/Nq4Wxic2XLy/seny+fa+d0eBoWxAaP/m7/+nng8brdDMfgbxgAhc9dY1nkX1+zyBAZh/
-2wNCl8WV/Z19vFoe6TKbhfilxrrUtj00sHcujCgnbf4k2DLsx9g/5WwzSgLjoPGl1qGzhXHGwLK/
-c1r37yNTaNvc59T37u/zjwubKJfzXWcL+F/D/LR+mX+ymcgamVPVD6KHox8xW0/YhkJ0GVOMj19/
-zQMhCAcoN9U/gHX3q80JeBIdBi+CjTn5q+DwZSMgw3pyyx9AEJy86Rje9OkxupA5YGN6PDowtRwH
-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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- RwGqGJcuvU9WOxOwQ6A5Ale7iLwdDwaIn45EGk3GlpBhTsEwK95ekfxWwGoZr0t5KMuiHpSUV75s
-xs4RtDRWXcS+YOMeOEccMPPKMdiZydOnCje1PddmvqjkmAdy7quCo8u0s6NT/WDyS9yJdUTARvUs
-SQhrzpZIXI0JgZaUKir1CrbyYflZbJ7MEz5eoF3QAiGg1IjauVzo2AJ5Bf2W3aGgjbp2J1sdUJog
-60U4DiHzIJKUtyPlCfsmtAtR90B2s9HRuhxkKguElA6s5cIFQHnqUtIiETl98tQQBpWywyF18Qk5
-uL4k6Te0+YB07VLy7pcck7mMUsD5Ezqw+SGhmHrRYYEFG1HQYbvpq2v2aybGCQQLpIwQXqI4IDlG
-tbPlEwJZhOVV0KmWoPdobw60QJPTKISzH1CWeqVCBwrSO+n8Vh5v6dDST9WNGk9omIejp3j6z8NC
-5kNU1Vz9lHNJwTLsFnxMuE97Wp8rz8JC8xW3XjFW7SKsAJi76DMnd3JOcUXCH/ZjdMgV8hbnmhUO
-Og4V+FXJjOpLDvsTfFQNcmFJGmwM8nNAan1O+cgUCwxU2V1lw2lftIuk2fFgKWkB9fsGyGiWcEYy
-r/QDUJImnYUhNSyONWfmyU3EP9IrQVBSC88oCcdNAliQzieNc8DAYTJBUjP1aa1yQyfpYZ8e1aej
-dtqdNqB+4fEY0uOMx1CInFrgD6lBsAwnljNkv8iLaKcoCjqVl/v8KK60PxGnExfb48v686UJ7Bdo
-p2joOC+AFeWNJMe+TjjsHYjorEVw1q/gFY0NMxoUOU1bRW8N1pLFkM8/5YCGxCOqga6+jEQeHrzf
-8eCw+0DaV/EcJblDNfnGdMpOML93cWhTCp7RNT7EGcwy3pAMMF4NM14kdcq6jub0UBpMJZRvkvJs
-6JQjGLSTfIQgTE30h7tOZc6q61jGW2t05g5feonjeEsr51l2BMxJM0MwzU23HGrFB5+1y0ZWdUdu
-JZkg7f9ElHASVzsxsePBRppxftEu1sT3LKFDyiIjjg2HyrWJdvuY3reKZ7e1oAnqo3xMcNdpN82w
-vgkZduGtiooaMWZBgDPpbILAkAWqr3kM3BYJjrQHv7HfNABQC973kLkFj7+beA7QYX/hgxo0Oz+M
-wCyFntsFvYtc99qlmyC0Rha8gTaU80BGRn6fXgnTJqic7Rpuj2SyKBMjRqw4vFlkCiTlA9I8KLIu
-UcCIBYZkozh5CYFmGYuSwjVMuZBs1420oJwSLPd8DJ3JXQJuz3E042xJCrrR0ZlyW1ry5ksox1yQ
-/oK3Dd48ZUDlTnmbR/kKcpfkxIvTwrOsQdkoibl8HgTtzjD6AXPrkbGimxqL8TkOLewAMqqfOj0F
-gIpcqZl36BsTCMAGPmOihK2p16JNEbmVhPC8UXBiFO2CghyCIopgSH3G1yLhlLjaJfpzQH8UlbYy
-iKBIonVOUSBrkURWM+NjiRDIm0/v/OCpUWQhsQylFDF8dAaAvHGlhBcWYUH8Z6tnXD9YhiiGshBR
-NALmWXJApdhTxoedIDOMJBMtZlMMmW04Y66PNwQgq+XemluA9YDTTud0yBbS6Gi2DXkvqgVmIbLF
-H9osYPPO6RFDvh7JuUu0S+XhgFpSEJAonHiywOCmCqoOgHnbR5p2Id0xWofV59wAIIuMiLQpRx0H
-wwymESIqSr9XKNI4NqegfRCA2ZpY+D1TEQ7CaZeGrIo5ixLWdFAJIAQhoaRxIrZIOS4Rdo2GGpAm
-wbpnQgMCmNQMQJqSRqH80V0oyWqZ5PQ+WJamAe6sfWMLNih7izakYqKpicu0q5/R4V1Uf3zmqXAY
-UoesRRlPeIzk4eqS9QnYq+x4MK8Gyp+yBRiLRxJNFkh5SED5IXdrAQI647I5ldUFTSSyB1tgcJRE
-KdmyyNVBMrtQkfaFKR4cMOQvxb44BGCV4RU9ofoUDe2dCuP1OdAGoJozV4c3CeJB48+PWSBdEeDz
-XlN9ydof2g49kFnNJ79THCUyIgUBzFnPpWdBxX7hUQTsvjEcS1woTgQalc0iXZ0yvMAAsHFVRnxR
-5Cnrae7sEiBlwx4n04JBIQJEea8UH6Azzr3iKeiziYWIFAskQ6xxix8hCEsRxeQUeWw8Ms7ZBAnV
-ON0/Xn3uEOQczw0rlE/zFZuZyN1bgCGKdBSOOYD8dXw0RWaC6mMmpCy23AAwBENwlAogCOZGv5jC
-uwztYynFDTaAR1aQmakwnIoqWg0gEIfkK69chpOYGLeldQiKKHQx0Z5cJiQcZpEJgdJsJeI0QYXh
-bFHAXJoyzYFBnpQUH+iO2W85ZK+gLJhReASd6wcwncNkAzMCVcp79oQQRJco5JKSssNZN56ylHIz
-dQaQzFnKlAOGfQVHYgAwqEPGyRYEFuyRcXswAJoQ8KeyjBFEbgqKx0yTnL3uYCNKDIO1otAqL/ZQ
-k2KXoVKeXsAb7ADKKNcwyC8iF29ueLZ5DcRhxWgostHkvhOGj1X7iFCH1rgzjVlkTXekI4LjYVYH
-tIKfYsPICeWMzXk8jK5dkE2BbO/+NhoHDvSVLv+QOz7BjhkXVIrHYiRt5tBYvekRFDoZ1RUwOw8b
-rl2OTsw2ISlrAG5LsT5lQXHg3PEHJo8iS1EaYBzHjTt0rk9RnnHK/jSlDAv+LhqXWcf1OPXMXYTE
-XIac0e5MEedh1BGlspALyGdKdoeFKMkH5gkPZOW8yqmU/nUUE8BpmdyhFk6nKTglbcFOR8oaiYc/
-NGdPoZy8cACMDrHj2kBcYDhlF2WTd0KAkh/pRBAjWilMr3LnW7BkRpkACopFdzxHZ2F8VAoiCNks
-NXNnHg7UpjpwNx8+xkXfAwtO4CR9+l2w9nOCRjo55XiHzu2gGc8DOUcDHqVwwNRQEi32iDv1mRFk
-ima4MXRRCksuzUGWniNo3is+Ao6HFL3c4OO4ykXTu33p9LsrOJe412NBGnECWZ8kAmAhBRYeV9j0
-gqvQlBfFnxUHYJTPUiaENHEZYIS/to3lZM4JUJ1DAkVyRkcKC5LToIQE5pTEBZnLfu/AypekE6ec
-mgiBacFzRkquTiGlBSlhAMxTOmpn9wmZB2aGEkZjRDkhyGjeomnRwcIJfu83hsXHcK4ZjGV09VO2
-r3OuFUSgmQeE4MWLkjUJzRLCggtOtOrS1QAwyvOqNAE5myY2iuqHo47G2TARWNCxdO22rgD0N4qg
-HBGhAeH8nlNAABYloXIxVLAkm4KOtvKZGACHxDR4YsOXFZSi02eSwDzgOdGartrClOFuy4BFNRUd
-Sy/+89rBmqhsecU1SOQMFsijKeCcdjQx0EwDsjKXRSewKbxiJDsu3qk2snfyGZwbVJ/7FxXNQvIK
-xjnWAZ96HneKdKQYT+EdebDmA8gZb0Ap8qao+QRosCtOSUhkdGgIN9B8QNLb/bAonz32h4YAJ+eu
-xhNljCAhbpYuWACalNJp3DTTVH+s+dQv5ZgABRaaRmnEioLc4uTwAKBi+7U3DWSRfQ5zom9O1Kds
-NIXiA+/a7WZ5r8SuGUoEi2D2GBW8B6ME2sF6jEDaw+JiFCGQky9jN5AISEcpAKT5+uVa4nl6Yo95
-RGAO0zWKUKXBNuvDRwCYjcTl8BYt3GlS0B6XrrHjaJ/ZOzzJN6qR5we3uLxxPWuLKnO2yBCXcOJB
-2nHM2GPTNW1jZyzOuEcv5XNkdExGOgdnxnpA9fRDFlPPSIT0KxQ4MAr05/6mHQk58IbrkA4WUz0e
-MXhKKuIsuoKtIBf7JI4dvoNtLHcE3cGWFrTkSh8kPZI7AhOte6AiMYXWrk1CoDhpiz+lhQgYaTjV
-Np68gq5lG0t9QNeyKVYxUk6oacEhGRflpwIgJyBCF8VUvPRC5U6Mji0OAObcXZSVHoGcncmz5+w0
-ByGFX0qHoVWcEiAGcj4DMuVOtmsn3Fw0kpeNLi6iI8MAVpTXLSjSFIEJPjTOfqWtiGn4+iGBAtmB
-snDQJeT7n5IXzk28ibxPRx7MB+v5cFnBRzeKmo9YSovoWH4wV0B1Tcqp9HEP8KoiYaA/FzTx/uj6
-GbcrRoVBqujmJcnghG5OCmXpNovZyRC9u0MkHLAJwLhkdfo9NVObRQOcRKlTcVtMV3NSYAOvqmnB
-JrmCj5zOpmSRU64sWsGzJFI8KZnHZAM2+fLYgicFBLDT3bGm4MtGOA06grmwv48LgcTVfiuMQM50
-ES4fmHhbuMJ2rDg3g5Pr4p6Om8FJDTKftROAOqQbyfNZzaAXhoTXeJLojBdq3imTQx2AtJnyZwQm
-sYZboOj8CMx8EW7+9LlOE58ki69vVCRJlRCU+iPP+FZgnxN0Ei+9ULq0Ru4HUP2OPDhJ+apQw3fY
-Gc74SkndATN3JaQrnd3ikP2Jrj+QcWJ5fxHQlIZRi7Mae/VkQnexypTdTH7hpjQARbAY0nFvSMNC
-gWaJzzYICDK6QzFJRDjFn4YTbHSnZ8omqRDbN9GusMjkIXqM7rSFM/cFuX/I2YZFyfhvFMM4ngMT
-mtASoTmakiJPAFiwlZ5uCxt/P8ls5eZ3RtbFI4IK8qBhON6OB6chvE+mdL5RclAItXcCLb1Ou6hR
-t9LlRAdMFUcaRrh4AsCCdvqSb/+YROLlQmqiEALFnTGU3RqgkFGbku6xiw0V+Z2pKHb4jrugbeLx
-AbriKxxgCwc3IP1vGjzTgmKKMc7doU41Acfw0pWOgi8g82b+Iw9OFYVpkN8ZghszPn9SKApuzHO2
-0pMLCooGr6+/LRCR8kFKLyEnG0B6qYzcLXhg6MiDw2W0EHxK8R/hklCMDN6ZjmMHL5MvKtdvVF7/
-NPJt1gXzCoB7T3rdZ/12d9juvqlWHRjvnY9/WHtyDL+IxP20++rhdrtj0azd4q+V22u3Xj/eedJr
-tuDrVrsxbPe69f770364U7n+11Gna3+q2mb12/snw9bgRuWbtVvr/X59rETjsN1p9ltd+F1Wbj3q
-DsNv8Gf4/rgFv123msi1G5VbL7vthgXvWrzdN6NF39U7J67sn+3m8PD0wt36EZa1TfGlv1nkHh22
-2m8Oh6W7RMUvvE/rj/bWO8eH9T1Rtmftpi15RnegzIV3pbf/R6sx3OiddJu2bRu9v8r26ACnji06
-HJQesJE6F97V8nz4vnSP3i90P84YzKgff9Hn6c1dFDE5POnvn3Ra3UarLClc1ZLUoPdc9MDaLV7Z
-/uzXB63tfuu/J5YI5dl1rNaF97Db2x22h40zVq3QywGWftHutMoLmZE6F95DWbZr3ZOjp41h/d0c
-PYurXHjHYMqV7Vu/NTjplF/HqXgZCTSj6eKUpk9feKOVrPWipDgJbT6F/As8Lu3uGewZayNQ9sK5
-rN0t25fecatfH/b6pTsUKlx4r3Z7J/1G62G/fnzYbpQfrDnG6hInz2bv6Lg3aA/nmDufoh2oWpZt
-wq2t1kHlzmoLuHg9WrotYLbaAq62gIvbjyu7BTzo160u3HnSaw+u2CawtFFptQdczA==
- ]]>
- <![CDATA[
- PWDpJWG1B1ztAVd7wNUecLUHXO0BR5hFZFduDzhHj5ZoD7jRetfq7B7Wm70/r4AzsCqvygZpnp5c
-2S2SW3LQTPHJFpxFVa0Hw+ZW6127Dg2aY9sQV7rwzu13Ts5YvZZXvX5YPxkM2vXuxpl9XEQFuzTb
-NcuLxeZlyMXyHSkvFZt/LfhcWXSh1js4GLSGZ8+M5Z39T7GHyzfvO6BZQnRho9fp9W//eXjmFide
-gd53ylsbfelL8M2U7s9xq3HSqfcf/HXc67a65blvsuLF93LeTm72uoNh/RydDBUvvJOlY4cGJ/2D
-eqO126jPw6AjlVby/gP6Arzy9OQM3roQYb8octZu1+w/ZQnyd2la/H0ZW08xT18WfBut5ujKR99H
-fxJV5Fmv3R3uzGNg+jS2ytauXzF2vI6xfNrRuewLK+/DZXgf5lxyVivopW6XzuFOWRSZUFrTflte
-ELy9DDlQviNp+Y6kl9CR0uv32zOMQ3FHsoXuyBljF3dELL70Wvw1s95vDw+PWsPyju1lWjsvxnN/
-4Zat4bN6+ywDx2oJLTcCi7L6zm9JXpYIk8et/psWUHL5VKJ5p9oVHpJP145V4NHH0XrFKvBoKQKP
-Nnu9zka/1fq7tD9qYaOOPqPzJ9U5mHHRLcOlO3Jl46ua7U69vD94mbY85e25zfK6ymXIlisYAle6
-I+fesl30Cl0rnTShX2+2T8oLeyp+eSpyr3982Ov03pQW5ouzbbm60q38WZkFl25XRqZ9+lNlK5m2
-kmmgf1+VQN79+U6bLLAQm+Pk4oILsdJDsmzG9GUN3726OQJKry6rHAGz+ni5OQJKB+suW46A/dKs
-ufALU/kldtFXpvLK6JKtTMuctWG9tCV487De7bY6u61OqzHPHnuy4oWz3vPSVuLzdnKy4gLPr8WP
-5Tkjmi1ac+c7PnJZ50ZK92e1HC3emCzbcrTVHhx36o3WUas7fFw/Xr416ahuUZV2wC7FXqlC/1Ym
-voqRr2V7jd/Ka+NU/OKn2XypKRdZ9JUX4osu+kqPybKJvk04If24hPhYRLG3X3o7vvBTpfykX/Cp
-Uv7M9jKmeinNcJ/B6d+DueLYDtqdzjzhXp1LGN5Ou9uql47BtlujxuNe+TjaqMLFu5w7f9bfn6H8
-jDDvsN6fi3td+cW1xw575TXe3iV0pLw0DH3i1z/Bxpfs3litix+y0mzYLJ9zypW9BIdHt7QArDca
-J0cnZwfnxEMVVbn4HVjpcdqHG/rKO6lc6QvvT7+Fe/zSw9Vstoftd3MMFldYXJ3roN87Kr8IY+FL
-2pnUu+2jOabKJzqjstzp76rmqoTNNFZhM4u2zys/JMtmElmFzcxSjC8rbGZ1v+JoL5cvbqZ8vsJl
-C5xpXJnAmTkW2UVfm1aBMwu4Pq0CZ65K4MwcMm/hA2dK75GWI3CmcWUCZ67QcrQKnFnUNekzCJwR
-n0vgTOPKBM7MIcQXXfStAmcWUew1rkzgzByTfsGnypUOnCnPcMsmBz6yi2h5wn/mkCHzzrxLGsol
-TlY4RyTkajCWN7/H8ozFp2vH5bbhyqSMXH+0t4WpgvbmsxiVUgKXZxW7uumSrmT+6/KWtM8gPc9K
-vpWSb/lKvq3k25LIt9K8upJvK/n2oG8Bn7f61gISrKTbkki3lfa2km5zSrfPWnlbSbdlkm4r3W0l
-3UpLt9httDdf4MIVE3KlO/9R/J5L5SVcTaI5JpH+nCdR6c6vJtFqEsWH8ZOKKh0I6Lr9fI5YwKjG
-hatjVj48a//V6jzr1N/vzXd+dBEDnS7zuq3lkYP91lHvrDP7y5WTpt1ttg7a3TOvRI0jqI5b9eHW
-HMkzohoXH/ZWEXdkUhHK/k0q9v879rv9vGN/qFy1EOXBMaQYKturVYKhwKCXlWCo5Jq37El5RPls
-L6usPKusPMuZledSti1zJ7JZFFVqf57ryBf8lMAVvE/yYnf8C8x7n/mBgeXw3Cz6KfCzZvtyutnm
-EuELLu8avaPj3sBug5+enDHZl1c0bFIfl08ulDawvS0vCt5ehiQo35EzolnijqSXsVMo3ZEzPHBx
-R7KF7sgZYxd3RCyLFrroK2e93x4eHrWG5bWBZVpBz7PqLNNKemWTOH7MpXR53B/nGtrVKcRztGPl
-f175n+fwP8+XJHIRTWgr//PK/3wV/c8ogcADLZM7c0mjZfE5ry61Wfmcp3Zw5XNe+ZxXPueVz/m0
-AVhkh8XK57zyOa98zqVMFsvtcy5tyWq2Dw5OBq3NXteqbt3y4zNR7+J3IaVn1kn/wK5du/MlIx+p
-tLguNTdP5uvbSJ0L79r7VqfT+7Ns/zrtN4dD+3u1AcljS3dxvNqF99LPj6uyMl+lsIg5h+YzuJZ4
-ZYJbNhOcE6J33vRbre4dOzlbd2yP2296d961e53W8E6/1bzT69e7Z3ldVra5sX6tbHOfYMTKL+FL
-b6BbXdW8MtCtDHQrA10kEkxp/1j97/bRyfCMOy3jQaHyF85ueek+tTr2YS6jVlTj0qw/W200a+zA
-0nXJsTNbbruy41fRJZwA5S01x62GXRD6D/46tkvPHNaoyYqX4Jqbt5dz29wmK16CfnOVrW5213TV
-7VJXyZBD82ExjrcsirhdGXOWzZjjTTfOmOMtO2jTWRlzeitjzgy5tDLmrIw5K2POypizMuasjDnL
-Ysy5jLXqk3ngV5apXb//Wl7T1JU8Xnw1E3OcY7O/sl9cehTlEqfnKJ9DYcHTc5TvyCo9x4JFdy56
-eo55oxwXfu282qk5ruQdMp328Fm9fZYbbbWELvIphEVfQlcZrhZtCb0yGa7Ota9ZLaOXuYzOu+Is
-ywq6ymx1pTJbzT2sq6xW52jH5bbhymS1Wn+0t3tYb/b+XN079PLzyPt0BQ/7l05Ztjrsv1gKwnIf
-9i99HWiz9G20WPTCWax8R84QqXFH/lrwubLoQq13cDBoDWFm9FvNucT1skmBp9jTz2qPcP7BvcKb
-hUUZnIsx1y/PuKw2cQu+iRNZcq0sn/7Zbs4RHOdLX7zhPy3fo8PWPDFZXPzC+xS22qsUyx+y1b7g
-rlaFKs2K5fX8y1Dz5+lJeUX/r5X545J3CvnK/LGcG5/lNn+Yq2L+KN+RlfljCXbIyyYFVuaPlflj
-keT6yvyxMn8slfkDNtbD+hxBT6tt9VJ7sA/69caw3nnSa5cPgXeVS1KG3nTRsZW10ll+9uuD1na/
-9d+TVrdRXrseq3UJZ+F3h+1h4wzzY7xfhdIv2p05cmqM1Ll4u2Xp+NjuydFTy8Xv5uhaXOXCe9aY
-z2hZUhW4DCHb+HSBeQs7Jqv8S5ML5ir/0p3Lzb+0ykLEk3NJshAltdL36gx75dWt3iV0ZQ4Natnz
-Ka3SKZUfqstMp3SR6YcWd2tz0O8dlV+ZsfCyZFP6JJakFyf9/ZOOlWJLa2pc5YFZgsN3c+z/lsQU
-fI7TaSsz7Km2jysXhTZHj5YoCi2sGHtnHJtfmcx7p5nML1qJKs2Mix2HVr4fVzYKbVhSaVs2B0ay
-8mD0ltuDUToYatkcGDDlFsBcvtoDrvaAy7oHnGcKrXaBc7VjtQtc7QIvsE+ju8DSSttqF7jaBa52
-gR+NBFc3kK10RonVNnAxt4GlB3C1DVxtA1fbwNU2cLUNXG0D402TunLbwDl6tETbwJ96veabfr28
-pFrtAS9/D1gVV2UXOE9Pruw+cK5z2wt+uuJK3nVReje0yrCxWDui5c6wsUowelpHLiPDRq9Erobl
-kdWrfCHLKNM+Wr6Qi7Z2d+xWw91ffnu/U2+8vVNxoN5xvdEevr89h9l4MHzfKW8G96UvPmZ6nrva
-F11YzNWZZZtT28CIyzelPiSPzsp2einX6WIG0M3PVjCs1IhFEXmfw/2G/p7UzV4XL28vv7cYr3fx
-Z3ZLa0In/YN6o7XbqM+jEI1UunhT+nxzar6+jdS58K79eThHuoYOmP3t79USIjTq4Xi1C+/kvNcP
-L/gCdpW2wXMOzWeQF0akpWVp/e/20ckcrkguf+HDnJfOM9Xq2Ie5zNFRjQvvF4q2T5dp6pJUra02
-qhE78ziFP1G2gC0nH3b8ErKEul9pzqcbfh/8ddzrtubQ/iYrLq6GRG2dW8WdrLjScVeK4GesOZ3j
-QvCV9rTSnhZOe1opT59Medr1ImJ5tadVlPXyeArmX49WS+zKqv4Bp7bKjsnb8gLh7WXIg/IdOSP9
-UdyRdKE7ckbgRNyRbJG3s2/PKBl3RFxCR+a1fC/82lnvt4eHR605Ls9YpjX0SgYjd9rDZ/X2Waae
-1RK6yI7pRV9Cy3dktYQuWkcWfAk9175mtYxe5jI674qzWkGvzgq6PKbq1aWSC6wZfXIRsjxD8una
-sXxscVUzIK0S4Y71cvkyIF3dq/zO5QRabI2ubOaj5dXpljm301HdoiqdjmMZ5LuoJP7fad8YUrbL
-+K289KDiSzDNFl1wPLRVB2fHlS2v3MCjZo9LTMBFFBxXcKW60qlEPodzc8udUqRael+y6DlFqlcm
-qciFmKwuuE9PP5tztMuajuP8I7T47pirGRE4t6666EIC/BTAgC+ucE7mJY5mOM/wLDrLifIXES+j
-Ah4PWeljlMs2pZZbA7+SUvz1Qau/3e4vghVlUcZ5WN8vP8bLYPOUldIeEez7q/mMmiN1Li8R2Em3
-8Xz5hMqVY7aariSVz4PdHq7Y7fLZTXwuwm3jkgNVcD8EWRVe9OvdwUH52y4Wh/vPeapgZTS5DKPJ
-ebTTZdC4HRMuiM69spyMDhBG4613OgswNItCkvPx7CoM9BztuNw2nOcKq2vrj0Sy96Db5KusAKQA
-svek131mUWCem6oDb7TetLvxD2tPjhFH5n7afX+03+usXV9vNivb9Xe9PgiRtaSybv9//efaif03
-qTxdS2p5oe2utiYyk2kXs1MTeaJNZr/kOlHG2C/G5FKryuv6Wojxef3ePvxgv/xhQX9WRFJ5XPn1
-t6TShDc8X6smtSzLpSkqUtSMylTlaK0q8pookswWrgklskpVZjVVpKYCpaUw9h1VqaBiWqkWtVwY
-kVc21wJMyFpuEl3ZWYOqWhW2qkxqSZIV+EUqBV/SWmJyi17oWprLFCFpXohKA9ugtId5pKpmZC4d
-xDYVISLLVIBAvaRWGJlFpYqazPIE3idrUlSqFk1i4P3C1ITIUmg5U6EqRM2+NrdNz2qFyFUotrNm
-aikgdHjsi5IiScOLRGb7Fb+5sWZBRQrv5DLKjpaRoVe2m1leyLjrorDfgNhEH/tpcq0DCWE4VCoD
-nTfXGETDsYOgrMARUrlQEqulKkdAklmOAYCEsSlsY4BoiKdIDLyrliYqRzxFrSiyPAalwGupRQ2D
-a3RRSUUt1YXtu7ZEyXMDAGpPKqWEJjLItrowaebwWOZ1JEMQkEUioHDDYFlDKBg8WzRN7ahZ+lju
-FEWOoCy1IwRsoHLtACMjQYDGmm1XkqcqgFJLC6HhTRpGVVUiHrADnIsUGSOz7ckMlQ==
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 3cWUk0jB8xtf8zBhV8O3nudqCZHE91QBmv+xLToZDntdf5fi5O2KE5dZXX/WO355PFoLem17zM/P
-6t1WZ2+z0xu0XMGnvlx92NputzpNKrjd7hzZj+e70OXdVt0u10CYfqvZHsJ1x3B7y9j1x9e/t0TD
-W46ale36u14fjXnXsas3xi9ccn2cTSs/nlu2a0et7tC2rw63U9Fz5TY+jV5Udev1450nvWZr6o93
-Ktf/Oup07c/V+nDYb+9bDvDXTd1a79tV+EJQfAT8USmrQnWa/Za/t5uM8vQr/BnyzVvXv+wO9t7V
-+4M7UYLeuOi7OlgcXVmAD2aUg7A+V8y3ZDDytKTU6fa6rRKE6fQab1vNMpShkt9cbr/2292mbago
-0TfLHLut4RPsxNn9i0t/pOH/QEqIUylRqv9tuImuDOOfOarLNNFvvys91aHoJXM0dM+ud8Pe0eVK
-sk/Hh7cHdXAhwppnp1hZdvzk82IXstMvTFOuwiwdHPy5wKvxJU+DAdzjueSjXLUbKbsj9tETs3r6
-Z7uJx0fPHF9f8HIFcLk+HbZ8CoczO0UlL7dXHPwyq0P7PbtdOtppHQyf9tt2Z1Kma5N1LreTEuz8
-Z43c+zI9e3/ZXTGqkGf15K9SMnMh1nwUdru9k36jtQGRkZe+6Nul6bKbcNQa1ptWB/rQdhQf2I4v
-mt7oUIadosIAoUPQz1r9wXEL42jhTuq95yedVt8JhUfdZuuv7XZ/MGeV3Vaj1/UbTF0oUTGp8GIZ
-rxmGvk0gAVn0rFPvtjZbnc6Dv4bcUJNriwESkpyB4TlI61f1bntwaCnhLzRGDFAZPctlMGAjNlA+
-juPQxTw4XvSOIwQzicflMcSw3WkP3+8O60OSJmCyLUO/gGecgEmlqpLkzPr+HPx2p9frT6Oijm5b
-TyoHHbgRt9vqV/r1wbDVr76zuHr9yn7dNqExvnSNVWl02seVRg+2En9V+q03VjQPTq9x3G8NWv13
-rQoYAY/BHucraC3KcQfw1wcxBzPo+XmDUZRjDS4+lTNm1cIBnF3t+q+PW832yVHleWvQ65z4YEgW
-H5buosK2TLubOTnGvA1uGJ7BMAwrwbYiwnG09UdF5XFrcFh5jgzR/hsDKqPXuBppMlLj6cnw+GR4
-Rp0kcN5E43bq3Tcn9TetyrPe8ckxl3dv2Oi0Wk038iw1Cdlmv3cMRmp3hmByAzKmM1xf7w/3e/V+
-E+6vHk/NEQhihElrquI/xvghEpSjbfGpPR77E304D1wPnq0/J0pbfFX8G7DaSfui99xhdBzXG7Sh
-1fir9C+Biskc9cTYXHw0oL57r8WTyQWOSiABT2dQS7t55x7wL7XOVc0MD/J44Vft1p92VCxNh0EU
-XRdZLaklEae/XX+0fdLpEDv56Hf7q3+BmoUf+Gm73mhxEpLTCqNYHiutZjYdSz89rjfsnHVlc6VS
-ddrS8ZxMuacuMBvM/rBH0qcVdZHDI4rueLkXrKMkkbzOI3ld7w7blXqnXR9Mm5FOgkZzcpbY750M
-O+1uqzLA0ykeV8bSoCDRBAP6r5M6iLrKTutdqzPZumloh62/aHs3vjEf0ax3W53v60PLKTu9Rr0D
-3D+I+HxGWdvGVv/RVlwy/vkFWIvgrcRBRmenSfRoWE4bQixbbrSxKLPPbKbEciNMKXMIO569aEVt
-VaYw4pSioanA6acULNFQ3M7G7TyjS/5aSyddZxUFbWrTbnyGtHydVnC3/XfgaFqy5N7ucW+I7v7H
-vSZteGd34/ueXQh73e8j64OaLe2g07G2BzE+Z0lTy8StMxGjMIgxj8+RlE0tx/Vmc2zGHeFFGSOg
-gaXCGMjOWNLjSNY0j9u10Xne6HX6PH/WH1XWT4Y9VhimyCFRoZ1O5W2313hrZ3vljQuzOKVo26oc
-Vkmq7MMBHJ9ga6RwUTmuH1vhMWgfnXTqQTmRkTga9uvdwXHdbvAa7+07201bmpqoZCZNVLZO+kQD
-A0GkffPJBPOMFyuJ6k00Ac8q26eJFS81U0qKqIFnFo0acGZZboDIU5NySVqYN+vdd/XByMyKxu8Z
-bQwg5qDyoNke1p3KO23d8TvEWBWMfrVKefQbC4SHnZ7d1DxvHZ90Bjzod+BXPvU1NjfGD4WNqclC
-ViwXP6TsM3ACz+nNp2nKrtIOrFpW1cJK2OPxSqNvEpUHz3bnfpWrdfa75lXLia137NwlffHR1uhv
-u68ebve6w92TfSubhzwP4xkx9qZjCByZmK279Xetx1ZVbds9Jr2LrGYbbRqn9d3NR4+M2mqBMg8/
-Zt89/fLXm3d/uvfVnfrrb35Iv3xa3bjff3h0ePtN9x8/bP/jm+tfbbbrtcE/85ffP8i/uH3/5cNv
-H2ff3d7591eP7/dPGnr7gXxsroks+yJJBlt/bL35Jvnn/Tv/qX19/+43x4P7gx/lrbVr9+/s/KNP
-hX4Ybrz5/l879+9mrd3N9r1vG1u12ldvJl610/zZvk9vbV+7rX95ONz647eN7JfqN+tHvZ2B7e7w
-8Oa3+Rcn21vZP3/a+KPz1U9r17YOkh/2pyL7py4O9Kt//frv9RebtVezXxqXu/3b/btvt3+7f3tQ
-O7q59c21k+3rD5sHa9eQWNu/7z092Tr47Se90bnfeX37YONwuHmofxEj5Pj9y62G2Pnv/bvfffWT
-w2ObPNj8z5v/9Oy3L/+79aj56B8bVfPHP9d3q190XRte15sna9eKP67fbDxoqH9d3zzM9u7cXb+W
-fnlz48k3v9+8v/nVy+3N1snX37764YvDO41G/S18a998cLBz6N4sklt13W//8/fb7f/80NzoXPvu
-q2r/5r9P1nd2v/wvtP/G/Ts/HKZr1/I7r367v95tfHV0897jO7f00b/vtbW+NThI1/uNR+Lm29uC
-MTa2fhi8smTTX7X0T2nSvN3evFW34yse37te/aa10dHPjlwPft65dn/z0d0vfnrwTaEGdlwe/Zp/
-8a3e7P3n5t1XzV9vy/0vfkO033av2Q59m3/9BQzJr/lP+b+6QKdvN97eyKueNV81dxLx2xePt27V
-7365/Y+bv/ThLTn88B/EgkXWriX7//sow+83v92+67/d/enBj6745jcPfnfI5M/ykWXd18nNb799
-8I3c+u7NPY/np3t37zT/ePIfHElusMX3dEP5t9hCGz9wA34LDRDX7z2HQq0MYeofG1t7SOqt1uC7
-LP8l/6Ox/mLrj5tbB7d+/O+Dev2rf27k+y//VTy79vrl+tPNjWdbB7vt/97/72+336xd28h+frHn
-iPlL3vzlwZ64+Woje73+dHvrj5/2Ntt/5LfuHBxde7O9efC1sAT89netnzd74X1m979HP64/3fn6
-x+2tG80fHW2I0I737egPj2v/uvndq/p/XYe+zU39/p0Xw/9df/HD8GSya2OUjehAA/G6/w9CtWtn
-ztNNq489+KV57Y38/e53W8n2v++nyAJ3f7+7vWW54+tvbm70iv+Mj9UoZeOBpYFwnPPd4eAEqWT7
-EtPph52H63s/COSYuzeP7/y+ff3gx9p6cvfFL/LGP/9z1zVklBz5yfOitX39y+Mbm4f587cPbu7U
-tgOn2gnwcw8kzO6DJnDofTupjr60XfvixuabwwcDfafx8vm6/kX+ND4Gz77vvBrB/b8PH1S/2S+m
-DUnxtvXj5tq19RePmzethPm22NrY+fnttNZiyajcw5/1gZ00D2QiH2aPJzln+Gz7xrPOne0t9Yu8
-+e3D36tr10K/bK8aB9sPtpTeyKtPX6HAqYnvX32DL9269fvx1xt/DJtHG53uq976i8PX/7QofrzJ
-CI4ffNN7Ire/rOpf158fHH5lq/325UZ+c+fQScsbWwdffZ/b1vYOnRR88Or19yTC7Qt+/O1Fun3/
-zb3XIOB/39rPDn9af3mtMRgt9+X68xe/dswfnepdlGhhIbBvCb/3fkjubry9ftzevvtQXI9k+y/P
-v67HNLFrSSSsRbJ/8uD6vf/+FFaasV8tJ18f6je2ea3did/N7zfvPBocWInd+EJtiJPOr+u7v/+w
-6X8t1n+/f/f7zZot8vsrKwV2vtwQv5zsre+evMjCr1jYyjELOLrfb9z+0o1WPD9v/Xz3u6ebXf38
-4M11sf+fl+vpl//45wPg6U3xcHPnPnz7NvnhobiXtPZvfye+ub75HcO+DTXWroWSCIXHDRCFm1gR
-H/PdHfkv+PWeq00v2ATYhkO2fre6rVV167nc++X4ARS5i4XhcWvtGjdvAwo9CXjcW+B9oyjuc+O/
-5Rp3sAi05hk2ibu7jg1Zu4bddB2GRuln3z9+AbA7iCy8BVGMk4iaPP5SfGR8u/4tXBvr3IHfsRvf
-BVJicWyeo2L3zZ1/MQl2kZ78lrtjQ2dHf3SgpgztOQZibBj8W1wdIFbAjd1AOo2S4x72KjwiMn7z
-wyltuD+1L9+ePSSuyfiNMbqXjj46trCSfxZjzGQLKLzDvQqsMpVY+IPl5Eli3XN9xZlD5LgX+gyF
-n/7/7b3pWjJLzyh8BJyDTDJDdwPNoCIzKDiDAirIJCjIzPO8a/94j32nque5G1g/9nd917qWN3QX
-SVUqlUpSSUWNqLKVyhPwiqGYbJiYJmkpiGtpbwo8ZoanZUhxY2HVAScLsyWZ1YzAtbg5okROZalc
-8D185IUHw6T4Bbv2MVjrpNbnF0xyTEUMmeUxNQGIh8YvTWtsyEwJv4YYaYn7+EwnSd8D/sSQHw0D
-dx796UhVP3+u8VpblLOecQM0/W9KvGGkcgvYKyf18tddO122+8Owi6FxJbndPuQCzaU4y745m5PC
-T7eXLQ1n63NmKxOpE/Hdo7Y5I1Y7Am/YnAFbTGrQ4I4WJyHfNaP6Pd74PoQ9TmJtEc7sq8ebKkz3
-z51irbbOiweU741zz4viQ/aluxmABjvP/pFSLAFsO6TviXnvMvRVXsrfRhy+dzBCX1elYbARydNB
-KiSyG8n8YFIc+0tVQbdCmtLtPiUQhtXCPpIPItNNrESAaYps29S8vPxm1DMFgFYMfhZaRu6eP3Ko
-X6ApgbYe7xxjnJgwTZCmdKRxYsI0YbU+nkNDaGiMySyxfbszwUJJzsObKjsHTfeM1Y9at3msxgp0
-EkD9f8uywIY0Z09VP4q1PO0BBL5B/in77s8/uT93WB1GoiKhQiexLYLZPkPXwsWb30RfIBtYFohw
-LPlzi2ridV5v5B6aNWB3WJ0Mcwod0TIqGHpmaNrPL4BKfk5P3rH2b3ML+r+yo+OHYmXmHsPyerpE
-To0hfAruKivHIJUKXMTupWDrGkbKpYeRMJXcyzwbgF9P1uTw+fqByjbtKdZSbfjHQKxZzMDopzoz
-Z2H6YU9Dh3s9bvY/wzDcMKz9/OwuAIbI43eMXyBpZBh08zPqyi684JmdSI/+5gSapluJjUzny5el
-jzAPJVHufvqd5dJiD6uScqf+kgxnBV2R92RiWL/NPz1mYbdo/92zHd233bmn+5dXZA==
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
- <![CDATA[
- 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
- ]]>
-</i:pgf>
-</svg>
diff --git a/docs/theme/mkdocs/img/universal/cloud-download-dashboard-icon.svg b/docs/theme/mkdocs/img/universal/cloud-download-dashboard-icon.svg
deleted file mode 100644
index 031da70972..0000000000
--- a/docs/theme/mkdocs/img/universal/cloud-download-dashboard-icon.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" height="28px" width="31px" > <path fill="rgb( 148, 156, 167 )" d="M23.86,20.961 C23.86,20.961 16.347,20.961 16.347,20.961 C16.347,20.961 16.347,19.801 16.347,19.801 C16.347,19.801 23.861,19.801 23.861,19.801 C27.147,19.801 29.8200000000001,17.171 29.8200000000001,13.937 C29.8200000000001,11.039 27.622,8.54599999999999 24.705,8.13799999999998 C24.514,8.11099999999999 24.348,7.99400000000003 24.2619999999999,7.82400000000001 C23.14,5.63 20.7089999999999,4.39999999999998 18.119,4.98899999999998 C17.833,5.05399999999997 17.544,4.90300000000002 17.437,4.63499999999999 C16.597,2.524 14.566,1.16000000000003 12.268,1.16000000000003 C9.20500000000004,1.16000000000003 6.71400000000006,3.61200000000002 6.71400000000006,6.62599999999998 C6.71400000000006,6.88200000000001 6.73800000000006,7.15899999999999 6.78800000000001,7.47399999999999 C6.81299999999999,7.62700000000001 6.77200000000005,7.78399999999999 6.67899999999997,7.90899999999999 C6.58600000000001,8.03399999999999 6.44500000000005,8.11599999999999 6.28999999999996,8.13799999999998 C3.37599999999998,8.54899999999998 1.17899999999997,11.042 1.17899999999997,13.936 C1.17899999999997,17.17 3.85299999999995,19.801 7.13999999999999,19.801 C7.13999999999999,19.801 12.783,19.801 12.783,19.801 C12.783,19.801 12.783,20.961 12.783,20.961 C12.783,20.961 7.13999999999999,20.961 7.13999999999999,20.961 C3.20299999999997,20.961 0,17.81 0,13.936 C0,10.658 2.35000000000002,7.81200000000001 5.55399999999997,7.09399999999999 C5.54100000000005,6.93200000000002 5.53300000000002,6.77600000000001 5.53300000000002,6.62599999999998 C5.53300000000002,2.97199999999998 8.55499999999995,0 12.2670000000001,0 C14.89,0 17.223,1.46199999999999 18.338,3.76499999999999 C21.177,3.31799999999998 23.826,4.67399999999998 25.172,7.03699999999998 C28.515,7.65100000000001 31,10.565 31,13.937 C31,17.81 27.796,20.961 23.86,20.961 ZM11.477,23.678 C11.477,23.678 13.833,25.996 13.833,25.996 C13.833,25.996 13.833,9.91699999999997 13.833,9.91699999999997 C13.833,9.58999999999997 14.102,9.32400000000001 14.436,9.32400000000001 C14.768,9.32400000000001 15.037,9.58999999999997 15.037,9.91699999999997 C15.037,9.91699999999997 15.037,25.977 15.037,25.977 C15.037,25.977 17.374,23.678 17.374,23.678 C17.607,23.447 17.989,23.447 18.224,23.678 C18.461,23.909 18.461,24.285 18.224,24.517 C18.224,24.517 14.861,27.827 14.861,27.827 C14.746,27.94 14.592,28 14.432,28 C14.432,28 14.429,27.999 14.425,27.999 C14.425,27.999 14.414,28 14.414,28 C14.2619999999999,28 14.107,27.943 13.989,27.827 C13.989,27.827 10.626,24.517 10.626,24.517 C10.39,24.285 10.39,23.909 10.626,23.678 C10.862,23.447 11.2430000000001,23.447 11.477,23.678 Z "/> </svg> \ No newline at end of file
diff --git a/docs/theme/mkdocs/img/universal/docker-logo-pin+@2x.png b/docs/theme/mkdocs/img/universal/docker-logo-pin+@2x.png
deleted file mode 100644
index 2cadb5e590..0000000000
--- a/docs/theme/mkdocs/img/universal/docker-logo-pin+@2x.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/img/universal/docker-logo-pin.png b/docs/theme/mkdocs/img/universal/docker-logo-pin.png
deleted file mode 100644
index 8c7ca8338d..0000000000
--- a/docs/theme/mkdocs/img/universal/docker-logo-pin.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/img/universal/official-repository-icon.png b/docs/theme/mkdocs/img/universal/official-repository-icon.png
deleted file mode 100644
index ccafcee156..0000000000
--- a/docs/theme/mkdocs/img/universal/official-repository-icon.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/img/universal/star-icon.svg b/docs/theme/mkdocs/img/universal/star-icon.svg
deleted file mode 100644
index 8a22ad5d1d..0000000000
--- a/docs/theme/mkdocs/img/universal/star-icon.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="29px" height="28.7px" viewBox="0 0 29 28.7" style="enable-background:new 0 0 29 28.7;" xml:space="preserve">
-<polygon style="fill:none;stroke:#939BA7;stroke-miterlimit:10;" points="14.5,22.8 6.3,27.1 7.9,18 1.3,11.5 10.4,10.2 14.5,1.9
- 18.6,10.2 27.7,11.5 21.1,18 22.7,27.1 "/>
-</svg>
diff --git a/docs/theme/mkdocs/img/universal/trusted-icon.svg b/docs/theme/mkdocs/img/universal/trusted-icon.svg
deleted file mode 100644
index 700f275f8b..0000000000
--- a/docs/theme/mkdocs/img/universal/trusted-icon.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" height="16px" width="16px" > <path opacity="0.702" fill="rgb( 170, 180, 192 )" d="M8,0 C3.58199999999999,0 0,3.58199999999999 0,8 C0,12.418 3.58199999999999,16 8,16 C12.418,16 16,12.418 16,8 C16,3.58199999999999 12.418,0 8,0 ZM6.75999999999999,11.691 C6.75999999999999,11.691 3.07899999999995,8.00999999999999 3.07899999999995,8.00999999999999 C3.07899999999995,8.00999999999999 4.49300000000005,6.596 4.49300000000005,6.596 C4.49300000000005,6.596 6.75999999999999,8.863 6.75999999999999,8.863 C6.75999999999999,8.863 11.569,4.05500000000001 11.569,4.05500000000001 C11.569,4.05500000000001 12.982,5.46899999999999 12.982,5.46899999999999 C12.982,5.46899999999999 6.75999999999999,11.691 6.75999999999999,11.691 Z "/> </svg> \ No newline at end of file
diff --git a/docs/theme/mkdocs/js/base.js b/docs/theme/mkdocs/js/base.js
deleted file mode 100644
index b4775c837b..0000000000
--- a/docs/theme/mkdocs/js/base.js
+++ /dev/null
@@ -1,101 +0,0 @@
-$(document).ready(function ()
-{
-
- prettyPrint();
-
- // Resizing
- resizeMenuDropdown();
- // checkToScrollTOC();
- $(window).resize(function() {
- if(this.resizeTO)
- {
- clearTimeout(this.resizeTO);
- }
- this.resizeTO = setTimeout(function ()
- {
- resizeMenuDropdown();
- // checkToScrollTOC();
- }, 500);
- });
-
- /* Follow TOC links (ScrollSpy) */
- $('body').scrollspy({
- target: '#toc_table',
- });
-
- /* Prevent disabled link clicks */
- $("li.disabled a").click(function ()
- {
- event.preventDefault();
- });
-
- // Submenu ensured drop-down functionality for desktops & mobiles
- $('.dd_menu').on({
- click: function ()
- {
- $(this).toggleClass('dd_on_hover');
- },
- mouseenter: function ()
- {
- $(this).addClass('dd_on_hover');
- },
- mouseleave: function ()
- {
- $(this).removeClass('dd_on_hover');
- },
- });
-
- function getURLP(name)
- {
- return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.search)||[,""])[1].replace(/\+/g, '%20')) || null;
- }
- if (getURLP("q")) {
- // Tipue Search activation
- $('#tipue_search_input').tipuesearch({
- 'mode': 'json',
- 'contentLocation': '/search_content.json.gz'
- });
- }
-
-});
-
-function resizeMenuDropdown ()
-{
- $('.dd_menu > .dd_submenu').css("max-height", ($('body').height() - 160) + 'px');
-}
-
-// https://github.com/bigspotteddog/ScrollToFixed
-function checkToScrollTOC ()
-{
- if ( $(window).width() >= 768 )
- {
- // If TOC is hidden, expand.
- $('#toc_table > #toc_navigation').css("display", "block");
- // Then attach or detach fixed-scroll
- if ( ($('#toc_table').height() + 100) >= $(window).height() )
- {
- $('#toc_table').trigger('detach.ScrollToFixed');
- $('#toc_navigation > li.active').removeClass('active');
- }
- else
- {
- $('#toc_table').scrollToFixed({
- marginTop: $('#nav_menu').height(),
- limit: function () { return $('#footer').offset().top - 450; },
- zIndex: 1,
- minWidth: 768,
- removeOffsets: true,
- });
- }
- }
-}
-
-function getCookie(cname) {
- var name = cname + "=";
- var ca = document.cookie.split(';');
- for(var i=0; i<ca.length; i++) {
- var c = ca[i].trim();
- if (c.indexOf(name) == 0) return c.substring(name.length,c.length);
- }
- return "";
-}
diff --git a/docs/theme/mkdocs/js/bootstrap-3.0.3.min.js b/docs/theme/mkdocs/js/bootstrap-3.0.3.min.js
deleted file mode 100644
index 1a6258efcb..0000000000
--- a/docs/theme/mkdocs/js/bootstrap-3.0.3.min.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/*!
- * Bootstrap v3.0.3 (http://getbootstrap.com)
- * Copyright 2013 Twitter, Inc.
- * Licensed under http://www.apache.org/licenses/LICENSE-2.0
- */
-
-if("undefined"==typeof jQuery)throw new Error("Bootstrap requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]}}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one(a.support.transition.end,function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b()})}(jQuery),+function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function c(){f.trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one(a.support.transition.end,c).emulateTransitionEnd(150):c())};var d=a.fn.alert;a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("bs.alert");e||d.data("bs.alert",e=new c(this)),"string"==typeof b&&e[b].call(d)})},a.fn.alert.Constructor=c,a.fn.alert.noConflict=function(){return a.fn.alert=d,this},a(document).on("click.bs.alert.data-api",b,c.prototype.close)}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d)};b.DEFAULTS={loadingText:"loading..."},b.prototype.setState=function(a){var b="disabled",c=this.$element,d=c.is("input")?"val":"html",e=c.data();a+="Text",e.resetText||c.data("resetText",c[d]()),c[d](e[a]||this.options[a]),setTimeout(function(){"loadingText"==a?c.addClass(b).attr(b,b):c.removeClass(b).removeAttr(b)},0)},b.prototype.toggle=function(){var a=this.$element.closest('[data-toggle="buttons"]'),b=!0;if(a.length){var c=this.$element.find("input");"radio"===c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?b=!1:a.find(".active").removeClass("active")),b&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}b&&this.$element.toggleClass("active")};var c=a.fn.button;a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof c&&c;e||d.data("bs.button",e=new b(this,f)),"toggle"==c?e.toggle():c&&e.setState(c)})},a.fn.button.Constructor=b,a.fn.button.noConflict=function(){return a.fn.button=c,this},a(document).on("click.bs.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle"),b.preventDefault()})}(jQuery),+function(a){"use strict";var b=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},b.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},b.prototype.getActiveIndex=function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},b.prototype.to=function(b){var c=this,d=this.getActiveIndex();return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},b.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition.end&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},b.prototype.next=function(){return this.sliding?void 0:this.slide("next")},b.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},b.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}this.sliding=!0,f&&this.pause();var j=a.Event("slide.bs.carousel",{relatedTarget:e[0],direction:g});if(!e.hasClass("active")){if(this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid.bs.carousel",function(){var b=a(i.$indicators.children()[i.getActiveIndex()]);b&&b.addClass("active")})),a.support.transition&&this.$element.hasClass("slide")){if(this.$element.trigger(j),j.isDefaultPrevented())return;e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one(a.support.transition.end,function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid.bs.carousel")},0)}).emulateTransitionEnd(600)}else{if(this.$element.trigger(j),j.isDefaultPrevented())return;d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid.bs.carousel")}return f&&this.cycle(),this}};var c=a.fn.carousel;a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c),g="string"==typeof c?c:f.slide;e||d.data("bs.carousel",e=new b(this,f)),"number"==typeof c?e.to(c):g?e[g]():f.interval&&e.pause().cycle()})},a.fn.carousel.Constructor=b,a.fn.carousel.noConflict=function(){return a.fn.carousel=c,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(b){var c,d=a(this),e=a(d.attr("data-target")||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"")),f=a.extend({},e.data(),d.data()),g=d.attr("data-slide-to");g&&(f.interval=!1),e.carousel(f),(g=d.attr("data-slide-to"))&&e.data("bs.carousel").to(g),b.preventDefault()}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var b=a(this);b.carousel(b.data())})})}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.DEFAULTS={toggle:!0},b.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},b.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b=a.Event("show.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.$parent&&this.$parent.find("> .panel > .in");if(c&&c.length){var d=c.data("bs.collapse");if(d&&d.transitioning)return;c.collapse("hide"),d||c.data("bs.collapse",null)}var e=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[e](0),this.transitioning=1;var f=function(){this.$element.removeClass("collapsing").addClass("in")[e]("auto"),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return f.call(this);var g=a.camelCase(["scroll",e].join("-"));this.$element.one(a.support.transition.end,a.proxy(f,this)).emulateTransitionEnd(350)[e](this.$element[0][g])}}},b.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return a.support.transition?(this.$element[c](0).one(a.support.transition.end,a.proxy(d,this)).emulateTransitionEnd(350),void 0):d.call(this)}}},b.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var c=a.fn.collapse;a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c);e||d.data("bs.collapse",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.collapse.Constructor=b,a.fn.collapse.noConflict=function(){return a.fn.collapse=c,this},a(document).on("click.bs.collapse.data-api","[data-toggle=collapse]",function(b){var c,d=a(this),e=d.attr("data-target")||b.preventDefault()||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,""),f=a(e),g=f.data("bs.collapse"),h=g?"toggle":d.data(),i=d.attr("data-parent"),j=i&&a(i);g&&g.transitioning||(j&&j.find('[data-toggle=collapse][data-parent="'+i+'"]').not(d).addClass("collapsed"),d[f.hasClass("in")?"addClass":"removeClass"]("collapsed")),f.collapse(h)})}(jQuery),+function(a){"use strict";function b(){a(d).remove(),a(e).each(function(b){var d=c(a(this));d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown")),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown"))})}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}var d=".dropdown-backdrop",e="[data-toggle=dropdown]",f=function(b){a(b).on("click.bs.dropdown",this.toggle)};f.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){if("ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b),f.trigger(d=a.Event("show.bs.dropdown")),d.isDefaultPrevented())return;f.toggleClass("open").trigger("shown.bs.dropdown"),e.focus()}return!1}},f.prototype.keydown=function(b){if(/(38|40|27)/.test(b.keyCode)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var f=c(d),g=f.hasClass("open");if(!g||g&&27==b.keyCode)return 27==b.which&&f.find(e).focus(),d.click();var h=a("[role=menu] li:not(.divider):visible a",f);if(h.length){var i=h.index(h.filter(":focus"));38==b.keyCode&&i>0&&i--,40==b.keyCode&&i<h.length-1&&i++,~i||(i=0),h.eq(i).focus()}}}};var g=a.fn.dropdown;a.fn.dropdown=function(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new f(this)),"string"==typeof b&&d[b].call(c)})},a.fn.dropdown.Constructor=f,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=g,this},a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",e,f.prototype.toggle).on("keydown.bs.dropdown.data-api",e+", [role=menu]",f.prototype.keydown)}(jQuery),+function(a){"use strict";var b=function(b,c){this.options=c,this.$element=a(b),this.$backdrop=this.isShown=null,this.options.remote&&this.$element.load(this.options.remote)};b.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},b.prototype.toggle=function(a){return this[this.isShown?"hide":"show"](a)},b.prototype.show=function(b){var c=this,d=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(d),this.isShown||d.isDefaultPrevented()||(this.isShown=!0,this.escape(),this.$element.on("click.dismiss.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.backdrop(function(){var d=a.support.transition&&c.$element.hasClass("fade");c.$element.parent().length||c.$element.appendTo(document.body),c.$element.show(),d&&c.$element[0].offsetWidth,c.$element.addClass("in").attr("aria-hidden",!1),c.enforceFocus();var e=a.Event("shown.bs.modal",{relatedTarget:b});d?c.$element.find(".modal-dialog").one(a.support.transition.end,function(){c.$element.focus().trigger(e)}).emulateTransitionEnd(300):c.$element.focus().trigger(e)}))},b.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one(a.support.transition.end,a.proxy(this.hideModal,this)).emulateTransitionEnd(300):this.hideModal())},b.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.focus()},this))},b.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keyup.dismiss.bs.modal")},b.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.removeBackdrop(),a.$element.trigger("hidden.bs.modal")})},b.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},b.prototype.backdrop=function(b){var c=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var d=a.support.transition&&c;if(this.$backdrop=a('<div class="modal-backdrop '+c+'" />').appendTo(document.body),this.$element.on("click.dismiss.modal",a.proxy(function(a){a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus.call(this.$element[0]):this.hide.call(this))},this)),d&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;d?this.$backdrop.one(a.support.transition.end,b).emulateTransitionEnd(150):b()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(a.support.transition.end,b).emulateTransitionEnd(150):b()):b&&b()};var c=a.fn.modal;a.fn.modal=function(c,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},b.DEFAULTS,e.data(),"object"==typeof c&&c);f||e.data("bs.modal",f=new b(this,g)),"string"==typeof c?f[c](d):g.show&&f.show(d)})},a.fn.modal.Constructor=b,a.fn.modal.noConflict=function(){return a.fn.modal=c,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(b){var c=a(this),d=c.attr("href"),e=a(c.attr("data-target")||d&&d.replace(/.*(?=#[^\s]+$)/,"")),f=e.data("modal")?"toggle":a.extend({remote:!/#/.test(d)&&d},e.data(),c.data());b.preventDefault(),e.modal(f,this).one("hide",function(){c.is(":visible")&&c.focus()})}),a(document).on("show.bs.modal",".modal",function(){a(document.body).addClass("modal-open")}).on("hidden.bs.modal",".modal",function(){a(document.body).removeClass("modal-open")})}(jQuery),+function(a){"use strict";var b=function(a,b){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",a,b)};b.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1},b.prototype.init=function(b,c,d){this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d);for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focus",i="hover"==g?"mouseleave":"blur";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},b.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},b.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show),void 0):c.show()},b.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide),void 0):c.hide()},b.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){if(this.$element.trigger(b),b.isDefaultPrevented())return;var c=this.tip();this.setContent(),this.options.animation&&c.addClass("fade");var d="function"==typeof this.options.placement?this.options.placement.call(this,c[0],this.$element[0]):this.options.placement,e=/\s?auto?\s?/i,f=e.test(d);f&&(d=d.replace(e,"")||"top"),c.detach().css({top:0,left:0,display:"block"}).addClass(d),this.options.container?c.appendTo(this.options.container):c.insertAfter(this.$element);var g=this.getPosition(),h=c[0].offsetWidth,i=c[0].offsetHeight;if(f){var j=this.$element.parent(),k=d,l=document.documentElement.scrollTop||document.body.scrollTop,m="body"==this.options.container?window.innerWidth:j.outerWidth(),n="body"==this.options.container?window.innerHeight:j.outerHeight(),o="body"==this.options.container?0:j.offset().left;d="bottom"==d&&g.top+g.height+i-l>n?"top":"top"==d&&g.top-l-i<0?"bottom":"right"==d&&g.right+h>m?"left":"left"==d&&g.left-h<o?"right":d,c.removeClass(k).addClass(d)}var p=this.getCalculatedOffset(d,g,h,i);this.applyPlacement(p,d),this.$element.trigger("shown.bs."+this.type)}},b.prototype.applyPlacement=function(a,b){var c,d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),a.top=a.top+g,a.left=a.left+h,d.offset(a).addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;if("top"==b&&j!=f&&(c=!0,a.top=a.top+f-j),/bottom|top/.test(b)){var k=0;a.left<0&&(k=-2*a.left,a.left=0,d.offset(a),i=d[0].offsetWidth,j=d[0].offsetHeight),this.replaceArrow(k-e+i,i,"left")}else this.replaceArrow(j-f,j,"top");c&&d.offset(a)},b.prototype.replaceArrow=function(a,b,c){this.arrow().css(c,a?50*(1-a/b)+"%":"")},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},b.prototype.hide=function(){function b(){"in"!=c.hoverState&&d.detach()}var c=this,d=this.tip(),e=a.Event("hide.bs."+this.type);return this.$element.trigger(e),e.isDefaultPrevented()?void 0:(d.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?d.one(a.support.transition.end,b).emulateTransitionEnd(150):b(),this.$element.trigger("hidden.bs."+this.type),this)},b.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},b.prototype.hasContent=function(){return this.getTitle()},b.prototype.getPosition=function(){var b=this.$element[0];return a.extend({},"function"==typeof b.getBoundingClientRect?b.getBoundingClientRect():{width:b.offsetWidth,height:b.offsetHeight},this.$element.offset())},b.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},b.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},b.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},b.prototype.validate=function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},b.prototype.enable=function(){this.enabled=!0},b.prototype.disable=function(){this.enabled=!1},b.prototype.toggleEnabled=function(){this.enabled=!this.enabled},b.prototype.toggle=function(b){var c=b?a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type):this;c.tip().hasClass("in")?c.leave(c):c.enter(c)},b.prototype.destroy=function(){this.hide().$element.off("."+this.type).removeData("bs."+this.type)};var c=a.fn.tooltip;a.fn.tooltip=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof c&&c;e||d.data("bs.tooltip",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.tooltip.Constructor=b,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=c,this}}(jQuery),+function(a){"use strict";var b=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");b.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),b.prototype.constructor=b,b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content")[this.options.html?"html":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},b.prototype.hasContent=function(){return this.getTitle()||this.getContent()},b.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},b.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var c=a.fn.popover;a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof c&&c;e||d.data("bs.popover",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.popover.Constructor=b,a.fn.popover.noConflict=function(){return a.fn.popover=c,this}}(jQuery),+function(a){"use strict";function b(c,d){var e,f=a.proxy(this.process,this);this.$element=a(c).is("body")?a(window):a(c),this.$body=a("body"),this.$scrollElement=this.$element.on("scroll.bs.scroll-spy.data-api",f),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||(e=a(c).attr("href"))&&e.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.offsets=a([]),this.targets=a([]),this.activeTarget=null,this.refresh(),this.process()}b.DEFAULTS={offset:10},b.prototype.refresh=function(){var b=this.$element[0]==window?"offset":"position";this.offsets=a([]),this.targets=a([]);var c=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#\w/.test(e)&&a(e);return f&&f.length&&[[f[b]().top+(!a.isWindow(c.$scrollElement.get(0))&&c.$scrollElement.scrollTop()),e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){c.offsets.push(this[0]),c.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,d=c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(b>=d)return g!=(a=f.last()[0])&&this.activate(a);for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,a(this.selector).parents(".active").removeClass("active");var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")};var c=a.fn.scrollspy;a.fn.scrollspy=function(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=c,this},a(window).on("load",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);b.scrollspy(b.data())})})}(jQuery),+function(a){"use strict";var b=function(b){this.element=a(b)};b.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a")[0],f=a.Event("show.bs.tab",{relatedTarget:e});if(b.trigger(f),!f.isDefaultPrevented()){var g=a(d);this.activate(b.parent("li"),c),this.activate(g,g.parent(),function(){b.trigger({type:"shown.bs.tab",relatedTarget:e})})}}},b.prototype.activate=function(b,c,d){function e(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),g?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var f=c.find("> .active"),g=d&&a.support.transition&&f.hasClass("fade");g?f.one(a.support.transition.end,e).emulateTransitionEnd(150):e(),f.removeClass("in")};var c=a.fn.tab;a.fn.tab=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new b(this)),"string"==typeof c&&e[c]()})},a.fn.tab.Constructor=b,a.fn.tab.noConflict=function(){return a.fn.tab=c,this},a(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(b){b.preventDefault(),a(this).tab("show")})}(jQuery),+function(a){"use strict";var b=function(c,d){this.options=a.extend({},b.DEFAULTS,d),this.$window=a(window).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(c),this.affixed=this.unpin=null,this.checkPosition()};b.RESET="affix affix-top affix-bottom",b.DEFAULTS={offset:0},b.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},b.prototype.checkPosition=function(){if(this.$element.is(":visible")){var c=a(document).height(),d=this.$window.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.top,h=f.bottom;"object"!=typeof f&&(h=g=f),"function"==typeof g&&(g=f.top()),"function"==typeof h&&(h=f.bottom());var i=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=h&&e.top+this.$element.height()>=c-h?"bottom":null!=g&&g>=d?"top":!1;this.affixed!==i&&(this.unpin&&this.$element.css("top",""),this.affixed=i,this.unpin="bottom"==i?e.top-d:null,this.$element.removeClass(b.RESET).addClass("affix"+(i?"-"+i:"")),"bottom"==i&&this.$element.offset({top:document.body.offsetHeight-h-this.$element.height()}))}};var c=a.fn.affix;a.fn.affix=function(c){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof c&&c;e||d.data("bs.affix",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.affix.Constructor=b,a.fn.affix.noConflict=function(){return a.fn.affix=c,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var b=a(this),c=b.data();c.offset=c.offset||{},c.offsetBottom&&(c.offset.bottom=c.offsetBottom),c.offsetTop&&(c.offset.top=c.offsetTop),b.affix(c)})})}(jQuery); \ No newline at end of file
diff --git a/docs/theme/mkdocs/js/dockerfile_tutorial.js b/docs/theme/mkdocs/js/dockerfile_tutorial.js
deleted file mode 100755
index a17cc48d61..0000000000
--- a/docs/theme/mkdocs/js/dockerfile_tutorial.js
+++ /dev/null
@@ -1,74 +0,0 @@
-function clean_input(i) {
- return i.replace(/^\s+|\s+$/g, '');
-}
-
-function clean_up(str){
- return clean_input(str).toUpperCase();
-}
-
-function dockerfile_log(level, item, errors)
-{
- var logUrl = '/tutorial/api/dockerfile_event/';
- $.ajax({
- url: logUrl,
- type: "POST",
- cache:false,
- data: {
- 'errors': errors,
- 'level': level,
- 'item': item,
- },
- }).done( function() { } );
-}
-
-function validate_email(email)
-{
- var re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
- return re.test(email);
-}
-
-$(document).ready(function() {
-
- /* prepare to send the csrf-token on each ajax-request */
- var csrftoken = $.cookie('csrftoken');
- $.ajaxSetup({
- headers: { 'X-CSRFToken': csrftoken }
- });
-
- $("#send_email").click( function()
- {
- $('#email_invalid').hide();
- $('#email_already_registered').hide();
- $('#email_registered').hide();
-
- email = $('#email').val();
- if (!validate_email(email))
- {
- $('#email_invalid').show();
- return (false);
- }
-
- var emailUrl = '/tutorial/api/subscribe/';
-
- $.ajax({
- url: emailUrl,
- type: "POST",
- cache:false,
- data: {
- 'email': email,
- 'from_level': $(this).data('level')
- },
- }).done( function(data ) {
- if (data == 1) // already registered
- {
- $('#email_already_registered').show();
- }
- else if (data == 0) // registered ok
- {
- $('#email_registered').show();
- }
-
- } );
- return (true);
- });
-})
diff --git a/docs/theme/mkdocs/js/dockerfile_tutorial_level.js b/docs/theme/mkdocs/js/dockerfile_tutorial_level.js
deleted file mode 100644
index 22f13b6ef7..0000000000
--- a/docs/theme/mkdocs/js/dockerfile_tutorial_level.js
+++ /dev/null
@@ -1,176 +0,0 @@
-function check_form1 ()
-{
- $('#level1_error0').hide();
- $('#level1_error1').hide();
- $('#level1_error2').hide();
- $('#level1_error3').hide();
-
- $('#no_good').hide();
- $('#some_good').hide();
- $('#all_good').hide();
-
- var a = clean_input($('#level1_q0').val()).toUpperCase();
- var b = clean_input($('#level1_q1').val()).toUpperCase();
- var c = clean_input($('#level1_q2').val()).toUpperCase();
- var d = clean_input($('#level1_q3').val());
- var points = 0;
-
- if (a == 'FROM'){
- points = points + 1;
- } else {
- $('#level1_error0').show();
- }
- if (b == 'RUN') {
- points = points + 1;
- } else {
- $('#level1_error1').show();
- }
- if (c == 'MAINTAINER') {
- points = points + 1;
- } else {
- $('#level1_error2').show();
- }
- if (d == '#') {
- points = points + 1;
- } else {
- $('#level1_error3').show();
- }
- if (points == 4) {// all good
- $('#all_good').show();
- } else if (points == 0) { // nothing good
- $('#no_good').show();
- } else {// some good some bad
- $('#some_good').show();
- }
- return (4 - points);
-}
-
-function check_form2 ()
-{
- $('.level_questions .alert').hide();
-
- var answers = {};
- answers[0] = ['FROM'];
- answers[1] = ['ENTRYPOINT', 'CMD'];
- answers[2] = ['#'];
- answers[3] = ['USER'];
- answers[4] = ['RUN'];
- answers[5] = ['EXPOSE'];
- answers[6] = ['MAINTAINER'];
- answers[7] = ['ENTRYPOINT', 'CMD'];
-
- var points = 0;
-
- $.each($(".level"), function(num, input){
- var cleaned = clean_up(input.value);
- if ($.inArray(cleaned, answers[num]) == -1) {
- $( $(".level_error")[num]).show()
- $(input).addClass("error_input");
- } else {
- $( $(".level_error")[num]).hide()
- $(input).removeClass("error_input");
- points += 1;
- }
- })
- if (points == 8) // all good
- {
- $('#all_good').show();
- }
- else if (points == 0) // nothing good
- {
- $('#no_good').show();
- }
- else // some good some bad
- {
- $('#some_good').show();
- }
- return (8- points);
-}
-
-function check_fill(answers)
-{
- $('#dockerfile_ok').hide();
- $('#dockerfile_ko').hide();
-
- var errors = 0;
-
- $.each($(".l_fill"), function(num, input){
- var cleaned = clean_up(input.value);
- var id = input.id;
- if (answers[id] != cleaned) {
- $(input).addClass("error_input");
- errors += 1;
- } else {
- $(input).removeClass("error_input");
- }
- });
-
- if (errors != 0)
- {
- $('#dockerfile_ko').show();
- }
- else
- {
- $('#dockerfile_ok').show();
- }
- return (errors);
-}
-
-$(document).ready(function() {
-
- $("#check_level1_questions").click( function(){
- errors = check_form1();
- dockerfile_log(1, '1_questions', errors);
- }
- );
-
- $("#check_level1_fill").click( function(){
- var answers = {};
- answers['from'] = 'FROM';
- answers['ubuntu'] = 'UNTU';
- answers['maintainer'] = 'MAINTAINER';
- answers['eric'] = 'RIC';
- answers['bardin'] = 'ARDIN';
- answers['run0'] = 'RUN';
- answers['run1'] = 'RUN';
- answers['run2'] = 'RUN';
- answers['memcached'] = 'MEMCACHED';
-
- var errors = check_fill(answers);
- dockerfile_log(1, '2_fill', errors);
- });
-
- $("#check_level2_questions").click( function(){
- errors = check_form2();
- dockerfile_log(2, '1_questions', errors);
- }
- );
-
- $("#check_level2_fill").click( function(){
- var answers = {};
- answers['from'] = "FROM";
- answers['ubuntu'] = "UNTU";
- answers['maintainer'] = "AINER";
- answers['roberto'] = "BERTO";
- answers['hashioka'] = "SHIOKA";
- answers['run0'] = "RUN";
- answers['run1'] = "RUN";
- answers['run2'] = "RUN";
- answers['run3'] = "RUN";
- answers['run4'] = "RUN";
- answers['run5'] = "RUN";
- answers['run6'] = "RUN";
- answers['entrypoint'] = "ENTRYPOINT";
- answers['user'] = "USER";
- answers['expose'] = "EXPOSE";
- answers['gcc'] = "GCC";
-
- var errors = check_fill(answers);
- dockerfile_log(2, '2_fill', errors);
- });
-
- $(".btn.btn-primary.back").click( function(event){
- event.preventDefault();
- window.history.back();
- })
-});
diff --git a/docs/theme/mkdocs/js/jquery-1.10.2.min.js b/docs/theme/mkdocs/js/jquery-1.10.2.min.js
deleted file mode 100644
index 29b3a2c7b4..0000000000
--- a/docs/theme/mkdocs/js/jquery-1.10.2.min.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/*! jQuery v1.10.2 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license
-//@ sourceMappingURL=jquery.min.map
-*/
-(function(e,t){var n,r,i=typeof t,o=e.location,a=e.document,s=a.documentElement,l=e.jQuery,u=e.$,c={},p=[],f="1.10.2",d=p.concat,h=p.push,g=p.slice,m=p.indexOf,y=c.toString,v=c.hasOwnProperty,b=f.trim,x=function(e,t){return new x.fn.init(e,t,r)},w=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=/\S+/g,C=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,k=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,E=/^[\],:{}\s]*$/,S=/(?:^|:|,)(?:\s*\[)+/g,A=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,j=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,D=/^-ms-/,L=/-([\da-z])/gi,H=function(e,t){return t.toUpperCase()},q=function(e){(a.addEventListener||"load"===e.type||"complete"===a.readyState)&&(_(),x.ready())},_=function(){a.addEventListener?(a.removeEventListener("DOMContentLoaded",q,!1),e.removeEventListener("load",q,!1)):(a.detachEvent("onreadystatechange",q),e.detachEvent("onload",q))};x.fn=x.prototype={jquery:f,constructor:x,init:function(e,n,r){var i,o;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof x?n[0]:n,x.merge(this,x.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:a,!0)),k.test(i[1])&&x.isPlainObject(n))for(i in n)x.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(o=a.getElementById(i[2]),o&&o.parentNode){if(o.id!==i[2])return r.find(e);this.length=1,this[0]=o}return this.context=a,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return g.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(g.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},l=2),"object"==typeof s||x.isFunction(s)||(s={}),u===l&&(s=this,--l);u>l;l++)if(null!=(o=arguments[l]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(x.isPlainObject(r)||(n=x.isArray(r)))?(n?(n=!1,a=e&&x.isArray(e)?e:[]):a=e&&x.isPlainObject(e)?e:{},s[i]=x.extend(c,a,r)):r!==t&&(s[i]=r));return s},x.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=l),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){if(e===!0?!--x.readyWait:!x.isReady){if(!a.body)return setTimeout(x.ready);x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(a,[x]),x.fn.trigger&&x(a).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray||function(e){return"array"===x.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?c[y.call(e)]||"object":typeof e},isPlainObject:function(e){var n;if(!e||"object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!v.call(e,"constructor")&&!v.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(r){return!1}if(x.support.ownLast)for(n in e)return v.call(e,n);for(n in e);return n===t||v.call(e,n)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||a;var r=k.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=x.trim(n),n&&E.test(n.replace(A,"@").replace(j,"]").replace(S,"")))?Function("return "+n)():(x.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||x.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&x.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(D,"ms-").replace(L,H)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:b&&!b.call("\ufeff\u00a0")?function(e){return null==e?"":b.call(e)}:function(e){return null==e?"":(e+"").replace(C,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(m)return m.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return d.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),x.isFunction(e)?(r=g.call(arguments,2),i=function(){return e.apply(n||this,r.concat(g.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):t},access:function(e,n,r,i,o,a,s){var l=0,u=e.length,c=null==r;if("object"===x.type(r)){o=!0;for(l in r)x.access(e,n,l,r[l],!0,a,s)}else if(i!==t&&(o=!0,x.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(x(e),n)})),n))for(;u>l;l++)n(e[l],r,s?i:i.call(e[l],l,n(e[l],r)));return o?e:c?n.call(e):u?n(e[0],r):a},now:function(){return(new Date).getTime()},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),x.ready.promise=function(t){if(!n)if(n=x.Deferred(),"complete"===a.readyState)setTimeout(x.ready);else if(a.addEventListener)a.addEventListener("DOMContentLoaded",q,!1),e.addEventListener("load",q,!1);else{a.attachEvent("onreadystatechange",q),e.attachEvent("onload",q);var r=!1;try{r=null==e.frameElement&&a.documentElement}catch(i){}r&&r.doScroll&&function o(){if(!x.isReady){try{r.doScroll("left")}catch(e){return setTimeout(o,50)}_(),x.ready()}}()}return n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){c["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=x(a),function(e,t){var n,r,i,o,a,s,l,u,c,p,f,d,h,g,m,y,v,b="sizzle"+-new Date,w=e.document,T=0,C=0,N=st(),k=st(),E=st(),S=!1,A=function(e,t){return e===t?(S=!0,0):0},j=typeof t,D=1<<31,L={}.hasOwnProperty,H=[],q=H.pop,_=H.push,M=H.push,O=H.slice,F=H.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},B="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",P="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",W=R.replace("w","w#"),$="\\["+P+"*("+R+")"+P+"*(?:([*^$|!~]?=)"+P+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+W+")|)|)"+P+"*\\]",I=":("+R+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+$.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+P+"+|((?:^|[^\\\\])(?:\\\\.)*)"+P+"+$","g"),X=RegExp("^"+P+"*,"+P+"*"),U=RegExp("^"+P+"*([>+~]|"+P+")"+P+"*"),V=RegExp(P+"*[+~]"),Y=RegExp("="+P+"*([^\\]'\"]*)"+P+"*\\]","g"),J=RegExp(I),G=RegExp("^"+W+"$"),Q={ID:RegExp("^#("+R+")"),CLASS:RegExp("^\\.("+R+")"),TAG:RegExp("^("+R.replace("w","w*")+")"),ATTR:RegExp("^"+$),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+P+"*(even|odd|(([+-]|)(\\d*)n|)"+P+"*(?:([+-]|)"+P+"*(\\d+)|))"+P+"*\\)|)","i"),bool:RegExp("^(?:"+B+")$","i"),needsContext:RegExp("^"+P+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+P+"*((?:-\\d)?\\d*)"+P+"*\\)|)(?=[^-]|$)","i")},K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,et=/^(?:input|select|textarea|button)$/i,tt=/^h\d$/i,nt=/'|\\/g,rt=RegExp("\\\\([\\da-f]{1,6}"+P+"?|("+P+")|.)","ig"),it=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{M.apply(H=O.call(w.childNodes),w.childNodes),H[w.childNodes.length].nodeType}catch(ot){M={apply:H.length?function(e,t){_.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function at(e,t,n,i){var o,a,s,l,u,c,d,m,y,x;if((t?t.ownerDocument||t:w)!==f&&p(t),t=t||f,n=n||[],!e||"string"!=typeof e)return n;if(1!==(l=t.nodeType)&&9!==l)return[];if(h&&!i){if(o=Z.exec(e))if(s=o[1]){if(9===l){if(a=t.getElementById(s),!a||!a.parentNode)return n;if(a.id===s)return n.push(a),n}else if(t.ownerDocument&&(a=t.ownerDocument.getElementById(s))&&v(t,a)&&a.id===s)return n.push(a),n}else{if(o[2])return M.apply(n,t.getElementsByTagName(e)),n;if((s=o[3])&&r.getElementsByClassName&&t.getElementsByClassName)return M.apply(n,t.getElementsByClassName(s)),n}if(r.qsa&&(!g||!g.test(e))){if(m=d=b,y=t,x=9===l&&e,1===l&&"object"!==t.nodeName.toLowerCase()){c=mt(e),(d=t.getAttribute("id"))?m=d.replace(nt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",u=c.length;while(u--)c[u]=m+yt(c[u]);y=V.test(e)&&t.parentNode||t,x=c.join(",")}if(x)try{return M.apply(n,y.querySelectorAll(x)),n}catch(T){}finally{d||t.removeAttribute("id")}}}return kt(e.replace(z,"$1"),t,n,i)}function st(){var e=[];function t(n,r){return e.push(n+=" ")>o.cacheLength&&delete t[e.shift()],t[n]=r}return t}function lt(e){return e[b]=!0,e}function ut(e){var t=f.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function ct(e,t){var n=e.split("|"),r=e.length;while(r--)o.attrHandle[n[r]]=t}function pt(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function ft(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function dt(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ht(e){return lt(function(t){return t=+t,lt(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}s=at.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},r=at.support={},p=at.setDocument=function(e){var n=e?e.ownerDocument||e:w,i=n.defaultView;return n!==f&&9===n.nodeType&&n.documentElement?(f=n,d=n.documentElement,h=!s(n),i&&i.attachEvent&&i!==i.top&&i.attachEvent("onbeforeunload",function(){p()}),r.attributes=ut(function(e){return e.className="i",!e.getAttribute("className")}),r.getElementsByTagName=ut(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),r.getElementsByClassName=ut(function(e){return e.innerHTML="<div class='a'></div><div class='a i'></div>",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),r.getById=ut(function(e){return d.appendChild(e).id=b,!n.getElementsByName||!n.getElementsByName(b).length}),r.getById?(o.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){return e.getAttribute("id")===t}}):(delete o.find.ID,o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),o.find.TAG=r.getElementsByTagName?function(e,n){return typeof n.getElementsByTagName!==j?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},o.find.CLASS=r.getElementsByClassName&&function(e,n){return typeof n.getElementsByClassName!==j&&h?n.getElementsByClassName(e):t},m=[],g=[],(r.qsa=K.test(n.querySelectorAll))&&(ut(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||g.push("\\["+P+"*(?:value|"+B+")"),e.querySelectorAll(":checked").length||g.push(":checked")}),ut(function(e){var t=n.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&g.push("[*^$]="+P+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||g.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),g.push(",.*:")})),(r.matchesSelector=K.test(y=d.webkitMatchesSelector||d.mozMatchesSelector||d.oMatchesSelector||d.msMatchesSelector))&&ut(function(e){r.disconnectedMatch=y.call(e,"div"),y.call(e,"[s!='']:x"),m.push("!=",I)}),g=g.length&&RegExp(g.join("|")),m=m.length&&RegExp(m.join("|")),v=K.test(d.contains)||d.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},A=d.compareDocumentPosition?function(e,t){if(e===t)return S=!0,0;var i=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t);return i?1&i||!r.sortDetached&&t.compareDocumentPosition(e)===i?e===n||v(w,e)?-1:t===n||v(w,t)?1:c?F.call(c,e)-F.call(c,t):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return S=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:c?F.call(c,e)-F.call(c,t):0;if(o===a)return pt(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?pt(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},n):f},at.matches=function(e,t){return at(e,null,null,t)},at.matchesSelector=function(e,t){if((e.ownerDocument||e)!==f&&p(e),t=t.replace(Y,"='$1']"),!(!r.matchesSelector||!h||m&&m.test(t)||g&&g.test(t)))try{var n=y.call(e,t);if(n||r.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(i){}return at(t,f,null,[e]).length>0},at.contains=function(e,t){return(e.ownerDocument||e)!==f&&p(e),v(e,t)},at.attr=function(e,n){(e.ownerDocument||e)!==f&&p(e);var i=o.attrHandle[n.toLowerCase()],a=i&&L.call(o.attrHandle,n.toLowerCase())?i(e,n,!h):t;return a===t?r.attributes||!h?e.getAttribute(n):(a=e.getAttributeNode(n))&&a.specified?a.value:null:a},at.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},at.uniqueSort=function(e){var t,n=[],i=0,o=0;if(S=!r.detectDuplicates,c=!r.sortStable&&e.slice(0),e.sort(A),S){while(t=e[o++])t===e[o]&&(i=n.push(o));while(i--)e.splice(n[i],1)}return e},a=at.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=a(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=a(t);return n},o=at.selectors={cacheLength:50,createPseudo:lt,match:Q,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(rt,it),e[3]=(e[4]||e[5]||"").replace(rt,it),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||at.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&at.error(e[0]),e},PSEUDO:function(e){var n,r=!e[5]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]&&e[4]!==t?e[2]=e[4]:r&&J.test(r)&&(n=mt(r,!0))&&(n=r.indexOf(")",r.length-n)-r.length)&&(e[0]=e[0].slice(0,n),e[2]=r.slice(0,n)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(rt,it).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=N[e+" "];return t||(t=RegExp("(^|"+P+")"+e+"("+P+"|$)"))&&N(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=at.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var u,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!l&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[b]||(m[b]={}),u=c[e]||[],d=u[0]===T&&u[1],f=u[0]===T&&u[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[T,d,f];break}}else if(v&&(u=(t[b]||(t[b]={}))[e])&&u[0]===T)f=u[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[b]||(p[b]={}))[e]=[T,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=o.pseudos[e]||o.setFilters[e.toLowerCase()]||at.error("unsupported pseudo: "+e);return r[b]?r(t):r.length>1?(n=[e,e,"",t],o.setFilters.hasOwnProperty(e.toLowerCase())?lt(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=F.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:lt(function(e){var t=[],n=[],r=l(e.replace(z,"$1"));return r[b]?lt(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:lt(function(e){return function(t){return at(e,t).length>0}}),contains:lt(function(e){return function(t){return(t.textContent||t.innerText||a(t)).indexOf(e)>-1}}),lang:lt(function(e){return G.test(e||"")||at.error("unsupported lang: "+e),e=e.replace(rt,it).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===d},focus:function(e){return e===f.activeElement&&(!f.hasFocus||f.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!o.pseudos.empty(e)},header:function(e){return tt.test(e.nodeName)},input:function(e){return et.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:ht(function(){return[0]}),last:ht(function(e,t){return[t-1]}),eq:ht(function(e,t,n){return[0>n?n+t:n]}),even:ht(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:ht(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:ht(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ht(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}},o.pseudos.nth=o.pseudos.eq;for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})o.pseudos[n]=ft(n);for(n in{submit:!0,reset:!0})o.pseudos[n]=dt(n);function gt(){}gt.prototype=o.filters=o.pseudos,o.setFilters=new gt;function mt(e,t){var n,r,i,a,s,l,u,c=k[e+" "];if(c)return t?0:c.slice(0);s=e,l=[],u=o.preFilter;while(s){(!n||(r=X.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),l.push(i=[])),n=!1,(r=U.exec(s))&&(n=r.shift(),i.push({value:n,type:r[0].replace(z," ")}),s=s.slice(n.length));for(a in o.filter)!(r=Q[a].exec(s))||u[a]&&!(r=u[a](r))||(n=r.shift(),i.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?at.error(e):k(e,l).slice(0)}function yt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function vt(e,t,n){var r=t.dir,o=n&&"parentNode"===r,a=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||o)return e(t,n,i)}:function(t,n,s){var l,u,c,p=T+" "+a;if(s){while(t=t[r])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[r])if(1===t.nodeType||o)if(c=t[b]||(t[b]={}),(u=c[r])&&u[0]===p){if((l=u[1])===!0||l===i)return l===!0}else if(u=c[r]=[p],u[1]=e(t,n,s)||i,u[1]===!0)return!0}}function bt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xt(e,t,n,r,i){var o,a=[],s=0,l=e.length,u=null!=t;for(;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),u&&t.push(s));return a}function wt(e,t,n,r,i,o){return r&&!r[b]&&(r=wt(r)),i&&!i[b]&&(i=wt(i,o)),lt(function(o,a,s,l){var u,c,p,f=[],d=[],h=a.length,g=o||Nt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:xt(g,f,e,s,l),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,l),r){u=xt(y,d),r(u,[],s,l),c=u.length;while(c--)(p=u[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){u=[],c=y.length;while(c--)(p=y[c])&&u.push(m[c]=p);i(null,y=[],u,l)}c=y.length;while(c--)(p=y[c])&&(u=i?F.call(o,p):f[c])>-1&&(o[u]=!(a[u]=p))}}else y=xt(y===a?y.splice(h,y.length):y),i?i(null,a,y,l):M.apply(a,y)})}function Tt(e){var t,n,r,i=e.length,a=o.relative[e[0].type],s=a||o.relative[" "],l=a?1:0,c=vt(function(e){return e===t},s,!0),p=vt(function(e){return F.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;i>l;l++)if(n=o.relative[e[l].type])f=[vt(bt(f),n)];else{if(n=o.filter[e[l].type].apply(null,e[l].matches),n[b]){for(r=++l;i>r;r++)if(o.relative[e[r].type])break;return wt(l>1&&bt(f),l>1&&yt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&Tt(e.slice(l,r)),i>r&&Tt(e=e.slice(r)),i>r&&yt(e))}f.push(n)}return bt(f)}function Ct(e,t){var n=0,r=t.length>0,a=e.length>0,s=function(s,l,c,p,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,C=u,N=s||a&&o.find.TAG("*",d&&l.parentNode||l),k=T+=null==C?1:Math.random()||.1;for(w&&(u=l!==f&&l,i=n);null!=(h=N[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,l,c)){p.push(h);break}w&&(T=k,i=++n)}r&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,r&&b!==v){g=0;while(m=t[g++])m(x,y,l,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=q.call(p));y=xt(y)}M.apply(p,y),w&&!s&&y.length>0&&v+t.length>1&&at.uniqueSort(p)}return w&&(T=k,u=C),x};return r?lt(s):s}l=at.compile=function(e,t){var n,r=[],i=[],o=E[e+" "];if(!o){t||(t=mt(e)),n=t.length;while(n--)o=Tt(t[n]),o[b]?r.push(o):i.push(o);o=E(e,Ct(i,r))}return o};function Nt(e,t,n){var r=0,i=t.length;for(;i>r;r++)at(e,t[r],n);return n}function kt(e,t,n,i){var a,s,u,c,p,f=mt(e);if(!i&&1===f.length){if(s=f[0]=f[0].slice(0),s.length>2&&"ID"===(u=s[0]).type&&r.getById&&9===t.nodeType&&h&&o.relative[s[1].type]){if(t=(o.find.ID(u.matches[0].replace(rt,it),t)||[])[0],!t)return n;e=e.slice(s.shift().value.length)}a=Q.needsContext.test(e)?0:s.length;while(a--){if(u=s[a],o.relative[c=u.type])break;if((p=o.find[c])&&(i=p(u.matches[0].replace(rt,it),V.test(s[0].type)&&t.parentNode||t))){if(s.splice(a,1),e=i.length&&yt(s),!e)return M.apply(n,i),n;break}}}return l(e,f)(i,t,!h,n,V.test(e)),n}r.sortStable=b.split("").sort(A).join("")===b,r.detectDuplicates=S,p(),r.sortDetached=ut(function(e){return 1&e.compareDocumentPosition(f.createElement("div"))}),ut(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||ct("type|href|height|width",function(e,n,r){return r?t:e.getAttribute(n,"type"===n.toLowerCase()?1:2)}),r.attributes&&ut(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||ct("value",function(e,n,r){return r||"input"!==e.nodeName.toLowerCase()?t:e.defaultValue}),ut(function(e){return null==e.getAttribute("disabled")})||ct(B,function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&i.specified?i.value:e[n]===!0?n.toLowerCase():null}),x.find=at,x.expr=at.selectors,x.expr[":"]=x.expr.pseudos,x.unique=at.uniqueSort,x.text=at.getText,x.isXMLDoc=at.isXML,x.contains=at.contains}(e);var O={};function F(e){var t=O[e]={};return x.each(e.match(T)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?O[e]||F(e):x.extend({},e);var n,r,i,o,a,s,l=[],u=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=l.length,n=!0;l&&o>a;a++)if(l[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,l&&(u?u.length&&c(u.shift()):r?l=[]:p.disable())},p={add:function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this},remove:function(){return l&&x.each(arguments,function(e,t){var r;while((r=x.inArray(t,l,r))>-1)l.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?x.inArray(e,l)>-1:!(!l||!l.length)},empty:function(){return l=[],o=0,this},disable:function(){return l=u=r=t,this},disabled:function(){return!l},lock:function(){return u=t,r||p.disable(),this},locked:function(){return!u},fireWith:function(e,t){return!l||i&&!u||(t=t||[],t=[e,t.slice?t.slice():t],n?u.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var a=o[0],s=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=g.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?g.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,l,u;if(r>1)for(s=Array(r),l=Array(r),u=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(a(t,u,n)).fail(o.reject).progress(a(t,l,s)):--i;return i||o.resolveWith(u,n),o.promise()}}),x.support=function(t){var n,r,o,s,l,u,c,p,f,d=a.createElement("div");if(d.setAttribute("className","t"),d.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=d.getElementsByTagName("*")||[],r=d.getElementsByTagName("a")[0],!r||!r.style||!n.length)return t;s=a.createElement("select"),u=s.appendChild(a.createElement("option")),o=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t.getSetAttribute="t"!==d.className,t.leadingWhitespace=3===d.firstChild.nodeType,t.tbody=!d.getElementsByTagName("tbody").length,t.htmlSerialize=!!d.getElementsByTagName("link").length,t.style=/top/.test(r.getAttribute("style")),t.hrefNormalized="/a"===r.getAttribute("href"),t.opacity=/^0.5/.test(r.style.opacity),t.cssFloat=!!r.style.cssFloat,t.checkOn=!!o.value,t.optSelected=u.selected,t.enctype=!!a.createElement("form").enctype,t.html5Clone="<:nav></:nav>"!==a.createElement("nav").cloneNode(!0).outerHTML,t.inlineBlockNeedsLayout=!1,t.shrinkWrapBlocks=!1,t.pixelPosition=!1,t.deleteExpando=!0,t.noCloneEvent=!0,t.reliableMarginRight=!0,t.boxSizingReliable=!0,o.checked=!0,t.noCloneChecked=o.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!u.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}o=a.createElement("input"),o.setAttribute("value",""),t.input=""===o.getAttribute("value"),o.value="t",o.setAttribute("type","radio"),t.radioValue="t"===o.value,o.setAttribute("checked","t"),o.setAttribute("name","t"),l=a.createDocumentFragment(),l.appendChild(o),t.appendChecked=o.checked,t.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip;for(f in x(t))break;return t.ownLast="0"!==f,x(function(){var n,r,o,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",l=a.getElementsByTagName("body")[0];l&&(n=a.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",l.appendChild(n).appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",o=d.getElementsByTagName("td"),o[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===o[0].offsetHeight,o[0].style.display="",o[1].style.display="none",t.reliableHiddenOffsets=p&&0===o[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",x.swap(l,null!=l.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===d.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(a.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="<div></div>",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(l.style.zoom=1)),l.removeChild(n),n=d=o=r=null)}),n=s=l=u=r=o=null,t
-}({});var B=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;function R(e,n,r,i){if(x.acceptData(e)){var o,a,s=x.expando,l=e.nodeType,u=l?x.cache:e,c=l?e[s]:e[s]&&s;if(c&&u[c]&&(i||u[c].data)||r!==t||"string"!=typeof n)return c||(c=l?e[s]=p.pop()||x.guid++:s),u[c]||(u[c]=l?{}:{toJSON:x.noop}),("object"==typeof n||"function"==typeof n)&&(i?u[c]=x.extend(u[c],n):u[c].data=x.extend(u[c].data,n)),a=u[c],i||(a.data||(a.data={}),a=a.data),r!==t&&(a[x.camelCase(n)]=r),"string"==typeof n?(o=a[n],null==o&&(o=a[x.camelCase(n)])):o=a,o}}function W(e,t,n){if(x.acceptData(e)){var r,i,o=e.nodeType,a=o?x.cache:e,s=o?e[x.expando]:x.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){x.isArray(t)?t=t.concat(x.map(t,x.camelCase)):t in r?t=[t]:(t=x.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;while(i--)delete r[t[i]];if(n?!I(r):!x.isEmptyObject(r))return}(n||(delete a[s].data,I(a[s])))&&(o?x.cleanData([e],!0):x.support.deleteExpando||a!=a.window?delete a[s]:a[s]=null)}}}x.extend({cache:{},noData:{applet:!0,embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?x.cache[e[x.expando]]:e[x.expando],!!e&&!I(e)},data:function(e,t,n){return R(e,t,n)},removeData:function(e,t){return W(e,t)},_data:function(e,t,n){return R(e,t,n,!0)},_removeData:function(e,t){return W(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&x.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),x.fn.extend({data:function(e,n){var r,i,o=null,a=0,s=this[0];if(e===t){if(this.length&&(o=x.data(s),1===s.nodeType&&!x._data(s,"parsedAttrs"))){for(r=s.attributes;r.length>a;a++)i=r[a].name,0===i.indexOf("data-")&&(i=x.camelCase(i.slice(5)),$(s,i,o[i]));x._data(s,"parsedAttrs",!0)}return o}return"object"==typeof e?this.each(function(){x.data(this,e)}):arguments.length>1?this.each(function(){x.data(this,e,n)}):s?$(s,e,x.data(s,e)):null},removeData:function(e){return this.each(function(){x.removeData(this,e)})}});function $(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(P,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:B.test(r)?x.parseJSON(r):r}catch(o){}x.data(e,n,r)}else r=t}return r}function I(e){var t;for(t in e)if(("data"!==t||!x.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}x.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=x._data(e,n),r&&(!i||x.isArray(r)?i=x._data(e,n,x.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),a=function(){x.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return x._data(e,n)||x._data(e,n,{empty:x.Callbacks("once memory").add(function(){x._removeData(e,t+"queue"),x._removeData(e,n)})})}}),x.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?x.queue(this[0],e):n===t?this:this.each(function(){var t=x.queue(this,e,n);x._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=x.Deferred(),a=this,s=this.length,l=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=x._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(l));return l(),o.promise(n)}});var z,X,U=/[\t\r\n\f]/g,V=/\r/g,Y=/^(?:input|select|textarea|button|object)$/i,J=/^(?:a|area)$/i,G=/^(?:checked|selected)$/i,Q=x.support.getSetAttribute,K=x.support.input;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return e=x.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,l="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,l=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var t,r=0,o=x(this),a=e.match(T)||[];while(t=a[r++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else(n===i||"boolean"===n)&&(this.className&&x._data(this,"__className__",this.className),this.className=this.className||e===!1?"":x._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(U," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=x.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=i?e.call(this,n,x(this).val()):e,null==o?o="":"number"==typeof o?o+="":x.isArray(o)&&(o=x.map(o,function(e){return null==e?"":e+""})),r=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(V,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=x.find.attr(e,"value");return null!=t?t:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,l=0>i?s:o?i:0;for(;s>l;l++)if(n=r[l],!(!n.selected&&l!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),a=i.length;while(a--)r=i[a],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,n,r){var o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===i?x.prop(e,n,r):(1===s&&x.isXMLDoc(e)||(n=n.toLowerCase(),o=x.attrHooks[n]||(x.expr.match.bool.test(n)?X:z)),r===t?o&&"get"in o&&null!==(a=o.get(e,n))?a:(a=x.find.attr(e,n),null==a?t:a):null!==r?o&&"set"in o&&(a=o.set(e,r,n))!==t?a:(e.setAttribute(n,r+""),r):(x.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(T);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)?K&&Q||!G.test(n)?e[r]=!1:e[x.camelCase("default-"+n)]=e[r]=!1:x.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!x.isXMLDoc(e),a&&(n=x.propFix[n]||n,o=x.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var t=x.find.attr(e,"tabindex");return t?parseInt(t,10):Y.test(e.nodeName)||J.test(e.nodeName)&&e.href?0:-1}}}}),X={set:function(e,t,n){return t===!1?x.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&x.propFix[n]||n,n):e[x.camelCase("default-"+n)]=e[n]=!0,n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,n){var r=x.expr.attrHandle[n]||x.find.attr;x.expr.attrHandle[n]=K&&Q||!G.test(n)?function(e,n,i){var o=x.expr.attrHandle[n],a=i?t:(x.expr.attrHandle[n]=t)!=r(e,n,i)?n.toLowerCase():null;return x.expr.attrHandle[n]=o,a}:function(e,n,r){return r?t:e[x.camelCase("default-"+n)]?n.toLowerCase():null}}),K&&Q||(x.attrHooks.value={set:function(e,n,r){return x.nodeName(e,"input")?(e.defaultValue=n,t):z&&z.set(e,n,r)}}),Q||(z={set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},x.expr.attrHandle.id=x.expr.attrHandle.name=x.expr.attrHandle.coords=function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&""!==i.value?i.value:null},x.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&r.specified?r.value:t},set:z.set},x.attrHooks.contenteditable={set:function(e,t,n){z.set(e,""===t?!1:t,n)}},x.each(["width","height"],function(e,n){x.attrHooks[n]={set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}}})),x.support.hrefNormalized||x.each(["href","src"],function(e,t){x.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),x.support.style||(x.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.support.enctype||(x.propFix.enctype="encoding"),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,n){return x.isArray(n)?e.checked=x.inArray(x(e).val(),n)>=0:t}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}function at(){try{return a.activeElement}catch(e){}}x.event={global:{},add:function(e,n,r,o,a){var s,l,u,c,p,f,d,h,g,m,y,v=x._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=x.guid++),(l=v.events)||(l=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof x===i||e&&x.event.triggered===e.type?t:x.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(T)||[""],u=n.length;while(u--)s=rt.exec(n[u])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),g&&(p=x.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=x.event.special[g]||{},d=x.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&x.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=l[g])||(h=l[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),x.event.global[g]=!0);e=null}},remove:function(e,t,n,r,i){var o,a,s,l,u,c,p,f,d,h,g,m=x.hasData(e)&&x._data(e);if(m&&(c=m.events)){t=(t||"").match(T)||[""],u=t.length;while(u--)if(s=rt.exec(t[u])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=x.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),l=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));l&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||x.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)x.event.remove(e,d+t[u],n,r,!0);x.isEmptyObject(c)&&(delete m.handle,x._removeData(e,"events"))}},trigger:function(n,r,i,o){var s,l,u,c,p,f,d,h=[i||a],g=v.call(n,"type")?n.type:n,m=v.call(n,"namespace")?n.namespace.split("."):[];if(u=f=i=i||a,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+x.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),l=0>g.indexOf(":")&&"on"+g,n=n[x.expando]?n:new x.Event(g,"object"==typeof n&&n),n.isTrigger=o?2:3,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:x.makeArray(r,[n]),p=x.event.special[g]||{},o||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!o&&!p.noBubble&&!x.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(u=u.parentNode);u;u=u.parentNode)h.push(u),f=u;f===(i.ownerDocument||a)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((u=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(x._data(u,"events")||{})[n.type]&&x._data(u,"handle"),s&&s.apply(u,r),s=l&&u[l],s&&x.acceptData(u)&&s.apply&&s.apply(u,r)===!1&&n.preventDefault();if(n.type=g,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(h.pop(),r)===!1)&&x.acceptData(i)&&l&&i[g]&&!x.isWindow(i)){f=i[l],f&&(i[l]=null),x.event.triggered=g;try{i[g]()}catch(y){}x.event.triggered=t,f&&(i[l]=f)}return n.result}},dispatch:function(e){e=x.event.fix(e);var n,r,i,o,a,s=[],l=g.call(arguments),u=(x._data(this,"events")||{})[e.type]||[],c=x.event.special[e.type]||{};if(l[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((x.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,l),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],l=n.delegateCount,u=e.target;if(l&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(o=[],a=0;l>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?x(r,this).index(u)>=0:x.find(r,this,null,[u]).length),o[r]&&o.push(i);o.length&&s.push({elem:u,handlers:o})}return n.length>l&&s.push({elem:this,handlers:n.slice(l)}),s},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,o=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new x.Event(o),t=r.length;while(t--)n=r[t],e[n]=o[n];return e.target||(e.target=o.srcElement||a),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,o):e},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(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,o,s=n.button,l=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||a,o=i.documentElement,r=i.body,e.pageX=n.clientX+(o&&o.scrollLeft||r&&r.scrollLeft||0)-(o&&o.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(o&&o.scrollTop||r&&r.scrollTop||0)-(o&&o.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&l&&(e.relatedTarget=l===e.target?n.toElement:l),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==at()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===at()&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},click:{trigger:function(){return x.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=a.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},x.Event=function(e,n){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&x.extend(this,n),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,t):new x.Event(e,n)},x.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.submitBubbles||(x.event.special.submit={setup:function(){return x.nodeName(this,"form")?!1:(x.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=x.nodeName(n,"input")||x.nodeName(n,"button")?n.form:t;r&&!x._data(r,"submitBubbles")&&(x.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),x._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&x.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return x.nodeName(this,"form")?!1:(x.event.remove(this,"._submit"),t)}}),x.support.changeBubbles||(x.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(x.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),x.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),x.event.simulate("change",this,e,!0)})),!1):(x.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!x._data(t,"changeBubbles")&&(x.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||x.event.simulate("change",this.parentNode,e,!0)}),x._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return x.event.remove(this,"._change"),!Z.test(this.nodeName)}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&a.addEventListener(e,r,!0)},teardown:function(){0===--n&&a.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return x().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=x.guid++)),this.each(function(){x.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,x(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){x.event.remove(this,e,r,n)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?x.event.trigger(e,n,r,!0):t}});var st=/^.[^:#\[\.,]*$/,lt=/^(?:parents|prev(?:Until|All))/,ut=x.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t,n=x(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(x.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e||[],!0))},filter:function(e){return this.pushStack(ft(this,e||[],!1))},is:function(e){return!!ft(this,"string"==typeof e&&ut.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],a=ut.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(a?a.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?x.inArray(this[0],x(e)):x.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return x.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(ct[e]||(i=x.unique(i)),lt.test(e)&&(i=i.reverse())),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!x(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(st.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return x.inArray(e,t)>=0!==n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/<tbody/i,wt=/<|&#?\w+;/,Tt=/<(?:script|style|link)/i,Ct=/^(?:checkbox|radio)$/i,Nt=/checked\s*(?:[^=]|=\s*.checked.)/i,kt=/^$|\/(?:java|ecma)script/i,Et=/^true\/(.*)/,St=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,At={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:x.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},jt=dt(a),Dt=jt.appendChild(a.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===t?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||a).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(Ft(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&_t(Ft(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&x.cleanData(Ft(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&x.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!x.support.htmlSerialize&&mt.test(e)||!x.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1></$2>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(x.cleanData(Ft(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=d.apply([],e);var r,i,o,a,s,l,u=0,c=this.length,p=this,f=c-1,h=e[0],g=x.isFunction(h);if(g||!(1>=c||"string"!=typeof h||x.support.checkClone)&&Nt.test(h))return this.each(function(r){var i=p.eq(r);g&&(e[0]=h.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(l=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),r=l.firstChild,1===l.childNodes.length&&(l=r),r)){for(a=x.map(Ft(l,"script"),Ht),o=a.length;c>u;u++)i=l,u!==f&&(i=x.clone(i,!0,!0),o&&x.merge(a,Ft(i,"script"))),t.call(this[u],i,u);if(o)for(s=a[a.length-1].ownerDocument,x.map(a,qt),u=0;o>u;u++)i=a[u],kt.test(i.type||"")&&!x._data(i,"globalEval")&&x.contains(s,i)&&(i.src?x._evalUrl(i.src):x.globalEval((i.text||i.textContent||i.innerHTML||"").replace(St,"")));l=r=null}return this}});function Lt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function Ht(e){return e.type=(null!==x.find.attr(e,"type"))+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function _t(e,t){var n,r=0;for(;null!=(n=e[r]);r++)x._data(n,"globalEval",!t||x._data(t[r],"globalEval"))}function Mt(e,t){if(1===t.nodeType&&x.hasData(e)){var n,r,i,o=x._data(e),a=x._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)x.event.add(t,n,s[n][r])}a.data&&(a.data=x.extend({},a.data))}}function Ot(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!x.support.noCloneEvent&&t[x.expando]){i=x._data(t);for(r in i.events)x.removeEvent(t,r,i.handle);t.removeAttribute(x.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),x.support.html5Clone&&e.innerHTML&&!x.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Ct.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=0,i=[],o=x(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),x(o[r])[t](n),h.apply(i,n.get());return this.pushStack(i)}});function Ft(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||x.nodeName(o,n)?s.push(o):x.merge(s,Ft(o,n));return n===t||n&&x.nodeName(e,n)?x.merge([e],s):s}function Bt(e){Ct.test(e.type)&&(e.defaultChecked=e.checked)}x.extend({clone:function(e,t,n){var r,i,o,a,s,l=x.contains(e.ownerDocument,e);if(x.support.html5Clone||x.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(x.support.noCloneEvent&&x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(r=Ft(o),s=Ft(e),a=0;null!=(i=s[a]);++a)r[a]&&Ot(i,r[a]);if(t)if(n)for(s=s||Ft(e),r=r||Ft(o),a=0;null!=(i=s[a]);a++)Mt(i,r[a]);else Mt(e,o);return r=Ft(o,"script"),r.length>0&&_t(r,!l&&Ft(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,l,u,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===x.type(o))x.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),l=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[l]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1></$2>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!x.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!x.support.tbody){o="table"!==l||xt.test(o)?"<table>"!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)x.nodeName(u=o.childNodes[i],"tbody")&&!u.childNodes.length&&o.removeChild(u)}x.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),x.support.appendChecked||x.grep(Ft(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===x.inArray(o,r))&&(a=x.contains(o.ownerDocument,o),s=Ft(f.appendChild(o),"script"),a&&_t(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,l=x.expando,u=x.cache,c=x.support.deleteExpando,f=x.event.special;for(;null!=(n=e[s]);s++)if((t||x.acceptData(n))&&(o=n[l],a=o&&u[o])){if(a.events)for(r in a.events)f[r]?x.event.remove(n,r):x.removeEvent(n,r,a.handle);
-u[o]&&(delete u[o],c?delete n[l]:typeof n.removeAttribute!==i?n.removeAttribute(l):n[l]=null,p.push(o))}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})}}),x.fn.extend({wrapAll:function(e){if(x.isFunction(e))return this.each(function(t){x(this).wrapAll(e.call(this,t))});if(this[0]){var t=x(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+w+")(.*)$","i"),Yt=RegExp("^("+w+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+w+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=x._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=x._data(r,"olddisplay",ln(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&x._data(r,"olddisplay",i?n:x.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}x.fn.extend({css:function(e,n){return x.access(this,function(e,n,r){var i,o,a={},s=0;if(x.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=x.css(e,n[s],!1,o);return a}return r!==t?x.style(e,n,r):x.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){nn(this)?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":x.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,l=x.camelCase(n),u=e.style;if(n=x.cssProps[l]||(x.cssProps[l]=tn(u,l)),s=x.cssHooks[n]||x.cssHooks[l],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:u[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(x.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||x.cssNumber[l]||(r+="px"),x.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(u[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{u[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,l=x.camelCase(n);return n=x.cssProps[l]||(x.cssProps[l]=tn(e.style,l)),s=x.cssHooks[n]||x.cssHooks[l],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||x.isNumeric(o)?o||0:a):a}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s.getPropertyValue(n)||s[n]:t,u=e.style;return s&&(""!==l||x.contains(e.ownerDocument,e)||(l=x.style(e,n)),Yt.test(l)&&Ut.test(n)&&(i=u.width,o=u.minWidth,a=u.maxWidth,u.minWidth=u.maxWidth=u.width=l,l=s.width,u.width=i,u.minWidth=o,u.maxWidth=a)),l}):a.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s[n]:t,u=e.style;return null==l&&u&&u[n]&&(l=u[n]),Yt.test(l)&&!zt.test(n)&&(i=u.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),u.left="fontSize"===n?"1em":l,l=u.pixelLeft+"px",u.left=i,a&&(o.left=a)),""===l?"auto":l});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=x.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=x.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=x.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=x.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=x.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function ln(e){var t=a,n=Gt[e];return n||(n=un(e,t),"none"!==n&&n||(Pt=(Pt||x("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(Pt[0].contentWindow||Pt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=un(e,t),Pt.detach()),Gt[e]=n),n}function un(e,t){var n=x(t.createElement(e)).appendTo(t.body),r=x.css(n[0],"display");return n.remove(),r}x.each(["height","width"],function(e,n){x.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&Xt.test(x.css(e,"display"))?x.swap(e,Qt,function(){return sn(e,n,i)}):sn(e,n,i):t},set:function(e,t,r){var i=r&&Rt(e);return on(e,t,r?an(e,n,r,x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,i),i):0)}}}),x.support.opacity||(x.cssHooks.opacity={get:function(e,t){return It.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=x.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===x.trim(o.replace($t,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=$t.test(o)?o.replace($t,i):o+" "+i)}}),x(function(){x.support.reliableMarginRight||(x.cssHooks.marginRight={get:function(e,n){return n?x.swap(e,{display:"inline-block"},Wt,[e,"marginRight"]):t}}),!x.support.pixelPosition&&x.fn.position&&x.each(["top","left"],function(e,n){x.cssHooks[n]={get:function(e,r){return r?(r=Wt(e,n),Yt.test(r)?x(e).position()[n]+"px":r):t}}})}),x.expr&&x.expr.filters&&(x.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight||!x.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||x.css(e,"display"))},x.expr.filters.visible=function(e){return!x.expr.filters.hidden(e)}),x.each({margin:"",padding:"",border:"Width"},function(e,t){x.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+Zt[r]+t]=o[r]||o[r-2]||o[0];return i}},Ut.test(e)||(x.cssHooks[e+t].set=on)});var cn=/%20/g,pn=/\[\]$/,fn=/\r?\n/g,dn=/^(?:submit|button|image|reset|file)$/i,hn=/^(?:input|select|textarea|keygen)/i;x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=x.prop(this,"elements");return e?x.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!x(this).is(":disabled")&&hn.test(this.nodeName)&&!dn.test(e)&&(this.checked||!Ct.test(e))}).map(function(e,t){var n=x(this).val();return null==n?null:x.isArray(n)?x.map(n,function(e){return{name:t.name,value:e.replace(fn,"\r\n")}}):{name:t.name,value:n.replace(fn,"\r\n")}}).get()}}),x.param=function(e,n){var r,i=[],o=function(e,t){t=x.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=x.ajaxSettings&&x.ajaxSettings.traditional),x.isArray(e)||e.jquery&&!x.isPlainObject(e))x.each(e,function(){o(this.name,this.value)});else for(r in e)gn(r,e[r],n,o);return i.join("&").replace(cn,"+")};function gn(e,t,n,r){var i;if(x.isArray(t))x.each(t,function(t,i){n||pn.test(e)?r(e,i):gn(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==x.type(t))r(e,t);else for(i in t)gn(e+"["+i+"]",t[i],n,r)}x.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){x.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),x.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}});var mn,yn,vn=x.now(),bn=/\?/,xn=/#.*$/,wn=/([?&])_=[^&]*/,Tn=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Cn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Nn=/^(?:GET|HEAD)$/,kn=/^\/\//,En=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Sn=x.fn.load,An={},jn={},Dn="*/".concat("*");try{yn=o.href}catch(Ln){yn=a.createElement("a"),yn.href="",yn=yn.href}mn=En.exec(yn.toLowerCase())||[];function Hn(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(T)||[];if(x.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,n,r,i){var o={},a=e===jn;function s(l){var u;return o[l]=!0,x.each(e[l]||[],function(e,l){var c=l(n,r,i);return"string"!=typeof c||a||o[c]?a?!(u=c):t:(n.dataTypes.unshift(c),s(c),!1)}),u}return s(n.dataTypes[0])||!o["*"]&&s("*")}function _n(e,n){var r,i,o=x.ajaxSettings.flatOptions||{};for(i in n)n[i]!==t&&((o[i]?e:r||(r={}))[i]=n[i]);return r&&x.extend(!0,e,r),e}x.fn.load=function(e,n,r){if("string"!=typeof e&&Sn)return Sn.apply(this,arguments);var i,o,a,s=this,l=e.indexOf(" ");return l>=0&&(i=e.slice(l,e.length),e=e.slice(0,l)),x.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(a="POST"),s.length>0&&x.ajax({url:e,type:a,dataType:"html",data:n}).done(function(e){o=arguments,s.html(i?x("<div>").append(x.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},x.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){x.fn[t]=function(e){return this.on(t,e)}}),x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Cn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":x.parseJSON,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?_n(_n(e,x.ajaxSettings),t):_n(x.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,l,u,c,p=x.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?x(f):x.event,h=x.Deferred(),g=x.Callbacks("once memory"),m=p.statusCode||{},y={},v={},b=0,w="canceled",C={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return b||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>b)for(t in e)m[t]=[m[t],e[t]];else C.always(e[C.status]);return this},abort:function(e){var t=e||w;return u&&u.abort(t),k(0,t),this}};if(h.promise(C).complete=g.add,C.success=C.done,C.error=C.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=x.trim(p.dataType||"*").toLowerCase().match(T)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?"80":"443"))===(mn[3]||("http:"===mn[1]?"80":"443")))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=x.param(p.data,p.traditional)),qn(An,p,n,C),2===b)return C;l=p.global,l&&0===x.active++&&x.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Nn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(x.lastModified[o]&&C.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&C.setRequestHeader("If-None-Match",x.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&C.setRequestHeader("Content-Type",p.contentType),C.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)C.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,C,p)===!1||2===b))return C.abort();w="abort";for(i in{success:1,error:1,complete:1})C[i](p[i]);if(u=qn(jn,p,n,C)){C.readyState=1,l&&d.trigger("ajaxSend",[C,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){C.abort("timeout")},p.timeout));try{b=1,u.send(y,k)}catch(N){if(!(2>b))throw N;k(-1,N)}}else k(-1,"No Transport");function k(e,n,r,i){var c,y,v,w,T,N=n;2!==b&&(b=2,s&&clearTimeout(s),u=t,a=i||"",C.readyState=e>0?4:0,c=e>=200&&300>e||304===e,r&&(w=Mn(p,C,r)),w=On(p,w,C,c),c?(p.ifModified&&(T=C.getResponseHeader("Last-Modified"),T&&(x.lastModified[o]=T),T=C.getResponseHeader("etag"),T&&(x.etag[o]=T)),204===e||"HEAD"===p.type?N="nocontent":304===e?N="notmodified":(N=w.state,y=w.data,v=w.error,c=!v)):(v=N,(e||!N)&&(N="error",0>e&&(e=0))),C.status=e,C.statusText=(n||N)+"",c?h.resolveWith(f,[y,N,C]):h.rejectWith(f,[C,N,v]),C.statusCode(m),m=t,l&&d.trigger(c?"ajaxSuccess":"ajaxError",[C,p,c?y:v]),g.fireWith(f,[C,N]),l&&(d.trigger("ajaxComplete",[C,p]),--x.active||x.event.trigger("ajaxStop")))}return C},getJSON:function(e,t,n){return x.get(e,t,n,"json")},getScript:function(e,n){return x.get(e,t,n,"script")}}),x.each(["get","post"],function(e,n){x[n]=function(e,r,i,o){return x.isFunction(r)&&(o=o||i,i=r,r=t),x.ajax({url:e,type:n,dataType:o,data:r,success:i})}});function Mn(e,n,r){var i,o,a,s,l=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in l)if(l[s]&&l[s].test(o)){u.unshift(s);break}if(u[0]in r)a=u[0];else{for(s in r){if(!u[0]||e.converters[s+" "+u[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==u[0]&&u.unshift(a),r[a]):t}function On(e,t,n,r){var i,o,a,s,l,u={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)u[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!l&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),l=o,o=c.shift())if("*"===o)o=l;else if("*"!==l&&l!==o){if(a=u[l+" "+o]||u["* "+o],!a)for(i in u)if(s=i.split(" "),s[1]===o&&(a=u[l+" "+s[0]]||u["* "+s[0]])){a===!0?a=u[i]:u[i]!==!0&&(o=s[0],c.unshift(s[1]));break}if(a!==!0)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(p){return{state:"parsererror",error:a?p:"No conversion from "+l+" to "+o}}}return{state:"success",data:t}}x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return x.globalEval(e),e}}}),x.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),x.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=a.head||x("head")[0]||a.documentElement;return{send:function(t,i){n=a.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var Fn=[],Bn=/(=)\?(?=&|$)|\?\?/;x.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Fn.pop()||x.expando+"_"+vn++;return this[e]=!0,e}}),x.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,l=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return l||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=x.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,l?n[l]=n[l].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||x.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,Fn.push(o)),s&&x.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}x.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=x.ajaxSettings.xhr(),x.support.cors=!!Rn&&"withCredentials"in Rn,Rn=x.support.ajax=!!Rn,Rn&&x.ajaxTransport(function(n){if(!n.crossDomain||x.support.cors){var r;return{send:function(i,o){var a,s,l=n.xhr();if(n.username?l.open(n.type,n.url,n.async,n.username,n.password):l.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)l[s]=n.xhrFields[s];n.mimeType&&l.overrideMimeType&&l.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)l.setRequestHeader(s,i[s])}catch(u){}l.send(n.hasContent&&n.data||null),r=function(e,i){var s,u,c,p;try{if(r&&(i||4===l.readyState))if(r=t,a&&(l.onreadystatechange=x.noop,$n&&delete Pn[a]),i)4!==l.readyState&&l.abort();else{p={},s=l.status,u=l.getAllResponseHeaders(),"string"==typeof l.responseText&&(p.text=l.responseText);try{c=l.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,u)},n.async?4===l.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},x(e).unload($n)),Pn[a]=r),l.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+w+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n=this.createTween(e,t),r=n.cur(),i=Yn.exec(t),o=i&&i[3]||(x.cssNumber[e]?"":"px"),a=(x.cssNumber[e]||"px"!==o&&+r)&&Yn.exec(x.css(n.elem,e)),s=1,l=20;if(a&&a[3]!==o){o=o||a[3],i=i||[],a=+r||1;do s=s||".5",a/=s,x.style(n.elem,e,a+o);while(s!==(s=n.cur()/r)&&1!==s&&--l)}return i&&(a=n.start=+a||+r||0,n.unit=o,n.end=i[1]?a+(i[1]+1)*i[2]:+i[2]),n}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=x.now()}function Zn(e,t,n){var r,i=(Qn[t]||[]).concat(Qn["*"]),o=0,a=i.length;for(;a>o;o++)if(r=i[o].call(n,t,e))return r}function er(e,t,n){var r,i,o=0,a=Gn.length,s=x.Deferred().always(function(){delete l.elem}),l=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,u.startTime+u.duration-t),r=n/u.duration||0,o=1-r,a=0,l=u.tweens.length;for(;l>a;a++)u.tweens[a].run(o);return s.notifyWith(e,[u,o,n]),1>o&&l?n:(s.resolveWith(e,[u]),!1)},u=s.promise({elem:e,props:x.extend({},t),opts:x.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=x.Tween(e,u.opts,t,n,u.opts.specialEasing[t]||u.opts.easing);return u.tweens.push(r),r},stop:function(t){var n=0,r=t?u.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)u.tweens[n].run(1);return t?s.resolveWith(e,[u,t]):s.rejectWith(e,[u,t]),this}}),c=u.props;for(tr(c,u.opts.specialEasing);a>o;o++)if(r=Gn[o].call(u,e,c,u.opts))return r;return x.map(c,Zn,u),x.isFunction(u.opts.start)&&u.opts.start.call(e,u),x.fx.timer(x.extend(l,{elem:e,anim:u,queue:u.opts.queue})),u.progress(u.opts.progress).done(u.opts.done,u.opts.complete).fail(u.opts.fail).always(u.opts.always)}function tr(e,t){var n,r,i,o,a;for(n in e)if(r=x.camelCase(n),i=t[r],o=e[n],x.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),a=x.cssHooks[r],a&&"expand"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}x.Animation=x.extend(er,{tweener:function(e,t){x.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,l,u=this,c={},p=e.style,f=e.nodeType&&nn(e),d=x._data(e,"fxshow");n.queue||(s=x._queueHooks(e,"fx"),null==s.unqueued&&(s.unqueued=0,l=s.empty.fire,s.empty.fire=function(){s.unqueued||l()}),s.unqueued++,u.always(function(){u.always(function(){s.unqueued--,x.queue(e,"fx").length||s.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],"inline"===x.css(e,"display")&&"none"===x.css(e,"float")&&(x.support.inlineBlockNeedsLayout&&"inline"!==ln(e.nodeName)?p.zoom=1:p.display="inline-block")),n.overflow&&(p.overflow="hidden",x.support.shrinkWrapBlocks||u.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],Vn.exec(i)){if(delete t[r],o=o||"toggle"===i,i===(f?"hide":"show"))continue;c[r]=d&&d[r]||x.style(e,r)}if(!x.isEmptyObject(c)){d?"hidden"in d&&(f=d.hidden):d=x._data(e,"fxshow",{}),o&&(d.hidden=!f),f?x(e).show():u.done(function(){x(e).hide()}),u.done(function(){var t;x._removeData(e,"fxshow");for(t in c)x.style(e,t,c[t])});for(r in c)a=Zn(f?d[r]:0,r,u),r in d||(d[r]=a.start,f&&(a.end=a.start,a.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}x.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(x.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?x.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=x.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){x.fx.step[e.prop]?x.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[x.cssProps[e.prop]]||x.cssHooks[e.prop])?x.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},x.each(["toggle","show","hide"],function(e,t){var n=x.fn[t];x.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),x.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=x.isEmptyObject(e),o=x.speed(t,n,r),a=function(){var t=er(this,x.extend({},e),o);(i||x._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=x.timers,a=x._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&x.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=x._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=x.timers,a=r?r.length:0;for(n.finish=!0,x.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}x.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){x.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),x.speed=function(e,t,n){var r=e&&"object"==typeof e?x.extend({},e):{complete:n||!n&&t||x.isFunction(e)&&e,duration:e,easing:n&&t||t&&!x.isFunction(t)&&t};return r.duration=x.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in x.fx.speeds?x.fx.speeds[r.duration]:x.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){x.isFunction(r.old)&&r.old.call(this),r.queue&&x.dequeue(this,r.queue)},r},x.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},x.timers=[],x.fx=rr.prototype.init,x.fx.tick=function(){var e,n=x.timers,r=0;for(Xn=x.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||x.fx.stop(),Xn=t},x.fx.timer=function(e){e()&&x.timers.push(e)&&x.fx.start()},x.fx.interval=13,x.fx.start=function(){Un||(Un=setInterval(x.fx.tick,x.fx.interval))},x.fx.stop=function(){clearInterval(Un),Un=null},x.fx.speeds={slow:600,fast:200,_default:400},x.fx.step={},x.expr&&x.expr.filters&&(x.expr.filters.animated=function(e){return x.grep(x.timers,function(t){return e===t.elem}).length}),x.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){x.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,x.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},x.offset={setOffset:function(e,t,n){var r=x.css(e,"position");"static"===r&&(e.style.position="relative");var i=x(e),o=i.offset(),a=x.css(e,"top"),s=x.css(e,"left"),l=("absolute"===r||"fixed"===r)&&x.inArray("auto",[a,s])>-1,u={},c={},p,f;l?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),x.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(u.top=t.top-o.top+p),null!=t.left&&(u.left=t.left-o.left+f),"using"in t?t.using.call(e,u):i.css(u)}},x.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===x.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),x.nodeName(e[0],"html")||(n=e.offset()),n.top+=x.css(e[0],"borderTopWidth",!0),n.left+=x.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-x.css(r,"marginTop",!0),left:t.left-n.left-x.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||s;while(e&&!x.nodeName(e,"html")&&"static"===x.css(e,"position"))e=e.offsetParent;return e||s})}}),x.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);x.fn[e]=function(i){return x.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?x(a).scrollLeft():o,r?o:x(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return x.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}x.each({Height:"height",Width:"width"},function(e,n){x.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){x.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return x.access(this,function(n,r,i){var o;return x.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?x.css(n,r,s):x.style(n,r,i,s)},n,a?i:t,a,null)}})}),x.fn.size=function(){return this.length},x.fn.andSelf=x.fn.addBack,"object"==typeof module&&module&&"object"==typeof module.exports?module.exports=x:(e.jQuery=e.$=x,"function"==typeof define&&define.amd&&define("jquery",[],function(){return x}))})(window);
diff --git a/docs/theme/mkdocs/js/jquery-scrolltofixed-min.js b/docs/theme/mkdocs/js/jquery-scrolltofixed-min.js
deleted file mode 100644
index 5382c04485..0000000000
--- a/docs/theme/mkdocs/js/jquery-scrolltofixed-min.js
+++ /dev/null
@@ -1,8 +0,0 @@
-/*
- * ScrollToFixed
- * https://github.com/bigspotteddog/ScrollToFixed
- *
- * Copyright (c) 2011 Joseph Cava-Lynch
- * MIT license
- */
-(function(a){a.isScrollToFixed=function(b){return !!a(b).data("ScrollToFixed")};a.ScrollToFixed=function(d,i){var l=this;l.$el=a(d);l.el=d;l.$el.data("ScrollToFixed",l);var c=false;var F=l.$el;var G;var D;var e;var C=0;var q=0;var j=-1;var f=-1;var t=null;var y;var g;function u(){F.trigger("preUnfixed.ScrollToFixed");k();F.trigger("unfixed.ScrollToFixed");f=-1;C=F.offset().top;q=F.offset().left;if(l.options.offsets){q+=(F.offset().left-F.position().left)}if(j==-1){j=q}G=F.css("position");c=true;if(l.options.bottom!=-1){F.trigger("preFixed.ScrollToFixed");w();F.trigger("fixed.ScrollToFixed")}}function n(){var H=l.options.limit;if(!H){return 0}if(typeof(H)==="function"){return H.apply(F)}return H}function p(){return G==="fixed"}function x(){return G==="absolute"}function h(){return !(p()||x())}function w(){if(!p()){t.css({display:F.css("display"),width:F.outerWidth(true),height:F.outerHeight(true),"float":F.css("float")});cssOptions={position:"fixed",top:l.options.bottom==-1?s():"",bottom:l.options.bottom==-1?"":l.options.bottom,"margin-left":"0px"};if(!l.options.dontSetWidth){cssOptions.width=F.width()}F.css(cssOptions);F.addClass(l.options.baseClassName);if(l.options.className){F.addClass(l.options.className)}G="fixed"}}function b(){var I=n();var H=q;if(l.options.removeOffsets){H="";I=I-C}cssOptions={position:"absolute",top:I,left:H,"margin-left":"0px",bottom:""};if(!l.options.dontSetWidth){cssOptions.width=F.width()}F.css(cssOptions);G="absolute"}function k(){if(!h()){f=-1;t.css("display","none");F.css({width:"",position:D,left:"",top:e,"margin-left":""});F.removeClass("scroll-to-fixed-fixed");if(l.options.className){F.removeClass(l.options.className)}G=null}}function v(H){if(H!=f){F.css("left",q-H);f=H}}function s(){var H=l.options.marginTop;if(!H){return 0}if(typeof(H)==="function"){return H.apply(F)}return H}function z(){if(!a.isScrollToFixed(F)){return}var J=c;if(!c){u()}var H=a(window).scrollLeft();var K=a(window).scrollTop();var I=n();if(l.options.minWidth&&a(window).width()<l.options.minWidth){if(!h()||!J){o();F.trigger("preUnfixed.ScrollToFixed");k();F.trigger("unfixed.ScrollToFixed")}}else{if(l.options.maxWidth&&a(window).width()>l.options.maxWidth){if(!h()||!J){o();F.trigger("preUnfixed.ScrollToFixed");k();F.trigger("unfixed.ScrollToFixed")}}else{if(l.options.bottom==-1){if(I>0&&K>=I-s()){if(!x()||!J){o();F.trigger("preAbsolute.ScrollToFixed");b();F.trigger("unfixed.ScrollToFixed")}}else{if(K>=C-s()){if(!p()||!J){o();F.trigger("preFixed.ScrollToFixed");w();f=-1;F.trigger("fixed.ScrollToFixed")}v(H)}else{if(!h()||!J){o();F.trigger("preUnfixed.ScrollToFixed");k();F.trigger("unfixed.ScrollToFixed")}}}}else{if(I>0){if(K+a(window).height()-F.outerHeight(true)>=I-(s()||-m())){if(p()){o();F.trigger("preUnfixed.ScrollToFixed");if(D==="absolute"){b()}else{k()}F.trigger("unfixed.ScrollToFixed")}}else{if(!p()){o();F.trigger("preFixed.ScrollToFixed");w()}v(H);F.trigger("fixed.ScrollToFixed")}}else{v(H)}}}}}function m(){if(!l.options.bottom){return 0}return l.options.bottom}function o(){var H=F.css("position");if(H=="absolute"){F.trigger("postAbsolute.ScrollToFixed")}else{if(H=="fixed"){F.trigger("postFixed.ScrollToFixed")}else{F.trigger("postUnfixed.ScrollToFixed")}}}var B=function(H){if(F.is(":visible")){c=false;z()}};var E=function(H){z()};var A=function(){var I=document.body;if(document.createElement&&I&&I.appendChild&&I.removeChild){var K=document.createElement("div");if(!K.getBoundingClientRect){return null}K.innerHTML="x";K.style.cssText="position:fixed;top:100px;";I.appendChild(K);var L=I.style.height,M=I.scrollTop;I.style.height="3000px";I.scrollTop=500;var H=K.getBoundingClientRect().top;I.style.height=L;var J=(H===100);I.removeChild(K);I.scrollTop=M;return J}return null};var r=function(H){H=H||window.event;if(H.preventDefault){H.preventDefault()}H.returnValue=false};l.init=function(){l.options=a.extend({},a.ScrollToFixed.defaultOptions,i);l.$el.css("z-index",l.options.zIndex);t=a("<div />");G=F.css("position");D=F.css("position");e=F.css("top");if(h()){l.$el.after(t)}a(window).bind("resize.ScrollToFixed",B);a(window).bind("scroll.ScrollToFixed",E);if(l.options.preFixed){F.bind("preFixed.ScrollToFixed",l.options.preFixed)}if(l.options.postFixed){F.bind("postFixed.ScrollToFixed",l.options.postFixed)}if(l.options.preUnfixed){F.bind("preUnfixed.ScrollToFixed",l.options.preUnfixed)}if(l.options.postUnfixed){F.bind("postUnfixed.ScrollToFixed",l.options.postUnfixed)}if(l.options.preAbsolute){F.bind("preAbsolute.ScrollToFixed",l.options.preAbsolute)}if(l.options.postAbsolute){F.bind("postAbsolute.ScrollToFixed",l.options.postAbsolute)}if(l.options.fixed){F.bind("fixed.ScrollToFixed",l.options.fixed)}if(l.options.unfixed){F.bind("unfixed.ScrollToFixed",l.options.unfixed)}if(l.options.spacerClass){t.addClass(l.options.spacerClass)}F.bind("resize.ScrollToFixed",function(){t.height(F.height())});F.bind("scroll.ScrollToFixed",function(){F.trigger("preUnfixed.ScrollToFixed");k();F.trigger("unfixed.ScrollToFixed");z()});F.bind("detach.ScrollToFixed",function(H){r(H);F.trigger("preUnfixed.ScrollToFixed");k();F.trigger("unfixed.ScrollToFixed");a(window).unbind("resize.ScrollToFixed",B);a(window).unbind("scroll.ScrollToFixed",E);F.unbind(".ScrollToFixed");t.remove();l.$el.removeData("ScrollToFixed")});B()};l.init()};a.ScrollToFixed.defaultOptions={marginTop:0,limit:0,bottom:-1,zIndex:1000,baseClassName:"scroll-to-fixed-fixed"};a.fn.scrollToFixed=function(b){return this.each(function(){(new a.ScrollToFixed(this,b))})}})(jQuery);
diff --git a/docs/theme/mkdocs/js/jquery.cookie.js b/docs/theme/mkdocs/js/jquery.cookie.js
deleted file mode 100644
index 3fb201c6a0..0000000000
--- a/docs/theme/mkdocs/js/jquery.cookie.js
+++ /dev/null
@@ -1,90 +0,0 @@
-/*!
- * jQuery Cookie Plugin v1.3.1
- * https://github.com/carhartl/jquery-cookie
- *
- * Copyright 2013 Klaus Hartl
- * Released under the MIT license
- */
-(function ($, document, undefined) {
-
- var pluses = /\+/g;
-
- function raw(s) {
- return s;
- }
-
- function decoded(s) {
- return unRfc2068(decodeURIComponent(s.replace(pluses, ' ')));
- }
-
- function unRfc2068(value) {
- if (value.indexOf('"') === 0) {
- // This is a quoted cookie as according to RFC2068, unescape
- value = value.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\');
- }
- return value;
- }
-
- function fromJSON(value) {
- return config.json ? JSON.parse(value) : value;
- }
-
- var config = $.cookie = function (key, value, options) {
-
- // write
- if (value !== undefined) {
- options = $.extend({}, config.defaults, options);
-
- if (value === null) {
- options.expires = -1;
- }
-
- if (typeof options.expires === 'number') {
- var days = options.expires, t = options.expires = new Date();
- t.setDate(t.getDate() + days);
- }
-
- value = config.json ? JSON.stringify(value) : String(value);
-
- return (document.cookie = [
- encodeURIComponent(key), '=', config.raw ? value : encodeURIComponent(value),
- options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
- options.path ? '; path=' + options.path : '',
- options.domain ? '; domain=' + options.domain : '',
- options.secure ? '; secure' : ''
- ].join(''));
- }
-
- // read
- var decode = config.raw ? raw : decoded;
- var cookies = document.cookie.split('; ');
- var result = key ? null : {};
- for (var i = 0, l = cookies.length; i < l; i++) {
- var parts = cookies[i].split('=');
- var name = decode(parts.shift());
- var cookie = decode(parts.join('='));
-
- if (key && key === name) {
- result = fromJSON(cookie);
- break;
- }
-
- if (!key) {
- result[name] = fromJSON(cookie);
- }
- }
-
- return result;
- };
-
- config.defaults = {};
-
- $.removeCookie = function (key, options) {
- if ($.cookie(key) !== null) {
- $.cookie(key, null, options);
- return true;
- }
- return false;
- };
-
-})(jQuery, document);
diff --git a/docs/theme/mkdocs/js/prettify-1.0.min.js b/docs/theme/mkdocs/js/prettify-1.0.min.js
deleted file mode 100644
index eef5ad7e6a..0000000000
--- a/docs/theme/mkdocs/js/prettify-1.0.min.js
+++ /dev/null
@@ -1,28 +0,0 @@
-var q=null;window.PR_SHOULD_USE_CONTINUATION=!0;
-(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),a=
-[],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c<i;++c){var j=f[c];if(/\\[bdsw]/i.test(j))a.push(j);else{var j=m(j),d;c+2<i&&"-"===f[c+1]?(d=m(f[c+2]),c+=2):d=j;b.push([j,d]);d<65||j>122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;c<b.length;++c)i=b[c],i[0]<=j[1]+1?j[1]=Math.max(j[1],i[1]):f.push(j=i);b=["["];o&&b.push("^");b.push.apply(b,a);for(c=0;c<
-f.length;++c)i=f[c],b.push(e(i[0])),i[1]>i[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c<b;++c){var j=f[c];j==="("?++i:"\\"===j.charAt(0)&&(j=+j.substring(1))&&j<=i&&(d[j]=-1)}for(c=1;c<d.length;++c)-1===d[c]&&(d[c]=++t);for(i=c=0;c<b;++c)j=f[c],j==="("?(++i,d[i]===void 0&&(f[c]="(?:")):"\\"===j.charAt(0)&&
-(j=+j.substring(1))&&j<=i&&(f[c]="\\"+d[i]);for(i=c=0;c<b;++c)"^"===f[c]&&"^"!==f[c+1]&&(f[c]="");if(a.ignoreCase&&s)for(c=0;c<b;++c)j=f[c],a=j.charAt(0),j.length>=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p<d;++p){var g=a[p];if(g.ignoreCase)l=!0;else if(/[a-z]/i.test(g.source.replace(/\\u[\da-f]{4}|\\x[\da-f]{2}|\\[^UXux]/gi,""))){s=!0;l=!1;break}}for(var r=
-{b:8,t:9,n:10,v:11,f:12,r:13},n=[],p=0,d=a.length;p<d;++p){g=a[p];if(g.global||g.multiline)throw Error(""+g);n.push("(?:"+y(g)+")")}return RegExp(n.join("|"),l?"gi":"g")}function M(a){function m(a){switch(a.nodeType){case 1:if(e.test(a.className))break;for(var g=a.firstChild;g;g=g.nextSibling)m(g);g=a.nodeName;if("BR"===g||"LI"===g)h[s]="\n",t[s<<1]=y++,t[s++<<1|1]=a;break;case 3:case 4:g=a.nodeValue,g.length&&(g=p?g.replace(/\r\n?/g,"\n"):g.replace(/[\t\n\r ]+/g," "),h[s]=g,t[s<<1]=y,y+=g.length,
-t[s++<<1|1]=a)}}var e=/(?:^|\s)nocode(?:\s|$)/,h=[],y=0,t=[],s=0,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=document.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);m(a);return{a:h.join("").replace(/\n$/,""),c:t}}function B(a,m,e,h){m&&(a={a:m,d:a},e(a),h.push.apply(h,a.e))}function x(a,m){function e(a){for(var l=a.d,p=[l,"pln"],d=0,g=a.a.match(y)||[],r={},n=0,z=g.length;n<z;++n){var f=g[n],b=r[f],o=void 0,c;if(typeof b===
-"string")c=!1;else{var i=h[f.charAt(0)];if(i)o=f.match(i[1]),b=i[0];else{for(c=0;c<t;++c)if(i=m[c],o=f.match(i[1])){b=i[0];break}o||(b="pln")}if((c=b.length>=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m),
-l=[],p={},d=0,g=e.length;d<g;++d){var r=e[d],n=r[3];if(n)for(var k=n.length;--k>=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/,
-q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com",/^#[^\n\r]*/,
-q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]);a=(""+a.keywords).replace(/^ | $/g,
-"");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("BR"===a.nodeName)h(a),
-a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e}
-for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g<d.length;++g)e(d[g]);m===(m|0)&&d[0].setAttribute("value",
-m);var r=s.createElement("OL");r.className="linenums";for(var n=Math.max(0,m-1|0)||0,g=0,z=d.length;g<z;++g)l=d[g],l.className="L"+(g+n)%10,l.firstChild||l.appendChild(s.createTextNode("\xa0")),r.appendChild(l);a.appendChild(r)}function k(a,m){for(var e=m.length;--e>=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*</.test(m)?"default-markup":"default-code";return A[a]}function E(a){var m=
-a.g;try{var e=M(a.h),h=e.a;a.a=h;a.c=e.c;a.d=0;C(m,h)(a);var k=/\bMSIE\b/.test(navigator.userAgent),m=/\n/g,t=a.a,s=t.length,e=0,l=a.c,p=l.length,h=0,d=a.e,g=d.length,a=0;d[g]=s;var r,n;for(n=r=0;n<g;)d[n]!==d[n+2]?(d[r++]=d[n++],d[r++]=d[n++]):n+=2;g=r;for(n=r=0;n<g;){for(var z=d[n],f=d[n+1],b=n+2;b+2<=g&&d[b+1]===f;)b+=2;d[r++]=z;d[r++]=f;n=b}for(d.length=r;h<p;){var o=l[h+2]||s,c=d[a+2]||s,b=Math.min(o,c),i=l[h+1],j;if(i.nodeType!==1&&(j=t.substring(e,b))){k&&(j=j.replace(m,"\r"));i.nodeValue=
-j;var u=i.ownerDocument,v=u.createElement("SPAN");v.className=d[a+1];var x=i.parentNode;x.replaceChild(v,i);v.appendChild(i);e<o&&(l[h+1]=i=u.createTextNode(t.substring(b,o)),x.insertBefore(i,v.nextSibling))}e=b;e>=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"],
-"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"],
-H=[G,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"],
-J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+
-I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^<?]+/],["dec",/^<!\w[^>]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),
-["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css",
-/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),
-["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes",
-hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p<h.length&&l.now()<e;p++){var n=h[p],k=n.className;if(k.indexOf("prettyprint")>=0){var k=k.match(g),f,b;if(b=
-!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&"CODE"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName==="pre"||o.tagName==="code"||o.tagName==="xmp")&&o.className&&o.className.indexOf("prettyprint")>=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p<h.length?setTimeout(m,
-250):a&&a()}for(var e=[document.getElementsByTagName("pre"),document.getElementsByTagName("code"),document.getElementsByTagName("xmp")],h=[],k=0;k<e.length;++k)for(var t=0,s=e[k].length;t<s;++t)h.push(e[k][t]);var e=q,l=Date;l.now||(l={now:function(){return+new Date}});var p=0,d,g=/\blang(?:uage)?-([\w.]+)(?!\S)/;m()};window.PR={createSimpleLexer:x,registerLangHandler:k,sourceDecorator:u,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",
-PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ"}})();
diff --git a/docs/theme/mkdocs/nav.html b/docs/theme/mkdocs/nav.html
deleted file mode 100644
index 301d9fc693..0000000000
--- a/docs/theme/mkdocs/nav.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<nav id="nav_menu" class="clearfix navbar navbar-default navbar-static-top affix" role="navigation">
- <div id="docsnav">
- <ul id="main-nav" class="pull-left">
- {% for menu in nav %}
- {% if menu.title != '**HIDDEN**' %}
- <li class="dd_menu pull-left{% if menu.active %} active{% endif %}">
- {% for first_item in menu.children[:1] %}
- <a href="{{ first_item.url }}">{{ menu.title }}</a>
- {% endfor %}
- <ul class="dd_submenu" style="max-height: 75px;">
- {% for menu in menu.children %}
- <li {% if menu.active %}class="active"{% endif %}>
- <a href="{{ menu.url }}">{{ menu.title }}</a>
- </li>
- {% endfor %}
- </ul>
- </li>
- {% endif %}
- {% endfor %}
- </ul>
- </div>
-</nav>
diff --git a/docs/theme/mkdocs/prev_next.html b/docs/theme/mkdocs/prev_next.html
deleted file mode 100644
index 693bfbcaa4..0000000000
--- a/docs/theme/mkdocs/prev_next.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<ul id="nav_prev_next" class="nav navbar-nav">
- <li class="prev{% if not previous_page %} disabled{% endif %}">
- <a rel="next" {% if previous_page %}href="{{ previous_page.url }}"{% endif %}>
- <i class="glyphicon glyphicon-chevron-left"></i> Previous Doc
- <span>{{ previous_page.title }}</span>
- </a>
- </li>
- <li class="next{% if not next_page %} disabled{% endif %}">
- <a rel="prev" {% if next_page %}href="{{ next_page.url }}"{% endif %}>
- Next Doc <i class="glyphicon glyphicon-chevron-right"></i>
- <span>{{ next_page.title }}</span>
- </a>
- </li>
-</ul>
-
-<ul id="scroll_to_top" class="nav navbar-nav">
- <li>
- <a href="#">
- <i class="glyphicon glyphicon-chevron-up"></i> Up!
- </a>
- </li>
-</ul> \ No newline at end of file
diff --git a/docs/theme/mkdocs/tipuesearch/img/loader.gif b/docs/theme/mkdocs/tipuesearch/img/loader.gif
deleted file mode 100644
index 9c97738a27..0000000000
--- a/docs/theme/mkdocs/tipuesearch/img/loader.gif
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/tipuesearch/img/search.png b/docs/theme/mkdocs/tipuesearch/img/search.png
deleted file mode 100755
index 9ab0f2c1a9..0000000000
--- a/docs/theme/mkdocs/tipuesearch/img/search.png
+++ /dev/null
Binary files differ
diff --git a/docs/theme/mkdocs/tipuesearch/tipuesearch.css b/docs/theme/mkdocs/tipuesearch/tipuesearch.css
deleted file mode 100755
index d5847d22dc..0000000000
--- a/docs/theme/mkdocs/tipuesearch/tipuesearch.css
+++ /dev/null
@@ -1,136 +0,0 @@
-
-/*
-Tipue Search 3.1
-Copyright (c) 2013 Tipue
-Tipue Search is released under the MIT License
-http://www.tipue.com/search
-*/
-
-#tipue_search_button
-{
- width: 70px;
- height: 36px;
- border: 0;
- border-radius: 1px;
- background: #75a8fb url('img/search.png') no-repeat center;
- outline: none;
-}
-#tipue_search_button:hover
-{
- background-color: #5193fb;
-}
-
-#tipue_search_content
-{
- clear: left;
- max-width: 650px;
- padding: 25px 0 13px 0;
- margin: 0;
-}
-#tipue_search_loading
-{
- padding-top: 60px;
- background: #fff url('img/loader.gif') no-repeat left;
-}
-
-#tipue_search_warning_head
-{
- font: 300 16px/1.6 'Open Sans', sans-serif;
-}
-#tipue_search_warning
-{
- font: 13px/1.6 'Open Sans', sans-serif;
- margin: 7px 0;
-}
-#tipue_search_warning a
-{
- font-weight: 300;
- text-decoration: none;
-}
-#tipue_search_warning a:hover
-{
-}
-#tipue_search_results_count
-{
- font: 13px/1.6 'Open Sans', sans-serif;
-}
-.tipue_search_content_title
-{
- font: 300 23px/1.6 'Open Sans', sans-serif;
- text-rendering: optimizelegibility;
- margin-top: 23px;
-}
-.tipue_search_content_title a
-{
- text-decoration: none;
-}
-.tipue_search_content_title a:hover
-{
-}
-.tipue_search_content_text
-{
- font: 13px/1.7 'Open Sans', sans-serif;
- padding: 13px 0;
- word-break: break-all;
- word-break: break-word;
- -webkit-hyphens: auto;
- -moz-hyphens: auto;
- hyphens: auto;
-}
-.tipue_search_content_loc
-{
- font: 300 13px/1.7 'Open Sans', sans-serif;
- word-break: break-all;
- word-break: break-word;
- -webkit-hyphens: auto;
- -moz-hyphens: auto;
- hyphens: auto;
-}
-.tipue_search_content_loc a
-{
- text-decoration: none;
-}
-.tipue_search_content_loc a:hover
-{
-}
-#tipue_search_foot
-{
- margin: 51px 0 21px 0;
-}
-#tipue_search_foot_boxes
-{
- padding: 0;
- margin: 0;
- font: 12px/1 'Open Sans', sans-serif;
-}
-#tipue_search_foot_boxes li
-{
- list-style: none;
- margin: 0;
- padding: 0;
- display: inline;
-}
-#tipue_search_foot_boxes li a
-{
- padding: 9px 15px 10px 15px;
- background-color: #f1f1f1;
- border: 1px solid #dcdcdc;
- border-radius: 1px;
- margin-right: 7px;
- text-decoration: none;
- text-align: center;
-}
-#tipue_search_foot_boxes li.current
-{
- padding: 9px 15px 10px 15px;
- background: #fff;
- border: 1px solid #dcdcdc;
- border-radius: 1px;
- margin-right: 7px;
- text-align: center;
-}
-#tipue_search_foot_boxes li a:hover
-{
- border: 1px solid #ccc;
- background-color: #f3f3f3;
-}
diff --git a/docs/theme/mkdocs/tipuesearch/tipuesearch.js b/docs/theme/mkdocs/tipuesearch/tipuesearch.js
deleted file mode 100644
index 01c09f2b8c..0000000000
--- a/docs/theme/mkdocs/tipuesearch/tipuesearch.js
+++ /dev/null
@@ -1,383 +0,0 @@
-
-/*
-Tipue Search 3.1
-Copyright (c) 2013 Tipue
-Tipue Search is released under the MIT License
-http://www.tipue.com/search
-*/
-
-
-(function($) {
-
- $.fn.tipuesearch = function(options) {
-
- var set = $.extend( {
-
- 'show' : 7,
- 'newWindow' : false,
- 'showURL' : true,
- 'minimumLength' : 3,
- 'descriptiveWords' : 25,
- 'highlightTerms' : true,
- 'highlightEveryTerm' : false,
- 'mode' : 'static',
- 'liveDescription' : '*',
- 'liveContent' : '*',
- 'contentLocation' : 'tipuesearch/tipuesearch_content.json'
-
- }, options);
-
- return this.each(function() {
-
- var tipuesearch_in = {
- pages: []
- };
- $.ajaxSetup({
- async: false
- });
-
- if (set.mode == 'live')
- {
- for (var i = 0; i < tipuesearch_pages.length; i++)
- {
- $.get(tipuesearch_pages[i], '',
- function (html)
- {
- var cont = $(set.liveContent, html).text();
- cont = cont.replace(/\s+/g, ' ');
- var desc = $(set.liveDescription, html).text();
- desc = desc.replace(/\s+/g, ' ');
-
- var t_1 = html.toLowerCase().indexOf('<title>');
- var t_2 = html.toLowerCase().indexOf('</title>', t_1 + 7);
- if (t_1 != -1 && t_2 != -1)
- {
- var tit = html.slice(t_1 + 7, t_2);
- }
- else
- {
- var tit = 'No title';
- }
-
- tipuesearch_in.pages.push({
- "title": tit,
- "text": desc,
- "tags": cont,
- "loc": tipuesearch_pages[i]
- });
- }
- );
- }
- }
-
- if (set.mode == 'json')
- {
- $.getJSON(set.contentLocation,
- function(json)
- {
- tipuesearch_in = $.extend({}, json);
- }
- );
- }
-
- if (set.mode == 'static')
- {
- tipuesearch_in = $.extend({}, tipuesearch);
- }
-
- var tipue_search_w = '';
- if (set.newWindow)
- {
- tipue_search_w = ' target="_blank"';
- }
-
- function getURLP(name)
- {
- return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.search)||[,""])[1].replace(/\+/g, '%20')) || null;
- }
- if (getURLP('q'))
- {
- $('#tipue_search_input').val(getURLP('q'));
- getTipueSearch(0, true);
- }
-
- $('#tipue_search_button').click(function()
- {
- getTipueSearch(0, true);
- });
- $(this).keyup(function(event)
- {
- if(event.keyCode == '13')
- {
- getTipueSearch(0, true);
- }
- });
-
- function getTipueSearch(start, replace)
- {
- $('#tipue_search_content').hide();
- var out = '';
- var results = '';
- var show_replace = false;
- var show_stop = false;
-
- var d = $('#tipue_search_input').val().toLowerCase();
- d = $.trim(d);
- var d_w = d.split(' ');
- d = '';
- for (var i = 0; i < d_w.length; i++)
- {
- var a_w = true;
- for (var f = 0; f < tipuesearch_stop_words.length; f++)
- {
- if (d_w[i] == tipuesearch_stop_words[f])
- {
- a_w = false;
- show_stop = true;
- }
- }
- if (a_w)
- {
- d = d + ' ' + d_w[i];
- }
- }
- d = $.trim(d);
- d_w = d.split(' ');
-
- if (d.length >= set.minimumLength)
- {
- if (replace)
- {
- var d_r = d;
- for (var i = 0; i < d_w.length; i++)
- {
- for (var f = 0; f < tipuesearch_replace.words.length; f++)
- {
- if (d_w[i] == tipuesearch_replace.words[f].word)
- {
- d = d.replace(d_w[i], tipuesearch_replace.words[f].replace_with);
- show_replace = true;
- }
- }
- }
- d_w = d.split(' ');
- }
-
- var d_t = d;
- for (var i = 0; i < d_w.length; i++)
- {
- for (var f = 0; f < tipuesearch_stem.words.length; f++)
- {
- if (d_w[i] == tipuesearch_stem.words[f].word)
- {
- d_t = d_t + ' ' + tipuesearch_stem.words[f].stem;
- }
- }
- }
- d_w = d_t.split(' ');
-
- var c = 0;
- found = new Array();
- for (var i = 0; i < tipuesearch_in.pages.length; i++)
- {
- var score = 1000000000;
- var s_t = tipuesearch_in.pages[i].text;
- for (var f = 0; f < d_w.length; f++)
- {
- var pat = new RegExp(d_w[f], 'i');
- if (tipuesearch_in.pages[i].title.search(pat) != -1)
- {
- score -= (200000 - i);
- }
- if (tipuesearch_in.pages[i].text.search(pat) != -1)
- {
- score -= (150000 - i);
- }
-
- if (set.highlightTerms)
- {
- if (set.highlightEveryTerm)
- {
- var patr = new RegExp('(' + d_w[f] + ')', 'gi');
- }
- else
- {
- var patr = new RegExp('(' + d_w[f] + ')', 'i');
- }
- s_t = s_t.replace(patr, "<b>$1</b>");
- }
- if (tipuesearch_in.pages[i].tags.search(pat) != -1)
- {
- score -= (100000 - i);
- }
-
- }
- if (score < 1000000000)
- {
- found[c++] = score + '^' + tipuesearch_in.pages[i].title + '^' + s_t + '^' + tipuesearch_in.pages[i].loc;
- }
- }
-
- if (c != 0)
- {
- if (show_replace == 1)
- {
- out += '<div id="tipue_search_warning_head">Showing results for ' + d + '</div>';
- out += '<div id="tipue_search_warning">Search for <a href="javascript:void(0)" id="tipue_search_replaced">' + d_r + '</a></div>';
- }
- if (c == 1)
- {
- out += '<div id="tipue_search_results_count">1 result</div>';
- }
- else
- {
- c_c = c.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
- out += '<div id="tipue_search_results_count">' + c_c + ' results</div>';
- }
-
- found.sort();
- var l_o = 0;
- for (var i = 0; i < found.length; i++)
- {
- var fo = found[i].split('^');
- if (l_o >= start && l_o < set.show + start)
- {
- out += '<div class="tipue_search_content_title"><a href="' + fo[3] + '"' + tipue_search_w + '>' + fo[1] + '</a></div>';
-
- var t = fo[2];
- var t_d = '';
- var t_w = t.split(' ');
- if (t_w.length < set.descriptiveWords)
- {
- t_d = t;
- }
- else
- {
- for (var f = 0; f < set.descriptiveWords; f++)
- {
- t_d += t_w[f] + ' ';
- }
- }
- t_d = $.trim(t_d);
- if (t_d.charAt(t_d.length - 1) != '.')
- {
- t_d += ' ...';
- }
- out += '<div class="tipue_search_content_text">' + t_d + '</div>';
-
- if (set.showURL)
- {
- out += '<div class="tipue_search_content_loc"><a href="' + fo[3] + '"' + tipue_search_w + '>' + fo[3] + '</a></div>';
- }
- }
- l_o++;
- }
-
- if (c > set.show)
- {
- var pages = Math.ceil(c / set.show);
- var page = (start / set.show);
- out += '<div id="tipue_search_foot"><ul id="tipue_search_foot_boxes">';
-
- if (start > 0)
- {
- out += '<li><a href="javascript:void(0)" class="tipue_search_foot_box" id="' + (start - set.show) + '_' + replace + '">&#171; Prev</a></li>';
- }
-
- if (page <= 2)
- {
- var p_b = pages;
- if (pages > 3)
- {
- p_b = 3;
- }
- for (var f = 0; f < p_b; f++)
- {
- if (f == page)
- {
- out += '<li class="current">' + (f + 1) + '</li>';
- }
- else
- {
- out += '<li><a href="javascript:void(0)" class="tipue_search_foot_box" id="' + (f * set.show) + '_' + replace + '">' + (f + 1) + '</a></li>';
- }
- }
- }
- else
- {
- var p_b = pages + 2;
- if (p_b > pages)
- {
- p_b = pages;
- }
- for (var f = page; f < p_b; f++)
- {
- if (f == page)
- {
- out += '<li class="current">' + (f + 1) + '</li>';
- }
- else
- {
- out += '<li><a href="javascript:void(0)" class="tipue_search_foot_box" id="' + (f * set.show) + '_' + replace + '">' + (f + 1) + '</a></li>';
- }
- }
- }
-
- if (page + 1 != pages)
- {
- out += '<li><a href="javascript:void(0)" class="tipue_search_foot_box" id="' + (start + set.show) + '_' + replace + '">Next &#187;</a></li>';
- }
-
- out += '</ul></div>';
- }
- }
- else
- {
- out += '<div id="tipue_search_warning_head">Nothing found</div>';
- }
- }
- else
- {
- if (show_stop)
- {
- out += '<div id="tipue_search_warning_head">Nothing found</div><div id="tipue_search_warning">Common words are largely ignored</div>';
- }
- else
- {
- out += '<div id="tipue_search_warning_head">Search too short</div>';
- if (set.minimumLength == 1)
- {
- out += '<div id="tipue_search_warning">Should be one character or more</div>';
- }
- else
- {
- out += '<div id="tipue_search_warning">Should be ' + set.minimumLength + ' characters or more</div>';
- }
- }
- }
-
- $('#tipue_search_content').html(out);
- $('#tipue_search_content').slideDown(200);
-
- $('#tipue_search_replaced').click(function()
- {
- getTipueSearch(0, false);
- });
-
- $('.tipue_search_foot_box').click(function()
- {
- var id_v = $(this).attr('id');
- var id_a = id_v.split('_');
-
- getTipueSearch(parseInt(id_a[0]), id_a[1]);
- });
- }
-
- });
- };
-
-})(jQuery);
-
-
-
-
diff --git a/docs/theme/mkdocs/tipuesearch/tipuesearch.min.js b/docs/theme/mkdocs/tipuesearch/tipuesearch.min.js
deleted file mode 100644
index bfc66f1f64..0000000000
--- a/docs/theme/mkdocs/tipuesearch/tipuesearch.min.js
+++ /dev/null
@@ -1,12 +0,0 @@
-(function($){$.fn.tipuesearch=function(options){var set=$.extend({"show":7,"newWindow":false,"showURL":true,"minimumLength":3,"descriptiveWords":25,"highlightTerms":true,"highlightEveryTerm":false,"mode":"static","liveDescription":"*","liveContent":"*","contentLocation":"tipuesearch/tipuesearch_content.json"},options);return this.each(function(){var tipuesearch_in={pages:[]};$.ajaxSetup({async:false});if(set.mode=="live")for(var i=0;i<tipuesearch_pages.length;i++)$.get(tipuesearch_pages[i],"",function(html){var cont=
-$(set.liveContent,html).text();cont=cont.replace(/\s+/g," ");var desc=$(set.liveDescription,html).text();desc=desc.replace(/\s+/g," ");var t_1=html.toLowerCase().indexOf("<title>");var t_2=html.toLowerCase().indexOf("</title>",t_1+7);if(t_1!=-1&&t_2!=-1)var tit=html.slice(t_1+7,t_2);else var tit="No title";tipuesearch_in.pages.push({"title":tit,"text":desc,"tags":cont,"loc":tipuesearch_pages[i]})});if(set.mode=="json")$.getJSON(set.contentLocation,function(json){tipuesearch_in=$.extend({},json)});
-if(set.mode=="static")tipuesearch_in=$.extend({},tipuesearch);var tipue_search_w="";if(set.newWindow)tipue_search_w=' target="_blank"';function getURLP(name){return decodeURIComponent(((new RegExp("[?|&]"+name+"="+"([^&;]+?)(&|#|;|$)")).exec(location.search)||[,""])[1].replace(/\+/g,"%20"))||null}if(getURLP("q")){$("#tipue_search_input").val(getURLP("q"));getTipueSearch(0,true)}$("#tipue_search_button").click(function(){getTipueSearch(0,true)});$(this).keyup(function(event){if(event.keyCode=="13")getTipueSearch(0,
-true)});function getTipueSearch(start,replace){$("#tipue_search_content").hide();var out="";var results="";var show_replace=false;var show_stop=false;var d=$("#tipue_search_input").val().toLowerCase();d=$.trim(d);var d_w=d.split(" ");d="";for(var i=0;i<d_w.length;i++){var a_w=true;for(var f=0;f<tipuesearch_stop_words.length;f++)if(d_w[i]==tipuesearch_stop_words[f]){a_w=false;show_stop=true}if(a_w)d=d+" "+d_w[i]}d=$.trim(d);d_w=d.split(" ");if(d.length>=set.minimumLength){if(replace){var d_r=d;for(var i=
-0;i<d_w.length;i++)for(var f=0;f<tipuesearch_replace.words.length;f++)if(d_w[i]==tipuesearch_replace.words[f].word){d=d.replace(d_w[i],tipuesearch_replace.words[f].replace_with);show_replace=true}d_w=d.split(" ")}var d_t=d;for(var i=0;i<d_w.length;i++)for(var f=0;f<tipuesearch_stem.words.length;f++)if(d_w[i]==tipuesearch_stem.words[f].word)d_t=d_t+" "+tipuesearch_stem.words[f].stem;d_w=d_t.split(" ");var c=0;found=new Array;for(var i=0;i<tipuesearch_in.pages.length;i++){var score=1E9;var s_t=tipuesearch_in.pages[i].text;
-for(var f=0;f<d_w.length;f++){var pat=new RegExp(d_w[f],"i");if(tipuesearch_in.pages[i].title.search(pat)!=-1)score-=2E5-i;if(tipuesearch_in.pages[i].text.search(pat)!=-1)score-=15E4-i;if(set.highlightTerms){if(set.highlightEveryTerm)var patr=new RegExp("("+d_w[f]+")","gi");else var patr=new RegExp("("+d_w[f]+")","i");s_t=s_t.replace(patr,"<b>$1</b>")}if(tipuesearch_in.pages[i].tags.search(pat)!=-1)score-=1E5-i}if(score<1E9)found[c++]=score+"^"+tipuesearch_in.pages[i].title+"^"+s_t+"^"+tipuesearch_in.pages[i].loc}if(c!=
-0){if(show_replace==1){out+='<div id="tipue_search_warning_head">Showing results for '+d+"</div>";out+='<div id="tipue_search_warning">Search for <a href="javascript:void(0)" id="tipue_search_replaced">'+d_r+"</a></div>"}if(c==1)out+='<div id="tipue_search_results_count">1 result</div>';else{c_c=c.toString().replace(/\B(?=(\d{3})+(?!\d))/g,",");out+='<div id="tipue_search_results_count">'+c_c+" results</div>"}found.sort();var l_o=0;for(var i=0;i<found.length;i++){var fo=found[i].split("^");if(l_o>=
-start&&l_o<set.show+start){out+='<div class="tipue_search_content_title"><a href="'+fo[3]+'"'+tipue_search_w+">"+fo[1]+"</a></div>";var t=fo[2];var t_d="";var t_w=t.split(" ");if(t_w.length<set.descriptiveWords)t_d=t;else for(var f=0;f<set.descriptiveWords;f++)t_d+=t_w[f]+" ";t_d=$.trim(t_d);if(t_d.charAt(t_d.length-1)!=".")t_d+=" ...";out+='<div class="tipue_search_content_text">'+t_d+"</div>";if(set.showURL)out+='<div class="tipue_search_content_loc"><a href="'+fo[3]+'"'+tipue_search_w+">"+fo[3]+
-"</a></div>"}l_o++}if(c>set.show){var pages=Math.ceil(c/set.show);var page=start/set.show;out+='<div id="tipue_search_foot"><ul id="tipue_search_foot_boxes">';if(start>0)out+='<li><a href="javascript:void(0)" class="tipue_search_foot_box" id="'+(start-set.show)+"_"+replace+'">&#171; Prev</a></li>';if(page<=2){var p_b=pages;if(pages>3)p_b=3;for(var f=0;f<p_b;f++)if(f==page)out+='<li class="current">'+(f+1)+"</li>";else out+='<li><a href="javascript:void(0)" class="tipue_search_foot_box" id="'+f*set.show+
-"_"+replace+'">'+(f+1)+"</a></li>"}else{var p_b=pages+2;if(p_b>pages)p_b=pages;for(var f=page;f<p_b;f++)if(f==page)out+='<li class="current">'+(f+1)+"</li>";else out+='<li><a href="javascript:void(0)" class="tipue_search_foot_box" id="'+f*set.show+"_"+replace+'">'+(f+1)+"</a></li>"}if(page+1!=pages)out+='<li><a href="javascript:void(0)" class="tipue_search_foot_box" id="'+(start+set.show)+"_"+replace+'">Next &#187;</a></li>';out+="</ul></div>"}}else out+='<div id="tipue_search_warning_head">Nothing found</div>'}else if(show_stop)out+=
-'<div id="tipue_search_warning_head">Nothing found</div><div id="tipue_search_warning">Common words are largely ignored</div>';else{out+='<div id="tipue_search_warning_head">Search too short</div>';if(set.minimumLength==1)out+='<div id="tipue_search_warning">Should be one character or more</div>';else out+='<div id="tipue_search_warning">Should be '+set.minimumLength+" characters or more</div>"}$("#tipue_search_content").html(out);$("#tipue_search_content").slideDown(200);$("#tipue_search_replaced").click(function(){getTipueSearch(0,
-false)});$(".tipue_search_foot_box").click(function(){var id_v=$(this).attr("id");var id_a=id_v.split("_");getTipueSearch(parseInt(id_a[0]),id_a[1])})}})}})(jQuery);
diff --git a/docs/theme/mkdocs/tipuesearch/tipuesearch_content.js b/docs/theme/mkdocs/tipuesearch/tipuesearch_content.js
deleted file mode 100644
index f20d45a42b..0000000000
--- a/docs/theme/mkdocs/tipuesearch/tipuesearch_content.js
+++ /dev/null
@@ -1,13 +0,0 @@
-var tipuesearch = {"pages": [
- {"title": "Tipue Search, a site search engine jQuery plugin", "text": "Tipue Search is a site search engine jQuery plugin. Tipue Search is open source and released under the MIT License, which means it's free for both commercial and non-commercial use. Tipue Search is responsive and works on all reasonably modern browsers.", "tags": "JavaScript", "loc": "http://www.tipue.com/search"},
- {"title": "Tipue Search Static mode demo", "text": "This is a demo of Tipue Search Static mode.", "tags": "", "loc": "http://www.tipue.com/search/demos/static"},
- {"title": "Tipue Image Search demo", "text": "This is a demo of Tipue Image Search.", "tags": "", "loc": "http://www.tipue.com/search/demos/images"},
- {"title": "Tipue Search docs", "text": "If you haven't already done so, download Tipue Search. Copy the tipuesearch folder to your site.", "tags": "documentation", "loc": "http://www.tipue.com/search/docs"},
- {"title": "Tipue drop, a search suggestion box jQuery plugin", "text": "Tipue drop is a search suggestion box jQuery plugin. Tipue drop is open source and released under the MIT License, which means it's free for both commercial and non-commercial use. Tipue drop is responsive and works on all reasonably modern browsers.", "tags": "JavaScript", "loc": "http://www.tipue.com/drop"},
- {"title": "Tipue drop demo", "text": "Tipue drop demo. Tipue drop is a search suggestion box jQuery plugin.", "tags": "JavaScript", "loc": "http://www.tipue.com/drop/demo"},
- {"title": "Support plans", "text": "Stuck? We offer a range of flexible support plans for our jQuery plugins.", "tags": "", "loc": "http://www.tipue.com/support"},
- {"title": "About Tipue", "text": "Tipue is a small web development studio based in North London. We've been around for over a decade. We like Perl, MySQL and jQuery.", "tags": "", "loc": "http://www.tipue.com/about"}
-]};
-
-
-
diff --git a/docs/theme/mkdocs/tipuesearch/tipuesearch_set.js b/docs/theme/mkdocs/tipuesearch/tipuesearch_set.js
deleted file mode 100644
index 6bda3fad66..0000000000
--- a/docs/theme/mkdocs/tipuesearch/tipuesearch_set.js
+++ /dev/null
@@ -1,23 +0,0 @@
-
-/*
-Tipue Search 3.1
-Copyright (c) 2013 Tipue
-Tipue Search is released under the MIT License
-http://www.tipue.com/search
-*/
-
-
-var tipuesearch_stop_words = ["and", "be", "by", "do", "for", "he", "how", "if", "is", "it", "my", "not", "of", "or", "the", "to", "up", "what", "when"];
-
-var tipuesearch_replace = {"words": [
- {"word": "tipua", replace_with: "tipue"},
- {"word": "javscript", replace_with: "javascript"}
-]};
-
-var tipuesearch_stem = {"words": [
- {"word": "e-mail", stem: "email"},
- {"word": "javascript", stem: "script"},
- {"word": "javascript", stem: "js"}
-]};
-
-
diff --git a/docs/theme/mkdocs/toc.html b/docs/theme/mkdocs/toc.html
deleted file mode 100644
index 9cdb3430bb..0000000000
--- a/docs/theme/mkdocs/toc.html
+++ /dev/null
@@ -1,11 +0,0 @@
-{% for toc_item in toc %}
- {% for toc_h2_item in toc_item.children %}
- <li class=""><a href="{{ toc_h2_item.url }}">{{ toc_h2_item.title }}</a>
- <ul>
- {% for toc_h3_item in toc_h2_item.children %}
- <li><a href="{{ toc_h3_item.url }}">{{ toc_h3_item.title }}</a></li>
- {% endfor %}
- </ul>
- </li>
- {% endfor %}
-{% endfor %}
diff --git a/engine/MAINTAINERS b/engine/MAINTAINERS
deleted file mode 100644
index aee10c8421..0000000000
--- a/engine/MAINTAINERS
+++ /dev/null
@@ -1 +0,0 @@
-Solomon Hykes <solomon@docker.com> (@shykes)
diff --git a/engine/engine.go b/engine/engine.go
index 26f9953d66..60532349ab 100644
--- a/engine/engine.go
+++ b/engine/engine.go
@@ -10,8 +10,8 @@ import (
"sync"
"time"
+ "github.com/docker/docker/pkg/common"
"github.com/docker/docker/pkg/ioutils"
- "github.com/docker/docker/utils"
)
// Installer is a standard interface for objects which can "install" themselves
@@ -46,18 +46,19 @@ func unregister(name string) {
// It acts as a store for *containers*, and allows manipulation of these
// containers by executing *jobs*.
type Engine struct {
- handlers map[string]Handler
- catchall Handler
- hack Hack // data for temporary hackery (see hack.go)
- id string
- Stdout io.Writer
- Stderr io.Writer
- Stdin io.Reader
- Logging bool
- tasks sync.WaitGroup
- l sync.RWMutex // lock for shutdown
- shutdown bool
- onShutdown []func() // shutdown handlers
+ handlers map[string]Handler
+ catchall Handler
+ hack Hack // data for temporary hackery (see hack.go)
+ id string
+ Stdout io.Writer
+ Stderr io.Writer
+ Stdin io.Reader
+ Logging bool
+ tasks sync.WaitGroup
+ l sync.RWMutex // lock for shutdown
+ shutdownWait sync.WaitGroup
+ shutdown bool
+ onShutdown []func() // shutdown handlers
}
func (eng *Engine) Register(name string, handler Handler) error {
@@ -77,7 +78,7 @@ func (eng *Engine) RegisterCatchall(catchall Handler) {
func New() *Engine {
eng := &Engine{
handlers: make(map[string]Handler),
- id: utils.RandomString(),
+ id: common.RandomString(),
Stdout: os.Stdout,
Stderr: os.Stderr,
Stdin: os.Stdin,
@@ -123,6 +124,8 @@ func (eng *Engine) Job(name string, args ...string) *Job {
Stderr: NewOutput(),
env: &Env{},
closeIO: true,
+
+ cancelled: make(chan struct{}),
}
if eng.Logging {
job.Stderr.Add(ioutils.NopWriteCloser(eng.Stderr))
@@ -143,6 +146,7 @@ func (eng *Engine) Job(name string, args ...string) *Job {
func (eng *Engine) OnShutdown(h func()) {
eng.l.Lock()
eng.onShutdown = append(eng.onShutdown, h)
+ eng.shutdownWait.Add(1)
eng.l.Unlock()
}
@@ -156,6 +160,7 @@ func (eng *Engine) Shutdown() {
eng.l.Lock()
if eng.shutdown {
eng.l.Unlock()
+ eng.shutdownWait.Wait()
return
}
eng.shutdown = true
@@ -180,17 +185,15 @@ func (eng *Engine) Shutdown() {
// Call shutdown handlers, if any.
// Timeout after 10 seconds.
- var wg sync.WaitGroup
for _, h := range eng.onShutdown {
- wg.Add(1)
go func(h func()) {
- defer wg.Done()
h()
+ eng.shutdownWait.Done()
}(h)
}
done := make(chan struct{})
go func() {
- wg.Wait()
+ eng.shutdownWait.Wait()
close(done)
}()
select {
diff --git a/engine/env.go b/engine/env.go
index a16dc35cd9..a671f13c6b 100644
--- a/engine/env.go
+++ b/engine/env.go
@@ -7,6 +7,9 @@ import (
"io"
"strconv"
"strings"
+ "time"
+
+ "github.com/docker/docker/utils"
)
type Env []string
@@ -67,6 +70,15 @@ func (env *Env) SetBool(key string, value bool) {
}
}
+func (env *Env) GetTime(key string) (time.Time, error) {
+ t, err := time.Parse(time.RFC3339Nano, env.Get(key))
+ return t, err
+}
+
+func (env *Env) SetTime(key string, t time.Time) {
+ env.Set(key, t.Format(time.RFC3339Nano))
+}
+
func (env *Env) GetInt(key string) int {
return int(env.GetInt64(key))
}
@@ -242,9 +254,10 @@ func (env *Env) Encode(dst io.Writer) error {
return nil
}
-func (env *Env) WriteTo(dst io.Writer) (n int64, err error) {
- // FIXME: return the number of bytes written to respect io.WriterTo
- return 0, env.Encode(dst)
+func (env *Env) WriteTo(dst io.Writer) (int64, error) {
+ wc := utils.NewWriteCounter(dst)
+ err := env.Encode(wc)
+ return wc.Count, err
}
func (env *Env) Import(src interface{}) (err error) {
diff --git a/engine/env_test.go b/engine/env_test.go
index b0caca9cbd..2ed99d0fea 100644
--- a/engine/env_test.go
+++ b/engine/env_test.go
@@ -4,6 +4,7 @@ import (
"bytes"
"encoding/json"
"testing"
+ "time"
"github.com/docker/docker/pkg/testutils"
)
@@ -94,6 +95,27 @@ func TestSetenvBool(t *testing.T) {
}
}
+func TestSetenvTime(t *testing.T) {
+ job := mkJob(t, "dummy")
+
+ now := time.Now()
+ job.SetenvTime("foo", now)
+ if val, err := job.GetenvTime("foo"); err != nil {
+ t.Fatalf("GetenvTime failed to parse: %v", err)
+ } else {
+ nowStr := now.Format(time.RFC3339)
+ valStr := val.Format(time.RFC3339)
+ if nowStr != valStr {
+ t.Fatalf("GetenvTime returns incorrect value: %s, Expected: %s", valStr, nowStr)
+ }
+ }
+
+ job.Setenv("bar", "Obviously I'm not a date")
+ if val, err := job.GetenvTime("bar"); err == nil {
+ t.Fatalf("GetenvTime was supposed to fail, instead returned: %s", val)
+ }
+}
+
func TestSetenvInt(t *testing.T) {
job := mkJob(t, "dummy")
diff --git a/engine/job.go b/engine/job.go
index 6c11b13446..ecb68c3eb7 100644
--- a/engine/job.go
+++ b/engine/job.go
@@ -5,6 +5,7 @@ import (
"fmt"
"io"
"strings"
+ "sync"
"time"
log "github.com/Sirupsen/logrus"
@@ -34,6 +35,12 @@ type Job struct {
status Status
end time.Time
closeIO bool
+
+ // When closed, the job has been cancelled.
+ // Note: not all jobs implement cancellation.
+ // See Job.Cancel() and Job.WaitCancelled()
+ cancelled chan struct{}
+ cancelOnce sync.Once
}
type Status int
@@ -145,6 +152,14 @@ func (job *Job) SetenvBool(key string, value bool) {
job.env.SetBool(key, value)
}
+func (job *Job) GetenvTime(key string) (value time.Time, err error) {
+ return job.env.GetTime(key)
+}
+
+func (job *Job) SetenvTime(key string, value time.Time) {
+ job.env.SetTime(key, value)
+}
+
func (job *Job) GetenvSubEnv(key string) *Env {
return job.env.GetSubEnv(key)
}
@@ -240,3 +255,15 @@ func (job *Job) StatusCode() int {
func (job *Job) SetCloseIO(val bool) {
job.closeIO = val
}
+
+// When called, causes the Job.WaitCancelled channel to unblock.
+func (job *Job) Cancel() {
+ job.cancelOnce.Do(func() {
+ close(job.cancelled)
+ })
+}
+
+// Returns a channel which is closed ("never blocks") when the job is cancelled.
+func (job *Job) WaitCancelled() <-chan struct{} {
+ return job.cancelled
+}
diff --git a/engine/job_test.go b/engine/job_test.go
index 67e723988e..9f8c76095c 100644
--- a/engine/job_test.go
+++ b/engine/job_test.go
@@ -58,7 +58,7 @@ func TestJobStderrString(t *testing.T) {
eng := New()
// FIXME: test multiple combinations of output and status
eng.Register("say_something_in_stderr", func(job *Job) Status {
- job.Errorf("Warning, something might happen\nHere it comes!\nOh no...\nSomething happened\n")
+ job.Errorf("Something might happen\nHere it comes!\nOh no...\nSomething happened\n")
return StatusOK
})
diff --git a/engine/streams.go b/engine/streams.go
index ec703c96fa..216fb8980a 100644
--- a/engine/streams.go
+++ b/engine/streams.go
@@ -5,7 +5,9 @@ import (
"fmt"
"io"
"io/ioutil"
+ "strings"
"sync"
+ "unicode"
)
type Output struct {
@@ -16,25 +18,25 @@ type Output struct {
}
// Tail returns the n last lines of a buffer
-// stripped out of the last \n, if any
+// stripped out of trailing white spaces, if any.
+//
// if n <= 0, returns an empty string
func Tail(buffer *bytes.Buffer, n int) string {
if n <= 0 {
return ""
}
- bytes := buffer.Bytes()
- if len(bytes) > 0 && bytes[len(bytes)-1] == '\n' {
- bytes = bytes[:len(bytes)-1]
- }
- for i := buffer.Len() - 2; i >= 0; i-- {
- if bytes[i] == '\n' {
+ s := strings.TrimRightFunc(buffer.String(), unicode.IsSpace)
+ i := len(s) - 1
+ for ; i >= 0 && n > 0; i-- {
+ if s[i] == '\n' {
n--
if n == 0 {
- return string(bytes[i+1:])
+ break
}
}
}
- return string(bytes)
+ // when i == -1, return the whole string which is s[0:]
+ return s[i+1:]
}
// NewOutput returns a new Output object with no destinations attached.
diff --git a/engine/streams_test.go b/engine/streams_test.go
index 5cfd5d0e6c..476a721baf 100644
--- a/engine/streams_test.go
+++ b/engine/streams_test.go
@@ -111,6 +111,11 @@ func TestTail(t *testing.T) {
"Two\nThree",
"One\nTwo\nThree",
}
+ tests["One\nTwo\n\n\n"] = []string{
+ "",
+ "Two",
+ "One\nTwo",
+ }
for input, outputs := range tests {
for n, expectedOutput := range outputs {
output := Tail(bytes.NewBufferString(input), n)
diff --git a/events/events.go b/events/events.go
index 0951f7099d..559bf687e7 100644
--- a/events/events.go
+++ b/events/events.go
@@ -1,7 +1,10 @@
package events
import (
+ "bytes"
"encoding/json"
+ "io"
+ "strings"
"sync"
"time"
@@ -112,11 +115,23 @@ func writeEvent(job *engine.Job, event *utils.JSONMessage, eventFilters filters.
if v == field {
return false
}
+ if strings.Contains(field, ":") {
+ image := strings.Split(field, ":")
+ if image[0] == v {
+ return false
+ }
+ }
}
return true
}
- if isFiltered(event.Status, eventFilters["event"]) || isFiltered(event.From, eventFilters["image"]) || isFiltered(event.ID, eventFilters["container"]) {
+ //incoming container filter can be name,id or partial id, convert and replace as a full container id
+ for i, cn := range eventFilters["container"] {
+ eventFilters["container"][i] = GetContainerId(job.Eng, cn)
+ }
+
+ if isFiltered(event.Status, eventFilters["event"]) || isFiltered(event.From, eventFilters["image"]) ||
+ isFiltered(event.ID, eventFilters["container"]) {
return nil
}
@@ -196,3 +211,20 @@ func (e *Events) unsubscribe(l listener) bool {
e.mu.Unlock()
return false
}
+
+func GetContainerId(eng *engine.Engine, name string) string {
+ var buf bytes.Buffer
+ job := eng.Job("container_inspect", name)
+
+ var outStream io.Writer
+
+ outStream = &buf
+ job.Stdout.Set(outStream)
+
+ if err := job.Run(); err != nil {
+ return ""
+ }
+ var out struct{ ID string }
+ json.NewDecoder(&buf).Decode(&out)
+ return out.ID
+}
diff --git a/graph/MAINTAINERS b/graph/MAINTAINERS
deleted file mode 100644
index e409454b5e..0000000000
--- a/graph/MAINTAINERS
+++ /dev/null
@@ -1,5 +0,0 @@
-Solomon Hykes <solomon@docker.com> (@shykes)
-Victor Vieux <vieux@docker.com> (@vieux)
-Michael Crosby <michael@crosbymichael.com> (@crosbymichael)
-Cristian Staretu <cristian.staretu@gmail.com> (@unclejack)
-Tibor Vass <teabee89@gmail.com> (@tiborvass)
diff --git a/graph/graph.go b/graph/graph.go
index f7b9fc4f10..5c6ac9701a 100644
--- a/graph/graph.go
+++ b/graph/graph.go
@@ -1,6 +1,8 @@
package graph
import (
+ "compress/gzip"
+ "crypto/sha256"
"fmt"
"io"
"io/ioutil"
@@ -13,10 +15,13 @@ import (
"time"
log "github.com/Sirupsen/logrus"
+ "github.com/docker/distribution/digest"
+ "github.com/docker/docker/autogen/dockerversion"
"github.com/docker/docker/daemon/graphdriver"
- "github.com/docker/docker/dockerversion"
"github.com/docker/docker/image"
"github.com/docker/docker/pkg/archive"
+ "github.com/docker/docker/pkg/common"
+ "github.com/docker/docker/pkg/progressreader"
"github.com/docker/docker/pkg/truncindex"
"github.com/docker/docker/runconfig"
"github.com/docker/docker/utils"
@@ -116,7 +121,7 @@ func (graph *Graph) Get(name string) (*image.Image, error) {
// Create creates a new image and registers it in the graph.
func (graph *Graph) Create(layerData archive.ArchiveReader, containerID, containerImage, comment, author string, containerConfig, config *runconfig.Config) (*image.Image, error) {
img := &image.Image{
- ID: utils.GenerateRandomID(),
+ ID: common.GenerateRandomID(),
Comment: comment,
Created: time.Now().UTC(),
DockerVersion: dockerversion.VERSION,
@@ -209,14 +214,22 @@ func (graph *Graph) TempLayerArchive(id string, sf *utils.StreamFormatter, outpu
if err != nil {
return nil, err
}
- progress := utils.ProgressReader(a, 0, output, sf, false, utils.TruncateID(id), "Buffering to disk")
- defer progress.Close()
- return archive.NewTempArchive(progress, tmp)
+ progressReader := progressreader.New(progressreader.Config{
+ In: a,
+ Out: output,
+ Formatter: sf,
+ Size: 0,
+ NewLines: false,
+ ID: common.TruncateID(id),
+ Action: "Buffering to disk",
+ })
+ defer progressReader.Close()
+ return archive.NewTempArchive(progressReader, tmp)
}
// Mktemp creates a temporary sub-directory inside the graph's filesystem.
func (graph *Graph) Mktemp(id string) (string, error) {
- dir := path.Join(graph.Root, "_tmp", utils.GenerateRandomID())
+ dir := path.Join(graph.Root, "_tmp", common.GenerateRandomID())
if err := os.MkdirAll(dir, 0700); err != nil {
return "", err
}
@@ -231,18 +244,27 @@ func (graph *Graph) newTempFile() (*os.File, error) {
return ioutil.TempFile(tmp, "")
}
-func bufferToFile(f *os.File, src io.Reader) (int64, error) {
- n, err := io.Copy(f, src)
+func bufferToFile(f *os.File, src io.Reader) (int64, digest.Digest, error) {
+ var (
+ h = sha256.New()
+ w = gzip.NewWriter(io.MultiWriter(f, h))
+ )
+ _, err := io.Copy(w, src)
+ w.Close()
if err != nil {
- return n, err
+ return 0, "", err
}
if err = f.Sync(); err != nil {
- return n, err
+ return 0, "", err
+ }
+ n, err := f.Seek(0, os.SEEK_CUR)
+ if err != nil {
+ return 0, "", err
}
if _, err := f.Seek(0, 0); err != nil {
- return n, err
+ return 0, "", err
}
- return n, nil
+ return n, digest.NewDigest("sha256", h), nil
}
// setupInitLayer populates a directory with mountpoints suitable
diff --git a/graph/history.go b/graph/history.go
index 356340673f..7f5063e912 100644
--- a/graph/history.go
+++ b/graph/history.go
@@ -5,6 +5,7 @@ import (
"github.com/docker/docker/engine"
"github.com/docker/docker/image"
+ "github.com/docker/docker/utils"
)
func (s *TagStore) CmdHistory(job *engine.Job) engine.Status {
@@ -24,7 +25,7 @@ func (s *TagStore) CmdHistory(job *engine.Job) engine.Status {
if _, exists := lookupMap[id]; !exists {
lookupMap[id] = []string{}
}
- lookupMap[id] = append(lookupMap[id], name+":"+tag)
+ lookupMap[id] = append(lookupMap[id], utils.ImageReference(name, tag))
}
}
diff --git a/graph/import.go b/graph/import.go
index a8e8e04b5b..44b1ecbd57 100644
--- a/graph/import.go
+++ b/graph/import.go
@@ -1,12 +1,16 @@
package graph
import (
+ "bytes"
+ "encoding/json"
"net/http"
"net/url"
log "github.com/Sirupsen/logrus"
"github.com/docker/docker/engine"
"github.com/docker/docker/pkg/archive"
+ "github.com/docker/docker/pkg/progressreader"
+ "github.com/docker/docker/runconfig"
"github.com/docker/docker/utils"
)
@@ -15,12 +19,14 @@ func (s *TagStore) CmdImport(job *engine.Job) engine.Status {
return job.Errorf("Usage: %s SRC REPO [TAG]", job.Name)
}
var (
- src = job.Args[0]
- repo = job.Args[1]
- tag string
- sf = utils.NewStreamFormatter(job.GetenvBool("json"))
- archive archive.ArchiveReader
- resp *http.Response
+ src = job.Args[0]
+ repo = job.Args[1]
+ tag string
+ sf = utils.NewStreamFormatter(job.GetenvBool("json"))
+ archive archive.ArchiveReader
+ resp *http.Response
+ stdoutBuffer = bytes.NewBuffer(nil)
+ newConfig runconfig.Config
)
if len(job.Args) > 2 {
tag = job.Args[2]
@@ -43,11 +49,33 @@ func (s *TagStore) CmdImport(job *engine.Job) engine.Status {
if err != nil {
return job.Error(err)
}
- progressReader := utils.ProgressReader(resp.Body, int(resp.ContentLength), job.Stdout, sf, true, "", "Importing")
+ progressReader := progressreader.New(progressreader.Config{
+ In: resp.Body,
+ Out: job.Stdout,
+ Formatter: sf,
+ Size: int(resp.ContentLength),
+ NewLines: true,
+ ID: "",
+ Action: "Importing",
+ })
defer progressReader.Close()
archive = progressReader
}
- img, err := s.graph.Create(archive, "", "", "Imported from "+src, "", nil, nil)
+
+ buildConfigJob := job.Eng.Job("build_config")
+ buildConfigJob.Stdout.Add(stdoutBuffer)
+ buildConfigJob.Setenv("changes", job.Getenv("changes"))
+ // FIXME this should be remove when we remove deprecated config param
+ buildConfigJob.Setenv("config", job.Getenv("config"))
+
+ if err := buildConfigJob.Run(); err != nil {
+ return job.Error(err)
+ }
+ if err := json.NewDecoder(stdoutBuffer).Decode(&newConfig); err != nil {
+ return job.Error(err)
+ }
+
+ img, err := s.graph.Create(archive, "", "", "Imported from "+src, "", nil, &newConfig)
if err != nil {
return job.Error(err)
}
@@ -60,7 +88,7 @@ func (s *TagStore) CmdImport(job *engine.Job) engine.Status {
job.Stdout.Write(sf.FormatStatus("", img.ID))
logID := img.ID
if tag != "" {
- logID += ":" + tag
+ logID = utils.ImageReference(logID, tag)
}
if err = job.Eng.Job("log", "import", logID, "").Run(); err != nil {
log.Errorf("Error logging event 'import' for %s: %s", logID, err)
diff --git a/graph/list.go b/graph/list.go
index 49d4072be5..9f7bccdfaa 100644
--- a/graph/list.go
+++ b/graph/list.go
@@ -1,7 +1,6 @@
package graph
import (
- "fmt"
"log"
"path"
"strings"
@@ -9,15 +8,20 @@ import (
"github.com/docker/docker/engine"
"github.com/docker/docker/image"
"github.com/docker/docker/pkg/parsers/filters"
+ "github.com/docker/docker/utils"
)
-var acceptedImageFilterTags = map[string]struct{}{"dangling": {}}
+var acceptedImageFilterTags = map[string]struct{}{
+ "dangling": {},
+ "label": {},
+}
func (s *TagStore) CmdImages(job *engine.Job) engine.Status {
var (
allImages map[string]*image.Image
err error
filt_tagged = true
+ filt_label = false
)
imageFilters, err := filters.FromParam(job.Getenv("filters"))
@@ -38,6 +42,8 @@ func (s *TagStore) CmdImages(job *engine.Job) engine.Status {
}
}
+ _, filt_label = imageFilters["label"]
+
if job.GetenvBool("all") && filt_tagged {
allImages, err = s.graph.Map()
} else {
@@ -48,34 +54,51 @@ func (s *TagStore) CmdImages(job *engine.Job) engine.Status {
}
lookup := make(map[string]*engine.Env)
s.Lock()
- for name, repository := range s.Repositories {
+ for repoName, repository := range s.Repositories {
if job.Getenv("filter") != "" {
- if match, _ := path.Match(job.Getenv("filter"), name); !match {
+ if match, _ := path.Match(job.Getenv("filter"), repoName); !match {
continue
}
}
- for tag, id := range repository {
+ for ref, id := range repository {
+ imgRef := utils.ImageReference(repoName, ref)
image, err := s.graph.Get(id)
if err != nil {
- log.Printf("Warning: couldn't load %s from %s/%s: %s", id, name, tag, err)
+ log.Printf("Warning: couldn't load %s from %s: %s", id, imgRef, err)
continue
}
if out, exists := lookup[id]; exists {
if filt_tagged {
- out.SetList("RepoTags", append(out.GetList("RepoTags"), fmt.Sprintf("%s:%s", name, tag)))
+ if utils.DigestReference(ref) {
+ out.SetList("RepoDigests", append(out.GetList("RepoDigests"), imgRef))
+ } else { // Tag Ref.
+ out.SetList("RepoTags", append(out.GetList("RepoTags"), imgRef))
+ }
}
} else {
// get the boolean list for if only the untagged images are requested
delete(allImages, id)
+ if !imageFilters.MatchKVList("label", image.ContainerConfig.Labels) {
+ continue
+ }
if filt_tagged {
out := &engine.Env{}
out.SetJson("ParentId", image.Parent)
- out.SetList("RepoTags", []string{fmt.Sprintf("%s:%s", name, tag)})
out.SetJson("Id", image.ID)
out.SetInt64("Created", image.Created.Unix())
out.SetInt64("Size", image.Size)
out.SetInt64("VirtualSize", image.GetParentsSize(0)+image.Size)
+ out.SetJson("Labels", image.ContainerConfig.Labels)
+
+ if utils.DigestReference(ref) {
+ out.SetList("RepoTags", []string{})
+ out.SetList("RepoDigests", []string{imgRef})
+ } else {
+ out.SetList("RepoTags", []string{imgRef})
+ out.SetList("RepoDigests", []string{})
+ }
+
lookup[id] = out
}
}
@@ -90,15 +113,20 @@ func (s *TagStore) CmdImages(job *engine.Job) engine.Status {
}
// Display images which aren't part of a repository/tag
- if job.Getenv("filter") == "" {
+ if job.Getenv("filter") == "" || filt_label {
for _, image := range allImages {
+ if !imageFilters.MatchKVList("label", image.ContainerConfig.Labels) {
+ continue
+ }
out := &engine.Env{}
out.SetJson("ParentId", image.Parent)
out.SetList("RepoTags", []string{"<none>:<none>"})
+ out.SetList("RepoDigests", []string{"<none>@<none>"})
out.SetJson("Id", image.ID)
out.SetInt64("Created", image.Created.Unix())
out.SetInt64("Size", image.Size)
out.SetInt64("VirtualSize", image.GetParentsSize(0)+image.Size)
+ out.SetJson("Labels", image.ContainerConfig.Labels)
outs.Add(out)
}
}
diff --git a/graph/load.go b/graph/load.go
index 8f1da31136..c257e9ef16 100644
--- a/graph/load.go
+++ b/graph/load.go
@@ -104,6 +104,20 @@ func (s *TagStore) recursiveLoad(eng *engine.Engine, address, tmpImageDir string
log.Debugf("Error validating ID: %s", err)
return err
}
+
+ // ensure no two downloads of the same layer happen at the same time
+ if c, err := s.poolAdd("pull", "layer:"+img.ID); err != nil {
+ if c != nil {
+ log.Debugf("Image (id: %s) load is already running, waiting: %v", img.ID, err)
+ <-c
+ return nil
+ }
+
+ return err
+ }
+
+ defer s.poolRemove("pull", "layer:"+img.ID)
+
if img.Parent != "" {
if !s.graph.Exists(img.Parent) {
if err := s.recursiveLoad(eng, img.Parent, tmpImageDir); err != nil {
diff --git a/graph/manifest.go b/graph/manifest.go
index f9869fcaf2..3b1d825576 100644
--- a/graph/manifest.go
+++ b/graph/manifest.go
@@ -4,117 +4,21 @@ import (
"bytes"
"encoding/json"
"fmt"
- "io"
- "io/ioutil"
log "github.com/Sirupsen/logrus"
+ "github.com/docker/distribution/digest"
"github.com/docker/docker/engine"
- "github.com/docker/docker/pkg/tarsum"
"github.com/docker/docker/registry"
- "github.com/docker/docker/runconfig"
+ "github.com/docker/docker/utils"
"github.com/docker/libtrust"
)
-func (s *TagStore) newManifest(localName, remoteName, tag string) ([]byte, error) {
- manifest := &registry.ManifestData{
- Name: remoteName,
- Tag: tag,
- SchemaVersion: 1,
- }
- localRepo, err := s.Get(localName)
- if err != nil {
- return nil, err
- }
- if localRepo == nil {
- return nil, fmt.Errorf("Repo does not exist: %s", localName)
- }
-
- // Get the top-most layer id which the tag points to
- layerId, exists := localRepo[tag]
- if !exists {
- return nil, fmt.Errorf("Tag does not exist for %s: %s", localName, tag)
- }
- layersSeen := make(map[string]bool)
-
- layer, err := s.graph.Get(layerId)
- if err != nil {
- return nil, err
- }
- manifest.Architecture = layer.Architecture
- manifest.FSLayers = make([]*registry.FSLayer, 0, 4)
- manifest.History = make([]*registry.ManifestHistory, 0, 4)
- var metadata runconfig.Config
- if layer.Config != nil {
- metadata = *layer.Config
- }
-
- for ; layer != nil; layer, err = layer.GetParent() {
- if err != nil {
- return nil, err
- }
-
- if layersSeen[layer.ID] {
- break
- }
- if layer.Config != nil && metadata.Image != layer.ID {
- err = runconfig.Merge(&metadata, layer.Config)
- if err != nil {
- return nil, err
- }
- }
-
- checksum, err := layer.GetCheckSum(s.graph.ImageRoot(layer.ID))
- if err != nil {
- return nil, fmt.Errorf("Error getting image checksum: %s", err)
- }
- if tarsum.VersionLabelForChecksum(checksum) != tarsum.Version1.String() {
- archive, err := layer.TarLayer()
- if err != nil {
- return nil, err
- }
-
- tarSum, err := tarsum.NewTarSum(archive, true, tarsum.Version1)
- if err != nil {
- return nil, err
- }
- if _, err := io.Copy(ioutil.Discard, tarSum); err != nil {
- return nil, err
- }
-
- checksum = tarSum.Sum(nil)
-
- // Save checksum value
- if err := layer.SaveCheckSum(s.graph.ImageRoot(layer.ID), checksum); err != nil {
- return nil, err
- }
- }
-
- jsonData, err := layer.RawJson()
- if err != nil {
- return nil, fmt.Errorf("Cannot retrieve the path for {%s}: %s", layer.ID, err)
- }
-
- manifest.FSLayers = append(manifest.FSLayers, &registry.FSLayer{BlobSum: checksum})
-
- layersSeen[layer.ID] = true
-
- manifest.History = append(manifest.History, &registry.ManifestHistory{V1Compatibility: string(jsonData)})
- }
-
- manifestBytes, err := json.MarshalIndent(manifest, "", " ")
- if err != nil {
- return nil, err
- }
-
- return manifestBytes, nil
-}
-
// loadManifest loads a manifest from a byte array and verifies its content.
// The signature must be verified or an error is returned. If the manifest
// contains no signatures by a trusted key for the name in the manifest, the
// image is not considered verified. The parsed manifest object and a boolean
// for whether the manifest is verified is returned.
-func (s *TagStore) loadManifest(eng *engine.Engine, manifestBytes []byte) (*registry.ManifestData, bool, error) {
+func (s *TagStore) loadManifest(eng *engine.Engine, manifestBytes []byte, dgst, ref string) (*registry.ManifestData, bool, error) {
sig, err := libtrust.ParsePrettySignature(manifestBytes, "signatures")
if err != nil {
return nil, false, fmt.Errorf("error parsing payload: %s", err)
@@ -130,6 +34,31 @@ func (s *TagStore) loadManifest(eng *engine.Engine, manifestBytes []byte) (*regi
return nil, false, fmt.Errorf("error retrieving payload: %s", err)
}
+ var manifestDigest digest.Digest
+
+ if dgst != "" {
+ manifestDigest, err = digest.ParseDigest(dgst)
+ if err != nil {
+ return nil, false, fmt.Errorf("invalid manifest digest from registry: %s", err)
+ }
+
+ dgstVerifier, err := digest.NewDigestVerifier(manifestDigest)
+ if err != nil {
+ return nil, false, fmt.Errorf("unable to verify manifest digest from registry: %s", err)
+ }
+
+ dgstVerifier.Write(payload)
+
+ if !dgstVerifier.Verified() {
+ computedDigest, _ := digest.FromBytes(payload)
+ return nil, false, fmt.Errorf("unable to verify manifest digest: registry has %q, computed %q", manifestDigest, computedDigest)
+ }
+ }
+
+ if utils.DigestReference(ref) && ref != manifestDigest.String() {
+ return nil, false, fmt.Errorf("mismatching image manifest digest: got %q, expected %q", manifestDigest, ref)
+ }
+
var manifest registry.ManifestData
if err := json.Unmarshal(payload, &manifest); err != nil {
return nil, false, fmt.Errorf("error unmarshalling manifest: %s", err)
diff --git a/graph/manifest_test.go b/graph/manifest_test.go
index 6084ace776..9137041827 100644
--- a/graph/manifest_test.go
+++ b/graph/manifest_test.go
@@ -2,11 +2,16 @@ package graph
import (
"encoding/json"
+ "fmt"
+ "io"
+ "io/ioutil"
"os"
"testing"
"github.com/docker/docker/image"
+ "github.com/docker/docker/pkg/tarsum"
"github.com/docker/docker/registry"
+ "github.com/docker/docker/runconfig"
"github.com/docker/docker/utils"
)
@@ -17,6 +22,102 @@ const (
testManifestTag = "manifesttest"
)
+func (s *TagStore) newManifest(localName, remoteName, tag string) ([]byte, error) {
+ manifest := &registry.ManifestData{
+ Name: remoteName,
+ Tag: tag,
+ SchemaVersion: 1,
+ }
+ localRepo, err := s.Get(localName)
+ if err != nil {
+ return nil, err
+ }
+ if localRepo == nil {
+ return nil, fmt.Errorf("Repo does not exist: %s", localName)
+ }
+
+ // Get the top-most layer id which the tag points to
+ layerId, exists := localRepo[tag]
+ if !exists {
+ return nil, fmt.Errorf("Tag does not exist for %s: %s", localName, tag)
+ }
+ layersSeen := make(map[string]bool)
+
+ layer, err := s.graph.Get(layerId)
+ if err != nil {
+ return nil, err
+ }
+ manifest.Architecture = layer.Architecture
+ manifest.FSLayers = make([]*registry.FSLayer, 0, 4)
+ manifest.History = make([]*registry.ManifestHistory, 0, 4)
+ var metadata runconfig.Config
+ if layer.Config != nil {
+ metadata = *layer.Config
+ }
+
+ for ; layer != nil; layer, err = layer.GetParent() {
+ if err != nil {
+ return nil, err
+ }
+
+ if layersSeen[layer.ID] {
+ break
+ }
+ if layer.Config != nil && metadata.Image != layer.ID {
+ err = runconfig.Merge(&metadata, layer.Config)
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ checksum, err := layer.GetCheckSum(s.graph.ImageRoot(layer.ID))
+ if err != nil {
+ return nil, fmt.Errorf("Error getting image checksum: %s", err)
+ }
+ if tarsum.VersionLabelForChecksum(checksum) != tarsum.Version1.String() {
+ archive, err := layer.TarLayer()
+ if err != nil {
+ return nil, err
+ }
+
+ defer archive.Close()
+
+ tarSum, err := tarsum.NewTarSum(archive, true, tarsum.Version1)
+ if err != nil {
+ return nil, err
+ }
+ if _, err := io.Copy(ioutil.Discard, tarSum); err != nil {
+ return nil, err
+ }
+
+ checksum = tarSum.Sum(nil)
+
+ // Save checksum value
+ if err := layer.SaveCheckSum(s.graph.ImageRoot(layer.ID), checksum); err != nil {
+ return nil, err
+ }
+ }
+
+ jsonData, err := layer.RawJson()
+ if err != nil {
+ return nil, fmt.Errorf("Cannot retrieve the path for {%s}: %s", layer.ID, err)
+ }
+
+ manifest.FSLayers = append(manifest.FSLayers, &registry.FSLayer{BlobSum: checksum})
+
+ layersSeen[layer.ID] = true
+
+ manifest.History = append(manifest.History, &registry.ManifestHistory{V1Compatibility: string(jsonData)})
+ }
+
+ manifestBytes, err := json.MarshalIndent(manifest, "", " ")
+ if err != nil {
+ return nil, err
+ }
+
+ return manifestBytes, nil
+}
+
func TestManifestTarsumCache(t *testing.T) {
tmp, err := utils.TestDirectory("")
if err != nil {
diff --git a/graph/pull.go b/graph/pull.go
index fd6170b571..adad6f3239 100644
--- a/graph/pull.go
+++ b/graph/pull.go
@@ -11,16 +11,18 @@ import (
"time"
log "github.com/Sirupsen/logrus"
+ "github.com/docker/distribution/digest"
"github.com/docker/docker/engine"
"github.com/docker/docker/image"
- "github.com/docker/docker/pkg/tarsum"
+ "github.com/docker/docker/pkg/common"
+ "github.com/docker/docker/pkg/progressreader"
"github.com/docker/docker/registry"
"github.com/docker/docker/utils"
)
func (s *TagStore) CmdPull(job *engine.Job) engine.Status {
if n := len(job.Args); n != 1 && n != 2 {
- return job.Errorf("Usage: %s IMAGE [TAG]", job.Name)
+ return job.Errorf("Usage: %s IMAGE [TAG|DIGEST]", job.Name)
}
var (
@@ -44,7 +46,7 @@ func (s *TagStore) CmdPull(job *engine.Job) engine.Status {
job.GetenvJson("authConfig", authConfig)
job.GetenvJson("metaHeaders", &metaHeaders)
- c, err := s.poolAdd("pull", repoInfo.LocalName+":"+tag)
+ c, err := s.poolAdd("pull", utils.ImageReference(repoInfo.LocalName, tag))
if err != nil {
if c != nil {
// Another pull of the same repository is already taking place; just wait for it to finish
@@ -54,7 +56,7 @@ func (s *TagStore) CmdPull(job *engine.Job) engine.Status {
}
return job.Error(err)
}
- defer s.poolRemove("pull", repoInfo.LocalName+":"+tag)
+ defer s.poolRemove("pull", utils.ImageReference(repoInfo.LocalName, tag))
log.Debugf("pulling image from host %q with remote name %q", repoInfo.Index.Name, repoInfo.RemoteName)
endpoint, err := repoInfo.GetEndpoint()
@@ -69,13 +71,15 @@ func (s *TagStore) CmdPull(job *engine.Job) engine.Status {
logName := repoInfo.LocalName
if tag != "" {
- logName += ":" + tag
+ logName = utils.ImageReference(logName, tag)
}
- if len(repoInfo.Index.Mirrors) == 0 && ((repoInfo.Official && repoInfo.Index.Official) || endpoint.Version == registry.APIVersion2) {
- j := job.Eng.Job("trust_update_base")
- if err = j.Run(); err != nil {
- log.Errorf("error updating trust base graph: %s", err)
+ if len(repoInfo.Index.Mirrors) == 0 && (repoInfo.Index.Official || endpoint.Version == registry.APIVersion2) {
+ if repoInfo.Official {
+ j := job.Eng.Job("trust_update_base")
+ if err = j.Run(); err != nil {
+ log.Errorf("error updating trust base graph: %s", err)
+ }
}
log.Debugf("pulling v2 repository with local name %q", repoInfo.LocalName)
@@ -84,7 +88,7 @@ func (s *TagStore) CmdPull(job *engine.Job) engine.Status {
log.Errorf("Error logging event 'pull' for %s: %s", logName, err)
}
return engine.StatusOK
- } else if err != registry.ErrDoesNotExist {
+ } else if err != registry.ErrDoesNotExist && err != ErrV2RegistryUnavailable {
log.Errorf("Error from V2 registry: %s", err)
}
@@ -109,7 +113,7 @@ func (s *TagStore) pullRepository(r *registry.Session, out io.Writer, repoInfo *
repoData, err := r.GetRepositoryData(repoInfo.RemoteName)
if err != nil {
if strings.Contains(err.Error(), "HTTP code: 404") {
- return fmt.Errorf("Error: image %s:%s not found", repoInfo.RemoteName, askedTag)
+ return fmt.Errorf("Error: image %s not found", utils.ImageReference(repoInfo.RemoteName, askedTag))
}
// Unexpected HTTP error
return err
@@ -132,7 +136,6 @@ func (s *TagStore) pullRepository(r *registry.Session, out io.Writer, repoInfo *
log.Debugf("Registering tags")
// If no tag has been specified, pull them all
- var imageId string
if askedTag == "" {
for tag, id := range tagsList {
repoData.ImgList[id].Tag = tag
@@ -143,7 +146,6 @@ func (s *TagStore) pullRepository(r *registry.Session, out io.Writer, repoInfo *
if !exists {
return fmt.Errorf("Tag %s not found in repository %s", askedTag, repoInfo.CanonicalName)
}
- imageId = id
repoData.ImgList[id].Tag = askedTag
}
@@ -170,9 +172,9 @@ func (s *TagStore) pullRepository(r *registry.Session, out io.Writer, repoInfo *
// ensure no two downloads of the same image happen at the same time
if c, err := s.poolAdd("pull", "img:"+img.ID); err != nil {
if c != nil {
- out.Write(sf.FormatProgress(utils.TruncateID(img.ID), "Layer already being pulled by another client. Waiting.", nil))
+ out.Write(sf.FormatProgress(common.TruncateID(img.ID), "Layer already being pulled by another client. Waiting.", nil))
<-c
- out.Write(sf.FormatProgress(utils.TruncateID(img.ID), "Download complete", nil))
+ out.Write(sf.FormatProgress(common.TruncateID(img.ID), "Download complete", nil))
} else {
log.Debugf("Image (id: %s) pull is already running, skipping: %v", img.ID, err)
}
@@ -183,12 +185,12 @@ func (s *TagStore) pullRepository(r *registry.Session, out io.Writer, repoInfo *
}
defer s.poolRemove("pull", "img:"+img.ID)
- out.Write(sf.FormatProgress(utils.TruncateID(img.ID), fmt.Sprintf("Pulling image (%s) from %s", img.Tag, repoInfo.CanonicalName), nil))
+ out.Write(sf.FormatProgress(common.TruncateID(img.ID), fmt.Sprintf("Pulling image (%s) from %s", img.Tag, repoInfo.CanonicalName), nil))
success := false
var lastErr, err error
var is_downloaded bool
for _, ep := range repoInfo.Index.Mirrors {
- out.Write(sf.FormatProgress(utils.TruncateID(img.ID), fmt.Sprintf("Pulling image (%s) from %s, mirror: %s", img.Tag, repoInfo.CanonicalName, ep), nil))
+ out.Write(sf.FormatProgress(common.TruncateID(img.ID), fmt.Sprintf("Pulling image (%s) from %s, mirror: %s", img.Tag, repoInfo.CanonicalName, ep), nil))
if is_downloaded, err = s.pullImage(r, out, img.ID, ep, repoData.Tokens, sf); err != nil {
// Don't report errors when pulling from mirrors.
log.Debugf("Error pulling image (%s) from %s, mirror: %s, %s", img.Tag, repoInfo.CanonicalName, ep, err)
@@ -200,12 +202,12 @@ func (s *TagStore) pullRepository(r *registry.Session, out io.Writer, repoInfo *
}
if !success {
for _, ep := range repoData.Endpoints {
- out.Write(sf.FormatProgress(utils.TruncateID(img.ID), fmt.Sprintf("Pulling image (%s) from %s, endpoint: %s", img.Tag, repoInfo.CanonicalName, ep), nil))
+ out.Write(sf.FormatProgress(common.TruncateID(img.ID), fmt.Sprintf("Pulling image (%s) from %s, endpoint: %s", img.Tag, repoInfo.CanonicalName, ep), nil))
if is_downloaded, err = s.pullImage(r, out, img.ID, ep, repoData.Tokens, sf); err != nil {
// It's not ideal that only the last error is returned, it would be better to concatenate the errors.
// As the error is also given to the output stream the user will see the error.
lastErr = err
- out.Write(sf.FormatProgress(utils.TruncateID(img.ID), fmt.Sprintf("Error pulling image (%s) from %s, endpoint: %s, %s", img.Tag, repoInfo.CanonicalName, ep, err), nil))
+ out.Write(sf.FormatProgress(common.TruncateID(img.ID), fmt.Sprintf("Error pulling image (%s) from %s, endpoint: %s, %s", img.Tag, repoInfo.CanonicalName, ep, err), nil))
continue
}
layers_downloaded = layers_downloaded || is_downloaded
@@ -215,13 +217,13 @@ func (s *TagStore) pullRepository(r *registry.Session, out io.Writer, repoInfo *
}
if !success {
err := fmt.Errorf("Error pulling image (%s) from %s, %v", img.Tag, repoInfo.CanonicalName, lastErr)
- out.Write(sf.FormatProgress(utils.TruncateID(img.ID), err.Error(), nil))
+ out.Write(sf.FormatProgress(common.TruncateID(img.ID), err.Error(), nil))
if parallel {
errors <- err
return
}
}
- out.Write(sf.FormatProgress(utils.TruncateID(img.ID), "Download complete", nil))
+ out.Write(sf.FormatProgress(common.TruncateID(img.ID), "Download complete", nil))
if parallel {
errors <- nil
@@ -247,7 +249,7 @@ func (s *TagStore) pullRepository(r *registry.Session, out io.Writer, repoInfo *
}
for tag, id := range tagsList {
- if askedTag != "" && id != imageId {
+ if askedTag != "" && tag != askedTag {
continue
}
if err := s.Set(repoInfo.LocalName, tag, id, true); err != nil {
@@ -257,7 +259,7 @@ func (s *TagStore) pullRepository(r *registry.Session, out io.Writer, repoInfo *
requestedTag := repoInfo.CanonicalName
if len(askedTag) > 0 {
- requestedTag = repoInfo.CanonicalName + ":" + askedTag
+ requestedTag = utils.ImageReference(repoInfo.CanonicalName, askedTag)
}
WriteStatus(requestedTag, out, sf, layers_downloaded)
return nil
@@ -268,7 +270,7 @@ func (s *TagStore) pullImage(r *registry.Session, out io.Writer, imgID, endpoint
if err != nil {
return false, err
}
- out.Write(sf.FormatProgress(utils.TruncateID(imgID), "Pulling dependent layers", nil))
+ out.Write(sf.FormatProgress(common.TruncateID(imgID), "Pulling dependent layers", nil))
// FIXME: Try to stream the images?
// FIXME: Launch the getRemoteImage() in goroutines
@@ -284,7 +286,7 @@ func (s *TagStore) pullImage(r *registry.Session, out io.Writer, imgID, endpoint
defer s.poolRemove("pull", "layer:"+id)
if !s.graph.Exists(id) {
- out.Write(sf.FormatProgress(utils.TruncateID(id), "Pulling metadata", nil))
+ out.Write(sf.FormatProgress(common.TruncateID(id), "Pulling metadata", nil))
var (
imgJSON []byte
imgSize int
@@ -295,7 +297,7 @@ func (s *TagStore) pullImage(r *registry.Session, out io.Writer, imgID, endpoint
for j := 1; j <= retries; j++ {
imgJSON, imgSize, err = r.GetRemoteImageJSON(id, endpoint, token)
if err != nil && j == retries {
- out.Write(sf.FormatProgress(utils.TruncateID(id), "Error pulling dependent layers", nil))
+ out.Write(sf.FormatProgress(common.TruncateID(id), "Error pulling dependent layers", nil))
return layers_downloaded, err
} else if err != nil {
time.Sleep(time.Duration(j) * 500 * time.Millisecond)
@@ -304,7 +306,7 @@ func (s *TagStore) pullImage(r *registry.Session, out io.Writer, imgID, endpoint
img, err = image.NewImgJSON(imgJSON)
layers_downloaded = true
if err != nil && j == retries {
- out.Write(sf.FormatProgress(utils.TruncateID(id), "Error pulling dependent layers", nil))
+ out.Write(sf.FormatProgress(common.TruncateID(id), "Error pulling dependent layers", nil))
return layers_downloaded, fmt.Errorf("Failed to parse json: %s", err)
} else if err != nil {
time.Sleep(time.Duration(j) * 500 * time.Millisecond)
@@ -320,7 +322,7 @@ func (s *TagStore) pullImage(r *registry.Session, out io.Writer, imgID, endpoint
if j > 1 {
status = fmt.Sprintf("Pulling fs layer [retries: %d]", j)
}
- out.Write(sf.FormatProgress(utils.TruncateID(id), status, nil))
+ out.Write(sf.FormatProgress(common.TruncateID(id), status, nil))
layer, err := r.GetRemoteImageLayer(img.ID, endpoint, token, int64(imgSize))
if uerr, ok := err.(*url.Error); ok {
err = uerr.Err
@@ -329,26 +331,34 @@ func (s *TagStore) pullImage(r *registry.Session, out io.Writer, imgID, endpoint
time.Sleep(time.Duration(j) * 500 * time.Millisecond)
continue
} else if err != nil {
- out.Write(sf.FormatProgress(utils.TruncateID(id), "Error pulling dependent layers", nil))
+ out.Write(sf.FormatProgress(common.TruncateID(id), "Error pulling dependent layers", nil))
return layers_downloaded, err
}
layers_downloaded = true
defer layer.Close()
err = s.graph.Register(img,
- utils.ProgressReader(layer, imgSize, out, sf, false, utils.TruncateID(id), "Downloading"))
+ progressreader.New(progressreader.Config{
+ In: layer,
+ Out: out,
+ Formatter: sf,
+ Size: imgSize,
+ NewLines: false,
+ ID: common.TruncateID(id),
+ Action: "Downloading",
+ }))
if terr, ok := err.(net.Error); ok && terr.Timeout() && j < retries {
time.Sleep(time.Duration(j) * 500 * time.Millisecond)
continue
} else if err != nil {
- out.Write(sf.FormatProgress(utils.TruncateID(id), "Error downloading dependent layers", nil))
+ out.Write(sf.FormatProgress(common.TruncateID(id), "Error downloading dependent layers", nil))
return layers_downloaded, err
} else {
break
}
}
}
- out.Write(sf.FormatProgress(utils.TruncateID(id), "Download complete", nil))
+ out.Write(sf.FormatProgress(common.TruncateID(id), "Download complete", nil))
}
return layers_downloaded, nil
}
@@ -365,6 +375,7 @@ func WriteStatus(requestedTag string, out io.Writer, sf *utils.StreamFormatter,
type downloadInfo struct {
imgJSON []byte
img *image.Image
+ digest digest.Digest
tmpFile *os.File
length int64
downloaded bool
@@ -374,6 +385,10 @@ type downloadInfo struct {
func (s *TagStore) pullV2Repository(eng *engine.Engine, r *registry.Session, out io.Writer, repoInfo *registry.RepositoryInfo, tag string, sf *utils.StreamFormatter, parallel bool) error {
endpoint, err := r.V2RegistryEndpoint(repoInfo.Index)
if err != nil {
+ if repoInfo.Index.Official {
+ log.Debugf("Unable to pull from V2 registry, falling back to v1: %s", err)
+ return ErrV2RegistryUnavailable
+ }
return fmt.Errorf("error getting registry endpoint: %s", err)
}
auth, err := r.GetV2Authorization(endpoint, repoInfo.RemoteName, true)
@@ -407,7 +422,7 @@ func (s *TagStore) pullV2Repository(eng *engine.Engine, r *registry.Session, out
requestedTag := repoInfo.CanonicalName
if len(tag) > 0 {
- requestedTag = repoInfo.CanonicalName + ":" + tag
+ requestedTag = utils.ImageReference(repoInfo.CanonicalName, tag)
}
WriteStatus(requestedTag, out, sf, layersDownloaded)
return nil
@@ -415,12 +430,15 @@ func (s *TagStore) pullV2Repository(eng *engine.Engine, r *registry.Session, out
func (s *TagStore) pullV2Tag(eng *engine.Engine, r *registry.Session, out io.Writer, endpoint *registry.Endpoint, repoInfo *registry.RepositoryInfo, tag string, sf *utils.StreamFormatter, parallel bool, auth *registry.RequestAuthorization) (bool, error) {
log.Debugf("Pulling tag from V2 registry: %q", tag)
- manifestBytes, err := r.GetV2ImageManifest(endpoint, repoInfo.RemoteName, tag, auth)
+
+ manifestBytes, manifestDigest, err := r.GetV2ImageManifest(endpoint, repoInfo.RemoteName, tag, auth)
if err != nil {
return false, err
}
- manifest, verified, err := s.loadManifest(eng, manifestBytes)
+ // loadManifest ensures that the manifest payload has the expected digest
+ // if the tag is a digest reference.
+ manifest, verified, err := s.loadManifest(eng, manifestBytes, manifestDigest, tag)
if err != nil {
return false, fmt.Errorf("error verifying manifest: %s", err)
}
@@ -430,10 +448,9 @@ func (s *TagStore) pullV2Tag(eng *engine.Engine, r *registry.Session, out io.Wri
}
if verified {
- log.Printf("Image manifest for %s:%s has been verified", repoInfo.CanonicalName, tag)
- } else {
- out.Write(sf.FormatStatus(tag, "Pulling from %s", repoInfo.CanonicalName))
+ log.Printf("Image manifest for %s has been verified", utils.ImageReference(repoInfo.CanonicalName, tag))
}
+ out.Write(sf.FormatStatus(tag, "Pulling from %s", repoInfo.CanonicalName))
downloads := make([]downloadInfo, len(manifest.FSLayers))
@@ -455,21 +472,22 @@ func (s *TagStore) pullV2Tag(eng *engine.Engine, r *registry.Session, out io.Wri
continue
}
- chunks := strings.SplitN(sumStr, ":", 2)
- if len(chunks) < 2 {
- return false, fmt.Errorf("expected 2 parts in the sumStr, got %#v", chunks)
+ dgst, err := digest.ParseDigest(sumStr)
+ if err != nil {
+ return false, err
}
- sumType, checksum := chunks[0], chunks[1]
- out.Write(sf.FormatProgress(utils.TruncateID(img.ID), "Pulling fs layer", nil))
+ downloads[i].digest = dgst
+
+ out.Write(sf.FormatProgress(common.TruncateID(img.ID), "Pulling fs layer", nil))
downloadFunc := func(di *downloadInfo) error {
log.Debugf("pulling blob %q to V1 img %s", sumStr, img.ID)
if c, err := s.poolAdd("pull", "img:"+img.ID); err != nil {
if c != nil {
- out.Write(sf.FormatProgress(utils.TruncateID(img.ID), "Layer already being pulled by another client. Waiting.", nil))
+ out.Write(sf.FormatProgress(common.TruncateID(img.ID), "Layer already being pulled by another client. Waiting.", nil))
<-c
- out.Write(sf.FormatProgress(utils.TruncateID(img.ID), "Download complete", nil))
+ out.Write(sf.FormatProgress(common.TruncateID(img.ID), "Download complete", nil))
} else {
log.Debugf("Image (id: %s) pull is already running, skipping: %v", img.ID, err)
}
@@ -480,27 +498,37 @@ func (s *TagStore) pullV2Tag(eng *engine.Engine, r *registry.Session, out io.Wri
return err
}
- r, l, err := r.GetV2ImageBlobReader(endpoint, repoInfo.RemoteName, sumType, checksum, auth)
+ r, l, err := r.GetV2ImageBlobReader(endpoint, repoInfo.RemoteName, di.digest.Algorithm(), di.digest.Hex(), auth)
if err != nil {
return err
}
defer r.Close()
- // Wrap the reader with the appropriate TarSum reader.
- tarSumReader, err := tarsum.NewTarSumForLabel(r, true, sumType)
+ verifier, err := digest.NewDigestVerifier(di.digest)
if err != nil {
- return fmt.Errorf("unable to wrap image blob reader with TarSum: %s", err)
+ return err
}
- io.Copy(tmpFile, utils.ProgressReader(ioutil.NopCloser(tarSumReader), int(l), out, sf, false, utils.TruncateID(img.ID), "Downloading"))
+ if _, err := io.Copy(tmpFile, progressreader.New(progressreader.Config{
+ In: ioutil.NopCloser(io.TeeReader(r, verifier)),
+ Out: out,
+ Formatter: sf,
+ Size: int(l),
+ NewLines: false,
+ ID: common.TruncateID(img.ID),
+ Action: "Downloading",
+ })); err != nil {
+ return fmt.Errorf("unable to copy v2 image blob data: %s", err)
+ }
- out.Write(sf.FormatProgress(utils.TruncateID(img.ID), "Verifying Checksum", nil))
+ out.Write(sf.FormatProgress(common.TruncateID(img.ID), "Verifying Checksum", nil))
- if finalChecksum := tarSumReader.Sum(nil); !strings.EqualFold(finalChecksum, sumStr) {
- return fmt.Errorf("image verification failed: checksum mismatch - expected %q but got %q", sumStr, finalChecksum)
+ if !verifier.Verified() {
+ log.Infof("Image verification failed: checksum mismatch for %q", di.digest.String())
+ verified = false
}
- out.Write(sf.FormatProgress(utils.TruncateID(img.ID), "Download complete", nil))
+ out.Write(sf.FormatProgress(common.TruncateID(img.ID), "Download complete", nil))
log.Debugf("Downloaded %s to tempfile %s", img.ID, tmpFile.Name())
di.tmpFile = tmpFile
@@ -525,7 +553,7 @@ func (s *TagStore) pullV2Tag(eng *engine.Engine, r *registry.Session, out io.Wri
}
}
- var layersDownloaded bool
+ var tagUpdated bool
for i := len(downloads) - 1; i >= 0; i-- {
d := &downloads[i]
if d.err != nil {
@@ -541,26 +569,59 @@ func (s *TagStore) pullV2Tag(eng *engine.Engine, r *registry.Session, out io.Wri
d.tmpFile.Seek(0, 0)
if d.tmpFile != nil {
err = s.graph.Register(d.img,
- utils.ProgressReader(d.tmpFile, int(d.length), out, sf, false, utils.TruncateID(d.img.ID), "Extracting"))
+ progressreader.New(progressreader.Config{
+ In: d.tmpFile,
+ Out: out,
+ Formatter: sf,
+ Size: int(d.length),
+ ID: common.TruncateID(d.img.ID),
+ Action: "Extracting",
+ }))
if err != nil {
return false, err
}
// FIXME: Pool release here for parallel tag pull (ensures any downloads block until fully extracted)
}
- out.Write(sf.FormatProgress(utils.TruncateID(d.img.ID), "Pull complete", nil))
- layersDownloaded = true
+ out.Write(sf.FormatProgress(common.TruncateID(d.img.ID), "Pull complete", nil))
+ tagUpdated = true
} else {
- out.Write(sf.FormatProgress(utils.TruncateID(d.img.ID), "Already exists", nil))
+ out.Write(sf.FormatProgress(common.TruncateID(d.img.ID), "Already exists", nil))
}
}
- out.Write(sf.FormatStatus(repoInfo.CanonicalName+":"+tag, "The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security."))
+ // Check for new tag if no layers downloaded
+ if !tagUpdated {
+ repo, err := s.Get(repoInfo.LocalName)
+ if err != nil {
+ return false, err
+ }
+ if repo != nil {
+ if _, exists := repo[tag]; !exists {
+ tagUpdated = true
+ }
+ }
+ }
- if err = s.Set(repoInfo.LocalName, tag, downloads[0].img.ID, true); err != nil {
- return false, err
+ if verified && tagUpdated {
+ out.Write(sf.FormatStatus(utils.ImageReference(repoInfo.CanonicalName, tag), "The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security."))
+ }
+
+ if manifestDigest != "" {
+ out.Write(sf.FormatStatus("", "Digest: %s", manifestDigest))
+ }
+
+ if utils.DigestReference(tag) {
+ if err = s.SetDigest(repoInfo.LocalName, tag, downloads[0].img.ID); err != nil {
+ return false, err
+ }
+ } else {
+ // only set the repository/tag -> image ID mapping when pulling by tag (i.e. not by digest)
+ if err = s.Set(repoInfo.LocalName, tag, downloads[0].img.ID, true); err != nil {
+ return false, err
+ }
}
- return layersDownloaded, nil
+ return tagUpdated, nil
}
diff --git a/graph/push.go b/graph/push.go
index 5d0d24e575..08c383b444 100644
--- a/graph/push.go
+++ b/graph/push.go
@@ -1,7 +1,7 @@
package graph
import (
- "bytes"
+ "encoding/json"
"errors"
"fmt"
"io"
@@ -14,7 +14,10 @@ import (
log "github.com/Sirupsen/logrus"
"github.com/docker/docker/engine"
"github.com/docker/docker/image"
+ "github.com/docker/docker/pkg/common"
+ "github.com/docker/docker/pkg/progressreader"
"github.com/docker/docker/registry"
+ "github.com/docker/docker/runconfig"
"github.com/docker/docker/utils"
"github.com/docker/libtrust"
)
@@ -31,8 +34,15 @@ func (s *TagStore) getImageList(localRepo map[string]string, requestedTag string
for tag, id := range localRepo {
if requestedTag != "" && requestedTag != tag {
+ // Include only the requested tag.
continue
}
+
+ if utils.DigestReference(tag) {
+ // Ignore digest references.
+ continue
+ }
+
var imageListForThisTag []string
tagsByImage[id] = append(tagsByImage[id], tag)
@@ -68,21 +78,19 @@ func (s *TagStore) getImageList(localRepo map[string]string, requestedTag string
return imageList, tagsByImage, nil
}
-func (s *TagStore) getImageTags(localName, askedTag string) ([]string, error) {
- localRepo, err := s.Get(localName)
- if err != nil {
- return nil, err
- }
+func (s *TagStore) getImageTags(localRepo map[string]string, askedTag string) ([]string, error) {
log.Debugf("Checking %s against %#v", askedTag, localRepo)
if len(askedTag) > 0 {
- if _, ok := localRepo[askedTag]; !ok {
- return nil, fmt.Errorf("Tag does not exist for %s:%s", localName, askedTag)
+ if _, ok := localRepo[askedTag]; !ok || utils.DigestReference(askedTag) {
+ return nil, fmt.Errorf("Tag does not exist: %s", askedTag)
}
return []string{askedTag}, nil
}
var tags []string
for tag := range localRepo {
- tags = append(tags, tag)
+ if !utils.DigestReference(tag) {
+ tags = append(tags, tag)
+ }
}
return tags, nil
}
@@ -129,7 +137,7 @@ func lookupImageOnEndpoint(wg *sync.WaitGroup, r *registry.Session, out io.Write
imagesToPush <- image.id
continue
}
- out.Write(sf.FormatStatus("", "Image %s already pushed, skipping", utils.TruncateID(image.id)))
+ out.Write(sf.FormatStatus("", "Image %s already pushed, skipping", common.TruncateID(image.id)))
}
}
@@ -172,7 +180,7 @@ func (s *TagStore) pushImageToEndpoint(endpoint string, out io.Writer, remoteNam
// wait for all the images that require pushes to be collected into a consumable map.
shouldPush := <-pushes
// finish by pushing any images and tags to the endpoint. The order that the images are pushed
- // is very important that is why we are still itterating over the ordered list of imageIDs.
+ // is very important that is why we are still iterating over the ordered list of imageIDs.
for _, id := range imageIDs {
if _, push := shouldPush[id]; push {
if _, err := s.pushImage(r, out, id, endpoint, repo.Tokens, sf); err != nil {
@@ -181,7 +189,7 @@ func (s *TagStore) pushImageToEndpoint(endpoint string, out io.Writer, remoteNam
}
}
for _, tag := range tags[id] {
- out.Write(sf.FormatStatus("", "Pushing tag for rev [%s] on {%s}", utils.TruncateID(id), endpoint+"repositories/"+remoteName+"/tags/"+tag))
+ out.Write(sf.FormatStatus("", "Pushing tag for rev [%s] on {%s}", common.TruncateID(id), endpoint+"repositories/"+remoteName+"/tags/"+tag))
if err := r.PushRegistryTag(remoteName, id, tag, endpoint, repo.Tokens); err != nil {
return err
}
@@ -234,7 +242,7 @@ func (s *TagStore) pushImage(r *registry.Session, out io.Writer, imgID, ep strin
if err != nil {
return "", fmt.Errorf("Cannot retrieve the path for {%s}: %s", imgID, err)
}
- out.Write(sf.FormatProgress(utils.TruncateID(imgID), "Pushing", nil))
+ out.Write(sf.FormatProgress(common.TruncateID(imgID), "Pushing", nil))
imgData := &registry.ImgData{
ID: imgID,
@@ -243,7 +251,7 @@ func (s *TagStore) pushImage(r *registry.Session, out io.Writer, imgID, ep strin
// Send the json
if err := r.PushImageJSONRegistry(imgData, jsonRaw, ep, token); err != nil {
if err == registry.ErrAlreadyExists {
- out.Write(sf.FormatProgress(utils.TruncateID(imgData.ID), "Image already pushed, skipping", nil))
+ out.Write(sf.FormatProgress(common.TruncateID(imgData.ID), "Image already pushed, skipping", nil))
return "", nil
}
return "", err
@@ -258,7 +266,16 @@ func (s *TagStore) pushImage(r *registry.Session, out io.Writer, imgID, ep strin
// Send the layer
log.Debugf("rendered layer for %s of [%d] size", imgData.ID, layerData.Size)
- checksum, checksumPayload, err := r.PushImageLayerRegistry(imgData.ID, utils.ProgressReader(layerData, int(layerData.Size), out, sf, false, utils.TruncateID(imgData.ID), "Pushing"), ep, token, jsonRaw)
+ checksum, checksumPayload, err := r.PushImageLayerRegistry(imgData.ID,
+ progressreader.New(progressreader.Config{
+ In: layerData,
+ Out: out,
+ Formatter: sf,
+ Size: int(layerData.Size),
+ NewLines: false,
+ ID: common.TruncateID(imgData.ID),
+ Action: "Pushing",
+ }), ep, token, jsonRaw)
if err != nil {
return "", err
}
@@ -269,28 +286,21 @@ func (s *TagStore) pushImage(r *registry.Session, out io.Writer, imgID, ep strin
return "", err
}
- out.Write(sf.FormatProgress(utils.TruncateID(imgData.ID), "Image successfully pushed", nil))
+ out.Write(sf.FormatProgress(common.TruncateID(imgData.ID), "Image successfully pushed", nil))
return imgData.Checksum, nil
}
-func (s *TagStore) pushV2Repository(r *registry.Session, eng *engine.Engine, out io.Writer, repoInfo *registry.RepositoryInfo, tag string, sf *utils.StreamFormatter) error {
- if repoInfo.Official {
- j := eng.Job("trust_update_base")
- if err := j.Run(); err != nil {
- log.Errorf("error updating trust base graph: %s", err)
- }
- }
-
+func (s *TagStore) pushV2Repository(r *registry.Session, localRepo Repository, out io.Writer, repoInfo *registry.RepositoryInfo, tag string, sf *utils.StreamFormatter) error {
endpoint, err := r.V2RegistryEndpoint(repoInfo.Index)
if err != nil {
if repoInfo.Index.Official {
- log.Infof("Unable to push to V2 registry, falling back to v1: %s", err)
+ log.Debugf("Unable to push to V2 registry, falling back to v1: %s", err)
return ErrV2RegistryUnavailable
}
return fmt.Errorf("error getting registry endpoint: %s", err)
}
- tags, err := s.getImageTags(repoInfo.LocalName, tag)
+ tags, err := s.getImageTags(localRepo, tag)
if err != nil {
return err
}
@@ -304,117 +314,174 @@ func (s *TagStore) pushV2Repository(r *registry.Session, eng *engine.Engine, out
}
for _, tag := range tags {
- log.Debugf("Pushing %s:%s to v2 repository", repoInfo.LocalName, tag)
- mBytes, err := s.newManifest(repoInfo.LocalName, repoInfo.RemoteName, tag)
- if err != nil {
- return err
- }
- js, err := libtrust.NewJSONSignature(mBytes)
- if err != nil {
- return err
- }
+ log.Debugf("Pushing repository: %s:%s", repoInfo.CanonicalName, tag)
- if err = js.Sign(s.trustKey); err != nil {
- return err
+ layerId, exists := localRepo[tag]
+ if !exists {
+ return fmt.Errorf("tag does not exist: %s", tag)
}
- signedBody, err := js.PrettySignature("signatures")
+ layer, err := s.graph.Get(layerId)
if err != nil {
return err
}
- log.Infof("Signed manifest for %s:%s using daemon's key: %s", repoInfo.LocalName, tag, s.trustKey.KeyID())
-
- manifestBytes := string(signedBody)
- manifest, verified, err := s.loadManifest(eng, signedBody)
- if err != nil {
- return fmt.Errorf("error verifying manifest: %s", err)
+ m := &registry.ManifestData{
+ SchemaVersion: 1,
+ Name: repoInfo.RemoteName,
+ Tag: tag,
+ Architecture: layer.Architecture,
}
-
- if err := checkValidManifest(manifest); err != nil {
- return fmt.Errorf("invalid manifest: %s", err)
+ var metadata runconfig.Config
+ if layer.Config != nil {
+ metadata = *layer.Config
}
- if verified {
- log.Infof("Pushing verified image, key %s is registered for %q", s.trustKey.KeyID(), repoInfo.RemoteName)
+ layersSeen := make(map[string]bool)
+ layers := []*image.Image{layer}
+ for ; layer != nil; layer, err = layer.GetParent() {
+ if err != nil {
+ return err
+ }
+
+ if layersSeen[layer.ID] {
+ break
+ }
+ layers = append(layers, layer)
+ layersSeen[layer.ID] = true
}
+ m.FSLayers = make([]*registry.FSLayer, len(layers))
+ m.History = make([]*registry.ManifestHistory, len(layers))
- for i := len(manifest.FSLayers) - 1; i >= 0; i-- {
- var (
- sumStr = manifest.FSLayers[i].BlobSum
- imgJSON = []byte(manifest.History[i].V1Compatibility)
- )
+ // Schema version 1 requires layer ordering from top to root
+ for i, layer := range layers {
+ log.Debugf("Pushing layer: %s", layer.ID)
- sumParts := strings.SplitN(sumStr, ":", 2)
- if len(sumParts) < 2 {
- return fmt.Errorf("Invalid checksum: %s", sumStr)
+ if layer.Config != nil && metadata.Image != layer.ID {
+ err = runconfig.Merge(&metadata, layer.Config)
+ if err != nil {
+ return err
+ }
}
- manifestSum := sumParts[1]
-
- img, err := image.NewImgJSON(imgJSON)
+ jsonData, err := layer.RawJson()
if err != nil {
- return fmt.Errorf("Failed to parse json: %s", err)
+ return fmt.Errorf("cannot retrieve the path for %s: %s", layer.ID, err)
}
- // Call mount blob
- exists, err := r.HeadV2ImageBlob(endpoint, repoInfo.RemoteName, sumParts[0], manifestSum, auth)
+ checksum, err := layer.GetCheckSum(s.graph.ImageRoot(layer.ID))
if err != nil {
- out.Write(sf.FormatProgress(utils.TruncateID(img.ID), "Image push failed", nil))
- return err
+ return fmt.Errorf("error getting image checksum: %s", err)
}
+ var exists bool
+ if len(checksum) > 0 {
+ sumParts := strings.SplitN(checksum, ":", 2)
+ if len(sumParts) < 2 {
+ return fmt.Errorf("Invalid checksum: %s", checksum)
+ }
+
+ // Call mount blob
+ exists, err = r.HeadV2ImageBlob(endpoint, repoInfo.RemoteName, sumParts[0], sumParts[1], auth)
+ if err != nil {
+ out.Write(sf.FormatProgress(common.TruncateID(layer.ID), "Image push failed", nil))
+ return err
+ }
+ }
if !exists {
- if err := s.pushV2Image(r, img, endpoint, repoInfo.RemoteName, sumParts[0], manifestSum, sf, out, auth); err != nil {
+ if cs, err := s.pushV2Image(r, layer, endpoint, repoInfo.RemoteName, sf, out, auth); err != nil {
return err
+ } else if cs != checksum {
+ // Cache new checksum
+ if err := layer.SaveCheckSum(s.graph.ImageRoot(layer.ID), cs); err != nil {
+ return err
+ }
+ checksum = cs
}
} else {
- out.Write(sf.FormatProgress(utils.TruncateID(img.ID), "Image already exists", nil))
+ out.Write(sf.FormatProgress(common.TruncateID(layer.ID), "Image already exists", nil))
}
+ m.FSLayers[i] = &registry.FSLayer{BlobSum: checksum}
+ m.History[i] = &registry.ManifestHistory{V1Compatibility: string(jsonData)}
}
+ if err := checkValidManifest(m); err != nil {
+ return fmt.Errorf("invalid manifest: %s", err)
+ }
+
+ log.Debugf("Pushing %s:%s to v2 repository", repoInfo.LocalName, tag)
+ mBytes, err := json.MarshalIndent(m, "", " ")
+ if err != nil {
+ return err
+ }
+ js, err := libtrust.NewJSONSignature(mBytes)
+ if err != nil {
+ return err
+ }
+
+ if err = js.Sign(s.trustKey); err != nil {
+ return err
+ }
+
+ signedBody, err := js.PrettySignature("signatures")
+ if err != nil {
+ return err
+ }
+ log.Infof("Signed manifest for %s:%s using daemon's key: %s", repoInfo.LocalName, tag, s.trustKey.KeyID())
+
// push the manifest
- if err := r.PutV2ImageManifest(endpoint, repoInfo.RemoteName, tag, bytes.NewReader([]byte(manifestBytes)), auth); err != nil {
+ digest, err := r.PutV2ImageManifest(endpoint, repoInfo.RemoteName, tag, signedBody, mBytes, auth)
+ if err != nil {
return err
}
+
+ out.Write(sf.FormatStatus("", "Digest: %s", digest))
}
return nil
}
// PushV2Image pushes the image content to the v2 registry, first buffering the contents to disk
-func (s *TagStore) pushV2Image(r *registry.Session, img *image.Image, endpoint *registry.Endpoint, imageName, sumType, sumStr string, sf *utils.StreamFormatter, out io.Writer, auth *registry.RequestAuthorization) error {
- out.Write(sf.FormatProgress(utils.TruncateID(img.ID), "Buffering to Disk", nil))
+func (s *TagStore) pushV2Image(r *registry.Session, img *image.Image, endpoint *registry.Endpoint, imageName string, sf *utils.StreamFormatter, out io.Writer, auth *registry.RequestAuthorization) (string, error) {
+ out.Write(sf.FormatProgress(common.TruncateID(img.ID), "Buffering to Disk", nil))
image, err := s.graph.Get(img.ID)
if err != nil {
- return err
+ return "", err
}
arch, err := image.TarLayer()
if err != nil {
- return err
+ return "", err
}
+ defer arch.Close()
+
tf, err := s.graph.newTempFile()
if err != nil {
- return err
+ return "", err
}
defer func() {
tf.Close()
os.Remove(tf.Name())
}()
- size, err := bufferToFile(tf, arch)
- if err != nil {
- return err
- }
+ size, dgst, err := bufferToFile(tf, arch)
// Send the layer
log.Debugf("rendered layer for %s of [%d] size", img.ID, size)
- if err := r.PutV2ImageBlob(endpoint, imageName, sumType, sumStr, utils.ProgressReader(tf, int(size), out, sf, false, utils.TruncateID(img.ID), "Pushing"), auth); err != nil {
- out.Write(sf.FormatProgress(utils.TruncateID(img.ID), "Image push failed", nil))
- return err
+ if err := r.PutV2ImageBlob(endpoint, imageName, dgst.Algorithm(), dgst.Hex(),
+ progressreader.New(progressreader.Config{
+ In: tf,
+ Out: out,
+ Formatter: sf,
+ Size: int(size),
+ NewLines: false,
+ ID: common.TruncateID(img.ID),
+ Action: "Pushing",
+ }), auth); err != nil {
+ out.Write(sf.FormatProgress(common.TruncateID(img.ID), "Image push failed", nil))
+ return "", err
}
- out.Write(sf.FormatProgress(utils.TruncateID(img.ID), "Image successfully pushed", nil))
- return nil
+ out.Write(sf.FormatProgress(common.TruncateID(img.ID), "Image successfully pushed", nil))
+ return dgst.String(), nil
}
// FIXME: Allow to interrupt current push when new push of same image is done.
@@ -449,14 +516,24 @@ func (s *TagStore) CmdPush(job *engine.Job) engine.Status {
return job.Error(err)
}
- img, err := s.graph.Get(repoInfo.LocalName)
- r, err2 := registry.NewSession(authConfig, registry.HTTPRequestFactory(metaHeaders), endpoint, false)
- if err2 != nil {
- return job.Error(err2)
+ r, err := registry.NewSession(authConfig, registry.HTTPRequestFactory(metaHeaders), endpoint, false)
+ if err != nil {
+ return job.Error(err)
}
- if endpoint.Version == registry.APIVersion2 {
- err := s.pushV2Repository(r, job.Eng, job.Stdout, repoInfo, tag, sf)
+ reposLen := 1
+ if tag == "" {
+ reposLen = len(s.Repositories[repoInfo.LocalName])
+ }
+ job.Stdout.Write(sf.FormatStatus("", "The push refers to a repository [%s] (len: %d)", repoInfo.CanonicalName, reposLen))
+ // If it fails, try to get the repository
+ localRepo, exists := s.Repositories[repoInfo.LocalName]
+ if !exists {
+ return job.Errorf("Repository does not exist: %s", repoInfo.LocalName)
+ }
+
+ if repoInfo.Index.Official || endpoint.Version == registry.APIVersion2 {
+ err := s.pushV2Repository(r, localRepo, job.Stdout, repoInfo, tag, sf)
if err == nil {
return engine.StatusOK
}
@@ -466,26 +543,9 @@ func (s *TagStore) CmdPush(job *engine.Job) engine.Status {
}
}
- if err != nil {
- reposLen := 1
- if tag == "" {
- reposLen = len(s.Repositories[repoInfo.LocalName])
- }
- job.Stdout.Write(sf.FormatStatus("", "The push refers to a repository [%s] (len: %d)", repoInfo.CanonicalName, reposLen))
- // If it fails, try to get the repository
- if localRepo, exists := s.Repositories[repoInfo.LocalName]; exists {
- if err := s.pushRepository(r, job.Stdout, repoInfo, localRepo, tag, sf); err != nil {
- return job.Error(err)
- }
- return engine.StatusOK
- }
- return job.Error(err)
- }
-
- var token []string
- job.Stdout.Write(sf.FormatStatus("", "The push refers to an image: [%s]", repoInfo.CanonicalName))
- if _, err := s.pushImage(r, job.Stdout, img.ID, endpoint.String(), token, sf); err != nil {
+ if err := s.pushRepository(r, job.Stdout, repoInfo, localRepo, tag, sf); err != nil {
return job.Error(err)
}
return engine.StatusOK
+
}
diff --git a/graph/service.go b/graph/service.go
index 72f2e4bff7..350ed8cf97 100644
--- a/graph/service.go
+++ b/graph/service.go
@@ -12,8 +12,7 @@ import (
func (s *TagStore) Install(eng *engine.Engine) error {
for name, handler := range map[string]engine.Handler{
"image_set": s.CmdSet,
- "image_tag": s.CmdTag,
- "tag": s.CmdTagLegacy, // FIXME merge with "image_tag"
+ "tag": s.CmdTag,
"image_get": s.CmdGet,
"image_inspect": s.CmdLookup,
"image_tarlayer": s.CmdTarLayer,
diff --git a/graph/tag.go b/graph/tag.go
index 3d89422f9d..b33e49d593 100644
--- a/graph/tag.go
+++ b/graph/tag.go
@@ -2,34 +2,9 @@ package graph
import (
"github.com/docker/docker/engine"
- "github.com/docker/docker/pkg/parsers"
)
-// CmdTag assigns a new name and tag to an existing image. If the tag already exists,
-// it is changed and the image previously referenced by the tag loses that reference.
-// This may cause the old image to be garbage-collected if its reference count reaches zero.
-//
-// Syntax: image_tag NEWNAME OLDNAME
-// Example: image_tag shykes/myapp:latest shykes/myapp:1.42.0
func (s *TagStore) CmdTag(job *engine.Job) engine.Status {
- if len(job.Args) != 2 {
- return job.Errorf("usage: %s NEWNAME OLDNAME", job.Name)
- }
- var (
- newName = job.Args[0]
- oldName = job.Args[1]
- )
- newRepo, newTag := parsers.ParseRepositoryTag(newName)
- // FIXME: Set should either parse both old and new name, or neither.
- // the current prototype is inconsistent.
- if err := s.Set(newRepo, newTag, oldName, true); err != nil {
- return job.Error(err)
- }
- return engine.StatusOK
-}
-
-// FIXME: merge into CmdTag above, and merge "image_tag" and "tag" into a single job.
-func (s *TagStore) CmdTagLegacy(job *engine.Job) engine.Status {
if len(job.Args) != 2 && len(job.Args) != 3 {
return job.Errorf("Usage: %s IMAGE REPOSITORY [TAG]\n", job.Name)
}
diff --git a/graph/tags.go b/graph/tags.go
index 6bdb296cd1..5d26b8cfba 100644
--- a/graph/tags.go
+++ b/graph/tags.go
@@ -2,6 +2,7 @@ package graph
import (
"encoding/json"
+ "errors"
"fmt"
"io/ioutil"
"os"
@@ -12,6 +13,7 @@ import (
"sync"
"github.com/docker/docker/image"
+ "github.com/docker/docker/pkg/common"
"github.com/docker/docker/pkg/parsers"
"github.com/docker/docker/registry"
"github.com/docker/docker/utils"
@@ -21,7 +23,9 @@ import (
const DEFAULTTAG = "latest"
var (
+ //FIXME these 2 regexes also exist in registry/v2/regexp.go
validTagName = regexp.MustCompile(`^[\w][\w.-]{0,127}$`)
+ validDigest = regexp.MustCompile(`[a-zA-Z0-9-_+.]+:[a-fA-F0-9]+`)
)
type TagStore struct {
@@ -107,20 +111,31 @@ func (store *TagStore) reload() error {
func (store *TagStore) LookupImage(name string) (*image.Image, error) {
// FIXME: standardize on returning nil when the image doesn't exist, and err for everything else
// (so we can pass all errors here)
- repos, tag := parsers.ParseRepositoryTag(name)
- if tag == "" {
- tag = DEFAULTTAG
+ repoName, ref := parsers.ParseRepositoryTag(name)
+ if ref == "" {
+ ref = DEFAULTTAG
+ }
+ var (
+ err error
+ img *image.Image
+ )
+
+ img, err = store.GetImage(repoName, ref)
+ if err != nil {
+ return nil, err
+ }
+
+ if img != nil {
+ return img, err
}
- img, err := store.GetImage(repos, tag)
+
+ // name must be an image ID.
store.Lock()
defer store.Unlock()
- if err != nil {
+ if img, err = store.graph.Get(name); err != nil {
return nil, err
- } else if img == nil {
- if img, err = store.graph.Get(name); err != nil {
- return nil, err
- }
}
+
return img, nil
}
@@ -132,7 +147,7 @@ func (store *TagStore) ByID() map[string][]string {
byID := make(map[string][]string)
for repoName, repository := range store.Repositories {
for tag, id := range repository {
- name := repoName + ":" + tag
+ name := utils.ImageReference(repoName, tag)
if _, exists := byID[id]; !exists {
byID[id] = []string{name}
} else {
@@ -148,7 +163,7 @@ func (store *TagStore) ImageName(id string) string {
if names, exists := store.ByID()[id]; exists && len(names) > 0 {
return names[0]
}
- return utils.TruncateID(id)
+ return common.TruncateID(id)
}
func (store *TagStore) DeleteAll(id string) error {
@@ -171,32 +186,35 @@ func (store *TagStore) DeleteAll(id string) error {
return nil
}
-func (store *TagStore) Delete(repoName, tag string) (bool, error) {
+func (store *TagStore) Delete(repoName, ref string) (bool, error) {
store.Lock()
defer store.Unlock()
deleted := false
if err := store.reload(); err != nil {
return false, err
}
+
repoName = registry.NormalizeLocalName(repoName)
- if r, exists := store.Repositories[repoName]; exists {
- if tag != "" {
- if _, exists2 := r[tag]; exists2 {
- delete(r, tag)
- if len(r) == 0 {
- delete(store.Repositories, repoName)
- }
- deleted = true
- } else {
- return false, fmt.Errorf("No such tag: %s:%s", repoName, tag)
- }
- } else {
+
+ if ref == "" {
+ // Delete the whole repository.
+ delete(store.Repositories, repoName)
+ return true, store.save()
+ }
+
+ repoRefs, exists := store.Repositories[repoName]
+ if !exists {
+ return false, fmt.Errorf("No such repository: %s", repoName)
+ }
+
+ if _, exists := repoRefs[ref]; exists {
+ delete(repoRefs, ref)
+ if len(repoRefs) == 0 {
delete(store.Repositories, repoName)
- deleted = true
}
- } else {
- return false, fmt.Errorf("No such repository: %s", repoName)
+ deleted = true
}
+
return deleted, store.save()
}
@@ -234,6 +252,40 @@ func (store *TagStore) Set(repoName, tag, imageName string, force bool) error {
return store.save()
}
+// SetDigest creates a digest reference to an image ID.
+func (store *TagStore) SetDigest(repoName, digest, imageName string) error {
+ img, err := store.LookupImage(imageName)
+ if err != nil {
+ return err
+ }
+
+ if err := validateRepoName(repoName); err != nil {
+ return err
+ }
+
+ if err := validateDigest(digest); err != nil {
+ return err
+ }
+
+ store.Lock()
+ defer store.Unlock()
+ if err := store.reload(); err != nil {
+ return err
+ }
+
+ repoName = registry.NormalizeLocalName(repoName)
+ repoRefs, exists := store.Repositories[repoName]
+ if !exists {
+ repoRefs = Repository{}
+ store.Repositories[repoName] = repoRefs
+ } else if oldID, exists := repoRefs[digest]; exists && oldID != img.ID {
+ return fmt.Errorf("Conflict: Digest %s is already set to image %s", digest, oldID)
+ }
+
+ repoRefs[digest] = img.ID
+ return store.save()
+}
+
func (store *TagStore) Get(repoName string) (Repository, error) {
store.Lock()
defer store.Unlock()
@@ -247,24 +299,29 @@ func (store *TagStore) Get(repoName string) (Repository, error) {
return nil, nil
}
-func (store *TagStore) GetImage(repoName, tagOrID string) (*image.Image, error) {
+func (store *TagStore) GetImage(repoName, refOrID string) (*image.Image, error) {
repo, err := store.Get(repoName)
- store.Lock()
- defer store.Unlock()
+
if err != nil {
return nil, err
- } else if repo == nil {
+ }
+ if repo == nil {
return nil, nil
}
- if revision, exists := repo[tagOrID]; exists {
- return store.graph.Get(revision)
+
+ store.Lock()
+ defer store.Unlock()
+ if imgID, exists := repo[refOrID]; exists {
+ return store.graph.Get(imgID)
}
+
// If no matching tag is found, search through images for a matching image id
for _, revision := range repo {
- if strings.HasPrefix(revision, tagOrID) {
+ if strings.HasPrefix(revision, refOrID) {
return store.graph.Get(revision)
}
}
+
return nil, nil
}
@@ -274,8 +331,8 @@ func (store *TagStore) GetRepoRefs() map[string][]string {
for name, repository := range store.Repositories {
for tag, id := range repository {
- shortID := utils.TruncateID(id)
- reporefs[shortID] = append(reporefs[shortID], fmt.Sprintf("%s:%s", name, tag))
+ shortID := common.TruncateID(id)
+ reporefs[shortID] = append(reporefs[shortID], utils.ImageReference(name, tag))
}
}
store.Unlock()
@@ -293,10 +350,10 @@ func validateRepoName(name string) error {
return nil
}
-// Validate the name of a tag
+// ValidateTagName validates the name of a tag
func ValidateTagName(name string) error {
if name == "" {
- return fmt.Errorf("Tag name can't be empty")
+ return fmt.Errorf("tag name can't be empty")
}
if !validTagName.MatchString(name) {
return fmt.Errorf("Illegal tag name (%s): only [A-Za-z0-9_.-] are allowed, minimum 1, maximum 128 in length", name)
@@ -304,6 +361,16 @@ func ValidateTagName(name string) error {
return nil
}
+func validateDigest(dgst string) error {
+ if dgst == "" {
+ return errors.New("digest can't be empty")
+ }
+ if !validDigest.MatchString(dgst) {
+ return fmt.Errorf("illegal digest (%s): must be of the form [a-zA-Z0-9-_+.]+:[a-fA-F0-9]+", dgst)
+ }
+ return nil
+}
+
func (store *TagStore) poolAdd(kind, key string) (chan struct{}, error) {
store.Lock()
defer store.Unlock()
diff --git a/graph/tags_unit_test.go b/graph/tags_unit_test.go
index 58ad8ed878..c1a686bbc4 100644
--- a/graph/tags_unit_test.go
+++ b/graph/tags_unit_test.go
@@ -21,6 +21,8 @@ const (
testPrivateImageName = "127.0.0.1:8000/privateapp"
testPrivateImageID = "5bc255f8699e4ee89ac4469266c3d11515da88fdcbde45d7b069b636ff4efd81"
testPrivateImageIDShort = "5bc255f8699e"
+ testPrivateImageDigest = "sha256:bc8813ea7b3603864987522f02a76101c17ad122e1c46d790efc0fca78ca7bfb"
+ testPrivateImageTag = "sometag"
)
func fakeTar() (io.Reader, error) {
@@ -83,6 +85,9 @@ func mkTestTagStore(root string, t *testing.T) *TagStore {
if err := store.Set(testPrivateImageName, "", testPrivateImageID, false); err != nil {
t.Fatal(err)
}
+ if err := store.SetDigest(testPrivateImageName, testPrivateImageDigest, testPrivateImageID); err != nil {
+ t.Fatal(err)
+ }
return store
}
@@ -128,6 +133,10 @@ func TestLookupImage(t *testing.T) {
"fail:fail",
}
+ digestLookups := []string{
+ testPrivateImageName + "@" + testPrivateImageDigest,
+ }
+
for _, name := range officialLookups {
if img, err := store.LookupImage(name); err != nil {
t.Errorf("Error looking up %s: %s", name, err)
@@ -155,6 +164,16 @@ func TestLookupImage(t *testing.T) {
t.Errorf("Expected 0 image, 1 found: %s", name)
}
}
+
+ for _, name := range digestLookups {
+ if img, err := store.LookupImage(name); err != nil {
+ t.Errorf("Error looking up %s: %s", name, err)
+ } else if img == nil {
+ t.Errorf("Expected 1 image, none found: %s", name)
+ } else if img.ID != testPrivateImageID {
+ t.Errorf("Expected ID '%s' found '%s'", testPrivateImageID, img.ID)
+ }
+ }
}
func TestValidTagName(t *testing.T) {
@@ -174,3 +193,24 @@ func TestInvalidTagName(t *testing.T) {
}
}
}
+
+func TestValidateDigest(t *testing.T) {
+ tests := []struct {
+ input string
+ expectError bool
+ }{
+ {"", true},
+ {"latest", true},
+ {"a:b", false},
+ {"aZ0124-.+:bY852-_.+=", false},
+ {"#$%#$^:$%^#$%", true},
+ }
+
+ for i, test := range tests {
+ err := validateDigest(test.input)
+ gotError := err != nil
+ if e, a := test.expectError, gotError; e != a {
+ t.Errorf("%d: with input %s, expected error=%t, got %t: %s", i, test.input, test.expectError, gotError, err)
+ }
+ }
+}
diff --git a/hack b/hack
deleted file mode 120000
index e3f094ee63..0000000000
--- a/hack
+++ /dev/null
@@ -1 +0,0 @@
-project \ No newline at end of file
diff --git a/project/dind b/hack/dind
index f8fae6379c..f8fae6379c 100755
--- a/project/dind
+++ b/hack/dind
diff --git a/project/generate-authors.sh b/hack/generate-authors.sh
index 4bd60364a4..e78a97f962 100755
--- a/project/generate-authors.sh
+++ b/hack/generate-authors.sh
@@ -8,7 +8,7 @@ cd "$(dirname "$(readlink -f "$BASH_SOURCE")")/.."
{
cat <<-'EOH'
# This file lists all individuals having contributed content to the repository.
- # For how it is generated, see `project/generate-authors.sh`.
+ # For how it is generated, see `hack/generate-authors.sh`.
EOH
echo
git log --format='%aN <%aE>' | LC_ALL=C.UTF-8 sort -uf
diff --git a/hack/install.sh b/hack/install.sh
new file mode 100755
index 0000000000..b0177e6708
--- /dev/null
+++ b/hack/install.sh
@@ -0,0 +1,249 @@
+#!/bin/sh
+set -e
+#
+# This script is meant for quick & easy install via:
+# 'curl -sSL https://get.docker.com/ | sh'
+# or:
+# 'wget -qO- https://get.docker.com/ | sh'
+#
+#
+# Docker Maintainers:
+# To update this script on https://get.docker.com,
+# use hack/release.sh during a normal release,
+# or the following one-liner for script hotfixes:
+# s3cmd put --acl-public -P hack/install.sh s3://get.docker.com/index
+#
+
+url='https://get.docker.com/'
+
+command_exists() {
+ command -v "$@" > /dev/null 2>&1
+}
+
+echo_docker_as_nonroot() {
+ your_user=your-user
+ [ "$user" != 'root' ] && your_user="$user"
+ # intentionally mixed spaces and tabs here -- tabs are stripped by "<<-EOF", spaces are kept in the output
+ cat <<-EOF
+
+ If you would like to use Docker as a non-root user, you should now consider
+ adding your user to the "docker" group with something like:
+
+ sudo usermod -aG docker $your_user
+
+ Remember that you will have to log out and back in for this to take effect!
+
+ EOF
+}
+
+do_install() {
+ case "$(uname -m)" in
+ *64)
+ ;;
+ *)
+ cat >&2 <<-'EOF'
+ Error: you are not using a 64bit platform.
+ Docker currently only supports 64bit platforms.
+ EOF
+ exit 1
+ ;;
+ esac
+
+ if command_exists docker || command_exists lxc-docker; then
+ cat >&2 <<-'EOF'
+ Warning: "docker" or "lxc-docker" command appears to already exist.
+ Please ensure that you do not already have docker installed.
+ You may press Ctrl+C now to abort this process and rectify this situation.
+ EOF
+ ( set -x; sleep 20 )
+ fi
+
+ user="$(id -un 2>/dev/null || true)"
+
+ sh_c='sh -c'
+ if [ "$user" != 'root' ]; then
+ if command_exists sudo; then
+ sh_c='sudo -E sh -c'
+ elif command_exists su; then
+ sh_c='su -c'
+ else
+ cat >&2 <<-'EOF'
+ Error: this installer needs the ability to run commands as root.
+ We are unable to find either "sudo" or "su" available to make this happen.
+ EOF
+ exit 1
+ fi
+ fi
+
+ curl=''
+ if command_exists curl; then
+ curl='curl -sSL'
+ elif command_exists wget; then
+ curl='wget -qO-'
+ elif command_exists busybox && busybox --list-modules | grep -q wget; then
+ curl='busybox wget -qO-'
+ fi
+
+ # perform some very rudimentary platform detection
+ lsb_dist=''
+ if command_exists lsb_release; then
+ lsb_dist="$(lsb_release -si)"
+ fi
+ if [ -z "$lsb_dist" ] && [ -r /etc/lsb-release ]; then
+ lsb_dist="$(. /etc/lsb-release && echo "$DISTRIB_ID")"
+ fi
+ if [ -z "$lsb_dist" ] && [ -r /etc/debian_version ]; then
+ lsb_dist='debian'
+ fi
+ if [ -z "$lsb_dist" ] && [ -r /etc/fedora-release ]; then
+ lsb_dist='fedora'
+ fi
+ if [ -z "$lsb_dist" ] && [ -r /etc/os-release ]; then
+ lsb_dist="$(. /etc/os-release && echo "$ID")"
+ fi
+
+ lsb_dist="$(echo "$lsb_dist" | tr '[:upper:]' '[:lower:]')"
+ case "$lsb_dist" in
+ amzn|fedora|centos)
+ if [ "$lsb_dist" = 'amzn' ]; then
+ (
+ set -x
+ $sh_c 'sleep 3; yum -y -q install docker'
+ )
+ else
+ (
+ set -x
+ $sh_c 'sleep 3; yum -y -q install docker-io'
+ )
+ fi
+ if command_exists docker && [ -e /var/run/docker.sock ]; then
+ (
+ set -x
+ $sh_c 'docker version'
+ ) || true
+ fi
+ echo_docker_as_nonroot
+ exit 0
+ ;;
+
+ ubuntu|debian|linuxmint)
+ export DEBIAN_FRONTEND=noninteractive
+
+ did_apt_get_update=
+ apt_get_update() {
+ if [ -z "$did_apt_get_update" ]; then
+ ( set -x; $sh_c 'sleep 3; apt-get update' )
+ did_apt_get_update=1
+ fi
+ }
+
+ # aufs is preferred over devicemapper; try to ensure the driver is available.
+ if ! grep -q aufs /proc/filesystems && ! $sh_c 'modprobe aufs'; then
+ if uname -r | grep -q -- '-generic' && dpkg -l 'linux-image-*-generic' | grep -q '^ii' 2>/dev/null; then
+ kern_extras="linux-image-extra-$(uname -r) linux-image-extra-virtual"
+
+ apt_get_update
+ ( set -x; $sh_c 'sleep 3; apt-get install -y -q '"$kern_extras" ) || true
+
+ if ! grep -q aufs /proc/filesystems && ! $sh_c 'modprobe aufs'; then
+ echo >&2 'Warning: tried to install '"$kern_extras"' (for AUFS)'
+ echo >&2 ' but we still have no AUFS. Docker may not work. Proceeding anyways!'
+ ( set -x; sleep 10 )
+ fi
+ else
+ echo >&2 'Warning: current kernel is not supported by the linux-image-extra-virtual'
+ echo >&2 ' package. We have no AUFS support. Consider installing the packages'
+ echo >&2 ' linux-image-virtual kernel and linux-image-extra-virtual for AUFS support.'
+ ( set -x; sleep 10 )
+ fi
+ fi
+
+ # install apparmor utils if they're missing and apparmor is enabled in the kernel
+ # otherwise Docker will fail to start
+ if [ "$(cat /sys/module/apparmor/parameters/enabled 2>/dev/null)" = 'Y' ]; then
+ if command -v apparmor_parser &> /dev/null; then
+ echo 'apparmor is enabled in the kernel and apparmor utils were already installed'
+ else
+ echo 'apparmor is enabled in the kernel, but apparmor_parser missing'
+ apt_get_update
+ ( set -x; $sh_c 'sleep 3; apt-get install -y -q apparmor' )
+ fi
+ fi
+
+ if [ ! -e /usr/lib/apt/methods/https ]; then
+ apt_get_update
+ ( set -x; $sh_c 'sleep 3; apt-get install -y -q apt-transport-https ca-certificates' )
+ fi
+ if [ -z "$curl" ]; then
+ apt_get_update
+ ( set -x; $sh_c 'sleep 3; apt-get install -y -q curl ca-certificates' )
+ curl='curl -sSL'
+ fi
+ (
+ set -x
+ if [ "https://get.docker.com/" = "$url" ]; then
+ $sh_c "apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9"
+ elif [ "https://test.docker.com/" = "$url" ]; then
+ $sh_c "apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 740B314AE3941731B942C66ADF4FD13717AAD7D6"
+ else
+ $sh_c "$curl ${url}gpg | apt-key add -"
+ fi
+ $sh_c "echo deb ${url}ubuntu docker main > /etc/apt/sources.list.d/docker.list"
+ $sh_c 'sleep 3; apt-get update; apt-get install -y -q lxc-docker'
+ )
+ if command_exists docker && [ -e /var/run/docker.sock ]; then
+ (
+ set -x
+ $sh_c 'docker version'
+ ) || true
+ fi
+ echo_docker_as_nonroot
+ exit 0
+ ;;
+
+ gentoo)
+ if [ "$url" = "https://test.docker.com/" ]; then
+ # intentionally mixed spaces and tabs here -- tabs are stripped by "<<-'EOF'", spaces are kept in the output
+ cat >&2 <<-'EOF'
+
+ You appear to be trying to install the latest nightly build in Gentoo.'
+ The portage tree should contain the latest stable release of Docker, but'
+ if you want something more recent, you can always use the live ebuild'
+ provided in the "docker" overlay available via layman. For more'
+ instructions, please see the following URL:'
+
+ https://github.com/tianon/docker-overlay#using-this-overlay'
+
+ After adding the "docker" overlay, you should be able to:'
+
+ emerge -av =app-emulation/docker-9999'
+
+ EOF
+ exit 1
+ fi
+
+ (
+ set -x
+ $sh_c 'sleep 3; emerge app-emulation/docker'
+ )
+ exit 0
+ ;;
+ esac
+
+ # intentionally mixed spaces and tabs here -- tabs are stripped by "<<-'EOF'", spaces are kept in the output
+ cat >&2 <<-'EOF'
+
+ Either your platform is not easily detectable, is not supported by this
+ installer script (yet - PRs welcome! [hack/install.sh]), or does not yet have
+ a package for Docker. Please visit the following URL for more detailed
+ installation instructions:
+
+ https://docs.docker.com/en/latest/installation/
+
+ EOF
+ exit 1
+}
+
+# wrapped up in a function so that we have some protection against only getting
+# half the file during "curl | sh"
+do_install
diff --git a/project/make.sh b/hack/make.sh
index 4cbc1955cb..118d4327f5 100755
--- a/project/make.sh
+++ b/hack/make.sh
@@ -94,15 +94,15 @@ if [ -z "$DOCKER_CLIENTONLY" ]; then
DOCKER_BUILDTAGS+=" daemon"
fi
+if [ "$DOCKER_EXECDRIVER" = 'lxc' ]; then
+ DOCKER_BUILDTAGS+=' test_no_exec'
+fi
+
# Use these flags when compiling the tests and final binary
-LDFLAGS='
- -X '$DOCKER_PKG'/dockerversion.GITCOMMIT "'$GITCOMMIT'"
- -X '$DOCKER_PKG'/dockerversion.VERSION "'$VERSION'"
-'
-if [ -z "$DEBUG" ]; then
- LDFLAGS="-w $LDFLAGS"
-fi
+IAMSTATIC='true'
+source "$(dirname "$BASH_SOURCE")/make/.go-autogen"
+LDFLAGS='-w'
LDFLAGS_STATIC='-linkmode external'
# Cgo -H windows is incompatible with -linkmode external.
@@ -124,7 +124,6 @@ TESTFLAGS+=" -test.timeout=${TIMEOUT}"
EXTLDFLAGS_STATIC_DOCKER="$EXTLDFLAGS_STATIC -lpthread -Wl,--unresolved-symbols=ignore-in-object-files"
LDFLAGS_STATIC_DOCKER="
$LDFLAGS_STATIC
- -X $DOCKER_PKG/dockerversion.IAMSTATIC true
-extldflags \"$EXTLDFLAGS_STATIC_DOCKER\"
"
@@ -174,9 +173,22 @@ go_test_dir() {
export DEST
echo '+ go test' $TESTFLAGS "${DOCKER_PKG}${dir#.}"
cd "$dir"
- go test ${testcover[@]} -ldflags "$LDFLAGS" "${BUILDFLAGS[@]}" $TESTFLAGS
+ test_env go test ${testcover[@]} -ldflags "$LDFLAGS" "${BUILDFLAGS[@]}" $TESTFLAGS
)
}
+test_env() {
+ # use "env -i" to tightly control the environment variables that bleed into the tests
+ env -i \
+ DEST="$DEST" \
+ DOCKER_EXECDRIVER="$DOCKER_EXECDRIVER" \
+ DOCKER_GRAPHDRIVER="$DOCKER_GRAPHDRIVER" \
+ DOCKER_HOST="$DOCKER_HOST" \
+ GOPATH="$GOPATH" \
+ HOME="$DEST/fake-HOME" \
+ PATH="$PATH" \
+ TEST_DOCKERINIT_PATH="$TEST_DOCKERINIT_PATH" \
+ "$@"
+}
# a helper to provide ".exe" when it's appropriate
binary_extension() {
diff --git a/project/make/.dockerinit b/hack/make/.dockerinit
index 73df8fce01..fceba7db92 100644
--- a/project/make/.dockerinit
+++ b/hack/make/.dockerinit
@@ -1,6 +1,9 @@
#!/bin/bash
set -e
+IAMSTATIC="true"
+source "$(dirname "$BASH_SOURCE")/.go-autogen"
+
# dockerinit still needs to be a static binary, even if docker is dynamic
go build \
-o "$DEST/dockerinit-$VERSION" \
@@ -11,6 +14,7 @@ go build \
-extldflags \"$EXTLDFLAGS_STATIC\"
" \
./dockerinit
+
echo "Created binary: $DEST/dockerinit-$VERSION"
ln -sf "dockerinit-$VERSION" "$DEST/dockerinit"
diff --git a/hack/make/.dockerinit-gccgo b/hack/make/.dockerinit-gccgo
new file mode 100644
index 0000000000..592a4152c8
--- /dev/null
+++ b/hack/make/.dockerinit-gccgo
@@ -0,0 +1,30 @@
+#!/bin/bash
+set -e
+
+IAMSTATIC="true"
+source "$(dirname "$BASH_SOURCE")/.go-autogen"
+
+# dockerinit still needs to be a static binary, even if docker is dynamic
+go build --compiler=gccgo \
+ -o "$DEST/dockerinit-$VERSION" \
+ "${BUILDFLAGS[@]}" \
+ --gccgoflags "
+ -g
+ -Wl,--no-export-dynamic
+ $EXTLDFLAGS_STATIC_DOCKER
+ " \
+ ./dockerinit
+
+echo "Created binary: $DEST/dockerinit-$VERSION"
+ln -sf "dockerinit-$VERSION" "$DEST/dockerinit"
+
+sha1sum=
+if command -v sha1sum &> /dev/null; then
+ sha1sum=sha1sum
+else
+ echo >&2 'error: cannot find sha1sum command or equivalent'
+ exit 1
+fi
+
+# sha1 our new dockerinit to ensure separate docker and dockerinit always run in a perfect pair compiled for one another
+export DOCKER_INITSHA1="$($sha1sum $DEST/dockerinit-$VERSION | cut -d' ' -f1)"
diff --git a/project/make/.ensure-scratch b/hack/make/.ensure-emptyfs
index 8c421ed29e..e71a30ae81 100644
--- a/project/make/.ensure-scratch
+++ b/hack/make/.ensure-emptyfs
@@ -1,12 +1,14 @@
#!/bin/bash
+set -e
-if ! docker inspect scratch &> /dev/null; then
+if ! docker inspect emptyfs &> /dev/null; then
# let's build a "docker save" tarball for "emptyfs"
# see https://github.com/docker/docker/pull/5262
# and also https://github.com/docker/docker/issues/4242
- mkdir -p /docker-scratch
+ dir="$DEST/emptyfs"
+ mkdir -p "$dir"
(
- cd /docker-scratch
+ cd "$dir"
echo '{"emptyfs":{"latest":"511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158"}}' > repositories
mkdir -p 511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158
(
@@ -16,6 +18,6 @@ if ! docker inspect scratch &> /dev/null; then
tar -cf layer.tar --files-from /dev/null
)
)
- ( set -x; tar -cf /docker-scratch.tar -C /docker-scratch . )
- ( set -x; docker load --input /docker-scratch.tar )
+ ( set -x; tar -cC "$dir" . | docker load )
+ rm -rf "$dir"
fi
diff --git a/hack/make/.ensure-frozen-images b/hack/make/.ensure-frozen-images
new file mode 100644
index 0000000000..379f738495
--- /dev/null
+++ b/hack/make/.ensure-frozen-images
@@ -0,0 +1,37 @@
+#!/bin/bash
+set -e
+
+# this list should match roughly what's in the Dockerfile (minus the explicit image IDs, of course)
+images=(
+ busybox:latest
+ hello-world:frozen
+)
+
+if ! docker inspect "${images[@]}" &> /dev/null; then
+ hardCodedDir='/docker-frozen-images'
+ if [ -d "$hardCodedDir" ]; then
+ ( set -x; tar -cC "$hardCodedDir" . | docker load )
+ else
+ dir="$DEST/frozen-images"
+ # extract the exact "RUN download-frozen-image.sh" line from the Dockerfile itself for consistency
+ # NOTE: this will fail if either "curl" is not installed or if the Dockerfile is not available/readable
+ awk '
+ $1 == "RUN" && $2 == "./contrib/download-frozen-image.sh" {
+ for (i = 2; i < NF; i++)
+ printf ( $i == "'"$hardCodedDir"'" ? "'"$dir"'" : $i ) " ";
+ print $NF;
+ if (/\\$/) {
+ inCont = 1;
+ next;
+ }
+ }
+ inCont {
+ print;
+ if (!/\\$/) {
+ inCont = 0;
+ }
+ }
+ ' Dockerfile | sh -x
+ ( set -x; tar -cC "$dir" . | docker load )
+ fi
+fi
diff --git a/hack/make/.ensure-httpserver b/hack/make/.ensure-httpserver
new file mode 100644
index 0000000000..38659edaba
--- /dev/null
+++ b/hack/make/.ensure-httpserver
@@ -0,0 +1,15 @@
+#!/bin/bash
+set -e
+
+# Build a Go static web server on top of busybox image
+# and compile it for target daemon
+
+dir="$DEST/httpserver"
+mkdir -p "$dir"
+(
+ cd "$dir"
+ GOOS=linux GOARCH=amd64 go build -o httpserver github.com/docker/docker/contrib/httpserver
+ cp ../../../../contrib/httpserver/Dockerfile .
+ docker build -qt httpserver . > /dev/null
+)
+rm -rf "$dir"
diff --git a/hack/make/.go-autogen b/hack/make/.go-autogen
new file mode 100644
index 0000000000..1b48f611ef
--- /dev/null
+++ b/hack/make/.go-autogen
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+rm -rf autogen
+
+mkdir -p autogen/dockerversion
+cat > autogen/dockerversion/dockerversion.go <<EOF
+// AUTOGENERATED FILE; see $BASH_SOURCE
+package dockerversion
+
+var (
+ GITCOMMIT string = "$GITCOMMIT"
+ VERSION string = "$VERSION"
+
+ IAMSTATIC string = "${IAMSTATIC:-true}"
+ INITSHA1 string = "$DOCKER_INITSHA1"
+ INITPATH string = "$DOCKER_INITPATH"
+)
+EOF
diff --git a/project/make/.go-compile-test-dir b/hack/make/.go-compile-test-dir
index 91c438b3c6..91c438b3c6 100755
--- a/project/make/.go-compile-test-dir
+++ b/hack/make/.go-compile-test-dir
diff --git a/hack/make/.integration-daemon-start b/hack/make/.integration-daemon-start
new file mode 100644
index 0000000000..570c6c7a9a
--- /dev/null
+++ b/hack/make/.integration-daemon-start
@@ -0,0 +1,47 @@
+#!/bin/bash
+
+# see test-integration-cli for example usage of this script
+
+export PATH="$DEST/../binary:$DEST/../dynbinary:$DEST/../gccgo:$DEST/../dyngccgo:$PATH"
+
+if ! command -v docker &> /dev/null; then
+ echo >&2 'error: binary or dynbinary must be run before .integration-daemon-start'
+ false
+fi
+
+# intentionally open a couple bogus file descriptors to help test that they get scrubbed in containers
+exec 41>&1 42>&2
+
+export DOCKER_GRAPHDRIVER=${DOCKER_GRAPHDRIVER:-vfs}
+export DOCKER_EXECDRIVER=${DOCKER_EXECDRIVER:-native}
+
+if [ -z "$DOCKER_TEST_HOST" ]; then
+ export DOCKER_HOST="unix://$(cd "$DEST" && pwd)/docker.sock" # "pwd" tricks to make sure $DEST is an absolute path, not a relative one
+ ( set -x; exec \
+ docker --daemon --debug \
+ --host "$DOCKER_HOST" \
+ --storage-driver "$DOCKER_GRAPHDRIVER" \
+ --exec-driver "$DOCKER_EXECDRIVER" \
+ --pidfile "$DEST/docker.pid" \
+ &> "$DEST/docker.log"
+ ) &
+else
+ export DOCKER_HOST="$DOCKER_TEST_HOST"
+fi
+
+# give it a second to come up so it's "ready"
+tries=10
+while ! docker version &> /dev/null; do
+ (( tries-- ))
+ if [ $tries -le 0 ]; then
+ if [ -z "$DOCKER_HOST" ]; then
+ echo >&2 "error: daemon failed to start"
+ echo >&2 " check $DEST/docker.log for details"
+ else
+ echo >&2 "error: daemon at $DOCKER_HOST fails to 'docker version':"
+ docker version >&2 || true
+ fi
+ false
+ fi
+ sleep 2
+done
diff --git a/project/make/.integration-daemon-stop b/hack/make/.integration-daemon-stop
index 319aaa4a1d..319aaa4a1d 100644
--- a/project/make/.integration-daemon-stop
+++ b/hack/make/.integration-daemon-stop
diff --git a/project/make/.validate b/hack/make/.validate
index 022809154e..022809154e 100644
--- a/project/make/.validate
+++ b/hack/make/.validate
diff --git a/project/make/README.md b/hack/make/README.md
index 6574b0efe6..6574b0efe6 100644
--- a/project/make/README.md
+++ b/hack/make/README.md
diff --git a/project/make/binary b/hack/make/binary
index c0cc3459e6..0f57ea0d69 100755..100644
--- a/project/make/binary
+++ b/hack/make/binary
@@ -11,6 +11,8 @@ if [[ "$(uname -s)" == CYGWIN* ]]; then
DEST=$(cygpath -mw $DEST)
fi
+source "$(dirname "$BASH_SOURCE")/.go-autogen"
+
go build \
-o "$DEST/$BINARY_FULLNAME" \
"${BUILDFLAGS[@]}" \
@@ -19,6 +21,7 @@ go build \
$LDFLAGS_STATIC_DOCKER
" \
./docker
+
echo "Created binary: $DEST/$BINARY_FULLNAME"
ln -sf "$BINARY_FULLNAME" "$DEST/docker$BINARY_EXTENSION"
diff --git a/project/make/cover b/hack/make/cover
index ca772d03bc..ca772d03bc 100644
--- a/project/make/cover
+++ b/hack/make/cover
diff --git a/project/make/cross b/hack/make/cross
index 3c5cb0401d..3c5cb0401d 100644
--- a/project/make/cross
+++ b/hack/make/cross
diff --git a/project/make/dynbinary b/hack/make/dynbinary
index 39fcd35767..861a192143 100644
--- a/project/make/dynbinary
+++ b/hack/make/dynbinary
@@ -14,7 +14,9 @@ fi
# DOCKER_INITSHA1 is exported so that other bundlescripts can easily access it later without recalculating it
(
- export LDFLAGS_STATIC_DOCKER="-X $DOCKER_PKG/dockerversion.INITSHA1 \"$DOCKER_INITSHA1\" -X $DOCKER_PKG/dockerversion.INITPATH \"$DOCKER_INITPATH\""
+ export IAMSTATIC="false"
+ export LDFLAGS_STATIC_DOCKER=''
export BUILDFLAGS=( "${BUILDFLAGS[@]/netgo /}" ) # disable netgo, since we don't need it for a dynamic binary
+ export BUILDFLAGS=( "${BUILDFLAGS[@]/static_build /}" ) # we're not building a "static" binary here
source "$(dirname "$BASH_SOURCE")/binary"
)
diff --git a/hack/make/dyngccgo b/hack/make/dyngccgo
new file mode 100644
index 0000000000..a76e9c5b56
--- /dev/null
+++ b/hack/make/dyngccgo
@@ -0,0 +1,23 @@
+#!/bin/bash
+set -e
+
+DEST=$1
+
+if [ -z "$DOCKER_CLIENTONLY" ]; then
+ source "$(dirname "$BASH_SOURCE")/.dockerinit-gccgo"
+
+ hash_files "$DEST/dockerinit-$VERSION"
+else
+ # DOCKER_CLIENTONLY must be truthy, so we don't need to bother with dockerinit :)
+ export DOCKER_INITSHA1=""
+fi
+# DOCKER_INITSHA1 is exported so that other bundlescripts can easily access it later without recalculating it
+
+(
+ export IAMSTATIC="false"
+ export EXTLDFLAGS_STATIC_DOCKER=''
+ export LDFLAGS_STATIC_DOCKER=''
+ export BUILDFLAGS=( "${BUILDFLAGS[@]/netgo /}" ) # disable netgo, since we don't need it for a dynamic binary
+ export BUILDFLAGS=( "${BUILDFLAGS[@]/static_build /}" ) # we're not building a "static" binary here
+ source "$(dirname "$BASH_SOURCE")/gccgo"
+)
diff --git a/hack/make/gccgo b/hack/make/gccgo
new file mode 100644
index 0000000000..c85d2fbda5
--- /dev/null
+++ b/hack/make/gccgo
@@ -0,0 +1,25 @@
+#!/bin/bash
+set -e
+
+DEST=$1
+BINARY_NAME="docker-$VERSION"
+BINARY_EXTENSION="$(binary_extension)"
+BINARY_FULLNAME="$BINARY_NAME$BINARY_EXTENSION"
+
+source "$(dirname "$BASH_SOURCE")/.go-autogen"
+
+go build -compiler=gccgo \
+ -o "$DEST/$BINARY_FULLNAME" \
+ "${BUILDFLAGS[@]}" \
+ -gccgoflags "
+ -g
+ $EXTLDFLAGS_STATIC_DOCKER
+ -Wl,--no-export-dynamic
+ -ldl
+ " \
+ ./docker
+
+echo "Created binary: $DEST/$BINARY_FULLNAME"
+ln -sf "$BINARY_FULLNAME" "$DEST/docker$BINARY_EXTENSION"
+
+hash_files "$DEST/$BINARY_FULLNAME"
diff --git a/project/make/test-docker-py b/hack/make/test-docker-py
index 104842a423..b95cf40af5 100644
--- a/project/make/test-docker-py
+++ b/hack/make/test-docker-py
@@ -18,8 +18,8 @@ DEST=$1
git clone https://github.com/docker/docker-py.git "$dockerPy"
}
- export PYTHONPATH="$dockerPy" # import "docker" from our local docker-py
- python "$dockerPy/tests/integration_test.py"
+ # exporting PYTHONPATH to import "docker" from our local docker-py
+ test_env PYTHONPATH="$dockerPy" python "$dockerPy/tests/integration_test.py"
}; then
didFail=1
fi
diff --git a/project/make/test-integration b/hack/make/test-integration
index 5cb7102bc8..5cb7102bc8 100644
--- a/project/make/test-integration
+++ b/hack/make/test-integration
diff --git a/project/make/test-integration-cli b/hack/make/test-integration-cli
index 5dc7c42976..3ef41d919e 100644
--- a/project/make/test-integration-cli
+++ b/hack/make/test-integration-cli
@@ -16,10 +16,9 @@ bundle_test_integration_cli() {
# even and especially on test failures
didFail=
if ! {
- # pull the busybox image before running the tests
- sleep 2
-
- source "$(dirname "$BASH_SOURCE")/.ensure-busybox"
+ source "$(dirname "$BASH_SOURCE")/.ensure-frozen-images"
+ source "$(dirname "$BASH_SOURCE")/.ensure-httpserver"
+ source "$(dirname "$BASH_SOURCE")/.ensure-emptyfs"
bundle_test_integration_cli
}; then
diff --git a/project/make/test-unit b/hack/make/test-unit
index 9225b33a06..540ba41f3e 100644
--- a/project/make/test-unit
+++ b/hack/make/test-unit
@@ -27,6 +27,11 @@ bundle_test_unit() {
export TESTFLAGS
export HAVE_GO_TEST_COVER
export DEST
+
+ # some hack to export array variables
+ export BUILDFLAGS_FILE="buildflags_file"
+ ( IFS=$'\n'; echo "${BUILDFLAGS[*]}" ) > "$BUILDFLAGS_FILE"
+
if command -v parallel &> /dev/null; then
# accomodate parallel to be able to access variables
export SHELL="$BASH"
@@ -34,10 +39,6 @@ bundle_test_unit() {
mkdir -p "$HOME/.parallel"
touch "$HOME/.parallel/ignored_vars"
- # some hack to export array variables
- export BUILDFLAGS_FILE="$HOME/buildflags_file"
- ( IFS=$'\n'; echo "${BUILDFLAGS[*]}" ) > "$BUILDFLAGS_FILE"
-
echo "$TESTDIRS" | parallel --jobs "$PARALLEL_JOBS" --env _ "$(dirname "$BASH_SOURCE")/.go-compile-test-dir"
rm -rf "$HOME"
else
@@ -47,6 +48,7 @@ bundle_test_unit() {
# don't let one directory that fails to build tank _all_ our tests!
done
fi
+ rm -f "$BUILDFLAGS_FILE"
)
echo "$TESTDIRS" | go_run_test_dir
}
@@ -58,7 +60,7 @@ go_run_test_dir() {
echo
echo '+ go test' $TESTFLAGS "${DOCKER_PKG}${dir#.}"
precompiled="$DEST/precompiled/$dir.test$(binary_extension)"
- if ! ( cd "$dir" && "$precompiled" $TESTFLAGS ); then
+ if ! ( cd "$dir" && test_env "$precompiled" $TESTFLAGS ); then
TESTS_FAILED+=("$dir")
echo
echo "${RED}Tests failed: $dir${TEXTRESET}"
diff --git a/project/make/tgz b/hack/make/tgz
index 7234218da9..7234218da9 100644
--- a/project/make/tgz
+++ b/hack/make/tgz
diff --git a/project/make/ubuntu b/hack/make/ubuntu
index e34369eb16..e34369eb16 100644
--- a/project/make/ubuntu
+++ b/hack/make/ubuntu
diff --git a/project/make/validate-dco b/hack/make/validate-dco
index 84c47f526d..84c47f526d 100644
--- a/project/make/validate-dco
+++ b/hack/make/validate-dco
diff --git a/project/make/validate-gofmt b/hack/make/validate-gofmt
index 8fc88cc559..8fc88cc559 100644
--- a/project/make/validate-gofmt
+++ b/hack/make/validate-gofmt
diff --git a/hack/make/validate-toml b/hack/make/validate-toml
new file mode 100644
index 0000000000..16c228d14e
--- /dev/null
+++ b/hack/make/validate-toml
@@ -0,0 +1,30 @@
+#!/bin/bash
+
+source "$(dirname "$BASH_SOURCE")/.validate"
+
+IFS=$'\n'
+files=( $(validate_diff --diff-filter=ACMR --name-only -- 'MAINTAINERS' || true) )
+unset IFS
+
+badFiles=()
+for f in "${files[@]}"; do
+ # we use "git show" here to validate that what's committed is formatted
+ if ! git show "$VALIDATE_HEAD:$f" | tomlv /proc/self/fd/0 ; then
+ badFiles+=( "$f" )
+ fi
+done
+
+if [ ${#badFiles[@]} -eq 0 ]; then
+ echo 'Congratulations! All toml source files changed here have valid syntax.'
+else
+ {
+ echo "These files are not valid toml:"
+ for f in "${badFiles[@]}"; do
+ echo " - $f"
+ done
+ echo
+ echo 'Please reformat the above files as valid toml'
+ echo
+ } >&2
+ false
+fi
diff --git a/project/release.sh b/hack/release.sh
index 1174e0cc4c..da95808c5a 100755
--- a/project/release.sh
+++ b/hack/release.sh
@@ -190,6 +190,13 @@ release_build() {
linux)
s3Os=Linux
;;
+ windows)
+ s3Os=Windows
+ binary+='.exe'
+ if [ "$latestBase" ]; then
+ latestBase+='.exe'
+ fi
+ ;;
*)
echo >&2 "error: can't convert $s3Os to an appropriate value for 'uname -s'"
exit 1
@@ -292,7 +299,7 @@ fi
echo deb $(s3_url)/ubuntu docker main > /etc/apt/sources.list.d/docker.list
# Then import the repository key
-apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys $gpgFingerprint
+apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys $gpgFingerprint
# Install docker
apt-get update
diff --git a/project/vendor.sh b/hack/vendor.sh
index b60e42f5c4..bb43771c1d 100755
--- a/project/vendor.sh
+++ b/hack/vendor.sh
@@ -53,7 +53,7 @@ clone hg code.google.com/p/gosqlite 74691fb6f837
clone git github.com/docker/libtrust 230dfd18c232
-clone git github.com/Sirupsen/logrus v0.6.0
+clone git github.com/Sirupsen/logrus v0.7.1
clone git github.com/go-fsnotify/fsnotify v1.0.4
@@ -68,8 +68,15 @@ if [ "$1" = '--go' ]; then
mv tmp-tar src/code.google.com/p/go/src/pkg/archive/tar
fi
-clone git github.com/docker/libcontainer eb74393a3d2daeafbef4f5f27c0821cbdd67559c
+# get digest package from distribution
+clone git github.com/docker/distribution d957768537c5af40e4f4cd96871f7b2bde9e2923
+mv src/github.com/docker/distribution/digest tmp-digest
+rm -rf src/github.com/docker/distribution
+mkdir -p src/github.com/docker/distribution
+mv tmp-digest src/github.com/docker/distribution/digest
+
+clone git github.com/docker/libcontainer bd8ec36106086f72b66e1be85a81202b93503e44
# see src/github.com/docker/libcontainer/update-vendor.sh which is the "source of truth" for libcontainer deps (just like this file)
rm -rf src/github.com/docker/libcontainer/vendor
-eval "$(grep '^clone ' src/github.com/docker/libcontainer/update-vendor.sh | grep -v 'github.com/codegangsta/cli')"
+eval "$(grep '^clone ' src/github.com/docker/libcontainer/update-vendor.sh | grep -v 'github.com/codegangsta/cli' | grep -v 'github.com/Sirupsen/logrus')"
# we exclude "github.com/codegangsta/cli" here because it's only needed for "nsinit", which Docker doesn't include
diff --git a/image/image.go b/image/image.go
index 27554d972a..a661e3ce70 100644
--- a/image/image.go
+++ b/image/image.go
@@ -140,14 +140,12 @@ func (img *Image) RawJson() ([]byte, error) {
if err != nil {
return nil, fmt.Errorf("Failed to get root for image %s: %s", img.ID, err)
}
- fh, err := os.Open(jsonPath(root))
- if err != nil {
- return nil, fmt.Errorf("Failed to open json for image %s: %s", img.ID, err)
- }
- buf, err := ioutil.ReadAll(fh)
+
+ buf, err := ioutil.ReadFile(jsonPath(root))
if err != nil {
return nil, fmt.Errorf("Failed to read json for image %s: %s", img.ID, err)
}
+
return buf, nil
}
diff --git a/integration-cli/MAINTAINERS b/integration-cli/MAINTAINERS
deleted file mode 100644
index 6dde4769d7..0000000000
--- a/integration-cli/MAINTAINERS
+++ /dev/null
@@ -1 +0,0 @@
-Cristian Staretu <cristian.staretu@gmail.com> (@unclejack)
diff --git a/integration-cli/docker_api_attach_test.go b/integration-cli/docker_api_attach_test.go
new file mode 100644
index 0000000000..b16a7bb2f0
--- /dev/null
+++ b/integration-cli/docker_api_attach_test.go
@@ -0,0 +1,66 @@
+package main
+
+import (
+ "bytes"
+ "os/exec"
+ "testing"
+ "time"
+
+ "code.google.com/p/go.net/websocket"
+)
+
+func TestGetContainersAttachWebsocket(t *testing.T) {
+ runCmd := exec.Command(dockerBinary, "run", "-dit", "busybox", "cat")
+ out, _, err := runCommandWithOutput(runCmd)
+ if err != nil {
+ t.Fatalf(out, err)
+ }
+ defer deleteAllContainers()
+
+ rwc, err := sockConn(time.Duration(10 * time.Second))
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ cleanedContainerID := stripTrailingCharacters(out)
+ config, err := websocket.NewConfig(
+ "/containers/"+cleanedContainerID+"/attach/ws?stream=1&stdin=1&stdout=1&stderr=1",
+ "http://localhost",
+ )
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ ws, err := websocket.NewClient(config, rwc)
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer ws.Close()
+
+ expected := []byte("hello")
+ actual := make([]byte, len(expected))
+ outChan := make(chan string)
+ go func() {
+ if _, err := ws.Read(actual); err != nil {
+ t.Fatal(err)
+ }
+ outChan <- "done"
+ }()
+
+ inChan := make(chan string)
+ go func() {
+ if _, err := ws.Write(expected); err != nil {
+ t.Fatal(err)
+ }
+ inChan <- "done"
+ }()
+
+ <-inChan
+ <-outChan
+
+ if !bytes.Equal(expected, actual) {
+ t.Fatal("Expected output on websocket to match input")
+ }
+
+ logDone("container attach websocket - can echo input via cat")
+}
diff --git a/integration-cli/docker_api_containers_test.go b/integration-cli/docker_api_containers_test.go
index 5dce388381..ea2f2450a9 100644
--- a/integration-cli/docker_api_containers_test.go
+++ b/integration-cli/docker_api_containers_test.go
@@ -4,18 +4,18 @@ import (
"bytes"
"encoding/json"
"io"
- "io/ioutil"
- "os"
"os/exec"
"strings"
"testing"
"time"
- "github.com/docker/docker/api/stats"
+ "github.com/docker/docker/api/types"
"github.com/docker/docker/vendor/src/code.google.com/p/go/src/pkg/archive/tar"
)
func TestContainerApiGetAll(t *testing.T) {
+ defer deleteAllContainers()
+
startCount, err := getContainerCount()
if err != nil {
t.Fatalf("Cannot query container count: %v", err)
@@ -48,12 +48,12 @@ func TestContainerApiGetAll(t *testing.T) {
t.Fatalf("Container Name mismatch. Expected: %q, received: %q\n", "/"+name, actual)
}
- deleteAllContainers()
-
logDone("container REST API - check GET json/all=1")
}
func TestContainerApiGetExport(t *testing.T) {
+ defer deleteAllContainers()
+
name := "exportcontainer"
runCmd := exec.Command(dockerBinary, "run", "--name", name, "busybox", "touch", "/test")
out, _, err := runCommandWithOutput(runCmd)
@@ -84,12 +84,13 @@ func TestContainerApiGetExport(t *testing.T) {
if !found {
t.Fatalf("The created test file has not been found in the exported image")
}
- deleteAllContainers()
logDone("container REST API - check GET containers/export")
}
func TestContainerApiGetChanges(t *testing.T) {
+ defer deleteAllContainers()
+
name := "changescontainer"
runCmd := exec.Command(dockerBinary, "run", "--name", name, "busybox", "rm", "/etc/passwd")
out, _, err := runCommandWithOutput(runCmd)
@@ -121,8 +122,6 @@ func TestContainerApiGetChanges(t *testing.T) {
t.Fatalf("/etc/passwd has been removed but is not present in the diff")
}
- deleteAllContainers()
-
logDone("container REST API - check GET containers/changes")
}
@@ -138,11 +137,7 @@ func TestContainerApiStartVolumeBinds(t *testing.T) {
t.Fatal(err)
}
- bindPath, err := ioutil.TempDir(os.TempDir(), "test")
- if err != nil {
- t.Fatal(err)
- }
-
+ bindPath := randomUnixTmpDirPath("test")
config = map[string]interface{}{
"Binds": []string{bindPath + ":/tmp"},
}
@@ -162,6 +157,35 @@ func TestContainerApiStartVolumeBinds(t *testing.T) {
logDone("container REST API - check volume binds on start")
}
+// Test for GH#10618
+func TestContainerApiStartDupVolumeBinds(t *testing.T) {
+ defer deleteAllContainers()
+ name := "testdups"
+ config := map[string]interface{}{
+ "Image": "busybox",
+ "Volumes": map[string]struct{}{"/tmp": {}},
+ }
+
+ if _, err := sockRequest("POST", "/containers/create?name="+name, config); err != nil && !strings.Contains(err.Error(), "201 Created") {
+ t.Fatal(err)
+ }
+
+ bindPath1 := randomUnixTmpDirPath("test1")
+ bindPath2 := randomUnixTmpDirPath("test2")
+
+ config = map[string]interface{}{
+ "Binds": []string{bindPath1 + ":/tmp", bindPath2 + ":/tmp"},
+ }
+ if body, err := sockRequest("POST", "/containers/"+name+"/start", config); err == nil {
+ t.Fatal("expected container start to fail when duplicate volume binds to same container path")
+ } else {
+ if !strings.Contains(string(body), "Duplicate volume") {
+ t.Fatalf("Expected failure due to duplicate bind mounts to same path, instead got: %q with error: %v", string(body), err)
+ }
+ }
+
+ logDone("container REST API - check for duplicate volume binds error on start")
+}
func TestContainerApiStartVolumesFrom(t *testing.T) {
defer deleteAllContainers()
volName := "voltst"
@@ -225,11 +249,7 @@ func TestVolumesFromHasPriority(t *testing.T) {
t.Fatal(err)
}
- bindPath, err := ioutil.TempDir(os.TempDir(), "test")
- if err != nil {
- t.Fatal(err)
- }
-
+ bindPath := randomUnixTmpDirPath("test")
config = map[string]interface{}{
"VolumesFrom": []string{volName},
"Binds": []string{bindPath + ":/tmp"},
@@ -287,11 +307,11 @@ func TestGetContainerStats(t *testing.T) {
t.Fatal("stream was not closed after container was removed")
case sr := <-bc:
if sr.err != nil {
- t.Fatal(err)
+ t.Fatal(sr.err)
}
dec := json.NewDecoder(bytes.NewBuffer(sr.body))
- var s *stats.Stats
+ var s *types.Stats
// decode only one object from the stream
if err := dec.Decode(&s); err != nil {
t.Fatal(err)
@@ -300,6 +320,32 @@ func TestGetContainerStats(t *testing.T) {
logDone("container REST API - check GET containers/stats")
}
+func TestGetStoppedContainerStats(t *testing.T) {
+ defer deleteAllContainers()
+ var (
+ name = "statscontainer"
+ runCmd = exec.Command(dockerBinary, "create", "--name", name, "busybox", "top")
+ )
+ out, _, err := runCommandWithOutput(runCmd)
+ if err != nil {
+ t.Fatalf("Error on container creation: %v, output: %q", err, out)
+ }
+
+ go func() {
+ // We'll never get return for GET stats from sockRequest as of now,
+ // just send request and see if panic or error would happen on daemon side.
+ _, err := sockRequest("GET", "/containers/"+name+"/stats", nil)
+ if err != nil {
+ t.Fatal(err)
+ }
+ }()
+
+ // allow some time to send request and let daemon deal with it
+ time.Sleep(1 * time.Second)
+
+ logDone("container REST API - check GET stopped containers/stats")
+}
+
func TestBuildApiDockerfilePath(t *testing.T) {
// Test to make sure we stop people from trying to leave the
// build context when specifying the path to the dockerfile
@@ -333,6 +379,110 @@ func TestBuildApiDockerfilePath(t *testing.T) {
logDone("container REST API - check build w/bad Dockerfile path")
}
+func TestBuildApiDockerFileRemote(t *testing.T) {
+ server, err := fakeStorage(map[string]string{
+ "testD": `FROM busybox
+COPY * /tmp/
+RUN find / -name ba*
+RUN find /tmp/`,
+ })
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer server.Close()
+
+ buf, err := sockRequestRaw("POST", "/build?dockerfile=baz&remote="+server.URL()+"/testD", nil, "application/json")
+ if err != nil {
+ t.Fatalf("Build failed: %s", err)
+ }
+
+ // Make sure Dockerfile exists.
+ // Make sure 'baz' doesn't exist ANYWHERE despite being mentioned in the URL
+ out := string(buf)
+ if !strings.Contains(out, "/tmp/Dockerfile") ||
+ strings.Contains(out, "baz") {
+ t.Fatalf("Incorrect output: %s", out)
+ }
+
+ logDone("container REST API - check build with -f from remote")
+}
+
+func TestBuildApiLowerDockerfile(t *testing.T) {
+ git, err := fakeGIT("repo", map[string]string{
+ "dockerfile": `FROM busybox
+RUN echo from dockerfile`,
+ }, false)
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer git.Close()
+
+ buf, err := sockRequestRaw("POST", "/build?remote="+git.RepoURL, nil, "application/json")
+ if err != nil {
+ t.Fatalf("Build failed: %s\n%q", err, buf)
+ }
+
+ out := string(buf)
+ if !strings.Contains(out, "from dockerfile") {
+ t.Fatalf("Incorrect output: %s", out)
+ }
+
+ logDone("container REST API - check build with lower dockerfile")
+}
+
+func TestBuildApiBuildGitWithF(t *testing.T) {
+ git, err := fakeGIT("repo", map[string]string{
+ "baz": `FROM busybox
+RUN echo from baz`,
+ "Dockerfile": `FROM busybox
+RUN echo from Dockerfile`,
+ }, false)
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer git.Close()
+
+ // Make sure it tries to 'dockerfile' query param value
+ buf, err := sockRequestRaw("POST", "/build?dockerfile=baz&remote="+git.RepoURL, nil, "application/json")
+ if err != nil {
+ t.Fatalf("Build failed: %s\n%q", err, buf)
+ }
+
+ out := string(buf)
+ if !strings.Contains(out, "from baz") {
+ t.Fatalf("Incorrect output: %s", out)
+ }
+
+ logDone("container REST API - check build from git w/F")
+}
+
+func TestBuildApiDoubleDockerfile(t *testing.T) {
+ testRequires(t, UnixCli) // dockerfile overwrites Dockerfile on Windows
+ git, err := fakeGIT("repo", map[string]string{
+ "Dockerfile": `FROM busybox
+RUN echo from Dockerfile`,
+ "dockerfile": `FROM busybox
+RUN echo from dockerfile`,
+ }, false)
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer git.Close()
+
+ // Make sure it tries to 'dockerfile' query param value
+ buf, err := sockRequestRaw("POST", "/build?remote="+git.RepoURL, nil, "application/json")
+ if err != nil {
+ t.Fatalf("Build failed: %s", err)
+ }
+
+ out := string(buf)
+ if !strings.Contains(out, "from Dockerfile") {
+ t.Fatalf("Incorrect output: %s", out)
+ }
+
+ logDone("container REST API - check build with two dockerfiles")
+}
+
func TestBuildApiDockerfileSymlink(t *testing.T) {
// Test to make sure we stop people from trying to leave the
// build context when specifying a symlink as the path to the dockerfile
@@ -366,3 +516,40 @@ func TestBuildApiDockerfileSymlink(t *testing.T) {
logDone("container REST API - check build w/bad Dockerfile symlink path")
}
+
+// #9981 - Allow a docker created volume (ie, one in /var/lib/docker/volumes) to be used to overwrite (via passing in Binds on api start) an existing volume
+func TestPostContainerBindNormalVolume(t *testing.T) {
+ defer deleteAllContainers()
+
+ out, _, err := runCommandWithOutput(exec.Command(dockerBinary, "create", "-v", "/foo", "--name=one", "busybox"))
+ if err != nil {
+ t.Fatal(err, out)
+ }
+
+ fooDir, err := inspectFieldMap("one", "Volumes", "/foo")
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ out, _, err = runCommandWithOutput(exec.Command(dockerBinary, "create", "-v", "/foo", "--name=two", "busybox"))
+ if err != nil {
+ t.Fatal(err, out)
+ }
+
+ bindSpec := map[string][]string{"Binds": {fooDir + ":/foo"}}
+ _, err = sockRequest("POST", "/containers/two/start", bindSpec)
+ if err != nil && !strings.Contains(err.Error(), "204 No Content") {
+ t.Fatal(err)
+ }
+
+ fooDir2, err := inspectFieldMap("two", "Volumes", "/foo")
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ if fooDir2 != fooDir {
+ t.Fatal("expected volume path to be %s, got: %s", fooDir, fooDir2)
+ }
+
+ logDone("container REST API - can use path from normal volume as bind-mount to overwrite another volume")
+}
diff --git a/integration-cli/docker_api_exec_test.go b/integration-cli/docker_api_exec_test.go
index df7122dd75..1ed99a2561 100644
--- a/integration-cli/docker_api_exec_test.go
+++ b/integration-cli/docker_api_exec_test.go
@@ -1,3 +1,5 @@
+// +build !test_no_exec
+
package main
import (
diff --git a/integration-cli/docker_api_inspect_test.go b/integration-cli/docker_api_inspect_test.go
index 1ff0312581..ed6f596b2f 100644
--- a/integration-cli/docker_api_inspect_test.go
+++ b/integration-cli/docker_api_inspect_test.go
@@ -7,6 +7,8 @@ import (
)
func TestInspectApiContainerResponse(t *testing.T) {
+ defer deleteAllContainers()
+
runCmd := exec.Command(dockerBinary, "run", "-d", "busybox", "true")
out, _, err := runCommandWithOutput(runCmd)
if err != nil {
@@ -34,7 +36,7 @@ func TestInspectApiContainerResponse(t *testing.T) {
t.Fatalf("unable to unmarshal body for %s version: %v", testVersion, err)
}
- keys := []string{"State", "Created", "Path", "Args", "Config", "Image", "NetworkSettings", "ResolvConfPath", "HostnamePath", "HostsPath", "Name", "Driver", "ExecDriver", "MountLabel", "ProcessLabel", "Volumes", "VolumesRW"}
+ keys := []string{"State", "Created", "Path", "Args", "Config", "Image", "NetworkSettings", "ResolvConfPath", "HostnamePath", "HostsPath", "LogPath", "Name", "Driver", "ExecDriver", "MountLabel", "ProcessLabel", "Volumes", "VolumesRW"}
if testVersion == "v1.11" {
keys = append(keys, "ID")
@@ -53,7 +55,5 @@ func TestInspectApiContainerResponse(t *testing.T) {
}
}
- deleteAllContainers()
-
logDone("container json - check keys in container json response")
}
diff --git a/integration-cli/docker_cli_build_test.go b/integration-cli/docker_cli_build_test.go
index b784a27523..6c96e2aa9f 100644
--- a/integration-cli/docker_cli_build_test.go
+++ b/integration-cli/docker_cli_build_test.go
@@ -2,23 +2,25 @@ package main
import (
"archive/tar"
+ "bufio"
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"os"
"os/exec"
- "path"
"path/filepath"
"reflect"
"regexp"
+ "runtime"
"strconv"
"strings"
- "syscall"
+ "sync"
"testing"
"text/template"
"time"
+ "github.com/docker/docker/builder/command"
"github.com/docker/docker/pkg/archive"
)
@@ -49,14 +51,14 @@ func TestBuildEmptyWhitespace(t *testing.T) {
name,
`
FROM busybox
- RUN
+ COPY
quux \
bar
`,
true)
if err == nil {
- t.Fatal("no error when dealing with a RUN statement with no content on the same line")
+ t.Fatal("no error when dealing with a COPY statement with no content on the same line")
}
logDone("build - statements with whitespace and no content should generate a parse error")
@@ -239,9 +241,18 @@ func TestBuildEnvironmentReplacementEnv(t *testing.T) {
_, err := buildImage(name,
`
- FROM scratch
- ENV foo foo
+ FROM busybox
+ ENV foo zzz
ENV bar ${foo}
+ ENV abc1='$foo'
+ ENV env1=$foo env2=${foo} env3="$foo" env4="${foo}"
+ RUN [ "$abc1" = '$foo' ] && (echo "$abc1" | grep -q foo)
+ ENV abc2="\$foo"
+ RUN [ "$abc2" = '$foo' ] && (echo "$abc2" | grep -q foo)
+ ENV abc3 '$foo'
+ RUN [ "$abc3" = '$foo' ] && (echo "$abc3" | grep -q foo)
+ ENV abc4 "\$foo"
+ RUN [ "$abc4" = '$foo' ] && (echo "$abc4" | grep -q foo)
`, true)
if err != nil {
@@ -260,13 +271,19 @@ func TestBuildEnvironmentReplacementEnv(t *testing.T) {
}
found := false
+ envCount := 0
for _, env := range envResult {
parts := strings.SplitN(env, "=", 2)
if parts[0] == "bar" {
found = true
- if parts[1] != "foo" {
- t.Fatalf("Could not find replaced var for env `bar`: got %q instead of `foo`", parts[1])
+ if parts[1] != "zzz" {
+ t.Fatalf("Could not find replaced var for env `bar`: got %q instead of `zzz`", parts[1])
+ }
+ } else if strings.HasPrefix(parts[0], "env") {
+ envCount++
+ if parts[1] != "zzz" {
+ t.Fatalf("%s should be 'foo' but instead its %q", parts[0], parts[1])
}
}
}
@@ -275,6 +292,10 @@ func TestBuildEnvironmentReplacementEnv(t *testing.T) {
t.Fatal("Never found the `bar` env variable")
}
+ if envCount != 4 {
+ t.Fatalf("Didn't find all env vars - only saw %d\n%s", envCount, envResult)
+ }
+
logDone("build - env environment replacement")
}
@@ -361,8 +382,8 @@ func TestBuildHandleEscapes(t *testing.T) {
t.Fatal(err)
}
- if _, ok := result[`\\\\\\${FOO}`]; !ok {
- t.Fatal(`Could not find volume \\\\\\${FOO} set from env foo in volumes table`)
+ if _, ok := result[`\\\${FOO}`]; !ok {
+ t.Fatal(`Could not find volume \\\${FOO} set from env foo in volumes table`, result)
}
logDone("build - handle escapes")
@@ -643,9 +664,10 @@ func TestBuildCacheADD(t *testing.T) {
t.Fatal(err)
}
defer server.Close()
+
if _, err := buildImage(name,
fmt.Sprintf(`FROM scratch
- ADD %s/robots.txt /`, server.URL),
+ ADD %s/robots.txt /`, server.URL()),
true); err != nil {
t.Fatal(err)
}
@@ -655,7 +677,7 @@ func TestBuildCacheADD(t *testing.T) {
deleteImages(name)
_, out, err := buildImageWithOut(name,
fmt.Sprintf(`FROM scratch
- ADD %s/index.html /`, server.URL),
+ ADD %s/index.html /`, server.URL()),
true)
if err != nil {
t.Fatal(err)
@@ -667,6 +689,73 @@ func TestBuildCacheADD(t *testing.T) {
logDone("build - build two images with remote ADD")
}
+func TestBuildLastModified(t *testing.T) {
+ name := "testbuildlastmodified"
+ defer deleteImages(name)
+
+ server, err := fakeStorage(map[string]string{
+ "file": "hello",
+ })
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer server.Close()
+
+ var out, out2 string
+
+ dFmt := `FROM busybox
+ADD %s/file /
+RUN ls -le /file`
+
+ dockerfile := fmt.Sprintf(dFmt, server.URL())
+
+ if _, out, err = buildImageWithOut(name, dockerfile, false); err != nil {
+ t.Fatal(err)
+ }
+
+ originMTime := regexp.MustCompile(`root.*/file.*\n`).FindString(out)
+ // Make sure our regexp is correct
+ if strings.Index(originMTime, "/file") < 0 {
+ t.Fatalf("Missing ls info on 'file':\n%s", out)
+ }
+
+ // Build it again and make sure the mtime of the file didn't change.
+ // Wait a few seconds to make sure the time changed enough to notice
+ time.Sleep(2 * time.Second)
+
+ if _, out2, err = buildImageWithOut(name, dockerfile, false); err != nil {
+ t.Fatal(err)
+ }
+
+ newMTime := regexp.MustCompile(`root.*/file.*\n`).FindString(out2)
+ if newMTime != originMTime {
+ t.Fatalf("MTime changed:\nOrigin:%s\nNew:%s", originMTime, newMTime)
+ }
+
+ // Now 'touch' the file and make sure the timestamp DID change this time
+ // Create a new fakeStorage instead of just using Add() to help windows
+ server, err = fakeStorage(map[string]string{
+ "file": "hello",
+ })
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer server.Close()
+
+ dockerfile = fmt.Sprintf(dFmt, server.URL())
+
+ if _, out2, err = buildImageWithOut(name, dockerfile, false); err != nil {
+ t.Fatal(err)
+ }
+
+ newMTime = regexp.MustCompile(`root.*/file.*\n`).FindString(out2)
+ if newMTime == originMTime {
+ t.Fatalf("MTime didn't change:\nOrigin:%s\nNew:%s", originMTime, newMTime)
+ }
+
+ logDone("build - use Last-Modified header")
+}
+
func TestBuildSixtySteps(t *testing.T) {
name := "foobuildsixtysteps"
defer deleteImages(name)
@@ -688,15 +777,15 @@ func TestBuildSixtySteps(t *testing.T) {
func TestBuildAddSingleFileToRoot(t *testing.T) {
name := "testaddimg"
defer deleteImages(name)
- ctx, err := fakeContext(`FROM busybox
+ ctx, err := fakeContext(fmt.Sprintf(`FROM busybox
RUN echo 'dockerio:x:1001:1001::/bin:/bin/false' >> /etc/passwd
RUN echo 'dockerio:x:1001:' >> /etc/group
RUN touch /exists
RUN chown dockerio.dockerio /exists
ADD test_file /
RUN [ $(ls -l /test_file | awk '{print $3":"$4}') = 'root:root' ]
-RUN [ $(ls -l /test_file | awk '{print $1}') = '-rw-r--r--' ]
-RUN [ $(ls -l /exists | awk '{print $3":"$4}') = 'dockerio:dockerio' ]`,
+RUN [ $(ls -l /test_file | awk '{print $1}') = '%s' ]
+RUN [ $(ls -l /exists | awk '{print $3":"$4}') = 'dockerio:dockerio' ]`, expectedFileChmod),
map[string]string{
"test_file": "test1",
})
@@ -768,16 +857,24 @@ RUN [ $(ls -l /exists/exists_file | awk '{print $3":"$4}') = 'dockerio:dockerio'
}
func TestBuildCopyAddMultipleFiles(t *testing.T) {
+ server, err := fakeStorage(map[string]string{
+ "robots.txt": "hello",
+ })
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer server.Close()
+
name := "testcopymultiplefilestofile"
defer deleteImages(name)
- ctx, err := fakeContext(`FROM busybox
+ ctx, err := fakeContext(fmt.Sprintf(`FROM busybox
RUN echo 'dockerio:x:1001:1001::/bin:/bin/false' >> /etc/passwd
RUN echo 'dockerio:x:1001:' >> /etc/group
RUN mkdir /exists
RUN touch /exists/exists_file
RUN chown -R dockerio.dockerio /exists
COPY test_file1 test_file2 /exists/
-ADD test_file3 test_file4 https://dockerproject.com/robots.txt /exists/
+ADD test_file3 test_file4 %s/robots.txt /exists/
RUN [ $(ls -l / | grep exists | awk '{print $3":"$4}') = 'dockerio:dockerio' ]
RUN [ $(ls -l /exists/test_file1 | awk '{print $3":"$4}') = 'root:root' ]
RUN [ $(ls -l /exists/test_file2 | awk '{print $3":"$4}') = 'root:root' ]
@@ -787,7 +884,7 @@ RUN [ $(ls -l /exists/test_file4 | awk '{print $3":"$4}') = 'root:root' ]
RUN [ $(ls -l /exists/robots.txt | awk '{print $3":"$4}') = 'root:root' ]
RUN [ $(ls -l /exists/exists_file | awk '{print $3":"$4}') = 'dockerio:dockerio' ]
-`,
+`, server.URL()),
map[string]string{
"test_file1": "test1",
"test_file2": "test2",
@@ -1074,6 +1171,7 @@ func TestBuildCopyWildcard(t *testing.T) {
t.Fatal(err)
}
defer server.Close()
+
ctx, err := fakeContext(fmt.Sprintf(`FROM busybox
COPY file*.txt /tmp/
RUN ls /tmp/file1.txt /tmp/file2.txt
@@ -1083,7 +1181,7 @@ func TestBuildCopyWildcard(t *testing.T) {
RUN mkdir /tmp2
ADD dir/*dir %s/robots.txt /tmp2/
RUN ls /tmp2/nest_nest_file /tmp2/robots.txt
- `, server.URL),
+ `, server.URL()),
map[string]string{
"file1.txt": "test1",
"file2.txt": "test2",
@@ -1253,7 +1351,7 @@ RUN [ $(ls -l /exists/test_file | awk '{print $3":"$4}') = 'root:root' ]`,
func TestBuildAddWholeDirToRoot(t *testing.T) {
name := "testaddwholedirtoroot"
defer deleteImages(name)
- ctx, err := fakeContext(`FROM busybox
+ ctx, err := fakeContext(fmt.Sprintf(`FROM busybox
RUN echo 'dockerio:x:1001:1001::/bin:/bin/false' >> /etc/passwd
RUN echo 'dockerio:x:1001:' >> /etc/group
RUN touch /exists
@@ -1262,8 +1360,8 @@ ADD test_dir /test_dir
RUN [ $(ls -l / | grep test_dir | awk '{print $3":"$4}') = 'root:root' ]
RUN [ $(ls -l / | grep test_dir | awk '{print $1}') = 'drwxr-xr-x' ]
RUN [ $(ls -l /test_dir/test_file | awk '{print $3":"$4}') = 'root:root' ]
-RUN [ $(ls -l /test_dir/test_file | awk '{print $1}') = '-rw-r--r--' ]
-RUN [ $(ls -l /exists | awk '{print $3":"$4}') = 'dockerio:dockerio' ]`,
+RUN [ $(ls -l /test_dir/test_file | awk '{print $1}') = '%s' ]
+RUN [ $(ls -l /exists | awk '{print $3":"$4}') = 'dockerio:dockerio' ]`, expectedFileChmod),
map[string]string{
"test_dir/test_file": "test1",
})
@@ -1326,15 +1424,15 @@ RUN [ $(ls -l /usr/bin/suidbin | awk '{print $1}') = '-rwsr-xr-x' ]`,
func TestBuildCopySingleFileToRoot(t *testing.T) {
name := "testcopysinglefiletoroot"
defer deleteImages(name)
- ctx, err := fakeContext(`FROM busybox
+ ctx, err := fakeContext(fmt.Sprintf(`FROM busybox
RUN echo 'dockerio:x:1001:1001::/bin:/bin/false' >> /etc/passwd
RUN echo 'dockerio:x:1001:' >> /etc/group
RUN touch /exists
RUN chown dockerio.dockerio /exists
COPY test_file /
RUN [ $(ls -l /test_file | awk '{print $3":"$4}') = 'root:root' ]
-RUN [ $(ls -l /test_file | awk '{print $1}') = '-rw-r--r--' ]
-RUN [ $(ls -l /exists | awk '{print $3":"$4}') = 'dockerio:dockerio' ]`,
+RUN [ $(ls -l /test_file | awk '{print $1}') = '%s' ]
+RUN [ $(ls -l /exists | awk '{print $3":"$4}') = 'dockerio:dockerio' ]`, expectedFileChmod),
map[string]string{
"test_file": "test1",
})
@@ -1486,7 +1584,7 @@ RUN [ $(ls -l /exists/test_file | awk '{print $3":"$4}') = 'root:root' ]`,
func TestBuildCopyWholeDirToRoot(t *testing.T) {
name := "testcopywholedirtoroot"
defer deleteImages(name)
- ctx, err := fakeContext(`FROM busybox
+ ctx, err := fakeContext(fmt.Sprintf(`FROM busybox
RUN echo 'dockerio:x:1001:1001::/bin:/bin/false' >> /etc/passwd
RUN echo 'dockerio:x:1001:' >> /etc/group
RUN touch /exists
@@ -1495,8 +1593,8 @@ COPY test_dir /test_dir
RUN [ $(ls -l / | grep test_dir | awk '{print $3":"$4}') = 'root:root' ]
RUN [ $(ls -l / | grep test_dir | awk '{print $1}') = 'drwxr-xr-x' ]
RUN [ $(ls -l /test_dir/test_file | awk '{print $3":"$4}') = 'root:root' ]
-RUN [ $(ls -l /test_dir/test_file | awk '{print $1}') = '-rw-r--r--' ]
-RUN [ $(ls -l /exists | awk '{print $3":"$4}') = 'dockerio:dockerio' ]`,
+RUN [ $(ls -l /test_dir/test_file | awk '{print $1}') = '%s' ]
+RUN [ $(ls -l /exists | awk '{print $3":"$4}') = 'dockerio:dockerio' ]`, expectedFileChmod),
map[string]string{
"test_dir/test_file": "test1",
})
@@ -1567,7 +1665,20 @@ func TestBuildAddBadLinks(t *testing.T) {
}
defer os.RemoveAll(tempDir)
- symlinkTarget := fmt.Sprintf("/../../../../../../../../../../../..%s", tempDir)
+ var symlinkTarget string
+ if runtime.GOOS == "windows" {
+ var driveLetter string
+ if abs, err := filepath.Abs(tempDir); err != nil {
+ t.Fatal(err)
+ } else {
+ driveLetter = abs[:1]
+ }
+ tempDirWithoutDrive := tempDir[2:]
+ symlinkTarget = fmt.Sprintf(`%s:\..\..\..\..\..\..\..\..\..\..\..\..%s`, driveLetter, tempDirWithoutDrive)
+ } else {
+ symlinkTarget = fmt.Sprintf("/../../../../../../../../../../../..%s", tempDir)
+ }
+
tarPath := filepath.Join(ctx.Dir, "links.tar")
nonExistingFile := filepath.Join(tempDir, targetFile)
fooPath := filepath.Join(ctx.Dir, targetFile)
@@ -1672,6 +1783,8 @@ func TestBuildAddBadLinksVolume(t *testing.T) {
// Issue #5270 - ensure we throw a better error than "unexpected EOF"
// when we can't access files in the context.
func TestBuildWithInaccessibleFilesInContext(t *testing.T) {
+ testRequires(t, UnixCli) // test uses chown/chmod: not available on windows
+
{
name := "testbuildinaccessiblefiles"
defer deleteImages(name)
@@ -1721,10 +1834,10 @@ func TestBuildWithInaccessibleFilesInContext(t *testing.T) {
t.Fatalf("failed to chown directory to root: %s", err)
}
if err = os.Chmod(pathToDirectoryWithoutReadAccess, 0444); err != nil {
- t.Fatalf("failed to chmod directory to 755: %s", err)
+ t.Fatalf("failed to chmod directory to 444: %s", err)
}
if err = os.Chmod(pathToFileInDirectoryWithoutReadAccess, 0700); err != nil {
- t.Fatalf("failed to chmod file to 444: %s", err)
+ t.Fatalf("failed to chmod file to 700: %s", err)
}
buildCmd := exec.Command("su", "unprivilegeduser", "-c", fmt.Sprintf("%s build -t %s .", dockerBinary, name))
@@ -1796,7 +1909,7 @@ func TestBuildWithInaccessibleFilesInContext(t *testing.T) {
}
}
- logDone("build - ADD from context with inaccessible files must fail")
+ logDone("build - ADD from context with inaccessible files must not pass")
logDone("build - ADD from context with accessible links must work")
logDone("build - ADD from context with ignored inaccessible files must work")
}
@@ -1832,6 +1945,133 @@ func TestBuildForceRm(t *testing.T) {
logDone("build - ensure --force-rm doesn't leave containers behind")
}
+// Test that an infinite sleep during a build is killed if the client disconnects.
+// This test is fairly hairy because there are lots of ways to race.
+// Strategy:
+// * Monitor the output of docker events starting from before
+// * Run a 1-year-long sleep from a docker build.
+// * When docker events sees container start, close the "docker build" command
+// * Wait for docker events to emit a dying event.
+func TestBuildCancelationKillsSleep(t *testing.T) {
+ // TODO(jfrazelle): Make this work on Windows.
+ testRequires(t, SameHostDaemon)
+
+ name := "testbuildcancelation"
+ defer deleteImages(name)
+ defer deleteAllContainers()
+
+ // (Note: one year, will never finish)
+ ctx, err := fakeContext("FROM busybox\nRUN sleep 31536000", nil)
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer ctx.Close()
+
+ var wg sync.WaitGroup
+ defer wg.Wait()
+
+ finish := make(chan struct{})
+ defer close(finish)
+
+ eventStart := make(chan struct{})
+ eventDie := make(chan struct{})
+
+ // Start one second ago, to avoid rounding problems
+ startEpoch := time.Now().Add(-1 * time.Second)
+
+ // Goroutine responsible for watching start/die events from `docker events`
+ wg.Add(1)
+ go func() {
+ defer wg.Done()
+
+ // Watch for events since epoch.
+ eventsCmd := exec.Command(dockerBinary, "events",
+ "-since", fmt.Sprint(startEpoch.Unix()))
+ stdout, err := eventsCmd.StdoutPipe()
+ err = eventsCmd.Start()
+ if err != nil {
+ t.Fatalf("failed to start 'docker events': %s", err)
+ }
+
+ go func() {
+ <-finish
+ eventsCmd.Process.Kill()
+ }()
+
+ var started, died bool
+ matchStart := regexp.MustCompile(" \\(from busybox\\:latest\\) start$")
+ matchDie := regexp.MustCompile(" \\(from busybox\\:latest\\) die$")
+
+ //
+ // Read lines of `docker events` looking for container start and stop.
+ //
+ scanner := bufio.NewScanner(stdout)
+ for scanner.Scan() {
+ if ok := matchStart.MatchString(scanner.Text()); ok {
+ if started {
+ t.Fatal("assertion fail: more than one container started")
+ }
+ close(eventStart)
+ started = true
+ }
+ if ok := matchDie.MatchString(scanner.Text()); ok {
+ if died {
+ t.Fatal("assertion fail: more than one container died")
+ }
+ close(eventDie)
+ died = true
+ }
+ }
+
+ err = eventsCmd.Wait()
+ if err != nil && !IsKilled(err) {
+ t.Fatalf("docker events had bad exit status: %s", err)
+ }
+ }()
+
+ buildCmd := exec.Command(dockerBinary, "build", "-t", name, ".")
+ buildCmd.Dir = ctx.Dir
+ buildCmd.Stdout = os.Stdout
+
+ err = buildCmd.Start()
+ if err != nil {
+ t.Fatalf("failed to run build: %s", err)
+ }
+
+ select {
+ case <-time.After(30 * time.Second):
+ t.Fatal("failed to observe build container start in timely fashion")
+ case <-eventStart:
+ // Proceeds from here when we see the container fly past in the
+ // output of "docker events".
+ // Now we know the container is running.
+ }
+
+ // Send a kill to the `docker build` command.
+ // Causes the underlying build to be cancelled due to socket close.
+ err = buildCmd.Process.Kill()
+ if err != nil {
+ t.Fatalf("error killing build command: %s", err)
+ }
+
+ // Get the exit status of `docker build`, check it exited because killed.
+ err = buildCmd.Wait()
+ if err != nil && !IsKilled(err) {
+ t.Fatalf("wait failed during build run: %T %s", err, err)
+ }
+
+ select {
+ case <-time.After(30 * time.Second):
+ // If we don't get here in a timely fashion, it wasn't killed.
+ t.Fatal("container cancel did not succeed")
+ case <-eventDie:
+ // We saw the container shut down in the `docker events` stream,
+ // as expected.
+ }
+
+ logDone("build - ensure canceled job finishes immediately")
+}
+
func TestBuildRm(t *testing.T) {
name := "testbuildrm"
defer deleteImages(name)
@@ -2036,7 +2276,7 @@ func TestBuildRelativeWorkdir(t *testing.T) {
func TestBuildWorkdirWithEnvVariables(t *testing.T) {
name := "testbuildworkdirwithenvvariables"
- expected := "/test1/test2/$MISSING_VAR"
+ expected := "/test1/test2"
defer deleteImages(name)
_, err := buildImage(name,
`FROM busybox
@@ -2122,6 +2362,8 @@ func TestBuildEnv(t *testing.T) {
}
func TestBuildContextCleanup(t *testing.T) {
+ testRequires(t, SameHostDaemon)
+
name := "testbuildcontextcleanup"
defer deleteImages(name)
entries, err := ioutil.ReadDir("/var/lib/docker/tmp")
@@ -2147,6 +2389,8 @@ func TestBuildContextCleanup(t *testing.T) {
}
func TestBuildContextCleanupFailedBuild(t *testing.T) {
+ testRequires(t, SameHostDaemon)
+
name := "testbuildcontextcleanup"
defer deleteImages(name)
defer deleteAllContainers()
@@ -2169,7 +2413,7 @@ func TestBuildContextCleanupFailedBuild(t *testing.T) {
t.Fatalf("context should have been deleted, but wasn't")
}
- logDone("build - verify context cleanup works properly after a failed build")
+ logDone("build - verify context cleanup works properly after an unsuccessful build")
}
func TestBuildCmd(t *testing.T) {
@@ -2293,6 +2537,54 @@ func TestBuildExposeOrder(t *testing.T) {
logDone("build - expose order")
}
+func TestBuildExposeUpperCaseProto(t *testing.T) {
+ name := "testbuildexposeuppercaseproto"
+ expected := "map[5678/udp:map[]]"
+ defer deleteImages(name)
+ _, err := buildImage(name,
+ `FROM scratch
+ EXPOSE 5678/UDP`,
+ true)
+ if err != nil {
+ t.Fatal(err)
+ }
+ res, err := inspectField(name, "Config.ExposedPorts")
+ if err != nil {
+ t.Fatal(err)
+ }
+ if res != expected {
+ t.Fatalf("Exposed ports %s, expected %s", res, expected)
+ }
+ logDone("build - expose port with upper case proto")
+}
+
+func TestBuildExposeHostPort(t *testing.T) {
+ // start building docker file with ip:hostPort:containerPort
+ name := "testbuildexpose"
+ expected := "map[5678/tcp:map[]]"
+ defer deleteImages(name)
+ _, out, err := buildImageWithOut(name,
+ `FROM scratch
+ EXPOSE 192.168.1.2:2375:5678`,
+ true)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ if !strings.Contains(out, "to map host ports to container ports (ip:hostPort:containerPort) is deprecated.") {
+ t.Fatal("Missing warning message")
+ }
+
+ res, err := inspectField(name, "Config.ExposedPorts")
+ if err != nil {
+ t.Fatal(err)
+ }
+ if res != expected {
+ t.Fatalf("Exposed ports %s, expected %s", res, expected)
+ }
+ logDone("build - ignore exposing host's port")
+}
+
func TestBuildEmptyEntrypointInheritance(t *testing.T) {
name := "testbuildentrypointinheritance"
name2 := "testbuildentrypointinheritance2"
@@ -2521,6 +2813,10 @@ func TestBuildConditionalCache(t *testing.T) {
ctx, err := fakeContext(dockerfile, map[string]string{
"foo": "hello",
})
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer ctx.Close()
id1, err := buildImageFromContext(name, ctx, true)
if err != nil {
@@ -2777,10 +3073,11 @@ func TestBuildADDRemoteFileWithCache(t *testing.T) {
t.Fatal(err)
}
defer server.Close()
+
id1, err := buildImage(name,
fmt.Sprintf(`FROM scratch
MAINTAINER dockerio
- ADD %s/baz /usr/lib/baz/quux`, server.URL),
+ ADD %s/baz /usr/lib/baz/quux`, server.URL()),
true)
if err != nil {
t.Fatal(err)
@@ -2788,7 +3085,7 @@ func TestBuildADDRemoteFileWithCache(t *testing.T) {
id2, err := buildImage(name,
fmt.Sprintf(`FROM scratch
MAINTAINER dockerio
- ADD %s/baz /usr/lib/baz/quux`, server.URL),
+ ADD %s/baz /usr/lib/baz/quux`, server.URL()),
true)
if err != nil {
t.Fatal(err)
@@ -2810,10 +3107,11 @@ func TestBuildADDRemoteFileWithoutCache(t *testing.T) {
t.Fatal(err)
}
defer server.Close()
+
id1, err := buildImage(name,
fmt.Sprintf(`FROM scratch
MAINTAINER dockerio
- ADD %s/baz /usr/lib/baz/quux`, server.URL),
+ ADD %s/baz /usr/lib/baz/quux`, server.URL()),
true)
if err != nil {
t.Fatal(err)
@@ -2821,7 +3119,7 @@ func TestBuildADDRemoteFileWithoutCache(t *testing.T) {
id2, err := buildImage(name2,
fmt.Sprintf(`FROM scratch
MAINTAINER dockerio
- ADD %s/baz /usr/lib/baz/quux`, server.URL),
+ ADD %s/baz /usr/lib/baz/quux`, server.URL()),
false)
if err != nil {
t.Fatal(err)
@@ -2840,7 +3138,8 @@ func TestBuildADDRemoteFileMTime(t *testing.T) {
defer deleteImages(name, name2, name3, name4)
- server, err := fakeStorage(map[string]string{"baz": "hello"})
+ files := map[string]string{"baz": "hello"}
+ server, err := fakeStorage(files)
if err != nil {
t.Fatal(err)
}
@@ -2848,7 +3147,7 @@ func TestBuildADDRemoteFileMTime(t *testing.T) {
ctx, err := fakeContext(fmt.Sprintf(`FROM scratch
MAINTAINER dockerio
- ADD %s/baz /usr/lib/baz/quux`, server.URL), nil)
+ ADD %s/baz /usr/lib/baz/quux`, server.URL()), nil)
if err != nil {
t.Fatal(err)
}
@@ -2867,15 +3166,26 @@ func TestBuildADDRemoteFileMTime(t *testing.T) {
t.Fatal("The cache should have been used but wasn't - #1")
}
- // Now set baz's times to anything else and redo the build
+ // Now create a different server withsame contents (causes different mtim)
// This time the cache should not be used
- bazPath := path.Join(server.FakeContext.Dir, "baz")
- err = syscall.UtimesNano(bazPath, make([]syscall.Timespec, 2))
+
+ // allow some time for clock to pass as mtime precision is only 1s
+ time.Sleep(2 * time.Second)
+
+ server2, err := fakeStorage(files)
if err != nil {
- t.Fatalf("Error setting mtime on %q: %v", bazPath, err)
+ t.Fatal(err)
}
+ defer server2.Close()
- id3, err := buildImageFromContext(name3, ctx, true)
+ ctx2, err := fakeContext(fmt.Sprintf(`FROM scratch
+ MAINTAINER dockerio
+ ADD %s/baz /usr/lib/baz/quux`, server2.URL()), nil)
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer ctx2.Close()
+ id3, err := buildImageFromContext(name3, ctx2, true)
if err != nil {
t.Fatal(err)
}
@@ -2884,7 +3194,7 @@ func TestBuildADDRemoteFileMTime(t *testing.T) {
}
// And for good measure do it again and make sure cache is used this time
- id4, err := buildImageFromContext(name4, ctx, true)
+ id4, err := buildImageFromContext(name4, ctx2, true)
if err != nil {
t.Fatal(err)
}
@@ -2904,10 +3214,11 @@ func TestBuildADDLocalAndRemoteFilesWithCache(t *testing.T) {
t.Fatal(err)
}
defer server.Close()
+
ctx, err := fakeContext(fmt.Sprintf(`FROM scratch
MAINTAINER dockerio
ADD foo /usr/lib/bla/bar
- ADD %s/baz /usr/lib/baz/quux`, server.URL),
+ ADD %s/baz /usr/lib/baz/quux`, server.URL()),
map[string]string{
"foo": "hello world",
})
@@ -2993,10 +3304,11 @@ func TestBuildADDLocalAndRemoteFilesWithoutCache(t *testing.T) {
t.Fatal(err)
}
defer server.Close()
+
ctx, err := fakeContext(fmt.Sprintf(`FROM scratch
MAINTAINER dockerio
ADD foo /usr/lib/bla/bar
- ADD %s/baz /usr/lib/baz/quux`, server.URL),
+ ADD %s/baz /usr/lib/baz/quux`, server.URL()),
map[string]string{
"foo": "hello world",
})
@@ -3185,7 +3497,7 @@ func TestBuildFails(t *testing.T) {
} else {
t.Fatal("Error must not be nil")
}
- logDone("build - fails")
+ logDone("build - unsuccessful")
}
func TestBuildFailsDockerfileEmpty(t *testing.T) {
@@ -3199,7 +3511,7 @@ func TestBuildFailsDockerfileEmpty(t *testing.T) {
} else {
t.Fatal("Error must not be nil")
}
- logDone("build - fails with empty dockerfile")
+ logDone("build - unsuccessful with empty dockerfile")
}
func TestBuildOnBuild(t *testing.T) {
@@ -3411,6 +3723,8 @@ func TestBuildDockerignoringDockerfile(t *testing.T) {
if err != nil {
t.Fatal(err)
}
+ defer ctx.Close()
+
if _, err = buildImageFromContext(name, ctx, true); err != nil {
t.Fatalf("Didn't ignore Dockerfile correctly:%s", err)
}
@@ -3441,6 +3755,8 @@ func TestBuildDockerignoringRenamedDockerfile(t *testing.T) {
if err != nil {
t.Fatal(err)
}
+ defer ctx.Close()
+
if _, err = buildImageFromContext(name, ctx, true); err != nil {
t.Fatalf("Didn't ignore MyDockerfile correctly:%s", err)
}
@@ -3689,6 +4005,9 @@ ENV FROM hello/docker/world
ENV TO /docker/world/hello
ADD $FROM $TO
RUN [ "$(cat $TO)" = "hello" ]
+ENV abc=def
+ENV ghi=$abc
+RUN [ "$ghi" = "def" ]
`
ctx, err := fakeContext(dockerfile, map[string]string{
"hello/docker/world": "hello",
@@ -3726,11 +4045,52 @@ ENV abc=zzz TO=/docker/world/hello
ADD $FROM $TO
RUN [ "$(cat $TO)" = "hello" ]
ENV abc "zzz"
-RUN [ $abc = \"zzz\" ]
+RUN [ $abc = "zzz" ]
ENV abc 'yyy'
-RUN [ $abc = \'yyy\' ]
+RUN [ $abc = 'yyy' ]
ENV abc=
RUN [ "$abc" = "" ]
+
+# use grep to make sure if the builder substitutes \$foo by mistake
+# we don't get a false positive
+ENV abc=\$foo
+RUN [ "$abc" = "\$foo" ] && (echo "$abc" | grep foo)
+ENV abc \$foo
+RUN [ "$abc" = "\$foo" ] && (echo "$abc" | grep foo)
+
+ENV abc=\'foo\'
+RUN [ "$abc" = "'foo'" ]
+ENV abc=\"foo\"
+RUN [ "$abc" = "\"foo\"" ]
+ENV abc "foo"
+RUN [ "$abc" = "foo" ]
+ENV abc 'foo'
+RUN [ "$abc" = 'foo' ]
+ENV abc \'foo\'
+RUN [ "$abc" = "'foo'" ]
+ENV abc \"foo\"
+RUN [ "$abc" = '"foo"' ]
+
+ENV e1=bar
+ENV e2=$e1
+ENV e3=$e11
+ENV e4=\$e1
+ENV e5=\$e11
+RUN [ "$e0,$e1,$e2,$e3,$e4,$e5" = ',bar,bar,,$e1,$e11' ]
+
+ENV ee1 bar
+ENV ee2 $ee1
+ENV ee3 $ee11
+ENV ee4 \$ee1
+ENV ee5 \$ee11
+RUN [ "$ee1,$ee2,$ee3,$ee4,$ee5" = 'bar,bar,,$ee1,$ee11' ]
+
+ENV eee1="foo"
+ENV eee2='foo'
+ENV eee3 "foo"
+ENV eee4 'foo'
+RUN [ "$eee1,$eee2,$eee3,$eee4" = 'foo,foo,foo,foo' ]
+
`
ctx, err := fakeContext(dockerfile, map[string]string{
"hello/docker/world": "hello",
@@ -3738,6 +4098,8 @@ RUN [ "$abc" = "" ]
if err != nil {
t.Fatal(err)
}
+ defer ctx.Close()
+
_, err = buildImageFromContext(name, ctx, true)
if err != nil {
t.Fatal(err)
@@ -3814,7 +4176,7 @@ RUN cat /existing-directory-trailing-slash/test/foo | grep Hi`
if err := ioutil.WriteFile(filepath.Join(tmpDir, "Dockerfile"), []byte(dockerfile), 0644); err != nil {
t.Fatalf("failed to open destination dockerfile: %v", err)
}
- return &FakeContext{Dir: tmpDir}
+ return fakeContextFromDir(tmpDir)
}()
defer ctx.Close()
@@ -3855,7 +4217,7 @@ func TestBuildAddTarXz(t *testing.T) {
if err := tw.Close(); err != nil {
t.Fatalf("failed to close tar archive: %v", err)
}
- xzCompressCmd := exec.Command("xz", "test.tar")
+ xzCompressCmd := exec.Command("xz", "-k", "test.tar")
xzCompressCmd.Dir = tmpDir
out, _, err := runCommandWithOutput(xzCompressCmd)
if err != nil {
@@ -3865,7 +4227,7 @@ func TestBuildAddTarXz(t *testing.T) {
if err := ioutil.WriteFile(filepath.Join(tmpDir, "Dockerfile"), []byte(dockerfile), 0644); err != nil {
t.Fatalf("failed to open destination dockerfile: %v", err)
}
- return &FakeContext{Dir: tmpDir}
+ return fakeContextFromDir(tmpDir)
}()
defer ctx.Close()
@@ -3908,7 +4270,7 @@ func TestBuildAddTarXzGz(t *testing.T) {
t.Fatalf("failed to close tar archive: %v", err)
}
- xzCompressCmd := exec.Command("xz", "test.tar")
+ xzCompressCmd := exec.Command("xz", "-k", "test.tar")
xzCompressCmd.Dir = tmpDir
out, _, err := runCommandWithOutput(xzCompressCmd)
if err != nil {
@@ -3925,7 +4287,7 @@ func TestBuildAddTarXzGz(t *testing.T) {
if err := ioutil.WriteFile(filepath.Join(tmpDir, "Dockerfile"), []byte(dockerfile), 0644); err != nil {
t.Fatalf("failed to open destination dockerfile: %v", err)
}
- return &FakeContext{Dir: tmpDir}
+ return fakeContextFromDir(tmpDir)
}()
defer ctx.Close()
@@ -3946,7 +4308,7 @@ func TestBuildFromGIT(t *testing.T) {
RUN [ -f /first ]
MAINTAINER docker`,
"first": "test git data",
- })
+ }, true)
if err != nil {
t.Fatal(err)
}
@@ -4091,6 +4453,44 @@ func TestBuildCmdShDashC(t *testing.T) {
logDone("build - cmd should have sh -c for non-json")
}
+func TestBuildCmdSpaces(t *testing.T) {
+ // Test to make sure that when we strcat arrays we take into account
+ // the arg separator to make sure ["echo","hi"] and ["echo hi"] don't
+ // look the same
+ name := "testbuildcmdspaces"
+ defer deleteImages(name)
+ var id1 string
+ var id2 string
+ var err error
+
+ if id1, err = buildImage(name, "FROM busybox\nCMD [\"echo hi\"]\n", true); err != nil {
+ t.Fatal(err)
+ }
+
+ if id2, err = buildImage(name, "FROM busybox\nCMD [\"echo\", \"hi\"]\n", true); err != nil {
+ t.Fatal(err)
+ }
+
+ if id1 == id2 {
+ t.Fatal("Should not have resulted in the same CMD")
+ }
+
+ // Now do the same with ENTRYPOINT
+ if id1, err = buildImage(name, "FROM busybox\nENTRYPOINT [\"echo hi\"]\n", true); err != nil {
+ t.Fatal(err)
+ }
+
+ if id2, err = buildImage(name, "FROM busybox\nENTRYPOINT [\"echo\", \"hi\"]\n", true); err != nil {
+ t.Fatal(err)
+ }
+
+ if id1 == id2 {
+ t.Fatal("Should not have resulted in the same ENTRYPOINT")
+ }
+
+ logDone("build - cmd with spaces")
+}
+
func TestBuildCmdJSONNoShDashC(t *testing.T) {
name := "testbuildcmdjson"
defer deleteImages(name)
@@ -4112,16 +4512,16 @@ func TestBuildCmdJSONNoShDashC(t *testing.T) {
logDone("build - cmd should not have /bin/sh -c for json")
}
-func TestBuildIgnoreInvalidInstruction(t *testing.T) {
+func TestBuildErrorInvalidInstruction(t *testing.T) {
name := "testbuildignoreinvalidinstruction"
defer deleteImages(name)
out, _, err := buildImageWithOut(name, "FROM busybox\nfoo bar", true)
- if err != nil {
- t.Fatal(err, out)
+ if err == nil {
+ t.Fatalf("Should have failed: %s", out)
}
- logDone("build - ignore invalid Dockerfile instruction")
+ logDone("build - error invalid Dockerfile instruction")
}
func TestBuildEntrypointInheritance(t *testing.T) {
@@ -4224,7 +4624,7 @@ func TestBuildExoticShellInterpolation(t *testing.T) {
_, err := buildImage(name, `
FROM busybox
-
+
ENV SOME_VAR a.b.c
RUN [ "$SOME_VAR" = 'a.b.c' ]
@@ -4268,7 +4668,7 @@ func TestBuildVerifySingleQuoteFails(t *testing.T) {
t.Fatal("The image was not supposed to be able to run")
}
- logDone("build - verify single quotes fail")
+ logDone("build - verify single quotes break the build")
}
func TestBuildVerboseOut(t *testing.T) {
@@ -4310,6 +4710,78 @@ func TestBuildWithTabs(t *testing.T) {
logDone("build - with tabs")
}
+func TestBuildLabels(t *testing.T) {
+ name := "testbuildlabel"
+ expected := `{"License":"GPL","Vendor":"Acme"}`
+ defer deleteImages(name)
+ _, err := buildImage(name,
+ `FROM busybox
+ LABEL Vendor=Acme
+ LABEL License GPL`,
+ true)
+ if err != nil {
+ t.Fatal(err)
+ }
+ res, err := inspectFieldJSON(name, "Config.Labels")
+ if err != nil {
+ t.Fatal(err)
+ }
+ if res != expected {
+ t.Fatalf("Labels %s, expected %s", res, expected)
+ }
+ logDone("build - label")
+}
+
+func TestBuildLabelsCache(t *testing.T) {
+ name := "testbuildlabelcache"
+ defer deleteImages(name)
+
+ id1, err := buildImage(name,
+ `FROM busybox
+ LABEL Vendor=Acme`, false)
+ if err != nil {
+ t.Fatalf("Build 1 should have worked: %v", err)
+ }
+
+ id2, err := buildImage(name,
+ `FROM busybox
+ LABEL Vendor=Acme`, true)
+ if err != nil || id1 != id2 {
+ t.Fatalf("Build 2 should have worked & used cache(%s,%s): %v", id1, id2, err)
+ }
+
+ id2, err = buildImage(name,
+ `FROM busybox
+ LABEL Vendor=Acme1`, true)
+ if err != nil || id1 == id2 {
+ t.Fatalf("Build 3 should have worked & NOT used cache(%s,%s): %v", id1, id2, err)
+ }
+
+ id2, err = buildImage(name,
+ `FROM busybox
+ LABEL Vendor Acme`, true) // Note: " " and "=" should be same
+ if err != nil || id1 != id2 {
+ t.Fatalf("Build 4 should have worked & used cache(%s,%s): %v", id1, id2, err)
+ }
+
+ // Now make sure the cache isn't used by mistake
+ id1, err = buildImage(name,
+ `FROM busybox
+ LABEL f1=b1 f2=b2`, false)
+ if err != nil {
+ t.Fatalf("Build 5 should have worked: %q", err)
+ }
+
+ id2, err = buildImage(name,
+ `FROM busybox
+ LABEL f1="b1 f2=b2"`, true)
+ if err != nil || id1 == id2 {
+ t.Fatalf("Build 6 should have worked & NOT used the cache(%s,%s): %q", id1, id2, err)
+ }
+
+ logDone("build - label cache")
+}
+
func TestBuildStderr(t *testing.T) {
// This test just makes sure that no non-error output goes
// to stderr
@@ -4320,13 +4792,26 @@ func TestBuildStderr(t *testing.T) {
if err != nil {
t.Fatal(err)
}
- if stderr != "" {
- t.Fatalf("Stderr should have been empty, instead its: %q", stderr)
+
+ if runtime.GOOS == "windows" {
+ // stderr might contain a security warning on windows
+ lines := strings.Split(stderr, "\n")
+ for _, v := range lines {
+ if v != "" && !strings.Contains(v, "SECURITY WARNING:") {
+ t.Fatalf("Stderr contains unexpected output line: %q", v)
+ }
+ }
+ } else {
+ if stderr != "" {
+ t.Fatalf("Stderr should have been empty, instead its: %q", stderr)
+ }
}
logDone("build - testing stderr")
}
func TestBuildChownSingleFile(t *testing.T) {
+ testRequires(t, UnixCli) // test uses chown: not available on windows
+
name := "testbuildchownsinglefile"
defer deleteImages(name)
@@ -4397,7 +4882,7 @@ func TestBuildSymlinkBreakout(t *testing.T) {
})
w.Close()
f.Close()
- if _, err := buildImageFromContext(name, &FakeContext{Dir: ctx}, false); err != nil {
+ if _, err := buildImageFromContext(name, fakeContextFromDir(ctx), false); err != nil {
t.Fatal(err)
}
if _, err := os.Lstat(filepath.Join(tmpdir, "inject")); err == nil {
@@ -4481,6 +4966,7 @@ func TestBuildRenamedDockerfile(t *testing.T) {
"files/Dockerfile": "FROM busybox\nRUN echo from files/Dockerfile",
"files/dFile": "FROM busybox\nRUN echo from files/dFile",
"dFile": "FROM busybox\nRUN echo from dFile",
+ "files/dFile2": "FROM busybox\nRUN echo from files/dFile2",
})
defer ctx.Close()
if err != nil {
@@ -4488,88 +4974,212 @@ func TestBuildRenamedDockerfile(t *testing.T) {
}
out, _, err := dockerCmdInDir(t, ctx.Dir, "build", "-t", "test1", ".")
-
if err != nil {
t.Fatalf("Failed to build: %s\n%s", out, err)
}
if !strings.Contains(out, "from Dockerfile") {
- t.Fatalf("Should have used Dockerfile, output:%s", out)
+ t.Fatalf("test1 should have used Dockerfile, output:%s", out)
}
- out, _, err = dockerCmdInDir(t, ctx.Dir, "build", "-f", "files/Dockerfile", "-t", "test2", ".")
-
+ out, _, err = dockerCmdInDir(t, ctx.Dir, "build", "-f", filepath.Join("files", "Dockerfile"), "-t", "test2", ".")
if err != nil {
t.Fatal(err)
}
if !strings.Contains(out, "from files/Dockerfile") {
- t.Fatalf("Should have used files/Dockerfile, output:%s", out)
+ t.Fatalf("test2 should have used files/Dockerfile, output:%s", out)
}
- out, _, err = dockerCmdInDir(t, ctx.Dir, "build", "--file=files/dFile", "-t", "test3", ".")
-
+ out, _, err = dockerCmdInDir(t, ctx.Dir, "build", fmt.Sprintf("--file=%s", filepath.Join("files", "dFile")), "-t", "test3", ".")
if err != nil {
t.Fatal(err)
}
if !strings.Contains(out, "from files/dFile") {
- t.Fatalf("Should have used files/dFile, output:%s", out)
+ t.Fatalf("test3 should have used files/dFile, output:%s", out)
}
out, _, err = dockerCmdInDir(t, ctx.Dir, "build", "--file=dFile", "-t", "test4", ".")
-
if err != nil {
t.Fatal(err)
}
if !strings.Contains(out, "from dFile") {
- t.Fatalf("Should have used dFile, output:%s", out)
+ t.Fatalf("test4 should have used dFile, output:%s", out)
}
- out, _, err = dockerCmdInDir(t, ctx.Dir, "build", "--file=/etc/passwd", "-t", "test5", ".")
+ dirWithNoDockerfile, _ := ioutil.TempDir(os.TempDir(), "test5")
+ nonDockerfileFile := filepath.Join(dirWithNoDockerfile, "notDockerfile")
+ if _, err = os.Create(nonDockerfileFile); err != nil {
+ t.Fatal(err)
+ }
+ out, _, err = dockerCmdInDir(t, ctx.Dir, "build", fmt.Sprintf("--file=%s", nonDockerfileFile), "-t", "test5", ".")
if err == nil {
- t.Fatalf("Was supposed to fail to find passwd")
+ t.Fatalf("test5 was supposed to fail to find passwd")
+ }
+
+ if expected := fmt.Sprintf("The Dockerfile (%s) must be within the build context (.)", strings.Replace(nonDockerfileFile, `\`, `\\`, -1)); !strings.Contains(out, expected) {
+ t.Fatalf("wrong error messsage:%v\nexpected to contain=%v", out, expected)
+ }
+
+ out, _, err = dockerCmdInDir(t, filepath.Join(ctx.Dir, "files"), "build", "-f", filepath.Join("..", "Dockerfile"), "-t", "test6", "..")
+ if err != nil {
+ t.Fatalf("test6 failed: %s", err)
+ }
+ if !strings.Contains(out, "from Dockerfile") {
+ t.Fatalf("test6 should have used root Dockerfile, output:%s", out)
+ }
+
+ out, _, err = dockerCmdInDir(t, filepath.Join(ctx.Dir, "files"), "build", "-f", filepath.Join(ctx.Dir, "files", "Dockerfile"), "-t", "test7", "..")
+ if err != nil {
+ t.Fatalf("test7 failed: %s", err)
+ }
+ if !strings.Contains(out, "from files/Dockerfile") {
+ t.Fatalf("test7 should have used files Dockerfile, output:%s", out)
+ }
+
+ out, _, err = dockerCmdInDir(t, filepath.Join(ctx.Dir, "files"), "build", "-f", filepath.Join("..", "Dockerfile"), "-t", "test8", ".")
+ if err == nil || !strings.Contains(out, "must be within the build context") {
+ t.Fatalf("test8 should have failed with Dockerfile out of context: %s", err)
+ }
+
+ tmpDir := os.TempDir()
+ out, _, err = dockerCmdInDir(t, tmpDir, "build", "-t", "test9", ctx.Dir)
+ if err != nil {
+ t.Fatalf("test9 - failed: %s", err)
+ }
+ if !strings.Contains(out, "from Dockerfile") {
+ t.Fatalf("test9 should have used root Dockerfile, output:%s", out)
+ }
+
+ out, _, err = dockerCmdInDir(t, filepath.Join(ctx.Dir, "files"), "build", "-f", "dFile2", "-t", "test10", ".")
+ if err != nil {
+ t.Fatalf("test10 should have worked: %s", err)
+ }
+ if !strings.Contains(out, "from files/dFile2") {
+ t.Fatalf("test10 should have used files/dFile2, output:%s", out)
+ }
+
+ logDone("build - rename dockerfile")
+}
+
+func TestBuildFromMixedcaseDockerfile(t *testing.T) {
+ testRequires(t, UnixCli) // Dockerfile overwrites dockerfile on windows
+ defer deleteImages("test1")
+
+ ctx, err := fakeContext(`FROM busybox
+ RUN echo from dockerfile`,
+ map[string]string{
+ "dockerfile": "FROM busybox\nRUN echo from dockerfile",
+ })
+ defer ctx.Close()
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ out, _, err := dockerCmdInDir(t, ctx.Dir, "build", "-t", "test1", ".")
+ if err != nil {
+ t.Fatalf("Failed to build: %s\n%s", out, err)
}
- if !strings.Contains(out, "The Dockerfile (/etc/passwd) must be within the build context (.)") {
- t.Fatalf("Wrong error message for passwd:%v", out)
+ if !strings.Contains(out, "from dockerfile") {
+ t.Fatalf("Missing proper output: %s", out)
}
- out, _, err = dockerCmdInDir(t, ctx.Dir+"/files", "build", "-f", "../Dockerfile", "-t", "test5", "..")
+ logDone("build - mixedcase Dockerfile")
+}
+
+func TestBuildWithTwoDockerfiles(t *testing.T) {
+ testRequires(t, UnixCli) // Dockerfile overwrites dockerfile on windows
+ defer deleteImages("test1")
+ ctx, err := fakeContext(`FROM busybox
+RUN echo from Dockerfile`,
+ map[string]string{
+ "dockerfile": "FROM busybox\nRUN echo from dockerfile",
+ })
+ defer ctx.Close()
if err != nil {
t.Fatal(err)
}
+ out, _, err := dockerCmdInDir(t, ctx.Dir, "build", "-t", "test1", ".")
+ if err != nil {
+ t.Fatalf("Failed to build: %s\n%s", out, err)
+ }
+
if !strings.Contains(out, "from Dockerfile") {
- t.Fatalf("Should have used root Dockerfile, output:%s", out)
+ t.Fatalf("Missing proper output: %s", out)
}
- out, _, err = dockerCmdInDir(t, ctx.Dir+"/files", "build", "-f", ctx.Dir+"/files/Dockerfile", "-t", "test6", "..")
+ logDone("build - two Dockerfiles")
+}
+
+func TestBuildFromURLWithF(t *testing.T) {
+ defer deleteImages("test1")
+ server, err := fakeStorage(map[string]string{"baz": `FROM busybox
+RUN echo from baz
+COPY * /tmp/
+RUN find /tmp/`})
if err != nil {
t.Fatal(err)
}
+ defer server.Close()
- if !strings.Contains(out, "from files/Dockerfile") {
- t.Fatalf("Should have used files Dockerfile - 2, output:%s", out)
+ ctx, err := fakeContext(`FROM busybox
+RUN echo from Dockerfile`,
+ map[string]string{})
+ defer ctx.Close()
+ if err != nil {
+ t.Fatal(err)
}
- out, _, err = dockerCmdInDir(t, ctx.Dir+"/files", "build", "-f", "../Dockerfile", "-t", "test7", ".")
+ // Make sure that -f is ignored and that we don't use the Dockerfile
+ // that's in the current dir
+ out, _, err := dockerCmdInDir(t, ctx.Dir, "build", "-f", "baz", "-t", "test1", server.URL()+"/baz")
+ if err != nil {
+ t.Fatalf("Failed to build: %s\n%s", out, err)
+ }
- if err == nil || !strings.Contains(out, "must be within the build context") {
- t.Fatalf("Should have failed with Dockerfile out of context")
+ if !strings.Contains(out, "from baz") ||
+ strings.Contains(out, "/tmp/baz") ||
+ !strings.Contains(out, "/tmp/Dockerfile") {
+ t.Fatalf("Missing proper output: %s", out)
}
- out, _, err = dockerCmdInDir(t, "/tmp", "build", "-t", "test6", ctx.Dir)
+ logDone("build - from URL with -f")
+}
+
+func TestBuildFromStdinWithF(t *testing.T) {
+ defer deleteImages("test1")
+ ctx, err := fakeContext(`FROM busybox
+RUN echo from Dockerfile`,
+ map[string]string{})
+ defer ctx.Close()
if err != nil {
t.Fatal(err)
}
- if !strings.Contains(out, "from Dockerfile") {
- t.Fatalf("Should have used root Dockerfile, output:%s", out)
+ // Make sure that -f is ignored and that we don't use the Dockerfile
+ // that's in the current dir
+ dockerCommand := exec.Command(dockerBinary, "build", "-f", "baz", "-t", "test1", "-")
+ dockerCommand.Dir = ctx.Dir
+ dockerCommand.Stdin = strings.NewReader(`FROM busybox
+RUN echo from baz
+COPY * /tmp/
+RUN find /tmp/`)
+ out, status, err := runCommandWithOutput(dockerCommand)
+ if err != nil || status != 0 {
+ t.Fatalf("Error building: %s", err)
}
- logDone("build - rename dockerfile")
+ if !strings.Contains(out, "from baz") ||
+ strings.Contains(out, "/tmp/baz") ||
+ !strings.Contains(out, "/tmp/Dockerfile") {
+ t.Fatalf("Missing proper output: %s", out)
+ }
+
+ logDone("build - from stdin with -f")
}
func TestBuildFromOfficialNames(t *testing.T) {
@@ -4594,6 +5204,8 @@ func TestBuildFromOfficialNames(t *testing.T) {
}
func TestBuildDockerfileOutsideContext(t *testing.T) {
+ testRequires(t, UnixCli) // uses os.Symlink: not implemented in windows at the time of writing (go-1.4.2)
+
name := "testbuilddockerfileoutsidecontext"
tmpdir, err := ioutil.TempDir("", name)
if err != nil {
@@ -4604,7 +5216,7 @@ func TestBuildDockerfileOutsideContext(t *testing.T) {
if err := os.MkdirAll(ctx, 0755); err != nil {
t.Fatal(err)
}
- if err := ioutil.WriteFile(filepath.Join(ctx, "Dockerfile"), []byte("FROM busybox"), 0644); err != nil {
+ if err := ioutil.WriteFile(filepath.Join(ctx, "Dockerfile"), []byte("FROM scratch\nENV X Y"), 0644); err != nil {
t.Fatal(err)
}
wd, err := os.Getwd()
@@ -4615,32 +5227,28 @@ func TestBuildDockerfileOutsideContext(t *testing.T) {
if err := os.Chdir(ctx); err != nil {
t.Fatal(err)
}
- if err := ioutil.WriteFile(filepath.Join(tmpdir, "outsideDockerfile"), []byte("FROM busbox"), 0644); err != nil {
+ if err := ioutil.WriteFile(filepath.Join(tmpdir, "outsideDockerfile"), []byte("FROM scratch\nENV x y"), 0644); err != nil {
t.Fatal(err)
}
- if err := os.Symlink("../outsideDockerfile", filepath.Join(ctx, "dockerfile1")); err != nil {
+ if err := os.Symlink(filepath.Join("..", "outsideDockerfile"), filepath.Join(ctx, "dockerfile1")); err != nil {
t.Fatal(err)
}
if err := os.Symlink(filepath.Join(tmpdir, "outsideDockerfile"), filepath.Join(ctx, "dockerfile2")); err != nil {
t.Fatal(err)
}
- if err := os.Link("../outsideDockerfile", filepath.Join(ctx, "dockerfile3")); err != nil {
- t.Fatal(err)
- }
- if err := os.Link(filepath.Join(tmpdir, "outsideDockerfile"), filepath.Join(ctx, "dockerfile4")); err != nil {
- t.Fatal(err)
- }
+
for _, dockerfilePath := range []string{
- "../outsideDockerfile",
+ filepath.Join("..", "outsideDockerfile"),
filepath.Join(ctx, "dockerfile1"),
filepath.Join(ctx, "dockerfile2"),
- filepath.Join(ctx, "dockerfile3"),
- filepath.Join(ctx, "dockerfile4"),
} {
out, _, err := runCommandWithOutput(exec.Command(dockerBinary, "build", "-t", name, "--no-cache", "-f", dockerfilePath, "."))
if err == nil {
t.Fatalf("Expected error with %s. Out: %s", dockerfilePath, out)
}
+ if !strings.Contains(out, "must be within the build context") && !strings.Contains(out, "Cannot locate Dockerfile") {
+ t.Fatalf("Unexpected error with %s. Out: %s", dockerfilePath, out)
+ }
deleteImages(name)
}
@@ -4656,3 +5264,336 @@ func TestBuildDockerfileOutsideContext(t *testing.T) {
logDone("build - Dockerfile outside context")
}
+
+func TestBuildSpaces(t *testing.T) {
+ // Test to make sure that leading/trailing spaces on a command
+ // doesn't change the error msg we get
+ var (
+ err1 error
+ err2 error
+ )
+
+ name := "testspaces"
+ defer deleteImages(name)
+ ctx, err := fakeContext("FROM busybox\nCOPY\n",
+ map[string]string{
+ "Dockerfile": "FROM busybox\nCOPY\n",
+ })
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer ctx.Close()
+
+ if _, err1 = buildImageFromContext(name, ctx, false); err1 == nil {
+ t.Fatal("Build 1 was supposed to fail, but didn't")
+ }
+
+ ctx.Add("Dockerfile", "FROM busybox\nCOPY ")
+ if _, err2 = buildImageFromContext(name, ctx, false); err2 == nil {
+ t.Fatal("Build 2 was supposed to fail, but didn't")
+ }
+
+ removeLogTimestamps := func(s string) string {
+ return regexp.MustCompile(`time="(.*?)"`).ReplaceAllString(s, `time=[TIMESTAMP]`)
+ }
+
+ // Skip over the times
+ e1 := removeLogTimestamps(err1.Error())
+ e2 := removeLogTimestamps(err2.Error())
+
+ // Ignore whitespace since that's what were verifying doesn't change stuff
+ if strings.Replace(e1, " ", "", -1) != strings.Replace(e2, " ", "", -1) {
+ t.Fatalf("Build 2's error wasn't the same as build 1's\n1:%s\n2:%s", err1, err2)
+ }
+
+ ctx.Add("Dockerfile", "FROM busybox\n COPY")
+ if _, err2 = buildImageFromContext(name, ctx, false); err2 == nil {
+ t.Fatal("Build 3 was supposed to fail, but didn't")
+ }
+
+ // Skip over the times
+ e1 = removeLogTimestamps(err1.Error())
+ e2 = removeLogTimestamps(err2.Error())
+
+ // Ignore whitespace since that's what were verifying doesn't change stuff
+ if strings.Replace(e1, " ", "", -1) != strings.Replace(e2, " ", "", -1) {
+ t.Fatalf("Build 3's error wasn't the same as build 1's\n1:%s\n3:%s", err1, err2)
+ }
+
+ ctx.Add("Dockerfile", "FROM busybox\n COPY ")
+ if _, err2 = buildImageFromContext(name, ctx, false); err2 == nil {
+ t.Fatal("Build 4 was supposed to fail, but didn't")
+ }
+
+ // Skip over the times
+ e1 = removeLogTimestamps(err1.Error())
+ e2 = removeLogTimestamps(err2.Error())
+
+ // Ignore whitespace since that's what were verifying doesn't change stuff
+ if strings.Replace(e1, " ", "", -1) != strings.Replace(e2, " ", "", -1) {
+ t.Fatalf("Build 4's error wasn't the same as build 1's\n1:%s\n4:%s", err1, err2)
+ }
+
+ logDone("build - test spaces")
+}
+
+func TestBuildSpacesWithQuotes(t *testing.T) {
+ // Test to make sure that spaces in quotes aren't lost
+ name := "testspacesquotes"
+ defer deleteImages(name)
+
+ dockerfile := `FROM busybox
+RUN echo " \
+ foo "`
+
+ _, out, err := buildImageWithOut(name, dockerfile, false)
+ if err != nil {
+ t.Fatal("Build failed:", err)
+ }
+
+ expecting := "\n foo \n"
+ if !strings.Contains(out, expecting) {
+ t.Fatalf("Bad output: %q expecting to contian %q", out, expecting)
+ }
+
+ logDone("build - test spaces with quotes")
+}
+
+// #4393
+func TestBuildVolumeFileExistsinContainer(t *testing.T) {
+ buildCmd := exec.Command(dockerBinary, "build", "-t", "docker-test-errcreatevolumewithfile", "-")
+ buildCmd.Stdin = strings.NewReader(`
+ FROM busybox
+ RUN touch /foo
+ VOLUME /foo
+ `)
+
+ out, _, err := runCommandWithOutput(buildCmd)
+ if err == nil || !strings.Contains(out, "file exists") {
+ t.Fatalf("expected build to fail when file exists in container at requested volume path")
+ }
+
+ logDone("build - errors when volume is specified where a file exists")
+}
+
+func TestBuildMissingArgs(t *testing.T) {
+ // Test to make sure that all Dockerfile commands (except the ones listed
+ // in skipCmds) will generate an error if no args are provided.
+ // Note: INSERT is deprecated so we exclude it because of that.
+ skipCmds := map[string]struct{}{
+ "CMD": {},
+ "RUN": {},
+ "ENTRYPOINT": {},
+ "INSERT": {},
+ }
+
+ defer deleteAllContainers()
+
+ for cmd := range command.Commands {
+ cmd = strings.ToUpper(cmd)
+ if _, ok := skipCmds[cmd]; ok {
+ continue
+ }
+
+ var dockerfile string
+ if cmd == "FROM" {
+ dockerfile = cmd
+ } else {
+ // Add FROM to make sure we don't complain about it missing
+ dockerfile = "FROM busybox\n" + cmd
+ }
+
+ ctx, err := fakeContext(dockerfile, map[string]string{})
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer ctx.Close()
+ var out string
+ if out, err = buildImageFromContext("args", ctx, true); err == nil {
+ t.Fatalf("%s was supposed to fail. Out:%s", cmd, out)
+ }
+ if !strings.Contains(err.Error(), cmd+" requires") {
+ t.Fatalf("%s returned the wrong type of error:%s", cmd, err)
+ }
+ }
+
+ logDone("build - verify missing args")
+}
+
+func TestBuildEmptyScratch(t *testing.T) {
+ defer deleteImages("sc")
+ _, out, err := buildImageWithOut("sc", "FROM scratch", true)
+ if err == nil {
+ t.Fatalf("Build was supposed to fail")
+ }
+ if !strings.Contains(out, "No image was generated") {
+ t.Fatalf("Wrong error message: %v", out)
+ }
+ logDone("build - empty scratch Dockerfile")
+}
+
+func TestBuildDotDotFile(t *testing.T) {
+ defer deleteImages("sc")
+ ctx, err := fakeContext("FROM busybox\n",
+ map[string]string{
+ "..gitme": "",
+ })
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer ctx.Close()
+
+ if _, err = buildImageFromContext("sc", ctx, false); err != nil {
+ t.Fatalf("Build was supposed to work: %s", err)
+ }
+ logDone("build - ..file")
+}
+
+func TestBuildNotVerbose(t *testing.T) {
+ defer deleteAllContainers()
+ defer deleteImages("verbose")
+
+ ctx, err := fakeContext("FROM busybox\nENV abc=hi\nRUN echo $abc there", map[string]string{})
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer ctx.Close()
+
+ // First do it w/verbose - baseline
+ buildCmd := exec.Command(dockerBinary, "build", "--no-cache", "-t", "verbose", ".")
+ buildCmd.Dir = ctx.Dir
+ out, _, err := runCommandWithOutput(buildCmd)
+ if err != nil {
+ t.Fatalf("failed to build the image w/o -q: %s, %v", out, err)
+ }
+ if !strings.Contains(out, "hi there") {
+ t.Fatalf("missing output:%s\n", out)
+ }
+
+ // Now do it w/o verbose
+ buildCmd = exec.Command(dockerBinary, "build", "--no-cache", "-q", "-t", "verbose", ".")
+ buildCmd.Dir = ctx.Dir
+ out, _, err = runCommandWithOutput(buildCmd)
+ if err != nil {
+ t.Fatalf("failed to build the image w/ -q: %s, %v", out, err)
+ }
+ if strings.Contains(out, "hi there") {
+ t.Fatalf("Bad output, should not contain 'hi there':%s", out)
+ }
+
+ logDone("build - not verbose")
+}
+
+func TestBuildRUNoneJSON(t *testing.T) {
+ name := "testbuildrunonejson"
+
+ defer deleteAllContainers()
+ defer deleteImages(name)
+
+ ctx, err := fakeContext(`FROM hello-world:frozen
+RUN [ "/hello" ]`, map[string]string{})
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer ctx.Close()
+
+ buildCmd := exec.Command(dockerBinary, "build", "--no-cache", "-t", name, ".")
+ buildCmd.Dir = ctx.Dir
+ out, _, err := runCommandWithOutput(buildCmd)
+ if err != nil {
+ t.Fatalf("failed to build the image: %s, %v", out, err)
+ }
+
+ if !strings.Contains(out, "Hello from Docker") {
+ t.Fatalf("bad output: %s", out)
+ }
+
+ logDone("build - RUN with one JSON arg")
+}
+
+func TestBuildResourceConstraintsAreUsed(t *testing.T) {
+ name := "testbuildresourceconstraints"
+ defer deleteAllContainers()
+ defer deleteImages(name)
+
+ ctx, err := fakeContext(`
+ FROM hello-world:frozen
+ RUN ["/hello"]
+ `, map[string]string{})
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ cmd := exec.Command(dockerBinary, "build", "--rm=false", "--memory=64m", "--memory-swap=-1", "--cpuset-cpus=1", "--cpu-shares=100", "-t", name, ".")
+ cmd.Dir = ctx.Dir
+
+ out, _, err := runCommandWithOutput(cmd)
+ if err != nil {
+ t.Fatal(err, out)
+ }
+ out, _, err = dockerCmd(t, "ps", "-lq")
+ if err != nil {
+ t.Fatal(err, out)
+ }
+
+ cID := stripTrailingCharacters(out)
+
+ type hostConfig struct {
+ Memory float64 // Use float64 here since the json decoder sees it that way
+ MemorySwap int
+ CpusetCpus string
+ CpuShares int
+ }
+
+ cfg, err := inspectFieldJSON(cID, "HostConfig")
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ var c1 hostConfig
+ if err := json.Unmarshal([]byte(cfg), &c1); err != nil {
+ t.Fatal(err, cfg)
+ }
+ mem := int64(c1.Memory)
+ if mem != 67108864 || c1.MemorySwap != -1 || c1.CpusetCpus != "1" || c1.CpuShares != 100 {
+ t.Fatalf("resource constraints not set properly:\nMemory: %d, MemSwap: %d, CpusetCpus: %s, CpuShares: %d",
+ mem, c1.MemorySwap, c1.CpusetCpus, c1.CpuShares)
+ }
+
+ // Make sure constraints aren't saved to image
+ _, _, err = dockerCmd(t, "run", "--name=test", name)
+ if err != nil {
+ t.Fatal(err)
+ }
+ cfg, err = inspectFieldJSON("test", "HostConfig")
+ if err != nil {
+ t.Fatal(err)
+ }
+ var c2 hostConfig
+ if err := json.Unmarshal([]byte(cfg), &c2); err != nil {
+ t.Fatal(err, cfg)
+ }
+ mem = int64(c2.Memory)
+ if mem == 67108864 || c2.MemorySwap == -1 || c2.CpusetCpus == "1" || c2.CpuShares == 100 {
+ t.Fatalf("resource constraints leaked from build:\nMemory: %d, MemSwap: %d, CpusetCpus: %s, CpuShares: %d",
+ mem, c2.MemorySwap, c2.CpusetCpus, c2.CpuShares)
+ }
+
+ logDone("build - resource constraints applied")
+}
+
+func TestBuildEmptyStringVolume(t *testing.T) {
+ name := "testbuildemptystringvolume"
+ defer deleteImages(name)
+
+ _, err := buildImage(name, `
+ FROM busybox
+ ENV foo=""
+ VOLUME $foo
+ `, false)
+ if err == nil {
+ t.Fatal("Should have failed to build")
+ }
+
+ logDone("build - empty string volume")
+}
diff --git a/integration-cli/docker_cli_by_digest_test.go b/integration-cli/docker_cli_by_digest_test.go
new file mode 100644
index 0000000000..24ebf0cf70
--- /dev/null
+++ b/integration-cli/docker_cli_by_digest_test.go
@@ -0,0 +1,535 @@
+package main
+
+import (
+ "fmt"
+ "os/exec"
+ "regexp"
+ "strings"
+ "testing"
+
+ "github.com/docker/docker/utils"
+)
+
+var (
+ repoName = fmt.Sprintf("%v/dockercli/busybox-by-dgst", privateRegistryURL)
+ digestRegex = regexp.MustCompile("Digest: ([^\n]+)")
+)
+
+func setupImage() (string, error) {
+ return setupImageWithTag("latest")
+}
+
+func setupImageWithTag(tag string) (string, error) {
+ containerName := "busyboxbydigest"
+
+ c := exec.Command(dockerBinary, "run", "-d", "-e", "digest=1", "--name", containerName, "busybox")
+ if _, err := runCommand(c); err != nil {
+ return "", err
+ }
+
+ // tag the image to upload it to the private registry
+ repoAndTag := utils.ImageReference(repoName, tag)
+ c = exec.Command(dockerBinary, "commit", containerName, repoAndTag)
+ if out, _, err := runCommandWithOutput(c); err != nil {
+ return "", fmt.Errorf("image tagging failed: %s, %v", out, err)
+ }
+ defer deleteImages(repoAndTag)
+
+ // delete the container as we don't need it any more
+ if err := deleteContainer(containerName); err != nil {
+ return "", err
+ }
+
+ // push the image
+ c = exec.Command(dockerBinary, "push", repoAndTag)
+ out, _, err := runCommandWithOutput(c)
+ if err != nil {
+ return "", fmt.Errorf("pushing the image to the private registry has failed: %s, %v", out, err)
+ }
+
+ // delete our local repo that we previously tagged
+ c = exec.Command(dockerBinary, "rmi", repoAndTag)
+ if out, _, err := runCommandWithOutput(c); err != nil {
+ return "", fmt.Errorf("error deleting images prior to real test: %s, %v", out, err)
+ }
+
+ // the push output includes "Digest: <digest>", so find that
+ matches := digestRegex.FindStringSubmatch(out)
+ if len(matches) != 2 {
+ return "", fmt.Errorf("unable to parse digest from push output: %s", out)
+ }
+ pushDigest := matches[1]
+
+ return pushDigest, nil
+}
+
+func TestPullByTagDisplaysDigest(t *testing.T) {
+ defer setupRegistry(t)()
+
+ pushDigest, err := setupImage()
+ if err != nil {
+ t.Fatalf("error setting up image: %v", err)
+ }
+
+ // pull from the registry using the tag
+ c := exec.Command(dockerBinary, "pull", repoName)
+ out, _, err := runCommandWithOutput(c)
+ if err != nil {
+ t.Fatalf("error pulling by tag: %s, %v", out, err)
+ }
+ defer deleteImages(repoName)
+
+ // the pull output includes "Digest: <digest>", so find that
+ matches := digestRegex.FindStringSubmatch(out)
+ if len(matches) != 2 {
+ t.Fatalf("unable to parse digest from pull output: %s", out)
+ }
+ pullDigest := matches[1]
+
+ // make sure the pushed and pull digests match
+ if pushDigest != pullDigest {
+ t.Fatalf("push digest %q didn't match pull digest %q", pushDigest, pullDigest)
+ }
+
+ logDone("by_digest - pull by tag displays digest")
+}
+
+func TestPullByDigest(t *testing.T) {
+ defer setupRegistry(t)()
+
+ pushDigest, err := setupImage()
+ if err != nil {
+ t.Fatalf("error setting up image: %v", err)
+ }
+
+ // pull from the registry using the <name>@<digest> reference
+ imageReference := fmt.Sprintf("%s@%s", repoName, pushDigest)
+ c := exec.Command(dockerBinary, "pull", imageReference)
+ out, _, err := runCommandWithOutput(c)
+ if err != nil {
+ t.Fatalf("error pulling by digest: %s, %v", out, err)
+ }
+ defer deleteImages(imageReference)
+
+ // the pull output includes "Digest: <digest>", so find that
+ matches := digestRegex.FindStringSubmatch(out)
+ if len(matches) != 2 {
+ t.Fatalf("unable to parse digest from pull output: %s", out)
+ }
+ pullDigest := matches[1]
+
+ // make sure the pushed and pull digests match
+ if pushDigest != pullDigest {
+ t.Fatalf("push digest %q didn't match pull digest %q", pushDigest, pullDigest)
+ }
+
+ logDone("by_digest - pull by digest")
+}
+
+func TestCreateByDigest(t *testing.T) {
+ defer setupRegistry(t)()
+
+ pushDigest, err := setupImage()
+ if err != nil {
+ t.Fatalf("error setting up image: %v", err)
+ }
+
+ imageReference := fmt.Sprintf("%s@%s", repoName, pushDigest)
+
+ containerName := "createByDigest"
+ c := exec.Command(dockerBinary, "create", "--name", containerName, imageReference)
+ out, _, err := runCommandWithOutput(c)
+ if err != nil {
+ t.Fatalf("error creating by digest: %s, %v", out, err)
+ }
+ defer deleteContainer(containerName)
+
+ res, err := inspectField(containerName, "Config.Image")
+ if err != nil {
+ t.Fatalf("failed to get Config.Image: %s, %v", out, err)
+ }
+ if res != imageReference {
+ t.Fatalf("unexpected Config.Image: %s (expected %s)", res, imageReference)
+ }
+
+ logDone("by_digest - create by digest")
+}
+
+func TestRunByDigest(t *testing.T) {
+ defer setupRegistry(t)()
+
+ pushDigest, err := setupImage()
+ if err != nil {
+ t.Fatalf("error setting up image: %v", err)
+ }
+
+ imageReference := fmt.Sprintf("%s@%s", repoName, pushDigest)
+
+ containerName := "runByDigest"
+ c := exec.Command(dockerBinary, "run", "--name", containerName, imageReference, "sh", "-c", "echo found=$digest")
+ out, _, err := runCommandWithOutput(c)
+ if err != nil {
+ t.Fatalf("error run by digest: %s, %v", out, err)
+ }
+ defer deleteContainer(containerName)
+
+ foundRegex := regexp.MustCompile("found=([^\n]+)")
+ matches := foundRegex.FindStringSubmatch(out)
+ if len(matches) != 2 {
+ t.Fatalf("error locating expected 'found=1' output: %s", out)
+ }
+ if matches[1] != "1" {
+ t.Fatalf("Expected %q, got %q", "1", matches[1])
+ }
+
+ res, err := inspectField(containerName, "Config.Image")
+ if err != nil {
+ t.Fatalf("failed to get Config.Image: %s, %v", out, err)
+ }
+ if res != imageReference {
+ t.Fatalf("unexpected Config.Image: %s (expected %s)", res, imageReference)
+ }
+
+ logDone("by_digest - run by digest")
+}
+
+func TestRemoveImageByDigest(t *testing.T) {
+ defer setupRegistry(t)()
+
+ digest, err := setupImage()
+ if err != nil {
+ t.Fatalf("error setting up image: %v", err)
+ }
+
+ imageReference := fmt.Sprintf("%s@%s", repoName, digest)
+
+ // pull from the registry using the <name>@<digest> reference
+ c := exec.Command(dockerBinary, "pull", imageReference)
+ out, _, err := runCommandWithOutput(c)
+ if err != nil {
+ t.Fatalf("error pulling by digest: %s, %v", out, err)
+ }
+
+ // make sure inspect runs ok
+ if _, err := inspectField(imageReference, "Id"); err != nil {
+ t.Fatalf("failed to inspect image: %v", err)
+ }
+
+ // do the delete
+ if err := deleteImages(imageReference); err != nil {
+ t.Fatalf("unexpected error deleting image: %v", err)
+ }
+
+ // try to inspect again - it should error this time
+ if _, err := inspectField(imageReference, "Id"); err == nil {
+ t.Fatalf("unexpected nil err trying to inspect what should be a non-existent image")
+ } else if !strings.Contains(err.Error(), "No such image") {
+ t.Fatalf("expected 'No such image' output, got %v", err)
+ }
+
+ logDone("by_digest - remove image by digest")
+}
+
+func TestBuildByDigest(t *testing.T) {
+ defer setupRegistry(t)()
+
+ digest, err := setupImage()
+ if err != nil {
+ t.Fatalf("error setting up image: %v", err)
+ }
+
+ imageReference := fmt.Sprintf("%s@%s", repoName, digest)
+
+ // pull from the registry using the <name>@<digest> reference
+ c := exec.Command(dockerBinary, "pull", imageReference)
+ out, _, err := runCommandWithOutput(c)
+ if err != nil {
+ t.Fatalf("error pulling by digest: %s, %v", out, err)
+ }
+
+ // get the image id
+ imageID, err := inspectField(imageReference, "Id")
+ if err != nil {
+ t.Fatalf("error getting image id: %v", err)
+ }
+
+ // do the build
+ name := "buildbydigest"
+ defer deleteImages(name)
+ _, err = buildImage(name, fmt.Sprintf(
+ `FROM %s
+ CMD ["/bin/echo", "Hello World"]`, imageReference),
+ true)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // get the build's image id
+ res, err := inspectField(name, "Config.Image")
+ if err != nil {
+ t.Fatal(err)
+ }
+ // make sure they match
+ if res != imageID {
+ t.Fatalf("Image %s, expected %s", res, imageID)
+ }
+
+ logDone("by_digest - build by digest")
+}
+
+func TestTagByDigest(t *testing.T) {
+ defer setupRegistry(t)()
+
+ digest, err := setupImage()
+ if err != nil {
+ t.Fatalf("error setting up image: %v", err)
+ }
+
+ imageReference := fmt.Sprintf("%s@%s", repoName, digest)
+
+ // pull from the registry using the <name>@<digest> reference
+ c := exec.Command(dockerBinary, "pull", imageReference)
+ out, _, err := runCommandWithOutput(c)
+ if err != nil {
+ t.Fatalf("error pulling by digest: %s, %v", out, err)
+ }
+
+ // tag it
+ tag := "tagbydigest"
+ c = exec.Command(dockerBinary, "tag", imageReference, tag)
+ if _, err := runCommand(c); err != nil {
+ t.Fatalf("unexpected error tagging: %v", err)
+ }
+
+ expectedID, err := inspectField(imageReference, "Id")
+ if err != nil {
+ t.Fatalf("error getting original image id: %v", err)
+ }
+
+ tagID, err := inspectField(tag, "Id")
+ if err != nil {
+ t.Fatalf("error getting tagged image id: %v", err)
+ }
+
+ if tagID != expectedID {
+ t.Fatalf("expected image id %q, got %q", expectedID, tagID)
+ }
+
+ logDone("by_digest - tag by digest")
+}
+
+func TestListImagesWithoutDigests(t *testing.T) {
+ defer setupRegistry(t)()
+
+ digest, err := setupImage()
+ if err != nil {
+ t.Fatalf("error setting up image: %v", err)
+ }
+
+ imageReference := fmt.Sprintf("%s@%s", repoName, digest)
+
+ // pull from the registry using the <name>@<digest> reference
+ c := exec.Command(dockerBinary, "pull", imageReference)
+ out, _, err := runCommandWithOutput(c)
+ if err != nil {
+ t.Fatalf("error pulling by digest: %s, %v", out, err)
+ }
+
+ c = exec.Command(dockerBinary, "images")
+ out, _, err = runCommandWithOutput(c)
+ if err != nil {
+ t.Fatalf("error listing images: %s, %v", out, err)
+ }
+
+ if strings.Contains(out, "DIGEST") {
+ t.Fatalf("list output should not have contained DIGEST header: %s", out)
+ }
+
+ logDone("by_digest - list images - digest header not displayed by default")
+}
+
+func TestListImagesWithDigests(t *testing.T) {
+ defer setupRegistry(t)()
+ defer deleteImages(repoName+":tag1", repoName+":tag2")
+
+ // setup image1
+ digest1, err := setupImageWithTag("tag1")
+ if err != nil {
+ t.Fatalf("error setting up image: %v", err)
+ }
+ imageReference1 := fmt.Sprintf("%s@%s", repoName, digest1)
+ defer deleteImages(imageReference1)
+ t.Logf("imageReference1 = %s", imageReference1)
+
+ // pull image1 by digest
+ c := exec.Command(dockerBinary, "pull", imageReference1)
+ out, _, err := runCommandWithOutput(c)
+ if err != nil {
+ t.Fatalf("error pulling by digest: %s, %v", out, err)
+ }
+
+ // list images
+ c = exec.Command(dockerBinary, "images", "--digests")
+ out, _, err = runCommandWithOutput(c)
+ if err != nil {
+ t.Fatalf("error listing images: %s, %v", out, err)
+ }
+
+ // make sure repo shown, tag=<none>, digest = $digest1
+ re1 := regexp.MustCompile(`\s*` + repoName + `\s*<none>\s*` + digest1 + `\s`)
+ if !re1.MatchString(out) {
+ t.Fatalf("expected %q: %s", re1.String(), out)
+ }
+
+ // setup image2
+ digest2, err := setupImageWithTag("tag2")
+ if err != nil {
+ t.Fatalf("error setting up image: %v", err)
+ }
+ imageReference2 := fmt.Sprintf("%s@%s", repoName, digest2)
+ defer deleteImages(imageReference2)
+ t.Logf("imageReference2 = %s", imageReference2)
+
+ // pull image1 by digest
+ c = exec.Command(dockerBinary, "pull", imageReference1)
+ out, _, err = runCommandWithOutput(c)
+ if err != nil {
+ t.Fatalf("error pulling by digest: %s, %v", out, err)
+ }
+
+ // pull image2 by digest
+ c = exec.Command(dockerBinary, "pull", imageReference2)
+ out, _, err = runCommandWithOutput(c)
+ if err != nil {
+ t.Fatalf("error pulling by digest: %s, %v", out, err)
+ }
+
+ // list images
+ c = exec.Command(dockerBinary, "images", "--digests")
+ out, _, err = runCommandWithOutput(c)
+ if err != nil {
+ t.Fatalf("error listing images: %s, %v", out, err)
+ }
+
+ // make sure repo shown, tag=<none>, digest = $digest1
+ if !re1.MatchString(out) {
+ t.Fatalf("expected %q: %s", re1.String(), out)
+ }
+
+ // make sure repo shown, tag=<none>, digest = $digest2
+ re2 := regexp.MustCompile(`\s*` + repoName + `\s*<none>\s*` + digest2 + `\s`)
+ if !re2.MatchString(out) {
+ t.Fatalf("expected %q: %s", re2.String(), out)
+ }
+
+ // pull tag1
+ c = exec.Command(dockerBinary, "pull", repoName+":tag1")
+ out, _, err = runCommandWithOutput(c)
+ if err != nil {
+ t.Fatalf("error pulling tag1: %s, %v", out, err)
+ }
+
+ // list images
+ c = exec.Command(dockerBinary, "images", "--digests")
+ out, _, err = runCommandWithOutput(c)
+ if err != nil {
+ t.Fatalf("error listing images: %s, %v", out, err)
+ }
+
+ // make sure image 1 has repo, tag, <none> AND repo, <none>, digest
+ reWithTag1 := regexp.MustCompile(`\s*` + repoName + `\s*tag1\s*<none>\s`)
+ reWithDigest1 := regexp.MustCompile(`\s*` + repoName + `\s*<none>\s*` + digest1 + `\s`)
+ if !reWithTag1.MatchString(out) {
+ t.Fatalf("expected %q: %s", reWithTag1.String(), out)
+ }
+ if !reWithDigest1.MatchString(out) {
+ t.Fatalf("expected %q: %s", reWithDigest1.String(), out)
+ }
+ // make sure image 2 has repo, <none>, digest
+ if !re2.MatchString(out) {
+ t.Fatalf("expected %q: %s", re2.String(), out)
+ }
+
+ // pull tag 2
+ c = exec.Command(dockerBinary, "pull", repoName+":tag2")
+ out, _, err = runCommandWithOutput(c)
+ if err != nil {
+ t.Fatalf("error pulling tag2: %s, %v", out, err)
+ }
+
+ // list images
+ c = exec.Command(dockerBinary, "images", "--digests")
+ out, _, err = runCommandWithOutput(c)
+ if err != nil {
+ t.Fatalf("error listing images: %s, %v", out, err)
+ }
+
+ // make sure image 1 has repo, tag, digest
+ if !reWithTag1.MatchString(out) {
+ t.Fatalf("expected %q: %s", re1.String(), out)
+ }
+
+ // make sure image 2 has repo, tag, digest
+ reWithTag2 := regexp.MustCompile(`\s*` + repoName + `\s*tag2\s*<none>\s`)
+ reWithDigest2 := regexp.MustCompile(`\s*` + repoName + `\s*<none>\s*` + digest2 + `\s`)
+ if !reWithTag2.MatchString(out) {
+ t.Fatalf("expected %q: %s", reWithTag2.String(), out)
+ }
+ if !reWithDigest2.MatchString(out) {
+ t.Fatalf("expected %q: %s", reWithDigest2.String(), out)
+ }
+
+ // list images
+ c = exec.Command(dockerBinary, "images", "--digests")
+ out, _, err = runCommandWithOutput(c)
+ if err != nil {
+ t.Fatalf("error listing images: %s, %v", out, err)
+ }
+
+ // make sure image 1 has repo, tag, digest
+ if !reWithTag1.MatchString(out) {
+ t.Fatalf("expected %q: %s", re1.String(), out)
+ }
+ // make sure image 2 has repo, tag, digest
+ if !reWithTag2.MatchString(out) {
+ t.Fatalf("expected %q: %s", re2.String(), out)
+ }
+ // make sure busybox has tag, but not digest
+ busyboxRe := regexp.MustCompile(`\s*busybox\s*latest\s*<none>\s`)
+ if !busyboxRe.MatchString(out) {
+ t.Fatalf("expected %q: %s", busyboxRe.String(), out)
+ }
+
+ logDone("by_digest - list images with digests")
+}
+
+func TestDeleteImageByIDOnlyPulledByDigest(t *testing.T) {
+ defer setupRegistry(t)()
+
+ pushDigest, err := setupImage()
+ if err != nil {
+ t.Fatalf("error setting up image: %v", err)
+ }
+
+ // pull from the registry using the <name>@<digest> reference
+ imageReference := fmt.Sprintf("%s@%s", repoName, pushDigest)
+ c := exec.Command(dockerBinary, "pull", imageReference)
+ out, _, err := runCommandWithOutput(c)
+ if err != nil {
+ t.Fatalf("error pulling by digest: %s, %v", out, err)
+ }
+ // just in case...
+ defer deleteImages(imageReference)
+
+ imageID, err := inspectField(imageReference, ".Id")
+ if err != nil {
+ t.Fatalf("error inspecting image id: %v", err)
+ }
+
+ c = exec.Command(dockerBinary, "rmi", imageID)
+ if _, err := runCommand(c); err != nil {
+ t.Fatalf("error deleting image by id: %v", err)
+ }
+
+ logDone("by_digest - delete image by id only pulled by digest")
+}
diff --git a/integration-cli/docker_cli_commit_test.go b/integration-cli/docker_cli_commit_test.go
index f41361ece4..8d596bdda1 100644
--- a/integration-cli/docker_cli_commit_test.go
+++ b/integration-cli/docker_cli_commit_test.go
@@ -72,7 +72,47 @@ func TestCommitWithoutPause(t *testing.T) {
logDone("commit - echo foo and commit the image with --pause=false")
}
+//test commit a paused container should not unpause it after commit
+func TestCommitPausedContainer(t *testing.T) {
+ defer deleteAllContainers()
+ defer unpauseAllContainers()
+ cmd := exec.Command(dockerBinary, "run", "-i", "-d", "busybox")
+ out, _, _, err := runCommandWithStdoutStderr(cmd)
+ if err != nil {
+ t.Fatalf("failed to run container: %v, output: %q", err, out)
+ }
+
+ cleanedContainerID := stripTrailingCharacters(out)
+ cmd = exec.Command(dockerBinary, "pause", cleanedContainerID)
+ out, _, _, err = runCommandWithStdoutStderr(cmd)
+ if err != nil {
+ t.Fatalf("failed to pause container: %v, output: %q", err, out)
+ }
+
+ commitCmd := exec.Command(dockerBinary, "commit", cleanedContainerID)
+ out, _, err = runCommandWithOutput(commitCmd)
+ if err != nil {
+ t.Fatalf("failed to commit container to image: %s, %v", out, err)
+ }
+ cleanedImageID := stripTrailingCharacters(out)
+ defer deleteImages(cleanedImageID)
+
+ cmd = exec.Command(dockerBinary, "inspect", "-f", "{{.State.Paused}}", cleanedContainerID)
+ out, _, _, err = runCommandWithStdoutStderr(cmd)
+ if err != nil {
+ t.Fatalf("failed to inspect container: %v, output: %q", err, out)
+ }
+
+ if !strings.Contains(out, "true") {
+ t.Fatalf("commit should not unpause a paused container")
+ }
+
+ logDone("commit - commit a paused container will not unpause it")
+}
+
func TestCommitNewFile(t *testing.T) {
+ defer deleteAllContainers()
+
cmd := exec.Command(dockerBinary, "run", "--name", "commiter", "busybox", "/bin/sh", "-c", "echo koye > /foo")
if _, err := runCommand(cmd); err != nil {
t.Fatal(err)
@@ -84,6 +124,7 @@ func TestCommitNewFile(t *testing.T) {
t.Fatal(err)
}
imageID = strings.Trim(imageID, "\r\n")
+ defer deleteImages(imageID)
cmd = exec.Command(dockerBinary, "run", imageID, "cat", "/foo")
@@ -95,13 +136,12 @@ func TestCommitNewFile(t *testing.T) {
t.Fatalf("expected output koye received %q", actual)
}
- deleteAllContainers()
- deleteImages(imageID)
-
logDone("commit - commit file and read")
}
func TestCommitHardlink(t *testing.T) {
+ defer deleteAllContainers()
+
cmd := exec.Command(dockerBinary, "run", "-t", "--name", "hardlinks", "busybox", "sh", "-c", "touch file1 && ln file1 file2 && ls -di file1 file2")
firstOuput, _, err := runCommandWithOutput(cmd)
if err != nil {
@@ -127,6 +167,7 @@ func TestCommitHardlink(t *testing.T) {
t.Fatal(imageID, err)
}
imageID = strings.Trim(imageID, "\r\n")
+ defer deleteImages(imageID)
cmd = exec.Command(dockerBinary, "run", "-t", "hardlinks", "ls", "-di", "file1", "file2")
secondOuput, _, err := runCommandWithOutput(cmd)
@@ -147,9 +188,6 @@ func TestCommitHardlink(t *testing.T) {
t.Fatalf("Failed to create hardlink in a container. Expected to find %q in %q", inode, chunks[1:])
}
- deleteAllContainers()
- deleteImages(imageID)
-
logDone("commit - commit hardlinks")
}
@@ -178,6 +216,8 @@ func TestCommitTTY(t *testing.T) {
}
func TestCommitWithHostBindMount(t *testing.T) {
+ defer deleteAllContainers()
+
cmd := exec.Command(dockerBinary, "run", "--name", "bind-commit", "-v", "/dev/null:/winning", "busybox", "true")
if _, err := runCommand(cmd); err != nil {
t.Fatal(err)
@@ -190,6 +230,7 @@ func TestCommitWithHostBindMount(t *testing.T) {
}
imageID = strings.Trim(imageID, "\r\n")
+ defer deleteImages(imageID)
cmd = exec.Command(dockerBinary, "run", "bindtest", "true")
@@ -197,8 +238,44 @@ func TestCommitWithHostBindMount(t *testing.T) {
t.Fatal(err)
}
- deleteAllContainers()
- deleteImages(imageID)
-
logDone("commit - commit bind mounted file")
}
+
+func TestCommitChange(t *testing.T) {
+ defer deleteAllContainers()
+
+ cmd := exec.Command(dockerBinary, "run", "--name", "test", "busybox", "true")
+ if _, err := runCommand(cmd); err != nil {
+ t.Fatal(err)
+ }
+
+ cmd = exec.Command(dockerBinary, "commit",
+ "--change", "EXPOSE 8080",
+ "--change", "ENV DEBUG true",
+ "--change", "ENV test 1",
+ "--change", "ENV PATH /foo",
+ "test", "test-commit")
+ imageId, _, err := runCommandWithOutput(cmd)
+ if err != nil {
+ t.Fatal(imageId, err)
+ }
+ imageId = strings.Trim(imageId, "\r\n")
+ defer deleteImages(imageId)
+
+ expected := map[string]string{
+ "Config.ExposedPorts": "map[8080/tcp:map[]]",
+ "Config.Env": "[DEBUG=true test=1 PATH=/foo]",
+ }
+
+ for conf, value := range expected {
+ res, err := inspectField(imageId, conf)
+ if err != nil {
+ t.Errorf("failed to get value %s, error: %s", conf, err)
+ }
+ if res != value {
+ t.Errorf("%s('%s'), expected %s", conf, res, value)
+ }
+ }
+
+ logDone("commit - commit --change")
+}
diff --git a/integration-cli/docker_cli_cp_test.go b/integration-cli/docker_cli_cp_test.go
index 7002e1a34a..db5f363882 100644
--- a/integration-cli/docker_cli_cp_test.go
+++ b/integration-cli/docker_cli_cp_test.go
@@ -6,7 +6,9 @@ import (
"io/ioutil"
"os"
"os/exec"
+ "path"
"path/filepath"
+ "strings"
"testing"
)
@@ -57,7 +59,7 @@ func TestCpGarbagePath(t *testing.T) {
tmpname := filepath.Join(tmpdir, cpTestName)
defer os.RemoveAll(tmpdir)
- path := filepath.Join("../../../../../../../../../../../../", cpFullPath)
+ path := path.Join("../../../../../../../../../../../../", cpFullPath)
_, _, err = dockerCmd(t, "cp", cleanedContainerID+":"+path, tmpdir)
if err != nil {
@@ -120,11 +122,18 @@ func TestCpRelativePath(t *testing.T) {
tmpname := filepath.Join(tmpdir, cpTestName)
defer os.RemoveAll(tmpdir)
- path, _ := filepath.Rel("/", cpFullPath)
+ var relPath string
+ if path.IsAbs(cpFullPath) {
+ // normally this is `filepath.Rel("/", cpFullPath)` but we cannot
+ // get this unix-path manipulation on windows with filepath.
+ relPath = cpFullPath[1:]
+ } else {
+ t.Fatalf("path %s was assumed to be an absolute path", cpFullPath)
+ }
- _, _, err = dockerCmd(t, "cp", cleanedContainerID+":"+path, tmpdir)
+ _, _, err = dockerCmd(t, "cp", cleanedContainerID+":"+relPath, tmpdir)
if err != nil {
- t.Fatalf("couldn't copy from relative path: %s:%s %s", cleanedContainerID, path, err)
+ t.Fatalf("couldn't copy from relative path: %s:%s %s", cleanedContainerID, relPath, err)
}
file, _ := os.Open(tmpname)
@@ -247,7 +256,7 @@ func TestCpAbsoluteSymlink(t *testing.T) {
tmpname := filepath.Join(tmpdir, cpTestName)
defer os.RemoveAll(tmpdir)
- path := filepath.Join("/", "container_path")
+ path := path.Join("/", "container_path")
_, _, err = dockerCmd(t, "cp", cleanedContainerID+":"+path, tmpdir)
if err != nil {
@@ -311,7 +320,7 @@ func TestCpSymlinkComponent(t *testing.T) {
tmpname := filepath.Join(tmpdir, cpTestName)
defer os.RemoveAll(tmpdir)
- path := filepath.Join("/", "container_path", cpTestName)
+ path := path.Join("/", "container_path", cpTestName)
_, _, err = dockerCmd(t, "cp", cleanedContainerID+":"+path, tmpdir)
if err != nil {
@@ -339,6 +348,8 @@ func TestCpSymlinkComponent(t *testing.T) {
// Check that cp with unprivileged user doesn't return any error
func TestCpUnprivilegedUser(t *testing.T) {
+ testRequires(t, UnixCli) // uses chmod/su: not available on windows
+
out, exitCode, err := dockerCmd(t, "run", "-d", "busybox", "/bin/sh", "-c", "touch "+cpTestName)
if err != nil || exitCode != 0 {
t.Fatal("failed to create a container", out, err)
@@ -374,6 +385,8 @@ func TestCpUnprivilegedUser(t *testing.T) {
}
func TestCpVolumePath(t *testing.T) {
+ testRequires(t, SameHostDaemon)
+
tmpDir, err := ioutil.TempDir("", "cp-test-volumepath")
if err != nil {
t.Fatal(err)
@@ -516,3 +529,30 @@ func TestCpToDot(t *testing.T) {
}
logDone("cp - to dot path")
}
+
+func TestCpToStdout(t *testing.T) {
+ out, exitCode, err := dockerCmd(t, "run", "-d", "busybox", "/bin/sh", "-c", "echo lololol > /test")
+ if err != nil || exitCode != 0 {
+ t.Fatalf("failed to create a container:%s\n%s", out, err)
+ }
+
+ cID := stripTrailingCharacters(out)
+ defer deleteContainer(cID)
+
+ out, _, err = dockerCmd(t, "wait", cID)
+ if err != nil || stripTrailingCharacters(out) != "0" {
+ t.Fatalf("failed to set up container:%s\n%s", out, err)
+ }
+
+ out, _, err = runCommandPipelineWithOutput(
+ exec.Command(dockerBinary, "cp", cID+":/test", "-"),
+ exec.Command("tar", "-vtf", "-"))
+ if err != nil {
+ t.Fatalf("Failed to run commands: %s", err)
+ }
+
+ if !strings.Contains(out, "test") || !strings.Contains(out, "-rw") {
+ t.Fatalf("Missing file from tar TOC:\n%s", out)
+ }
+ logDone("cp - to stdout")
+}
diff --git a/integration-cli/docker_cli_create_test.go b/integration-cli/docker_cli_create_test.go
index 1192f3647d..e32400e603 100644
--- a/integration-cli/docker_cli_create_test.go
+++ b/integration-cli/docker_cli_create_test.go
@@ -2,15 +2,19 @@ package main
import (
"encoding/json"
- "github.com/docker/docker/nat"
"os"
"os/exec"
+ "reflect"
"testing"
"time"
+
+ "github.com/docker/docker/nat"
)
// Make sure we can create a simple container with some args
func TestCreateArgs(t *testing.T) {
+ defer deleteAllContainers()
+
runCmd := exec.Command(dockerBinary, "create", "busybox", "command", "arg1", "arg2", "arg with space")
out, _, _, err := runCommandWithStdoutStderr(runCmd)
if err != nil {
@@ -56,13 +60,13 @@ func TestCreateArgs(t *testing.T) {
t.Fatalf("Unexpected args. Expected %v, received: %v", expected, c.Args)
}
- deleteAllContainers()
-
logDone("create - args")
}
// Make sure we can set hostconfig options too
func TestCreateHostConfig(t *testing.T) {
+ defer deleteAllContainers()
+
runCmd := exec.Command(dockerBinary, "create", "-P", "busybox", "echo")
out, _, _, err := runCommandWithStdoutStderr(runCmd)
if err != nil {
@@ -98,12 +102,12 @@ func TestCreateHostConfig(t *testing.T) {
t.Fatalf("Expected PublishAllPorts, got false")
}
- deleteAllContainers()
-
logDone("create - hostconfig")
}
func TestCreateWithPortRange(t *testing.T) {
+ defer deleteAllContainers()
+
runCmd := exec.Command(dockerBinary, "create", "-p", "3300-3303:3300-3303/tcp", "busybox", "echo")
out, _, _, err := runCommandWithStdoutStderr(runCmd)
if err != nil {
@@ -147,12 +151,12 @@ func TestCreateWithPortRange(t *testing.T) {
}
}
- deleteAllContainers()
-
logDone("create - port range")
}
func TestCreateWithiLargePortRange(t *testing.T) {
+ defer deleteAllContainers()
+
runCmd := exec.Command(dockerBinary, "create", "-p", "1-65535:1-65535/tcp", "busybox", "echo")
out, _, _, err := runCommandWithStdoutStderr(runCmd)
if err != nil {
@@ -196,13 +200,13 @@ func TestCreateWithiLargePortRange(t *testing.T) {
}
}
- deleteAllContainers()
-
logDone("create - large port range")
}
// "test123" should be printed by docker create + start
func TestCreateEchoStdout(t *testing.T) {
+ defer deleteAllContainers()
+
runCmd := exec.Command(dockerBinary, "create", "busybox", "echo", "test123")
out, _, _, err := runCommandWithStdoutStderr(runCmd)
if err != nil {
@@ -221,12 +225,13 @@ func TestCreateEchoStdout(t *testing.T) {
t.Errorf("container should've printed 'test123', got %q", out)
}
- deleteAllContainers()
-
logDone("create - echo test123")
}
func TestCreateVolumesCreated(t *testing.T) {
+ testRequires(t, SameHostDaemon)
+ defer deleteAllContainers()
+
name := "test_create_volume"
if out, _, err := runCommandWithOutput(exec.Command(dockerBinary, "create", "--name", name, "-v", "/foo", "busybox")); err != nil {
t.Fatal(out, err)
@@ -245,3 +250,57 @@ func TestCreateVolumesCreated(t *testing.T) {
logDone("create - volumes are created")
}
+
+func TestCreateLabels(t *testing.T) {
+ name := "test_create_labels"
+ expected := map[string]string{"k1": "v1", "k2": "v2"}
+ if out, _, err := runCommandWithOutput(exec.Command(dockerBinary, "create", "--name", name, "-l", "k1=v1", "--label", "k2=v2", "busybox")); err != nil {
+ t.Fatal(out, err)
+ }
+
+ actual := make(map[string]string)
+ err := inspectFieldAndMarshall(name, "Config.Labels", &actual)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ if !reflect.DeepEqual(expected, actual) {
+ t.Fatalf("Expected %s got %s", expected, actual)
+ }
+
+ deleteAllContainers()
+
+ logDone("create - labels")
+}
+
+func TestCreateLabelFromImage(t *testing.T) {
+ imageName := "testcreatebuildlabel"
+ defer deleteImages(imageName)
+ _, err := buildImage(imageName,
+ `FROM busybox
+ LABEL k1=v1 k2=v2`,
+ true)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ name := "test_create_labels_from_image"
+ expected := map[string]string{"k2": "x", "k3": "v3", "k1": "v1"}
+ if out, _, err := runCommandWithOutput(exec.Command(dockerBinary, "create", "--name", name, "-l", "k2=x", "--label", "k3=v3", imageName)); err != nil {
+ t.Fatal(out, err)
+ }
+
+ actual := make(map[string]string)
+ err = inspectFieldAndMarshall(name, "Config.Labels", &actual)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ if !reflect.DeepEqual(expected, actual) {
+ t.Fatalf("Expected %s got %s", expected, actual)
+ }
+
+ deleteAllContainers()
+
+ logDone("create - labels from image")
+}
diff --git a/integration-cli/docker_cli_daemon_test.go b/integration-cli/docker_cli_daemon_test.go
index fb9a81c558..c515a63787 100644
--- a/integration-cli/docker_cli_daemon_test.go
+++ b/integration-cli/docker_cli_daemon_test.go
@@ -11,6 +11,7 @@ import (
"path/filepath"
"strings"
"testing"
+ "time"
"github.com/docker/libtrust"
)
@@ -137,6 +138,8 @@ func TestDaemonStartBridgeWithoutIPAssociation(t *testing.T) {
}
func TestDaemonIptablesClean(t *testing.T) {
+ defer deleteAllContainers()
+
d := NewDaemon(t)
if err := d.StartWithBusybox(); err != nil {
t.Fatalf("Could not start daemon with busybox: %v", err)
@@ -174,12 +177,12 @@ func TestDaemonIptablesClean(t *testing.T) {
t.Fatalf("iptables output should not have contained %q, but was %q", ipTablesSearchString, out)
}
- deleteAllContainers()
-
logDone("daemon - run,iptables - iptables rules cleaned after daemon restart")
}
func TestDaemonIptablesCreate(t *testing.T) {
+ defer deleteAllContainers()
+
d := NewDaemon(t)
if err := d.StartWithBusybox(); err != nil {
t.Fatalf("Could not start daemon with busybox: %v", err)
@@ -226,8 +229,6 @@ func TestDaemonIptablesCreate(t *testing.T) {
t.Fatalf("iptables output after restart should have contained %q, but was %q", ipTablesSearchString, out)
}
- deleteAllContainers()
-
logDone("daemon - run,iptables - iptables rules for always restarted container created after daemon restart")
}
@@ -244,7 +245,7 @@ func TestDaemonLoggingLevel(t *testing.T) {
}
d.Stop()
content, _ := ioutil.ReadFile(d.logFile.Name())
- if !strings.Contains(string(content), `level="debug"`) {
+ if !strings.Contains(string(content), `level=debug`) {
t.Fatalf(`Missing level="debug" in log file:\n%s`, string(content))
}
@@ -254,7 +255,7 @@ func TestDaemonLoggingLevel(t *testing.T) {
}
d.Stop()
content, _ = ioutil.ReadFile(d.logFile.Name())
- if strings.Contains(string(content), `level="debug"`) {
+ if strings.Contains(string(content), `level=debug`) {
t.Fatalf(`Should not have level="debug" in log file:\n%s`, string(content))
}
@@ -264,7 +265,7 @@ func TestDaemonLoggingLevel(t *testing.T) {
}
d.Stop()
content, _ = ioutil.ReadFile(d.logFile.Name())
- if !strings.Contains(string(content), `level="debug"`) {
+ if !strings.Contains(string(content), `level=debug`) {
t.Fatalf(`Missing level="debug" in log file using -D:\n%s`, string(content))
}
@@ -274,7 +275,7 @@ func TestDaemonLoggingLevel(t *testing.T) {
}
d.Stop()
content, _ = ioutil.ReadFile(d.logFile.Name())
- if !strings.Contains(string(content), `level="debug"`) {
+ if !strings.Contains(string(content), `level=debug`) {
t.Fatalf(`Missing level="debug" in log file using --debug:\n%s`, string(content))
}
@@ -284,7 +285,7 @@ func TestDaemonLoggingLevel(t *testing.T) {
}
d.Stop()
content, _ = ioutil.ReadFile(d.logFile.Name())
- if !strings.Contains(string(content), `level="debug"`) {
+ if !strings.Contains(string(content), `level=debug`) {
t.Fatalf(`Missing level="debug" in log file when using both --debug and --log-level=fatal:\n%s`, string(content))
}
@@ -408,7 +409,7 @@ func TestDaemonKeyMigration(t *testing.T) {
}
// Simulate an older daemon (pre 1.3) coming up with volumes specified in containers
-// without corrosponding volume json
+// without corresponding volume json
func TestDaemonUpgradeWithVolumes(t *testing.T) {
d := NewDaemon(t)
@@ -480,3 +481,350 @@ func TestDaemonUpgradeWithVolumes(t *testing.T) {
logDone("daemon - volumes from old(pre 1.3) daemon work")
}
+
+// GH#11320 - verify that the daemon exits on failure properly
+// Note that this explicitly tests the conflict of {-b,--bridge} and {--bip} options as the means
+// to get a daemon init failure; no other tests for -b/--bip conflict are therefore required
+func TestDaemonExitOnFailure(t *testing.T) {
+ d := NewDaemon(t)
+ defer d.Stop()
+
+ //attempt to start daemon with incorrect flags (we know -b and --bip conflict)
+ if err := d.Start("--bridge", "nosuchbridge", "--bip", "1.1.1.1"); err != nil {
+ //verify we got the right error
+ if !strings.Contains(err.Error(), "Daemon exited and never started") {
+ t.Fatalf("Expected daemon not to start, got %v", err)
+ }
+ // look in the log and make sure we got the message that daemon is shutting down
+ runCmd := exec.Command("grep", "Shutting down daemon due to", d.LogfileName())
+ if out, _, err := runCommandWithOutput(runCmd); err != nil {
+ t.Fatalf("Expected 'shutting down daemon due to error' message; but doesn't exist in log: %q, err: %v", out, err)
+ }
+ } else {
+ //if we didn't get an error and the daemon is running, this is a failure
+ d.Stop()
+ t.Fatal("Conflicting options should cause the daemon to error out with a failure")
+ }
+
+ logDone("daemon - verify no start on daemon init errors")
+}
+
+func TestDaemonUlimitDefaults(t *testing.T) {
+ testRequires(t, NativeExecDriver)
+ d := NewDaemon(t)
+
+ if err := d.StartWithBusybox("--default-ulimit", "nofile=42:42", "--default-ulimit", "nproc=1024:1024"); err != nil {
+ t.Fatal(err)
+ }
+
+ out, err := d.Cmd("run", "--ulimit", "nproc=2048", "--name=test", "busybox", "/bin/sh", "-c", "echo $(ulimit -n); echo $(ulimit -p)")
+ if err != nil {
+ t.Fatal(out, err)
+ }
+
+ outArr := strings.Split(out, "\n")
+ if len(outArr) < 2 {
+ t.Fatal("got unexpected output: %s", out)
+ }
+ nofile := strings.TrimSpace(outArr[0])
+ nproc := strings.TrimSpace(outArr[1])
+
+ if nofile != "42" {
+ t.Fatalf("expected `ulimit -n` to be `42`, got: %s", nofile)
+ }
+ if nproc != "2048" {
+ t.Fatalf("exepcted `ulimit -p` to be 2048, got: %s", nproc)
+ }
+
+ // Now restart daemon with a new default
+ if err := d.Restart("--default-ulimit", "nofile=43"); err != nil {
+ t.Fatal(err)
+ }
+
+ out, err = d.Cmd("start", "-a", "test")
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ outArr = strings.Split(out, "\n")
+ if len(outArr) < 2 {
+ t.Fatal("got unexpected output: %s", out)
+ }
+ nofile = strings.TrimSpace(outArr[0])
+ nproc = strings.TrimSpace(outArr[1])
+
+ if nofile != "43" {
+ t.Fatalf("expected `ulimit -n` to be `43`, got: %s", nofile)
+ }
+ if nproc != "2048" {
+ t.Fatalf("exepcted `ulimit -p` to be 2048, got: %s", nproc)
+ }
+
+ logDone("daemon - default ulimits are applied")
+}
+
+// #11315
+func TestDaemonRestartRenameContainer(t *testing.T) {
+ d := NewDaemon(t)
+ if err := d.StartWithBusybox(); err != nil {
+ t.Fatal(err)
+ }
+
+ if out, err := d.Cmd("run", "--name=test", "busybox"); err != nil {
+ t.Fatal(err, out)
+ }
+
+ if out, err := d.Cmd("rename", "test", "test2"); err != nil {
+ t.Fatal(err, out)
+ }
+
+ if err := d.Restart(); err != nil {
+ t.Fatal(err)
+ }
+
+ if out, err := d.Cmd("start", "test2"); err != nil {
+ t.Fatal(err, out)
+ }
+
+ logDone("daemon - rename persists through daemon restart")
+}
+
+func TestDaemonLoggingDriverDefault(t *testing.T) {
+ d := NewDaemon(t)
+
+ if err := d.StartWithBusybox(); err != nil {
+ t.Fatal(err)
+ }
+ defer d.Stop()
+
+ out, err := d.Cmd("run", "-d", "busybox", "echo", "testline")
+ if err != nil {
+ t.Fatal(out, err)
+ }
+ id := strings.TrimSpace(out)
+
+ if out, err := d.Cmd("wait", id); err != nil {
+ t.Fatal(out, err)
+ }
+ logPath := filepath.Join(d.folder, "graph", "containers", id, id+"-json.log")
+
+ if _, err := os.Stat(logPath); err != nil {
+ t.Fatal(err)
+ }
+ f, err := os.Open(logPath)
+ if err != nil {
+ t.Fatal(err)
+ }
+ var res struct {
+ Log string `json:log`
+ Stream string `json:stream`
+ Time time.Time `json:time`
+ }
+ if err := json.NewDecoder(f).Decode(&res); err != nil {
+ t.Fatal(err)
+ }
+ if res.Log != "testline\n" {
+ t.Fatalf("Unexpected log line: %q, expected: %q", res.Log, "testline\n")
+ }
+ if res.Stream != "stdout" {
+ t.Fatalf("Unexpected stream: %q, expected: %q", res.Stream, "stdout")
+ }
+ if !time.Now().After(res.Time) {
+ t.Fatalf("Log time %v in future", res.Time)
+ }
+ logDone("daemon - default 'json-file' logging driver")
+}
+
+func TestDaemonLoggingDriverDefaultOverride(t *testing.T) {
+ d := NewDaemon(t)
+
+ if err := d.StartWithBusybox(); err != nil {
+ t.Fatal(err)
+ }
+ defer d.Stop()
+
+ out, err := d.Cmd("run", "-d", "--log-driver=none", "busybox", "echo", "testline")
+ if err != nil {
+ t.Fatal(out, err)
+ }
+ id := strings.TrimSpace(out)
+
+ if out, err := d.Cmd("wait", id); err != nil {
+ t.Fatal(out, err)
+ }
+ logPath := filepath.Join(d.folder, "graph", "containers", id, id+"-json.log")
+
+ if _, err := os.Stat(logPath); err == nil || !os.IsNotExist(err) {
+ t.Fatalf("%s shouldn't exits, error on Stat: %s", logPath, err)
+ }
+ logDone("daemon - default logging driver override in run")
+}
+
+func TestDaemonLoggingDriverNone(t *testing.T) {
+ d := NewDaemon(t)
+
+ if err := d.StartWithBusybox("--log-driver=none"); err != nil {
+ t.Fatal(err)
+ }
+ defer d.Stop()
+
+ out, err := d.Cmd("run", "-d", "busybox", "echo", "testline")
+ if err != nil {
+ t.Fatal(out, err)
+ }
+ id := strings.TrimSpace(out)
+ if out, err := d.Cmd("wait", id); err != nil {
+ t.Fatal(out, err)
+ }
+
+ logPath := filepath.Join(d.folder, "graph", "containers", id, id+"-json.log")
+
+ if _, err := os.Stat(logPath); err == nil || !os.IsNotExist(err) {
+ t.Fatalf("%s shouldn't exits, error on Stat: %s", logPath, err)
+ }
+ logDone("daemon - 'none' logging driver")
+}
+
+func TestDaemonLoggingDriverNoneOverride(t *testing.T) {
+ d := NewDaemon(t)
+
+ if err := d.StartWithBusybox("--log-driver=none"); err != nil {
+ t.Fatal(err)
+ }
+ defer d.Stop()
+
+ out, err := d.Cmd("run", "-d", "--log-driver=json-file", "busybox", "echo", "testline")
+ if err != nil {
+ t.Fatal(out, err)
+ }
+ id := strings.TrimSpace(out)
+
+ if out, err := d.Cmd("wait", id); err != nil {
+ t.Fatal(out, err)
+ }
+ logPath := filepath.Join(d.folder, "graph", "containers", id, id+"-json.log")
+
+ if _, err := os.Stat(logPath); err != nil {
+ t.Fatal(err)
+ }
+ f, err := os.Open(logPath)
+ if err != nil {
+ t.Fatal(err)
+ }
+ var res struct {
+ Log string `json:log`
+ Stream string `json:stream`
+ Time time.Time `json:time`
+ }
+ if err := json.NewDecoder(f).Decode(&res); err != nil {
+ t.Fatal(err)
+ }
+ if res.Log != "testline\n" {
+ t.Fatalf("Unexpected log line: %q, expected: %q", res.Log, "testline\n")
+ }
+ if res.Stream != "stdout" {
+ t.Fatalf("Unexpected stream: %q, expected: %q", res.Stream, "stdout")
+ }
+ if !time.Now().After(res.Time) {
+ t.Fatalf("Log time %v in future", res.Time)
+ }
+ logDone("daemon - 'none' logging driver override in run")
+}
+
+func TestDaemonLoggingDriverNoneLogsError(t *testing.T) {
+ d := NewDaemon(t)
+
+ if err := d.StartWithBusybox("--log-driver=none"); err != nil {
+ t.Fatal(err)
+ }
+ defer d.Stop()
+
+ out, err := d.Cmd("run", "-d", "busybox", "echo", "testline")
+ if err != nil {
+ t.Fatal(out, err)
+ }
+ id := strings.TrimSpace(out)
+ out, err = d.Cmd("logs", id)
+ if err == nil {
+ t.Fatalf("Logs should fail with \"none\" driver")
+ }
+ if !strings.Contains(out, `\"logs\" command is supported only for \"json-file\" logging driver`) {
+ t.Fatalf("There should be error about non-json-file driver, got %s", out)
+ }
+ logDone("daemon - logs not available for non-json-file drivers")
+}
+
+func TestDaemonDots(t *testing.T) {
+ defer deleteAllContainers()
+ d := NewDaemon(t)
+ if err := d.StartWithBusybox(); err != nil {
+ t.Fatal(err)
+ }
+
+ // Now create 4 containers
+ if _, err := d.Cmd("create", "busybox"); err != nil {
+ t.Fatalf("Error creating container: %q", err)
+ }
+ if _, err := d.Cmd("create", "busybox"); err != nil {
+ t.Fatalf("Error creating container: %q", err)
+ }
+ if _, err := d.Cmd("create", "busybox"); err != nil {
+ t.Fatalf("Error creating container: %q", err)
+ }
+ if _, err := d.Cmd("create", "busybox"); err != nil {
+ t.Fatalf("Error creating container: %q", err)
+ }
+
+ d.Stop()
+
+ d.Start("--log-level=debug")
+ d.Stop()
+ content, _ := ioutil.ReadFile(d.logFile.Name())
+ if strings.Contains(string(content), "....") {
+ t.Fatalf("Debug level should not have ....\n%s", string(content))
+ }
+
+ d.Start("--log-level=error")
+ d.Stop()
+ content, _ = ioutil.ReadFile(d.logFile.Name())
+ if strings.Contains(string(content), "....") {
+ t.Fatalf("Error level should not have ....\n%s", string(content))
+ }
+
+ d.Start("--log-level=info")
+ d.Stop()
+ content, _ = ioutil.ReadFile(d.logFile.Name())
+ if !strings.Contains(string(content), "....") {
+ t.Fatalf("Info level should have ....\n%s", string(content))
+ }
+
+ logDone("daemon - test dots on INFO")
+}
+
+func TestDaemonUnixSockCleanedUp(t *testing.T) {
+ d := NewDaemon(t)
+ dir, err := ioutil.TempDir("", "socket-cleanup-test")
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer os.RemoveAll(dir)
+
+ sockPath := filepath.Join(dir, "docker.sock")
+ if err := d.Start("--host", "unix://"+sockPath); err != nil {
+ t.Fatal(err)
+ }
+
+ if _, err := os.Stat(sockPath); err != nil {
+ t.Fatal("socket does not exist")
+ }
+
+ if err := d.Stop(); err != nil {
+ t.Fatal(err)
+ }
+
+ if _, err := os.Stat(sockPath); err == nil || !os.IsNotExist(err) {
+ t.Fatal("unix socket is not cleaned up")
+ }
+
+ logDone("daemon - unix socket is cleaned up")
+}
diff --git a/integration-cli/docker_cli_diff_test.go b/integration-cli/docker_cli_diff_test.go
index 4068140ce2..36881a5729 100644
--- a/integration-cli/docker_cli_diff_test.go
+++ b/integration-cli/docker_cli_diff_test.go
@@ -89,10 +89,22 @@ func TestDiffEnsureOnlyKmsgAndPtmx(t *testing.T) {
deleteContainer(cleanCID)
expected := map[string]bool{
- "C /dev": true,
- "A /dev/full": true, // busybox
- "C /dev/ptmx": true, // libcontainer
- "A /dev/kmsg": true, // lxc
+ "C /dev": true,
+ "A /dev/full": true, // busybox
+ "C /dev/ptmx": true, // libcontainer
+ "A /dev/kmsg": true, // lxc
+ "A /dev/fd": true,
+ "A /dev/fuse": true,
+ "A /dev/ptmx": true,
+ "A /dev/null": true,
+ "A /dev/random": true,
+ "A /dev/stdout": true,
+ "A /dev/stderr": true,
+ "A /dev/tty1": true,
+ "A /dev/stdin": true,
+ "A /dev/tty": true,
+ "A /dev/urandom": true,
+ "A /dev/zero": true,
}
for _, line := range strings.Split(out, "\n") {
diff --git a/integration-cli/docker_cli_events_test.go b/integration-cli/docker_cli_events_test.go
index 322d622b55..a74ce15fb4 100644
--- a/integration-cli/docker_cli_events_test.go
+++ b/integration-cli/docker_cli_events_test.go
@@ -3,6 +3,7 @@ package main
import (
"fmt"
"os/exec"
+ "regexp"
"strconv"
"strings"
"testing"
@@ -15,8 +16,11 @@ func TestEventsUntag(t *testing.T) {
dockerCmd(t, "tag", image, "utest:tag2")
dockerCmd(t, "rmi", "utest:tag1")
dockerCmd(t, "rmi", "utest:tag2")
- eventsCmd := exec.Command("timeout", "0.2", dockerBinary, "events", "--since=1")
- out, _, _ := runCommandWithOutput(eventsCmd)
+ eventsCmd := exec.Command(dockerBinary, "events", "--since=1")
+ out, exitCode, _, err := runCommandWithOutputForDuration(eventsCmd, time.Duration(time.Millisecond*200))
+ if exitCode != 0 || err != nil {
+ t.Fatalf("Failed to get events - exit code %d: %s", exitCode, err)
+ }
events := strings.Split(out, "\n")
nEvents := len(events)
// The last element after the split above will be an empty string, so we
@@ -30,53 +34,18 @@ func TestEventsUntag(t *testing.T) {
logDone("events - untags are logged")
}
-func TestEventsPause(t *testing.T) {
- name := "testeventpause"
- out, _, _ := dockerCmd(t, "images", "-q")
- image := strings.Split(out, "\n")[0]
- dockerCmd(t, "run", "-d", "--name", name, image, "sleep", "2")
- dockerCmd(t, "pause", name)
- dockerCmd(t, "unpause", name)
-
- defer deleteAllContainers()
-
- eventsCmd := exec.Command(dockerBinary, "events", "--since=0", fmt.Sprintf("--until=%d", time.Now().Unix()))
- out, _, _ = runCommandWithOutput(eventsCmd)
- events := strings.Split(out, "\n")
- if len(events) <= 1 {
- t.Fatalf("Missing expected event")
- }
-
- pauseEvent := strings.Fields(events[len(events)-3])
- unpauseEvent := strings.Fields(events[len(events)-2])
-
- if pauseEvent[len(pauseEvent)-1] != "pause" {
- t.Fatalf("event should be pause, not %#v", pauseEvent)
- }
- if unpauseEvent[len(unpauseEvent)-1] != "unpause" {
- t.Fatalf("event should be unpause, not %#v", unpauseEvent)
- }
-
- waitCmd := exec.Command(dockerBinary, "wait", name)
- if waitOut, _, err := runCommandWithOutput(waitCmd); err != nil {
- t.Fatalf("error thrown while waiting for container: %s, %v", waitOut, err)
- }
-
- logDone("events - pause/unpause is logged")
-}
-
func TestEventsContainerFailStartDie(t *testing.T) {
defer deleteAllContainers()
out, _, _ := dockerCmd(t, "images", "-q")
image := strings.Split(out, "\n")[0]
- eventsCmd := exec.Command(dockerBinary, "run", "-d", "--name", "testeventdie", image, "blerg")
+ eventsCmd := exec.Command(dockerBinary, "run", "--name", "testeventdie", image, "blerg")
_, _, err := runCommandWithOutput(eventsCmd)
if err == nil {
t.Fatalf("Container run with command blerg should have failed, but it did not")
}
- eventsCmd = exec.Command(dockerBinary, "events", "--since=0", fmt.Sprintf("--until=%d", time.Now().Unix()))
+ eventsCmd = exec.Command(dockerBinary, "events", "--since=0", fmt.Sprintf("--until=%d", daemonTime(t).Unix()))
out, _, _ = runCommandWithOutput(eventsCmd)
events := strings.Split(out, "\n")
if len(events) <= 1 {
@@ -93,7 +62,7 @@ func TestEventsContainerFailStartDie(t *testing.T) {
t.Fatalf("event should be die, not %#v", dieEvent)
}
- logDone("events - container failed to start logs die")
+ logDone("events - container unwilling to start logs die")
}
func TestEventsLimit(t *testing.T) {
@@ -101,7 +70,7 @@ func TestEventsLimit(t *testing.T) {
for i := 0; i < 30; i++ {
dockerCmd(t, "run", "busybox", "echo", strconv.Itoa(i))
}
- eventsCmd := exec.Command(dockerBinary, "events", "--since=0", fmt.Sprintf("--until=%d", time.Now().Unix()))
+ eventsCmd := exec.Command(dockerBinary, "events", "--since=0", fmt.Sprintf("--until=%d", daemonTime(t).Unix()))
out, _, _ := runCommandWithOutput(eventsCmd)
events := strings.Split(out, "\n")
nEvents := len(events) - 1
@@ -113,7 +82,7 @@ func TestEventsLimit(t *testing.T) {
func TestEventsContainerEvents(t *testing.T) {
dockerCmd(t, "run", "--rm", "busybox", "true")
- eventsCmd := exec.Command(dockerBinary, "events", "--since=0", fmt.Sprintf("--until=%d", time.Now().Unix()))
+ eventsCmd := exec.Command(dockerBinary, "events", "--since=0", fmt.Sprintf("--until=%d", daemonTime(t).Unix()))
out, exitCode, err := runCommandWithOutput(eventsCmd)
if exitCode != 0 || err != nil {
t.Fatalf("Failed to get events with exit code %d: %s", exitCode, err)
@@ -156,13 +125,13 @@ func TestEventsImageUntagDelete(t *testing.T) {
if err := deleteImages(name); err != nil {
t.Fatal(err)
}
- eventsCmd := exec.Command(dockerBinary, "events", "--since=0", fmt.Sprintf("--until=%d", time.Now().Unix()))
+ eventsCmd := exec.Command(dockerBinary, "events", "--since=0", fmt.Sprintf("--until=%d", daemonTime(t).Unix()))
out, exitCode, err := runCommandWithOutput(eventsCmd)
if exitCode != 0 || err != nil {
t.Fatalf("Failed to get events with exit code %d: %s", exitCode, err)
}
events := strings.Split(out, "\n")
- t.Log(events)
+
events = events[:len(events)-1]
if len(events) < 2 {
t.Fatalf("Missing expected event")
@@ -179,7 +148,10 @@ func TestEventsImageUntagDelete(t *testing.T) {
}
func TestEventsImagePull(t *testing.T) {
- since := time.Now().Unix()
+ since := daemonTime(t).Unix()
+
+ defer deleteImages("hello-world")
+
pullCmd := exec.Command(dockerBinary, "pull", "hello-world")
if out, _, err := runCommandWithOutput(pullCmd); err != nil {
t.Fatalf("pulling the hello-world image from has failed: %s, %v", out, err)
@@ -187,7 +159,7 @@ func TestEventsImagePull(t *testing.T) {
eventsCmd := exec.Command(dockerBinary, "events",
fmt.Sprintf("--since=%d", since),
- fmt.Sprintf("--until=%d", time.Now().Unix()))
+ fmt.Sprintf("--until=%d", daemonTime(t).Unix()))
out, _, _ := runCommandWithOutput(eventsCmd)
events := strings.Split(strings.TrimSpace(out), "\n")
@@ -201,27 +173,27 @@ func TestEventsImagePull(t *testing.T) {
}
func TestEventsImageImport(t *testing.T) {
- since := time.Now().Unix()
-
- defer deleteImages("cirros")
+ defer deleteAllContainers()
+ since := daemonTime(t).Unix()
- server, err := fileServer(map[string]string{
- "/cirros.tar.gz": "/cirros.tar.gz",
- })
+ runCmd := exec.Command(dockerBinary, "run", "-d", "busybox", "true")
+ out, _, err := runCommandWithOutput(runCmd)
if err != nil {
- t.Fatal(err)
+ t.Fatal("failed to create a container", out, err)
}
- defer server.Close()
- fileURL := fmt.Sprintf("%s/cirros.tar.gz", server.URL)
- importCmd := exec.Command(dockerBinary, "import", fileURL, "cirros")
- out, _, err := runCommandWithOutput(importCmd)
+ cleanedContainerID := stripTrailingCharacters(out)
+
+ out, _, err = runCommandPipelineWithOutput(
+ exec.Command(dockerBinary, "export", cleanedContainerID),
+ exec.Command(dockerBinary, "import", "-"),
+ )
if err != nil {
t.Errorf("import failed with errors: %v, output: %q", err, out)
}
eventsCmd := exec.Command(dockerBinary, "events",
fmt.Sprintf("--since=%d", since),
- fmt.Sprintf("--until=%d", time.Now().Unix()))
+ fmt.Sprintf("--until=%d", daemonTime(t).Unix()))
out, _, _ = runCommandWithOutput(eventsCmd)
events := strings.Split(strings.TrimSpace(out), "\n")
@@ -235,7 +207,19 @@ func TestEventsImageImport(t *testing.T) {
}
func TestEventsFilters(t *testing.T) {
- since := time.Now().Unix()
+ parseEvents := func(out, match string) {
+ events := strings.Split(out, "\n")
+ events = events[:len(events)-1]
+ for _, event := range events {
+ eventFields := strings.Fields(event)
+ eventName := eventFields[len(eventFields)-1]
+ if ok, err := regexp.MatchString(match, eventName); err != nil || !ok {
+ t.Fatalf("event should match %s, got %#v, err: %v", match, eventFields, err)
+ }
+ }
+ }
+
+ since := daemonTime(t).Unix()
out, _, err := runCommandWithOutput(exec.Command(dockerBinary, "run", "--rm", "busybox", "true"))
if err != nil {
t.Fatal(out, err)
@@ -244,52 +228,161 @@ func TestEventsFilters(t *testing.T) {
if err != nil {
t.Fatal(out, err)
}
- eventsCmd := exec.Command(dockerBinary, "events", fmt.Sprintf("--since=%d", since), fmt.Sprintf("--until=%d", time.Now().Unix()), "--filter", "event=die")
- out, exitCode, err := runCommandWithOutput(eventsCmd)
- if exitCode != 0 || err != nil {
- t.Fatalf("Failed to get events with exit code %d: %s", exitCode, err)
+ out, _, err = runCommandWithOutput(exec.Command(dockerBinary, "events", fmt.Sprintf("--since=%d", since), fmt.Sprintf("--until=%d", daemonTime(t).Unix()), "--filter", "event=die"))
+ if err != nil {
+ t.Fatalf("Failed to get events: %s", err)
}
- events := strings.Split(out, "\n")
- events = events[:len(events)-1]
- if len(events) != 2 {
- t.Fatalf("Expected 2 events, got %d: %v", len(events), events)
+ parseEvents(out, "die")
+
+ out, _, err = runCommandWithOutput(exec.Command(dockerBinary, "events", fmt.Sprintf("--since=%d", since), fmt.Sprintf("--until=%d", daemonTime(t).Unix()), "--filter", "event=die", "--filter", "event=start"))
+ if err != nil {
+ t.Fatalf("Failed to get events: %s", err)
}
- dieEvent := strings.Fields(events[len(events)-1])
- if dieEvent[len(dieEvent)-1] != "die" {
- t.Fatalf("event should be die, not %#v", dieEvent)
+ parseEvents(out, "((die)|(start))")
+
+ // make sure we at least got 2 start events
+ count := strings.Count(out, "start")
+ if count < 2 {
+ t.Fatalf("should have had 2 start events but had %d, out: %s", count, out)
}
- dieEvent = strings.Fields(events[len(events)-2])
- if dieEvent[len(dieEvent)-1] != "die" {
- t.Fatalf("event should be die, not %#v", dieEvent)
+ logDone("events - filters")
+}
+
+func TestEventsFilterImageName(t *testing.T) {
+ since := daemonTime(t).Unix()
+ defer deleteAllContainers()
+
+ out, _, err := runCommandWithOutput(exec.Command(dockerBinary, "run", "--name", "container_1", "-d", "busybox", "true"))
+ if err != nil {
+ t.Fatal(out, err)
}
+ container1 := stripTrailingCharacters(out)
- eventsCmd = exec.Command(dockerBinary, "events", fmt.Sprintf("--since=%d", since), fmt.Sprintf("--until=%d", time.Now().Unix()), "--filter", "event=die", "--filter", "event=start")
- out, exitCode, err = runCommandWithOutput(eventsCmd)
- if exitCode != 0 || err != nil {
- t.Fatalf("Failed to get events with exit code %d: %s", exitCode, err)
+ out, _, err = runCommandWithOutput(exec.Command(dockerBinary, "run", "--name", "container_2", "-d", "busybox", "true"))
+ if err != nil {
+ t.Fatal(out, err)
}
- events = strings.Split(out, "\n")
- events = events[:len(events)-1]
- if len(events) != 4 {
- t.Fatalf("Expected 4 events, got %d: %v", len(events), events)
+ container2 := stripTrailingCharacters(out)
+
+ for _, s := range []string{"busybox", "busybox:latest"} {
+ eventsCmd := exec.Command(dockerBinary, "events", fmt.Sprintf("--since=%d", since), fmt.Sprintf("--until=%d", daemonTime(t).Unix()), "--filter", fmt.Sprintf("image=%s", s))
+ out, _, err := runCommandWithOutput(eventsCmd)
+ if err != nil {
+ t.Fatalf("Failed to get events, error: %s(%s)", err, out)
+ }
+ events := strings.Split(out, "\n")
+ events = events[:len(events)-1]
+ if len(events) == 0 {
+ t.Fatalf("Expected events but found none for the image busybox:latest")
+ }
+ count1 := 0
+ count2 := 0
+ for _, e := range events {
+ if strings.Contains(e, container1) {
+ count1++
+ } else if strings.Contains(e, container2) {
+ count2++
+ }
+ }
+ if count1 == 0 || count2 == 0 {
+ t.Fatalf("Expected events from each container but got %d from %s and %d from %s", count1, container1, count2, container2)
+ }
}
- startEvent := strings.Fields(events[len(events)-4])
- if startEvent[len(startEvent)-1] != "start" {
- t.Fatalf("event should be start, not %#v", startEvent)
+
+ logDone("events - filters using image")
+}
+
+func TestEventsFilterContainerID(t *testing.T) {
+ since := daemonTime(t).Unix()
+ defer deleteAllContainers()
+
+ out, _, err := runCommandWithOutput(exec.Command(dockerBinary, "run", "-d", "busybox", "true"))
+ if err != nil {
+ t.Fatal(out, err)
}
- dieEvent = strings.Fields(events[len(events)-3])
- if dieEvent[len(dieEvent)-1] != "die" {
- t.Fatalf("event should be die, not %#v", dieEvent)
+ container1 := stripTrailingCharacters(out)
+
+ out, _, err = runCommandWithOutput(exec.Command(dockerBinary, "run", "-d", "busybox", "true"))
+ if err != nil {
+ t.Fatal(out, err)
}
- startEvent = strings.Fields(events[len(events)-2])
- if startEvent[len(startEvent)-1] != "start" {
- t.Fatalf("event should be start, not %#v", startEvent)
+ container2 := stripTrailingCharacters(out)
+
+ for _, s := range []string{container1, container2, container1[:12], container2[:12]} {
+ eventsCmd := exec.Command(dockerBinary, "events", fmt.Sprintf("--since=%d", since), fmt.Sprintf("--until=%d", daemonTime(t).Unix()), "--filter", fmt.Sprintf("container=%s", s))
+ out, _, err := runCommandWithOutput(eventsCmd)
+ if err != nil {
+ t.Fatalf("Failed to get events, error: %s(%s)", err, out)
+ }
+ events := strings.Split(out, "\n")
+ events = events[:len(events)-1]
+ if len(events) == 0 || len(events) > 3 {
+ t.Fatalf("Expected 3 events, got %d: %v", len(events), events)
+ }
+ createEvent := strings.Fields(events[0])
+ if createEvent[len(createEvent)-1] != "create" {
+ t.Fatalf("first event should be create, not %#v", createEvent)
+ }
+ if len(events) > 1 {
+ startEvent := strings.Fields(events[1])
+ if startEvent[len(startEvent)-1] != "start" {
+ t.Fatalf("second event should be start, not %#v", startEvent)
+ }
+ }
+ if len(events) == 3 {
+ dieEvent := strings.Fields(events[len(events)-1])
+ if dieEvent[len(dieEvent)-1] != "die" {
+ t.Fatalf("event should be die, not %#v", dieEvent)
+ }
+ }
}
- dieEvent = strings.Fields(events[len(events)-1])
- if dieEvent[len(dieEvent)-1] != "die" {
- t.Fatalf("event should be die, not %#v", dieEvent)
+
+ logDone("events - filters using container id")
+}
+
+func TestEventsFilterContainerName(t *testing.T) {
+ since := daemonTime(t).Unix()
+ defer deleteAllContainers()
+
+ _, _, err := runCommandWithOutput(exec.Command(dockerBinary, "run", "--name", "container_1", "busybox", "true"))
+ if err != nil {
+ t.Fatal(err)
}
- logDone("events - filters")
+ _, _, err = runCommandWithOutput(exec.Command(dockerBinary, "run", "--name", "container_2", "busybox", "true"))
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ for _, s := range []string{"container_1", "container_2"} {
+ eventsCmd := exec.Command(dockerBinary, "events", fmt.Sprintf("--since=%d", since), fmt.Sprintf("--until=%d", daemonTime(t).Unix()), "--filter", fmt.Sprintf("container=%s", s))
+ out, _, err := runCommandWithOutput(eventsCmd)
+ if err != nil {
+ t.Fatalf("Failed to get events, error : %s(%s)", err, out)
+ }
+ events := strings.Split(out, "\n")
+ events = events[:len(events)-1]
+ if len(events) == 0 || len(events) > 3 {
+ t.Fatalf("Expected 3 events, got %d: %v", len(events), events)
+ }
+ createEvent := strings.Fields(events[0])
+ if createEvent[len(createEvent)-1] != "create" {
+ t.Fatalf("first event should be create, not %#v", createEvent)
+ }
+ if len(events) > 1 {
+ startEvent := strings.Fields(events[1])
+ if startEvent[len(startEvent)-1] != "start" {
+ t.Fatalf("second event should be start, not %#v", startEvent)
+ }
+ }
+ if len(events) == 3 {
+ dieEvent := strings.Fields(events[len(events)-1])
+ if dieEvent[len(dieEvent)-1] != "die" {
+ t.Fatalf("event should be die, not %#v", dieEvent)
+ }
+ }
+ }
+
+ logDone("events - filters using container name")
}
diff --git a/integration-cli/docker_cli_events_unix_test.go b/integration-cli/docker_cli_events_unix_test.go
index fd6c434752..4e54283501 100644
--- a/integration-cli/docker_cli_events_unix_test.go
+++ b/integration-cli/docker_cli_events_unix_test.go
@@ -9,7 +9,6 @@ import (
"os"
"os/exec"
"testing"
- "time"
"unicode"
"github.com/kr/pty"
@@ -17,11 +16,8 @@ import (
// #5979
func TestEventsRedirectStdout(t *testing.T) {
-
- since := time.Now().Unix()
-
+ since := daemonTime(t).Unix()
dockerCmd(t, "run", "busybox", "true")
-
defer deleteAllContainers()
file, err := ioutil.TempFile("", "")
@@ -30,7 +26,7 @@ func TestEventsRedirectStdout(t *testing.T) {
}
defer os.Remove(file.Name())
- command := fmt.Sprintf("%s events --since=%d --until=%d > %s", dockerBinary, since, time.Now().Unix(), file.Name())
+ command := fmt.Sprintf("%s events --since=%d --until=%d > %s", dockerBinary, since, daemonTime(t).Unix(), file.Name())
_, tty, err := pty.Open()
if err != nil {
t.Fatalf("Could not open pty: %v", err)
diff --git a/integration-cli/docker_cli_exec_test.go b/integration-cli/docker_cli_exec_test.go
index 5dc0e8d71a..01adc43c08 100644
--- a/integration-cli/docker_cli_exec_test.go
+++ b/integration-cli/docker_cli_exec_test.go
@@ -1,3 +1,5 @@
+// +build !test_no_exec
+
package main
import (
@@ -5,6 +7,7 @@ import (
"fmt"
"os"
"os/exec"
+ "path/filepath"
"reflect"
"sort"
"strings"
@@ -14,6 +17,8 @@ import (
)
func TestExec(t *testing.T) {
+ defer deleteAllContainers()
+
runCmd := exec.Command(dockerBinary, "run", "-d", "--name", "testing", "busybox", "sh", "-c", "echo test > /tmp/file && sleep 100")
if out, _, _, err := runCommandWithStdoutStderr(runCmd); err != nil {
t.Fatal(out, err)
@@ -31,8 +36,6 @@ func TestExec(t *testing.T) {
t.Errorf("container exec should've printed %q but printed %q", expected, out)
}
- deleteAllContainers()
-
logDone("exec - basic test")
}
@@ -57,7 +60,7 @@ func TestExecInteractiveStdinClose(t *testing.T) {
out, err := cmd.CombinedOutput()
if err != nil {
- t.Fatal(err, out)
+ t.Fatal(err, string(out))
}
if string(out) == "" {
@@ -77,6 +80,8 @@ func TestExecInteractiveStdinClose(t *testing.T) {
}
func TestExecInteractive(t *testing.T) {
+ defer deleteAllContainers()
+
runCmd := exec.Command(dockerBinary, "run", "-d", "--name", "testing", "busybox", "sh", "-c", "echo test > /tmp/file && sleep 100")
if out, _, _, err := runCommandWithStdoutStderr(runCmd); err != nil {
t.Fatal(out, err)
@@ -124,12 +129,12 @@ func TestExecInteractive(t *testing.T) {
t.Fatal("docker exec failed to exit on stdin close")
}
- deleteAllContainers()
-
logDone("exec - Interactive test")
}
func TestExecAfterContainerRestart(t *testing.T) {
+ defer deleteAllContainers()
+
runCmd := exec.Command(dockerBinary, "run", "-d", "busybox", "top")
out, _, err := runCommandWithOutput(runCmd)
if err != nil {
@@ -154,12 +159,13 @@ func TestExecAfterContainerRestart(t *testing.T) {
t.Errorf("container should've printed hello, instead printed %q", outStr)
}
- deleteAllContainers()
-
logDone("exec - exec running container after container restart")
}
func TestExecAfterDaemonRestart(t *testing.T) {
+ testRequires(t, SameHostDaemon)
+ defer deleteAllContainers()
+
d := NewDaemon(t)
if err := d.StartWithBusybox(); err != nil {
t.Fatalf("Could not start daemon with busybox: %v", err)
@@ -191,7 +197,7 @@ func TestExecAfterDaemonRestart(t *testing.T) {
logDone("exec - exec running container after daemon restart")
}
-// Regresssion test for #9155, #9044
+// Regression test for #9155, #9044
func TestExecEnv(t *testing.T) {
defer deleteAllContainers()
@@ -219,6 +225,8 @@ func TestExecEnv(t *testing.T) {
}
func TestExecExitStatus(t *testing.T) {
+ defer deleteAllContainers()
+
runCmd := exec.Command(dockerBinary, "run", "-d", "--name", "top", "busybox", "top")
if out, _, _, err := runCommandWithStdoutStderr(runCmd); err != nil {
t.Fatal(out, err)
@@ -236,7 +244,6 @@ func TestExecExitStatus(t *testing.T) {
}
func TestExecPausedContainer(t *testing.T) {
-
defer deleteAllContainers()
defer unpauseAllContainers()
@@ -421,7 +428,7 @@ func TestExecCgroup(t *testing.T) {
for i := 0; i < 5; i++ {
wg.Add(1)
go func() {
- cmd = exec.Command(dockerBinary, "exec", "testing", "cat", "/proc/self/cgroup")
+ cmd := exec.Command(dockerBinary, "exec", "testing", "cat", "/proc/self/cgroup")
out, _, err := runCommandWithOutput(cmd)
if err != nil {
t.Fatal(out, err)
@@ -453,3 +460,208 @@ func TestExecCgroup(t *testing.T) {
logDone("exec - exec has the container cgroups")
}
+
+func TestInspectExecID(t *testing.T) {
+ defer deleteAllContainers()
+
+ out, exitCode, err := runCommandWithOutput(exec.Command(dockerBinary, "run", "-d", "busybox", "top"))
+ if exitCode != 0 || err != nil {
+ t.Fatalf("failed to run container: %s, %v", out, err)
+ }
+ id := strings.TrimSuffix(out, "\n")
+
+ out, err = inspectField(id, "ExecIDs")
+ if err != nil {
+ t.Fatalf("failed to inspect container: %s, %v", out, err)
+ }
+ if out != "<no value>" {
+ t.Fatalf("ExecIDs should be empty, got: %s", out)
+ }
+
+ exitCode, err = runCommand(exec.Command(dockerBinary, "exec", "-d", id, "ls", "/"))
+ if exitCode != 0 || err != nil {
+ t.Fatalf("failed to exec in container: %s, %v", out, err)
+ }
+
+ out, err = inspectField(id, "ExecIDs")
+ if err != nil {
+ t.Fatalf("failed to inspect container: %s, %v", out, err)
+ }
+
+ out = strings.TrimSuffix(out, "\n")
+ if out == "[]" || out == "<no value>" {
+ t.Fatalf("ExecIDs should not be empty, got: %s", out)
+ }
+
+ logDone("inspect - inspect a container with ExecIDs")
+}
+
+func TestLinksPingLinkedContainersOnRename(t *testing.T) {
+ defer deleteAllContainers()
+
+ var out string
+ out, _, _ = dockerCmd(t, "run", "-d", "--name", "container1", "busybox", "sleep", "10")
+ idA := stripTrailingCharacters(out)
+ if idA == "" {
+ t.Fatal(out, "id should not be nil")
+ }
+ out, _, _ = dockerCmd(t, "run", "-d", "--link", "container1:alias1", "--name", "container2", "busybox", "sleep", "10")
+ idB := stripTrailingCharacters(out)
+ if idB == "" {
+ t.Fatal(out, "id should not be nil")
+ }
+
+ execCmd := exec.Command(dockerBinary, "exec", "container2", "ping", "-c", "1", "alias1", "-W", "1")
+ out, _, err := runCommandWithOutput(execCmd)
+ if err != nil {
+ t.Fatal(out, err)
+ }
+
+ dockerCmd(t, "rename", "container1", "container_new")
+
+ execCmd = exec.Command(dockerBinary, "exec", "container2", "ping", "-c", "1", "alias1", "-W", "1")
+ out, _, err = runCommandWithOutput(execCmd)
+ if err != nil {
+ t.Fatal(out, err)
+ }
+
+ logDone("links - ping linked container upon rename")
+}
+
+func TestRunExecDir(t *testing.T) {
+ testRequires(t, SameHostDaemon)
+ cmd := exec.Command(dockerBinary, "run", "-d", "busybox", "top")
+ out, _, err := runCommandWithOutput(cmd)
+ if err != nil {
+ t.Fatal(err, out)
+ }
+ id := strings.TrimSpace(out)
+ execDir := filepath.Join(execDriverPath, id)
+ stateFile := filepath.Join(execDir, "state.json")
+
+ {
+ fi, err := os.Stat(execDir)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if !fi.IsDir() {
+ t.Fatalf("%q must be a directory", execDir)
+ }
+ fi, err = os.Stat(stateFile)
+ if err != nil {
+ t.Fatal(err)
+ }
+ }
+
+ stopCmd := exec.Command(dockerBinary, "stop", id)
+ out, _, err = runCommandWithOutput(stopCmd)
+ if err != nil {
+ t.Fatal(err, out)
+ }
+ {
+ _, err := os.Stat(execDir)
+ if err == nil {
+ t.Fatal(err)
+ }
+ if err == nil {
+ t.Fatalf("Exec directory %q exists for removed container!", execDir)
+ }
+ if !os.IsNotExist(err) {
+ t.Fatalf("Error should be about non-existing, got %s", err)
+ }
+ }
+ startCmd := exec.Command(dockerBinary, "start", id)
+ out, _, err = runCommandWithOutput(startCmd)
+ if err != nil {
+ t.Fatal(err, out)
+ }
+ {
+ fi, err := os.Stat(execDir)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if !fi.IsDir() {
+ t.Fatalf("%q must be a directory", execDir)
+ }
+ fi, err = os.Stat(stateFile)
+ if err != nil {
+ t.Fatal(err)
+ }
+ }
+ rmCmd := exec.Command(dockerBinary, "rm", "-f", id)
+ out, _, err = runCommandWithOutput(rmCmd)
+ if err != nil {
+ t.Fatal(err, out)
+ }
+ {
+ _, err := os.Stat(execDir)
+ if err == nil {
+ t.Fatal(err)
+ }
+ if err == nil {
+ t.Fatalf("Exec directory %q is exists for removed container!", execDir)
+ }
+ if !os.IsNotExist(err) {
+ t.Fatalf("Error should be about non-existing, got %s", err)
+ }
+ }
+
+ logDone("run - check execdriver dir behavior")
+}
+
+func TestRunMutableNetworkFiles(t *testing.T) {
+ testRequires(t, SameHostDaemon)
+ defer deleteAllContainers()
+
+ for _, fn := range []string{"resolv.conf", "hosts"} {
+ deleteAllContainers()
+
+ content, err := runCommandAndReadContainerFile(fn, exec.Command(dockerBinary, "run", "-d", "--name", "c1", "busybox", "sh", "-c", fmt.Sprintf("echo success >/etc/%s && top", fn)))
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ if strings.TrimSpace(string(content)) != "success" {
+ t.Fatal("Content was not what was modified in the container", string(content))
+ }
+
+ out, _, err := runCommandWithOutput(exec.Command(dockerBinary, "run", "-d", "--name", "c2", "busybox", "top"))
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ contID := strings.TrimSpace(out)
+
+ netFilePath := containerStorageFile(contID, fn)
+
+ f, err := os.OpenFile(netFilePath, os.O_WRONLY|os.O_SYNC|os.O_APPEND, 0644)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ if _, err := f.Seek(0, 0); err != nil {
+ f.Close()
+ t.Fatal(err)
+ }
+
+ if err := f.Truncate(0); err != nil {
+ f.Close()
+ t.Fatal(err)
+ }
+
+ if _, err := f.Write([]byte("success2\n")); err != nil {
+ f.Close()
+ t.Fatal(err)
+ }
+ f.Close()
+
+ res, err := exec.Command(dockerBinary, "exec", contID, "cat", "/etc/"+fn).CombinedOutput()
+ if err != nil {
+ t.Fatalf("Output: %s, error: %s", res, err)
+ }
+ if string(res) != "success2\n" {
+ t.Fatalf("Expected content of %s: %q, got: %q", fn, "success2\n", res)
+ }
+ }
+ logDone("run - mutable network files")
+}
diff --git a/integration-cli/docker_cli_export_import_test.go b/integration-cli/docker_cli_export_import_test.go
index e1e95e436e..5b2a016f14 100644
--- a/integration-cli/docker_cli_export_import_test.go
+++ b/integration-cli/docker_cli_export_import_test.go
@@ -1,9 +1,9 @@
package main
import (
- "fmt"
"os"
"os/exec"
+ "strings"
"testing"
)
@@ -23,15 +23,13 @@ func TestExportContainerAndImportImage(t *testing.T) {
t.Fatalf("output should've been a container id: %s %s ", cleanedContainerID, err)
}
- exportCmdTemplate := `%v export %v > /tmp/testexp.tar`
- exportCmdFinal := fmt.Sprintf(exportCmdTemplate, dockerBinary, cleanedContainerID)
- exportCmd := exec.Command("bash", "-c", exportCmdFinal)
+ exportCmd := exec.Command(dockerBinary, "export", cleanedContainerID)
if out, _, err = runCommandWithOutput(exportCmd); err != nil {
t.Fatalf("failed to export container: %s, %v", out, err)
}
- importCmdFinal := `cat /tmp/testexp.tar | docker import - repo/testexp:v1`
- importCmd := exec.Command("bash", "-c", importCmdFinal)
+ importCmd := exec.Command(dockerBinary, "import", "-", "repo/testexp:v1")
+ importCmd.Stdin = strings.NewReader(out)
out, _, err = runCommandWithOutput(importCmd)
if err != nil {
t.Fatalf("failed to import image: %s, %v", out, err)
@@ -47,8 +45,55 @@ func TestExportContainerAndImportImage(t *testing.T) {
deleteContainer(cleanedContainerID)
deleteImages("repo/testexp:v1")
- os.Remove("/tmp/testexp.tar")
-
logDone("export - export a container")
logDone("import - import an image")
}
+
+// Used to test output flag in the export command
+func TestExportContainerWithOutputAndImportImage(t *testing.T) {
+ runCmd := exec.Command(dockerBinary, "run", "-d", "busybox", "true")
+ out, _, err := runCommandWithOutput(runCmd)
+ if err != nil {
+ t.Fatal("failed to create a container", out, err)
+ }
+
+ cleanedContainerID := stripTrailingCharacters(out)
+
+ inspectCmd := exec.Command(dockerBinary, "inspect", cleanedContainerID)
+ out, _, err = runCommandWithOutput(inspectCmd)
+ if err != nil {
+ t.Fatalf("output should've been a container id: %s %s ", cleanedContainerID, err)
+ }
+
+ exportCmd := exec.Command(dockerBinary, "export", "--output=testexp.tar", cleanedContainerID)
+ if out, _, err = runCommandWithOutput(exportCmd); err != nil {
+ t.Fatalf("failed to export container: %s, %v", out, err)
+ }
+
+ out, _, err = runCommandWithOutput(exec.Command("cat", "testexp.tar"))
+ if err != nil {
+ t.Fatal(out, err)
+ }
+
+ importCmd := exec.Command(dockerBinary, "import", "-", "repo/testexp:v1")
+ importCmd.Stdin = strings.NewReader(out)
+ out, _, err = runCommandWithOutput(importCmd)
+ if err != nil {
+ t.Fatalf("failed to import image: %s, %v", out, err)
+ }
+
+ cleanedImageID := stripTrailingCharacters(out)
+
+ inspectCmd = exec.Command(dockerBinary, "inspect", cleanedImageID)
+ if out, _, err = runCommandWithOutput(inspectCmd); err != nil {
+ t.Fatalf("output should've been an image id: %s, %v", out, err)
+ }
+
+ deleteContainer(cleanedContainerID)
+ deleteImages("repo/testexp:v1")
+
+ os.Remove("/tmp/testexp.tar")
+
+ logDone("export - export a container with output flag")
+ logDone("import - import an image with output flag")
+}
diff --git a/integration-cli/docker_cli_help_test.go b/integration-cli/docker_cli_help_test.go
new file mode 100644
index 0000000000..8fc5cd1aab
--- /dev/null
+++ b/integration-cli/docker_cli_help_test.go
@@ -0,0 +1,155 @@
+package main
+
+import (
+ "os"
+ "os/exec"
+ "runtime"
+ "strings"
+ "testing"
+ "unicode"
+
+ "github.com/docker/docker/pkg/homedir"
+)
+
+func TestHelpTextVerify(t *testing.T) {
+ // Make sure main help text fits within 80 chars and that
+ // on non-windows system we use ~ when possible (to shorten things).
+ // Test for HOME set to its default value and set to "/" on linux
+ // Yes on windows setting up an array and looping (right now) isn't
+ // necessary because we just have one value, but we'll need the
+ // array/loop on linux so we might as well set it up so that we can
+ // test any number of home dirs later on and all we need to do is
+ // modify the array - the rest of the testing infrastructure should work
+ homes := []string{homedir.Get()}
+
+ // Non-Windows machines need to test for this special case of $HOME
+ if runtime.GOOS != "windows" {
+ homes = append(homes, "/")
+ }
+
+ homeKey := homedir.Key()
+ baseEnvs := os.Environ()
+
+ // Remove HOME env var from list so we can add a new value later.
+ for i, env := range baseEnvs {
+ if strings.HasPrefix(env, homeKey+"=") {
+ baseEnvs = append(baseEnvs[:i], baseEnvs[i+1:]...)
+ break
+ }
+ }
+
+ for _, home := range homes {
+ // Dup baseEnvs and add our new HOME value
+ newEnvs := make([]string, len(baseEnvs)+1)
+ copy(newEnvs, baseEnvs)
+ newEnvs[len(newEnvs)-1] = homeKey + "=" + home
+
+ scanForHome := runtime.GOOS != "windows" && home != "/"
+
+ // Check main help text to make sure its not over 80 chars
+ helpCmd := exec.Command(dockerBinary, "help")
+ helpCmd.Env = newEnvs
+ out, ec, err := runCommandWithOutput(helpCmd)
+ if err != nil || ec != 0 {
+ t.Fatalf("docker help should have worked\nout:%s\nec:%d", out, ec)
+ }
+ lines := strings.Split(out, "\n")
+ for _, line := range lines {
+ if len(line) > 80 {
+ t.Fatalf("Line is too long(%d chars):\n%s", len(line), line)
+ }
+
+ // All lines should not end with a space
+ if strings.HasSuffix(line, " ") {
+ t.Fatalf("Line should not end with a space: %s", line)
+ }
+
+ if scanForHome && strings.Contains(line, `=`+home) {
+ t.Fatalf("Line should use '%q' instead of %q:\n%s", homedir.GetShortcutString(), home, line)
+ }
+ if runtime.GOOS != "windows" {
+ i := strings.Index(line, homedir.GetShortcutString())
+ if i >= 0 && i != len(line)-1 && line[i+1] != '/' {
+ t.Fatalf("Main help should not have used home shortcut:\n%s", line)
+ }
+ }
+ }
+
+ // Make sure each cmd's help text fits within 80 chars and that
+ // on non-windows system we use ~ when possible (to shorten things).
+ // Pull the list of commands from the "Commands:" section of docker help
+ helpCmd = exec.Command(dockerBinary, "help")
+ helpCmd.Env = newEnvs
+ out, ec, err = runCommandWithOutput(helpCmd)
+ if err != nil || ec != 0 {
+ t.Fatalf("docker help should have worked\nout:%s\nec:%d", out, ec)
+ }
+ i := strings.Index(out, "Commands:")
+ if i < 0 {
+ t.Fatalf("Missing 'Commands:' in:\n%s", out)
+ }
+
+ // Grab all chars starting at "Commands:"
+ // Skip first line, its "Commands:"
+ cmds := []string{}
+ for _, cmd := range strings.Split(out[i:], "\n")[1:] {
+ // Stop on blank line or non-idented line
+ if cmd == "" || !unicode.IsSpace(rune(cmd[0])) {
+ break
+ }
+
+ // Grab just the first word of each line
+ cmd = strings.Split(strings.TrimSpace(cmd), " ")[0]
+ cmds = append(cmds, cmd)
+
+ helpCmd := exec.Command(dockerBinary, cmd, "--help")
+ helpCmd.Env = newEnvs
+ out, ec, err := runCommandWithOutput(helpCmd)
+ if err != nil || ec != 0 {
+ t.Fatalf("Error on %q help: %s\nexit code:%d", cmd, out, ec)
+ }
+ lines := strings.Split(out, "\n")
+ for _, line := range lines {
+ if len(line) > 80 {
+ t.Fatalf("Help for %q is too long(%d chars):\n%s", cmd,
+ len(line), line)
+ }
+
+ if scanForHome && strings.Contains(line, `"`+home) {
+ t.Fatalf("Help for %q should use ~ instead of %q on:\n%s",
+ cmd, home, line)
+ }
+ i := strings.Index(line, "~")
+ if i >= 0 && i != len(line)-1 && line[i+1] != '/' {
+ t.Fatalf("Help for %q should not have used ~:\n%s", cmd, line)
+ }
+
+ // If a line starts with 4 spaces then assume someone
+ // added a multi-line description for an option and we need
+ // to flag it
+ if strings.HasPrefix(line, " ") {
+ t.Fatalf("Help for %q should not have a multi-line option: %s", cmd, line)
+ }
+
+ // Options should NOT end with a period
+ if strings.HasPrefix(line, " -") && strings.HasSuffix(line, ".") {
+ t.Fatalf("Help for %q should not end with a period: %s", cmd, line)
+ }
+
+ // Options should NOT end with a space
+ if strings.HasSuffix(line, " ") {
+ t.Fatalf("Help for %q should not end with a space: %s", cmd, line)
+ }
+
+ }
+ }
+
+ expected := 39
+ if len(cmds) != expected {
+ t.Fatalf("Wrong # of cmds(%d), it should be: %d\nThe list:\n%q",
+ len(cmds), expected, cmds)
+ }
+ }
+
+ logDone("help - verify text")
+}
diff --git a/integration-cli/docker_cli_history_test.go b/integration-cli/docker_cli_history_test.go
index 3ae9ffb45d..ecb0a3a07e 100644
--- a/integration-cli/docker_cli_history_test.go
+++ b/integration-cli/docker_cli_history_test.go
@@ -71,7 +71,7 @@ func TestHistoryExistentImage(t *testing.T) {
if err != nil || exitCode != 0 {
t.Fatal("failed to get image history")
}
- logDone("history - history on existent image must not fail")
+ logDone("history - history on existent image must pass")
}
func TestHistoryNonExistentImage(t *testing.T) {
@@ -80,5 +80,5 @@ func TestHistoryNonExistentImage(t *testing.T) {
if err == nil || exitCode == 0 {
t.Fatal("history on a non-existent image didn't result in a non-zero exit status")
}
- logDone("history - history on non-existent image must fail")
+ logDone("history - history on non-existent image must pass")
}
diff --git a/integration-cli/docker_cli_images_test.go b/integration-cli/docker_cli_images_test.go
index a91f1c0e22..694971191e 100644
--- a/integration-cli/docker_cli_images_test.go
+++ b/integration-cli/docker_cli_images_test.go
@@ -8,6 +8,8 @@ import (
"strings"
"testing"
"time"
+
+ "github.com/docker/docker/pkg/common"
)
func TestImagesEnsureImageIsListed(t *testing.T) {
@@ -77,6 +79,60 @@ func TestImagesErrorWithInvalidFilterNameTest(t *testing.T) {
logDone("images - invalid filter name check working")
}
+func TestImagesFilterLabel(t *testing.T) {
+ imageName1 := "images_filter_test1"
+ imageName2 := "images_filter_test2"
+ imageName3 := "images_filter_test3"
+ defer deleteAllContainers()
+ defer deleteImages(imageName1)
+ defer deleteImages(imageName2)
+ defer deleteImages(imageName3)
+ image1ID, err := buildImage(imageName1,
+ `FROM scratch
+ LABEL match me`, true)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ image2ID, err := buildImage(imageName2,
+ `FROM scratch
+ LABEL match="me too"`, true)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ image3ID, err := buildImage(imageName3,
+ `FROM scratch
+ LABEL nomatch me`, true)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ cmd := exec.Command(dockerBinary, "images", "--no-trunc", "-q", "-f", "label=match")
+ out, _, err := runCommandWithOutput(cmd)
+ if err != nil {
+ t.Fatal(out, err)
+ }
+ out = strings.TrimSpace(out)
+
+ if (!strings.Contains(out, image1ID) && !strings.Contains(out, image2ID)) || strings.Contains(out, image3ID) {
+ t.Fatalf("Expected ids %s,%s got %s", image1ID, image2ID, out)
+ }
+
+ cmd = exec.Command(dockerBinary, "images", "--no-trunc", "-q", "-f", "label=match=me too")
+ out, _, err = runCommandWithOutput(cmd)
+ if err != nil {
+ t.Fatal(out, err)
+ }
+ out = strings.TrimSpace(out)
+
+ if out != image2ID {
+ t.Fatalf("Expected %s got %s", image2ID, out)
+ }
+
+ logDone("images - filter label")
+}
+
func TestImagesFilterWhiteSpaceTrimmingAndLowerCasingWorking(t *testing.T) {
imageName := "images_filter_test"
defer deleteAllContainers()
@@ -97,7 +153,7 @@ func TestImagesFilterWhiteSpaceTrimmingAndLowerCasingWorking(t *testing.T) {
imageListings := make([][]string, 5, 5)
for idx, filter := range filters {
- cmd := exec.Command(dockerBinary, "images", "-f", filter)
+ cmd := exec.Command(dockerBinary, "images", "-q", "-f", filter)
out, _, err := runCommandWithOutput(cmd)
if err != nil {
t.Fatal(err)
@@ -122,3 +178,44 @@ func TestImagesFilterWhiteSpaceTrimmingAndLowerCasingWorking(t *testing.T) {
logDone("images - white space trimming and lower casing")
}
+
+func TestImagesEnsureDanglingImageOnlyListedOnce(t *testing.T) {
+ defer deleteAllContainers()
+
+ // create container 1
+ c := exec.Command(dockerBinary, "run", "-d", "busybox", "true")
+ out, _, err := runCommandWithOutput(c)
+ if err != nil {
+ t.Fatalf("error running busybox: %s, %v", out, err)
+ }
+ containerId1 := strings.TrimSpace(out)
+
+ // tag as foobox
+ c = exec.Command(dockerBinary, "commit", containerId1, "foobox")
+ out, _, err = runCommandWithOutput(c)
+ if err != nil {
+ t.Fatalf("error tagging foobox: %s", err)
+ }
+ imageId := common.TruncateID(strings.TrimSpace(out))
+ defer deleteImages(imageId)
+
+ // overwrite the tag, making the previous image dangling
+ c = exec.Command(dockerBinary, "tag", "-f", "busybox", "foobox")
+ out, _, err = runCommandWithOutput(c)
+ if err != nil {
+ t.Fatalf("error tagging foobox: %s", err)
+ }
+ defer deleteImages("foobox")
+
+ c = exec.Command(dockerBinary, "images", "-q", "-f", "dangling=true")
+ out, _, err = runCommandWithOutput(c)
+ if err != nil {
+ t.Fatalf("listing images failed with errors: %s, %v", out, err)
+ }
+
+ if e, a := 1, strings.Count(out, imageId); e != a {
+ t.Fatalf("expected 1 dangling image, got %d: %s", a, out)
+ }
+
+ logDone("images - dangling image only listed once")
+}
diff --git a/integration-cli/docker_cli_import_test.go b/integration-cli/docker_cli_import_test.go
index 94aadc5831..1a7ee6f206 100644
--- a/integration-cli/docker_cli_import_test.go
+++ b/integration-cli/docker_cli_import_test.go
@@ -1,32 +1,43 @@
package main
import (
- "fmt"
"os/exec"
"strings"
"testing"
)
func TestImportDisplay(t *testing.T) {
- server, err := fileServer(map[string]string{
- "/cirros.tar.gz": "/cirros.tar.gz",
- })
+ runCmd := exec.Command(dockerBinary, "run", "-d", "busybox", "true")
+ out, _, err := runCommandWithOutput(runCmd)
if err != nil {
- t.Fatal(err)
+ t.Fatal("failed to create a container", out, err)
}
- defer server.Close()
- fileURL := fmt.Sprintf("%s/cirros.tar.gz", server.URL)
- importCmd := exec.Command(dockerBinary, "import", fileURL, "cirros")
- out, _, err := runCommandWithOutput(importCmd)
+ cleanedContainerID := stripTrailingCharacters(out)
+ defer deleteContainer(cleanedContainerID)
+
+ out, _, err = runCommandPipelineWithOutput(
+ exec.Command(dockerBinary, "export", cleanedContainerID),
+ exec.Command(dockerBinary, "import", "-"),
+ )
if err != nil {
t.Errorf("import failed with errors: %v, output: %q", err, out)
}
- if n := strings.Count(out, "\n"); n != 2 {
- t.Fatalf("display is messed up: %d '\\n' instead of 2", n)
+ if n := strings.Count(out, "\n"); n != 1 {
+ t.Fatalf("display is messed up: %d '\\n' instead of 1:\n%s", n, out)
}
+ image := strings.TrimSpace(out)
+ defer deleteImages(image)
- deleteImages("cirros")
+ runCmd = exec.Command(dockerBinary, "run", "--rm", image, "true")
+ out, _, err = runCommandWithOutput(runCmd)
+ if err != nil {
+ t.Fatal("failed to create a container", out, err)
+ }
+
+ if out != "" {
+ t.Fatalf("command output should've been nothing, was %q", out)
+ }
- logDone("import - cirros was imported and display is fine")
+ logDone("import - display is fine, imported image runs")
}
diff --git a/integration-cli/docker_cli_inspect_test.go b/integration-cli/docker_cli_inspect_test.go
index ee69a89a43..cf42217ac8 100644
--- a/integration-cli/docker_cli_inspect_test.go
+++ b/integration-cli/docker_cli_inspect_test.go
@@ -21,38 +21,3 @@ func TestInspectImage(t *testing.T) {
logDone("inspect - inspect an image")
}
-
-func TestInspectExecID(t *testing.T) {
- defer deleteAllContainers()
-
- out, exitCode, err := runCommandWithOutput(exec.Command(dockerBinary, "run", "-d", "busybox", "top"))
- if exitCode != 0 || err != nil {
- t.Fatalf("failed to run container: %s, %v", out, err)
- }
- id := strings.TrimSuffix(out, "\n")
-
- out, err = inspectField(id, "ExecIDs")
- if err != nil {
- t.Fatalf("failed to inspect container: %s, %v", out, err)
- }
- if out != "<no value>" {
- t.Fatalf("ExecIDs should be empty, got: %s", out)
- }
-
- exitCode, err = runCommand(exec.Command(dockerBinary, "exec", "-d", id, "ls", "/"))
- if exitCode != 0 || err != nil {
- t.Fatalf("failed to exec in container: %s, %v", out, err)
- }
-
- out, err = inspectField(id, "ExecIDs")
- if err != nil {
- t.Fatalf("failed to inspect container: %s, %v", out, err)
- }
-
- out = strings.TrimSuffix(out, "\n")
- if out == "[]" || out == "<no value>" {
- t.Fatalf("ExecIDs should not be empty, got: %s", out)
- }
-
- logDone("inspect - inspect a container with ExecIDs")
-}
diff --git a/integration-cli/docker_cli_links_test.go b/integration-cli/docker_cli_links_test.go
index fc99ec57fb..efee8d04e3 100644
--- a/integration-cli/docker_cli_links_test.go
+++ b/integration-cli/docker_cli_links_test.go
@@ -15,6 +15,8 @@ import (
)
func TestLinksEtcHostsRegularFile(t *testing.T) {
+ defer deleteAllContainers()
+
runCmd := exec.Command(dockerBinary, "run", "--net=host", "busybox", "ls", "-la", "/etc/hosts")
out, _, _, err := runCommandWithStdoutStderr(runCmd)
if err != nil {
@@ -24,13 +26,13 @@ func TestLinksEtcHostsRegularFile(t *testing.T) {
if !strings.HasPrefix(out, "-") {
t.Errorf("/etc/hosts should be a regular file")
}
-
- deleteAllContainers()
-
logDone("link - /etc/hosts is a regular file")
}
func TestLinksEtcHostsContentMatch(t *testing.T) {
+ testRequires(t, SameHostDaemon)
+ defer deleteAllContainers()
+
runCmd := exec.Command(dockerBinary, "run", "--net=host", "busybox", "cat", "/etc/hosts")
out, _, _, err := runCommandWithStdoutStderr(runCmd)
if err != nil {
@@ -46,8 +48,6 @@ func TestLinksEtcHostsContentMatch(t *testing.T) {
t.Errorf("container")
}
- deleteAllContainers()
-
logDone("link - /etc/hosts matches hosts copy")
}
@@ -64,21 +64,52 @@ func TestLinksPingUnlinkedContainers(t *testing.T) {
logDone("links - ping unlinked container")
}
+// Test for appropriate error when calling --link with an invalid target container
+func TestLinksInvalidContainerTarget(t *testing.T) {
+ defer deleteAllContainers()
+
+ runCmd := exec.Command(dockerBinary, "run", "--link", "bogus:alias", "busybox", "true")
+ out, _, err := runCommandWithOutput(runCmd)
+
+ if err == nil {
+ t.Fatal("an invalid container target should produce an error")
+ }
+ if !strings.Contains(out, "Could not get container") {
+ t.Fatal("error output expected 'Could not get container', but got %q instead; err: %v", out, err)
+ }
+
+ logDone("links - linking to non-existent container should not work")
+}
+
func TestLinksPingLinkedContainers(t *testing.T) {
- var out string
- out, _, _ = dockerCmd(t, "run", "-d", "--name", "container1", "busybox", "sleep", "10")
- idA := stripTrailingCharacters(out)
- out, _, _ = dockerCmd(t, "run", "-d", "--name", "container2", "busybox", "sleep", "10")
- idB := stripTrailingCharacters(out)
- dockerCmd(t, "run", "--rm", "--link", "container1:alias1", "--link", "container2:alias2", "busybox", "sh", "-c", "ping -c 1 alias1 -W 1 && ping -c 1 alias2 -W 1")
- dockerCmd(t, "kill", idA)
- dockerCmd(t, "kill", idB)
- deleteAllContainers()
+ defer deleteAllContainers()
+
+ runCmd := exec.Command(dockerBinary, "run", "-d", "--name", "container1", "--hostname", "fred", "busybox", "top")
+ if _, err := runCommand(runCmd); err != nil {
+ t.Fatal(err)
+ }
+ runCmd = exec.Command(dockerBinary, "run", "-d", "--name", "container2", "--hostname", "wilma", "busybox", "top")
+ if _, err := runCommand(runCmd); err != nil {
+ t.Fatal(err)
+ }
+
+ runArgs := []string{"run", "--rm", "--link", "container1:alias1", "--link", "container2:alias2", "busybox", "sh", "-c"}
+ pingCmd := "ping -c 1 %s -W 1 && ping -c 1 %s -W 1"
+
+ // test ping by alias, ping by name, and ping by hostname
+ // 1. Ping by alias
+ dockerCmd(t, append(runArgs, fmt.Sprintf(pingCmd, "alias1", "alias2"))...)
+ // 2. Ping by container name
+ dockerCmd(t, append(runArgs, fmt.Sprintf(pingCmd, "container1", "container2"))...)
+ // 3. Ping by hostname
+ dockerCmd(t, append(runArgs, fmt.Sprintf(pingCmd, "fred", "wilma"))...)
logDone("links - ping linked container")
}
func TestLinksPingLinkedContainersAfterRename(t *testing.T) {
+ defer deleteAllContainers()
+
out, _, _ := dockerCmd(t, "run", "-d", "--name", "container1", "busybox", "sleep", "10")
idA := stripTrailingCharacters(out)
out, _, _ = dockerCmd(t, "run", "-d", "--name", "container2", "busybox", "sleep", "10")
@@ -87,64 +118,33 @@ func TestLinksPingLinkedContainersAfterRename(t *testing.T) {
dockerCmd(t, "run", "--rm", "--link", "container_new:alias1", "--link", "container2:alias2", "busybox", "sh", "-c", "ping -c 1 alias1 -W 1 && ping -c 1 alias2 -W 1")
dockerCmd(t, "kill", idA)
dockerCmd(t, "kill", idB)
- deleteAllContainers()
logDone("links - ping linked container after rename")
}
-func TestLinksPingLinkedContainersOnRename(t *testing.T) {
- var out string
- out, _, _ = dockerCmd(t, "run", "-d", "--name", "container1", "busybox", "sleep", "10")
- idA := stripTrailingCharacters(out)
- if idA == "" {
- t.Fatal(out, "id should not be nil")
- }
- out, _, _ = dockerCmd(t, "run", "-d", "--link", "container1:alias1", "--name", "container2", "busybox", "sleep", "10")
- idB := stripTrailingCharacters(out)
- if idB == "" {
- t.Fatal(out, "id should not be nil")
- }
-
- execCmd := exec.Command(dockerBinary, "exec", "container2", "ping", "-c", "1", "alias1", "-W", "1")
- out, _, err := runCommandWithOutput(execCmd)
- if err != nil {
- t.Fatal(out, err)
- }
-
- dockerCmd(t, "rename", "container1", "container_new")
-
- execCmd = exec.Command(dockerBinary, "exec", "container2", "ping", "-c", "1", "alias1", "-W", "1")
- out, _, err = runCommandWithOutput(execCmd)
- if err != nil {
- t.Fatal(out, err)
- }
-
- deleteAllContainers()
-
- logDone("links - ping linked container upon rename")
-}
-
func TestLinksIpTablesRulesWhenLinkAndUnlink(t *testing.T) {
+ testRequires(t, SameHostDaemon)
+ defer deleteAllContainers()
+
dockerCmd(t, "run", "-d", "--name", "child", "--publish", "8080:80", "busybox", "sleep", "10")
dockerCmd(t, "run", "-d", "--name", "parent", "--link", "child:http", "busybox", "sleep", "10")
childIP := findContainerIP(t, "child")
parentIP := findContainerIP(t, "parent")
- sourceRule := []string{"DOCKER", "-i", "docker0", "-o", "docker0", "-p", "tcp", "-s", childIP, "--sport", "80", "-d", parentIP, "-j", "ACCEPT"}
- destinationRule := []string{"DOCKER", "-i", "docker0", "-o", "docker0", "-p", "tcp", "-s", parentIP, "--dport", "80", "-d", childIP, "-j", "ACCEPT"}
- if !iptables.Exists(sourceRule...) || !iptables.Exists(destinationRule...) {
+ sourceRule := []string{"-i", "docker0", "-o", "docker0", "-p", "tcp", "-s", childIP, "--sport", "80", "-d", parentIP, "-j", "ACCEPT"}
+ destinationRule := []string{"-i", "docker0", "-o", "docker0", "-p", "tcp", "-s", parentIP, "--dport", "80", "-d", childIP, "-j", "ACCEPT"}
+ if !iptables.Exists("filter", "DOCKER", sourceRule...) || !iptables.Exists("filter", "DOCKER", destinationRule...) {
t.Fatal("Iptables rules not found")
}
dockerCmd(t, "rm", "--link", "parent/http")
- if iptables.Exists(sourceRule...) || iptables.Exists(destinationRule...) {
+ if iptables.Exists("filter", "DOCKER", sourceRule...) || iptables.Exists("filter", "DOCKER", destinationRule...) {
t.Fatal("Iptables rules should be removed when unlink")
}
dockerCmd(t, "kill", "child")
dockerCmd(t, "kill", "parent")
- deleteAllContainers()
logDone("link - verify iptables when link and unlink")
}
@@ -225,10 +225,12 @@ func TestLinksNotStartedParentNotFail(t *testing.T) {
if err != nil {
t.Fatal(out, err)
}
- logDone("link - container start not failing on updating stopped parent links")
+ logDone("link - container start successfully updating stopped parent links")
}
func TestLinksHostsFilesInject(t *testing.T) {
+ testRequires(t, SameHostDaemon, ExecSupport)
+
defer deleteAllContainers()
out, _, err := runCommandWithOutput(exec.Command(dockerBinary, "run", "-itd", "--name", "one", "busybox", "top"))
@@ -247,12 +249,12 @@ func TestLinksHostsFilesInject(t *testing.T) {
time.Sleep(1 * time.Second)
- contentOne, err := readContainerFile(idOne, "hosts")
+ contentOne, err := readContainerFileWithExec(idOne, "/etc/hosts")
if err != nil {
t.Fatal(err, string(contentOne))
}
- contentTwo, err := readContainerFile(idTwo, "hosts")
+ contentTwo, err := readContainerFileWithExec(idTwo, "/etc/hosts")
if err != nil {
t.Fatal(err, string(contentTwo))
}
@@ -281,6 +283,8 @@ func TestLinksNetworkHostContainer(t *testing.T) {
}
func TestLinksUpdateOnRestart(t *testing.T) {
+ testRequires(t, SameHostDaemon, ExecSupport)
+
defer deleteAllContainers()
if out, err := exec.Command(dockerBinary, "run", "-d", "--name", "one", "busybox", "top").CombinedOutput(); err != nil {
@@ -296,7 +300,7 @@ func TestLinksUpdateOnRestart(t *testing.T) {
if err != nil {
t.Fatal(err)
}
- content, err := readContainerFile(id, "hosts")
+ content, err := readContainerFileWithExec(id, "/etc/hosts")
if err != nil {
t.Fatal(err, string(content))
}
@@ -321,7 +325,7 @@ func TestLinksUpdateOnRestart(t *testing.T) {
if err != nil {
t.Fatal(err)
}
- content, err = readContainerFile(id, "hosts")
+ content, err = readContainerFileWithExec(id, "/etc/hosts")
if err != nil {
t.Fatal(err, string(content))
}
diff --git a/integration-cli/docker_cli_nat_test.go b/integration-cli/docker_cli_nat_test.go
index 7e3b595a80..729977bce7 100644
--- a/integration-cli/docker_cli_nat_test.go
+++ b/integration-cli/docker_cli_nat_test.go
@@ -9,6 +9,9 @@ import (
)
func TestNetworkNat(t *testing.T) {
+ testRequires(t, SameHostDaemon, NativeExecDriver)
+ defer deleteAllContainers()
+
iface, err := net.InterfaceByName("eth0")
if err != nil {
t.Skipf("Test not running with `make test`. Interface eth0 not found: %s", err)
@@ -54,7 +57,6 @@ func TestNetworkNat(t *testing.T) {
if out, _, err = runCommandWithOutput(killCmd); err != nil {
t.Fatalf("failed to kill container: %s, %v", out, err)
}
- deleteAllContainers()
logDone("network - make sure nat works through the host")
}
diff --git a/integration-cli/docker_cli_pause_test.go b/integration-cli/docker_cli_pause_test.go
new file mode 100644
index 0000000000..f1ccde9cfc
--- /dev/null
+++ b/integration-cli/docker_cli_pause_test.go
@@ -0,0 +1,112 @@
+package main
+
+import (
+ "fmt"
+ "os/exec"
+ "strings"
+ "testing"
+)
+
+func TestPause(t *testing.T) {
+ defer deleteAllContainers()
+ defer unpauseAllContainers()
+
+ name := "testeventpause"
+ out, _, _ := dockerCmd(t, "images", "-q")
+ image := strings.Split(out, "\n")[0]
+ dockerCmd(t, "run", "-d", "--name", name, image, "sleep", "2")
+
+ dockerCmd(t, "pause", name)
+ pausedContainers, err := getSliceOfPausedContainers()
+ if err != nil {
+ t.Fatalf("error thrown while checking if containers were paused: %v", err)
+ }
+ if len(pausedContainers) != 1 {
+ t.Fatalf("there should be one paused container and not", len(pausedContainers))
+ }
+
+ dockerCmd(t, "unpause", name)
+
+ eventsCmd := exec.Command(dockerBinary, "events", "--since=0", fmt.Sprintf("--until=%d", daemonTime(t).Unix()))
+ out, _, _ = runCommandWithOutput(eventsCmd)
+ events := strings.Split(out, "\n")
+ if len(events) <= 1 {
+ t.Fatalf("Missing expected event")
+ }
+
+ pauseEvent := strings.Fields(events[len(events)-3])
+ unpauseEvent := strings.Fields(events[len(events)-2])
+
+ if pauseEvent[len(pauseEvent)-1] != "pause" {
+ t.Fatalf("event should be pause, not %#v", pauseEvent)
+ }
+ if unpauseEvent[len(unpauseEvent)-1] != "unpause" {
+ t.Fatalf("event should be unpause, not %#v", unpauseEvent)
+ }
+
+ waitCmd := exec.Command(dockerBinary, "wait", name)
+ if waitOut, _, err := runCommandWithOutput(waitCmd); err != nil {
+ t.Fatalf("error thrown while waiting for container: %s, %v", waitOut, err)
+ }
+
+ logDone("pause - pause/unpause is logged")
+}
+
+func TestPauseMultipleContainers(t *testing.T) {
+ defer deleteAllContainers()
+ defer unpauseAllContainers()
+
+ containers := []string{
+ "testpausewithmorecontainers1",
+ "testpausewithmorecontainers2",
+ }
+ out, _, _ := dockerCmd(t, "images", "-q")
+ image := strings.Split(out, "\n")[0]
+ for _, name := range containers {
+ dockerCmd(t, "run", "-d", "--name", name, image, "sleep", "2")
+ }
+ dockerCmd(t, append([]string{"pause"}, containers...)...)
+ pausedContainers, err := getSliceOfPausedContainers()
+ if err != nil {
+ t.Fatalf("error thrown while checking if containers were paused: %v", err)
+ }
+ if len(pausedContainers) != len(containers) {
+ t.Fatalf("there should be %d paused container and not %d", len(containers), len(pausedContainers))
+ }
+
+ dockerCmd(t, append([]string{"unpause"}, containers...)...)
+
+ eventsCmd := exec.Command(dockerBinary, "events", "--since=0", fmt.Sprintf("--until=%d", daemonTime(t).Unix()))
+ out, _, _ = runCommandWithOutput(eventsCmd)
+ events := strings.Split(out, "\n")
+ if len(events) <= len(containers)*3-2 {
+ t.Fatalf("Missing expected event")
+ }
+
+ pauseEvents := make([][]string, len(containers))
+ unpauseEvents := make([][]string, len(containers))
+ for i := range containers {
+ pauseEvents[i] = strings.Fields(events[len(events)-len(containers)*2-1+i])
+ unpauseEvents[i] = strings.Fields(events[len(events)-len(containers)-1+i])
+ }
+
+ for _, pauseEvent := range pauseEvents {
+ if pauseEvent[len(pauseEvent)-1] != "pause" {
+ t.Fatalf("event should be pause, not %#v", pauseEvent)
+ }
+ }
+ for _, unpauseEvent := range unpauseEvents {
+ if unpauseEvent[len(unpauseEvent)-1] != "unpause" {
+ t.Fatalf("event should be unpause, not %#v", unpauseEvent)
+ }
+ }
+
+ for _, name := range containers {
+ waitCmd := exec.Command(dockerBinary, "wait", name)
+ if waitOut, _, err := runCommandWithOutput(waitCmd); err != nil {
+ t.Fatalf("error thrown while waiting for container: %s, %v", waitOut, err)
+ }
+ }
+
+ logDone("pause - multi pause/unpause is logged")
+}
diff --git a/integration-cli/docker_cli_port_test.go b/integration-cli/docker_cli_port_test.go
index 1ea7374e85..6b68346d4c 100644
--- a/integration-cli/docker_cli_port_test.go
+++ b/integration-cli/docker_cli_port_test.go
@@ -8,6 +8,8 @@ import (
)
func TestPortList(t *testing.T) {
+ defer deleteAllContainers()
+
// one port
runCmd := exec.Command(dockerBinary, "run", "-d", "-p", "9876:80", "busybox", "top")
out, _, err := runCommandWithOutput(runCmd)
@@ -121,8 +123,6 @@ func TestPortList(t *testing.T) {
t.Fatal(out, err)
}
- deleteAllContainers()
-
logDone("port - test port list")
}
diff --git a/integration-cli/docker_cli_proxy_test.go b/integration-cli/docker_cli_proxy_test.go
new file mode 100644
index 0000000000..b39dd5634d
--- /dev/null
+++ b/integration-cli/docker_cli_proxy_test.go
@@ -0,0 +1,64 @@
+package main
+
+import (
+ "net"
+ "os/exec"
+ "strings"
+ "testing"
+)
+
+func TestCliProxyDisableProxyUnixSock(t *testing.T) {
+ testRequires(t, SameHostDaemon) // test is valid when DOCKER_HOST=unix://..
+
+ cmd := exec.Command(dockerBinary, "info")
+ cmd.Env = appendBaseEnv([]string{"HTTP_PROXY=http://127.0.0.1:9999"})
+
+ if out, _, err := runCommandWithOutput(cmd); err != nil {
+ t.Fatal(err, out)
+ }
+
+ logDone("cli proxy - HTTP_PROXY is not used when connecting to unix sock")
+}
+
+// Can't use localhost here since go has a special case to not use proxy if connecting to localhost
+// See http://golang.org/pkg/net/http/#ProxyFromEnvironment
+func TestCliProxyProxyTCPSock(t *testing.T) {
+ testRequires(t, SameHostDaemon)
+ // get the IP to use to connect since we can't use localhost
+ addrs, err := net.InterfaceAddrs()
+ if err != nil {
+ t.Fatal(err)
+ }
+ var ip string
+ for _, addr := range addrs {
+ sAddr := addr.String()
+ if !strings.Contains(sAddr, "127.0.0.1") {
+ addrArr := strings.Split(sAddr, "/")
+ ip = addrArr[0]
+ break
+ }
+ }
+
+ if ip == "" {
+ t.Fatal("could not find ip to connect to")
+ }
+
+ d := NewDaemon(t)
+ if err := d.Start("-H", "tcp://"+ip+":2375"); err != nil {
+ t.Fatal(err)
+ }
+
+ cmd := exec.Command(dockerBinary, "info")
+ cmd.Env = []string{"DOCKER_HOST=tcp://" + ip + ":2375", "HTTP_PROXY=127.0.0.1:9999"}
+ if out, _, err := runCommandWithOutput(cmd); err == nil {
+ t.Fatal(err, out)
+ }
+
+ // Test with no_proxy
+ cmd.Env = append(cmd.Env, "NO_PROXY="+ip)
+ if out, _, err := runCommandWithOutput(exec.Command(dockerBinary, "info")); err != nil {
+ t.Fatal(err, out)
+ }
+
+ logDone("cli proxy - HTTP_PROXY is used for TCP sock")
+}
diff --git a/integration-cli/docker_cli_ps_test.go b/integration-cli/docker_cli_ps_test.go
index fc22bc7d7e..c2e108576d 100644
--- a/integration-cli/docker_cli_ps_test.go
+++ b/integration-cli/docker_cli_ps_test.go
@@ -1,13 +1,18 @@
package main
import (
+ "fmt"
"os/exec"
+ "reflect"
+ "strconv"
"strings"
"testing"
"time"
)
func TestPsListContainers(t *testing.T) {
+ defer deleteAllContainers()
+
runCmd := exec.Command(dockerBinary, "run", "-d", "busybox", "top")
out, _, err := runCommandWithOutput(runCmd)
if err != nil {
@@ -220,8 +225,6 @@ func TestPsListContainers(t *testing.T) {
t.Error("Container list is not in the correct order")
}
- deleteAllContainers()
-
logDone("ps - test ps options")
}
@@ -243,6 +246,20 @@ func assertContainerList(out string, expected []string) bool {
}
func TestPsListContainersSize(t *testing.T) {
+ defer deleteAllContainers()
+
+ cmd := exec.Command(dockerBinary, "run", "-d", "busybox", "echo", "hello")
+ runCommandWithOutput(cmd)
+ cmd = exec.Command(dockerBinary, "ps", "-s", "-n=1")
+ base_out, _, err := runCommandWithOutput(cmd)
+ base_lines := strings.Split(strings.Trim(base_out, "\n "), "\n")
+ base_sizeIndex := strings.Index(base_lines[0], "SIZE")
+ base_foundSize := base_lines[1][base_sizeIndex:]
+ base_bytes, err := strconv.Atoi(strings.Split(base_foundSize, " ")[0])
+ if err != nil {
+ t.Fatal(err)
+ }
+
name := "test_size"
runCmd := exec.Command(dockerBinary, "run", "--name", name, "busybox", "sh", "-c", "echo 1 > test")
out, _, err := runCommandWithOutput(runCmd)
@@ -275,19 +292,19 @@ func TestPsListContainersSize(t *testing.T) {
if foundID != id[:12] {
t.Fatalf("Expected id %s, got %s", id[:12], foundID)
}
- expectedSize := "2 B"
+ expectedSize := fmt.Sprintf("%d B", (2 + base_bytes))
foundSize := lines[1][sizeIndex:]
if foundSize != expectedSize {
t.Fatalf("Expected size %q, got %q", expectedSize, foundSize)
}
- deleteAllContainers()
logDone("ps - test ps size")
}
func TestPsListContainersFilterStatus(t *testing.T) {
// FIXME: this should test paused, but it makes things hang and its wonky
// this is because paused containers can't be controlled by signals
+ defer deleteAllContainers()
// start exited container
runCmd := exec.Command(dockerBinary, "run", "-d", "busybox")
@@ -304,7 +321,7 @@ func TestPsListContainersFilterStatus(t *testing.T) {
}
// start running container
- runCmd = exec.Command(dockerBinary, "run", "-d", "busybox", "sh", "-c", "sleep 360")
+ runCmd = exec.Command(dockerBinary, "run", "-itd", "busybox")
out, _, err = runCommandWithOutput(runCmd)
if err != nil {
t.Fatal(out, err)
@@ -332,12 +349,12 @@ func TestPsListContainersFilterStatus(t *testing.T) {
t.Fatalf("Expected id %s, got %s for running filter, output: %q", secondID[:12], containerOut, out)
}
- deleteAllContainers()
-
logDone("ps - test ps filter status")
}
func TestPsListContainersFilterID(t *testing.T) {
+ defer deleteAllContainers()
+
// start container
runCmd := exec.Command(dockerBinary, "run", "-d", "busybox")
out, _, err := runCommandWithOutput(runCmd)
@@ -362,12 +379,12 @@ func TestPsListContainersFilterID(t *testing.T) {
t.Fatalf("Expected id %s, got %s for exited filter, output: %q", firstID[:12], containerOut, out)
}
- deleteAllContainers()
-
logDone("ps - test ps filter id")
}
func TestPsListContainersFilterName(t *testing.T) {
+ defer deleteAllContainers()
+
// start container
runCmd := exec.Command(dockerBinary, "run", "-d", "--name=a_name_to_match", "busybox")
out, _, err := runCommandWithOutput(runCmd)
@@ -392,9 +409,75 @@ func TestPsListContainersFilterName(t *testing.T) {
t.Fatalf("Expected id %s, got %s for exited filter, output: %q", firstID[:12], containerOut, out)
}
+ logDone("ps - test ps filter name")
+}
+
+func TestPsListContainersFilterLabel(t *testing.T) {
+ // start container
+ runCmd := exec.Command(dockerBinary, "run", "-d", "-l", "match=me", "-l", "second=tag", "busybox")
+ out, _, err := runCommandWithOutput(runCmd)
+ if err != nil {
+ t.Fatal(out, err)
+ }
+ firstID := stripTrailingCharacters(out)
+
+ // start another container
+ runCmd = exec.Command(dockerBinary, "run", "-d", "-l", "match=me too", "busybox")
+ if out, _, err = runCommandWithOutput(runCmd); err != nil {
+ t.Fatal(out, err)
+ }
+ secondID := stripTrailingCharacters(out)
+
+ // start third container
+ runCmd = exec.Command(dockerBinary, "run", "-d", "-l", "nomatch=me", "busybox")
+ if out, _, err = runCommandWithOutput(runCmd); err != nil {
+ t.Fatal(out, err)
+ }
+ thirdID := stripTrailingCharacters(out)
+
+ // filter containers by exact match
+ runCmd = exec.Command(dockerBinary, "ps", "-a", "-q", "--no-trunc", "--filter=label=match=me")
+ if out, _, err = runCommandWithOutput(runCmd); err != nil {
+ t.Fatal(out, err)
+ }
+ containerOut := strings.TrimSpace(out)
+ if containerOut != firstID {
+ t.Fatalf("Expected id %s, got %s for exited filter, output: %q", firstID, containerOut, out)
+ }
+
+ // filter containers by two labels
+ runCmd = exec.Command(dockerBinary, "ps", "-a", "-q", "--no-trunc", "--filter=label=match=me", "--filter=label=second=tag")
+ if out, _, err = runCommandWithOutput(runCmd); err != nil {
+ t.Fatal(out, err)
+ }
+ containerOut = strings.TrimSpace(out)
+ if containerOut != firstID {
+ t.Fatalf("Expected id %s, got %s for exited filter, output: %q", firstID, containerOut, out)
+ }
+
+ // filter containers by two labels, but expect not found because of AND behavior
+ runCmd = exec.Command(dockerBinary, "ps", "-a", "-q", "--no-trunc", "--filter=label=match=me", "--filter=label=second=tag-no")
+ if out, _, err = runCommandWithOutput(runCmd); err != nil {
+ t.Fatal(out, err)
+ }
+ containerOut = strings.TrimSpace(out)
+ if containerOut != "" {
+ t.Fatalf("Expected nothing, got %s for exited filter, output: %q", containerOut, out)
+ }
+
+ // filter containers by exact key
+ runCmd = exec.Command(dockerBinary, "ps", "-a", "-q", "--no-trunc", "--filter=label=match")
+ if out, _, err = runCommandWithOutput(runCmd); err != nil {
+ t.Fatal(out, err)
+ }
+ containerOut = strings.TrimSpace(out)
+ if (!strings.Contains(containerOut, firstID) || !strings.Contains(containerOut, secondID)) || strings.Contains(containerOut, thirdID) {
+ t.Fatalf("Expected ids %s,%s, got %s for exited filter, output: %q", firstID, secondID, containerOut, out)
+ }
+
deleteAllContainers()
- logDone("ps - test ps filter name")
+ logDone("ps - test ps filter label")
}
func TestPsListContainersFilterExited(t *testing.T) {
@@ -476,3 +559,100 @@ func TestPsListContainersFilterExited(t *testing.T) {
logDone("ps - test ps filter exited")
}
+
+func TestPsRightTagName(t *testing.T) {
+ tag := "asybox:shmatest"
+ defer deleteAllContainers()
+ defer deleteImages(tag)
+ if out, err := exec.Command(dockerBinary, "tag", "busybox", tag).CombinedOutput(); err != nil {
+ t.Fatalf("Failed to tag image: %s, out: %q", err, out)
+ }
+
+ var id1 string
+ if out, err := exec.Command(dockerBinary, "run", "-d", "busybox", "top").CombinedOutput(); err != nil {
+ t.Fatalf("Failed to run container: %s, out: %q", err, out)
+ } else {
+ id1 = strings.TrimSpace(string(out))
+ }
+
+ var id2 string
+ if out, err := exec.Command(dockerBinary, "run", "-d", tag, "top").CombinedOutput(); err != nil {
+ t.Fatalf("Failed to run container: %s, out: %q", err, out)
+ } else {
+ id2 = strings.TrimSpace(string(out))
+ }
+ out, err := exec.Command(dockerBinary, "ps", "--no-trunc").CombinedOutput()
+ if err != nil {
+ t.Fatalf("Failed to run 'ps': %s, out: %q", err, out)
+ }
+ lines := strings.Split(strings.TrimSpace(string(out)), "\n")
+ // skip header
+ lines = lines[1:]
+ if len(lines) != 2 {
+ t.Fatalf("There should be 2 running container, got %d", len(lines))
+ }
+ for _, line := range lines {
+ f := strings.Fields(line)
+ switch f[0] {
+ case id1:
+ if f[1] != "busybox:latest" {
+ t.Fatalf("Expected %s tag for id %s, got %s", "busybox", id1, f[1])
+ }
+ case id2:
+ if f[1] != tag {
+ t.Fatalf("Expected %s tag for id %s, got %s", tag, id1, f[1])
+ }
+ default:
+ t.Fatalf("Unexpected id %s, expected %s and %s", f[0], id1, id2)
+ }
+ }
+ logDone("ps - right tags for containers")
+}
+
+func TestPsLinkedWithNoTrunc(t *testing.T) {
+ defer deleteAllContainers()
+ if out, err := exec.Command(dockerBinary, "run", "--name=first", "-d", "busybox", "top").CombinedOutput(); err != nil {
+ t.Fatalf("Output: %s, err: %s", out, err)
+ }
+ if out, err := exec.Command(dockerBinary, "run", "--name=second", "--link=first:first", "-d", "busybox", "top").CombinedOutput(); err != nil {
+ t.Fatalf("Output: %s, err: %s", out, err)
+ }
+ out, err := exec.Command(dockerBinary, "ps", "--no-trunc").CombinedOutput()
+ if err != nil {
+ t.Fatalf("Output: %s, err: %s", out, err)
+ }
+ lines := strings.Split(strings.TrimSpace(string(out)), "\n")
+ // strip header
+ lines = lines[1:]
+ expected := []string{"second", "first,second/first"}
+ var names []string
+ for _, l := range lines {
+ fields := strings.Fields(l)
+ names = append(names, fields[len(fields)-1])
+ }
+ if !reflect.DeepEqual(expected, names) {
+ t.Fatalf("Expected array: %v, got: %v", expected, names)
+ }
+}
+
+func TestPsGroupPortRange(t *testing.T) {
+ defer deleteAllContainers()
+
+ portRange := "3300-3900"
+ out, _, err := runCommandWithOutput(exec.Command(dockerBinary, "run", "-d", "--name", "porttest", "-p", portRange+":"+portRange, "busybox", "top"))
+ if err != nil {
+ t.Fatal(out, err)
+ }
+
+ out, _, err = runCommandWithOutput(exec.Command(dockerBinary, "ps"))
+ if err != nil {
+ t.Fatal(out, err)
+ }
+
+ // check that the port range is in the output
+ if !strings.Contains(string(out), portRange) {
+ t.Fatalf("docker ps output should have had the port range %q: %s", portRange, string(out))
+ }
+
+ logDone("ps - port range")
+}
diff --git a/integration-cli/docker_cli_pull_test.go b/integration-cli/docker_cli_pull_test.go
index 14f0642e07..926e763434 100644
--- a/integration-cli/docker_cli_pull_test.go
+++ b/integration-cli/docker_cli_pull_test.go
@@ -26,7 +26,7 @@ func TestPullImageWithAliases(t *testing.T) {
}
defer deleteImages(repo)
if out, err := exec.Command(dockerBinary, "push", repo).CombinedOutput(); err != nil {
- t.Fatalf("Failed to push image %v: error %v, output %q", err, string(out))
+ t.Fatalf("Failed to push image %v: error %v, output %q", repo, err, string(out))
}
}
@@ -53,39 +53,31 @@ func TestPullImageWithAliases(t *testing.T) {
logDone("pull - image with aliases")
}
-// pulling busybox should show verified message
+// pulling library/hello-world should show verified message
func TestPullVerified(t *testing.T) {
- defer setupRegistry(t)()
-
- repo := fmt.Sprintf("%v/dockercli/busybox:verified", privateRegistryURL)
- defer deleteImages(repo)
-
- // tag the image
- if out, _, err := runCommandWithOutput(exec.Command(dockerBinary, "tag", "busybox", repo)); err != nil {
- t.Fatalf("Failed to tag image verifiedTest: error %v, output %q", err, out)
- }
+ // Image must be pulled from central repository to get verified message
+ // unless keychain is manually updated to contain the daemon's sign key.
- // push it
- if out, err := exec.Command(dockerBinary, "push", repo).CombinedOutput(); err != nil {
- t.Fatalf("Failed to push image %v: error %v, output %q", err, string(out))
- }
-
- // remove it locally
- if out, err := exec.Command(dockerBinary, "rmi", repo).CombinedOutput(); err != nil {
- t.Fatalf("Failed to clean images: error %v, output %q", err, string(out))
- }
+ verifiedName := "hello-world"
+ defer deleteImages(verifiedName)
// pull it
expected := "The image you are pulling has been verified"
- pullCmd := exec.Command(dockerBinary, "pull", repo)
- if out, _, err := runCommandWithOutput(pullCmd); err != nil || !strings.Contains(out, expected) {
+ pullCmd := exec.Command(dockerBinary, "pull", verifiedName)
+ if out, exitCode, err := runCommandWithOutput(pullCmd); err != nil || !strings.Contains(out, expected) {
+ if err != nil || exitCode != 0 {
+ t.Skipf("pulling the '%s' image from the registry has failed: %s", verifiedName, err)
+ }
t.Fatalf("pulling a verified image failed. expected: %s\ngot: %s, %v", expected, out, err)
}
// pull it again
- pullCmd = exec.Command(dockerBinary, "pull", repo)
- if out, _, err := runCommandWithOutput(pullCmd); err != nil || !strings.Contains(out, expected) {
- t.Fatalf("pulling a verified image failed. expected: %s\ngot: %s, %v", expected, out, err)
+ pullCmd = exec.Command(dockerBinary, "pull", verifiedName)
+ if out, exitCode, err := runCommandWithOutput(pullCmd); err != nil || strings.Contains(out, expected) {
+ if err != nil || exitCode != 0 {
+ t.Skipf("pulling the '%s' image from the registry has failed: %s", verifiedName, err)
+ }
+ t.Fatalf("pulling a verified image failed. unexpected verify message\ngot: %s, %v", out, err)
}
logDone("pull - pull verified")
@@ -93,6 +85,8 @@ func TestPullVerified(t *testing.T) {
// pulling an image from the central registry should work
func TestPullImageFromCentralRegistry(t *testing.T) {
+ defer deleteImages("hello-world")
+
pullCmd := exec.Command(dockerBinary, "pull", "hello-world")
if out, _, err := runCommandWithOutput(pullCmd); err != nil {
t.Fatalf("pulling the hello-world image from the registry has failed: %s, %v", out, err)
diff --git a/integration-cli/docker_cli_push_test.go b/integration-cli/docker_cli_push_test.go
index bcab5314a7..f1274ba706 100644
--- a/integration-cli/docker_cli_push_test.go
+++ b/integration-cli/docker_cli_push_test.go
@@ -17,7 +17,7 @@ func TestPushBusyboxImage(t *testing.T) {
defer setupRegistry(t)()
repoName := fmt.Sprintf("%v/dockercli/busybox", privateRegistryURL)
- // tag the image to upload it tot he private registry
+ // tag the image to upload it to the private registry
tagCmd := exec.Command(dockerBinary, "tag", "busybox", repoName)
if out, _, err := runCommandWithOutput(tagCmd); err != nil {
t.Fatalf("image tagging failed: %s, %v", out, err)
@@ -37,7 +37,7 @@ func TestPushUnprefixedRepo(t *testing.T) {
if out, _, err := runCommandWithOutput(pushCmd); err == nil {
t.Fatalf("pushing an unprefixed repo didn't result in a non-zero exit status: %s", out)
}
- logDone("push - unprefixed busybox repo must fail")
+ logDone("push - unprefixed busybox repo must not pass")
}
func TestPushUntagged(t *testing.T) {
@@ -45,7 +45,7 @@ func TestPushUntagged(t *testing.T) {
repoName := fmt.Sprintf("%v/dockercli/busybox", privateRegistryURL)
- expected := "No tags to push"
+ expected := "Repository does not exist"
pushCmd := exec.Command(dockerBinary, "push", repoName)
if out, _, err := runCommandWithOutput(pushCmd); err == nil {
t.Fatalf("pushing the image to the private registry should have failed: outuput %q", out)
diff --git a/integration-cli/docker_cli_rename_test.go b/integration-cli/docker_cli_rename_test.go
index 911bab25ab..3aaf795226 100644
--- a/integration-cli/docker_cli_rename_test.go
+++ b/integration-cli/docker_cli_rename_test.go
@@ -7,6 +7,8 @@ import (
)
func TestRenameStoppedContainer(t *testing.T) {
+ defer deleteAllContainers()
+
runCmd := exec.Command(dockerBinary, "run", "--name", "first_name", "-d", "busybox", "sh")
out, _, err := runCommandWithOutput(runCmd)
if err != nil {
@@ -33,15 +35,16 @@ func TestRenameStoppedContainer(t *testing.T) {
if err != nil {
t.Fatal(err)
}
- if name != "new_name" {
+ if name != "/new_name" {
t.Fatal("Failed to rename container ", name)
}
- deleteAllContainers()
logDone("rename - stopped container")
}
func TestRenameRunningContainer(t *testing.T) {
+ defer deleteAllContainers()
+
runCmd := exec.Command(dockerBinary, "run", "--name", "first_name", "-d", "busybox", "sh")
out, _, err := runCommandWithOutput(runCmd)
if err != nil {
@@ -59,15 +62,16 @@ func TestRenameRunningContainer(t *testing.T) {
if err != nil {
t.Fatal(err)
}
- if name != "new_name" {
+ if name != "/new_name" {
t.Fatal("Failed to rename container ")
}
- deleteAllContainers()
logDone("rename - running container")
}
func TestRenameCheckNames(t *testing.T) {
+ defer deleteAllContainers()
+
runCmd := exec.Command(dockerBinary, "run", "--name", "first_name", "-d", "busybox", "sh")
out, _, err := runCommandWithOutput(runCmd)
if err != nil {
@@ -84,7 +88,7 @@ func TestRenameCheckNames(t *testing.T) {
if err != nil {
t.Fatal(err)
}
- if name != "new_name" {
+ if name != "/new_name" {
t.Fatal("Failed to rename container ")
}
@@ -93,8 +97,6 @@ func TestRenameCheckNames(t *testing.T) {
t.Fatal(err)
}
- deleteAllContainers()
-
logDone("rename - running container")
}
diff --git a/integration-cli/docker_cli_restart_test.go b/integration-cli/docker_cli_restart_test.go
index fc82023b2d..7b97c0725b 100644
--- a/integration-cli/docker_cli_restart_test.go
+++ b/integration-cli/docker_cli_restart_test.go
@@ -8,6 +8,8 @@ import (
)
func TestRestartStoppedContainer(t *testing.T) {
+ defer deleteAllContainers()
+
runCmd := exec.Command(dockerBinary, "run", "-d", "busybox", "echo", "foobar")
out, _, err := runCommandWithOutput(runCmd)
if err != nil {
@@ -46,12 +48,12 @@ func TestRestartStoppedContainer(t *testing.T) {
t.Errorf("container should've printed 'foobar' twice")
}
- deleteAllContainers()
-
logDone("restart - echo foobar for stopped container")
}
func TestRestartRunningContainer(t *testing.T) {
+ defer deleteAllContainers()
+
runCmd := exec.Command(dockerBinary, "run", "-d", "busybox", "sh", "-c", "echo foobar && sleep 30 && echo 'should not print this'")
out, _, err := runCommandWithOutput(runCmd)
if err != nil {
@@ -89,13 +91,13 @@ func TestRestartRunningContainer(t *testing.T) {
t.Errorf("container should've printed 'foobar' twice")
}
- deleteAllContainers()
-
logDone("restart - echo foobar for running container")
}
// Test that restarting a container with a volume does not create a new volume on restart. Regression test for #819.
func TestRestartWithVolumes(t *testing.T) {
+ defer deleteAllContainers()
+
runCmd := exec.Command(dockerBinary, "run", "-d", "-v", "/test", "busybox", "top")
out, _, err := runCommandWithOutput(runCmd)
if err != nil {
@@ -147,8 +149,6 @@ func TestRestartWithVolumes(t *testing.T) {
t.Errorf("expected volume path: %s Actual path: %s", volumes, volumesAfterRestart)
}
- deleteAllContainers()
-
logDone("restart - does not create a new volume on restart")
}
@@ -214,3 +214,33 @@ func TestRestartPolicyOnFailure(t *testing.T) {
logDone("restart - recording restart policy name for --restart=on-failure")
}
+
+// a good container with --restart=on-failure:3
+// MaximumRetryCount!=0; RestartCount=0
+func TestContainerRestartwithGoodContainer(t *testing.T) {
+ defer deleteAllContainers()
+ out, err := exec.Command(dockerBinary, "run", "-d", "--restart=on-failure:3", "busybox", "true").CombinedOutput()
+ if err != nil {
+ t.Fatal(string(out), err)
+ }
+ id := strings.TrimSpace(string(out))
+ if err := waitInspect(id, "{{ .State.Restarting }} {{ .State.Running }}", "false false", 5); err != nil {
+ t.Fatal(err)
+ }
+ count, err := inspectField(id, "RestartCount")
+ if err != nil {
+ t.Fatal(err)
+ }
+ if count != "0" {
+ t.Fatalf("Container was restarted %s times, expected %d", count, 0)
+ }
+ MaximumRetryCount, err := inspectField(id, "HostConfig.RestartPolicy.MaximumRetryCount")
+ if err != nil {
+ t.Fatal(err)
+ }
+ if MaximumRetryCount != "3" {
+ t.Fatalf("Container Maximum Retry Count is %s, expected %s", MaximumRetryCount, "3")
+ }
+
+ logDone("restart - for a good container with restart policy, MaximumRetryCount is not 0 and RestartCount is 0")
+}
diff --git a/integration-cli/docker_cli_rm_test.go b/integration-cli/docker_cli_rm_test.go
index 89ede7abc6..d01b36d45d 100644
--- a/integration-cli/docker_cli_rm_test.go
+++ b/integration-cli/docker_cli_rm_test.go
@@ -8,6 +8,9 @@ import (
)
func TestRmContainerWithRemovedVolume(t *testing.T) {
+ testRequires(t, SameHostDaemon)
+ defer deleteAllContainers()
+
cmd := exec.Command(dockerBinary, "run", "--name", "losemyvolumes", "-v", "/tmp/testing:/test", "busybox", "true")
if _, err := runCommand(cmd); err != nil {
t.Fatal(err)
@@ -22,12 +25,12 @@ func TestRmContainerWithRemovedVolume(t *testing.T) {
t.Fatal(out, err)
}
- deleteAllContainers()
-
logDone("rm - removed volume")
}
func TestRmContainerWithVolume(t *testing.T) {
+ defer deleteAllContainers()
+
cmd := exec.Command(dockerBinary, "run", "--name", "foo", "-v", "/srv", "busybox", "true")
if _, err := runCommand(cmd); err != nil {
t.Fatal(err)
@@ -38,12 +41,12 @@ func TestRmContainerWithVolume(t *testing.T) {
t.Fatal(err)
}
- deleteAllContainers()
-
logDone("rm - volume")
}
func TestRmRunningContainer(t *testing.T) {
+ defer deleteAllContainers()
+
createRunningContainer(t, "foo")
// Test cannot remove running container
@@ -52,12 +55,12 @@ func TestRmRunningContainer(t *testing.T) {
t.Fatalf("Expected error, can't rm a running container")
}
- deleteAllContainers()
-
logDone("rm - running container")
}
func TestRmRunningContainerCheckError409(t *testing.T) {
+ defer deleteAllContainers()
+
createRunningContainer(t, "foo")
endpoint := "/containers/foo"
@@ -70,12 +73,12 @@ func TestRmRunningContainerCheckError409(t *testing.T) {
t.Fatalf("Expected error to contain '409 Conflict' but found %s", err)
}
- deleteAllContainers()
-
logDone("rm - running container")
}
func TestRmForceRemoveRunningContainer(t *testing.T) {
+ defer deleteAllContainers()
+
createRunningContainer(t, "foo")
// Stop then remove with -s
@@ -84,12 +87,12 @@ func TestRmForceRemoveRunningContainer(t *testing.T) {
t.Fatal(err)
}
- deleteAllContainers()
-
logDone("rm - running container with --force=true")
}
func TestRmContainerOrphaning(t *testing.T) {
+ defer deleteAllContainers()
+
dockerfile1 := `FROM busybox:latest
ENTRYPOINT ["/bin/true"]`
img := "test-container-orphaning"
@@ -99,6 +102,7 @@ func TestRmContainerOrphaning(t *testing.T) {
// build first dockerfile
img1, err := buildImage(img, dockerfile1, true)
+ defer deleteImages(img1)
if err != nil {
t.Fatalf("Could not build image %s: %v", img, err)
}
@@ -123,9 +127,6 @@ func TestRmContainerOrphaning(t *testing.T) {
t.Fatalf("Orphaned container (could not find %q in docker images): %s", img1, out)
}
- deleteAllContainers()
- deleteImages(img1)
-
logDone("rm - container orphaning")
}
diff --git a/integration-cli/docker_cli_rmi_test.go b/integration-cli/docker_cli_rmi_test.go
index 63d9f92983..fd34c22429 100644
--- a/integration-cli/docker_cli_rmi_test.go
+++ b/integration-cli/docker_cli_rmi_test.go
@@ -78,6 +78,8 @@ func TestRmiTag(t *testing.T) {
}
func TestRmiTagWithExistingContainers(t *testing.T) {
+ defer deleteAllContainers()
+
container := "test-delete-tag"
newtag := "busybox:newtag"
bb := "busybox:latest"
@@ -95,14 +97,19 @@ func TestRmiTagWithExistingContainers(t *testing.T) {
t.Fatalf("Expected 1 untagged entry got %d: %q", d, out)
}
- deleteAllContainers()
-
logDone("rmi - delete tag with existing containers")
}
func TestRmiForceWithExistingContainers(t *testing.T) {
+ defer deleteAllContainers()
+
image := "busybox-clone"
- if out, _, err := runCommandWithOutput(exec.Command(dockerBinary, "build", "--no-cache", "-t", image, "/docker-busybox")); err != nil {
+
+ cmd := exec.Command(dockerBinary, "build", "--no-cache", "-t", image, "-")
+ cmd.Stdin = strings.NewReader(`FROM busybox
+MAINTAINER foo`)
+
+ if out, _, err := runCommandWithOutput(cmd); err != nil {
t.Fatalf("Could not build %s: %s, %v", image, out, err)
}
@@ -115,7 +122,52 @@ func TestRmiForceWithExistingContainers(t *testing.T) {
t.Fatalf("Could not remove image %s: %s, %v", image, out, err)
}
- deleteAllContainers()
-
logDone("rmi - force delete with existing containers")
}
+
+func TestRmiWithMultipleRepositories(t *testing.T) {
+ defer deleteAllContainers()
+ newRepo := "127.0.0.1:5000/busybox"
+ oldRepo := "busybox"
+ newTag := "busybox:test"
+ cmd := exec.Command(dockerBinary, "tag", oldRepo, newRepo)
+ out, _, err := runCommandWithOutput(cmd)
+ if err != nil {
+ t.Fatalf("Could not tag busybox: %v: %s", err, out)
+ }
+ cmd = exec.Command(dockerBinary, "run", "--name", "test", oldRepo, "touch", "/home/abcd")
+ out, _, err = runCommandWithOutput(cmd)
+ if err != nil {
+ t.Fatalf("failed to run container: %v, output: %s", err, out)
+ }
+ cmd = exec.Command(dockerBinary, "commit", "test", newTag)
+ out, _, err = runCommandWithOutput(cmd)
+ if err != nil {
+ t.Fatalf("failed to commit container: %v, output: %s", err, out)
+ }
+ cmd = exec.Command(dockerBinary, "rmi", newTag)
+ out, _, err = runCommandWithOutput(cmd)
+ if err != nil {
+ t.Fatalf("failed to remove image: %v, output: %s", err, out)
+ }
+ if !strings.Contains(out, "Untagged: "+newTag) {
+ t.Fatalf("Could not remove image %s: %s, %v", newTag, out, err)
+ }
+
+ logDone("rmi - delete a image which its dependency tagged to multiple repositories success")
+}
+
+func TestRmiBlank(t *testing.T) {
+ // try to delete a blank image name
+ runCmd := exec.Command(dockerBinary, "rmi", "")
+ out, _, err := runCommandWithOutput(runCmd)
+
+ if err == nil {
+ t.Fatal("Should have failed to delete '' image")
+ }
+
+ if strings.Contains(out, "No such image") {
+ t.Fatalf("Wrong error message generated: %s", out)
+ }
+ logDone("rmi- blank image name")
+}
diff --git a/integration-cli/docker_cli_run_test.go b/integration-cli/docker_cli_run_test.go
index 6da5b76565..9224764955 100644
--- a/integration-cli/docker_cli_run_test.go
+++ b/integration-cli/docker_cli_run_test.go
@@ -25,6 +25,7 @@ import (
// "test123" should be printed by docker run
func TestRunEchoStdout(t *testing.T) {
+ defer deleteAllContainers()
runCmd := exec.Command(dockerBinary, "run", "busybox", "echo", "test123")
out, _, _, err := runCommandWithStdoutStderr(runCmd)
if err != nil {
@@ -35,13 +36,12 @@ func TestRunEchoStdout(t *testing.T) {
t.Errorf("container should've printed 'test123'")
}
- deleteAllContainers()
-
logDone("run - echo test123")
}
// "test" should be printed
func TestRunEchoStdoutWithMemoryLimit(t *testing.T) {
+ defer deleteAllContainers()
runCmd := exec.Command(dockerBinary, "run", "-m", "16m", "busybox", "echo", "test")
out, _, _, err := runCommandWithStdoutStderr(runCmd)
if err != nil {
@@ -55,13 +55,26 @@ func TestRunEchoStdoutWithMemoryLimit(t *testing.T) {
}
- deleteAllContainers()
-
logDone("run - echo with memory limit")
}
+// should run without memory swap
+func TestRunWithoutMemoryswapLimit(t *testing.T) {
+ defer deleteAllContainers()
+
+ runCmd := exec.Command(dockerBinary, "run", "-m", "16m", "--memory-swap", "-1", "busybox", "true")
+ out, _, err := runCommandWithOutput(runCmd)
+ if err != nil {
+ t.Fatalf("failed to run container, output: %q", out)
+ }
+
+ logDone("run - without memory swap limit")
+}
+
// "test" should be printed
func TestRunEchoStdoutWitCPULimit(t *testing.T) {
+ defer deleteAllContainers()
+
runCmd := exec.Command(dockerBinary, "run", "-c", "1000", "busybox", "echo", "test")
out, _, _, err := runCommandWithStdoutStderr(runCmd)
if err != nil {
@@ -72,13 +85,13 @@ func TestRunEchoStdoutWitCPULimit(t *testing.T) {
t.Errorf("container should've printed 'test'")
}
- deleteAllContainers()
-
logDone("run - echo with CPU limit")
}
// "test" should be printed
func TestRunEchoStdoutWithCPUAndMemoryLimit(t *testing.T) {
+ defer deleteAllContainers()
+
runCmd := exec.Command(dockerBinary, "run", "-c", "1000", "-m", "16m", "busybox", "echo", "test")
out, _, _, err := runCommandWithStdoutStderr(runCmd)
if err != nil {
@@ -89,13 +102,13 @@ func TestRunEchoStdoutWithCPUAndMemoryLimit(t *testing.T) {
t.Errorf("container should've printed 'test', got %q instead", out)
}
- deleteAllContainers()
-
logDone("run - echo with CPU and memory limit")
}
// "test" should be printed
func TestRunEchoNamedContainer(t *testing.T) {
+ defer deleteAllContainers()
+
runCmd := exec.Command(dockerBinary, "run", "--name", "testfoonamedcontainer", "busybox", "echo", "test")
out, _, _, err := runCommandWithStdoutStderr(runCmd)
if err != nil {
@@ -110,13 +123,13 @@ func TestRunEchoNamedContainer(t *testing.T) {
t.Errorf("failed to remove the named container: %v", err)
}
- deleteAllContainers()
-
logDone("run - echo with named container")
}
// docker run should not leak file descriptors
func TestRunLeakyFileDescriptors(t *testing.T) {
+ defer deleteAllContainers()
+
runCmd := exec.Command(dockerBinary, "run", "busybox", "ls", "-C", "/proc/self/fd")
out, _, _, err := runCommandWithStdoutStderr(runCmd)
if err != nil {
@@ -128,41 +141,40 @@ func TestRunLeakyFileDescriptors(t *testing.T) {
t.Errorf("container should've printed '0 1 2 3', not: %s", out)
}
- deleteAllContainers()
-
logDone("run - check file descriptor leakage")
}
-// it should be possible to ping Google DNS resolver
+// it should be possible to lookup Google DNS
// this will fail when Internet access is unavailable
-func TestRunPingGoogle(t *testing.T) {
- runCmd := exec.Command(dockerBinary, "run", "busybox", "ping", "-c", "1", "8.8.8.8")
- out, _, _, err := runCommandWithStdoutStderr(runCmd)
+func TestRunLookupGoogleDns(t *testing.T) {
+ defer deleteAllContainers()
+
+ out, _, _, err := runCommandWithStdoutStderr(exec.Command(dockerBinary, "run", "busybox", "nslookup", "google.com"))
if err != nil {
t.Fatalf("failed to run container: %v, output: %q", err, out)
}
- deleteAllContainers()
-
- logDone("run - ping 8.8.8.8")
+ logDone("run - nslookup google.com")
}
// the exit code should be 0
// some versions of lxc might make this test fail
func TestRunExitCodeZero(t *testing.T) {
+ defer deleteAllContainers()
+
runCmd := exec.Command(dockerBinary, "run", "busybox", "true")
if out, _, err := runCommandWithOutput(runCmd); err != nil {
t.Errorf("container should've exited with exit code 0: %s, %v", out, err)
}
- deleteAllContainers()
-
logDone("run - exit with 0")
}
// the exit code should be 1
// some versions of lxc might make this test fail
func TestRunExitCodeOne(t *testing.T) {
+ defer deleteAllContainers()
+
runCmd := exec.Command(dockerBinary, "run", "busybox", "false")
exitCode, err := runCommand(runCmd)
if err != nil && !strings.Contains("exit status 1", fmt.Sprintf("%s", err)) {
@@ -172,14 +184,14 @@ func TestRunExitCodeOne(t *testing.T) {
t.Errorf("container should've exited with exit code 1")
}
- deleteAllContainers()
-
logDone("run - exit with 1")
}
// it should be possible to pipe in data via stdin to a process running in a container
// some versions of lxc might make this test fail
func TestRunStdinPipe(t *testing.T) {
+ defer deleteAllContainers()
+
runCmd := exec.Command("bash", "-c", `echo "blahblah" | docker run -i -a stdin busybox cat`)
out, _, _, err := runCommandWithStdoutStderr(runCmd)
if err != nil {
@@ -215,13 +227,13 @@ func TestRunStdinPipe(t *testing.T) {
t.Fatalf("rm failed to remove container: %s, %v", out, err)
}
- deleteAllContainers()
-
logDone("run - pipe in with -i -a stdin")
}
// the container's ID should be printed when starting a container in detached mode
func TestRunDetachedContainerIDPrinting(t *testing.T) {
+ defer deleteAllContainers()
+
runCmd := exec.Command(dockerBinary, "run", "-d", "busybox", "true")
out, _, _, err := runCommandWithStdoutStderr(runCmd)
if err != nil {
@@ -251,13 +263,13 @@ func TestRunDetachedContainerIDPrinting(t *testing.T) {
t.Errorf("rm didn't print the container ID %s %s", out, rmOut)
}
- deleteAllContainers()
-
logDone("run - print container ID in detached mode")
}
// the working directory should be set correctly
func TestRunWorkingDirectory(t *testing.T) {
+ defer deleteAllContainers()
+
runCmd := exec.Command(dockerBinary, "run", "-w", "/root", "busybox", "pwd")
out, _, _, err := runCommandWithStdoutStderr(runCmd)
if err != nil {
@@ -282,14 +294,14 @@ func TestRunWorkingDirectory(t *testing.T) {
t.Errorf("--workdir failed to set working directory")
}
- deleteAllContainers()
-
logDone("run - run with working directory set by -w")
logDone("run - run with working directory set by --workdir")
}
// pinging Google's DNS resolver should fail when we disable the networking
func TestRunWithoutNetworking(t *testing.T) {
+ defer deleteAllContainers()
+
runCmd := exec.Command(dockerBinary, "run", "--net=none", "busybox", "ping", "-c", "1", "8.8.8.8")
out, _, exitCode, err := runCommandWithStdoutStderr(runCmd)
if err != nil && exitCode != 1 {
@@ -308,14 +320,14 @@ func TestRunWithoutNetworking(t *testing.T) {
t.Errorf("-n=false should've disabled the network; the container shouldn't have been able to ping 8.8.8.8")
}
- deleteAllContainers()
-
logDone("run - disable networking with --net=none")
logDone("run - disable networking with -n=false")
}
//test --link use container name to link target
func TestRunLinksContainerWithContainerName(t *testing.T) {
+ defer deleteAllContainers()
+
cmd := exec.Command(dockerBinary, "run", "-i", "-t", "-d", "--name", "parent", "busybox")
out, _, _, err := runCommandWithStdoutStderr(cmd)
if err != nil {
@@ -335,13 +347,14 @@ func TestRunLinksContainerWithContainerName(t *testing.T) {
if !strings.Contains(out, ip+" test") {
t.Fatalf("use a container name to link target failed")
}
- deleteAllContainers()
logDone("run - use a container name to link target work")
}
//test --link use container id to link target
func TestRunLinksContainerWithContainerId(t *testing.T) {
+ defer deleteAllContainers()
+
cmd := exec.Command(dockerBinary, "run", "-i", "-t", "-d", "busybox")
cID, _, _, err := runCommandWithStdoutStderr(cmd)
if err != nil {
@@ -363,13 +376,72 @@ func TestRunLinksContainerWithContainerId(t *testing.T) {
t.Fatalf("use a container id to link target failed")
}
- deleteAllContainers()
-
logDone("run - use a container id to link target work")
}
+func TestRunLinkToContainerNetMode(t *testing.T) {
+ defer deleteAllContainers()
+
+ cmd := exec.Command(dockerBinary, "run", "--name", "test", "-d", "busybox", "top")
+ out, _, err := runCommandWithOutput(cmd)
+ if err != nil {
+ t.Fatalf("failed to run container: %v, output: %q", err, out)
+ }
+ cmd = exec.Command(dockerBinary, "run", "--name", "parent", "-d", "--net=container:test", "busybox", "top")
+ out, _, err = runCommandWithOutput(cmd)
+ if err != nil {
+ t.Fatalf("failed to run container: %v, output: %q", err, out)
+ }
+ cmd = exec.Command(dockerBinary, "run", "-d", "--link=parent:parent", "busybox", "top")
+ out, _, err = runCommandWithOutput(cmd)
+ if err != nil {
+ t.Fatalf("failed to run container: %v, output: %q", err, out)
+ }
+
+ cmd = exec.Command(dockerBinary, "run", "--name", "child", "-d", "--net=container:parent", "busybox", "top")
+ out, _, err = runCommandWithOutput(cmd)
+ if err != nil {
+ t.Fatalf("failed to run container: %v, output: %q", err, out)
+ }
+ cmd = exec.Command(dockerBinary, "run", "-d", "--link=child:child", "busybox", "top")
+ out, _, err = runCommandWithOutput(cmd)
+ if err != nil {
+ t.Fatalf("failed to run container: %v, output: %q", err, out)
+ }
+
+ logDone("run - link to a container which net mode is container success")
+}
+
+func TestRunModeNetContainerHostname(t *testing.T) {
+ testRequires(t, ExecSupport)
+ defer deleteAllContainers()
+ cmd := exec.Command(dockerBinary, "run", "-i", "-d", "--name", "parent", "busybox", "top")
+ out, _, err := runCommandWithOutput(cmd)
+ if err != nil {
+ t.Fatalf("failed to run container: %v, output: %q", err, out)
+ }
+ cmd = exec.Command(dockerBinary, "exec", "parent", "cat", "/etc/hostname")
+ out, _, err = runCommandWithOutput(cmd)
+ if err != nil {
+ t.Fatalf("failed to exec command: %v, output: %q", err, out)
+ }
+
+ cmd = exec.Command(dockerBinary, "run", "--net=container:parent", "busybox", "cat", "/etc/hostname")
+ out1, _, err := runCommandWithOutput(cmd)
+ if err != nil {
+ t.Fatalf("failed to run container: %v, output: %q", err, out1)
+ }
+ if out1 != out {
+ t.Fatal("containers with shared net namespace should have same hostname")
+ }
+
+ logDone("run - containers with shared net namespace have same hostname")
+}
+
// Regression test for #4741
func TestRunWithVolumesAsFiles(t *testing.T) {
+ defer deleteAllContainers()
+
runCmd := exec.Command(dockerBinary, "run", "--name", "test-data", "--volume", "/etc/hosts:/target-file", "busybox", "true")
out, stderr, exitCode, err := runCommandWithStdoutStderr(runCmd)
if err != nil && exitCode != 0 {
@@ -381,13 +453,14 @@ func TestRunWithVolumesAsFiles(t *testing.T) {
if err != nil && exitCode != 0 {
t.Fatal("2", out, stderr, err)
}
- deleteAllContainers()
logDone("run - regression test for #4741 - volumes from as files")
}
// Regression test for #4979
func TestRunWithVolumesFromExited(t *testing.T) {
+ defer deleteAllContainers()
+
runCmd := exec.Command(dockerBinary, "run", "--name", "test-data", "--volume", "/some/dir", "busybox", "touch", "/some/dir/file")
out, stderr, exitCode, err := runCommandWithStdoutStderr(runCmd)
if err != nil && exitCode != 0 {
@@ -399,31 +472,63 @@ func TestRunWithVolumesFromExited(t *testing.T) {
if err != nil && exitCode != 0 {
t.Fatal("2", out, stderr, err)
}
- deleteAllContainers()
logDone("run - regression test for #4979 - volumes-from on exited container")
}
+// Volume path is a symlink which also exists on the host, and the host side is a file not a dir
+// But the volume call is just a normal volume, not a bind mount
+func TestRunCreateVolumesInSymlinkDir(t *testing.T) {
+ testRequires(t, SameHostDaemon)
+ testRequires(t, NativeExecDriver)
+ defer deleteAllContainers()
+ name := "test-volume-symlink"
+
+ dir, err := ioutil.TempDir("", name)
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer os.RemoveAll(dir)
+
+ f, err := os.OpenFile(filepath.Join(dir, "test"), os.O_CREATE, 0700)
+ if err != nil {
+ t.Fatal(err)
+ }
+ f.Close()
+
+ dockerFile := fmt.Sprintf("FROM busybox\nRUN mkdir -p %s\nRUN ln -s %s /test", dir, dir)
+ if _, err := buildImage(name, dockerFile, false); err != nil {
+ t.Fatal(err)
+ }
+ defer deleteImages(name)
+
+ if out, _, err := dockerCmd(t, "run", "-v", "/test/test", name); err != nil {
+ t.Fatal(err, out)
+ }
+
+ logDone("run - create volume in symlink directory")
+}
+
// Regression test for #4830
func TestRunWithRelativePath(t *testing.T) {
+ defer deleteAllContainers()
+
runCmd := exec.Command(dockerBinary, "run", "-v", "tmp:/other-tmp", "busybox", "true")
if _, _, _, err := runCommandWithStdoutStderr(runCmd); err == nil {
t.Fatalf("relative path should result in an error")
}
- deleteAllContainers()
-
logDone("run - volume with relative path")
}
func TestRunVolumesMountedAsReadonly(t *testing.T) {
+ defer deleteAllContainers()
+
cmd := exec.Command(dockerBinary, "run", "-v", "/test:/test:ro", "busybox", "touch", "/test/somefile")
if code, err := runCommand(cmd); err == nil || code == 0 {
t.Fatalf("run should fail because volume is ro: exit code %d", code)
}
- deleteAllContainers()
-
logDone("run - volumes as readonly mount")
}
@@ -493,8 +598,29 @@ func TestVolumesFromGetsProperMode(t *testing.T) {
logDone("run - volumes from ignores `rw` if inherrited volume is `ro`")
}
+// Test for GH#10618
+func TestRunNoDupVolumes(t *testing.T) {
+ defer deleteAllContainers()
+
+ mountstr1 := randomUnixTmpDirPath("test1") + ":/someplace"
+ mountstr2 := randomUnixTmpDirPath("test2") + ":/someplace"
+
+ cmd := exec.Command(dockerBinary, "run", "-v", mountstr1, "-v", mountstr2, "busybox", "true")
+ if out, _, err := runCommandWithOutput(cmd); err == nil {
+ t.Fatal("Expected error about duplicate volume definitions")
+ } else {
+ if !strings.Contains(out, "Duplicate volume") {
+ t.Fatalf("Expected 'duplicate volume' error, got %v", err)
+ }
+ }
+
+ logDone("run - don't allow multiple (bind) volumes on the same container target")
+}
+
// Test for #1351
func TestRunApplyVolumesFromBeforeVolumes(t *testing.T) {
+ defer deleteAllContainers()
+
cmd := exec.Command(dockerBinary, "run", "--name", "parent", "-v", "/test", "busybox", "touch", "/test/foo")
if _, err := runCommand(cmd); err != nil {
t.Fatal(err)
@@ -505,12 +631,12 @@ func TestRunApplyVolumesFromBeforeVolumes(t *testing.T) {
t.Fatal(out, err)
}
- deleteAllContainers()
-
logDone("run - volumes from mounted first")
}
func TestRunMultipleVolumesFrom(t *testing.T) {
+ defer deleteAllContainers()
+
cmd := exec.Command(dockerBinary, "run", "--name", "parent1", "-v", "/test", "busybox", "touch", "/test/foo")
if _, err := runCommand(cmd); err != nil {
t.Fatal(err)
@@ -527,13 +653,13 @@ func TestRunMultipleVolumesFrom(t *testing.T) {
t.Fatal(err)
}
- deleteAllContainers()
-
logDone("run - multiple volumes from")
}
// this tests verifies the ID format for the container
func TestRunVerifyContainerID(t *testing.T) {
+ defer deleteAllContainers()
+
cmd := exec.Command(dockerBinary, "run", "-d", "busybox", "true")
out, exit, err := runCommandWithOutput(cmd)
if err != nil {
@@ -550,36 +676,39 @@ func TestRunVerifyContainerID(t *testing.T) {
t.Fatalf("Invalid container ID: %s", out)
}
- deleteAllContainers()
-
logDone("run - verify container ID")
}
// Test that creating a container with a volume doesn't crash. Regression test for #995.
func TestRunCreateVolume(t *testing.T) {
+ defer deleteAllContainers()
+
cmd := exec.Command(dockerBinary, "run", "-v", "/var/lib/data", "busybox", "true")
if _, err := runCommand(cmd); err != nil {
t.Fatal(err)
}
- deleteAllContainers()
-
logDone("run - create docker managed volume")
}
// Test that creating a volume with a symlink in its path works correctly. Test for #5152.
// Note that this bug happens only with symlinks with a target that starts with '/'.
func TestRunCreateVolumeWithSymlink(t *testing.T) {
- buildCmd := exec.Command(dockerBinary, "build", "-t", "docker-test-createvolumewithsymlink", "-")
+ defer deleteAllContainers()
+
+ image := "docker-test-createvolumewithsymlink"
+ defer deleteImages(image)
+
+ buildCmd := exec.Command(dockerBinary, "build", "-t", image, "-")
buildCmd.Stdin = strings.NewReader(`FROM busybox
- RUN mkdir /foo && ln -s /foo /bar`)
+ RUN ln -s home /bar`)
buildCmd.Dir = workingDirectory
err := buildCmd.Run()
if err != nil {
- t.Fatalf("could not build 'docker-test-createvolumewithsymlink': %v", err)
+ t.Fatalf("could not build '%s': %v", image, err)
}
- cmd := exec.Command(dockerBinary, "run", "-v", "/bar/foo", "--name", "test-createvolumewithsymlink", "docker-test-createvolumewithsymlink", "sh", "-c", "mount | grep -q /foo/foo")
+ cmd := exec.Command(dockerBinary, "run", "-v", "/bar/foo", "--name", "test-createvolumewithsymlink", image, "sh", "-c", "mount | grep -q /home/foo")
exitCode, err := runCommand(cmd)
if err != nil || exitCode != 0 {
t.Fatalf("[run] err: %v, exitcode: %d", err, exitCode)
@@ -604,18 +733,19 @@ func TestRunCreateVolumeWithSymlink(t *testing.T) {
t.Fatalf("[open] (expecting 'file does not exist' error) err: %v, volPath: %s", err, volPath)
}
- deleteImages("docker-test-createvolumewithsymlink")
- deleteAllContainers()
-
logDone("run - create volume with symlink")
}
// Tests that a volume path that has a symlink exists in a container mounting it with `--volumes-from`.
func TestRunVolumesFromSymlinkPath(t *testing.T) {
+ defer deleteAllContainers()
+
name := "docker-test-volumesfromsymlinkpath"
+ defer deleteImages(name)
+
buildCmd := exec.Command(dockerBinary, "build", "-t", name, "-")
buildCmd.Stdin = strings.NewReader(`FROM busybox
- RUN mkdir /baz && ln -s /baz /foo
+ RUN ln -s home /foo
VOLUME ["/foo/bar"]`)
buildCmd.Dir = workingDirectory
err := buildCmd.Run()
@@ -635,13 +765,12 @@ func TestRunVolumesFromSymlinkPath(t *testing.T) {
t.Fatalf("[run] err: %v, exitcode: %d", err, exitCode)
}
- deleteAllContainers()
- deleteImages(name)
-
logDone("run - volumes-from symlink path")
}
func TestRunExitCode(t *testing.T) {
+ defer deleteAllContainers()
+
cmd := exec.Command(dockerBinary, "run", "busybox", "/bin/sh", "-c", "exit 72")
exit, err := runCommand(cmd)
@@ -652,14 +781,13 @@ func TestRunExitCode(t *testing.T) {
t.Fatalf("expected exit code 72 received %d", exit)
}
- deleteAllContainers()
-
logDone("run - correct exit code")
}
func TestRunUserDefaultsToRoot(t *testing.T) {
- cmd := exec.Command(dockerBinary, "run", "busybox", "id")
+ defer deleteAllContainers()
+ cmd := exec.Command(dockerBinary, "run", "busybox", "id")
out, _, err := runCommandWithOutput(cmd)
if err != nil {
t.Fatal(err, out)
@@ -667,14 +795,14 @@ func TestRunUserDefaultsToRoot(t *testing.T) {
if !strings.Contains(out, "uid=0(root) gid=0(root)") {
t.Fatalf("expected root user got %s", out)
}
- deleteAllContainers()
logDone("run - default user")
}
func TestRunUserByName(t *testing.T) {
- cmd := exec.Command(dockerBinary, "run", "-u", "root", "busybox", "id")
+ defer deleteAllContainers()
+ cmd := exec.Command(dockerBinary, "run", "-u", "root", "busybox", "id")
out, _, err := runCommandWithOutput(cmd)
if err != nil {
t.Fatal(err, out)
@@ -682,14 +810,14 @@ func TestRunUserByName(t *testing.T) {
if !strings.Contains(out, "uid=0(root) gid=0(root)") {
t.Fatalf("expected root user got %s", out)
}
- deleteAllContainers()
logDone("run - user by name")
}
func TestRunUserByID(t *testing.T) {
- cmd := exec.Command(dockerBinary, "run", "-u", "1", "busybox", "id")
+ defer deleteAllContainers()
+ cmd := exec.Command(dockerBinary, "run", "-u", "1", "busybox", "id")
out, _, err := runCommandWithOutput(cmd)
if err != nil {
t.Fatal(err, out)
@@ -697,14 +825,14 @@ func TestRunUserByID(t *testing.T) {
if !strings.Contains(out, "uid=1(daemon) gid=1(daemon)") {
t.Fatalf("expected daemon user got %s", out)
}
- deleteAllContainers()
logDone("run - user by id")
}
func TestRunUserByIDBig(t *testing.T) {
- cmd := exec.Command(dockerBinary, "run", "-u", "2147483648", "busybox", "id")
+ defer deleteAllContainers()
+ cmd := exec.Command(dockerBinary, "run", "-u", "2147483648", "busybox", "id")
out, _, err := runCommandWithOutput(cmd)
if err == nil {
t.Fatal("No error, but must be.", out)
@@ -712,14 +840,14 @@ func TestRunUserByIDBig(t *testing.T) {
if !strings.Contains(out, "Uids and gids must be in range") {
t.Fatalf("expected error about uids range, got %s", out)
}
- deleteAllContainers()
logDone("run - user by id, id too big")
}
func TestRunUserByIDNegative(t *testing.T) {
- cmd := exec.Command(dockerBinary, "run", "-u", "-1", "busybox", "id")
+ defer deleteAllContainers()
+ cmd := exec.Command(dockerBinary, "run", "-u", "-1", "busybox", "id")
out, _, err := runCommandWithOutput(cmd)
if err == nil {
t.Fatal("No error, but must be.", out)
@@ -727,14 +855,14 @@ func TestRunUserByIDNegative(t *testing.T) {
if !strings.Contains(out, "Uids and gids must be in range") {
t.Fatalf("expected error about uids range, got %s", out)
}
- deleteAllContainers()
logDone("run - user by id, id negative")
}
func TestRunUserByIDZero(t *testing.T) {
- cmd := exec.Command(dockerBinary, "run", "-u", "0", "busybox", "id")
+ defer deleteAllContainers()
+ cmd := exec.Command(dockerBinary, "run", "-u", "0", "busybox", "id")
out, _, err := runCommandWithOutput(cmd)
if err != nil {
t.Fatal(err, out)
@@ -742,24 +870,25 @@ func TestRunUserByIDZero(t *testing.T) {
if !strings.Contains(out, "uid=0(root) gid=0(root) groups=10(wheel)") {
t.Fatalf("expected daemon user got %s", out)
}
- deleteAllContainers()
logDone("run - user by id, zero uid")
}
func TestRunUserNotFound(t *testing.T) {
- cmd := exec.Command(dockerBinary, "run", "-u", "notme", "busybox", "id")
+ defer deleteAllContainers()
+ cmd := exec.Command(dockerBinary, "run", "-u", "notme", "busybox", "id")
_, err := runCommand(cmd)
if err == nil {
t.Fatal("unknown user should cause container to fail")
}
- deleteAllContainers()
logDone("run - user not found")
}
func TestRunTwoConcurrentContainers(t *testing.T) {
+ defer deleteAllContainers()
+
group := sync.WaitGroup{}
group.Add(2)
@@ -775,12 +904,12 @@ func TestRunTwoConcurrentContainers(t *testing.T) {
group.Wait()
- deleteAllContainers()
-
logDone("run - two concurrent containers")
}
func TestRunEnvironment(t *testing.T) {
+ defer deleteAllContainers()
+
cmd := exec.Command(dockerBinary, "run", "-h", "testing", "-e=FALSE=true", "-e=TRUE", "-e=TRICKY", "-e=HOME=", "busybox", "env")
cmd.Env = append(os.Environ(),
"TRUE=false",
@@ -792,7 +921,13 @@ func TestRunEnvironment(t *testing.T) {
t.Fatal(err, out)
}
- actualEnv := strings.Split(strings.TrimSpace(out), "\n")
+ actualEnvLxc := strings.Split(strings.TrimSpace(out), "\n")
+ actualEnv := []string{}
+ for i := range actualEnvLxc {
+ if actualEnvLxc[i] != "container=lxc" {
+ actualEnv = append(actualEnv, actualEnvLxc[i])
+ }
+ }
sort.Strings(actualEnv)
goodEnv := []string{
@@ -815,8 +950,6 @@ func TestRunEnvironment(t *testing.T) {
}
}
- deleteAllContainers()
-
logDone("run - verify environment")
}
@@ -824,14 +957,23 @@ func TestRunEnvironmentErase(t *testing.T) {
// Test to make sure that when we use -e on env vars that are
// not set in our local env that they're removed (if present) in
// the container
+ defer deleteAllContainers()
+
cmd := exec.Command(dockerBinary, "run", "-e", "FOO", "-e", "HOSTNAME", "busybox", "env")
- cmd.Env = []string{}
+ cmd.Env = appendBaseEnv([]string{})
+
out, _, err := runCommandWithOutput(cmd)
if err != nil {
t.Fatal(err, out)
}
- actualEnv := strings.Split(strings.TrimSpace(out), "\n")
+ actualEnvLxc := strings.Split(strings.TrimSpace(out), "\n")
+ actualEnv := []string{}
+ for i := range actualEnvLxc {
+ if actualEnvLxc[i] != "container=lxc" {
+ actualEnv = append(actualEnv, actualEnvLxc[i])
+ }
+ }
sort.Strings(actualEnv)
goodEnv := []string{
@@ -848,22 +990,29 @@ func TestRunEnvironmentErase(t *testing.T) {
}
}
- deleteAllContainers()
-
logDone("run - verify environment erase")
}
func TestRunEnvironmentOverride(t *testing.T) {
// Test to make sure that when we use -e on env vars that are
// already in the env that we're overriding them
+ defer deleteAllContainers()
+
cmd := exec.Command(dockerBinary, "run", "-e", "HOSTNAME", "-e", "HOME=/root2", "busybox", "env")
- cmd.Env = []string{"HOSTNAME=bar"}
+ cmd.Env = appendBaseEnv([]string{"HOSTNAME=bar"})
+
out, _, err := runCommandWithOutput(cmd)
if err != nil {
t.Fatal(err, out)
}
- actualEnv := strings.Split(strings.TrimSpace(out), "\n")
+ actualEnvLxc := strings.Split(strings.TrimSpace(out), "\n")
+ actualEnv := []string{}
+ for i := range actualEnvLxc {
+ if actualEnvLxc[i] != "container=lxc" {
+ actualEnv = append(actualEnv, actualEnvLxc[i])
+ }
+ }
sort.Strings(actualEnv)
goodEnv := []string{
@@ -881,49 +1030,48 @@ func TestRunEnvironmentOverride(t *testing.T) {
}
}
- deleteAllContainers()
-
logDone("run - verify environment override")
}
func TestRunContainerNetwork(t *testing.T) {
+ defer deleteAllContainers()
+
cmd := exec.Command(dockerBinary, "run", "busybox", "ping", "-c", "1", "127.0.0.1")
if _, err := runCommand(cmd); err != nil {
t.Fatal(err)
}
- deleteAllContainers()
-
logDone("run - test container network via ping")
}
// Issue #4681
func TestRunLoopbackWhenNetworkDisabled(t *testing.T) {
+ defer deleteAllContainers()
+
cmd := exec.Command(dockerBinary, "run", "--net=none", "busybox", "ping", "-c", "1", "127.0.0.1")
if _, err := runCommand(cmd); err != nil {
t.Fatal(err)
}
- deleteAllContainers()
-
logDone("run - test container loopback when networking disabled")
}
func TestRunNetHostNotAllowedWithLinks(t *testing.T) {
- _, _, err := dockerCmd(t, "run", "--name", "linked", "busybox", "true")
+ defer deleteAllContainers()
+ _, _, err := dockerCmd(t, "run", "--name", "linked", "busybox", "true")
cmd := exec.Command(dockerBinary, "run", "--net=host", "--link", "linked:linked", "busybox", "true")
_, _, err = runCommandWithOutput(cmd)
if err == nil {
t.Fatal("Expected error")
}
- deleteAllContainers()
-
logDone("run - don't allow --net=host to be used with links")
}
func TestRunLoopbackOnlyExistsWhenNetworkingDisabled(t *testing.T) {
+ defer deleteAllContainers()
+
cmd := exec.Command(dockerBinary, "run", "--net=none", "busybox", "ip", "-o", "-4", "a", "show", "up")
out, _, err := runCommandWithOutput(cmd)
if err != nil {
@@ -949,8 +1097,6 @@ func TestRunLoopbackOnlyExistsWhenNetworkingDisabled(t *testing.T) {
t.Fatalf("Wrong interface in test container: expected [1: lo], got %s", out)
}
- deleteAllContainers()
-
logDone("run - test loopback only exists when networking disabled")
}
@@ -960,6 +1106,8 @@ func TestRunLoopbackOnlyExistsWhenNetworkingDisabled(t *testing.T) {
// codepath is executed with "docker run -h <hostname>". Both were manually
// tested, but this testcase takes the simpler path of using "run -h .."
func TestRunFullHostnameSet(t *testing.T) {
+ defer deleteAllContainers()
+
cmd := exec.Command(dockerBinary, "run", "-h", "foo.bar.baz", "busybox", "hostname")
out, _, err := runCommandWithOutput(cmd)
if err != nil {
@@ -969,12 +1117,13 @@ func TestRunFullHostnameSet(t *testing.T) {
if actual := strings.Trim(out, "\r\n"); actual != "foo.bar.baz" {
t.Fatalf("expected hostname 'foo.bar.baz', received %s", actual)
}
- deleteAllContainers()
logDone("run - test fully qualified hostname set with -h")
}
func TestRunPrivilegedCanMknod(t *testing.T) {
+ defer deleteAllContainers()
+
cmd := exec.Command(dockerBinary, "run", "--privileged", "busybox", "sh", "-c", "mknod /tmp/sda b 8 0 && echo ok")
out, _, err := runCommandWithOutput(cmd)
if err != nil {
@@ -984,12 +1133,13 @@ func TestRunPrivilegedCanMknod(t *testing.T) {
if actual := strings.Trim(out, "\r\n"); actual != "ok" {
t.Fatalf("expected output ok received %s", actual)
}
- deleteAllContainers()
logDone("run - test privileged can mknod")
}
func TestRunUnPrivilegedCanMknod(t *testing.T) {
+ defer deleteAllContainers()
+
cmd := exec.Command(dockerBinary, "run", "busybox", "sh", "-c", "mknod /tmp/sda b 8 0 && echo ok")
out, _, err := runCommandWithOutput(cmd)
if err != nil {
@@ -999,7 +1149,6 @@ func TestRunUnPrivilegedCanMknod(t *testing.T) {
if actual := strings.Trim(out, "\r\n"); actual != "ok" {
t.Fatalf("expected output ok received %s", actual)
}
- deleteAllContainers()
logDone("run - test un-privileged can mknod")
}
@@ -1016,6 +1165,8 @@ func TestRunCapDropInvalid(t *testing.T) {
}
func TestRunCapDropCannotMknod(t *testing.T) {
+ defer deleteAllContainers()
+
cmd := exec.Command(dockerBinary, "run", "--cap-drop=MKNOD", "busybox", "sh", "-c", "mknod /tmp/sda b 8 0 && echo ok")
out, _, err := runCommandWithOutput(cmd)
if err == nil {
@@ -1025,12 +1176,13 @@ func TestRunCapDropCannotMknod(t *testing.T) {
if actual := strings.Trim(out, "\r\n"); actual == "ok" {
t.Fatalf("expected output not ok received %s", actual)
}
- deleteAllContainers()
logDone("run - test --cap-drop=MKNOD cannot mknod")
}
func TestRunCapDropCannotMknodLowerCase(t *testing.T) {
+ defer deleteAllContainers()
+
cmd := exec.Command(dockerBinary, "run", "--cap-drop=mknod", "busybox", "sh", "-c", "mknod /tmp/sda b 8 0 && echo ok")
out, _, err := runCommandWithOutput(cmd)
if err == nil {
@@ -1040,12 +1192,13 @@ func TestRunCapDropCannotMknodLowerCase(t *testing.T) {
if actual := strings.Trim(out, "\r\n"); actual == "ok" {
t.Fatalf("expected output not ok received %s", actual)
}
- deleteAllContainers()
logDone("run - test --cap-drop=mknod cannot mknod lowercase")
}
func TestRunCapDropALLCannotMknod(t *testing.T) {
+ defer deleteAllContainers()
+
cmd := exec.Command(dockerBinary, "run", "--cap-drop=ALL", "--cap-add=SETGID", "busybox", "sh", "-c", "mknod /tmp/sda b 8 0 && echo ok")
out, _, err := runCommandWithOutput(cmd)
if err == nil {
@@ -1055,12 +1208,13 @@ func TestRunCapDropALLCannotMknod(t *testing.T) {
if actual := strings.Trim(out, "\r\n"); actual == "ok" {
t.Fatalf("expected output not ok received %s", actual)
}
- deleteAllContainers()
logDone("run - test --cap-drop=ALL cannot mknod")
}
func TestRunCapDropALLAddMknodCanMknod(t *testing.T) {
+ defer deleteAllContainers()
+
cmd := exec.Command(dockerBinary, "run", "--cap-drop=ALL", "--cap-add=MKNOD", "--cap-add=SETGID", "busybox", "sh", "-c", "mknod /tmp/sda b 8 0 && echo ok")
out, _, err := runCommandWithOutput(cmd)
if err != nil {
@@ -1070,7 +1224,6 @@ func TestRunCapDropALLAddMknodCanMknod(t *testing.T) {
if actual := strings.Trim(out, "\r\n"); actual != "ok" {
t.Fatalf("expected output ok received %s", actual)
}
- deleteAllContainers()
logDone("run - test --cap-drop=ALL --cap-add=MKNOD can mknod")
}
@@ -1088,6 +1241,8 @@ func TestRunCapAddInvalid(t *testing.T) {
}
func TestRunCapAddCanDownInterface(t *testing.T) {
+ defer deleteAllContainers()
+
cmd := exec.Command(dockerBinary, "run", "--cap-add=NET_ADMIN", "busybox", "sh", "-c", "ip link set eth0 down && echo ok")
out, _, err := runCommandWithOutput(cmd)
if err != nil {
@@ -1097,12 +1252,13 @@ func TestRunCapAddCanDownInterface(t *testing.T) {
if actual := strings.Trim(out, "\r\n"); actual != "ok" {
t.Fatalf("expected output ok received %s", actual)
}
- deleteAllContainers()
logDone("run - test --cap-add=NET_ADMIN can set eth0 down")
}
func TestRunCapAddALLCanDownInterface(t *testing.T) {
+ defer deleteAllContainers()
+
cmd := exec.Command(dockerBinary, "run", "--cap-add=ALL", "busybox", "sh", "-c", "ip link set eth0 down && echo ok")
out, _, err := runCommandWithOutput(cmd)
if err != nil {
@@ -1112,12 +1268,13 @@ func TestRunCapAddALLCanDownInterface(t *testing.T) {
if actual := strings.Trim(out, "\r\n"); actual != "ok" {
t.Fatalf("expected output ok received %s", actual)
}
- deleteAllContainers()
logDone("run - test --cap-add=ALL can set eth0 down")
}
func TestRunCapAddALLDropNetAdminCanDownInterface(t *testing.T) {
+ defer deleteAllContainers()
+
cmd := exec.Command(dockerBinary, "run", "--cap-add=ALL", "--cap-drop=NET_ADMIN", "busybox", "sh", "-c", "ip link set eth0 down && echo ok")
out, _, err := runCommandWithOutput(cmd)
if err == nil {
@@ -1127,14 +1284,14 @@ func TestRunCapAddALLDropNetAdminCanDownInterface(t *testing.T) {
if actual := strings.Trim(out, "\r\n"); actual == "ok" {
t.Fatalf("expected output not ok received %s", actual)
}
- deleteAllContainers()
logDone("run - test --cap-add=ALL --cap-drop=NET_ADMIN cannot set eth0 down")
}
func TestRunPrivilegedCanMount(t *testing.T) {
- cmd := exec.Command(dockerBinary, "run", "--privileged", "busybox", "sh", "-c", "mount -t tmpfs none /tmp && echo ok")
+ defer deleteAllContainers()
+ cmd := exec.Command(dockerBinary, "run", "--privileged", "busybox", "sh", "-c", "mount -t tmpfs none /tmp && echo ok")
out, _, err := runCommandWithOutput(cmd)
if err != nil {
t.Fatal(err)
@@ -1143,14 +1300,14 @@ func TestRunPrivilegedCanMount(t *testing.T) {
if actual := strings.Trim(out, "\r\n"); actual != "ok" {
t.Fatalf("expected output ok received %s", actual)
}
- deleteAllContainers()
logDone("run - test privileged can mount")
}
func TestRunUnPrivilegedCannotMount(t *testing.T) {
- cmd := exec.Command(dockerBinary, "run", "busybox", "sh", "-c", "mount -t tmpfs none /tmp && echo ok")
+ defer deleteAllContainers()
+ cmd := exec.Command(dockerBinary, "run", "busybox", "sh", "-c", "mount -t tmpfs none /tmp && echo ok")
out, _, err := runCommandWithOutput(cmd)
if err == nil {
t.Fatal(err, out)
@@ -1159,69 +1316,79 @@ func TestRunUnPrivilegedCannotMount(t *testing.T) {
if actual := strings.Trim(out, "\r\n"); actual == "ok" {
t.Fatalf("expected output not ok received %s", actual)
}
- deleteAllContainers()
logDone("run - test un-privileged cannot mount")
}
func TestRunSysNotWritableInNonPrivilegedContainers(t *testing.T) {
+ defer deleteAllContainers()
+
cmd := exec.Command(dockerBinary, "run", "busybox", "touch", "/sys/kernel/profiling")
if code, err := runCommand(cmd); err == nil || code == 0 {
t.Fatal("sys should not be writable in a non privileged container")
}
- deleteAllContainers()
-
logDone("run - sys not writable in non privileged container")
}
func TestRunSysWritableInPrivilegedContainers(t *testing.T) {
+ defer deleteAllContainers()
+
cmd := exec.Command(dockerBinary, "run", "--privileged", "busybox", "touch", "/sys/kernel/profiling")
if code, err := runCommand(cmd); err != nil || code != 0 {
t.Fatalf("sys should be writable in privileged container")
}
- deleteAllContainers()
-
logDone("run - sys writable in privileged container")
}
func TestRunProcNotWritableInNonPrivilegedContainers(t *testing.T) {
+ defer deleteAllContainers()
+
cmd := exec.Command(dockerBinary, "run", "busybox", "touch", "/proc/sysrq-trigger")
if code, err := runCommand(cmd); err == nil || code == 0 {
t.Fatal("proc should not be writable in a non privileged container")
}
- deleteAllContainers()
-
logDone("run - proc not writable in non privileged container")
}
func TestRunProcWritableInPrivilegedContainers(t *testing.T) {
+ defer deleteAllContainers()
+
cmd := exec.Command(dockerBinary, "run", "--privileged", "busybox", "touch", "/proc/sysrq-trigger")
if code, err := runCommand(cmd); err != nil || code != 0 {
t.Fatalf("proc should be writable in privileged container")
}
-
- deleteAllContainers()
-
logDone("run - proc writable in privileged container")
}
func TestRunWithCpuset(t *testing.T) {
+ defer deleteAllContainers()
+
cmd := exec.Command(dockerBinary, "run", "--cpuset", "0", "busybox", "true")
if code, err := runCommand(cmd); err != nil || code != 0 {
t.Fatalf("container should run successfuly with cpuset of 0: %s", err)
}
- deleteAllContainers()
-
logDone("run - cpuset 0")
}
+func TestRunWithCpusetCpus(t *testing.T) {
+ defer deleteAllContainers()
+
+ cmd := exec.Command(dockerBinary, "run", "--cpuset-cpus", "0", "busybox", "true")
+ if code, err := runCommand(cmd); err != nil || code != 0 {
+ t.Fatalf("container should run successfuly with cpuset-cpus of 0: %s", err)
+ }
+
+ logDone("run - cpuset-cpus 0")
+}
+
func TestRunDeviceNumbers(t *testing.T) {
- cmd := exec.Command(dockerBinary, "run", "busybox", "sh", "-c", "ls -l /dev/null")
+ defer deleteAllContainers()
+ cmd := exec.Command(dockerBinary, "run", "busybox", "sh", "-c", "ls -l /dev/null")
out, _, err := runCommandWithOutput(cmd)
if err != nil {
t.Fatal(err, out)
@@ -1235,14 +1402,14 @@ func TestRunDeviceNumbers(t *testing.T) {
if !(reflect.DeepEqual(deviceLineFields, expected)) {
t.Fatalf("expected output\ncrw-rw-rw- 1 root root 1, 3 May 24 13:29 /dev/null\n received\n %s\n", out)
}
- deleteAllContainers()
logDone("run - test device numbers")
}
func TestRunThatCharacterDevicesActLikeCharacterDevices(t *testing.T) {
- cmd := exec.Command(dockerBinary, "run", "busybox", "sh", "-c", "dd if=/dev/zero of=/zero bs=1k count=5 2> /dev/null ; du -h /zero")
+ defer deleteAllContainers()
+ cmd := exec.Command(dockerBinary, "run", "busybox", "sh", "-c", "dd if=/dev/zero of=/zero bs=1k count=5 2> /dev/null ; du -h /zero")
out, _, err := runCommandWithOutput(cmd)
if err != nil {
t.Fatal(err, out)
@@ -1251,26 +1418,25 @@ func TestRunThatCharacterDevicesActLikeCharacterDevices(t *testing.T) {
if actual := strings.Trim(out, "\r\n"); actual[0] == '0' {
t.Fatalf("expected a new file called /zero to be create that is greater than 0 bytes long, but du says: %s", actual)
}
- deleteAllContainers()
logDone("run - test that character devices work.")
}
func TestRunUnprivilegedWithChroot(t *testing.T) {
- cmd := exec.Command(dockerBinary, "run", "busybox", "chroot", "/", "true")
+ defer deleteAllContainers()
+ cmd := exec.Command(dockerBinary, "run", "busybox", "chroot", "/", "true")
if _, err := runCommand(cmd); err != nil {
t.Fatal(err)
}
- deleteAllContainers()
-
logDone("run - unprivileged with chroot")
}
func TestRunAddingOptionalDevices(t *testing.T) {
- cmd := exec.Command(dockerBinary, "run", "--device", "/dev/zero:/dev/nulo", "busybox", "sh", "-c", "ls /dev/nulo")
+ defer deleteAllContainers()
+ cmd := exec.Command(dockerBinary, "run", "--device", "/dev/zero:/dev/nulo", "busybox", "sh", "-c", "ls /dev/nulo")
out, _, err := runCommandWithOutput(cmd)
if err != nil {
t.Fatal(err, out)
@@ -1279,14 +1445,15 @@ func TestRunAddingOptionalDevices(t *testing.T) {
if actual := strings.Trim(out, "\r\n"); actual != "/dev/nulo" {
t.Fatalf("expected output /dev/nulo, received %s", actual)
}
- deleteAllContainers()
logDone("run - test --device argument")
}
func TestRunModeHostname(t *testing.T) {
- cmd := exec.Command(dockerBinary, "run", "-h=testhostname", "busybox", "cat", "/etc/hostname")
+ testRequires(t, SameHostDaemon)
+ defer deleteAllContainers()
+ cmd := exec.Command(dockerBinary, "run", "-h=testhostname", "busybox", "cat", "/etc/hostname")
out, _, err := runCommandWithOutput(cmd)
if err != nil {
t.Fatal(err, out)
@@ -1310,12 +1477,12 @@ func TestRunModeHostname(t *testing.T) {
t.Fatalf("expected %q, but says: %q", hostname, actual)
}
- deleteAllContainers()
-
logDone("run - hostname and several network modes")
}
func TestRunRootWorkdir(t *testing.T) {
+ defer deleteAllContainers()
+
s, _, err := dockerCmd(t, "run", "--workdir", "/", "busybox", "pwd")
if err != nil {
t.Fatal(s, err)
@@ -1324,36 +1491,36 @@ func TestRunRootWorkdir(t *testing.T) {
t.Fatalf("pwd returned %q (expected /\\n)", s)
}
- deleteAllContainers()
-
logDone("run - workdir /")
}
func TestRunAllowBindMountingRoot(t *testing.T) {
+ defer deleteAllContainers()
+
s, _, err := dockerCmd(t, "run", "-v", "/:/host", "busybox", "ls", "/host")
if err != nil {
t.Fatal(s, err)
}
- deleteAllContainers()
-
logDone("run - bind mount / as volume")
}
func TestRunDisallowBindMountingRootToRoot(t *testing.T) {
+ defer deleteAllContainers()
+
cmd := exec.Command(dockerBinary, "run", "-v", "/:/", "busybox", "ls", "/host")
out, _, err := runCommandWithOutput(cmd)
if err == nil {
t.Fatal(out, err)
}
- deleteAllContainers()
-
- logDone("run - bind mount /:/ as volume should fail")
+ logDone("run - bind mount /:/ as volume should not work")
}
// Verify that a container gets default DNS when only localhost resolvers exist
func TestRunDnsDefaultOptions(t *testing.T) {
+ defer deleteAllContainers()
+ testRequires(t, SameHostDaemon)
// preserve original resolv.conf for restoring after test
origResolvConf, err := ioutil.ReadFile("/etc/resolv.conf")
@@ -1390,19 +1557,24 @@ func TestRunDnsDefaultOptions(t *testing.T) {
t.Fatalf("expected resolv.conf be: %q, but was: %q", expected, actual)
}
- deleteAllContainers()
-
logDone("run - dns default options")
}
func TestRunDnsOptions(t *testing.T) {
+ defer deleteAllContainers()
+
cmd := exec.Command(dockerBinary, "run", "--dns=127.0.0.1", "--dns-search=mydomain", "busybox", "cat", "/etc/resolv.conf")
- out, _, err := runCommandWithOutput(cmd)
+ out, stderr, _, err := runCommandWithStdoutStderr(cmd)
if err != nil {
t.Fatal(err, out)
}
+ // The client will get a warning on stderr when setting DNS to a localhost address; verify this:
+ if !strings.Contains(stderr, "Localhost DNS setting") {
+ t.Fatalf("Expected warning on stderr about localhost resolver, but got %q", stderr)
+ }
+
actual := strings.Replace(strings.Trim(out, "\r\n"), "\n", " ", -1)
if actual != "nameserver 127.0.0.1 search mydomain" {
t.Fatalf("expected 'nameserver 127.0.0.1 search mydomain', but says: %q", actual)
@@ -1410,7 +1582,7 @@ func TestRunDnsOptions(t *testing.T) {
cmd = exec.Command(dockerBinary, "run", "--dns=127.0.0.1", "--dns-search=.", "busybox", "cat", "/etc/resolv.conf")
- out, _, err = runCommandWithOutput(cmd)
+ out, _, _, err = runCommandWithStdoutStderr(cmd)
if err != nil {
t.Fatal(err, out)
}
@@ -1424,7 +1596,8 @@ func TestRunDnsOptions(t *testing.T) {
}
func TestRunDnsOptionsBasedOnHostResolvConf(t *testing.T) {
- var out string
+ defer deleteAllContainers()
+ testRequires(t, SameHostDaemon)
origResolvConf, err := ioutil.ReadFile("/etc/resolv.conf")
if os.IsNotExist(err) {
@@ -1434,9 +1607,9 @@ func TestRunDnsOptionsBasedOnHostResolvConf(t *testing.T) {
hostNamservers := resolvconf.GetNameservers(origResolvConf)
hostSearch := resolvconf.GetSearchDomains(origResolvConf)
+ var out string
cmd := exec.Command(dockerBinary, "run", "--dns=127.0.0.1", "busybox", "cat", "/etc/resolv.conf")
-
- if out, _, err = runCommandWithOutput(cmd); err != nil {
+ if out, _, _, err = runCommandWithStdoutStderr(cmd); err != nil {
t.Fatal(err, out)
}
@@ -1513,8 +1686,7 @@ func TestRunDnsOptionsBasedOnHostResolvConf(t *testing.T) {
t.Fatalf("expected %q domain, but says: %q", actualSearch[i], hostSearch[i])
}
}
-
- deleteAllContainers()
+ defer deleteAllContainers()
logDone("run - dns options based on host resolv.conf")
}
@@ -1524,6 +1696,9 @@ func TestRunDnsOptionsBasedOnHostResolvConf(t *testing.T) {
// stopped and have an unmodified copy of resolv.conf, as well as
// marking running containers as requiring an update on next restart
func TestRunResolvconfUpdater(t *testing.T) {
+ // Because overlay doesn't support inotify properly, we need to skip
+ // this test if the docker daemon has Storage Driver == overlay
+ testRequires(t, SameHostDaemon, NotOverlay)
tmpResolvConf := []byte("search pommesfrites.fr\nnameserver 12.34.56.78")
tmpLocalhostResolvConf := []byte("nameserver 127.0.0.1")
@@ -1534,6 +1709,14 @@ func TestRunResolvconfUpdater(t *testing.T) {
t.Fatal(err)
}
+ // This test case is meant to test monitoring resolv.conf when it is
+ // a regular file not a bind mount. So we unmount resolv.conf and replace
+ // it with a file containing the original settings.
+ cmd := exec.Command("umount", "/etc/resolv.conf")
+ if _, err = runCommand(cmd); err != nil {
+ t.Fatal(err)
+ }
+
//cleanup
defer func() {
deleteAllContainers()
@@ -1543,7 +1726,7 @@ func TestRunResolvconfUpdater(t *testing.T) {
}()
//1. test that a non-running container gets an updated resolv.conf
- cmd := exec.Command(dockerBinary, "run", "--name='first'", "busybox", "true")
+ cmd = exec.Command(dockerBinary, "run", "--name='first'", "busybox", "true")
if _, err := runCommand(cmd); err != nil {
t.Fatal(err)
}
@@ -1666,6 +1849,45 @@ func TestRunResolvconfUpdater(t *testing.T) {
t.Fatalf("Container does not have cleaned/replaced DNS in resolv.conf; expected %q, got %q", expected, string(containerResolv))
}
+ //6. Test that replacing (as opposed to modifying) resolv.conf triggers an update
+ // of containers' resolv.conf.
+
+ // Restore the original resolv.conf
+ if err := ioutil.WriteFile("/etc/resolv.conf", resolvConfSystem, 0644); err != nil {
+ t.Fatal(err)
+ }
+
+ // Run the container so it picks up the old settings
+ cmd = exec.Command(dockerBinary, "run", "--name='third'", "busybox", "true")
+ if _, err := runCommand(cmd); err != nil {
+ t.Fatal(err)
+ }
+ containerID3, err := getIDByName("third")
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // Create a modified resolv.conf.aside and override resolv.conf with it
+ bytesResolvConf = []byte(tmpResolvConf)
+ if err := ioutil.WriteFile("/etc/resolv.conf.aside", bytesResolvConf, 0644); err != nil {
+ t.Fatal(err)
+ }
+
+ err = os.Rename("/etc/resolv.conf.aside", "/etc/resolv.conf")
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ time.Sleep(time.Second / 2)
+ // check for update in container
+ containerResolv, err = readContainerFile(containerID3, "resolv.conf")
+ if err != nil {
+ t.Fatal(err)
+ }
+ if !bytes.Equal(containerResolv, bytesResolvConf) {
+ t.Fatalf("Stopped container does not have updated resolv.conf; expected\n%q\n got\n%q", tmpResolvConf, string(containerResolv))
+ }
+
//cleanup, restore original resolv.conf happens in defer func()
logDone("run - resolv.conf updater")
}
@@ -1689,8 +1911,9 @@ func TestRunAddHost(t *testing.T) {
// Regression test for #6983
func TestRunAttachStdErrOnlyTTYMode(t *testing.T) {
- cmd := exec.Command(dockerBinary, "run", "-t", "-a", "stderr", "busybox", "true")
+ defer deleteAllContainers()
+ cmd := exec.Command(dockerBinary, "run", "-t", "-a", "stderr", "busybox", "true")
exitCode, err := runCommand(cmd)
if err != nil {
t.Fatal(err)
@@ -1698,13 +1921,13 @@ func TestRunAttachStdErrOnlyTTYMode(t *testing.T) {
t.Fatalf("Container should have exited with error code 0")
}
- deleteAllContainers()
-
logDone("run - Attach stderr only with -t")
}
// Regression test for #6983
func TestRunAttachStdOutOnlyTTYMode(t *testing.T) {
+ defer deleteAllContainers()
+
cmd := exec.Command(dockerBinary, "run", "-t", "-a", "stdout", "busybox", "true")
exitCode, err := runCommand(cmd)
@@ -1714,15 +1937,14 @@ func TestRunAttachStdOutOnlyTTYMode(t *testing.T) {
t.Fatalf("Container should have exited with error code 0")
}
- deleteAllContainers()
-
logDone("run - Attach stdout only with -t")
}
// Regression test for #6983
func TestRunAttachStdOutAndErrTTYMode(t *testing.T) {
- cmd := exec.Command(dockerBinary, "run", "-t", "-a", "stdout", "-a", "stderr", "busybox", "true")
+ defer deleteAllContainers()
+ cmd := exec.Command(dockerBinary, "run", "-t", "-a", "stdout", "-a", "stderr", "busybox", "true")
exitCode, err := runCommand(cmd)
if err != nil {
t.Fatal(err)
@@ -1730,11 +1952,25 @@ func TestRunAttachStdOutAndErrTTYMode(t *testing.T) {
t.Fatalf("Container should have exited with error code 0")
}
- deleteAllContainers()
-
logDone("run - Attach stderr and stdout with -t")
}
+// Test for #10388 - this will run the same test as TestRunAttachStdOutAndErrTTYMode
+// but using --attach instead of -a to make sure we read the flag correctly
+func TestRunAttachWithDettach(t *testing.T) {
+ defer deleteAllContainers()
+
+ cmd := exec.Command(dockerBinary, "run", "-d", "--attach", "stdout", "busybox", "true")
+ _, stderr, _, err := runCommandWithStdoutStderr(cmd)
+ if err == nil {
+ t.Fatalf("Container should have exited with error code different than 0", err)
+ } else if !strings.Contains(stderr, "Conflicting options: -a and -d") {
+ t.Fatalf("Should have been returned an error with conflicting options -a and -d")
+ }
+
+ logDone("run - Attach stdout with -d")
+}
+
func TestRunState(t *testing.T) {
defer deleteAllContainers()
cmd := exec.Command(dockerBinary, "run", "-d", "busybox", "top")
@@ -1969,13 +2205,44 @@ func TestRunWriteHostsFileAndNotCommit(t *testing.T) {
if err != nil {
t.Fatal(err, out)
}
- if len(strings.Trim(out, "\r\n")) != 0 {
+
+ if len(strings.Trim(out, "\r\n")) != 0 && !eqToBaseDiff(out, t) {
t.Fatal("diff should be empty")
}
logDone("run - write to /etc/hosts and not commited")
}
+func eqToBaseDiff(out string, t *testing.T) bool {
+ cmd := exec.Command(dockerBinary, "run", "-d", "busybox", "echo", "hello")
+ out1, _, err := runCommandWithOutput(cmd)
+ cID := stripTrailingCharacters(out1)
+ cmd = exec.Command(dockerBinary, "diff", cID)
+ base_diff, _, err := runCommandWithOutput(cmd)
+ if err != nil {
+ t.Fatal(err, base_diff)
+ }
+ base_arr := strings.Split(base_diff, "\n")
+ sort.Strings(base_arr)
+ out_arr := strings.Split(out, "\n")
+ sort.Strings(out_arr)
+ return sliceEq(base_arr, out_arr)
+}
+
+func sliceEq(a, b []string) bool {
+ if len(a) != len(b) {
+ return false
+ }
+
+ for i := range a {
+ if a[i] != b[i] {
+ return false
+ }
+ }
+
+ return true
+}
+
// Test for #2267
func TestRunWriteHostnameFileAndNotCommit(t *testing.T) {
defer deleteAllContainers()
@@ -1998,7 +2265,7 @@ func TestRunWriteHostnameFileAndNotCommit(t *testing.T) {
if err != nil {
t.Fatal(err, out)
}
- if len(strings.Trim(out, "\r\n")) != 0 {
+ if len(strings.Trim(out, "\r\n")) != 0 && !eqToBaseDiff(out, t) {
t.Fatal("diff should be empty")
}
@@ -2027,7 +2294,7 @@ func TestRunWriteResolvFileAndNotCommit(t *testing.T) {
if err != nil {
t.Fatal(err, out)
}
- if len(strings.Trim(out, "\r\n")) != 0 {
+ if len(strings.Trim(out, "\r\n")) != 0 && !eqToBaseDiff(out, t) {
t.Fatal("diff should be empty")
}
@@ -2067,6 +2334,7 @@ func TestRunEntrypoint(t *testing.T) {
}
func TestRunBindMounts(t *testing.T) {
+ testRequires(t, SameHostDaemon)
defer deleteAllContainers()
tmpDir, err := ioutil.TempDir("", "docker-test-container")
@@ -2117,89 +2385,37 @@ func TestRunBindMounts(t *testing.T) {
logDone("run - bind mounts")
}
-func TestRunMutableNetworkFiles(t *testing.T) {
- defer deleteAllContainers()
-
- for _, fn := range []string{"resolv.conf", "hosts"} {
- deleteAllContainers()
-
- content, err := runCommandAndReadContainerFile(fn, exec.Command(dockerBinary, "run", "-d", "--name", "c1", "busybox", "sh", "-c", fmt.Sprintf("echo success >/etc/%s && top", fn)))
- if err != nil {
- t.Fatal(err)
- }
-
- if strings.TrimSpace(string(content)) != "success" {
- t.Fatal("Content was not what was modified in the container", string(content))
- }
-
- out, _, err := runCommandWithOutput(exec.Command(dockerBinary, "run", "-d", "--name", "c2", "busybox", "top"))
- if err != nil {
- t.Fatal(err)
- }
-
- contID := strings.TrimSpace(out)
-
- netFilePath := containerStorageFile(contID, fn)
-
- f, err := os.OpenFile(netFilePath, os.O_WRONLY|os.O_SYNC|os.O_APPEND, 0644)
- if err != nil {
- t.Fatal(err)
- }
-
- if _, err := f.Seek(0, 0); err != nil {
- f.Close()
- t.Fatal(err)
- }
-
- if err := f.Truncate(0); err != nil {
- f.Close()
- t.Fatal(err)
- }
-
- if _, err := f.Write([]byte("success2\n")); err != nil {
- f.Close()
- t.Fatal(err)
- }
- f.Close()
-
- res, err := exec.Command(dockerBinary, "exec", contID, "cat", "/etc/"+fn).CombinedOutput()
- if err != nil {
- t.Fatalf("Output: %s, error: %s", res, err)
- }
- if string(res) != "success2\n" {
- t.Fatalf("Expected content of %s: %q, got: %q", fn, "success2\n", res)
- }
- }
- logDone("run - mutable network files")
-}
-
// Ensure that CIDFile gets deleted if it's empty
// Perform this test by making `docker run` fail
func TestRunCidFileCleanupIfEmpty(t *testing.T) {
+ defer deleteAllContainers()
+
tmpDir, err := ioutil.TempDir("", "TestRunCidFile")
if err != nil {
t.Fatal(err)
}
defer os.RemoveAll(tmpDir)
tmpCidFile := path.Join(tmpDir, "cid")
- cmd := exec.Command(dockerBinary, "run", "--cidfile", tmpCidFile, "scratch")
+ cmd := exec.Command(dockerBinary, "run", "--cidfile", tmpCidFile, "emptyfs")
out, _, err := runCommandWithOutput(cmd)
- t.Log(out)
if err == nil {
- t.Fatal("Run without command must fail")
+ t.Fatalf("Run without command must fail. out=%s", out)
+ } else if !strings.Contains(out, "No command specified") {
+ t.Fatalf("Run without command failed with wrong output. out=%s\nerr=%v", out, err)
}
if _, err := os.Stat(tmpCidFile); err == nil {
t.Fatalf("empty CIDFile %q should've been deleted", tmpCidFile)
}
- deleteAllContainers()
- logDone("run - cleanup empty cidfile on fail")
+ logDone("run - cleanup empty cidfile on error")
}
// #2098 - Docker cidFiles only contain short version of the containerId
//sudo docker run --cidfile /tmp/docker_test.cid ubuntu echo "test"
// TestRunCidFile tests that run --cidfile returns the longid
func TestRunCidFileCheckIDLength(t *testing.T) {
+ defer deleteAllContainers()
+
tmpDir, err := ioutil.TempDir("", "TestRunCidFile")
if err != nil {
t.Fatal(err)
@@ -2223,11 +2439,13 @@ func TestRunCidFileCheckIDLength(t *testing.T) {
if cid != id {
t.Fatalf("cid must be equal to %s, got %s", id, cid)
}
- deleteAllContainers()
+
logDone("run - cidfile contains long id")
}
func TestRunNetworkNotInitializedNoneMode(t *testing.T) {
+ defer deleteAllContainers()
+
cmd := exec.Command(dockerBinary, "run", "-d", "--net=none", "busybox", "top")
out, _, err := runCommandWithOutput(cmd)
if err != nil {
@@ -2241,27 +2459,30 @@ func TestRunNetworkNotInitializedNoneMode(t *testing.T) {
if res != "" {
t.Fatalf("For 'none' mode network must not be initialized, but container got IP: %s", res)
}
- deleteAllContainers()
+
logDone("run - network must not be initialized in 'none' mode")
}
func TestRunSetMacAddress(t *testing.T) {
mac := "12:34:56:78:9a:bc"
- cmd := exec.Command("/bin/bash", "-c", dockerBinary+` run -i --rm --mac-address=`+mac+` busybox /bin/sh -c "ip link show eth0 | tail -1 | awk '{ print \$2 }'"`)
- out, _, err := runCommandWithOutput(cmd)
+
+ defer deleteAllContainers()
+ cmd := exec.Command(dockerBinary, "run", "-i", "--rm", fmt.Sprintf("--mac-address=%s", mac), "busybox", "/bin/sh", "-c", "ip link show eth0 | tail -1 | awk '{print $2}'")
+ out, ec, err := runCommandWithOutput(cmd)
if err != nil {
- t.Fatal(err)
+ t.Fatalf("exec failed:\nexit code=%v\noutput=%s", ec, out)
}
actualMac := strings.TrimSpace(out)
if actualMac != mac {
t.Fatalf("Set MAC address with --mac-address failed. The container has an incorrect MAC address: %q, expected: %q", actualMac, mac)
}
- deleteAllContainers()
logDone("run - setting MAC address with --mac-address")
}
func TestRunInspectMacAddress(t *testing.T) {
+ defer deleteAllContainers()
+
mac := "12:34:56:78:9a:bc"
cmd := exec.Command(dockerBinary, "run", "-d", "--mac-address="+mac, "busybox", "top")
out, _, err := runCommandWithOutput(cmd)
@@ -2276,11 +2497,28 @@ func TestRunInspectMacAddress(t *testing.T) {
if inspectedMac != mac {
t.Fatalf("docker inspect outputs wrong MAC address: %q, should be: %q", inspectedMac, mac)
}
- deleteAllContainers()
+
logDone("run - inspecting MAC address")
}
+// test docker run use a invalid mac address
+func TestRunWithInvalidMacAddress(t *testing.T) {
+ defer deleteAllContainers()
+
+ runCmd := exec.Command(dockerBinary, "run", "--mac-address", "92:d0:c6:0a:29", "busybox")
+ out, _, err := runCommandWithOutput(runCmd)
+ //use a invalid mac address should with a error out
+ if err == nil || !strings.Contains(out, "is not a valid mac address") {
+ t.Fatalf("run with an invalid --mac-address should with error out")
+ }
+
+ logDone("run - can't use an invalid mac address")
+}
+
func TestRunDeallocatePortOnMissingIptablesRule(t *testing.T) {
+ defer deleteAllContainers()
+ testRequires(t, SameHostDaemon)
+
cmd := exec.Command(dockerBinary, "run", "-d", "-p", "23:23", "busybox", "top")
out, _, err := runCommandWithOutput(cmd)
if err != nil {
@@ -2305,11 +2543,14 @@ func TestRunDeallocatePortOnMissingIptablesRule(t *testing.T) {
if err != nil {
t.Fatal(err, out)
}
- deleteAllContainers()
+
logDone("run - port should be deallocated even on iptables error")
}
func TestRunPortInUse(t *testing.T) {
+ defer deleteAllContainers()
+ testRequires(t, SameHostDaemon)
+
port := "1234"
l, err := net.Listen("tcp", ":"+port)
if err != nil {
@@ -2325,12 +2566,13 @@ func TestRunPortInUse(t *testing.T) {
t.Fatalf("Out must be about \"address already in use\", got %s", out)
}
- deleteAllContainers()
- logDone("run - fail if port already in use")
+ logDone("run - error out if port already in use")
}
// https://github.com/docker/docker/issues/8428
func TestRunPortProxy(t *testing.T) {
+ testRequires(t, SameHostDaemon)
+
defer deleteAllContainers()
port := "12345"
@@ -2364,6 +2606,9 @@ func TestRunPortProxy(t *testing.T) {
// Regression test for #7792
func TestRunMountOrdering(t *testing.T) {
+ defer deleteAllContainers()
+ testRequires(t, SameHostDaemon)
+
tmpDir, err := ioutil.TempDir("", "docker_nested_mount_test")
if err != nil {
t.Fatal(err)
@@ -2400,112 +2645,14 @@ func TestRunMountOrdering(t *testing.T) {
t.Fatal(out, err)
}
- deleteAllContainers()
logDone("run - volumes are mounted in the correct order")
}
-func TestRunExecDir(t *testing.T) {
- cmd := exec.Command(dockerBinary, "run", "-d", "busybox", "top")
- out, _, err := runCommandWithOutput(cmd)
- if err != nil {
- t.Fatal(err, out)
- }
- id := strings.TrimSpace(out)
- execDir := filepath.Join(execDriverPath, id)
- stateFile := filepath.Join(execDir, "state.json")
- contFile := filepath.Join(execDir, "container.json")
-
- {
- fi, err := os.Stat(execDir)
- if err != nil {
- t.Fatal(err)
- }
- if !fi.IsDir() {
- t.Fatalf("%q must be a directory", execDir)
- }
- fi, err = os.Stat(stateFile)
- if err != nil {
- t.Fatal(err)
- }
- fi, err = os.Stat(contFile)
- if err != nil {
- t.Fatal(err)
- }
- }
-
- stopCmd := exec.Command(dockerBinary, "stop", id)
- out, _, err = runCommandWithOutput(stopCmd)
- if err != nil {
- t.Fatal(err, out)
- }
- {
- fi, err := os.Stat(execDir)
- if err != nil {
- t.Fatal(err)
- }
- if !fi.IsDir() {
- t.Fatalf("%q must be a directory", execDir)
- }
- fi, err = os.Stat(stateFile)
- if err == nil {
- t.Fatalf("Statefile %q is exists for stopped container!", stateFile)
- }
- if !os.IsNotExist(err) {
- t.Fatalf("Error should be about non-existing, got %s", err)
- }
- fi, err = os.Stat(contFile)
- if err == nil {
- t.Fatalf("Container file %q is exists for stopped container!", contFile)
- }
- if !os.IsNotExist(err) {
- t.Fatalf("Error should be about non-existing, got %s", err)
- }
- }
- startCmd := exec.Command(dockerBinary, "start", id)
- out, _, err = runCommandWithOutput(startCmd)
- if err != nil {
- t.Fatal(err, out)
- }
- {
- fi, err := os.Stat(execDir)
- if err != nil {
- t.Fatal(err)
- }
- if !fi.IsDir() {
- t.Fatalf("%q must be a directory", execDir)
- }
- fi, err = os.Stat(stateFile)
- if err != nil {
- t.Fatal(err)
- }
- fi, err = os.Stat(contFile)
- if err != nil {
- t.Fatal(err)
- }
- }
- rmCmd := exec.Command(dockerBinary, "rm", "-f", id)
- out, _, err = runCommandWithOutput(rmCmd)
- if err != nil {
- t.Fatal(err, out)
- }
- {
- _, err := os.Stat(execDir)
- if err == nil {
- t.Fatal(err)
- }
- if err == nil {
- t.Fatalf("Exec directory %q is exists for removed container!", execDir)
- }
- if !os.IsNotExist(err) {
- t.Fatalf("Error should be about non-existing, got %s", err)
- }
- }
-
- logDone("run - check execdriver dir behavior")
-}
-
// Regression test for https://github.com/docker/docker/issues/8259
func TestRunReuseBindVolumeThatIsSymlink(t *testing.T) {
+ defer deleteAllContainers()
+ testRequires(t, SameHostDaemon)
+
tmpDir, err := ioutil.TempDir(os.TempDir(), "testlink")
if err != nil {
t.Fatal(err)
@@ -2531,10 +2678,44 @@ func TestRunReuseBindVolumeThatIsSymlink(t *testing.T) {
t.Fatal(err, out)
}
- deleteAllContainers()
logDone("run - can remount old bindmount volume")
}
+//GH#10604: Test an "/etc" volume doesn't overlay special bind mounts in container
+func TestRunCreateVolumeEtc(t *testing.T) {
+ defer deleteAllContainers()
+
+ cmd := exec.Command(dockerBinary, "run", "--dns=127.0.0.1", "-v", "/etc", "busybox", "cat", "/etc/resolv.conf")
+ out, _, err := runCommandWithOutput(cmd)
+ if err != nil {
+ t.Fatal("failed to run container: %v, output: %q", err, out)
+ }
+ if !strings.Contains(out, "nameserver 127.0.0.1") {
+ t.Fatal("/etc volume mount hides /etc/resolv.conf")
+ }
+
+ cmd = exec.Command(dockerBinary, "run", "-h=test123", "-v", "/etc", "busybox", "cat", "/etc/hostname")
+ out, _, err = runCommandWithOutput(cmd)
+ if err != nil {
+ t.Fatal("failed to run container: %v, output: %q", err, out)
+ }
+ if !strings.Contains(out, "test123") {
+ t.Fatal("/etc volume mount hides /etc/hostname")
+ }
+
+ cmd = exec.Command(dockerBinary, "run", "--add-host=test:192.168.0.1", "-v", "/etc", "busybox", "cat", "/etc/hosts")
+ out, _, err = runCommandWithOutput(cmd)
+ if err != nil {
+ t.Fatal("failed to run container: %v, output: %q", err, out)
+ }
+ out = strings.Replace(out, "\n", " ", -1)
+ if !strings.Contains(out, "192.168.0.1\ttest") || !strings.Contains(out, "127.0.0.1\tlocalhost") {
+ t.Fatal("/etc volume mount hides /etc/hosts")
+ }
+
+ logDone("run - verify /etc volume doesn't hide special bind mounts")
+}
+
func TestVolumesNoCopyData(t *testing.T) {
defer deleteImages("dataimage")
defer deleteAllContainers()
@@ -2556,13 +2737,7 @@ func TestVolumesNoCopyData(t *testing.T) {
t.Fatalf("Data was copied on volumes-from but shouldn't be:\n%q", out)
}
- tmpDir, err := ioutil.TempDir("", "docker_test_bind_mount_copy_data")
- if err != nil {
- t.Fatal(err)
- }
-
- defer os.RemoveAll(tmpDir)
-
+ tmpDir := randomUnixTmpDirPath("docker_test_bind_mount_copy_data")
cmd = exec.Command(dockerBinary, "run", "-v", tmpDir+":/foo", "dataimage", "ls", "-lh", "/foo/bar")
if out, _, err := runCommandWithOutput(cmd); err == nil || !strings.Contains(out, "No such file or directory") {
t.Fatalf("Data was copied on bind-mount but shouldn't be:\n%q", out)
@@ -2572,6 +2747,8 @@ func TestVolumesNoCopyData(t *testing.T) {
}
func TestRunVolumesNotRecreatedOnStart(t *testing.T) {
+ testRequires(t, SameHostDaemon)
+
// Clear out any remnants from other tests
deleteAllContainers()
info, err := ioutil.ReadDir(volumesConfigPath)
@@ -2676,7 +2853,7 @@ func TestRunVolumesCleanPaths(t *testing.T) {
func TestRunSlowStdoutConsumer(t *testing.T) {
defer deleteAllContainers()
- c := exec.Command("/bin/bash", "-c", dockerBinary+` run --rm -i busybox /bin/sh -c "dd if=/dev/zero of=/foo bs=1024 count=2000 &>/dev/null; catv /foo"`)
+ c := exec.Command(dockerBinary, "run", "--rm", "busybox", "/bin/sh", "-c", "dd if=/dev/zero of=/dev/stdout bs=1024 count=2000 | catv")
stdout, err := c.StdoutPipe()
if err != nil {
@@ -2700,6 +2877,8 @@ func TestRunSlowStdoutConsumer(t *testing.T) {
}
func TestRunAllowPortRangeThroughExpose(t *testing.T) {
+ defer deleteAllContainers()
+
cmd := exec.Command(dockerBinary, "run", "-d", "--expose", "3000-3003", "-P", "busybox", "top")
out, _, err := runCommandWithOutput(cmd)
if err != nil {
@@ -2727,7 +2906,22 @@ func TestRunAllowPortRangeThroughExpose(t *testing.T) {
logDone("run - allow port range through --expose flag")
}
+// test docker run expose a invalid port
+func TestRunExposePort(t *testing.T) {
+ defer deleteAllContainers()
+
+ runCmd := exec.Command(dockerBinary, "run", "--expose", "80000", "busybox")
+ out, _, err := runCommandWithOutput(runCmd)
+ //expose a invalid port should with a error out
+ if err == nil || !strings.Contains(out, "Invalid range format for --expose") {
+ t.Fatalf("run --expose a invalid port should with error out")
+ }
+
+ logDone("run - can't expose a invalid port")
+}
+
func TestRunUnknownCommand(t *testing.T) {
+ testRequires(t, NativeExecDriver)
defer deleteAllContainers()
runCmd := exec.Command(dockerBinary, "create", "busybox", "/bin/nada")
cID, _, _, err := runCommandWithStdoutStderr(runCmd)
@@ -2737,10 +2931,7 @@ func TestRunUnknownCommand(t *testing.T) {
cID = strings.TrimSpace(cID)
runCmd = exec.Command(dockerBinary, "start", cID)
- _, _, _, err = runCommandWithStdoutStderr(runCmd)
- if err == nil {
- t.Fatalf("Container should not have been able to start!")
- }
+ _, _, _, _ = runCommandWithStdoutStderr(runCmd)
runCmd = exec.Command(dockerBinary, "inspect", "--format={{.State.ExitCode}}", cID)
rc, _, _, err2 := runCommandWithStdoutStderr(runCmd)
@@ -2750,14 +2941,17 @@ func TestRunUnknownCommand(t *testing.T) {
t.Fatalf("Error getting status of container: %v", err2)
}
- if rc != "-1" {
- t.Fatalf("ExitCode(%v) was supposed to be -1", rc)
+ if rc == "0" {
+ t.Fatalf("ExitCode(%v) cannot be 0", rc)
}
logDone("run - Unknown Command")
}
func TestRunModeIpcHost(t *testing.T) {
+ testRequires(t, SameHostDaemon)
+ defer deleteAllContainers()
+
hostIpc, err := os.Readlink("/proc/1/ns/ipc")
if err != nil {
t.Fatal(err)
@@ -2784,12 +2978,14 @@ func TestRunModeIpcHost(t *testing.T) {
if hostIpc == out2 {
t.Fatalf("IPC should be different without --ipc=host %s == %s\n", hostIpc, out2)
}
- deleteAllContainers()
logDone("run - ipc host mode")
}
func TestRunModeIpcContainer(t *testing.T) {
+ defer deleteAllContainers()
+ testRequires(t, SameHostDaemon)
+
cmd := exec.Command(dockerBinary, "run", "-d", "busybox", "top")
out, _, err := runCommandWithOutput(cmd)
if err != nil {
@@ -2822,12 +3018,14 @@ func TestRunModeIpcContainer(t *testing.T) {
if parentContainerIpc != out2 {
t.Fatalf("IPC different with --ipc=container:%s %s != %s\n", id, parentContainerIpc, out2)
}
- deleteAllContainers()
logDone("run - ipc container mode")
}
func TestContainerNetworkMode(t *testing.T) {
+ defer deleteAllContainers()
+ testRequires(t, SameHostDaemon)
+
cmd := exec.Command(dockerBinary, "run", "-d", "busybox", "top")
out, _, err := runCommandWithOutput(cmd)
if err != nil {
@@ -2856,12 +3054,14 @@ func TestContainerNetworkMode(t *testing.T) {
if parentContainerNet != out2 {
t.Fatalf("NET different with --net=container:%s %s != %s\n", id, parentContainerNet, out2)
}
- deleteAllContainers()
logDone("run - container shared network namespace")
}
func TestRunModePidHost(t *testing.T) {
+ testRequires(t, NativeExecDriver, SameHostDaemon)
+ defer deleteAllContainers()
+
hostPid, err := os.Readlink("/proc/1/ns/pid")
if err != nil {
t.Fatal(err)
@@ -2888,7 +3088,6 @@ func TestRunModePidHost(t *testing.T) {
if hostPid == out2 {
t.Fatalf("PID should be different without --pid=host %s == %s\n", hostPid, out2)
}
- deleteAllContainers()
logDone("run - pid host mode")
}
@@ -2933,6 +3132,10 @@ func TestRunPortFromDockerRangeInUse(t *testing.T) {
t.Fatal(out, err)
}
out = strings.TrimSpace(out)
+
+ if out == "" {
+ t.Fatal("docker port command output is empty")
+ }
out = strings.Split(out, ":")[1]
lastPort, err := strconv.Atoi(out)
if err != nil {
@@ -3001,7 +3204,9 @@ func TestRunNonLocalMacAddress(t *testing.T) {
}
func TestRunNetHost(t *testing.T) {
+ testRequires(t, SameHostDaemon)
defer deleteAllContainers()
+
hostNet, err := os.Readlink("/proc/1/ns/net")
if err != nil {
t.Fatal(err)
@@ -3032,10 +3237,40 @@ func TestRunNetHost(t *testing.T) {
logDone("run - net host mode")
}
+func TestRunNetContainerWhichHost(t *testing.T) {
+ testRequires(t, SameHostDaemon)
+ defer deleteAllContainers()
+
+ hostNet, err := os.Readlink("/proc/1/ns/net")
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ cmd := exec.Command(dockerBinary, "run", "-d", "--net=host", "--name=test", "busybox", "top")
+ out, _, err := runCommandWithOutput(cmd)
+ if err != nil {
+ t.Fatal(err, out)
+ }
+
+ cmd = exec.Command(dockerBinary, "run", "--net=container:test", "busybox", "readlink", "/proc/self/ns/net")
+ out, _, err = runCommandWithOutput(cmd)
+ if err != nil {
+ t.Fatal(err, out)
+ }
+
+ out = strings.Trim(out, "\n")
+ if hostNet != out {
+ t.Fatalf("Container should have host network namespace")
+ }
+
+ logDone("run - net container mode, where container in host mode")
+}
+
func TestRunAllowPortRangeThroughPublish(t *testing.T) {
+ defer deleteAllContainers()
+
cmd := exec.Command(dockerBinary, "run", "-d", "--expose", "3000-3003", "-p", "3000-3003", "busybox", "top")
out, _, err := runCommandWithOutput(cmd)
- defer deleteAllContainers()
id := strings.TrimSpace(out)
portstr, err := inspectFieldJSON(id, "NetworkSettings.Ports")
@@ -3079,6 +3314,25 @@ func TestRunOOMExitCode(t *testing.T) {
logDone("run - exit code on oom")
}
+func TestRunSetDefaultRestartPolicy(t *testing.T) {
+ defer deleteAllContainers()
+ runCmd := exec.Command(dockerBinary, "run", "-d", "--name", "test", "busybox", "top")
+ if out, _, err := runCommandWithOutput(runCmd); err != nil {
+ t.Fatalf("failed to run container: %v, output: %q", err, out)
+ }
+ cmd := exec.Command(dockerBinary, "inspect", "-f", "{{.HostConfig.RestartPolicy.Name}}", "test")
+ out, _, err := runCommandWithOutput(cmd)
+ if err != nil {
+ t.Fatalf("failed to inspect container: %v, output: %q", err, out)
+ }
+ out = strings.Trim(out, "\r\n")
+ if out != "no" {
+ t.Fatalf("Set default restart policy failed")
+ }
+
+ logDone("run - set default restart policy success")
+}
+
func TestRunRestartMaxRetries(t *testing.T) {
defer deleteAllContainers()
out, err := exec.Command(dockerBinary, "run", "-d", "--restart=on-failure:3", "busybox", "false").CombinedOutput()
@@ -3096,6 +3350,13 @@ func TestRunRestartMaxRetries(t *testing.T) {
if count != "3" {
t.Fatalf("Container was restarted %s times, expected %d", count, 3)
}
+ MaximumRetryCount, err := inspectField(id, "HostConfig.RestartPolicy.MaximumRetryCount")
+ if err != nil {
+ t.Fatal(err)
+ }
+ if MaximumRetryCount != "3" {
+ t.Fatalf("Container Maximum Retry Count is %s, expected %s", MaximumRetryCount, "3")
+ }
logDone("run - test max-retries for --restart")
}
@@ -3109,7 +3370,9 @@ func TestRunContainerWithWritableRootfs(t *testing.T) {
}
func TestRunContainerWithReadonlyRootfs(t *testing.T) {
+ testRequires(t, NativeExecDriver)
defer deleteAllContainers()
+
out, err := exec.Command(dockerBinary, "run", "--read-only", "--rm", "busybox", "touch", "/file").CombinedOutput()
if err == nil {
t.Fatal("expected container to error on run with read only error")
@@ -3148,3 +3411,28 @@ func TestRunVolumesFromRestartAfterRemoved(t *testing.T) {
logDone("run - can restart a volumes-from container after producer is removed")
}
+
+func TestRunPidHostWithChildIsKillable(t *testing.T) {
+ defer deleteAllContainers()
+ name := "ibuildthecloud"
+ if out, err := exec.Command(dockerBinary, "run", "-d", "--pid=host", "--name", name, "busybox", "sh", "-c", "sleep 30; echo hi").CombinedOutput(); err != nil {
+ t.Fatal(err, out)
+ }
+ time.Sleep(1 * time.Second)
+ errchan := make(chan error)
+ go func() {
+ if out, err := exec.Command(dockerBinary, "kill", name).CombinedOutput(); err != nil {
+ errchan <- fmt.Errorf("%v:\n%s", err, out)
+ }
+ close(errchan)
+ }()
+ select {
+ case err := <-errchan:
+ if err != nil {
+ t.Fatal(err)
+ }
+ case <-time.After(5 * time.Second):
+ t.Fatal("Kill container timed out")
+ }
+ logDone("run - can kill container with pid-host and some childs of pid 1")
+}
diff --git a/integration-cli/docker_cli_run_unix_test.go b/integration-cli/docker_cli_run_unix_test.go
index e12611cecd..9327ac240a 100644
--- a/integration-cli/docker_cli_run_unix_test.go
+++ b/integration-cli/docker_cli_run_unix_test.go
@@ -7,6 +7,7 @@ import (
"io/ioutil"
"os"
"os/exec"
+ "path"
"path/filepath"
"strings"
"testing"
@@ -56,6 +57,8 @@ func TestRunRedirectStdout(t *testing.T) {
// Test recursive bind mount works by default
func TestRunWithVolumesIsRecursive(t *testing.T) {
+ defer deleteAllContainers()
+
tmpDir, err := ioutil.TempDir("", "docker_recursive_mount_test")
if err != nil {
t.Fatal(err)
@@ -87,7 +90,86 @@ func TestRunWithVolumesIsRecursive(t *testing.T) {
t.Fatal("Recursive bind mount test failed. Expected file not found")
}
- deleteAllContainers()
-
logDone("run - volumes are bind mounted recursively")
}
+
+func TestRunWithUlimits(t *testing.T) {
+ testRequires(t, NativeExecDriver)
+ defer deleteAllContainers()
+ out, _, err := runCommandWithOutput(exec.Command(dockerBinary, "run", "--name=testulimits", "--ulimit", "nofile=42", "busybox", "/bin/sh", "-c", "ulimit -n"))
+ if err != nil {
+ t.Fatal(err, out)
+ }
+
+ ul := strings.TrimSpace(out)
+ if ul != "42" {
+ t.Fatalf("expected `ulimit -n` to be 42, got %s", ul)
+ }
+
+ logDone("run - ulimits are set")
+}
+
+func TestRunContainerWithCgroupParent(t *testing.T) {
+ testRequires(t, NativeExecDriver)
+ defer deleteAllContainers()
+
+ cgroupParent := "test"
+ data, err := ioutil.ReadFile("/proc/self/cgroup")
+ if err != nil {
+ t.Fatalf("failed to read '/proc/self/cgroup - %v", err)
+ }
+ selfCgroupPaths := parseCgroupPaths(string(data))
+ selfCpuCgroup, found := selfCgroupPaths["memory"]
+ if !found {
+ t.Fatalf("unable to find self cpu cgroup path. CgroupsPath: %v", selfCgroupPaths)
+ }
+
+ out, _, err := runCommandWithOutput(exec.Command(dockerBinary, "run", "--cgroup-parent", cgroupParent, "--rm", "busybox", "cat", "/proc/self/cgroup"))
+ if err != nil {
+ t.Fatalf("unexpected failure when running container with --cgroup-parent option - %s\n%v", string(out), err)
+ }
+ cgroupPaths := parseCgroupPaths(string(out))
+ if len(cgroupPaths) == 0 {
+ t.Fatalf("unexpected output - %q", string(out))
+ }
+ found = false
+ expectedCgroupPrefix := path.Join(selfCpuCgroup, cgroupParent)
+ for _, path := range cgroupPaths {
+ if strings.HasPrefix(path, expectedCgroupPrefix) {
+ found = true
+ break
+ }
+ }
+ if !found {
+ t.Fatalf("unexpected cgroup paths. Expected at least one cgroup path to have prefix %q. Cgroup Paths: %v", expectedCgroupPrefix, cgroupPaths)
+ }
+ logDone("run - cgroup parent")
+}
+
+func TestRunContainerWithCgroupParentAbsPath(t *testing.T) {
+ testRequires(t, NativeExecDriver)
+ defer deleteAllContainers()
+
+ cgroupParent := "/cgroup-parent/test"
+
+ out, _, err := runCommandWithOutput(exec.Command(dockerBinary, "run", "--cgroup-parent", cgroupParent, "--rm", "busybox", "cat", "/proc/self/cgroup"))
+ if err != nil {
+ t.Fatalf("unexpected failure when running container with --cgroup-parent option - %s\n%v", string(out), err)
+ }
+ cgroupPaths := parseCgroupPaths(string(out))
+ if len(cgroupPaths) == 0 {
+ t.Fatalf("unexpected output - %q", string(out))
+ }
+ found := false
+ for _, path := range cgroupPaths {
+ if strings.HasPrefix(path, cgroupParent) {
+ found = true
+ break
+ }
+ }
+ if !found {
+ t.Fatalf("unexpected cgroup paths. Expected at least one cgroup path to have prefix %q. Cgroup Paths: %v", cgroupParent, cgroupPaths)
+ }
+
+ logDone("run - cgroup parent with absolute cgroup path")
+}
diff --git a/integration-cli/docker_cli_save_load_test.go b/integration-cli/docker_cli_save_load_test.go
index 3130c1a264..1dd71ee5fe 100644
--- a/integration-cli/docker_cli_save_load_test.go
+++ b/integration-cli/docker_cli_save_load_test.go
@@ -14,14 +14,6 @@ import (
// save a repo using gz compression and try to load it using stdout
func TestSaveXzAndLoadRepoStdout(t *testing.T) {
- tempDir, err := ioutil.TempDir("", "test-save-xz-gz-load-repo-stdout")
- if err != nil {
- t.Fatal(err)
- }
- defer os.RemoveAll(tempDir)
-
- tarballPath := filepath.Join(tempDir, "foobar-save-load-test.tar.xz.gz")
-
runCmd := exec.Command(dockerBinary, "run", "-d", "busybox", "true")
out, _, err := runCommandWithOutput(runCmd)
if err != nil {
@@ -50,18 +42,17 @@ func TestSaveXzAndLoadRepoStdout(t *testing.T) {
t.Fatalf("the repo should exist before saving it: %v %v", before, err)
}
- saveCmdTemplate := `%v save %v | xz -c | gzip -c > %s`
- saveCmdFinal := fmt.Sprintf(saveCmdTemplate, dockerBinary, repoName, tarballPath)
- saveCmd := exec.Command("bash", "-c", saveCmdFinal)
- out, _, err = runCommandWithOutput(saveCmd)
+ repoTarball, _, err := runCommandPipelineWithOutput(
+ exec.Command(dockerBinary, "save", repoName),
+ exec.Command("xz", "-c"),
+ exec.Command("gzip", "-c"))
if err != nil {
t.Fatalf("failed to save repo: %v %v", out, err)
}
-
deleteImages(repoName)
- loadCmdFinal := fmt.Sprintf(`cat %s | docker load`, tarballPath)
- loadCmd := exec.Command("bash", "-c", loadCmdFinal)
+ loadCmd := exec.Command(dockerBinary, "load")
+ loadCmd.Stdin = strings.NewReader(repoTarball)
out, _, err = runCommandWithOutput(loadCmd)
if err == nil {
t.Fatalf("expected error, but succeeded with no error and output: %v", out)
@@ -73,7 +64,6 @@ func TestSaveXzAndLoadRepoStdout(t *testing.T) {
t.Fatalf("the repo should not exist: %v", after)
}
- deleteContainer(cleanedContainerID)
deleteImages(repoName)
logDone("load - save a repo with xz compression & load it using stdout")
@@ -81,14 +71,6 @@ func TestSaveXzAndLoadRepoStdout(t *testing.T) {
// save a repo using xz+gz compression and try to load it using stdout
func TestSaveXzGzAndLoadRepoStdout(t *testing.T) {
- tempDir, err := ioutil.TempDir("", "test-save-xz-gz-load-repo-stdout")
- if err != nil {
- t.Fatal(err)
- }
- defer os.RemoveAll(tempDir)
-
- tarballPath := filepath.Join(tempDir, "foobar-save-load-test.tar.xz.gz")
-
runCmd := exec.Command(dockerBinary, "run", "-d", "busybox", "true")
out, _, err := runCommandWithOutput(runCmd)
if err != nil {
@@ -117,18 +99,18 @@ func TestSaveXzGzAndLoadRepoStdout(t *testing.T) {
t.Fatalf("the repo should exist before saving it: %v %v", before, err)
}
- saveCmdTemplate := `%v save %v | xz -c | gzip -c > %s`
- saveCmdFinal := fmt.Sprintf(saveCmdTemplate, dockerBinary, repoName, tarballPath)
- saveCmd := exec.Command("bash", "-c", saveCmdFinal)
- out, _, err = runCommandWithOutput(saveCmd)
+ out, _, err = runCommandPipelineWithOutput(
+ exec.Command(dockerBinary, "save", repoName),
+ exec.Command("xz", "-c"),
+ exec.Command("gzip", "-c"))
if err != nil {
t.Fatalf("failed to save repo: %v %v", out, err)
}
deleteImages(repoName)
- loadCmdFinal := fmt.Sprintf(`cat %s | docker load`, tarballPath)
- loadCmd := exec.Command("bash", "-c", loadCmdFinal)
+ loadCmd := exec.Command(dockerBinary, "load")
+ loadCmd.Stdin = strings.NewReader(out)
out, _, err = runCommandWithOutput(loadCmd)
if err == nil {
t.Fatalf("expected error, but succeeded with no error and output: %v", out)
@@ -149,43 +131,40 @@ func TestSaveXzGzAndLoadRepoStdout(t *testing.T) {
func TestSaveSingleTag(t *testing.T) {
repoName := "foobar-save-single-tag-test"
- tagCmdFinal := fmt.Sprintf("%v tag busybox:latest %v:latest", dockerBinary, repoName)
- tagCmd := exec.Command("bash", "-c", tagCmdFinal)
+ tagCmd := exec.Command(dockerBinary, "tag", "busybox:latest", fmt.Sprintf("%v:latest", repoName))
+ defer deleteImages(repoName)
if out, _, err := runCommandWithOutput(tagCmd); err != nil {
t.Fatalf("failed to tag repo: %s, %v", out, err)
}
- idCmdFinal := fmt.Sprintf("%v images -q --no-trunc %v", dockerBinary, repoName)
- idCmd := exec.Command("bash", "-c", idCmdFinal)
+ idCmd := exec.Command(dockerBinary, "images", "-q", "--no-trunc", repoName)
out, _, err := runCommandWithOutput(idCmd)
if err != nil {
t.Fatalf("failed to get repo ID: %s, %v", out, err)
}
-
cleanedImageID := stripTrailingCharacters(out)
- saveCmdFinal := fmt.Sprintf("%v save %v:latest | tar t | grep -E '(^repositories$|%v)'", dockerBinary, repoName, cleanedImageID)
- saveCmd := exec.Command("bash", "-c", saveCmdFinal)
- if out, _, err = runCommandWithOutput(saveCmd); err != nil {
+ out, _, err = runCommandPipelineWithOutput(
+ exec.Command(dockerBinary, "save", fmt.Sprintf("%v:latest", repoName)),
+ exec.Command("tar", "t"),
+ exec.Command("grep", "-E", fmt.Sprintf("(^repositories$|%v)", cleanedImageID)))
+ if err != nil {
t.Fatalf("failed to save repo with image ID and 'repositories' file: %s, %v", out, err)
}
- deleteImages(repoName)
-
logDone("save - save a specific image:tag")
}
func TestSaveImageId(t *testing.T) {
repoName := "foobar-save-image-id-test"
- tagCmdFinal := fmt.Sprintf("%v tag emptyfs:latest %v:latest", dockerBinary, repoName)
- tagCmd := exec.Command("bash", "-c", tagCmdFinal)
+ tagCmd := exec.Command(dockerBinary, "tag", "emptyfs:latest", fmt.Sprintf("%v:latest", repoName))
+ defer deleteImages(repoName)
if out, _, err := runCommandWithOutput(tagCmd); err != nil {
t.Fatalf("failed to tag repo: %s, %v", out, err)
}
- idLongCmdFinal := fmt.Sprintf("%v images -q --no-trunc %v", dockerBinary, repoName)
- idLongCmd := exec.Command("bash", "-c", idLongCmdFinal)
+ idLongCmd := exec.Command(dockerBinary, "images", "-q", "--no-trunc", repoName)
out, _, err := runCommandWithOutput(idLongCmd)
if err != nil {
t.Fatalf("failed to get repo ID: %s, %v", out, err)
@@ -193,8 +172,7 @@ func TestSaveImageId(t *testing.T) {
cleanedLongImageID := stripTrailingCharacters(out)
- idShortCmdFinal := fmt.Sprintf("%v images -q %v", dockerBinary, repoName)
- idShortCmd := exec.Command("bash", "-c", idShortCmdFinal)
+ idShortCmd := exec.Command(dockerBinary, "images", "-q", repoName)
out, _, err = runCommandWithOutput(idShortCmd)
if err != nil {
t.Fatalf("failed to get repo short ID: %s, %v", out, err)
@@ -202,13 +180,32 @@ func TestSaveImageId(t *testing.T) {
cleanedShortImageID := stripTrailingCharacters(out)
- saveCmdFinal := fmt.Sprintf("%v save %v | tar t | grep %v", dockerBinary, cleanedShortImageID, cleanedLongImageID)
- saveCmd := exec.Command("bash", "-c", saveCmdFinal)
- if out, _, err = runCommandWithOutput(saveCmd); err != nil {
- t.Fatalf("failed to save repo with image ID: %s, %v", out, err)
+ saveCmd := exec.Command(dockerBinary, "save", cleanedShortImageID)
+ tarCmd := exec.Command("tar", "t")
+ tarCmd.Stdin, err = saveCmd.StdoutPipe()
+ if err != nil {
+ t.Fatalf("cannot set stdout pipe for tar: %v", err)
+ }
+ grepCmd := exec.Command("grep", cleanedLongImageID)
+ grepCmd.Stdin, err = tarCmd.StdoutPipe()
+ if err != nil {
+ t.Fatalf("cannot set stdout pipe for grep: %v", err)
}
- deleteImages(repoName)
+ if err = tarCmd.Start(); err != nil {
+ t.Fatalf("tar failed with error: %v", err)
+ }
+ if err = saveCmd.Start(); err != nil {
+ t.Fatalf("docker save failed with error: %v", err)
+ }
+ defer saveCmd.Wait()
+ defer tarCmd.Wait()
+
+ out, _, err = runCommandWithOutput(grepCmd)
+
+ if err != nil {
+ t.Fatalf("failed to save repo with image ID: %s, %v", out, err)
+ }
logDone("save - save a image by ID")
}
@@ -222,6 +219,7 @@ func TestSaveAndLoadRepoFlags(t *testing.T) {
}
cleanedContainerID := stripTrailingCharacters(out)
+ defer deleteContainer(cleanedContainerID)
repoName := "foobar-save-load-test"
@@ -231,6 +229,7 @@ func TestSaveAndLoadRepoFlags(t *testing.T) {
}
commitCmd := exec.Command(dockerBinary, "commit", cleanedContainerID, repoName)
+ deleteImages(repoName)
if out, _, err = runCommandWithOutput(commitCmd); err != nil {
t.Fatalf("failed to commit container: %s, %v", out, err)
}
@@ -239,21 +238,14 @@ func TestSaveAndLoadRepoFlags(t *testing.T) {
before, _, err := runCommandWithOutput(inspectCmd)
if err != nil {
t.Fatalf("the repo should exist before saving it: %s, %v", before, err)
- }
- saveCmdTemplate := `%v save -o /tmp/foobar-save-load-test.tar %v`
- saveCmdFinal := fmt.Sprintf(saveCmdTemplate, dockerBinary, repoName)
- saveCmd := exec.Command("bash", "-c", saveCmdFinal)
- if out, _, err = runCommandWithOutput(saveCmd); err != nil {
- t.Fatalf("failed to save repo: %s, %v", out, err)
}
- deleteImages(repoName)
-
- loadCmdFinal := `docker load -i /tmp/foobar-save-load-test.tar`
- loadCmd := exec.Command("bash", "-c", loadCmdFinal)
- if out, _, err = runCommandWithOutput(loadCmd); err != nil {
- t.Fatalf("failed to load repo: %s, %v", out, err)
+ out, _, err = runCommandPipelineWithOutput(
+ exec.Command(dockerBinary, "save", repoName),
+ exec.Command(dockerBinary, "load"))
+ if err != nil {
+ t.Fatalf("failed to save and load repo: %s, %v", out, err)
}
inspectCmd = exec.Command(dockerBinary, "inspect", repoName)
@@ -266,11 +258,6 @@ func TestSaveAndLoadRepoFlags(t *testing.T) {
t.Fatalf("inspect is not the same after a save / load")
}
- deleteContainer(cleanedContainerID)
- deleteImages(repoName)
-
- os.Remove("/tmp/foobar-save-load-test.tar")
-
logDone("save - save a repo using -o && load a repo using -i")
}
@@ -278,29 +265,29 @@ func TestSaveMultipleNames(t *testing.T) {
repoName := "foobar-save-multi-name-test"
// Make one image
- tagCmdFinal := fmt.Sprintf("%v tag emptyfs:latest %v-one:latest", dockerBinary, repoName)
- tagCmd := exec.Command("bash", "-c", tagCmdFinal)
+ tagCmd := exec.Command(dockerBinary, "tag", "emptyfs:latest", fmt.Sprintf("%v-one:latest", repoName))
if out, _, err := runCommandWithOutput(tagCmd); err != nil {
t.Fatalf("failed to tag repo: %s, %v", out, err)
}
defer deleteImages(repoName + "-one")
// Make two images
- tagCmdFinal = fmt.Sprintf("%v tag emptyfs:latest %v-two:latest", dockerBinary, repoName)
- tagCmd = exec.Command("bash", "-c", tagCmdFinal)
- if out, _, err := runCommandWithOutput(tagCmd); err != nil {
+ tagCmd = exec.Command(dockerBinary, "tag", "emptyfs:latest", fmt.Sprintf("%v-two:latest", repoName))
+ out, _, err := runCommandWithOutput(tagCmd)
+ if err != nil {
t.Fatalf("failed to tag repo: %s, %v", out, err)
}
defer deleteImages(repoName + "-two")
- saveCmdFinal := fmt.Sprintf("%v save %v-one %v-two:latest | tar xO repositories | grep -q -E '(-one|-two)'", dockerBinary, repoName, repoName)
- saveCmd := exec.Command("bash", "-c", saveCmdFinal)
- if out, _, err := runCommandWithOutput(saveCmd); err != nil {
+ out, _, err = runCommandPipelineWithOutput(
+ exec.Command(dockerBinary, "save", fmt.Sprintf("%v-one", repoName), fmt.Sprintf("%v-two:latest", repoName)),
+ exec.Command("tar", "xO", "repositories"),
+ exec.Command("grep", "-q", "-E", "(-one|-two)"),
+ )
+ if err != nil {
t.Fatalf("failed to save multiple repos: %s, %v", out, err)
}
- deleteImages(repoName)
-
logDone("save - save by multiple names")
}
@@ -316,14 +303,13 @@ func TestSaveRepoWithMultipleImages(t *testing.T) {
t.Fatalf("failed to create a container: %v %v", out, err)
}
cleanedContainerID := stripTrailingCharacters(out)
+ defer deleteContainer(cleanedContainerID)
commitCmd := exec.Command(dockerBinary, "commit", cleanedContainerID, tag)
if out, _, err = runCommandWithOutput(commitCmd); err != nil {
t.Fatalf("failed to commit container: %v %v", out, err)
}
imageID := stripTrailingCharacters(out)
-
- deleteContainer(cleanedContainerID)
return imageID
}
@@ -332,23 +318,25 @@ func TestSaveRepoWithMultipleImages(t *testing.T) {
tagBar := repoName + ":bar"
idFoo := makeImage("busybox:latest", tagFoo)
+ defer deleteImages(idFoo)
idBar := makeImage("busybox:latest", tagBar)
+ defer deleteImages(idBar)
deleteImages(repoName)
// create the archive
- saveCmdFinal := fmt.Sprintf("%v save %v | tar t | grep 'VERSION' |cut -d / -f1", dockerBinary, repoName)
- saveCmd := exec.Command("bash", "-c", saveCmdFinal)
- out, _, err := runCommandWithOutput(saveCmd)
+ out, _, err := runCommandPipelineWithOutput(
+ exec.Command(dockerBinary, "save", repoName),
+ exec.Command("tar", "t"),
+ exec.Command("grep", "VERSION"),
+ exec.Command("cut", "-d", "/", "-f1"))
if err != nil {
t.Fatalf("failed to save multiple images: %s, %v", out, err)
}
actual := strings.Split(stripTrailingCharacters(out), "\n")
// make the list of expected layers
- historyCmdFinal := fmt.Sprintf("%v history -q --no-trunc %v", dockerBinary, "busybox:latest")
- historyCmd := exec.Command("bash", "-c", historyCmdFinal)
- out, _, err = runCommandWithOutput(historyCmd)
+ out, _, err = runCommandWithOutput(exec.Command(dockerBinary, "history", "-q", "--no-trunc", "busybox:latest"))
if err != nil {
t.Fatalf("failed to get history: %s, %v", out, err)
}
@@ -388,9 +376,10 @@ func TestSaveDirectoryPermissions(t *testing.T) {
t.Fatal(err)
}
- saveCmdFinal := fmt.Sprintf("%s save %s | tar -xf - -C %s", dockerBinary, name, extractionDirectory)
- saveCmd := exec.Command("bash", "-c", saveCmdFinal)
- if out, _, err := runCommandWithOutput(saveCmd); err != nil {
+ if out, _, err := runCommandPipelineWithOutput(
+ exec.Command(dockerBinary, "save", name),
+ exec.Command("tar", "-xf", "-", "-C", extractionDirectory),
+ ); err != nil {
t.Errorf("failed to save and extract image: %s", out)
}
@@ -401,6 +390,7 @@ func TestSaveDirectoryPermissions(t *testing.T) {
found := false
for _, entry := range dirs {
+ var entriesSansDev []string
if entry.IsDir() {
layerPath := filepath.Join(extractionDirectory, entry.Name(), "layer.tar")
@@ -410,11 +400,16 @@ func TestSaveDirectoryPermissions(t *testing.T) {
}
entries, err := ListTar(f)
+ for _, e := range entries {
+ if !strings.Contains(e, "dev/") {
+ entriesSansDev = append(entriesSansDev, e)
+ }
+ }
if err != nil {
t.Fatalf("encountered error while listing tar entries: %s", err)
}
- if reflect.DeepEqual(entries, layerEntries) || reflect.DeepEqual(entries, layerEntriesAUFS) {
+ if reflect.DeepEqual(entriesSansDev, layerEntries) || reflect.DeepEqual(entriesSansDev, layerEntriesAUFS) {
found = true
break
}
diff --git a/integration-cli/docker_cli_start_test.go b/integration-cli/docker_cli_start_test.go
index 3b0617f09e..3ec04c9169 100644
--- a/integration-cli/docker_cli_start_test.go
+++ b/integration-cli/docker_cli_start_test.go
@@ -135,7 +135,7 @@ func TestStartRecordError(t *testing.T) {
t.Fatalf("Expected to not have state error but got state.Error(%q)", stateErr)
}
- logDone("start - set state error when start fails")
+ logDone("start - set state error when start is unsuccessful")
}
// gh#8726: a failed Start() breaks --volumes-from on subsequent Start()'s
@@ -187,3 +187,102 @@ func TestStartPausedContainer(t *testing.T) {
logDone("start - error should show if trying to start paused container")
}
+
+func TestStartMultipleContainers(t *testing.T) {
+ defer deleteAllContainers()
+ // run a container named 'parent' and create two container link to `parent`
+ cmd := exec.Command(dockerBinary, "run", "-d", "--name", "parent", "busybox", "top")
+ if out, _, err := runCommandWithOutput(cmd); err != nil {
+ t.Fatal(out, err)
+ }
+ for _, container := range []string{"child_first", "child_second"} {
+ cmd = exec.Command(dockerBinary, "create", "--name", container, "--link", "parent:parent", "busybox", "top")
+ if out, _, err := runCommandWithOutput(cmd); err != nil {
+ t.Fatal(out, err)
+ }
+ }
+
+ // stop 'parent' container
+ cmd = exec.Command(dockerBinary, "stop", "parent")
+ if out, _, err := runCommandWithOutput(cmd); err != nil {
+ t.Fatal(out, err)
+ }
+ cmd = exec.Command(dockerBinary, "inspect", "-f", "{{.State.Running}}", "parent")
+ out, _, err := runCommandWithOutput(cmd)
+ if err != nil {
+ t.Fatal(out, err)
+ }
+ out = strings.Trim(out, "\r\n")
+ if out != "false" {
+ t.Fatal("Container should be stopped")
+ }
+
+ // start all the three containers, container `child_first` start first which should be faild
+ // container 'parent' start second and then start container 'child_second'
+ cmd = exec.Command(dockerBinary, "start", "child_first", "parent", "child_second")
+ out, _, err = runCommandWithOutput(cmd)
+ if !strings.Contains(out, "Cannot start container child_first") || err == nil {
+ t.Fatal("Expected error but got none")
+ }
+
+ for container, expected := range map[string]string{"parent": "true", "child_first": "false", "child_second": "true"} {
+ cmd = exec.Command(dockerBinary, "inspect", "-f", "{{.State.Running}}", container)
+ out, _, err = runCommandWithOutput(cmd)
+ if err != nil {
+ t.Fatal(out, err)
+ }
+ out = strings.Trim(out, "\r\n")
+ if out != expected {
+ t.Fatal("Container running state wrong")
+ }
+
+ }
+
+ logDone("start - start multiple containers continue on one failed")
+}
+
+func TestStartAttachMultipleContainers(t *testing.T) {
+
+ var cmd *exec.Cmd
+
+ defer deleteAllContainers()
+ // run multiple containers to test
+ for _, container := range []string{"test1", "test2", "test3"} {
+ cmd = exec.Command(dockerBinary, "run", "-d", "--name", container, "busybox", "top")
+ if out, _, err := runCommandWithOutput(cmd); err != nil {
+ t.Fatal(out, err)
+ }
+ }
+
+ // stop all the containers
+ for _, container := range []string{"test1", "test2", "test3"} {
+ cmd = exec.Command(dockerBinary, "stop", container)
+ if out, _, err := runCommandWithOutput(cmd); err != nil {
+ t.Fatal(out, err)
+ }
+ }
+
+ // test start and attach multiple containers at once, expected error
+ for _, option := range []string{"-a", "-i", "-ai"} {
+ cmd = exec.Command(dockerBinary, "start", option, "test1", "test2", "test3")
+ out, _, err := runCommandWithOutput(cmd)
+ if !strings.Contains(out, "You cannot start and attach multiple containers at once.") || err == nil {
+ t.Fatal("Expected error but got none")
+ }
+ }
+
+ // confirm the state of all the containers be stopped
+ for container, expected := range map[string]string{"test1": "false", "test2": "false", "test3": "false"} {
+ cmd = exec.Command(dockerBinary, "inspect", "-f", "{{.State.Running}}", container)
+ out, _, err := runCommandWithOutput(cmd)
+ if err != nil {
+ t.Fatal(out, err)
+ }
+ out = strings.Trim(out, "\r\n")
+ if out != expected {
+ t.Fatal("Container running state wrong")
+ }
+ }
+
+ logDone("start - error on start and attach multiple containers at once")
+}
diff --git a/integration-cli/docker_cli_tag_test.go b/integration-cli/docker_cli_tag_test.go
index 4d5a394e4c..081e239c35 100644
--- a/integration-cli/docker_cli_tag_test.go
+++ b/integration-cli/docker_cli_tag_test.go
@@ -54,7 +54,7 @@ func TestTagInvalidUnprefixedRepo(t *testing.T) {
t.Fatalf("tag busybox %v should have failed", repo)
}
}
- logDone("tag - busybox invalid repo names --> must fail")
+ logDone("tag - busybox invalid repo names --> must not work")
}
// ensure we don't allow the use of invalid tags; these tag operations should fail
@@ -70,7 +70,7 @@ func TestTagInvalidPrefixedRepo(t *testing.T) {
t.Fatalf("tag busybox %v should have failed", repotag)
}
}
- logDone("tag - busybox with invalid repo:tagnames --> must fail")
+ logDone("tag - busybox with invalid repo:tagnames --> must not work")
}
// ensure we allow the use of valid tags
@@ -111,7 +111,7 @@ func TestTagExistedNameWithoutForce(t *testing.T) {
}
deleteImages("busybox:test")
- logDone("tag - busybox with an existed tag name without -f option --> must fail")
+ logDone("tag - busybox with an existed tag name without -f option --> must not work")
}
// tag an image with an existed tag name with -f option should work
diff --git a/integration-cli/docker_cli_version_test.go b/integration-cli/docker_cli_version_test.go
index 0759ba6767..ceaeba8e20 100644
--- a/integration-cli/docker_cli_version_test.go
+++ b/integration-cli/docker_cli_version_test.go
@@ -19,10 +19,12 @@ func TestVersionEnsureSucceeds(t *testing.T) {
"Client API version:",
"Go version (client):",
"Git commit (client):",
+ "OS/Arch (client):",
"Server version:",
"Server API version:",
"Go version (server):",
"Git commit (server):",
+ "OS/Arch (server):",
}
for _, linePrefix := range stringsToCheck {
diff --git a/integration-cli/docker_test_vars.go b/integration-cli/docker_test_vars.go
index ff2ec74063..9cb28b274e 100644
--- a/integration-cli/docker_test_vars.go
+++ b/integration-cli/docker_test_vars.go
@@ -17,11 +17,13 @@ var (
privateRegistryURL = "127.0.0.1:5000"
dockerBasePath = "/var/lib/docker"
- execDriverPath = dockerBasePath + "/execdriver/native"
volumesConfigPath = dockerBasePath + "/volumes"
volumesStoragePath = dockerBasePath + "/vfs/dir"
containerStoragePath = dockerBasePath + "/containers"
+ runtimePath = "/var/run/docker"
+ execDriverPath = runtimePath + "/execdriver/native"
+
workingDirectory string
)
diff --git a/integration-cli/docker_test_vars_cli.go b/integration-cli/docker_test_vars_cli.go
new file mode 100644
index 0000000000..e7efb7ce8b
--- /dev/null
+++ b/integration-cli/docker_test_vars_cli.go
@@ -0,0 +1,8 @@
+// +build !daemon
+
+package main
+
+const (
+ // tests should not assume daemon runs on the same machine as CLI
+ isLocalDaemon = false
+)
diff --git a/integration-cli/docker_test_vars_daemon.go b/integration-cli/docker_test_vars_daemon.go
new file mode 100644
index 0000000000..a4645900a8
--- /dev/null
+++ b/integration-cli/docker_test_vars_daemon.go
@@ -0,0 +1,8 @@
+// +build daemon
+
+package main
+
+const (
+ // tests can assume daemon runs on the same machine as CLI
+ isLocalDaemon = true
+)
diff --git a/integration-cli/docker_utils.go b/integration-cli/docker_utils.go
index 35a97feca7..10cc6c9218 100644
--- a/integration-cli/docker_utils.go
+++ b/integration-cli/docker_utils.go
@@ -20,6 +20,8 @@ import (
"strings"
"testing"
"time"
+
+ "github.com/docker/docker/api"
)
// Daemon represents a Docker daemon for the testing framework.
@@ -265,24 +267,19 @@ func (d *Daemon) Cmd(name string, arg ...string) (string, error) {
return string(b), err
}
+func (d *Daemon) LogfileName() string {
+ return d.logFile.Name()
+}
+
func daemonHost() string {
- daemonUrlStr := "unix:///var/run/docker.sock"
- if daemonHostVar := os.Getenv("DOCKER_TEST_HOST"); daemonHostVar != "" {
+ daemonUrlStr := "unix://" + api.DEFAULTUNIXSOCKET
+ if daemonHostVar := os.Getenv("DOCKER_HOST"); daemonHostVar != "" {
daemonUrlStr = daemonHostVar
}
return daemonUrlStr
}
-func sockRequest(method, endpoint string, data interface{}) ([]byte, error) {
- jsonData := bytes.NewBuffer(nil)
- if err := json.NewEncoder(jsonData).Encode(data); err != nil {
- return nil, err
- }
-
- return sockRequestRaw(method, endpoint, jsonData, "application/json")
-}
-
-func sockRequestRaw(method, endpoint string, data io.Reader, ct string) ([]byte, error) {
+func sockConn(timeout time.Duration) (net.Conn, error) {
daemon := daemonHost()
daemonUrl, err := url.Parse(daemon)
if err != nil {
@@ -292,14 +289,27 @@ func sockRequestRaw(method, endpoint string, data io.Reader, ct string) ([]byte,
var c net.Conn
switch daemonUrl.Scheme {
case "unix":
- c, err = net.DialTimeout(daemonUrl.Scheme, daemonUrl.Path, time.Duration(10*time.Second))
+ return net.DialTimeout(daemonUrl.Scheme, daemonUrl.Path, timeout)
case "tcp":
- c, err = net.DialTimeout(daemonUrl.Scheme, daemonUrl.Host, time.Duration(10*time.Second))
+ return net.DialTimeout(daemonUrl.Scheme, daemonUrl.Host, timeout)
default:
- err = fmt.Errorf("unknown scheme %v", daemonUrl.Scheme)
+ return c, fmt.Errorf("unknown scheme %v (%s)", daemonUrl.Scheme, daemon)
+ }
+}
+
+func sockRequest(method, endpoint string, data interface{}) ([]byte, error) {
+ jsonData := bytes.NewBuffer(nil)
+ if err := json.NewEncoder(jsonData).Encode(data); err != nil {
+ return nil, err
}
+
+ return sockRequestRaw(method, endpoint, jsonData, "application/json")
+}
+
+func sockRequestRaw(method, endpoint string, data io.Reader, ct string) ([]byte, error) {
+ c, err := sockConn(time.Duration(10 * time.Second))
if err != nil {
- return nil, fmt.Errorf("could not dial docker daemon at %s: %v", daemon, err)
+ return nil, fmt.Errorf("could not dial docker daemon: %v", err)
}
client := httputil.NewClientConn(c, nil)
@@ -380,6 +390,16 @@ func getPausedContainers() (string, error) {
return out, err
}
+func getSliceOfPausedContainers() ([]string, error) {
+ out, err := getPausedContainers()
+ if err == nil {
+ slice := strings.Split(strings.TrimSpace(out), "\n")
+ return slice, err
+ } else {
+ return []string{out}, err
+ }
+}
+
func unpauseContainer(container string) error {
unpauseCmd := exec.Command(dockerBinary, "unpause", container)
exitCode, err := runCommand(unpauseCmd)
@@ -453,7 +473,7 @@ func dockerCmd(t *testing.T, args ...string) (string, int, error) {
return out, status, err
}
-// execute a docker ocmmand with a timeout
+// execute a docker command with a timeout
func dockerCmdWithTimeout(timeout time.Duration, args ...string) (string, int, error) {
out, status, err := runCommandWithOutputAndTimeout(exec.Command(dockerBinary, args...), timeout)
if err != nil {
@@ -543,7 +563,11 @@ func (f *FakeContext) Close() error {
return os.RemoveAll(f.Dir)
}
-func fakeContext(dockerfile string, files map[string]string) (*FakeContext, error) {
+func fakeContextFromDir(dir string) *FakeContext {
+ return &FakeContext{dir}
+}
+
+func fakeContextWithFiles(files map[string]string) (*FakeContext, error) {
tmp, err := ioutil.TempDir("", "fake-context")
if err != nil {
return nil, err
@@ -551,80 +575,190 @@ func fakeContext(dockerfile string, files map[string]string) (*FakeContext, erro
if err := os.Chmod(tmp, 0755); err != nil {
return nil, err
}
- ctx := &FakeContext{tmp}
+
+ ctx := fakeContextFromDir(tmp)
for file, content := range files {
if err := ctx.Add(file, content); err != nil {
ctx.Close()
return nil, err
}
}
+ return ctx, nil
+}
+
+func fakeContextAddDockerfile(ctx *FakeContext, dockerfile string) error {
if err := ctx.Add("Dockerfile", dockerfile); err != nil {
ctx.Close()
- return nil, err
+ return err
}
- return ctx, nil
+ return nil
}
-type FakeStorage struct {
- *FakeContext
- *httptest.Server
+func fakeContext(dockerfile string, files map[string]string) (*FakeContext, error) {
+ ctx, err := fakeContextWithFiles(files)
+ if err != nil {
+ ctx.Close()
+ return nil, err
+ }
+ if err := fakeContextAddDockerfile(ctx, dockerfile); err != nil {
+ return nil, err
+ }
+ return ctx, nil
}
-func (f *FakeStorage) Close() error {
- f.Server.Close()
- return f.FakeContext.Close()
+// FakeStorage is a static file server. It might be running locally or remotely
+// on test host.
+type FakeStorage interface {
+ Close() error
+ URL() string
+ CtxDir() string
}
-func fakeStorage(files map[string]string) (*FakeStorage, error) {
- tmp, err := ioutil.TempDir("", "fake-storage")
+// fakeStorage returns either a local or remote (at daemon machine) file server
+func fakeStorage(files map[string]string) (FakeStorage, error) {
+ ctx, err := fakeContextWithFiles(files)
if err != nil {
return nil, err
}
- ctx := &FakeContext{tmp}
- for file, content := range files {
- if err := ctx.Add(file, content); err != nil {
- ctx.Close()
- return nil, err
- }
+ return fakeStorageWithContext(ctx)
+}
+
+// fakeStorageWithContext returns either a local or remote (at daemon machine) file server
+func fakeStorageWithContext(ctx *FakeContext) (FakeStorage, error) {
+ if isLocalDaemon {
+ return newLocalFakeStorage(ctx)
}
+ return newRemoteFileServer(ctx)
+}
+
+// localFileStorage is a file storage on the running machine
+type localFileStorage struct {
+ *FakeContext
+ *httptest.Server
+}
+
+func (s *localFileStorage) URL() string {
+ return s.Server.URL
+}
+
+func (s *localFileStorage) CtxDir() string {
+ return s.FakeContext.Dir
+}
+
+func (s *localFileStorage) Close() error {
+ defer s.Server.Close()
+ return s.FakeContext.Close()
+}
+
+func newLocalFakeStorage(ctx *FakeContext) (*localFileStorage, error) {
handler := http.FileServer(http.Dir(ctx.Dir))
server := httptest.NewServer(handler)
- return &FakeStorage{
+ return &localFileStorage{
FakeContext: ctx,
Server: server,
}, nil
}
-func inspectField(name, field string) (string, error) {
- format := fmt.Sprintf("{{.%s}}", field)
- inspectCmd := exec.Command(dockerBinary, "inspect", "-f", format, name)
- out, exitCode, err := runCommandWithOutput(inspectCmd)
- if err != nil || exitCode != 0 {
- return "", fmt.Errorf("failed to inspect %s: %s", name, out)
+// remoteFileServer is a containerized static file server started on the remote
+// testing machine to be used in URL-accepting docker build functionality.
+type remoteFileServer struct {
+ host string // hostname/port web server is listening to on docker host e.g. 0.0.0.0:43712
+ container string
+ image string
+ ctx *FakeContext
+}
+
+func (f *remoteFileServer) URL() string {
+ u := url.URL{
+ Scheme: "http",
+ Host: f.host}
+ return u.String()
+}
+
+func (f *remoteFileServer) CtxDir() string {
+ return f.ctx.Dir
+}
+
+func (f *remoteFileServer) Close() error {
+ defer func() {
+ if f.ctx != nil {
+ f.ctx.Close()
+ }
+ if f.image != "" {
+ deleteImages(f.image)
+ }
+ }()
+ if f.container == "" {
+ return nil
}
- return strings.TrimSpace(out), nil
+ return deleteContainer(f.container)
}
-func inspectFieldJSON(name, field string) (string, error) {
- format := fmt.Sprintf("{{json .%s}}", field)
- inspectCmd := exec.Command(dockerBinary, "inspect", "-f", format, name)
- out, exitCode, err := runCommandWithOutput(inspectCmd)
- if err != nil || exitCode != 0 {
- return "", fmt.Errorf("failed to inspect %s: %s", name, out)
+func newRemoteFileServer(ctx *FakeContext) (*remoteFileServer, error) {
+ var (
+ image = fmt.Sprintf("fileserver-img-%s", strings.ToLower(makeRandomString(10)))
+ container = fmt.Sprintf("fileserver-cnt-%s", strings.ToLower(makeRandomString(10)))
+ )
+
+ // Build the image
+ if err := fakeContextAddDockerfile(ctx, `FROM httpserver
+COPY . /static`); err != nil {
+ return nil, fmt.Errorf("Cannot add Dockerfile to context: %v", err)
}
- return strings.TrimSpace(out), nil
+ if _, err := buildImageFromContext(image, ctx, false); err != nil {
+ return nil, fmt.Errorf("failed building file storage container image: %v", err)
+ }
+
+ // Start the container
+ runCmd := exec.Command(dockerBinary, "run", "-d", "-P", "--name", container, image)
+ if out, ec, err := runCommandWithOutput(runCmd); err != nil {
+ return nil, fmt.Errorf("failed to start file storage container. ec=%v\nout=%s\nerr=%v", ec, out, err)
+ }
+
+ // Find out the system assigned port
+ out, _, err := runCommandWithOutput(exec.Command(dockerBinary, "port", container, "80/tcp"))
+ if err != nil {
+ return nil, fmt.Errorf("failed to find container port: err=%v\nout=%s", err, out)
+ }
+
+ return &remoteFileServer{
+ container: container,
+ image: image,
+ host: strings.Trim(out, "\n"),
+ ctx: ctx}, nil
}
-func inspectFieldMap(name, path, field string) (string, error) {
- format := fmt.Sprintf("{{index .%s %q}}", path, field)
+func inspectFieldAndMarshall(name, field string, output interface{}) error {
+ str, err := inspectFieldJSON(name, field)
+ if err != nil {
+ return err
+ }
+
+ return json.Unmarshal([]byte(str), output)
+}
+
+func inspectFilter(name, filter string) (string, error) {
+ format := fmt.Sprintf("{{%s}}", filter)
inspectCmd := exec.Command(dockerBinary, "inspect", "-f", format, name)
out, exitCode, err := runCommandWithOutput(inspectCmd)
if err != nil || exitCode != 0 {
- return "", fmt.Errorf("failed to inspect %s: %s", name, out)
+ return "", fmt.Errorf("failed to inspect container %s: %s", name, out)
}
return strings.TrimSpace(out), nil
}
+func inspectField(name, field string) (string, error) {
+ return inspectFilter(name, fmt.Sprintf(".%s", field))
+}
+
+func inspectFieldJSON(name, field string) (string, error) {
+ return inspectFilter(name, fmt.Sprintf("json .%s", field))
+}
+
+func inspectFieldMap(name, path, field string) (string, error) {
+ return inspectFilter(name, fmt.Sprintf("index .%s %q", path, field))
+}
+
func getIDByName(name string) (string, error) {
return inspectField(name, "Id")
}
@@ -731,29 +865,40 @@ func buildImageFromPath(name, path string, useCache bool) (string, error) {
return getIDByName(name)
}
-type FakeGIT struct {
+type GitServer interface {
+ URL() string
+ Close() error
+}
+
+type localGitServer struct {
*httptest.Server
- Root string
+}
+
+func (r *localGitServer) Close() error {
+ r.Server.Close()
+ return nil
+}
+
+func (r *localGitServer) URL() string {
+ return r.Server.URL
+}
+
+type FakeGIT struct {
+ root string
+ server GitServer
RepoURL string
}
func (g *FakeGIT) Close() {
- g.Server.Close()
- os.RemoveAll(g.Root)
+ g.server.Close()
+ os.RemoveAll(g.root)
}
-func fakeGIT(name string, files map[string]string) (*FakeGIT, error) {
- tmp, err := ioutil.TempDir("", "fake-git-repo")
+func fakeGIT(name string, files map[string]string, enforceLocalServer bool) (*FakeGIT, error) {
+ ctx, err := fakeContextWithFiles(files)
if err != nil {
return nil, err
}
- ctx := &FakeContext{tmp}
- for file, content := range files {
- if err := ctx.Add(file, content); err != nil {
- ctx.Close()
- return nil, err
- }
- }
defer ctx.Close()
curdir, err := os.Getwd()
if err != nil {
@@ -768,6 +913,12 @@ func fakeGIT(name string, files map[string]string) (*FakeGIT, error) {
if err != nil {
return nil, err
}
+ if output, err := exec.Command("git", "config", "user.name", "Fake User").CombinedOutput(); err != nil {
+ return nil, fmt.Errorf("error trying to set 'user.name': %s (%s)", err, output)
+ }
+ if output, err := exec.Command("git", "config", "user.email", "fake.user@example.com").CombinedOutput(); err != nil {
+ return nil, fmt.Errorf("error trying to set 'user.email': %s (%s)", err, output)
+ }
if output, err := exec.Command("git", "add", "*").CombinedOutput(); err != nil {
return nil, fmt.Errorf("error trying to add files to repo: %s (%s)", err, output)
}
@@ -798,12 +949,23 @@ func fakeGIT(name string, files map[string]string) (*FakeGIT, error) {
os.RemoveAll(root)
return nil, err
}
- handler := http.FileServer(http.Dir(root))
- server := httptest.NewServer(handler)
+
+ var server GitServer
+ if !enforceLocalServer {
+ // use fakeStorage server, which might be local or remote (at test daemon)
+ server, err = fakeStorageWithContext(fakeContextFromDir(root))
+ if err != nil {
+ return nil, fmt.Errorf("cannot start fake storage: %v", err)
+ }
+ } else {
+ // always start a local http server on CLI test machin
+ httpServer := httptest.NewServer(http.FileServer(http.Dir(root)))
+ server = &localGitServer{httpServer}
+ }
return &FakeGIT{
- Server: server,
- Root: root,
- RepoURL: fmt.Sprintf("%s/%s.git", server.URL, name),
+ root: root,
+ server: server,
+ RepoURL: fmt.Sprintf("%s/%s.git", server.URL(), name),
}, nil
}
@@ -829,14 +991,11 @@ func writeFile(dst, content string, t *testing.T) {
// Return the contents of file at path `src`.
// Call t.Fatal() at the first error (including if the file doesn't exist)
func readFile(src string, t *testing.T) (content string) {
- f, err := os.Open(src)
- if err != nil {
- t.Fatal(err)
- }
- data, err := ioutil.ReadAll(f)
+ data, err := ioutil.ReadFile(src)
if err != nil {
t.Fatal(err)
}
+
return string(data)
}
@@ -873,7 +1032,39 @@ func readContainerFile(containerId, filename string) ([]byte, error) {
return content, nil
}
+func readContainerFileWithExec(containerId, filename string) ([]byte, error) {
+ out, _, err := runCommandWithOutput(exec.Command(dockerBinary, "exec", containerId, "cat", filename))
+ return []byte(out), err
+}
+
+// daemonTime provides the current time on the daemon host
+func daemonTime(t *testing.T) time.Time {
+ if isLocalDaemon {
+ return time.Now()
+ }
+
+ body, err := sockRequest("GET", "/info", nil)
+ if err != nil {
+ t.Fatal("daemonTime: failed to get /info: %v", err)
+ }
+
+ type infoJSON struct {
+ SystemTime string
+ }
+ var info infoJSON
+ if err = json.Unmarshal(body, &info); err != nil {
+ t.Fatalf("unable to unmarshal /info response: %v", err)
+ }
+
+ dt, err := time.Parse(time.RFC3339Nano, info.SystemTime)
+ if err != nil {
+ t.Fatal(err)
+ }
+ return dt
+}
+
func setupRegistry(t *testing.T) func() {
+ testRequires(t, RegistryHosting)
reg, err := newTestRegistryV2(t)
if err != nil {
t.Fatal(err)
@@ -893,3 +1084,24 @@ func setupRegistry(t *testing.T) func() {
return func() { reg.Close() }
}
+
+// appendBaseEnv appends the minimum set of environment variables to exec the
+// docker cli binary for testing with correct configuration to the given env
+// list.
+func appendBaseEnv(env []string) []string {
+ preserveList := []string{
+ // preserve remote test host
+ "DOCKER_HOST",
+
+ // windows: requires preserving SystemRoot, otherwise dial tcp fails
+ // with "GetAddrInfoW: A non-recoverable error occurred during a database lookup."
+ "SystemRoot",
+ }
+
+ for _, key := range preserveList {
+ if val := os.Getenv(key); val != "" {
+ env = append(env, fmt.Sprintf("%s=%s", key, val))
+ }
+ }
+ return env
+}
diff --git a/integration-cli/registry.go b/integration-cli/registry.go
index d24ff5c98a..8290e710fd 100644
--- a/integration-cli/registry.go
+++ b/integration-cli/registry.go
@@ -60,7 +60,7 @@ func (t *testRegistryV2) Ping() error {
return err
}
if resp.StatusCode != 200 {
- return fmt.Errorf("registry ping replied with an unexpected status code %s", resp.StatusCode)
+ return fmt.Errorf("registry ping replied with an unexpected status code %d", resp.StatusCode)
}
return nil
}
diff --git a/integration-cli/requirements.go b/integration-cli/requirements.go
new file mode 100644
index 0000000000..346d0cdf66
--- /dev/null
+++ b/integration-cli/requirements.go
@@ -0,0 +1,90 @@
+package main
+
+import (
+ "encoding/json"
+ "fmt"
+ "log"
+ "os/exec"
+ "strings"
+ "testing"
+)
+
+type TestCondition func() bool
+
+type TestRequirement struct {
+ Condition TestCondition
+ SkipMessage string
+}
+
+// List test requirements
+var (
+ daemonExecDriver string
+
+ SameHostDaemon = TestRequirement{
+ func() bool { return isLocalDaemon },
+ "Test requires docker daemon to runs on the same machine as CLI",
+ }
+ UnixCli = TestRequirement{
+ func() bool { return isUnixCli },
+ "Test requires posix utilities or functionality to run.",
+ }
+ ExecSupport = TestRequirement{
+ func() bool { return supportsExec },
+ "Test requires 'docker exec' capabilities on the tested daemon.",
+ }
+ RegistryHosting = TestRequirement{
+ func() bool {
+ // for now registry binary is built only if we're running inside
+ // container through `make test`. Figure that out by testing if
+ // registry binary is in PATH.
+ _, err := exec.LookPath(v2binary)
+ return err == nil
+ },
+ fmt.Sprintf("Test requires an environment that can host %s in the same host", v2binary),
+ }
+ NativeExecDriver = TestRequirement{
+ func() bool {
+ if daemonExecDriver == "" {
+ // get daemon info
+ body, err := sockRequest("GET", "/info", nil)
+ if err != nil {
+ log.Fatalf("sockRequest failed for /info: %v", err)
+ }
+
+ type infoJSON struct {
+ ExecutionDriver string
+ }
+ var info infoJSON
+ if err = json.Unmarshal(body, &info); err != nil {
+ log.Fatalf("unable to unmarshal body: %v", err)
+ }
+
+ daemonExecDriver = info.ExecutionDriver
+ }
+
+ return strings.HasPrefix(daemonExecDriver, "native")
+ },
+ "Test requires the native (libcontainer) exec driver.",
+ }
+
+ NotOverlay = TestRequirement{
+ func() bool {
+ cmd := exec.Command("grep", "^overlay / overlay", "/proc/mounts")
+ if err := cmd.Run(); err != nil {
+ return true
+ }
+ return false
+ },
+ "Test requires underlying root filesystem not be backed by overlay.",
+ }
+)
+
+// testRequires checks if the environment satisfies the requirements
+// for the test to run or skips the tests.
+func testRequires(t *testing.T, requirements ...TestRequirement) {
+ for _, r := range requirements {
+ if !r.Condition() {
+ t.Skip(r.SkipMessage)
+ }
+ }
+}
diff --git a/integration-cli/test_vars_exec.go b/integration-cli/test_vars_exec.go
new file mode 100644
index 0000000000..7633b346ba
--- /dev/null
+++ b/integration-cli/test_vars_exec.go
@@ -0,0 +1,8 @@
+// +build !test_no_exec
+
+package main
+
+const (
+ // indicates docker daemon tested supports 'docker exec'
+ supportsExec = true
+)
diff --git a/integration-cli/test_vars_noexec.go b/integration-cli/test_vars_noexec.go
new file mode 100644
index 0000000000..0845090524
--- /dev/null
+++ b/integration-cli/test_vars_noexec.go
@@ -0,0 +1,8 @@
+// +build test_no_exec
+
+package main
+
+const (
+ // indicates docker daemon tested supports 'docker exec'
+ supportsExec = false
+)
diff --git a/integration-cli/test_vars_unix.go b/integration-cli/test_vars_unix.go
new file mode 100644
index 0000000000..1ab8a5ca48
--- /dev/null
+++ b/integration-cli/test_vars_unix.go
@@ -0,0 +1,10 @@
+// +build !windows
+
+package main
+
+const (
+ // identifies if test suite is running on a unix platform
+ isUnixCli = true
+
+ expectedFileChmod = "-rw-r--r--"
+)
diff --git a/integration-cli/test_vars_windows.go b/integration-cli/test_vars_windows.go
new file mode 100644
index 0000000000..f81ac53cc3
--- /dev/null
+++ b/integration-cli/test_vars_windows.go
@@ -0,0 +1,11 @@
+// +build windows
+
+package main
+
+const (
+ // identifies if test suite is running on a unix platform
+ isUnixCli = false
+
+ // this is the expected file permission set on windows: gh#11395
+ expectedFileChmod = "-rwxr-xr-x"
+)
diff --git a/integration-cli/utils.go b/integration-cli/utils.go
index f67ee78ca7..85e6f1ccd3 100644
--- a/integration-cli/utils.go
+++ b/integration-cli/utils.go
@@ -3,6 +3,7 @@ package main
import (
"bytes"
"encoding/json"
+ "errors"
"fmt"
"io"
"math/rand"
@@ -10,6 +11,7 @@ import (
"net/http/httptest"
"os"
"os/exec"
+ "path"
"reflect"
"strings"
"syscall"
@@ -40,6 +42,18 @@ func processExitCode(err error) (exitCode int) {
return
}
+func IsKilled(err error) bool {
+ if exitErr, ok := err.(*exec.ExitError); ok {
+ sys := exitErr.ProcessState.Sys()
+ status, ok := sys.(syscall.WaitStatus)
+ if !ok {
+ return false
+ }
+ return status.Signaled() && status.Signal() == os.Kill
+ }
+ return false
+}
+
func runCommandWithOutput(cmd *exec.Cmd) (output string, exitCode int, err error) {
exitCode = 0
out, err := cmd.CombinedOutput()
@@ -63,28 +77,50 @@ func runCommandWithStdoutStderr(cmd *exec.Cmd) (stdout string, stderr string, ex
return
}
-var ErrCmdTimeout = fmt.Errorf("command timed out")
+func runCommandWithOutputForDuration(cmd *exec.Cmd, duration time.Duration) (output string, exitCode int, timedOut bool, err error) {
+ var outputBuffer bytes.Buffer
+ if cmd.Stdout != nil {
+ err = errors.New("cmd.Stdout already set")
+ return
+ }
+ cmd.Stdout = &outputBuffer
+
+ if cmd.Stderr != nil {
+ err = errors.New("cmd.Stderr already set")
+ return
+ }
+ cmd.Stderr = &outputBuffer
-func runCommandWithOutputAndTimeout(cmd *exec.Cmd, timeout time.Duration) (output string, exitCode int, err error) {
done := make(chan error)
go func() {
- output, exitCode, err = runCommandWithOutput(cmd)
- if err != nil || exitCode != 0 {
- done <- fmt.Errorf("failed to run command: %s", err)
- return
- }
- done <- nil
+ exitErr := cmd.Run()
+ exitCode = processExitCode(exitErr)
+ done <- exitErr
}()
+
select {
- case <-time.After(timeout):
- killFailed := cmd.Process.Kill()
- if killFailed == nil {
- fmt.Printf("failed to kill (pid=%d): %v\n", cmd.Process.Pid, err)
+ case <-time.After(duration):
+ killErr := cmd.Process.Kill()
+ if killErr != nil {
+ fmt.Printf("failed to kill (pid=%d): %v\n", cmd.Process.Pid, killErr)
}
- err = ErrCmdTimeout
- case <-done:
+ timedOut = true
+ break
+ case err = <-done:
break
}
+ output = outputBuffer.String()
+ return
+}
+
+var ErrCmdTimeout = fmt.Errorf("command timed out")
+
+func runCommandWithOutputAndTimeout(cmd *exec.Cmd, timeout time.Duration) (output string, exitCode int, err error) {
+ var timedOut bool
+ output, exitCode, timedOut, err = runCommandWithOutputForDuration(cmd, timeout)
+ if timedOut {
+ err = ErrCmdTimeout
+ }
return
}
@@ -95,6 +131,40 @@ func runCommand(cmd *exec.Cmd) (exitCode int, err error) {
return
}
+func runCommandPipelineWithOutput(cmds ...*exec.Cmd) (output string, exitCode int, err error) {
+ if len(cmds) < 2 {
+ return "", 0, errors.New("pipeline does not have multiple cmds")
+ }
+
+ // connect stdin of each cmd to stdout pipe of previous cmd
+ for i, cmd := range cmds {
+ if i > 0 {
+ prevCmd := cmds[i-1]
+ cmd.Stdin, err = prevCmd.StdoutPipe()
+ if err != nil {
+ return "", 0, fmt.Errorf("cannot set stdout pipe for %s: %v", cmd.Path, err)
+ }
+ }
+ }
+
+ // start all cmds except the last
+ for _, cmd := range cmds[:len(cmds)-1] {
+ if err = cmd.Start(); err != nil {
+ return "", 0, fmt.Errorf("starting %s failed with error: %v", cmd.Path, err)
+ }
+ }
+
+ defer func() {
+ // wait all cmds except the last to release their resources
+ for _, cmd := range cmds[:len(cmds)-1] {
+ cmd.Wait()
+ }
+ }()
+
+ // wait on last cmd
+ return runCommandWithOutput(cmds[len(cmds)-1])
+}
+
func logDone(message string) {
fmt.Printf("[PASSED]: %s\n", message)
}
@@ -235,12 +305,19 @@ func makeRandomString(n int) string {
// make a really long string
letters := []byte("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
b := make([]byte, n)
+ r := rand.New(rand.NewSource(time.Now().UTC().UnixNano()))
for i := range b {
- b[i] = letters[rand.Intn(len(letters))]
+ b[i] = letters[r.Intn(len(letters))]
}
return string(b)
}
+// randomUnixTmpDirPath provides a temporary unix path with rand string appended.
+// does not create or checks if it exists.
+func randomUnixTmpDirPath(s string) string {
+ return path.Join("/tmp", fmt.Sprintf("%s.%s", s, makeRandomString(10)))
+}
+
// Reads chunkSize bytes from reader after every interval.
// Returns total read bytes.
func consumeWithSpeed(reader io.Reader, chunkSize int, interval time.Duration, stop chan bool) (n int, err error) {
@@ -263,3 +340,17 @@ func consumeWithSpeed(reader io.Reader, chunkSize int, interval time.Duration, s
}
}
}
+
+// Parses 'procCgroupData', which is output of '/proc/<pid>/cgroup', and returns
+// a map which cgroup name as key and path as value.
+func parseCgroupPaths(procCgroupData string) map[string]string {
+ cgroupPaths := map[string]string{}
+ for _, line := range strings.Split(procCgroupData, "\n") {
+ parts := strings.Split(line, ":")
+ if len(parts) != 3 {
+ continue
+ }
+ cgroupPaths[parts[1]] = parts[2]
+ }
+ return cgroupPaths
+}
diff --git a/integration/MAINTAINERS b/integration/MAINTAINERS
deleted file mode 100644
index ad2d2d2b31..0000000000
--- a/integration/MAINTAINERS
+++ /dev/null
@@ -1,2 +0,0 @@
-Tibor Vass <teabee89@gmail.com> (@tiborvass)
-Cristian Staretu <cristian.staretu@gmail.com> (@unclejack)
diff --git a/integration/api_test.go b/integration/api_test.go
index ab2c3070b4..e978c311bf 100644
--- a/integration/api_test.go
+++ b/integration/api_test.go
@@ -16,6 +16,7 @@ import (
"github.com/docker/docker/api"
"github.com/docker/docker/api/server"
+ "github.com/docker/docker/builder"
"github.com/docker/docker/engine"
"github.com/docker/docker/runconfig"
"github.com/docker/docker/vendor/src/code.google.com/p/go/src/pkg/archive/tar"
@@ -158,6 +159,8 @@ func TestGetContainersTop(t *testing.T) {
func TestPostCommit(t *testing.T) {
eng := NewTestEngine(t)
+ b := &builder.BuilderJob{Engine: eng}
+ b.Install()
defer mkDaemonFromEngine(eng, t).Nuke()
// Create a container and remove a file
@@ -325,7 +328,7 @@ func TestPostCreateNull(t *testing.T) {
containerAssertExists(eng, containerID, t)
- c := daemon.Get(containerID)
+ c, _ := daemon.Get(containerID)
if c.Config.Cpuset != "" {
t.Fatalf("Cpuset should have been empty - instead its:" + c.Config.Cpuset)
}
diff --git a/integration/commands_test.go b/integration/commands_test.go
index 9559884e9c..6c6ad0e71b 100644
--- a/integration/commands_test.go
+++ b/integration/commands_test.go
@@ -12,8 +12,8 @@ import (
log "github.com/Sirupsen/logrus"
"github.com/docker/docker/api/client"
"github.com/docker/docker/daemon"
+ "github.com/docker/docker/pkg/common"
"github.com/docker/docker/pkg/term"
- "github.com/docker/docker/utils"
"github.com/kr/pty"
)
@@ -286,7 +286,7 @@ func TestAttachDetachTruncatedID(t *testing.T) {
ch := make(chan struct{})
go func() {
defer close(ch)
- if err := cli.CmdAttach(utils.TruncateID(container.ID)); err != nil {
+ if err := cli.CmdAttach(common.TruncateID(container.ID)); err != nil {
if err != io.ErrClosedPipe {
t.Fatal(err)
}
diff --git a/integration/container_test.go b/integration/container_test.go
index 5de4bcc6f4..b6cbfd0961 100644
--- a/integration/container_test.go
+++ b/integration/container_test.go
@@ -24,7 +24,7 @@ func TestRestartStdin(t *testing.T) {
if err != nil {
t.Fatal(err)
}
- defer daemon.Destroy(container)
+ defer daemon.Rm(container)
stdin := container.StdinPipe()
stdout := container.StdoutPipe()
@@ -89,7 +89,7 @@ func TestStdin(t *testing.T) {
if err != nil {
t.Fatal(err)
}
- defer daemon.Destroy(container)
+ defer daemon.Rm(container)
stdin := container.StdinPipe()
stdout := container.StdoutPipe()
@@ -129,7 +129,7 @@ func TestTty(t *testing.T) {
if err != nil {
t.Fatal(err)
}
- defer daemon.Destroy(container)
+ defer daemon.Rm(container)
stdin := container.StdinPipe()
stdout := container.StdoutPipe()
@@ -168,7 +168,7 @@ func BenchmarkRunSequential(b *testing.B) {
if err != nil {
b.Fatal(err)
}
- defer daemon.Destroy(container)
+ defer daemon.Rm(container)
output, err := container.Output()
if err != nil {
b.Fatal(err)
@@ -176,7 +176,7 @@ func BenchmarkRunSequential(b *testing.B) {
if string(output) != "foo" {
b.Fatalf("Unexpected output: %s", output)
}
- if err := daemon.Destroy(container); err != nil {
+ if err := daemon.Rm(container); err != nil {
b.Fatal(err)
}
}
@@ -203,7 +203,7 @@ func BenchmarkRunParallel(b *testing.B) {
complete <- err
return
}
- defer daemon.Destroy(container)
+ defer daemon.Rm(container)
if err := container.Start(); err != nil {
complete <- err
return
@@ -215,7 +215,7 @@ func BenchmarkRunParallel(b *testing.B) {
// if string(output) != "foo" {
// complete <- fmt.Errorf("Unexecpted output: %v", string(output))
// }
- if err := daemon.Destroy(container); err != nil {
+ if err := daemon.Rm(container); err != nil {
complete <- err
return
}
diff --git a/integration/graph_test.go b/integration/graph_test.go
index 56e5a90642..8518fae8ee 100644
--- a/integration/graph_test.go
+++ b/integration/graph_test.go
@@ -2,11 +2,12 @@ package docker
import (
"errors"
+ "github.com/docker/docker/autogen/dockerversion"
"github.com/docker/docker/daemon/graphdriver"
- "github.com/docker/docker/dockerversion"
"github.com/docker/docker/graph"
"github.com/docker/docker/image"
"github.com/docker/docker/pkg/archive"
+ "github.com/docker/docker/pkg/common"
"github.com/docker/docker/utils"
"io"
"io/ioutil"
@@ -69,7 +70,7 @@ func TestInterruptedRegister(t *testing.T) {
defer nukeGraph(graph)
badArchive, w := io.Pipe() // Use a pipe reader as a fake archive which never yields data
image := &image.Image{
- ID: utils.GenerateRandomID(),
+ ID: common.GenerateRandomID(),
Comment: "testing",
Created: time.Now(),
}
@@ -129,7 +130,7 @@ func TestRegister(t *testing.T) {
t.Fatal(err)
}
image := &image.Image{
- ID: utils.GenerateRandomID(),
+ ID: common.GenerateRandomID(),
Comment: "testing",
Created: time.Now(),
}
@@ -159,7 +160,7 @@ func TestDeletePrefix(t *testing.T) {
graph, _ := tempGraph(t)
defer nukeGraph(graph)
img := createTestImage(graph, t)
- if err := graph.Delete(utils.TruncateID(img.ID)); err != nil {
+ if err := graph.Delete(common.TruncateID(img.ID)); err != nil {
t.Fatal(err)
}
assertNImages(graph, t, 0)
@@ -245,19 +246,19 @@ func TestByParent(t *testing.T) {
graph, _ := tempGraph(t)
defer nukeGraph(graph)
parentImage := &image.Image{
- ID: utils.GenerateRandomID(),
+ ID: common.GenerateRandomID(),
Comment: "parent",
Created: time.Now(),
Parent: "",
}
childImage1 := &image.Image{
- ID: utils.GenerateRandomID(),
+ ID: common.GenerateRandomID(),
Comment: "child1",
Created: time.Now(),
Parent: parentImage.ID,
}
childImage2 := &image.Image{
- ID: utils.GenerateRandomID(),
+ ID: common.GenerateRandomID(),
Comment: "child2",
Created: time.Now(),
Parent: parentImage.ID,
diff --git a/integration/runtime_test.go b/integration/runtime_test.go
index a436995fd3..153c385627 100644
--- a/integration/runtime_test.go
+++ b/integration/runtime_test.go
@@ -22,6 +22,7 @@ import (
"github.com/docker/docker/engine"
"github.com/docker/docker/image"
"github.com/docker/docker/nat"
+ "github.com/docker/docker/pkg/common"
"github.com/docker/docker/pkg/ioutils"
"github.com/docker/docker/pkg/reexec"
"github.com/docker/docker/runconfig"
@@ -62,7 +63,7 @@ func cleanup(eng *engine.Engine, t *testing.T) error {
daemon := mkDaemonFromEngine(eng, t)
for _, container := range daemon.List() {
container.Kill()
- daemon.Destroy(container)
+ daemon.Rm(container)
}
job := eng.Job("images")
images, err := job.Stdout.AddTable()
@@ -266,7 +267,7 @@ func TestDaemonCreate(t *testing.T) {
}
defer func() {
- if err := daemon.Destroy(container); err != nil {
+ if err := daemon.Rm(container); err != nil {
t.Error(err)
}
}()
@@ -282,12 +283,12 @@ func TestDaemonCreate(t *testing.T) {
}
// Make sure we can get the container with Get()
- if daemon.Get(container.ID) == nil {
+ if _, err := daemon.Get(container.ID); err != nil {
t.Errorf("Unable to get newly created container")
}
// Make sure it is the right container
- if daemon.Get(container.ID) != container {
+ if c, _ := daemon.Get(container.ID); c != container {
t.Errorf("Get() returned the wrong container")
}
@@ -305,8 +306,8 @@ func TestDaemonCreate(t *testing.T) {
&runconfig.HostConfig{},
"conflictname",
)
- if _, _, err := daemon.Create(&runconfig.Config{Image: GetTestImage(daemon).ID, Cmd: []string{"ls", "-al"}}, &runconfig.HostConfig{}, testContainer.Name); err == nil || !strings.Contains(err.Error(), utils.TruncateID(testContainer.ID)) {
- t.Fatalf("Name conflict error doesn't include the correct short id. Message was: %s", err.Error())
+ if _, _, err := daemon.Create(&runconfig.Config{Image: GetTestImage(daemon).ID, Cmd: []string{"ls", "-al"}}, &runconfig.HostConfig{}, testContainer.Name); err == nil || !strings.Contains(err.Error(), common.TruncateID(testContainer.ID)) {
+ t.Fatalf("Name conflict error doesn't include the correct short id. Message was: %v", err)
}
// Make sure create with bad parameters returns an error
@@ -368,7 +369,7 @@ func TestDestroy(t *testing.T) {
t.Fatal(err)
}
// Destroy
- if err := daemon.Destroy(container); err != nil {
+ if err := daemon.Rm(container); err != nil {
t.Error(err)
}
@@ -383,12 +384,12 @@ func TestDestroy(t *testing.T) {
}
// Make sure daemon.Get() refuses to return the unexisting container
- if daemon.Get(container.ID) != nil {
- t.Errorf("Unable to get newly created container")
+ if c, _ := daemon.Get(container.ID); c != nil {
+ t.Errorf("Got a container that should not exist")
}
// Test double destroy
- if err := daemon.Destroy(container); err == nil {
+ if err := daemon.Rm(container); err == nil {
// It should have failed
t.Errorf("Double destroy did not fail")
}
@@ -399,24 +400,24 @@ func TestGet(t *testing.T) {
defer nuke(daemon)
container1, _, _ := mkContainer(daemon, []string{"_", "ls", "-al"}, t)
- defer daemon.Destroy(container1)
+ defer daemon.Rm(container1)
container2, _, _ := mkContainer(daemon, []string{"_", "ls", "-al"}, t)
- defer daemon.Destroy(container2)
+ defer daemon.Rm(container2)
container3, _, _ := mkContainer(daemon, []string{"_", "ls", "-al"}, t)
- defer daemon.Destroy(container3)
+ defer daemon.Rm(container3)
- if daemon.Get(container1.ID) != container1 {
- t.Errorf("Get(test1) returned %v while expecting %v", daemon.Get(container1.ID), container1)
+ if c, _ := daemon.Get(container1.ID); c != container1 {
+ t.Errorf("Get(test1) returned %v while expecting %v", c, container1)
}
- if daemon.Get(container2.ID) != container2 {
- t.Errorf("Get(test2) returned %v while expecting %v", daemon.Get(container2.ID), container2)
+ if c, _ := daemon.Get(container2.ID); c != container2 {
+ t.Errorf("Get(test2) returned %v while expecting %v", c, container2)
}
- if daemon.Get(container3.ID) != container3 {
- t.Errorf("Get(test3) returned %v while expecting %v", daemon.Get(container3.ID), container3)
+ if c, _ := daemon.Get(container3.ID); c != container3 {
+ t.Errorf("Get(test3) returned %v while expecting %v", c, container3)
}
}
@@ -485,9 +486,9 @@ func startEchoServerContainer(t *testing.T, proto string) (*daemon.Daemon, *daem
t.Fatal(err)
}
- container := daemon.Get(id)
- if container == nil {
- t.Fatalf("Couldn't fetch test container %s", id)
+ container, err := daemon.Get(id)
+ if err != nil {
+ t.Fatal(err)
}
setTimeout(t, "Waiting for the container to be started timed out", 2*time.Second, func() {
@@ -594,11 +595,11 @@ func TestRestore(t *testing.T) {
defer daemon1.Nuke()
// Create a container with one instance of docker
container1, _, _ := mkContainer(daemon1, []string{"_", "ls", "-al"}, t)
- defer daemon1.Destroy(container1)
+ defer daemon1.Rm(container1)
// Create a second container meant to be killed
container2, _, _ := mkContainer(daemon1, []string{"-i", "_", "/bin/cat"}, t)
- defer daemon1.Destroy(container2)
+ defer daemon1.Rm(container2)
// Start the container non blocking
if err := container2.Start(); err != nil {
@@ -646,8 +647,8 @@ func TestRestore(t *testing.T) {
if runningCount != 0 {
t.Fatalf("Expected 0 container alive, %d found", runningCount)
}
- container3 := daemon2.Get(container1.ID)
- if container3 == nil {
+ container3, err := daemon2.Get(container1.ID)
+ if err != nil {
t.Fatal("Unable to Get container")
}
if err := container3.Run(); err != nil {
@@ -666,16 +667,21 @@ func TestDefaultContainerName(t *testing.T) {
t.Fatal(err)
}
- container := daemon.Get(createNamedTestContainer(eng, config, t, "some_name"))
+ container, err := daemon.Get(createNamedTestContainer(eng, config, t, "some_name"))
+ if err != nil {
+ t.Fatal(err)
+ }
containerID := container.ID
if container.Name != "/some_name" {
t.Fatalf("Expect /some_name got %s", container.Name)
}
- if c := daemon.Get("/some_name"); c == nil {
+ c, err := daemon.Get("/some_name")
+ if err != nil {
t.Fatalf("Couldn't retrieve test container as /some_name")
- } else if c.ID != containerID {
+ }
+ if c.ID != containerID {
t.Fatalf("Container /some_name has ID %s instead of %s", c.ID, containerID)
}
}
@@ -690,14 +696,17 @@ func TestRandomContainerName(t *testing.T) {
t.Fatal(err)
}
- container := daemon.Get(createTestContainer(eng, config, t))
+ container, err := daemon.Get(createTestContainer(eng, config, t))
+ if err != nil {
+ t.Fatal(err)
+ }
containerID := container.ID
if container.Name == "" {
t.Fatalf("Expected not empty container name")
}
- if c := daemon.Get(container.Name); c == nil {
+ if c, err := daemon.Get(container.Name); err != nil {
log.Fatalf("Could not lookup container %s by its name", container.Name)
} else if c.ID != containerID {
log.Fatalf("Looking up container name %s returned id %s instead of %s", container.Name, c.ID, containerID)
@@ -737,13 +746,16 @@ func TestContainerNameValidation(t *testing.T) {
t.Fatal(err)
}
- container := daemon.Get(engine.Tail(outputBuffer, 1))
+ container, err := daemon.Get(engine.Tail(outputBuffer, 1))
+ if err != nil {
+ t.Fatal(err)
+ }
if container.Name != "/"+test.Name {
t.Fatalf("Expect /%s got %s", test.Name, container.Name)
}
- if c := daemon.Get("/" + test.Name); c == nil {
+ if c, err := daemon.Get("/" + test.Name); err != nil {
t.Fatalf("Couldn't retrieve test container as /%s", test.Name)
} else if c.ID != container.ID {
t.Fatalf("Container /%s has ID %s instead of %s", test.Name, c.ID, container.ID)
@@ -762,7 +774,10 @@ func TestLinkChildContainer(t *testing.T) {
t.Fatal(err)
}
- container := daemon.Get(createNamedTestContainer(eng, config, t, "/webapp"))
+ container, err := daemon.Get(createNamedTestContainer(eng, config, t, "/webapp"))
+ if err != nil {
+ t.Fatal(err)
+ }
webapp, err := daemon.GetByName("/webapp")
if err != nil {
@@ -778,7 +793,10 @@ func TestLinkChildContainer(t *testing.T) {
t.Fatal(err)
}
- childContainer := daemon.Get(createTestContainer(eng, config, t))
+ childContainer, err := daemon.Get(createTestContainer(eng, config, t))
+ if err != nil {
+ t.Fatal(err)
+ }
if err := daemon.RegisterLink(webapp, childContainer, "db"); err != nil {
t.Fatal(err)
@@ -804,7 +822,10 @@ func TestGetAllChildren(t *testing.T) {
t.Fatal(err)
}
- container := daemon.Get(createNamedTestContainer(eng, config, t, "/webapp"))
+ container, err := daemon.Get(createNamedTestContainer(eng, config, t, "/webapp"))
+ if err != nil {
+ t.Fatal(err)
+ }
webapp, err := daemon.GetByName("/webapp")
if err != nil {
@@ -820,7 +841,10 @@ func TestGetAllChildren(t *testing.T) {
t.Fatal(err)
}
- childContainer := daemon.Get(createTestContainer(eng, config, t))
+ childContainer, err := daemon.Get(createTestContainer(eng, config, t))
+ if err != nil {
+ t.Fatal(err)
+ }
if err := daemon.RegisterLink(webapp, childContainer, "db"); err != nil {
t.Fatal(err)
@@ -863,7 +887,7 @@ func TestDestroyWithInitLayer(t *testing.T) {
t.Fatal(err)
}
// Destroy
- if err := daemon.Destroy(container); err != nil {
+ if err := daemon.Rm(container); err != nil {
t.Fatal(err)
}
diff --git a/integration/server_test.go b/integration/server_test.go
index 1af7bbe22f..6d12ad35ad 100644
--- a/integration/server_test.go
+++ b/integration/server_test.go
@@ -5,6 +5,7 @@ import (
"testing"
"time"
+ "github.com/docker/docker/builder"
"github.com/docker/docker/engine"
)
@@ -22,6 +23,8 @@ func TestCreateNumberHostname(t *testing.T) {
func TestCommit(t *testing.T) {
eng := NewTestEngine(t)
+ b := &builder.BuilderJob{Engine: eng}
+ b.Install()
defer mkDaemonFromEngine(eng, t).Nuke()
config, _, _, err := parseRun([]string{unitTestImageID, "/bin/cat"})
@@ -42,11 +45,13 @@ func TestCommit(t *testing.T) {
func TestMergeConfigOnCommit(t *testing.T) {
eng := NewTestEngine(t)
+ b := &builder.BuilderJob{Engine: eng}
+ b.Install()
runtime := mkDaemonFromEngine(eng, t)
defer runtime.Nuke()
container1, _, _ := mkContainer(runtime, []string{"-e", "FOO=bar", unitTestImageID, "echo test > /tmp/foo"}, t)
- defer runtime.Destroy(container1)
+ defer runtime.Rm(container1)
config, _, _, err := parseRun([]string{container1.ID, "cat /tmp/foo"})
if err != nil {
@@ -64,7 +69,7 @@ func TestMergeConfigOnCommit(t *testing.T) {
}
container2, _, _ := mkContainer(runtime, []string{engine.Tail(outputBuffer, 1)}, t)
- defer runtime.Destroy(container2)
+ defer runtime.Rm(container2)
job = eng.Job("container_inspect", container1.Name)
baseContainer, _ := job.Stdout.AddEnv()
diff --git a/integration/utils_test.go b/integration/utils_test.go
index 32ca8e0d62..2e90e4f515 100644
--- a/integration/utils_test.go
+++ b/integration/utils_test.go
@@ -117,7 +117,7 @@ func containerAssertExists(eng *engine.Engine, id string, t Fataler) {
func containerAssertNotExists(eng *engine.Engine, id string, t Fataler) {
daemon := mkDaemonFromEngine(eng, t)
- if c := daemon.Get(id); c != nil {
+ if c, _ := daemon.Get(id); c != nil {
t.Fatal(fmt.Errorf("Container %s should not exist", id))
}
}
@@ -142,9 +142,9 @@ func assertHttpError(r *httptest.ResponseRecorder, t Fataler) {
func getContainer(eng *engine.Engine, id string, t Fataler) *daemon.Container {
daemon := mkDaemonFromEngine(eng, t)
- c := daemon.Get(id)
- if c == nil {
- t.Fatal(fmt.Errorf("No such container: %s", id))
+ c, err := daemon.Get(id)
+ if err != nil {
+ t.Fatal(err)
}
return c
}
@@ -191,6 +191,7 @@ func newTestEngine(t Fataler, autorestart bool, root string) *engine.Engine {
// otherwise NewDaemon will fail because of conflicting settings.
InterContainerCommunication: true,
TrustKeyPath: filepath.Join(root, "key.json"),
+ LogConfig: runconfig.LogConfig{Type: "json-file"},
}
d, err := daemon.NewDaemon(cfg, eng)
if err != nil {
@@ -293,7 +294,7 @@ func runContainer(eng *engine.Engine, r *daemon.Daemon, args []string, t *testin
if err != nil {
return "", err
}
- defer r.Destroy(container)
+ defer r.Rm(container)
stdout := container.StdoutPipe()
defer stdout.Close()
diff --git a/nat/nat.go b/nat/nat.go
index 8f2e90e668..fdecf3f9d1 100644
--- a/nat/nat.go
+++ b/nat/nat.go
@@ -140,7 +140,7 @@ func ParsePortSpecs(ports []string) (map[Port]struct{}, map[Port][]PortBinding,
return nil, nil, fmt.Errorf("Invalid ranges specified for container and host Ports: %s and %s", containerPort, hostPort)
}
- if !validateProto(proto) {
+ if !validateProto(strings.ToLower(proto)) {
return nil, nil, fmt.Errorf("Invalid proto: %s", proto)
}
@@ -149,7 +149,7 @@ func ParsePortSpecs(ports []string) (map[Port]struct{}, map[Port][]PortBinding,
if len(hostPort) > 0 {
hostPort = strconv.FormatUint(startHostPort+i, 10)
}
- port := NewPort(proto, containerPort)
+ port := NewPort(strings.ToLower(proto), containerPort)
if _, exists := exposedPorts[port]; !exists {
exposedPorts[port] = struct{}{}
}
diff --git a/opts/opts.go b/opts/opts.go
index 7f40193412..e867c0a21d 100644
--- a/opts/opts.go
+++ b/opts/opts.go
@@ -11,6 +11,7 @@ import (
"github.com/docker/docker/api"
flag "github.com/docker/docker/pkg/mflag"
"github.com/docker/docker/pkg/parsers"
+ "github.com/docker/docker/pkg/ulimit"
"github.com/docker/docker/utils"
)
@@ -43,6 +44,10 @@ func LabelListVar(values *[]string, names []string, usage string) {
flag.Var(newListOptsRef(values, ValidateLabel), names, usage)
}
+func UlimitMapVar(values map[string]*ulimit.Ulimit, names []string, usage string) {
+ flag.Var(NewUlimitOpt(values), names, usage)
+}
+
// ListOpts type
type ListOpts struct {
values *[]string
@@ -183,6 +188,15 @@ func ValidateIPAddress(val string) (string, error) {
return "", fmt.Errorf("%s is not an ip address", val)
}
+func ValidateMACAddress(val string) (string, error) {
+ _, err := net.ParseMAC(strings.TrimSpace(val))
+ if err != nil {
+ return "", err
+ } else {
+ return val, nil
+ }
+}
+
// Validates domain for resolvconf search configuration.
// A zero length domain is represented by .
func ValidateDnsSearch(val string) (string, error) {
@@ -197,19 +211,20 @@ func validateDomain(val string) (string, error) {
return "", fmt.Errorf("%s is not a valid domain", val)
}
ns := domainRegexp.FindSubmatch([]byte(val))
- if len(ns) > 0 {
+ if len(ns) > 0 && len(ns[1]) < 255 {
return string(ns[1]), nil
}
return "", fmt.Errorf("%s is not a valid domain", val)
}
func ValidateExtraHost(val string) (string, error) {
- arr := strings.Split(val, ":")
+ // allow for IPv6 addresses in extra hosts by only splitting on first ":"
+ arr := strings.SplitN(val, ":", 2)
if len(arr) != 2 || len(arr[0]) == 0 {
- return "", fmt.Errorf("bad format for add-host: %s", val)
+ return "", fmt.Errorf("bad format for add-host: %q", val)
}
if _, err := ValidateIPAddress(arr[1]); err != nil {
- return "", fmt.Errorf("bad format for add-host: %s", val)
+ return "", fmt.Errorf("invalid IP address in add-host: %q", arr[1])
}
return val, nil
}
diff --git a/opts/opts_test.go b/opts/opts_test.go
index e813c44326..8370926da5 100644
--- a/opts/opts_test.go
+++ b/opts/opts_test.go
@@ -1,6 +1,7 @@
package opts
import (
+ "strings"
"testing"
)
@@ -27,6 +28,20 @@ func TestValidateIPAddress(t *testing.T) {
}
+func TestValidateMACAddress(t *testing.T) {
+ if _, err := ValidateMACAddress(`92:d0:c6:0a:29:33`); err != nil {
+ t.Fatalf("ValidateMACAddress(`92:d0:c6:0a:29:33`) got %s", err)
+ }
+
+ if _, err := ValidateMACAddress(`92:d0:c6:0a:33`); err == nil {
+ t.Fatalf("ValidateMACAddress(`92:d0:c6:0a:33`) succeeded; expected failure on invalid MAC")
+ }
+
+ if _, err := ValidateMACAddress(`random invalid string`); err == nil {
+ t.Fatalf("ValidateMACAddress(`random invalid string`) succeeded; expected failure on invalid MAC")
+ }
+}
+
func TestListOpts(t *testing.T) {
o := NewListOpts(nil)
o.Set("foo")
@@ -90,6 +105,7 @@ func TestValidateDnsSearch(t *testing.T) {
`foo.bar-.baz`,
`foo.-bar`,
`foo.-bar.baz`,
+ `foo.bar.baz.this.should.fail.on.long.name.beause.it.is.longer.thanisshouldbethis.should.fail.on.long.name.beause.it.is.longer.thanisshouldbethis.should.fail.on.long.name.beause.it.is.longer.thanisshouldbethis.should.fail.on.long.name.beause.it.is.longer.thanisshouldbe`,
}
for _, domain := range valid {
@@ -104,3 +120,35 @@ func TestValidateDnsSearch(t *testing.T) {
}
}
}
+
+func TestValidateExtraHosts(t *testing.T) {
+ valid := []string{
+ `myhost:192.168.0.1`,
+ `thathost:10.0.2.1`,
+ `anipv6host:2003:ab34:e::1`,
+ `ipv6local:::1`,
+ }
+
+ invalid := map[string]string{
+ `myhost:192.notanipaddress.1`: `invalid IP`,
+ `thathost-nosemicolon10.0.0.1`: `bad format`,
+ `anipv6host:::::1`: `invalid IP`,
+ `ipv6local:::0::`: `invalid IP`,
+ }
+
+ for _, extrahost := range valid {
+ if _, err := ValidateExtraHost(extrahost); err != nil {
+ t.Fatalf("ValidateExtraHost(`"+extrahost+"`) should succeed: error %v", err)
+ }
+ }
+
+ for extraHost, expectedError := range invalid {
+ if _, err := ValidateExtraHost(extraHost); err == nil {
+ t.Fatalf("ValidateExtraHost(`%q`) should have failed validation", extraHost)
+ } else {
+ if !strings.Contains(err.Error(), expectedError) {
+ t.Fatalf("ValidateExtraHost(`%q`) error should contain %q", extraHost, expectedError)
+ }
+ }
+ }
+}
diff --git a/opts/ulimit.go b/opts/ulimit.go
new file mode 100644
index 0000000000..361eadf220
--- /dev/null
+++ b/opts/ulimit.go
@@ -0,0 +1,44 @@
+package opts
+
+import (
+ "fmt"
+
+ "github.com/docker/docker/pkg/ulimit"
+)
+
+type UlimitOpt struct {
+ values map[string]*ulimit.Ulimit
+}
+
+func NewUlimitOpt(ref map[string]*ulimit.Ulimit) *UlimitOpt {
+ return &UlimitOpt{ref}
+}
+
+func (o *UlimitOpt) Set(val string) error {
+ l, err := ulimit.Parse(val)
+ if err != nil {
+ return err
+ }
+
+ o.values[l.Name] = l
+
+ return nil
+}
+
+func (o *UlimitOpt) String() string {
+ var out []string
+ for _, v := range o.values {
+ out = append(out, v.String())
+ }
+
+ return fmt.Sprintf("%v", out)
+}
+
+func (o *UlimitOpt) GetList() []*ulimit.Ulimit {
+ var ulimits []*ulimit.Ulimit
+ for _, v := range o.values {
+ ulimits = append(ulimits, v)
+ }
+
+ return ulimits
+}
diff --git a/pkg/archive/MAINTAINERS b/pkg/archive/MAINTAINERS
deleted file mode 100644
index 2aac7265d2..0000000000
--- a/pkg/archive/MAINTAINERS
+++ /dev/null
@@ -1,2 +0,0 @@
-Cristian Staretu <cristian.staretu@gmail.com> (@unclejack)
-Tibor Vass <teabee89@gmail.com> (@tiborvass)
diff --git a/pkg/archive/archive.go b/pkg/archive/archive.go
index 68e5c1d300..bfa6e18462 100644
--- a/pkg/archive/archive.go
+++ b/pkg/archive/archive.go
@@ -172,6 +172,21 @@ type tarAppender struct {
SeenFiles map[uint64]string
}
+// canonicalTarName provides a platform-independent and consistent posix-style
+//path for files and directories to be archived regardless of the platform.
+func canonicalTarName(name string, isDir bool) (string, error) {
+ name, err := CanonicalTarNameForPath(name)
+ if err != nil {
+ return "", err
+ }
+
+ // suffix with '/' for directories
+ if isDir && !strings.HasSuffix(name, "/") {
+ name += "/"
+ }
+ return name, nil
+}
+
func (ta *tarAppender) addTarFile(path, name string) error {
fi, err := os.Lstat(path)
if err != nil {
@@ -189,11 +204,12 @@ func (ta *tarAppender) addTarFile(path, name string) error {
if err != nil {
return err
}
+ hdr.Mode = int64(chmodTarEntry(os.FileMode(hdr.Mode)))
- if fi.IsDir() && !strings.HasSuffix(name, "/") {
- name = name + "/"
+ name, err = canonicalTarName(name, fi.IsDir())
+ if err != nil {
+ return fmt.Errorf("tar: cannot canonicalize path: %v", err)
}
-
hdr.Name = name
nlink, inode, err := setHeaderForSpecialDevice(hdr, ta, name, fi.Sys())
@@ -458,7 +474,7 @@ func TarWithOptions(srcPath string, options *TarOptions) (io.ReadCloser, error)
}
if err := ta.addTarFile(filePath, relFilePath); err != nil {
- log.Debugf("Can't add file %s to tar: %s", srcPath, err)
+ log.Debugf("Can't add file %s to tar: %s", filePath, err)
}
return nil
})
@@ -525,7 +541,7 @@ loop:
if err != nil {
return err
}
- if strings.HasPrefix(rel, "..") {
+ if strings.HasPrefix(rel, "../") {
return breakoutError(fmt.Errorf("%q is outside of %q", hdr.Name, dest))
}
@@ -681,6 +697,8 @@ func (archiver *Archiver) CopyFileWithTar(src, dst string) (err error) {
return err
}
hdr.Name = filepath.Base(dst)
+ hdr.Mode = int64(chmodTarEntry(os.FileMode(hdr.Mode)))
+
tw := tar.NewWriter(w)
defer tw.Close()
if err := tw.WriteHeader(hdr); err != nil {
diff --git a/pkg/archive/archive_unix.go b/pkg/archive/archive_unix.go
index c0e8aee93c..cbce65e31d 100644
--- a/pkg/archive/archive_unix.go
+++ b/pkg/archive/archive_unix.go
@@ -4,11 +4,26 @@ package archive
import (
"errors"
+ "os"
"syscall"
"github.com/docker/docker/vendor/src/code.google.com/p/go/src/pkg/archive/tar"
)
+// canonicalTarNameForPath returns platform-specific filepath
+// to canonical posix-style path for tar archival. p is relative
+// path.
+func CanonicalTarNameForPath(p string) (string, error) {
+ return p, nil // already unix-style
+}
+
+// chmodTarEntry is used to adjust the file permissions used in tar header based
+// on the platform the archival is done.
+
+func chmodTarEntry(perm os.FileMode) os.FileMode {
+ return perm // noop for unix as golang APIs provide perm bits correctly
+}
+
func setHeaderForSpecialDevice(hdr *tar.Header, ta *tarAppender, name string, stat interface{}) (nlink uint32, inode uint64, err error) {
s, ok := stat.(*syscall.Stat_t)
diff --git a/pkg/archive/archive_unix_test.go b/pkg/archive/archive_unix_test.go
new file mode 100644
index 0000000000..18f45c480f
--- /dev/null
+++ b/pkg/archive/archive_unix_test.go
@@ -0,0 +1,60 @@
+// +build !windows
+
+package archive
+
+import (
+ "os"
+ "testing"
+)
+
+func TestCanonicalTarNameForPath(t *testing.T) {
+ cases := []struct{ in, expected string }{
+ {"foo", "foo"},
+ {"foo/bar", "foo/bar"},
+ {"foo/dir/", "foo/dir/"},
+ }
+ for _, v := range cases {
+ if out, err := CanonicalTarNameForPath(v.in); err != nil {
+ t.Fatalf("cannot get canonical name for path: %s: %v", v.in, err)
+ } else if out != v.expected {
+ t.Fatalf("wrong canonical tar name. expected:%s got:%s", v.expected, out)
+ }
+ }
+}
+
+func TestCanonicalTarName(t *testing.T) {
+ cases := []struct {
+ in string
+ isDir bool
+ expected string
+ }{
+ {"foo", false, "foo"},
+ {"foo", true, "foo/"},
+ {"foo/bar", false, "foo/bar"},
+ {"foo/bar", true, "foo/bar/"},
+ }
+ for _, v := range cases {
+ if out, err := canonicalTarName(v.in, v.isDir); err != nil {
+ t.Fatalf("cannot get canonical name for path: %s: %v", v.in, err)
+ } else if out != v.expected {
+ t.Fatalf("wrong canonical tar name. expected:%s got:%s", v.expected, out)
+ }
+ }
+}
+
+func TestChmodTarEntry(t *testing.T) {
+ cases := []struct {
+ in, expected os.FileMode
+ }{
+ {0000, 0000},
+ {0777, 0777},
+ {0644, 0644},
+ {0755, 0755},
+ {0444, 0444},
+ }
+ for _, v := range cases {
+ if out := chmodTarEntry(v.in); out != v.expected {
+ t.Fatalf("wrong chmod. expected:%v got:%v", v.expected, out)
+ }
+ }
+}
diff --git a/pkg/archive/archive_windows.go b/pkg/archive/archive_windows.go
index 3cc2493f6f..6caef3b735 100644
--- a/pkg/archive/archive_windows.go
+++ b/pkg/archive/archive_windows.go
@@ -3,9 +3,38 @@
package archive
import (
+ "fmt"
+ "os"
+ "strings"
+
"github.com/docker/docker/vendor/src/code.google.com/p/go/src/pkg/archive/tar"
)
+// canonicalTarNameForPath returns platform-specific filepath
+// to canonical posix-style path for tar archival. p is relative
+// path.
+func CanonicalTarNameForPath(p string) (string, error) {
+ // windows: convert windows style relative path with backslashes
+ // into forward slashes. since windows does not allow '/' or '\'
+ // in file names, it is mostly safe to replace however we must
+ // check just in case
+ if strings.Contains(p, "/") {
+ return "", fmt.Errorf("windows path contains forward slash: %s", p)
+ }
+ return strings.Replace(p, string(os.PathSeparator), "/", -1), nil
+
+}
+
+// chmodTarEntry is used to adjust the file permissions used in tar header based
+// on the platform the archival is done.
+func chmodTarEntry(perm os.FileMode) os.FileMode {
+ perm &= 0755
+ // Add the x bit: make everything +x from windows
+ perm |= 0111
+
+ return perm
+}
+
func setHeaderForSpecialDevice(hdr *tar.Header, ta *tarAppender, name string, stat interface{}) (nlink uint32, inode uint64, err error) {
// do nothing. no notion of Rdev, Inode, Nlink in stat on Windows
return
diff --git a/pkg/archive/archive_windows_test.go b/pkg/archive/archive_windows_test.go
new file mode 100644
index 0000000000..b33e0fb005
--- /dev/null
+++ b/pkg/archive/archive_windows_test.go
@@ -0,0 +1,65 @@
+// +build windows
+
+package archive
+
+import (
+ "os"
+ "testing"
+)
+
+func TestCanonicalTarNameForPath(t *testing.T) {
+ cases := []struct {
+ in, expected string
+ shouldFail bool
+ }{
+ {"foo", "foo", false},
+ {"foo/bar", "___", true}, // unix-styled windows path must fail
+ {`foo\bar`, "foo/bar", false},
+ }
+ for _, v := range cases {
+ if out, err := CanonicalTarNameForPath(v.in); err != nil && !v.shouldFail {
+ t.Fatalf("cannot get canonical name for path: %s: %v", v.in, err)
+ } else if v.shouldFail && err == nil {
+ t.Fatalf("canonical path call should have pailed with error. in=%s out=%s", v.in, out)
+ } else if !v.shouldFail && out != v.expected {
+ t.Fatalf("wrong canonical tar name. expected:%s got:%s", v.expected, out)
+ }
+ }
+}
+
+func TestCanonicalTarName(t *testing.T) {
+ cases := []struct {
+ in string
+ isDir bool
+ expected string
+ }{
+ {"foo", false, "foo"},
+ {"foo", true, "foo/"},
+ {`foo\bar`, false, "foo/bar"},
+ {`foo\bar`, true, "foo/bar/"},
+ }
+ for _, v := range cases {
+ if out, err := canonicalTarName(v.in, v.isDir); err != nil {
+ t.Fatalf("cannot get canonical name for path: %s: %v", v.in, err)
+ } else if out != v.expected {
+ t.Fatalf("wrong canonical tar name. expected:%s got:%s", v.expected, out)
+ }
+ }
+}
+
+func TestChmodTarEntry(t *testing.T) {
+ cases := []struct {
+ in, expected os.FileMode
+ }{
+ {0000, 0111},
+ {0777, 0755},
+ {0644, 0755},
+ {0755, 0755},
+ {0444, 0555},
+ }
+ for _, v := range cases {
+ if out := chmodTarEntry(v.in); out != v.expected {
+ t.Fatalf("wrong chmod. expected:%v got:%v", v.expected, out)
+ }
+ }
+}
diff --git a/pkg/archive/changes.go b/pkg/archive/changes.go
index 85217f6e08..c3cb4ebe0e 100644
--- a/pkg/archive/changes.go
+++ b/pkg/archive/changes.go
@@ -6,6 +6,7 @@ import (
"io"
"os"
"path/filepath"
+ "sort"
"strings"
"syscall"
"time"
@@ -43,6 +44,13 @@ func (change *Change) String() string {
return fmt.Sprintf("%s %s", kind, change.Path)
}
+// for sort.Sort
+type changesByPath []Change
+
+func (c changesByPath) Less(i, j int) bool { return c[i].Path < c[j].Path }
+func (c changesByPath) Len() int { return len(c) }
+func (c changesByPath) Swap(i, j int) { c[j], c[i] = c[i], c[j] }
+
// Gnu tar and the go tar writer don't have sub-second mtime
// precision, which is problematic when we apply changes via tar
// files, we handle this by comparing for exact times, *or* same
@@ -135,7 +143,7 @@ func Changes(layers []string, rw string) ([]Change, error) {
type FileInfo struct {
parent *FileInfo
name string
- stat *system.Stat
+ stat *system.Stat_t
children map[string]*FileInfo
capability []byte
added bool
@@ -212,8 +220,8 @@ func (info *FileInfo) addChanges(oldInfo *FileInfo, changes *[]Change) {
oldStat.Gid() != newStat.Gid() ||
oldStat.Rdev() != newStat.Rdev() ||
// Don't look at size for dirs, its not a good measure of change
- (oldStat.Size() != newStat.Size() && oldStat.Mode()&syscall.S_IFDIR != syscall.S_IFDIR) ||
- !sameFsTimeSpec(oldStat.Mtim(), newStat.Mtim()) ||
+ (oldStat.Mode()&syscall.S_IFDIR != syscall.S_IFDIR &&
+ (!sameFsTimeSpec(oldStat.Mtim(), newStat.Mtim()) || (oldStat.Size() != newStat.Size()))) ||
bytes.Compare(oldChild.capability, newChild.capability) != 0 {
change := Change{
Path: newChild.path(),
@@ -373,6 +381,8 @@ func ExportChanges(dir string, changes []Change) (Archive, error) {
// this buffer is needed for the duration of this piped stream
defer pools.BufioWriter32KPool.Put(ta.Buffer)
+ sort.Sort(changesByPath(changes))
+
// In general we log errors here but ignore them because
// during e.g. a diff operation the container can continue
// mutating the filesystem and we can see transient errors
diff --git a/pkg/archive/changes_posix_test.go b/pkg/archive/changes_posix_test.go
new file mode 100644
index 0000000000..9d528e614c
--- /dev/null
+++ b/pkg/archive/changes_posix_test.go
@@ -0,0 +1,127 @@
+package archive
+
+import (
+ "archive/tar"
+ "fmt"
+ "io"
+ "io/ioutil"
+ "os"
+ "path"
+ "sort"
+ "testing"
+)
+
+func TestHardLinkOrder(t *testing.T) {
+ names := []string{"file1.txt", "file2.txt", "file3.txt"}
+ msg := []byte("Hey y'all")
+
+ // Create dir
+ src, err := ioutil.TempDir("", "docker-hardlink-test-src-")
+ if err != nil {
+ t.Fatal(err)
+ }
+ //defer os.RemoveAll(src)
+ for _, name := range names {
+ func() {
+ fh, err := os.Create(path.Join(src, name))
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer fh.Close()
+ if _, err = fh.Write(msg); err != nil {
+ t.Fatal(err)
+ }
+ }()
+ }
+ // Create dest, with changes that includes hardlinks
+ dest, err := ioutil.TempDir("", "docker-hardlink-test-dest-")
+ if err != nil {
+ t.Fatal(err)
+ }
+ os.RemoveAll(dest) // we just want the name, at first
+ if err := copyDir(src, dest); err != nil {
+ t.Fatal(err)
+ }
+ defer os.RemoveAll(dest)
+ for _, name := range names {
+ for i := 0; i < 5; i++ {
+ if err := os.Link(path.Join(dest, name), path.Join(dest, fmt.Sprintf("%s.link%d", name, i))); err != nil {
+ t.Fatal(err)
+ }
+ }
+ }
+
+ // get changes
+ changes, err := ChangesDirs(dest, src)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // sort
+ sort.Sort(changesByPath(changes))
+
+ // ExportChanges
+ ar, err := ExportChanges(dest, changes)
+ if err != nil {
+ t.Fatal(err)
+ }
+ hdrs, err := walkHeaders(ar)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // reverse sort
+ sort.Sort(sort.Reverse(changesByPath(changes)))
+ // ExportChanges
+ arRev, err := ExportChanges(dest, changes)
+ if err != nil {
+ t.Fatal(err)
+ }
+ hdrsRev, err := walkHeaders(arRev)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // line up the two sets
+ sort.Sort(tarHeaders(hdrs))
+ sort.Sort(tarHeaders(hdrsRev))
+
+ // compare Size and LinkName
+ for i := range hdrs {
+ if hdrs[i].Name != hdrsRev[i].Name {
+ t.Errorf("headers - expected name %q; but got %q", hdrs[i].Name, hdrsRev[i].Name)
+ }
+ if hdrs[i].Size != hdrsRev[i].Size {
+ t.Errorf("headers - %q expected size %d; but got %d", hdrs[i].Name, hdrs[i].Size, hdrsRev[i].Size)
+ }
+ if hdrs[i].Typeflag != hdrsRev[i].Typeflag {
+ t.Errorf("headers - %q expected type %d; but got %d", hdrs[i].Name, hdrs[i].Typeflag, hdrsRev[i].Typeflag)
+ }
+ if hdrs[i].Linkname != hdrsRev[i].Linkname {
+ t.Errorf("headers - %q expected linkname %q; but got %q", hdrs[i].Name, hdrs[i].Linkname, hdrsRev[i].Linkname)
+ }
+ }
+
+}
+
+type tarHeaders []tar.Header
+
+func (th tarHeaders) Len() int { return len(th) }
+func (th tarHeaders) Swap(i, j int) { th[j], th[i] = th[i], th[j] }
+func (th tarHeaders) Less(i, j int) bool { return th[i].Name < th[j].Name }
+
+func walkHeaders(r io.Reader) ([]tar.Header, error) {
+ t := tar.NewReader(r)
+ headers := []tar.Header{}
+ for {
+ hdr, err := t.Next()
+ if err != nil {
+ if err == io.EOF {
+ break
+ }
+ return headers, err
+ }
+ headers = append(headers, *hdr)
+ }
+ return headers, nil
+}
diff --git a/pkg/archive/changes_test.go b/pkg/archive/changes_test.go
index 6b8f2354b8..53ec575b67 100644
--- a/pkg/archive/changes_test.go
+++ b/pkg/archive/changes_test.go
@@ -25,13 +25,6 @@ func copyDir(src, dst string) error {
return nil
}
-// Helper to sort []Change by path
-type byPath struct{ changes []Change }
-
-func (b byPath) Less(i, j int) bool { return b.changes[i].Path < b.changes[j].Path }
-func (b byPath) Len() int { return len(b.changes) }
-func (b byPath) Swap(i, j int) { b.changes[i], b.changes[j] = b.changes[j], b.changes[i] }
-
type FileType uint32
const (
@@ -220,12 +213,11 @@ func TestChangesDirsMutated(t *testing.T) {
t.Fatal(err)
}
- sort.Sort(byPath{changes})
+ sort.Sort(changesByPath(changes))
expectedChanges := []Change{
{"/dir1", ChangeDelete},
{"/dir2", ChangeModify},
- {"/dir3", ChangeModify},
{"/dirnew", ChangeAdd},
{"/file1", ChangeDelete},
{"/file2", ChangeModify},
diff --git a/pkg/archive/diff.go b/pkg/archive/diff.go
index ca282071f5..b5eb63fd44 100644
--- a/pkg/archive/diff.go
+++ b/pkg/archive/diff.go
@@ -81,7 +81,7 @@ func UnpackLayer(dest string, layer ArchiveReader) (size int64, err error) {
if err != nil {
return 0, err
}
- if strings.HasPrefix(rel, "..") {
+ if strings.HasPrefix(rel, "../") {
return 0, breakoutError(fmt.Errorf("%q is outside of %q", hdr.Name, dest))
}
base := filepath.Base(path)
diff --git a/pkg/broadcastwriter/broadcastwriter.go b/pkg/broadcastwriter/broadcastwriter.go
index 232cf3dfc8..9a0b176240 100644
--- a/pkg/broadcastwriter/broadcastwriter.go
+++ b/pkg/broadcastwriter/broadcastwriter.go
@@ -51,7 +51,7 @@ func (w *BroadcastWriter) Write(p []byte) (n int, err error) {
for {
line, err := w.buf.ReadString('\n')
if err != nil {
- w.buf.Write([]byte(line))
+ w.buf.WriteString(line)
break
}
for stream, writers := range w.streams {
diff --git a/pkg/chrootarchive/archive.go b/pkg/chrootarchive/archive.go
index ae15a2a54d..17d3739d1a 100644
--- a/pkg/chrootarchive/archive.go
+++ b/pkg/chrootarchive/archive.go
@@ -1,7 +1,6 @@
package chrootarchive
import (
- "bytes"
"encoding/json"
"flag"
"fmt"
@@ -9,7 +8,6 @@ import (
"os"
"path/filepath"
"runtime"
- "strings"
"syscall"
"github.com/docker/docker/pkg/archive"
@@ -28,11 +26,14 @@ func chroot(path string) error {
func untar() {
runtime.LockOSThread()
flag.Parse()
- if err := chroot(flag.Arg(0)); err != nil {
+
+ var options *archive.TarOptions
+
+ if err := json.Unmarshal([]byte(os.Getenv("OPT")), &options); err != nil {
fatal(err)
}
- var options *archive.TarOptions
- if err := json.NewDecoder(strings.NewReader(flag.Arg(1))).Decode(&options); err != nil {
+
+ if err := chroot(flag.Arg(0)); err != nil {
fatal(err)
}
if err := archive.Unpack(os.Stdin, "/", options); err != nil {
@@ -54,27 +55,32 @@ func Untar(tarArchive io.Reader, dest string, options *archive.TarOptions) error
options.ExcludePatterns = []string{}
}
- var (
- buf bytes.Buffer
- enc = json.NewEncoder(&buf)
- )
- if err := enc.Encode(options); err != nil {
- return fmt.Errorf("Untar json encode: %v", err)
- }
+ dest = filepath.Clean(dest)
if _, err := os.Stat(dest); os.IsNotExist(err) {
if err := os.MkdirAll(dest, 0777); err != nil {
return err
}
}
- dest = filepath.Clean(dest)
+
+ // We can't pass the exclude list directly via cmd line
+ // because we easily overrun the shell max argument list length
+ // when the full image list is passed (e.g. when this is used
+ // by `docker load`). Instead we will add the JSON marshalled
+ // and placed in the env, which has significantly larger
+ // max size
+ data, err := json.Marshal(options)
+ if err != nil {
+ return fmt.Errorf("Untar json encode: %v", err)
+ }
decompressedArchive, err := archive.DecompressStream(tarArchive)
if err != nil {
return err
}
defer decompressedArchive.Close()
- cmd := reexec.Command("docker-untar", dest, buf.String())
+ cmd := reexec.Command("docker-untar", dest)
cmd.Stdin = decompressedArchive
+ cmd.Env = append(cmd.Env, fmt.Sprintf("OPT=%s", data))
out, err := cmd.CombinedOutput()
if err != nil {
return fmt.Errorf("Untar %s %s", err, out)
diff --git a/pkg/chrootarchive/archive_test.go b/pkg/chrootarchive/archive_test.go
index b3f7d57688..fb4c5c4e4f 100644
--- a/pkg/chrootarchive/archive_test.go
+++ b/pkg/chrootarchive/archive_test.go
@@ -99,3 +99,29 @@ func TestChrootApplyEmptyArchiveFromSlowReader(t *testing.T) {
t.Fatal(err)
}
}
+
+func TestChrootApplyDotDotFile(t *testing.T) {
+ tmpdir, err := ioutil.TempDir("", "docker-TestChrootApplyDotDotFile")
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer os.RemoveAll(tmpdir)
+ src := filepath.Join(tmpdir, "src")
+ if err := os.MkdirAll(src, 0700); err != nil {
+ t.Fatal(err)
+ }
+ if err := ioutil.WriteFile(filepath.Join(src, "..gitme"), []byte(""), 0644); err != nil {
+ t.Fatal(err)
+ }
+ stream, err := archive.Tar(src, archive.Uncompressed)
+ if err != nil {
+ t.Fatal(err)
+ }
+ dest := filepath.Join(tmpdir, "dest")
+ if err := os.MkdirAll(dest, 0700); err != nil {
+ t.Fatal(err)
+ }
+ if _, err := ApplyLayer(dest, stream); err != nil {
+ t.Fatal(err)
+ }
+}
diff --git a/pkg/common/randomid.go b/pkg/common/randomid.go
new file mode 100644
index 0000000000..5c6d5920e8
--- /dev/null
+++ b/pkg/common/randomid.go
@@ -0,0 +1,47 @@
+package common
+
+import (
+ "crypto/rand"
+ "encoding/hex"
+ "io"
+ "strconv"
+)
+
+// TruncateID returns a shorthand version of a string identifier for convenience.
+// A collision with other shorthands is very unlikely, but possible.
+// In case of a collision a lookup with TruncIndex.Get() will fail, and the caller
+// will need to use a langer prefix, or the full-length Id.
+func TruncateID(id string) string {
+ shortLen := 12
+ if len(id) < shortLen {
+ shortLen = len(id)
+ }
+ return id[:shortLen]
+}
+
+// GenerateRandomID returns an unique id
+func GenerateRandomID() string {
+ for {
+ id := make([]byte, 32)
+ if _, err := io.ReadFull(rand.Reader, id); err != nil {
+ panic(err) // This shouldn't happen
+ }
+ value := hex.EncodeToString(id)
+ // if we try to parse the truncated for as an int and we don't have
+ // an error then the value is all numberic and causes issues when
+ // used as a hostname. ref #3869
+ if _, err := strconv.ParseInt(TruncateID(value), 10, 64); err == nil {
+ continue
+ }
+ return value
+ }
+}
+
+func RandomString() string {
+ id := make([]byte, 32)
+
+ if _, err := io.ReadFull(rand.Reader, id); err != nil {
+ panic(err) // This shouldn't happen
+ }
+ return hex.EncodeToString(id)
+}
diff --git a/pkg/common/randomid_test.go b/pkg/common/randomid_test.go
new file mode 100644
index 0000000000..1dba41254b
--- /dev/null
+++ b/pkg/common/randomid_test.go
@@ -0,0 +1,59 @@
+package common
+
+import (
+ "testing"
+)
+
+func TestShortenId(t *testing.T) {
+ id := GenerateRandomID()
+ truncID := TruncateID(id)
+ if len(truncID) != 12 {
+ t.Fatalf("Id returned is incorrect: truncate on %s returned %s", id, truncID)
+ }
+}
+
+func TestShortenIdEmpty(t *testing.T) {
+ id := ""
+ truncID := TruncateID(id)
+ if len(truncID) > len(id) {
+ t.Fatalf("Id returned is incorrect: truncate on %s returned %s", id, truncID)
+ }
+}
+
+func TestShortenIdInvalid(t *testing.T) {
+ id := "1234"
+ truncID := TruncateID(id)
+ if len(truncID) != len(id) {
+ t.Fatalf("Id returned is incorrect: truncate on %s returned %s", id, truncID)
+ }
+}
+
+func TestGenerateRandomID(t *testing.T) {
+ id := GenerateRandomID()
+
+ if len(id) != 64 {
+ t.Fatalf("Id returned is incorrect: %s", id)
+ }
+}
+
+func TestRandomString(t *testing.T) {
+ id := RandomString()
+ if len(id) != 64 {
+ t.Fatalf("Id returned is incorrect: %s", id)
+ }
+}
+
+func TestRandomStringUniqueness(t *testing.T) {
+ repeats := 25
+ set := make(map[string]struct{}, repeats)
+ for i := 0; i < repeats; i = i + 1 {
+ id := RandomString()
+ if len(id) != 64 {
+ t.Fatalf("Id returned is incorrect: %s", id)
+ }
+ if _, ok := set[id]; ok {
+ t.Fatalf("Random number is repeated")
+ }
+ set[id] = struct{}{}
+ }
+}
diff --git a/pkg/devicemapper/MAINTAINERS b/pkg/devicemapper/MAINTAINERS
deleted file mode 100644
index 4428dec019..0000000000
--- a/pkg/devicemapper/MAINTAINERS
+++ /dev/null
@@ -1 +0,0 @@
-Vincent Batts <vbatts@redhat.com> (@vbatts)
diff --git a/pkg/devicemapper/devmapper.go b/pkg/devicemapper/devmapper.go
index c0caec510a..f3b55c853f 100644
--- a/pkg/devicemapper/devmapper.go
+++ b/pkg/devicemapper/devmapper.go
@@ -339,6 +339,13 @@ func UdevSetSyncSupport(enable bool) bool {
return UdevSyncSupported()
}
+// CookieSupported returns whether the version of device-mapper supports the
+// use of cookie's in the tasks.
+// This is largely a lower level call that other functions use.
+func CookieSupported() bool {
+ return DmCookieSupported() != 0
+}
+
// Useful helper for cleanup
func RemoveDevice(name string) error {
log.Debugf("[devmapper] RemoveDevice START(%s)", name)
diff --git a/pkg/devicemapper/devmapper_wrapper.go b/pkg/devicemapper/devmapper_wrapper.go
index 63c55d98da..ae4f30fb37 100644
--- a/pkg/devicemapper/devmapper_wrapper.go
+++ b/pkg/devicemapper/devmapper_wrapper.go
@@ -110,6 +110,7 @@ var (
DmUdevWait = dmUdevWaitFct
DmUdevSetSyncSupport = dmUdevSetSyncSupportFct
DmUdevGetSyncSupport = dmUdevGetSyncSupportFct
+ DmCookieSupported = dmCookieSupportedFct
LogWithErrnoInit = logWithErrnoInitFct
)
@@ -246,6 +247,10 @@ func dmUdevWaitFct(cookie uint) int {
return int(C.dm_udev_wait(C.uint32_t(cookie)))
}
+func dmCookieSupportedFct() int {
+ return int(C.dm_cookie_supported())
+}
+
func dmLogInitVerboseFct(level int) {
C.dm_log_init_verbose(C.int(level))
}
diff --git a/pkg/directory/directory_linux.go b/pkg/directory/directory_linux.go
new file mode 100644
index 0000000000..80fb9a8332
--- /dev/null
+++ b/pkg/directory/directory_linux.go
@@ -0,0 +1,39 @@
+// +build linux
+
+package directory
+
+import (
+ "os"
+ "path/filepath"
+ "syscall"
+)
+
+// Size walks a directory tree and returns its total size in bytes.
+func Size(dir string) (size int64, err error) {
+ data := make(map[uint64]struct{})
+ err = filepath.Walk(dir, func(d string, fileInfo os.FileInfo, e error) error {
+ // Ignore directory sizes
+ if fileInfo == nil {
+ return nil
+ }
+
+ s := fileInfo.Size()
+ if fileInfo.IsDir() || s == 0 {
+ return nil
+ }
+
+ // Check inode to handle hard links correctly
+ inode := fileInfo.Sys().(*syscall.Stat_t).Ino
+ // inode is not a uint64 on all platforms. Cast it to avoid issues.
+ if _, exists := data[uint64(inode)]; exists {
+ return nil
+ }
+ // inode is not a uint64 on all platforms. Cast it to avoid issues.
+ data[uint64(inode)] = struct{}{}
+
+ size += s
+
+ return nil
+ })
+ return
+}
diff --git a/pkg/directory/directory_test.go b/pkg/directory/directory_test.go
new file mode 100644
index 0000000000..a8da1ac651
--- /dev/null
+++ b/pkg/directory/directory_test.go
@@ -0,0 +1,137 @@
+package directory
+
+import (
+ "io/ioutil"
+ "os"
+ "testing"
+)
+
+// Size of an empty directory should be 0
+func TestSizeEmpty(t *testing.T) {
+ var dir string
+ var err error
+ if dir, err = ioutil.TempDir(os.TempDir(), "testSizeEmptyDirectory"); err != nil {
+ t.Fatalf("failed to create directory: %s", err)
+ }
+
+ var size int64
+ if size, _ = Size(dir); size != 0 {
+ t.Fatalf("empty directory has size: %d", size)
+ }
+}
+
+// Size of a directory with one empty file should be 0
+func TestSizeEmptyFile(t *testing.T) {
+ var dir string
+ var err error
+ if dir, err = ioutil.TempDir(os.TempDir(), "testSizeEmptyFile"); err != nil {
+ t.Fatalf("failed to create directory: %s", err)
+ }
+
+ var file *os.File
+ if file, err = ioutil.TempFile(dir, "file"); err != nil {
+ t.Fatalf("failed to create file: %s", err)
+ }
+
+ var size int64
+ if size, _ = Size(file.Name()); size != 0 {
+ t.Fatalf("directory with one file has size: %d", size)
+ }
+}
+
+// Size of a directory with one 5-byte file should be 5
+func TestSizeNonemptyFile(t *testing.T) {
+ var dir string
+ var err error
+ if dir, err = ioutil.TempDir(os.TempDir(), "testSizeNonemptyFile"); err != nil {
+ t.Fatalf("failed to create directory: %s", err)
+ }
+
+ var file *os.File
+ if file, err = ioutil.TempFile(dir, "file"); err != nil {
+ t.Fatalf("failed to create file: %s", err)
+ }
+
+ d := []byte{97, 98, 99, 100, 101}
+ file.Write(d)
+
+ var size int64
+ if size, _ = Size(file.Name()); size != 5 {
+ t.Fatalf("directory with one 5-byte file has size: %d", size)
+ }
+}
+
+// Size of a directory with one empty directory should be 0
+func TestSizeNestedDirectoryEmpty(t *testing.T) {
+ var dir string
+ var err error
+ if dir, err = ioutil.TempDir(os.TempDir(), "testSizeNestedDirectoryEmpty"); err != nil {
+ t.Fatalf("failed to create directory: %s", err)
+ }
+ if dir, err = ioutil.TempDir(dir, "nested"); err != nil {
+ t.Fatalf("failed to create nested directory: %s", err)
+ }
+
+ var size int64
+ if size, _ = Size(dir); size != 0 {
+ t.Fatalf("directory with one empty directory has size: %d", size)
+ }
+}
+
+// Test directory with 1 file and 1 empty directory
+func TestSizeFileAndNestedDirectoryEmpty(t *testing.T) {
+ var dir string
+ var err error
+ if dir, err = ioutil.TempDir(os.TempDir(), "testSizeFileAndNestedDirectoryEmpty"); err != nil {
+ t.Fatalf("failed to create directory: %s", err)
+ }
+ if dir, err = ioutil.TempDir(dir, "nested"); err != nil {
+ t.Fatalf("failed to create nested directory: %s", err)
+ }
+
+ var file *os.File
+ if file, err = ioutil.TempFile(dir, "file"); err != nil {
+ t.Fatalf("failed to create file: %s", err)
+ }
+
+ d := []byte{100, 111, 99, 107, 101, 114}
+ file.Write(d)
+
+ var size int64
+ if size, _ = Size(dir); size != 6 {
+ t.Fatalf("directory with 6-byte file and empty directory has size: %d", size)
+ }
+}
+
+// Test directory with 1 file and 1 non-empty directory
+func TestSizeFileAndNestedDirectoryNonempty(t *testing.T) {
+ var dir, dirNested string
+ var err error
+ if dir, err = ioutil.TempDir(os.TempDir(), "TestSizeFileAndNestedDirectoryNonempty"); err != nil {
+ t.Fatalf("failed to create directory: %s", err)
+ }
+ if dirNested, err = ioutil.TempDir(dir, "nested"); err != nil {
+ t.Fatalf("failed to create nested directory: %s", err)
+ }
+
+ var file *os.File
+ if file, err = ioutil.TempFile(dir, "file"); err != nil {
+ t.Fatalf("failed to create file: %s", err)
+ }
+
+ data := []byte{100, 111, 99, 107, 101, 114}
+ file.Write(data)
+
+ var nestedFile *os.File
+ if nestedFile, err = ioutil.TempFile(dirNested, "file"); err != nil {
+ t.Fatalf("failed to create file in nested directory: %s", err)
+ }
+
+ nestedData := []byte{100, 111, 99, 107, 101, 114}
+ nestedFile.Write(nestedData)
+
+ var size int64
+ if size, _ = Size(dir); size != 12 {
+ t.Fatalf("directory with 6-byte file and nested directory with 6-byte file has size: %d", size)
+ }
+}
diff --git a/pkg/directory/directory_windows.go b/pkg/directory/directory_windows.go
new file mode 100644
index 0000000000..7a9f8cb68c
--- /dev/null
+++ b/pkg/directory/directory_windows.go
@@ -0,0 +1,28 @@
+// +build windows
+
+package directory
+
+import (
+ "os"
+ "path/filepath"
+)
+
+// Size walks a directory tree and returns its total size in bytes.
+func Size(dir string) (size int64, err error) {
+ err = filepath.Walk(dir, func(d string, fileInfo os.FileInfo, e error) error {
+ // Ignore directory sizes
+ if fileInfo == nil {
+ return nil
+ }
+
+ s := fileInfo.Size()
+ if fileInfo.IsDir() || s == 0 {
+ return nil
+ }
+
+ size += s
+
+ return nil
+ })
+ return
+}
diff --git a/pkg/graphdb/MAINTAINERS b/pkg/graphdb/MAINTAINERS
deleted file mode 100644
index 1e998f8ac1..0000000000
--- a/pkg/graphdb/MAINTAINERS
+++ /dev/null
@@ -1 +0,0 @@
-Michael Crosby <michael@crosbymichael.com> (@crosbymichael)
diff --git a/pkg/homedir/homedir.go b/pkg/homedir/homedir.go
new file mode 100644
index 0000000000..61137a8f5d
--- /dev/null
+++ b/pkg/homedir/homedir.go
@@ -0,0 +1,39 @@
+package homedir
+
+import (
+ "os"
+ "runtime"
+
+ "github.com/docker/libcontainer/user"
+)
+
+// Key returns the env var name for the user's home dir based on
+// the platform being run on
+func Key() string {
+ if runtime.GOOS == "windows" {
+ return "USERPROFILE"
+ }
+ return "HOME"
+}
+
+// Get returns the home directory of the current user with the help of
+// environment variables depending on the target operating system.
+// Returned path should be used with "path/filepath" to form new paths.
+func Get() string {
+ home := os.Getenv(Key())
+ if home == "" && runtime.GOOS != "windows" {
+ if u, err := user.CurrentUser(); err == nil {
+ return u.Home
+ }
+ }
+ return home
+}
+
+// GetShortcutString returns the string that is shortcut to user's home directory
+// in the native shell of the platform running on.
+func GetShortcutString() string {
+ if runtime.GOOS == "windows" {
+ return "%USERPROFILE%" // be careful while using in format functions
+ }
+ return "~"
+}
diff --git a/pkg/homedir/homedir_test.go b/pkg/homedir/homedir_test.go
new file mode 100644
index 0000000000..7a95cb2bd7
--- /dev/null
+++ b/pkg/homedir/homedir_test.go
@@ -0,0 +1,24 @@
+package homedir
+
+import (
+ "path/filepath"
+ "testing"
+)
+
+func TestGet(t *testing.T) {
+ home := Get()
+ if home == "" {
+ t.Fatal("returned home directory is empty")
+ }
+
+ if !filepath.IsAbs(home) {
+ t.Fatalf("returned path is not absolute: %s", home)
+ }
+}
+
+func TestGetShortcutString(t *testing.T) {
+ shortcut := GetShortcutString()
+ if shortcut == "" {
+ t.Fatal("returned shortcut string is empty")
+ }
+}
diff --git a/pkg/httputils/MAINTAINERS b/pkg/httputils/MAINTAINERS
deleted file mode 100644
index 6dde4769d7..0000000000
--- a/pkg/httputils/MAINTAINERS
+++ /dev/null
@@ -1 +0,0 @@
-Cristian Staretu <cristian.staretu@gmail.com> (@unclejack)
diff --git a/pkg/ioutils/readers.go b/pkg/ioutils/readers.go
index 22f46fbd92..58ff1af639 100644
--- a/pkg/ioutils/readers.go
+++ b/pkg/ioutils/readers.go
@@ -2,8 +2,11 @@ package ioutils
import (
"bytes"
+ "crypto/rand"
"io"
+ "math/big"
"sync"
+ "time"
)
type readCloserWrapper struct {
@@ -42,20 +45,40 @@ func NewReaderErrWrapper(r io.Reader, closer func()) io.Reader {
}
}
+// bufReader allows the underlying reader to continue to produce
+// output by pre-emptively reading from the wrapped reader.
+// This is achieved by buffering this data in bufReader's
+// expanding buffer.
type bufReader struct {
sync.Mutex
- buf *bytes.Buffer
- reader io.Reader
- err error
- wait sync.Cond
- drainBuf []byte
+ buf *bytes.Buffer
+ reader io.Reader
+ err error
+ wait sync.Cond
+ drainBuf []byte
+ reuseBuf []byte
+ maxReuse int64
+ resetTimeout time.Duration
+ bufLenResetThreshold int64
+ maxReadDataReset int64
}
func NewBufReader(r io.Reader) *bufReader {
+ var timeout int
+ if randVal, err := rand.Int(rand.Reader, big.NewInt(120)); err == nil {
+ timeout = int(randVal.Int64()) + 180
+ } else {
+ timeout = 300
+ }
reader := &bufReader{
- buf: &bytes.Buffer{},
- drainBuf: make([]byte, 1024),
- reader: r,
+ buf: &bytes.Buffer{},
+ drainBuf: make([]byte, 1024),
+ reuseBuf: make([]byte, 4096),
+ maxReuse: 1000,
+ resetTimeout: time.Second * time.Duration(timeout),
+ bufLenResetThreshold: 100 * 1024,
+ maxReadDataReset: 10 * 1024 * 1024,
+ reader: r,
}
reader.wait.L = &reader.Mutex
go reader.drain()
@@ -74,14 +97,94 @@ func NewBufReaderWithDrainbufAndBuffer(r io.Reader, drainBuffer []byte, buffer *
}
func (r *bufReader) drain() {
+ var (
+ duration time.Duration
+ lastReset time.Time
+ now time.Time
+ reset bool
+ bufLen int64
+ dataSinceReset int64
+ maxBufLen int64
+ reuseBufLen int64
+ reuseCount int64
+ )
+ reuseBufLen = int64(len(r.reuseBuf))
+ lastReset = time.Now()
for {
n, err := r.reader.Read(r.drainBuf)
+ dataSinceReset += int64(n)
r.Lock()
+ bufLen = int64(r.buf.Len())
+ if bufLen > maxBufLen {
+ maxBufLen = bufLen
+ }
+
+ // Avoid unbounded growth of the buffer over time.
+ // This has been discovered to be the only non-intrusive
+ // solution to the unbounded growth of the buffer.
+ // Alternative solutions such as compression, multiple
+ // buffers, channels and other similar pieces of code
+ // were reducing throughput, overall Docker performance
+ // or simply crashed Docker.
+ // This solution releases the buffer when specific
+ // conditions are met to avoid the continuous resizing
+ // of the buffer for long lived containers.
+ //
+ // Move data to the front of the buffer if it's
+ // smaller than what reuseBuf can store
+ if bufLen > 0 && reuseBufLen >= bufLen {
+ n, _ := r.buf.Read(r.reuseBuf)
+ r.buf.Write(r.reuseBuf[0:n])
+ // Take action if the buffer has been reused too many
+ // times and if there's data in the buffer.
+ // The timeout is also used as means to avoid doing
+ // these operations more often or less often than
+ // required.
+ // The various conditions try to detect heavy activity
+ // in the buffer which might be indicators of heavy
+ // growth of the buffer.
+ } else if reuseCount >= r.maxReuse && bufLen > 0 {
+ now = time.Now()
+ duration = now.Sub(lastReset)
+ timeoutReached := duration >= r.resetTimeout
+
+ // The timeout has been reached and the
+ // buffered data couldn't be moved to the front
+ // of the buffer, so the buffer gets reset.
+ if timeoutReached && bufLen > reuseBufLen {
+ reset = true
+ }
+ // The amount of buffered data is too high now,
+ // reset the buffer.
+ if timeoutReached && maxBufLen >= r.bufLenResetThreshold {
+ reset = true
+ }
+ // Reset the buffer if a certain amount of
+ // data has gone through the buffer since the
+ // last reset.
+ if timeoutReached && dataSinceReset >= r.maxReadDataReset {
+ reset = true
+ }
+ // The buffered data is moved to a fresh buffer,
+ // swap the old buffer with the new one and
+ // reset all counters.
+ if reset {
+ newbuf := &bytes.Buffer{}
+ newbuf.ReadFrom(r.buf)
+ r.buf = newbuf
+ lastReset = now
+ reset = false
+ dataSinceReset = 0
+ maxBufLen = 0
+ reuseCount = 0
+ }
+ }
if err != nil {
r.err = err
} else {
r.buf.Write(r.drainBuf[0:n])
}
+ reuseCount++
r.wait.Signal()
r.Unlock()
if err != nil {
diff --git a/pkg/ioutils/readers_test.go b/pkg/ioutils/readers_test.go
index a7a2dad176..0af978e068 100644
--- a/pkg/ioutils/readers_test.go
+++ b/pkg/ioutils/readers_test.go
@@ -32,3 +32,61 @@ func TestBufReader(t *testing.T) {
t.Error(string(output))
}
}
+
+type repeatedReader struct {
+ readCount int
+ maxReads int
+ data []byte
+}
+
+func newRepeatedReader(max int, data []byte) *repeatedReader {
+ return &repeatedReader{0, max, data}
+}
+
+func (r *repeatedReader) Read(p []byte) (int, error) {
+ if r.readCount >= r.maxReads {
+ return 0, io.EOF
+ }
+ r.readCount++
+ n := copy(p, r.data)
+ return n, nil
+}
+
+func testWithData(data []byte, reads int) {
+ reader := newRepeatedReader(reads, data)
+ bufReader := NewBufReader(reader)
+ io.Copy(ioutil.Discard, bufReader)
+}
+
+func Benchmark1M10BytesReads(b *testing.B) {
+ reads := 1000000
+ readSize := int64(10)
+ data := make([]byte, readSize)
+ b.SetBytes(readSize * int64(reads))
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ testWithData(data, reads)
+ }
+}
+
+func Benchmark1M1024BytesReads(b *testing.B) {
+ reads := 1000000
+ readSize := int64(1024)
+ data := make([]byte, readSize)
+ b.SetBytes(readSize * int64(reads))
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ testWithData(data, reads)
+ }
+}
+
+func Benchmark10k32KBytesReads(b *testing.B) {
+ reads := 10000
+ readSize := int64(32 * 1024)
+ data := make([]byte, readSize)
+ b.SetBytes(readSize * int64(reads))
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ testWithData(data, reads)
+ }
+}
diff --git a/pkg/iptables/MAINTAINERS b/pkg/iptables/MAINTAINERS
deleted file mode 100644
index 134b02a071..0000000000
--- a/pkg/iptables/MAINTAINERS
+++ /dev/null
@@ -1,2 +0,0 @@
-Michael Crosby <michael@crosbymichael.com> (@crosbymichael)
-Jessie Frazelle <jess@docker.com> (@jfrazelle)
diff --git a/pkg/iptables/iptables.go b/pkg/iptables/iptables.go
index 010c99b15c..3e083a43ad 100644
--- a/pkg/iptables/iptables.go
+++ b/pkg/iptables/iptables.go
@@ -21,6 +21,7 @@ const (
Insert Action = "-I"
Nat Table = "nat"
Filter Table = "filter"
+ Mangle Table = "mangle"
)
var (
@@ -82,7 +83,7 @@ func NewChain(name, bridge string, table Table) (*Chain, error) {
preroute := []string{
"-m", "addrtype",
"--dst-type", "LOCAL"}
- if !Exists(preroute...) {
+ if !Exists(Nat, "PREROUTING", preroute...) {
if err := c.Prerouting(Append, preroute...); err != nil {
return nil, fmt.Errorf("Failed to inject docker in PREROUTING chain: %s", err)
}
@@ -91,17 +92,17 @@ func NewChain(name, bridge string, table Table) (*Chain, error) {
"-m", "addrtype",
"--dst-type", "LOCAL",
"!", "--dst", "127.0.0.0/8"}
- if !Exists(output...) {
+ if !Exists(Nat, "OUTPUT", output...) {
if err := c.Output(Append, output...); err != nil {
return nil, fmt.Errorf("Failed to inject docker in OUTPUT chain: %s", err)
}
}
case Filter:
- link := []string{"FORWARD",
+ link := []string{
"-o", c.Bridge,
"-j", c.Name}
- if !Exists(link...) {
- insert := append([]string{string(Insert)}, link...)
+ if !Exists(Filter, "FORWARD", link...) {
+ insert := append([]string{string(Insert), "FORWARD"}, link...)
if output, err := Raw(insert...); err != nil {
return nil, err
} else if len(output) != 0 {
@@ -242,19 +243,25 @@ func (c *Chain) Remove() error {
}
// Check if a rule exists
-func Exists(args ...string) bool {
+func Exists(table Table, chain string, rule ...string) bool {
+ if string(table) == "" {
+ table = Filter
+ }
+
// iptables -C, --check option was added in v.1.4.11
// http://ftp.netfilter.org/pub/iptables/changes-iptables-1.4.11.txt
// try -C
// if exit status is 0 then return true, the rule exists
- if _, err := Raw(append([]string{"-C"}, args...)...); err == nil {
+ if _, err := Raw(append([]string{
+ "-t", string(table), "-C", chain}, rule...)...); err == nil {
return true
}
- // parse iptables-save for the rule
- rule := strings.Replace(strings.Join(args, " "), "-t nat ", "", -1)
- existingRules, _ := exec.Command("iptables-save").Output()
+ // parse "iptables -S" for the rule (this checks rules in a specific chain
+ // in a specific table)
+ rule_string := strings.Join(rule, " ")
+ existingRules, _ := exec.Command("iptables", "-t", string(table), "-S", chain).Output()
// regex to replace ips in rule
// because MASQUERADE rule will not be exactly what was passed
@@ -262,7 +269,7 @@ func Exists(args ...string) bool {
return strings.Contains(
re.ReplaceAllString(string(existingRules), "?"),
- re.ReplaceAllString(rule, "?"),
+ re.ReplaceAllString(rule_string, "?"),
)
}
diff --git a/pkg/iptables/iptables_test.go b/pkg/iptables/iptables_test.go
index 8aaf429c94..ced4262ce2 100644
--- a/pkg/iptables/iptables_test.go
+++ b/pkg/iptables/iptables_test.go
@@ -39,8 +39,7 @@ func TestForward(t *testing.T) {
t.Fatal(err)
}
- dnatRule := []string{natChain.Name,
- "-t", string(natChain.Table),
+ dnatRule := []string{
"!", "-i", filterChain.Bridge,
"-d", ip.String(),
"-p", proto,
@@ -49,12 +48,11 @@ func TestForward(t *testing.T) {
"--to-destination", dstAddr + ":" + strconv.Itoa(dstPort),
}
- if !Exists(dnatRule...) {
+ if !Exists(natChain.Table, natChain.Name, dnatRule...) {
t.Fatalf("DNAT rule does not exist")
}
- filterRule := []string{filterChain.Name,
- "-t", string(filterChain.Table),
+ filterRule := []string{
"!", "-i", filterChain.Bridge,
"-o", filterChain.Bridge,
"-d", dstAddr,
@@ -63,12 +61,11 @@ func TestForward(t *testing.T) {
"-j", "ACCEPT",
}
- if !Exists(filterRule...) {
+ if !Exists(filterChain.Table, filterChain.Name, filterRule...) {
t.Fatalf("filter rule does not exist")
}
- masqRule := []string{"POSTROUTING",
- "-t", string(natChain.Table),
+ masqRule := []string{
"-d", dstAddr,
"-s", dstAddr,
"-p", proto,
@@ -76,7 +73,7 @@ func TestForward(t *testing.T) {
"-j", "MASQUERADE",
}
- if !Exists(masqRule...) {
+ if !Exists(natChain.Table, "POSTROUTING", masqRule...) {
t.Fatalf("MASQUERADE rule does not exist")
}
}
@@ -94,8 +91,7 @@ func TestLink(t *testing.T) {
t.Fatal(err)
}
- rule1 := []string{filterChain.Name,
- "-t", string(filterChain.Table),
+ rule1 := []string{
"-i", filterChain.Bridge,
"-o", filterChain.Bridge,
"-p", proto,
@@ -104,12 +100,11 @@ func TestLink(t *testing.T) {
"--dport", strconv.Itoa(port),
"-j", "ACCEPT"}
- if !Exists(rule1...) {
+ if !Exists(filterChain.Table, filterChain.Name, rule1...) {
t.Fatalf("rule1 does not exist")
}
- rule2 := []string{filterChain.Name,
- "-t", string(filterChain.Table),
+ rule2 := []string{
"-i", filterChain.Bridge,
"-o", filterChain.Bridge,
"-p", proto,
@@ -118,7 +113,7 @@ func TestLink(t *testing.T) {
"--sport", strconv.Itoa(port),
"-j", "ACCEPT"}
- if !Exists(rule2...) {
+ if !Exists(filterChain.Table, filterChain.Name, rule2...) {
t.Fatalf("rule2 does not exist")
}
}
@@ -133,17 +128,16 @@ func TestPrerouting(t *testing.T) {
t.Fatal(err)
}
- rule := []string{"PREROUTING",
- "-t", string(Nat),
+ rule := []string{
"-j", natChain.Name}
rule = append(rule, args...)
- if !Exists(rule...) {
+ if !Exists(natChain.Table, "PREROUTING", rule...) {
t.Fatalf("rule does not exist")
}
- delRule := append([]string{"-D"}, rule...)
+ delRule := append([]string{"-D", "PREROUTING", "-t", string(Nat)}, rule...)
if _, err = Raw(delRule...); err != nil {
t.Fatal(err)
}
@@ -159,17 +153,17 @@ func TestOutput(t *testing.T) {
t.Fatal(err)
}
- rule := []string{"OUTPUT",
- "-t", string(natChain.Table),
+ rule := []string{
"-j", natChain.Name}
rule = append(rule, args...)
- if !Exists(rule...) {
+ if !Exists(natChain.Table, "OUTPUT", rule...) {
t.Fatalf("rule does not exist")
}
- delRule := append([]string{"-D"}, rule...)
+ delRule := append([]string{"-D", "OUTPUT", "-t",
+ string(natChain.Table)}, rule...)
if _, err = Raw(delRule...); err != nil {
t.Fatal(err)
}
diff --git a/pkg/jsonlog/jsonlog.go b/pkg/jsonlog/jsonlog.go
index 3a96d86f82..e2c2a2cab6 100644
--- a/pkg/jsonlog/jsonlog.go
+++ b/pkg/jsonlog/jsonlog.go
@@ -23,7 +23,7 @@ func (jl *JSONLog) Format(format string) (string, error) {
m, err := json.Marshal(jl)
return string(m), err
}
- return fmt.Sprintf("[%s] %s", jl.Created.Format(format), jl.Log), nil
+ return fmt.Sprintf("%s %s", jl.Created.Format(format), jl.Log), nil
}
func (jl *JSONLog) Reset() {
diff --git a/pkg/jsonlog/jsonlog_marshalling.go b/pkg/jsonlog/jsonlog_marshalling.go
index 6c7f73a90d..6244eb01a4 100644
--- a/pkg/jsonlog/jsonlog_marshalling.go
+++ b/pkg/jsonlog/jsonlog_marshalling.go
@@ -1,7 +1,7 @@
// This code was initially generated by ffjson <https://github.com/pquerna/ffjson>
// This code was generated via the following steps:
// $ go get -u github.com/pquerna/ffjson
-// $ make shell BINDDIR=.
+// $ make BIND_DIR=. shell
// $ ffjson pkg/jsonlog/jsonlog.go
// $ mv pkg/jsonglog/jsonlog_ffjson.go pkg/jsonlog/jsonlog_marshalling.go
//
diff --git a/pkg/jsonlog/jsonlog_test.go b/pkg/jsonlog/jsonlog_test.go
index 5ee5eda35c..fa53825b93 100644
--- a/pkg/jsonlog/jsonlog_test.go
+++ b/pkg/jsonlog/jsonlog_test.go
@@ -30,7 +30,8 @@ func TestWriteLog(t *testing.T) {
if len(lines) != 30 {
t.Fatalf("Must be 30 lines but got %d", len(lines))
}
- logRe := regexp.MustCompile(`\[.*\] Line that thinks that it is log line from docker`)
+ // 30+ symbols, five more can come from system timezone
+ logRe := regexp.MustCompile(`.{30,} Line that thinks that it is log line from docker`)
for _, l := range lines {
if !logRe.MatchString(l) {
t.Fatalf("Log line not in expected format: %q", l)
diff --git a/pkg/mflag/MAINTAINERS b/pkg/mflag/MAINTAINERS
deleted file mode 100644
index e0f18f14f1..0000000000
--- a/pkg/mflag/MAINTAINERS
+++ /dev/null
@@ -1 +0,0 @@
-Victor Vieux <vieux@docker.com> (@vieux)
diff --git a/pkg/mflag/flag.go b/pkg/mflag/flag.go
index 94cb5b7f76..b35692bfd3 100644
--- a/pkg/mflag/flag.go
+++ b/pkg/mflag/flag.go
@@ -86,11 +86,14 @@ import (
"fmt"
"io"
"os"
+ "runtime"
"sort"
"strconv"
"strings"
"text/tabwriter"
"time"
+
+ "github.com/docker/docker/pkg/homedir"
)
// ErrHelp is the error returned if the flag -help is invoked but no such flag is defined.
@@ -503,12 +506,14 @@ func Set(name, value string) error {
// otherwise, the default values of all defined flags in the set.
func (f *FlagSet) PrintDefaults() {
writer := tabwriter.NewWriter(f.Out(), 20, 1, 3, ' ', 0)
+ home := homedir.Get()
+
+ // Don't substitute when HOME is /
+ if runtime.GOOS != "windows" && home == "/" {
+ home = ""
+ }
f.VisitAll(func(flag *Flag) {
format := " -%s=%s"
- if _, ok := flag.Value.(*stringValue); ok {
- // put quotes on the value
- format = " -%s=%q"
- }
names := []string{}
for _, name := range flag.Names {
if name[0] != '#' {
@@ -516,7 +521,13 @@ func (f *FlagSet) PrintDefaults() {
}
}
if len(names) > 0 {
- fmt.Fprintf(writer, format, strings.Join(names, ", -"), flag.DefValue)
+ val := flag.DefValue
+
+ if home != "" && strings.HasPrefix(val, home) {
+ val = homedir.GetShortcutString() + val[len(home):]
+ }
+
+ fmt.Fprintf(writer, format, strings.Join(names, ", -"), val)
for i, line := range strings.Split(flag.Usage, "\n") {
if i != 0 {
line = " " + line
diff --git a/pkg/mount/MAINTAINERS b/pkg/mount/MAINTAINERS
deleted file mode 100644
index 1e998f8ac1..0000000000
--- a/pkg/mount/MAINTAINERS
+++ /dev/null
@@ -1 +0,0 @@
-Michael Crosby <michael@crosbymichael.com> (@crosbymichael)
diff --git a/pkg/mount/sharedsubtree_linux_test.go b/pkg/mount/sharedsubtree_linux_test.go
index 0986bd9c75..da9aa15015 100644
--- a/pkg/mount/sharedsubtree_linux_test.go
+++ b/pkg/mount/sharedsubtree_linux_test.go
@@ -9,7 +9,7 @@ import (
"testing"
)
-// nothing is propogated in or out
+// nothing is propagated in or out
func TestSubtreePrivate(t *testing.T) {
tmp := path.Join(os.TempDir(), "mount-tests")
if err := os.MkdirAll(tmp, 0777); err != nil {
diff --git a/pkg/networkfs/MAINTAINERS b/pkg/networkfs/MAINTAINERS
deleted file mode 100644
index e0f18f14f1..0000000000
--- a/pkg/networkfs/MAINTAINERS
+++ /dev/null
@@ -1 +0,0 @@
-Victor Vieux <vieux@docker.com> (@vieux)
diff --git a/pkg/networkfs/resolvconf/resolvconf.go b/pkg/networkfs/resolvconf/resolvconf.go
index d88074f598..61f92d9ae5 100644
--- a/pkg/networkfs/resolvconf/resolvconf.go
+++ b/pkg/networkfs/resolvconf/resolvconf.go
@@ -23,11 +23,13 @@ var (
// For readability and sufficiency for Docker purposes this seemed more reasonable than a
// 1000+ character regexp with exact and complete IPv6 validation
ipv6Address = `([0-9A-Fa-f]{0,4}:){2,7}([0-9A-Fa-f]{0,4})`
+ ipLocalhost = `((127\.([0-9]{1,3}.){2}[0-9]{1,3})|(::1))`
- localhostRegexp = regexp.MustCompile(`(?m)^nameserver\s+((127\.([0-9]{1,3}.){2}[0-9]{1,3})|(::1))\s*\n*`)
- nsIPv6Regexp = regexp.MustCompile(`(?m)^nameserver\s+` + ipv6Address + `\s*\n*`)
- nsRegexp = regexp.MustCompile(`^\s*nameserver\s*((` + ipv4Address + `)|(` + ipv6Address + `))\s*$`)
- searchRegexp = regexp.MustCompile(`^\s*search\s*(([^\s]+\s*)*)$`)
+ localhostIPRegexp = regexp.MustCompile(ipLocalhost)
+ localhostNSRegexp = regexp.MustCompile(`(?m)^nameserver\s+` + ipLocalhost + `\s*\n*`)
+ nsIPv6Regexp = regexp.MustCompile(`(?m)^nameserver\s+` + ipv6Address + `\s*\n*`)
+ nsRegexp = regexp.MustCompile(`^\s*nameserver\s*((` + ipv4Address + `)|(` + ipv6Address + `))\s*$`)
+ searchRegexp = regexp.MustCompile(`^\s*search\s*(([^\s]+\s*)*)$`)
)
var lastModified struct {
@@ -87,7 +89,7 @@ func GetLastModified() ([]byte, string) {
// It also returns a boolean to notify the caller if changes were made at all
func FilterResolvDns(resolvConf []byte, ipv6Enabled bool) ([]byte, bool) {
changed := false
- cleanedResolvConf := localhostRegexp.ReplaceAll(resolvConf, []byte{})
+ cleanedResolvConf := localhostNSRegexp.ReplaceAll(resolvConf, []byte{})
// if IPv6 is not enabled, also clean out any IPv6 address nameserver
if !ipv6Enabled {
cleanedResolvConf = nsIPv6Regexp.ReplaceAll(cleanedResolvConf, []byte{})
@@ -124,6 +126,13 @@ func getLines(input []byte, commentMarker []byte) [][]byte {
return output
}
+// returns true if the IP string matches the localhost IP regular expression.
+// Used for determining if nameserver settings are being passed which are
+// localhost addresses
+func IsLocalhost(ip string) bool {
+ return localhostIPRegexp.MatchString(ip)
+}
+
// GetNameservers returns nameservers (if any) listed in /etc/resolv.conf
func GetNameservers(resolvConf []byte) []string {
nameservers := []string{}
diff --git a/pkg/parsers/MAINTAINERS b/pkg/parsers/MAINTAINERS
deleted file mode 100644
index 8c8902530a..0000000000
--- a/pkg/parsers/MAINTAINERS
+++ /dev/null
@@ -1 +0,0 @@
-Erik Hollensbe <github@hollensbe.org> (@erikh)
diff --git a/pkg/parsers/filters/parse.go b/pkg/parsers/filters/parse.go
index 8b045a3098..9c056bb3cf 100644
--- a/pkg/parsers/filters/parse.go
+++ b/pkg/parsers/filters/parse.go
@@ -65,6 +65,38 @@ func FromParam(p string) (Args, error) {
return args, nil
}
+func (filters Args) MatchKVList(field string, sources map[string]string) bool {
+ fieldValues := filters[field]
+
+ //do not filter if there is no filter set or cannot determine filter
+ if len(fieldValues) == 0 {
+ return true
+ }
+
+ if sources == nil || len(sources) == 0 {
+ return false
+ }
+
+outer:
+ for _, name2match := range fieldValues {
+ testKV := strings.SplitN(name2match, "=", 2)
+
+ for k, v := range sources {
+ if len(testKV) == 1 {
+ if k == testKV[0] {
+ continue outer
+ }
+ } else if k == testKV[0] && v == testKV[1] {
+ continue outer
+ }
+ }
+
+ return false
+ }
+
+ return true
+}
+
func (filters Args) Match(field, source string) bool {
fieldValues := filters[field]
diff --git a/pkg/parsers/parsers.go b/pkg/parsers/parsers.go
index 6563190410..59e294dc22 100644
--- a/pkg/parsers/parsers.go
+++ b/pkg/parsers/parsers.go
@@ -62,11 +62,17 @@ func ParseTCPAddr(addr string, defaultAddr string) (string, error) {
return fmt.Sprintf("tcp://%s:%d", host, p), nil
}
-// Get a repos name and returns the right reposName + tag
+// Get a repos name and returns the right reposName + tag|digest
// The tag can be confusing because of a port in a repository name.
// Ex: localhost.localdomain:5000/samalba/hipache:latest
+// Digest ex: localhost:5000/foo/bar@sha256:bc8813ea7b3603864987522f02a76101c17ad122e1c46d790efc0fca78ca7bfb
func ParseRepositoryTag(repos string) (string, string) {
- n := strings.LastIndex(repos, ":")
+ n := strings.Index(repos, "@")
+ if n >= 0 {
+ parts := strings.Split(repos, "@")
+ return parts[0], parts[1]
+ }
+ n = strings.LastIndex(repos, ":")
if n < 0 {
return repos, ""
}
diff --git a/pkg/parsers/parsers_test.go b/pkg/parsers/parsers_test.go
index aac1e33e35..bc9a1e943c 100644
--- a/pkg/parsers/parsers_test.go
+++ b/pkg/parsers/parsers_test.go
@@ -49,18 +49,27 @@ func TestParseRepositoryTag(t *testing.T) {
if repo, tag := ParseRepositoryTag("root:tag"); repo != "root" || tag != "tag" {
t.Errorf("Expected repo: '%s' and tag: '%s', got '%s' and '%s'", "root", "tag", repo, tag)
}
+ if repo, digest := ParseRepositoryTag("root@sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"); repo != "root" || digest != "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" {
+ t.Errorf("Expected repo: '%s' and digest: '%s', got '%s' and '%s'", "root", "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", repo, digest)
+ }
if repo, tag := ParseRepositoryTag("user/repo"); repo != "user/repo" || tag != "" {
t.Errorf("Expected repo: '%s' and tag: '%s', got '%s' and '%s'", "user/repo", "", repo, tag)
}
if repo, tag := ParseRepositoryTag("user/repo:tag"); repo != "user/repo" || tag != "tag" {
t.Errorf("Expected repo: '%s' and tag: '%s', got '%s' and '%s'", "user/repo", "tag", repo, tag)
}
+ if repo, digest := ParseRepositoryTag("user/repo@sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"); repo != "user/repo" || digest != "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" {
+ t.Errorf("Expected repo: '%s' and digest: '%s', got '%s' and '%s'", "user/repo", "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", repo, digest)
+ }
if repo, tag := ParseRepositoryTag("url:5000/repo"); repo != "url:5000/repo" || tag != "" {
t.Errorf("Expected repo: '%s' and tag: '%s', got '%s' and '%s'", "url:5000/repo", "", repo, tag)
}
if repo, tag := ParseRepositoryTag("url:5000/repo:tag"); repo != "url:5000/repo" || tag != "tag" {
t.Errorf("Expected repo: '%s' and tag: '%s', got '%s' and '%s'", "url:5000/repo", "tag", repo, tag)
}
+ if repo, digest := ParseRepositoryTag("url:5000/repo@sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"); repo != "url:5000/repo" || digest != "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" {
+ t.Errorf("Expected repo: '%s' and digest: '%s', got '%s' and '%s'", "url:5000/repo", "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", repo, digest)
+ }
}
func TestParsePortMapping(t *testing.T) {
diff --git a/pkg/progressreader/progressreader.go b/pkg/progressreader/progressreader.go
new file mode 100644
index 0000000000..f6ad06a3b5
--- /dev/null
+++ b/pkg/progressreader/progressreader.go
@@ -0,0 +1,70 @@
+package progressreader
+
+import (
+ "io"
+)
+
+type StreamFormatter interface {
+ FormatProg(string, string, interface{}) []byte
+ FormatStatus(string, string, ...interface{}) []byte
+ FormatError(error) []byte
+}
+
+type PR_JSONProgress interface {
+ GetCurrent() int
+ GetTotal() int
+}
+
+type JSONProg struct {
+ Current int
+ Total int
+}
+
+func (j *JSONProg) GetCurrent() int {
+ return j.Current
+}
+func (j *JSONProg) GetTotal() int {
+ return j.Total
+}
+
+// Reader with progress bar
+type Config struct {
+ In io.ReadCloser // Stream to read from
+ Out io.Writer // Where to send progress bar to
+ Formatter StreamFormatter
+ Size int
+ Current int
+ LastUpdate int
+ NewLines bool
+ ID string
+ Action string
+}
+
+func New(newReader Config) *Config {
+ return &newReader
+}
+func (config *Config) Read(p []byte) (n int, err error) {
+ read, err := config.In.Read(p)
+ config.Current += read
+ updateEvery := 1024 * 512 //512kB
+ if config.Size > 0 {
+ // Update progress for every 1% read if 1% < 512kB
+ if increment := int(0.01 * float64(config.Size)); increment < updateEvery {
+ updateEvery = increment
+ }
+ }
+ if config.Current-config.LastUpdate > updateEvery || err != nil {
+ config.Out.Write(config.Formatter.FormatProg(config.ID, config.Action, &JSONProg{Current: config.Current, Total: config.Size}))
+ config.LastUpdate = config.Current
+ }
+ // Send newline when complete
+ if config.NewLines && err != nil && read == 0 {
+ config.Out.Write(config.Formatter.FormatStatus("", ""))
+ }
+ return read, err
+}
+func (config *Config) Close() error {
+ config.Current = config.Size
+ config.Out.Write(config.Formatter.FormatProg(config.ID, config.Action, &JSONProg{Current: config.Current, Total: config.Size}))
+ return config.In.Close()
+}
diff --git a/pkg/proxy/MAINTAINERS b/pkg/proxy/MAINTAINERS
deleted file mode 100644
index 8c8902530a..0000000000
--- a/pkg/proxy/MAINTAINERS
+++ /dev/null
@@ -1 +0,0 @@
-Erik Hollensbe <github@hollensbe.org> (@erikh)
diff --git a/pkg/reexec/MAINTAINERS b/pkg/reexec/MAINTAINERS
deleted file mode 100644
index e48a0c7d4d..0000000000
--- a/pkg/reexec/MAINTAINERS
+++ /dev/null
@@ -1 +0,0 @@
-Michael Crosby <michael@docker.com> (@crosbymichael)
diff --git a/pkg/reexec/reexec.go b/pkg/reexec/reexec.go
index 774e71c76d..a5f01a26e3 100644
--- a/pkg/reexec/reexec.go
+++ b/pkg/reexec/reexec.go
@@ -35,8 +35,14 @@ func Self() string {
name := os.Args[0]
if filepath.Base(name) == name {
if lp, err := exec.LookPath(name); err == nil {
- name = lp
+ return lp
}
}
+ // handle conversion of relative paths to absolute
+ if absName, err := filepath.Abs(name); err == nil {
+ return absName
+ }
+ // if we coudn't get absolute name, return original
+ // (NOTE: Go only errors on Abs() if os.Getwd fails)
return name
}
diff --git a/pkg/stdcopy/MAINTAINERS b/pkg/stdcopy/MAINTAINERS
deleted file mode 100644
index 6dde4769d7..0000000000
--- a/pkg/stdcopy/MAINTAINERS
+++ /dev/null
@@ -1 +0,0 @@
-Cristian Staretu <cristian.staretu@gmail.com> (@unclejack)
diff --git a/pkg/symlink/MAINTAINERS b/pkg/symlink/MAINTAINERS
deleted file mode 100644
index 51a41a5b60..0000000000
--- a/pkg/symlink/MAINTAINERS
+++ /dev/null
@@ -1,3 +0,0 @@
-Tibor Vass <teabee89@gmail.com> (@tiborvass)
-Cristian Staretu <cristian.staretu@gmail.com> (@unclejack)
-Tianon Gravi <admwiggin@gmail.com> (@tianon)
diff --git a/pkg/sysinfo/MAINTAINERS b/pkg/sysinfo/MAINTAINERS
deleted file mode 100644
index 68a97d2fc2..0000000000
--- a/pkg/sysinfo/MAINTAINERS
+++ /dev/null
@@ -1,2 +0,0 @@
-Michael Crosby <michael@crosbymichael.com> (@crosbymichael)
-Victor Vieux <vieux@docker.com> (@vieux)
diff --git a/pkg/sysinfo/sysinfo.go b/pkg/sysinfo/sysinfo.go
index 001111f43d..1d540d2e7d 100644
--- a/pkg/sysinfo/sysinfo.go
+++ b/pkg/sysinfo/sysinfo.go
@@ -20,20 +20,20 @@ func New(quiet bool) *SysInfo {
sysInfo := &SysInfo{}
if cgroupMemoryMountpoint, err := cgroups.FindCgroupMountpoint("memory"); err != nil {
if !quiet {
- log.Printf("WARNING: %s\n", err)
+ log.Warnf("%s", err)
}
} else {
_, err1 := ioutil.ReadFile(path.Join(cgroupMemoryMountpoint, "memory.limit_in_bytes"))
_, err2 := ioutil.ReadFile(path.Join(cgroupMemoryMountpoint, "memory.soft_limit_in_bytes"))
sysInfo.MemoryLimit = err1 == nil && err2 == nil
if !sysInfo.MemoryLimit && !quiet {
- log.Printf("WARNING: Your kernel does not support cgroup memory limit.")
+ log.Warnf("Your kernel does not support cgroup memory limit.")
}
_, err = ioutil.ReadFile(path.Join(cgroupMemoryMountpoint, "memory.memsw.limit_in_bytes"))
sysInfo.SwapLimit = err == nil
if !sysInfo.SwapLimit && !quiet {
- log.Printf("WARNING: Your kernel does not support cgroup swap limit.")
+ log.Warnf("Your kernel does not support cgroup swap limit.")
}
}
diff --git a/pkg/system/MAINTAINERS b/pkg/system/MAINTAINERS
deleted file mode 100644
index 68a97d2fc2..0000000000
--- a/pkg/system/MAINTAINERS
+++ /dev/null
@@ -1,2 +0,0 @@
-Michael Crosby <michael@crosbymichael.com> (@crosbymichael)
-Victor Vieux <vieux@docker.com> (@vieux)
diff --git a/pkg/system/lstat.go b/pkg/system/lstat.go
index 9ef82d5523..6c1ed2e386 100644
--- a/pkg/system/lstat.go
+++ b/pkg/system/lstat.go
@@ -6,7 +6,7 @@ import (
"syscall"
)
-func Lstat(path string) (*Stat, error) {
+func Lstat(path string) (*Stat_t, error) {
s := &syscall.Stat_t{}
err := syscall.Lstat(path, s)
if err != nil {
diff --git a/pkg/system/lstat_windows.go b/pkg/system/lstat_windows.go
index 213a7c7ade..801e756d8b 100644
--- a/pkg/system/lstat_windows.go
+++ b/pkg/system/lstat_windows.go
@@ -2,7 +2,7 @@
package system
-func Lstat(path string) (*Stat, error) {
+func Lstat(path string) (*Stat_t, error) {
// should not be called on cli code path
return nil, ErrNotSupportedPlatform
}
diff --git a/pkg/system/stat.go b/pkg/system/stat.go
index 5d47494d21..186e85287d 100644
--- a/pkg/system/stat.go
+++ b/pkg/system/stat.go
@@ -4,7 +4,7 @@ import (
"syscall"
)
-type Stat struct {
+type Stat_t struct {
mode uint32
uid uint32
gid uint32
@@ -13,30 +13,30 @@ type Stat struct {
mtim syscall.Timespec
}
-func (s Stat) Mode() uint32 {
+func (s Stat_t) Mode() uint32 {
return s.mode
}
-func (s Stat) Uid() uint32 {
+func (s Stat_t) Uid() uint32 {
return s.uid
}
-func (s Stat) Gid() uint32 {
+func (s Stat_t) Gid() uint32 {
return s.gid
}
-func (s Stat) Rdev() uint64 {
+func (s Stat_t) Rdev() uint64 {
return s.rdev
}
-func (s Stat) Size() int64 {
+func (s Stat_t) Size() int64 {
return s.size
}
-func (s Stat) Mtim() syscall.Timespec {
+func (s Stat_t) Mtim() syscall.Timespec {
return s.mtim
}
-func (s Stat) GetLastModification() syscall.Timespec {
+func (s Stat_t) GetLastModification() syscall.Timespec {
return s.Mtim()
}
diff --git a/pkg/system/stat_linux.go b/pkg/system/stat_linux.go
index 47cebef5cf..072728d0a1 100644
--- a/pkg/system/stat_linux.go
+++ b/pkg/system/stat_linux.go
@@ -4,11 +4,20 @@ import (
"syscall"
)
-func fromStatT(s *syscall.Stat_t) (*Stat, error) {
- return &Stat{size: s.Size,
+func fromStatT(s *syscall.Stat_t) (*Stat_t, error) {
+ return &Stat_t{size: s.Size,
mode: s.Mode,
uid: s.Uid,
gid: s.Gid,
rdev: s.Rdev,
mtim: s.Mtim}, nil
}
+
+func Stat(path string) (*Stat_t, error) {
+ s := &syscall.Stat_t{}
+ err := syscall.Stat(path, s)
+ if err != nil {
+ return nil, err
+ }
+ return fromStatT(s)
+}
diff --git a/pkg/system/stat_unsupported.go b/pkg/system/stat_unsupported.go
index c4d53e6cd6..66323eee21 100644
--- a/pkg/system/stat_unsupported.go
+++ b/pkg/system/stat_unsupported.go
@@ -6,8 +6,8 @@ import (
"syscall"
)
-func fromStatT(s *syscall.Stat_t) (*Stat, error) {
- return &Stat{size: s.Size,
+func fromStatT(s *syscall.Stat_t) (*Stat_t, error) {
+ return &Stat_t{size: s.Size,
mode: uint32(s.Mode),
uid: s.Uid,
gid: s.Gid,
diff --git a/pkg/system/stat_windows.go b/pkg/system/stat_windows.go
index 584e8940cc..42d29d6cca 100644
--- a/pkg/system/stat_windows.go
+++ b/pkg/system/stat_windows.go
@@ -7,6 +7,11 @@ import (
"syscall"
)
-func fromStatT(s *syscall.Win32FileAttributeData) (*Stat, error) {
+func fromStatT(s *syscall.Win32FileAttributeData) (*Stat_t, error) {
return nil, errors.New("fromStatT should not be called on windows path")
}
+
+func Stat(path string) (*Stat_t, error) {
+ // should not be called on cli code path
+ return nil, ErrNotSupportedPlatform
+}
diff --git a/pkg/systemd/MAINTAINERS b/pkg/systemd/MAINTAINERS
deleted file mode 100644
index 51228b368a..0000000000
--- a/pkg/systemd/MAINTAINERS
+++ /dev/null
@@ -1 +0,0 @@
-Brandon Philips <brandon.philips@coreos.com> (@philips)
diff --git a/pkg/tarsum/MAINTAINERS b/pkg/tarsum/MAINTAINERS
deleted file mode 100644
index 9571a14a38..0000000000
--- a/pkg/tarsum/MAINTAINERS
+++ /dev/null
@@ -1,4 +0,0 @@
-Derek McGowan <derek@mcgstyle.net> (github: dmcgowan)
-Eric Windisch <ewindisch@docker.com> (github: ewindisch)
-Josh Hawn <josh.hawn@docker.com> (github: jlhawn)
-Vincent Batts <vbatts@redhat.com> (github: vbatts)
diff --git a/pkg/term/MAINTAINERS b/pkg/term/MAINTAINERS
deleted file mode 100644
index aee10c8421..0000000000
--- a/pkg/term/MAINTAINERS
+++ /dev/null
@@ -1 +0,0 @@
-Solomon Hykes <solomon@docker.com> (@shykes)
diff --git a/pkg/term/console_windows.go b/pkg/term/console_windows.go
deleted file mode 100644
index 6335b2b837..0000000000
--- a/pkg/term/console_windows.go
+++ /dev/null
@@ -1,87 +0,0 @@
-// +build windows
-
-package term
-
-import (
- "syscall"
- "unsafe"
-)
-
-const (
- // Consts for Get/SetConsoleMode function
- // see http://msdn.microsoft.com/en-us/library/windows/desktop/ms683167(v=vs.85).aspx
- ENABLE_ECHO_INPUT = 0x0004
- ENABLE_INSERT_MODE = 0x0020
- ENABLE_LINE_INPUT = 0x0002
- ENABLE_MOUSE_INPUT = 0x0010
- ENABLE_PROCESSED_INPUT = 0x0001
- ENABLE_QUICK_EDIT_MODE = 0x0040
- ENABLE_WINDOW_INPUT = 0x0008
- // If parameter is a screen buffer handle, additional values
- ENABLE_PROCESSED_OUTPUT = 0x0001
- ENABLE_WRAP_AT_EOL_OUTPUT = 0x0002
-)
-
-var kernel32DLL = syscall.NewLazyDLL("kernel32.dll")
-
-var (
- setConsoleModeProc = kernel32DLL.NewProc("SetConsoleMode")
- getConsoleScreenBufferInfoProc = kernel32DLL.NewProc("GetConsoleScreenBufferInfo")
-)
-
-func GetConsoleMode(fileDesc uintptr) (uint32, error) {
- var mode uint32
- err := syscall.GetConsoleMode(syscall.Handle(fileDesc), &mode)
- return mode, err
-}
-
-func SetConsoleMode(fileDesc uintptr, mode uint32) error {
- r, _, err := setConsoleModeProc.Call(fileDesc, uintptr(mode), 0)
- if r == 0 {
- if err != nil {
- return err
- }
- return syscall.EINVAL
- }
- return nil
-}
-
-// types for calling GetConsoleScreenBufferInfo
-// see http://msdn.microsoft.com/en-us/library/windows/desktop/ms682093(v=vs.85).aspx
-type (
- SHORT int16
-
- SMALL_RECT struct {
- Left SHORT
- Top SHORT
- Right SHORT
- Bottom SHORT
- }
-
- COORD struct {
- X SHORT
- Y SHORT
- }
-
- WORD uint16
-
- CONSOLE_SCREEN_BUFFER_INFO struct {
- dwSize COORD
- dwCursorPosition COORD
- wAttributes WORD
- srWindow SMALL_RECT
- dwMaximumWindowSize COORD
- }
-)
-
-func GetConsoleScreenBufferInfo(fileDesc uintptr) (*CONSOLE_SCREEN_BUFFER_INFO, error) {
- var info CONSOLE_SCREEN_BUFFER_INFO
- r, _, err := getConsoleScreenBufferInfoProc.Call(uintptr(fileDesc), uintptr(unsafe.Pointer(&info)), 0)
- if r == 0 {
- if err != nil {
- return nil, err
- }
- return nil, syscall.EINVAL
- }
- return &info, nil
-}
diff --git a/pkg/term/term.go b/pkg/term/term.go
index 8d807d8d44..b945a3dcea 100644
--- a/pkg/term/term.go
+++ b/pkg/term/term.go
@@ -4,6 +4,7 @@ package term
import (
"errors"
+ "io"
"os"
"os/signal"
"syscall"
@@ -25,6 +26,20 @@ type Winsize struct {
y uint16
}
+func StdStreams() (stdIn io.ReadCloser, stdOut, stdErr io.Writer) {
+ return os.Stdin, os.Stdout, os.Stderr
+}
+
+func GetFdInfo(in interface{}) (uintptr, bool) {
+ var inFd uintptr
+ var isTerminalIn bool
+ if file, ok := in.(*os.File); ok {
+ inFd = file.Fd()
+ isTerminalIn = IsTerminal(inFd)
+ }
+ return inFd, isTerminalIn
+}
+
func GetWinsize(fd uintptr) (*Winsize, error) {
ws := &Winsize{}
_, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, uintptr(syscall.TIOCGWINSZ), uintptr(unsafe.Pointer(ws)))
diff --git a/pkg/term/term_windows.go b/pkg/term/term_windows.go
index d372e86a88..f46c9c8acf 100644
--- a/pkg/term/term_windows.go
+++ b/pkg/term/term_windows.go
@@ -1,11 +1,20 @@
// +build windows
-
package term
+import (
+ "io"
+ "os"
+
+ "github.com/Sirupsen/logrus"
+ "github.com/docker/docker/pkg/term/winconsole"
+)
+
+// State holds the console mode for the terminal.
type State struct {
mode uint32
}
+// Winsize is used for window size.
type Winsize struct {
Height uint16
Width uint16
@@ -13,75 +22,115 @@ type Winsize struct {
y uint16
}
+func StdStreams() (stdIn io.ReadCloser, stdOut, stdErr io.Writer) {
+ switch {
+ case os.Getenv("ConEmuANSI") == "ON":
+ // The ConEmu shell emulates ANSI well by default.
+ return os.Stdin, os.Stdout, os.Stderr
+ case os.Getenv("MSYSTEM") != "":
+ // MSYS (mingw) does not emulate ANSI well.
+ return winconsole.WinConsoleStreams()
+ default:
+ return winconsole.WinConsoleStreams()
+ }
+}
+
+// GetFdInfo returns file descriptor and bool indicating whether the file is a terminal.
+func GetFdInfo(in interface{}) (uintptr, bool) {
+ return winconsole.GetHandleInfo(in)
+}
+
+// GetWinsize retrieves the window size of the terminal connected to the passed file descriptor.
func GetWinsize(fd uintptr) (*Winsize, error) {
- ws := &Winsize{}
- var info *CONSOLE_SCREEN_BUFFER_INFO
- info, err := GetConsoleScreenBufferInfo(fd)
+ info, err := winconsole.GetConsoleScreenBufferInfo(fd)
if err != nil {
return nil, err
}
- ws.Height = uint16(info.srWindow.Right - info.srWindow.Left + 1)
- ws.Width = uint16(info.srWindow.Bottom - info.srWindow.Top + 1)
-
- ws.x = 0 // todo azlinux -- this is the pixel size of the Window, and not currently used by any caller
- ws.y = 0
- return ws, nil
+ // TODO(azlinux): Set the pixel width / height of the console (currently unused by any caller)
+ return &Winsize{
+ Width: uint16(info.Window.Right - info.Window.Left + 1),
+ Height: uint16(info.Window.Bottom - info.Window.Top + 1),
+ x: 0,
+ y: 0}, nil
}
+// SetWinsize sets the size of the given terminal connected to the passed file descriptor.
func SetWinsize(fd uintptr, ws *Winsize) error {
+ // TODO(azlinux): Implement SetWinsize
+ logrus.Debugf("[windows] SetWinsize: WARNING -- Unsupported method invoked")
return nil
}
// IsTerminal returns true if the given file descriptor is a terminal.
func IsTerminal(fd uintptr) bool {
- _, e := GetConsoleMode(fd)
- return e == nil
+ return winconsole.IsConsole(fd)
}
-// Restore restores the terminal connected to the given file descriptor to a
+// RestoreTerminal restores the terminal connected to the given file descriptor to a
// previous state.
func RestoreTerminal(fd uintptr, state *State) error {
- return SetConsoleMode(fd, state.mode)
+ return winconsole.SetConsoleMode(fd, state.mode)
}
+// SaveState saves the state of the terminal connected to the given file descriptor.
func SaveState(fd uintptr) (*State, error) {
- mode, e := GetConsoleMode(fd)
+ mode, e := winconsole.GetConsoleMode(fd)
if e != nil {
return nil, e
}
return &State{mode}, nil
}
-// see http://msdn.microsoft.com/en-us/library/windows/desktop/ms683462(v=vs.85).aspx for these flag settings
+// DisableEcho disables echo for the terminal connected to the given file descriptor.
+// -- See http://msdn.microsoft.com/en-us/library/windows/desktop/ms683462(v=vs.85).aspx
func DisableEcho(fd uintptr, state *State) error {
- state.mode &^= (ENABLE_ECHO_INPUT)
- state.mode |= (ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT)
- return SetConsoleMode(fd, state.mode)
+ mode := state.mode
+ mode &^= winconsole.ENABLE_ECHO_INPUT
+ mode |= winconsole.ENABLE_PROCESSED_INPUT | winconsole.ENABLE_LINE_INPUT
+ // TODO(azlinux): Core code registers a goroutine to catch os.Interrupt and reset the terminal state.
+ return winconsole.SetConsoleMode(fd, mode)
}
+// SetRawTerminal puts the terminal connected to the given file descriptor into raw
+// mode and returns the previous state of the terminal so that it can be
+// restored.
func SetRawTerminal(fd uintptr) (*State, error) {
- oldState, err := MakeRaw(fd)
+ state, err := MakeRaw(fd)
if err != nil {
return nil, err
}
- // TODO (azlinux): implement handling interrupt and restore state of terminal
- return oldState, err
+ // TODO(azlinux): Core code registers a goroutine to catch os.Interrupt and reset the terminal state.
+ return state, err
}
// MakeRaw puts the terminal connected to the given file descriptor into raw
// mode and returns the previous state of the terminal so that it can be
// restored.
func MakeRaw(fd uintptr) (*State, error) {
- var state *State
state, err := SaveState(fd)
if err != nil {
return nil, err
}
- // see http://msdn.microsoft.com/en-us/library/windows/desktop/ms683462(v=vs.85).aspx for these flag settings
- state.mode &^= (ENABLE_ECHO_INPUT | ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT)
- err = SetConsoleMode(fd, state.mode)
+ // See
+ // -- https://msdn.microsoft.com/en-us/library/windows/desktop/ms686033(v=vs.85).aspx
+ // -- https://msdn.microsoft.com/en-us/library/windows/desktop/ms683462(v=vs.85).aspx
+ mode := state.mode
+
+ // Disable these modes
+ mode &^= winconsole.ENABLE_ECHO_INPUT
+ mode &^= winconsole.ENABLE_LINE_INPUT
+ mode &^= winconsole.ENABLE_MOUSE_INPUT
+ mode &^= winconsole.ENABLE_WINDOW_INPUT
+ mode &^= winconsole.ENABLE_PROCESSED_INPUT
+
+ // Enable these modes
+ mode |= winconsole.ENABLE_EXTENDED_FLAGS
+ mode |= winconsole.ENABLE_INSERT_MODE
+ mode |= winconsole.ENABLE_QUICK_EDIT_MODE
+
+ err = winconsole.SetConsoleMode(fd, mode)
if err != nil {
return nil, err
}
diff --git a/pkg/term/winconsole/console_windows.go b/pkg/term/winconsole/console_windows.go
new file mode 100644
index 0000000000..ce40a93167
--- /dev/null
+++ b/pkg/term/winconsole/console_windows.go
@@ -0,0 +1,1053 @@
+// +build windows
+
+package winconsole
+
+import (
+ "bytes"
+ "fmt"
+ "io"
+ "os"
+ "strconv"
+ "strings"
+ "sync"
+ "syscall"
+ "unsafe"
+
+ "github.com/Sirupsen/logrus"
+)
+
+const (
+ // Consts for Get/SetConsoleMode function
+ // -- See https://msdn.microsoft.com/en-us/library/windows/desktop/ms686033(v=vs.85).aspx
+ ENABLE_PROCESSED_INPUT = 0x0001
+ ENABLE_LINE_INPUT = 0x0002
+ ENABLE_ECHO_INPUT = 0x0004
+ ENABLE_WINDOW_INPUT = 0x0008
+ ENABLE_MOUSE_INPUT = 0x0010
+ ENABLE_INSERT_MODE = 0x0020
+ ENABLE_QUICK_EDIT_MODE = 0x0040
+ ENABLE_EXTENDED_FLAGS = 0x0080
+
+ // If parameter is a screen buffer handle, additional values
+ ENABLE_PROCESSED_OUTPUT = 0x0001
+ ENABLE_WRAP_AT_EOL_OUTPUT = 0x0002
+
+ //http://msdn.microsoft.com/en-us/library/windows/desktop/ms682088(v=vs.85).aspx#_win32_character_attributes
+ FOREGROUND_BLUE = 1
+ FOREGROUND_GREEN = 2
+ FOREGROUND_RED = 4
+ FOREGROUND_INTENSITY = 8
+ FOREGROUND_MASK_SET = 0x000F
+ FOREGROUND_MASK_UNSET = 0xFFF0
+
+ BACKGROUND_BLUE = 16
+ BACKGROUND_GREEN = 32
+ BACKGROUND_RED = 64
+ BACKGROUND_INTENSITY = 128
+ BACKGROUND_MASK_SET = 0x00F0
+ BACKGROUND_MASK_UNSET = 0xFF0F
+
+ COMMON_LVB_REVERSE_VIDEO = 0x4000
+ COMMON_LVB_UNDERSCORE = 0x8000
+
+ // http://man7.org/linux/man-pages/man4/console_codes.4.html
+ // ECMA-48 Set Graphics Rendition
+ ANSI_ATTR_RESET = 0
+ ANSI_ATTR_BOLD = 1
+ ANSI_ATTR_DIM = 2
+ ANSI_ATTR_UNDERLINE = 4
+ ANSI_ATTR_BLINK = 5
+ ANSI_ATTR_REVERSE = 7
+ ANSI_ATTR_INVISIBLE = 8
+
+ ANSI_ATTR_UNDERLINE_OFF = 24
+ ANSI_ATTR_BLINK_OFF = 25
+ ANSI_ATTR_REVERSE_OFF = 27
+ ANSI_ATTR_INVISIBLE_OFF = 8
+
+ ANSI_FOREGROUND_BLACK = 30
+ ANSI_FOREGROUND_RED = 31
+ ANSI_FOREGROUND_GREEN = 32
+ ANSI_FOREGROUND_YELLOW = 33
+ ANSI_FOREGROUND_BLUE = 34
+ ANSI_FOREGROUND_MAGENTA = 35
+ ANSI_FOREGROUND_CYAN = 36
+ ANSI_FOREGROUND_WHITE = 37
+ ANSI_FOREGROUND_DEFAULT = 39
+
+ ANSI_BACKGROUND_BLACK = 40
+ ANSI_BACKGROUND_RED = 41
+ ANSI_BACKGROUND_GREEN = 42
+ ANSI_BACKGROUND_YELLOW = 43
+ ANSI_BACKGROUND_BLUE = 44
+ ANSI_BACKGROUND_MAGENTA = 45
+ ANSI_BACKGROUND_CYAN = 46
+ ANSI_BACKGROUND_WHITE = 47
+ ANSI_BACKGROUND_DEFAULT = 49
+
+ ANSI_MAX_CMD_LENGTH = 256
+
+ MAX_INPUT_EVENTS = 128
+ MAX_INPUT_BUFFER = 1024
+ DEFAULT_WIDTH = 80
+ DEFAULT_HEIGHT = 24
+)
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx
+const (
+ VK_PRIOR = 0x21 // PAGE UP key
+ VK_NEXT = 0x22 // PAGE DOWN key
+ VK_END = 0x23 // END key
+ VK_HOME = 0x24 // HOME key
+ VK_LEFT = 0x25 // LEFT ARROW key
+ VK_UP = 0x26 // UP ARROW key
+ VK_RIGHT = 0x27 // RIGHT ARROW key
+ VK_DOWN = 0x28 // DOWN ARROW key
+ VK_SELECT = 0x29 // SELECT key
+ VK_PRINT = 0x2A // PRINT key
+ VK_EXECUTE = 0x2B // EXECUTE key
+ VK_SNAPSHOT = 0x2C // PRINT SCREEN key
+ VK_INSERT = 0x2D // INS key
+ VK_DELETE = 0x2E // DEL key
+ VK_HELP = 0x2F // HELP key
+ VK_F1 = 0x70 // F1 key
+ VK_F2 = 0x71 // F2 key
+ VK_F3 = 0x72 // F3 key
+ VK_F4 = 0x73 // F4 key
+ VK_F5 = 0x74 // F5 key
+ VK_F6 = 0x75 // F6 key
+ VK_F7 = 0x76 // F7 key
+ VK_F8 = 0x77 // F8 key
+ VK_F9 = 0x78 // F9 key
+ VK_F10 = 0x79 // F10 key
+ VK_F11 = 0x7A // F11 key
+ VK_F12 = 0x7B // F12 key
+)
+
+var kernel32DLL = syscall.NewLazyDLL("kernel32.dll")
+
+var (
+ setConsoleModeProc = kernel32DLL.NewProc("SetConsoleMode")
+ getConsoleScreenBufferInfoProc = kernel32DLL.NewProc("GetConsoleScreenBufferInfo")
+ setConsoleCursorPositionProc = kernel32DLL.NewProc("SetConsoleCursorPosition")
+ setConsoleTextAttributeProc = kernel32DLL.NewProc("SetConsoleTextAttribute")
+ fillConsoleOutputCharacterProc = kernel32DLL.NewProc("FillConsoleOutputCharacterW")
+ writeConsoleOutputProc = kernel32DLL.NewProc("WriteConsoleOutputW")
+ readConsoleInputProc = kernel32DLL.NewProc("ReadConsoleInputW")
+ getNumberOfConsoleInputEventsProc = kernel32DLL.NewProc("GetNumberOfConsoleInputEvents")
+ getConsoleCursorInfoProc = kernel32DLL.NewProc("GetConsoleCursorInfo")
+ setConsoleCursorInfoProc = kernel32DLL.NewProc("SetConsoleCursorInfo")
+ setConsoleWindowInfoProc = kernel32DLL.NewProc("SetConsoleWindowInfo")
+ setConsoleScreenBufferSizeProc = kernel32DLL.NewProc("SetConsoleScreenBufferSize")
+)
+
+// types for calling various windows API
+// see http://msdn.microsoft.com/en-us/library/windows/desktop/ms682093(v=vs.85).aspx
+type (
+ SHORT int16
+ BOOL int32
+ WORD uint16
+ WCHAR uint16
+ DWORD uint32
+
+ SMALL_RECT struct {
+ Left SHORT
+ Top SHORT
+ Right SHORT
+ Bottom SHORT
+ }
+
+ COORD struct {
+ X SHORT
+ Y SHORT
+ }
+
+ CONSOLE_SCREEN_BUFFER_INFO struct {
+ Size COORD
+ CursorPosition COORD
+ Attributes WORD
+ Window SMALL_RECT
+ MaximumWindowSize COORD
+ }
+
+ CONSOLE_CURSOR_INFO struct {
+ Size DWORD
+ Visible BOOL
+ }
+
+ // http://msdn.microsoft.com/en-us/library/windows/desktop/ms684166(v=vs.85).aspx
+ KEY_EVENT_RECORD struct {
+ KeyDown BOOL
+ RepeatCount WORD
+ VirtualKeyCode WORD
+ VirtualScanCode WORD
+ UnicodeChar WCHAR
+ ControlKeyState DWORD
+ }
+
+ INPUT_RECORD struct {
+ EventType WORD
+ KeyEvent KEY_EVENT_RECORD
+ }
+
+ CHAR_INFO struct {
+ UnicodeChar WCHAR
+ Attributes WORD
+ }
+)
+
+// TODO(azlinux): Basic type clean-up
+// -- Convert all uses of uintptr to syscall.Handle to be consistent with Windows syscall
+// -- Convert, as appropriate, types to use defined Windows types (e.g., DWORD instead of uint32)
+
+// Implements the TerminalEmulator interface
+type WindowsTerminal struct {
+ outMutex sync.Mutex
+ inMutex sync.Mutex
+ inputBuffer []byte
+ inputSize int
+ inputEvents []INPUT_RECORD
+ screenBufferInfo *CONSOLE_SCREEN_BUFFER_INFO
+ inputEscapeSequence []byte
+}
+
+func getStdHandle(stdhandle int) uintptr {
+ handle, err := syscall.GetStdHandle(stdhandle)
+ if err != nil {
+ panic(fmt.Errorf("could not get standard io handle %d", stdhandle))
+ }
+ return uintptr(handle)
+}
+
+func WinConsoleStreams() (stdIn io.ReadCloser, stdOut, stdErr io.Writer) {
+ handler := &WindowsTerminal{
+ inputBuffer: make([]byte, MAX_INPUT_BUFFER),
+ inputEscapeSequence: []byte(KEY_ESC_CSI),
+ inputEvents: make([]INPUT_RECORD, MAX_INPUT_EVENTS),
+ }
+
+ if IsConsole(os.Stdin.Fd()) {
+ stdIn = &terminalReader{
+ wrappedReader: os.Stdin,
+ emulator: handler,
+ command: make([]byte, 0, ANSI_MAX_CMD_LENGTH),
+ fd: getStdHandle(syscall.STD_INPUT_HANDLE),
+ }
+ } else {
+ stdIn = os.Stdin
+ }
+
+ if IsConsole(os.Stdout.Fd()) {
+ stdoutHandle := getStdHandle(syscall.STD_OUTPUT_HANDLE)
+
+ // Save current screen buffer info
+ screenBufferInfo, err := GetConsoleScreenBufferInfo(stdoutHandle)
+ if err != nil {
+ // If GetConsoleScreenBufferInfo returns a nil error, it usually means that stdout is not a TTY.
+ // However, this is in the branch where stdout is a TTY, hence the panic.
+ panic("could not get console screen buffer info")
+ }
+ handler.screenBufferInfo = screenBufferInfo
+
+ buffer = make([]CHAR_INFO, screenBufferInfo.MaximumWindowSize.X*screenBufferInfo.MaximumWindowSize.Y)
+
+ stdOut = &terminalWriter{
+ wrappedWriter: os.Stdout,
+ emulator: handler,
+ command: make([]byte, 0, ANSI_MAX_CMD_LENGTH),
+ fd: stdoutHandle,
+ }
+ } else {
+ stdOut = os.Stdout
+ }
+
+ if IsConsole(os.Stderr.Fd()) {
+ stdErr = &terminalWriter{
+ wrappedWriter: os.Stderr,
+ emulator: handler,
+ command: make([]byte, 0, ANSI_MAX_CMD_LENGTH),
+ fd: getStdHandle(syscall.STD_ERROR_HANDLE),
+ }
+ } else {
+ stdErr = os.Stderr
+ }
+
+ return stdIn, stdOut, stdErr
+}
+
+// GetHandleInfo returns file descriptor and bool indicating whether the file is a console.
+func GetHandleInfo(in interface{}) (uintptr, bool) {
+ var inFd uintptr
+ var isTerminalIn bool
+
+ switch t := in.(type) {
+ case *terminalReader:
+ in = t.wrappedReader
+ case *terminalWriter:
+ in = t.wrappedWriter
+ }
+
+ if file, ok := in.(*os.File); ok {
+ inFd = file.Fd()
+ isTerminalIn = IsConsole(inFd)
+ }
+ return inFd, isTerminalIn
+}
+
+func getError(r1, r2 uintptr, lastErr error) error {
+ // If the function fails, the return value is zero.
+ if r1 == 0 {
+ if lastErr != nil {
+ return lastErr
+ }
+ return syscall.EINVAL
+ }
+ return nil
+}
+
+// GetConsoleMode gets the console mode for given file descriptor
+// http://msdn.microsoft.com/en-us/library/windows/desktop/ms683167(v=vs.85).aspx
+func GetConsoleMode(handle uintptr) (uint32, error) {
+ var mode uint32
+ err := syscall.GetConsoleMode(syscall.Handle(handle), &mode)
+ return mode, err
+}
+
+// SetConsoleMode sets the console mode for given file descriptor
+// http://msdn.microsoft.com/en-us/library/windows/desktop/ms686033(v=vs.85).aspx
+func SetConsoleMode(handle uintptr, mode uint32) error {
+ return getError(setConsoleModeProc.Call(handle, uintptr(mode), 0))
+}
+
+// SetCursorVisible sets the cursor visbility
+// http://msdn.microsoft.com/en-us/library/windows/desktop/ms686019(v=vs.85).aspx
+func SetCursorVisible(handle uintptr, isVisible BOOL) (bool, error) {
+ var cursorInfo *CONSOLE_CURSOR_INFO = &CONSOLE_CURSOR_INFO{}
+ if err := getError(getConsoleCursorInfoProc.Call(handle, uintptr(unsafe.Pointer(cursorInfo)), 0)); err != nil {
+ return false, err
+ }
+ cursorInfo.Visible = isVisible
+ if err := getError(setConsoleCursorInfoProc.Call(handle, uintptr(unsafe.Pointer(cursorInfo)), 0)); err != nil {
+ return false, err
+ }
+ return true, nil
+}
+
+// SetWindowSize sets the size of the console window.
+func SetWindowSize(handle uintptr, width, height, max SHORT) (bool, error) {
+ window := SMALL_RECT{Left: 0, Top: 0, Right: width - 1, Bottom: height - 1}
+ coord := COORD{X: width - 1, Y: max}
+ if err := getError(setConsoleWindowInfoProc.Call(handle, uintptr(1), uintptr(unsafe.Pointer(&window)))); err != nil {
+ return false, err
+ }
+ if err := getError(setConsoleScreenBufferSizeProc.Call(handle, marshal(coord))); err != nil {
+ return false, err
+ }
+ return true, nil
+}
+
+// GetConsoleScreenBufferInfo retrieves information about the specified console screen buffer.
+// http://msdn.microsoft.com/en-us/library/windows/desktop/ms683171(v=vs.85).aspx
+func GetConsoleScreenBufferInfo(handle uintptr) (*CONSOLE_SCREEN_BUFFER_INFO, error) {
+ var info CONSOLE_SCREEN_BUFFER_INFO
+ if err := getError(getConsoleScreenBufferInfoProc.Call(handle, uintptr(unsafe.Pointer(&info)), 0)); err != nil {
+ return nil, err
+ }
+ return &info, nil
+}
+
+// setConsoleTextAttribute sets the attributes of characters written to the
+// console screen buffer by the WriteFile or WriteConsole function,
+// http://msdn.microsoft.com/en-us/library/windows/desktop/ms686047(v=vs.85).aspx
+func setConsoleTextAttribute(handle uintptr, attribute WORD) error {
+ return getError(setConsoleTextAttributeProc.Call(handle, uintptr(attribute), 0))
+}
+
+func writeConsoleOutput(handle uintptr, buffer []CHAR_INFO, bufferSize COORD, bufferCoord COORD, writeRegion *SMALL_RECT) (bool, error) {
+ if err := getError(writeConsoleOutputProc.Call(handle, uintptr(unsafe.Pointer(&buffer[0])), marshal(bufferSize), marshal(bufferCoord), uintptr(unsafe.Pointer(writeRegion)))); err != nil {
+ return false, err
+ }
+ return true, nil
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/ms682663(v=vs.85).aspx
+func fillConsoleOutputCharacter(handle uintptr, fillChar byte, length uint32, writeCord COORD) (bool, error) {
+ out := int64(0)
+ if err := getError(fillConsoleOutputCharacterProc.Call(handle, uintptr(fillChar), uintptr(length), marshal(writeCord), uintptr(unsafe.Pointer(&out)))); err != nil {
+ return false, err
+ }
+ return true, nil
+}
+
+// Gets the number of space characters to write for "clearing" the section of terminal
+func getNumberOfChars(fromCoord COORD, toCoord COORD, screenSize COORD) uint32 {
+ // must be valid cursor position
+ if fromCoord.X < 0 || fromCoord.Y < 0 || toCoord.X < 0 || toCoord.Y < 0 {
+ return 0
+ }
+ if fromCoord.X >= screenSize.X || fromCoord.Y >= screenSize.Y || toCoord.X >= screenSize.X || toCoord.Y >= screenSize.Y {
+ return 0
+ }
+ // can't be backwards
+ if fromCoord.Y > toCoord.Y {
+ return 0
+ }
+ // same line
+ if fromCoord.Y == toCoord.Y {
+ return uint32(toCoord.X-fromCoord.X) + 1
+ }
+ // spans more than one line
+ if fromCoord.Y < toCoord.Y {
+ // from start till end of line for first line + from start of line till end
+ retValue := uint32(screenSize.X-fromCoord.X) + uint32(toCoord.X) + 1
+ // don't count first and last line
+ linesBetween := toCoord.Y - fromCoord.Y - 1
+ if linesBetween > 0 {
+ retValue = retValue + uint32(linesBetween*screenSize.X)
+ }
+ return retValue
+ }
+ return 0
+}
+
+var buffer []CHAR_INFO
+
+func clearDisplayRect(handle uintptr, attributes WORD, fromCoord COORD, toCoord COORD) (uint32, error) {
+ var writeRegion SMALL_RECT
+ writeRegion.Left = fromCoord.X
+ writeRegion.Top = fromCoord.Y
+ writeRegion.Right = toCoord.X
+ writeRegion.Bottom = toCoord.Y
+
+ // allocate and initialize buffer
+ width := toCoord.X - fromCoord.X + 1
+ height := toCoord.Y - fromCoord.Y + 1
+ size := uint32(width) * uint32(height)
+ if size > 0 {
+ buffer := make([]CHAR_INFO, size)
+ for i := range buffer {
+ buffer[i] = CHAR_INFO{WCHAR(' '), attributes}
+ }
+
+ // Write to buffer
+ r, err := writeConsoleOutput(handle, buffer, COORD{X: width, Y: height}, COORD{X: 0, Y: 0}, &writeRegion)
+ if !r {
+ if err != nil {
+ return 0, err
+ }
+ return 0, syscall.EINVAL
+ }
+ }
+ return uint32(size), nil
+}
+
+func clearDisplayRange(handle uintptr, attributes WORD, fromCoord COORD, toCoord COORD) (uint32, error) {
+ nw := uint32(0)
+ // start and end on same line
+ if fromCoord.Y == toCoord.Y {
+ return clearDisplayRect(handle, attributes, fromCoord, toCoord)
+ }
+ // TODO(azlinux): if full screen, optimize
+
+ // spans more than one line
+ if fromCoord.Y < toCoord.Y {
+ // from start position till end of line for first line
+ n, err := clearDisplayRect(handle, attributes, fromCoord, COORD{X: toCoord.X, Y: fromCoord.Y})
+ if err != nil {
+ return nw, err
+ }
+ nw += n
+ // lines between
+ linesBetween := toCoord.Y - fromCoord.Y - 1
+ if linesBetween > 0 {
+ n, err = clearDisplayRect(handle, attributes, COORD{X: 0, Y: fromCoord.Y + 1}, COORD{X: toCoord.X, Y: toCoord.Y - 1})
+ if err != nil {
+ return nw, err
+ }
+ nw += n
+ }
+ // lines at end
+ n, err = clearDisplayRect(handle, attributes, COORD{X: 0, Y: toCoord.Y}, toCoord)
+ if err != nil {
+ return nw, err
+ }
+ nw += n
+ }
+ return nw, nil
+}
+
+// setConsoleCursorPosition sets the console cursor position
+// Note The X and Y are zero based
+// If relative is true then the new position is relative to current one
+func setConsoleCursorPosition(handle uintptr, isRelative bool, column int16, line int16) error {
+ screenBufferInfo, err := GetConsoleScreenBufferInfo(handle)
+ if err != nil {
+ return err
+ }
+ var position COORD
+ if isRelative {
+ position.X = screenBufferInfo.CursorPosition.X + SHORT(column)
+ position.Y = screenBufferInfo.CursorPosition.Y + SHORT(line)
+ } else {
+ position.X = SHORT(column)
+ position.Y = SHORT(line)
+ }
+ return getError(setConsoleCursorPositionProc.Call(handle, marshal(position), 0))
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/ms683207(v=vs.85).aspx
+func getNumberOfConsoleInputEvents(handle uintptr) (uint16, error) {
+ var n DWORD
+ if err := getError(getNumberOfConsoleInputEventsProc.Call(handle, uintptr(unsafe.Pointer(&n)))); err != nil {
+ return 0, err
+ }
+ return uint16(n), nil
+}
+
+//http://msdn.microsoft.com/en-us/library/windows/desktop/ms684961(v=vs.85).aspx
+func readConsoleInputKey(handle uintptr, inputBuffer []INPUT_RECORD) (int, error) {
+ var nr DWORD
+ if err := getError(readConsoleInputProc.Call(handle, uintptr(unsafe.Pointer(&inputBuffer[0])), uintptr(len(inputBuffer)), uintptr(unsafe.Pointer(&nr)))); err != nil {
+ return 0, err
+ }
+ return int(nr), nil
+}
+
+func getWindowsTextAttributeForAnsiValue(originalFlag WORD, defaultValue WORD, ansiValue int16) (WORD, error) {
+ flag := WORD(originalFlag)
+ if flag == 0 {
+ flag = defaultValue
+ }
+ switch ansiValue {
+ case ANSI_ATTR_RESET:
+ flag &^= COMMON_LVB_UNDERSCORE
+ flag &^= BACKGROUND_INTENSITY
+ flag = flag | FOREGROUND_INTENSITY
+ case ANSI_ATTR_INVISIBLE:
+ // TODO: how do you reset reverse?
+ case ANSI_ATTR_UNDERLINE:
+ flag = flag | COMMON_LVB_UNDERSCORE
+ case ANSI_ATTR_BLINK:
+ // seems like background intenisty is blink
+ flag = flag | BACKGROUND_INTENSITY
+ case ANSI_ATTR_UNDERLINE_OFF:
+ flag &^= COMMON_LVB_UNDERSCORE
+ case ANSI_ATTR_BLINK_OFF:
+ // seems like background intenisty is blink
+ flag &^= BACKGROUND_INTENSITY
+ case ANSI_ATTR_BOLD:
+ flag = flag | FOREGROUND_INTENSITY
+ case ANSI_ATTR_DIM:
+ flag &^= FOREGROUND_INTENSITY
+ case ANSI_ATTR_REVERSE, ANSI_ATTR_REVERSE_OFF:
+ // swap forground and background bits
+ foreground := flag & FOREGROUND_MASK_SET
+ background := flag & BACKGROUND_MASK_SET
+ flag = (flag & BACKGROUND_MASK_UNSET & FOREGROUND_MASK_UNSET) | (foreground << 4) | (background >> 4)
+
+ // FOREGROUND
+ case ANSI_FOREGROUND_DEFAULT:
+ flag = (flag & FOREGROUND_MASK_UNSET) | (defaultValue & FOREGROUND_MASK_SET)
+ case ANSI_FOREGROUND_BLACK:
+ flag = flag ^ (FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE)
+ case ANSI_FOREGROUND_RED:
+ flag = (flag & FOREGROUND_MASK_UNSET) | FOREGROUND_RED
+ case ANSI_FOREGROUND_GREEN:
+ flag = (flag & FOREGROUND_MASK_UNSET) | FOREGROUND_GREEN
+ case ANSI_FOREGROUND_YELLOW:
+ flag = (flag & FOREGROUND_MASK_UNSET) | FOREGROUND_RED | FOREGROUND_GREEN
+ case ANSI_FOREGROUND_BLUE:
+ flag = (flag & FOREGROUND_MASK_UNSET) | FOREGROUND_BLUE
+ case ANSI_FOREGROUND_MAGENTA:
+ flag = (flag & FOREGROUND_MASK_UNSET) | FOREGROUND_RED | FOREGROUND_BLUE
+ case ANSI_FOREGROUND_CYAN:
+ flag = (flag & FOREGROUND_MASK_UNSET) | FOREGROUND_GREEN | FOREGROUND_BLUE
+ case ANSI_FOREGROUND_WHITE:
+ flag = (flag & FOREGROUND_MASK_UNSET) | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE
+
+ // Background
+ case ANSI_BACKGROUND_DEFAULT:
+ // Black with no intensity
+ flag = (flag & BACKGROUND_MASK_UNSET) | (defaultValue & BACKGROUND_MASK_SET)
+ case ANSI_BACKGROUND_BLACK:
+ flag = (flag & BACKGROUND_MASK_UNSET)
+ case ANSI_BACKGROUND_RED:
+ flag = (flag & BACKGROUND_MASK_UNSET) | BACKGROUND_RED
+ case ANSI_BACKGROUND_GREEN:
+ flag = (flag & BACKGROUND_MASK_UNSET) | BACKGROUND_GREEN
+ case ANSI_BACKGROUND_YELLOW:
+ flag = (flag & BACKGROUND_MASK_UNSET) | BACKGROUND_RED | BACKGROUND_GREEN
+ case ANSI_BACKGROUND_BLUE:
+ flag = (flag & BACKGROUND_MASK_UNSET) | BACKGROUND_BLUE
+ case ANSI_BACKGROUND_MAGENTA:
+ flag = (flag & BACKGROUND_MASK_UNSET) | BACKGROUND_RED | BACKGROUND_BLUE
+ case ANSI_BACKGROUND_CYAN:
+ flag = (flag & BACKGROUND_MASK_UNSET) | BACKGROUND_GREEN | BACKGROUND_BLUE
+ case ANSI_BACKGROUND_WHITE:
+ flag = (flag & BACKGROUND_MASK_UNSET) | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE
+ }
+ return flag, nil
+}
+
+// HandleOutputCommand interpretes the Ansi commands and then makes appropriate Win32 calls
+func (term *WindowsTerminal) HandleOutputCommand(handle uintptr, command []byte) (n int, err error) {
+ // always consider all the bytes in command, processed
+ n = len(command)
+
+ parsedCommand := parseAnsiCommand(command)
+ logrus.Debugf("[windows] HandleOutputCommand: %v", parsedCommand)
+
+ // console settings changes need to happen in atomic way
+ term.outMutex.Lock()
+ defer term.outMutex.Unlock()
+
+ switch parsedCommand.Command {
+ case "m":
+ // [Value;...;Valuem
+ // Set Graphics Mode:
+ // Calls the graphics functions specified by the following values.
+ // These specified functions remain active until the next occurrence of this escape sequence.
+ // Graphics mode changes the colors and attributes of text (such as bold and underline) displayed on the screen.
+ screenBufferInfo, err := GetConsoleScreenBufferInfo(handle)
+ if err != nil {
+ return n, err
+ }
+ flag := screenBufferInfo.Attributes
+ for _, e := range parsedCommand.Parameters {
+ value, _ := strconv.ParseInt(e, 10, 16) // base 10, 16 bit
+ if value == ANSI_ATTR_RESET {
+ flag = term.screenBufferInfo.Attributes // reset
+ } else {
+ flag, err = getWindowsTextAttributeForAnsiValue(flag, term.screenBufferInfo.Attributes, int16(value))
+ if err != nil {
+ return n, err
+ }
+ }
+ }
+ if err := setConsoleTextAttribute(handle, flag); err != nil {
+ return n, err
+ }
+ case "H", "f":
+ // [line;columnH
+ // [line;columnf
+ // Moves the cursor to the specified position (coordinates).
+ // If you do not specify a position, the cursor moves to the home position at the upper-left corner of the screen (line 0, column 0).
+ screenBufferInfo, err := GetConsoleScreenBufferInfo(handle)
+ if err != nil {
+ return n, err
+ }
+ line, err := parseInt16OrDefault(parsedCommand.getParam(0), 1)
+ if err != nil {
+ return n, err
+ }
+ if line > int16(screenBufferInfo.Window.Bottom) {
+ line = int16(screenBufferInfo.Window.Bottom) + 1
+ }
+ column, err := parseInt16OrDefault(parsedCommand.getParam(1), 1)
+ if err != nil {
+ return n, err
+ }
+ if column > int16(screenBufferInfo.Window.Right) {
+ column = int16(screenBufferInfo.Window.Right) + 1
+ }
+ // The numbers are not 0 based, but 1 based
+ logrus.Debugf("[windows] HandleOutputCommmand: Moving cursor to (%v,%v)", column-1, line-1)
+ if err := setConsoleCursorPosition(handle, false, column-1, line-1); err != nil {
+ return n, err
+ }
+
+ case "A":
+ // [valueA
+ // Moves the cursor up by the specified number of lines without changing columns.
+ // If the cursor is already on the top line, ignores this sequence.
+ value, err := parseInt16OrDefault(parsedCommand.getParam(0), 1)
+ if err != nil {
+ return len(command), err
+ }
+ if err := setConsoleCursorPosition(handle, true, 0, -value); err != nil {
+ return n, err
+ }
+ case "B":
+ // [valueB
+ // Moves the cursor down by the specified number of lines without changing columns.
+ // If the cursor is already on the bottom line, ignores this sequence.
+ value, err := parseInt16OrDefault(parsedCommand.getParam(0), 1)
+ if err != nil {
+ return n, err
+ }
+ if err := setConsoleCursorPosition(handle, true, 0, value); err != nil {
+ return n, err
+ }
+ case "C":
+ // [valueC
+ // Moves the cursor forward by the specified number of columns without changing lines.
+ // If the cursor is already in the rightmost column, ignores this sequence.
+ value, err := parseInt16OrDefault(parsedCommand.getParam(0), 1)
+ if err != nil {
+ return n, err
+ }
+ if err := setConsoleCursorPosition(handle, true, value, 0); err != nil {
+ return n, err
+ }
+ case "D":
+ // [valueD
+ // Moves the cursor back by the specified number of columns without changing lines.
+ // If the cursor is already in the leftmost column, ignores this sequence.
+ value, err := parseInt16OrDefault(parsedCommand.getParam(0), 1)
+ if err != nil {
+ return n, err
+ }
+ if err := setConsoleCursorPosition(handle, true, -value, 0); err != nil {
+ return n, err
+ }
+ case "J":
+ // [J Erases from the cursor to the end of the screen, including the cursor position.
+ // [1J Erases from the beginning of the screen to the cursor, including the cursor position.
+ // [2J Erases the complete display. The cursor does not move.
+ // Clears the screen and moves the cursor to the home position (line 0, column 0).
+ value, err := parseInt16OrDefault(parsedCommand.getParam(0), 0)
+ if err != nil {
+ return n, err
+ }
+ var start COORD
+ var cursor COORD
+ var end COORD
+ screenBufferInfo, err := GetConsoleScreenBufferInfo(handle)
+ if err != nil {
+ return n, err
+ }
+ switch value {
+ case 0:
+ start = screenBufferInfo.CursorPosition
+ // end of the buffer
+ end.X = screenBufferInfo.Size.X - 1
+ end.Y = screenBufferInfo.Size.Y - 1
+ // cursor
+ cursor = screenBufferInfo.CursorPosition
+ case 1:
+
+ // start of the screen
+ start.X = 0
+ start.Y = 0
+ // end of the screen
+ end = screenBufferInfo.CursorPosition
+ // cursor
+ cursor = screenBufferInfo.CursorPosition
+ case 2:
+ // start of the screen
+ start.X = 0
+ start.Y = 0
+ // end of the buffer
+ end.X = screenBufferInfo.Size.X - 1
+ end.Y = screenBufferInfo.Size.Y - 1
+ // cursor
+ cursor.X = 0
+ cursor.Y = 0
+ }
+ if _, err := clearDisplayRange(uintptr(handle), term.screenBufferInfo.Attributes, start, end); err != nil {
+ return n, err
+ }
+ // remember the the cursor position is 1 based
+ if err := setConsoleCursorPosition(handle, false, int16(cursor.X), int16(cursor.Y)); err != nil {
+ return n, err
+ }
+
+ case "K":
+ // [K
+ // Clears all characters from the cursor position to the end of the line (including the character at the cursor position).
+ // [K Erases from the cursor to the end of the line, including the cursor position.
+ // [1K Erases from the beginning of the line to the cursor, including the cursor position.
+ // [2K Erases the complete line.
+ value, err := parseInt16OrDefault(parsedCommand.getParam(0), 0)
+ var start COORD
+ var cursor COORD
+ var end COORD
+ screenBufferInfo, err := GetConsoleScreenBufferInfo(uintptr(handle))
+ if err != nil {
+ return n, err
+ }
+ switch value {
+ case 0:
+ // start is where cursor is
+ start = screenBufferInfo.CursorPosition
+ // end of line
+ end.X = screenBufferInfo.Size.X - 1
+ end.Y = screenBufferInfo.CursorPosition.Y
+ // cursor remains the same
+ cursor = screenBufferInfo.CursorPosition
+
+ case 1:
+ // beginning of line
+ start.X = 0
+ start.Y = screenBufferInfo.CursorPosition.Y
+ // until cursor
+ end = screenBufferInfo.CursorPosition
+ // cursor remains the same
+ cursor = screenBufferInfo.CursorPosition
+ case 2:
+ // start of the line
+ start.X = 0
+ start.Y = screenBufferInfo.CursorPosition.Y - 1
+ // end of the line
+ end.X = screenBufferInfo.Size.X - 1
+ end.Y = screenBufferInfo.CursorPosition.Y - 1
+ // cursor
+ cursor.X = 0
+ cursor.Y = screenBufferInfo.CursorPosition.Y - 1
+ }
+ if _, err := clearDisplayRange(uintptr(handle), term.screenBufferInfo.Attributes, start, end); err != nil {
+ return n, err
+ }
+ // remember the the cursor position is 1 based
+ if err := setConsoleCursorPosition(uintptr(handle), false, int16(cursor.X), int16(cursor.Y)); err != nil {
+ return n, err
+ }
+
+ case "l":
+ for _, value := range parsedCommand.Parameters {
+ switch value {
+ case "?25", "25":
+ SetCursorVisible(uintptr(handle), BOOL(0))
+ case "?1049", "1049":
+ // TODO (azlinux): Restore terminal
+ case "?1", "1":
+ // If the DECCKM function is reset, then the arrow keys send ANSI cursor sequences to the host.
+ term.inputEscapeSequence = []byte(KEY_ESC_CSI)
+ }
+ }
+ case "h":
+ for _, value := range parsedCommand.Parameters {
+ switch value {
+ case "?25", "25":
+ SetCursorVisible(uintptr(handle), BOOL(1))
+ case "?1049", "1049":
+ // TODO (azlinux): Save terminal
+ case "?1", "1":
+ // If the DECCKM function is set, then the arrow keys send application sequences to the host.
+ // DECCKM (default off): When set, the cursor keys send an ESC O prefix, rather than ESC [.
+ term.inputEscapeSequence = []byte(KEY_ESC_O)
+ }
+ }
+
+ case "]":
+ /*
+ TODO (azlinux):
+ Linux Console Private CSI Sequences
+
+ The following sequences are neither ECMA-48 nor native VT102. They are
+ native to the Linux console driver. Colors are in SGR parameters: 0 =
+ black, 1 = red, 2 = green, 3 = brown, 4 = blue, 5 = magenta, 6 = cyan,
+ 7 = white.
+
+ ESC [ 1 ; n ] Set color n as the underline color
+ ESC [ 2 ; n ] Set color n as the dim color
+ ESC [ 8 ] Make the current color pair the default attributes.
+ ESC [ 9 ; n ] Set screen blank timeout to n minutes.
+ ESC [ 10 ; n ] Set bell frequency in Hz.
+ ESC [ 11 ; n ] Set bell duration in msec.
+ ESC [ 12 ; n ] Bring specified console to the front.
+ ESC [ 13 ] Unblank the screen.
+ ESC [ 14 ; n ] Set the VESA powerdown interval in minutes.
+
+ */
+ }
+ return n, nil
+}
+
+// WriteChars writes the bytes to given writer.
+func (term *WindowsTerminal) WriteChars(fd uintptr, w io.Writer, p []byte) (n int, err error) {
+ if len(p) == 0 {
+ return 0, nil
+ }
+ return w.Write(p)
+}
+
+const (
+ CAPSLOCK_ON = 0x0080 //The CAPS LOCK light is on.
+ ENHANCED_KEY = 0x0100 //The key is enhanced.
+ LEFT_ALT_PRESSED = 0x0002 //The left ALT key is pressed.
+ LEFT_CTRL_PRESSED = 0x0008 //The left CTRL key is pressed.
+ NUMLOCK_ON = 0x0020 //The NUM LOCK light is on.
+ RIGHT_ALT_PRESSED = 0x0001 //The right ALT key is pressed.
+ RIGHT_CTRL_PRESSED = 0x0004 //The right CTRL key is pressed.
+ SCROLLLOCK_ON = 0x0040 //The SCROLL LOCK light is on.
+ SHIFT_PRESSED = 0x0010 // The SHIFT key is pressed.
+)
+
+const (
+ KEY_CONTROL_PARAM_2 = ";2"
+ KEY_CONTROL_PARAM_3 = ";3"
+ KEY_CONTROL_PARAM_4 = ";4"
+ KEY_CONTROL_PARAM_5 = ";5"
+ KEY_CONTROL_PARAM_6 = ";6"
+ KEY_CONTROL_PARAM_7 = ";7"
+ KEY_CONTROL_PARAM_8 = ";8"
+ KEY_ESC_CSI = "\x1B["
+ KEY_ESC_N = "\x1BN"
+ KEY_ESC_O = "\x1BO"
+)
+
+var keyMapPrefix = map[WORD]string{
+ VK_UP: "\x1B[%sA",
+ VK_DOWN: "\x1B[%sB",
+ VK_RIGHT: "\x1B[%sC",
+ VK_LEFT: "\x1B[%sD",
+ VK_HOME: "\x1B[1%s~", // showkey shows ^[[1
+ VK_END: "\x1B[4%s~", // showkey shows ^[[4
+ VK_INSERT: "\x1B[2%s~",
+ VK_DELETE: "\x1B[3%s~",
+ VK_PRIOR: "\x1B[5%s~",
+ VK_NEXT: "\x1B[6%s~",
+ VK_F1: "",
+ VK_F2: "",
+ VK_F3: "\x1B[13%s~",
+ VK_F4: "\x1B[14%s~",
+ VK_F5: "\x1B[15%s~",
+ VK_F6: "\x1B[17%s~",
+ VK_F7: "\x1B[18%s~",
+ VK_F8: "\x1B[19%s~",
+ VK_F9: "\x1B[20%s~",
+ VK_F10: "\x1B[21%s~",
+ VK_F11: "\x1B[23%s~",
+ VK_F12: "\x1B[24%s~",
+}
+
+var arrowKeyMapPrefix = map[WORD]string{
+ VK_UP: "%s%sA",
+ VK_DOWN: "%s%sB",
+ VK_RIGHT: "%s%sC",
+ VK_LEFT: "%s%sD",
+}
+
+func getControlStateParameter(shift, alt, control, meta bool) string {
+ if shift && alt && control {
+ return KEY_CONTROL_PARAM_8
+ }
+ if alt && control {
+ return KEY_CONTROL_PARAM_7
+ }
+ if shift && control {
+ return KEY_CONTROL_PARAM_6
+ }
+ if control {
+ return KEY_CONTROL_PARAM_5
+ }
+ if shift && alt {
+ return KEY_CONTROL_PARAM_4
+ }
+ if alt {
+ return KEY_CONTROL_PARAM_3
+ }
+ if shift {
+ return KEY_CONTROL_PARAM_2
+ }
+ return ""
+}
+
+func getControlKeys(controlState DWORD) (shift, alt, control bool) {
+ shift = 0 != (controlState & SHIFT_PRESSED)
+ alt = 0 != (controlState & (LEFT_ALT_PRESSED | RIGHT_ALT_PRESSED))
+ control = 0 != (controlState & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED))
+ return shift, alt, control
+}
+
+func charSequenceForKeys(key WORD, controlState DWORD, escapeSequence []byte) string {
+ i, ok := arrowKeyMapPrefix[key]
+ if ok {
+ shift, alt, control := getControlKeys(controlState)
+ modifier := getControlStateParameter(shift, alt, control, false)
+ return fmt.Sprintf(i, escapeSequence, modifier)
+ }
+
+ i, ok = keyMapPrefix[key]
+ if ok {
+ shift, alt, control := getControlKeys(controlState)
+ modifier := getControlStateParameter(shift, alt, control, false)
+ return fmt.Sprintf(i, modifier)
+ }
+
+ return ""
+}
+
+// mapKeystokeToTerminalString maps the given input event record to string
+func mapKeystokeToTerminalString(keyEvent *KEY_EVENT_RECORD, escapeSequence []byte) string {
+ _, alt, control := getControlKeys(keyEvent.ControlKeyState)
+ if keyEvent.UnicodeChar == 0 {
+ return charSequenceForKeys(keyEvent.VirtualKeyCode, keyEvent.ControlKeyState, escapeSequence)
+ }
+ if control {
+ // TODO(azlinux): Implement following control sequences
+ // <Ctrl>-D Signals the end of input from the keyboard; also exits current shell.
+ // <Ctrl>-H Deletes the first character to the left of the cursor. Also called the ERASE key.
+ // <Ctrl>-Q Restarts printing after it has been stopped with <Ctrl>-s.
+ // <Ctrl>-S Suspends printing on the screen (does not stop the program).
+ // <Ctrl>-U Deletes all characters on the current line. Also called the KILL key.
+ // <Ctrl>-E Quits current command and creates a core
+
+ }
+ // <Alt>+Key generates ESC N Key
+ if !control && alt {
+ return KEY_ESC_N + strings.ToLower(string(keyEvent.UnicodeChar))
+ }
+ return string(keyEvent.UnicodeChar)
+}
+
+// getAvailableInputEvents polls the console for availble events
+// The function does not return until at least one input record has been read.
+func getAvailableInputEvents(handle uintptr, inputEvents []INPUT_RECORD) (n int, err error) {
+ // TODO(azlinux): Why is there a for loop? Seems to me, that `n` cannot be negative. - tibor
+ for {
+ // Read number of console events available
+ n, err = readConsoleInputKey(handle, inputEvents)
+ if err != nil || n >= 0 {
+ return n, err
+ }
+ }
+}
+
+// getTranslatedKeyCodes converts the input events into the string of characters
+// The ansi escape sequence are used to map key strokes to the strings
+func getTranslatedKeyCodes(inputEvents []INPUT_RECORD, escapeSequence []byte) string {
+ var buf bytes.Buffer
+ for i := 0; i < len(inputEvents); i++ {
+ input := inputEvents[i]
+ if input.EventType == KEY_EVENT && input.KeyEvent.KeyDown != 0 {
+ keyString := mapKeystokeToTerminalString(&input.KeyEvent, escapeSequence)
+ buf.WriteString(keyString)
+ }
+ }
+ return buf.String()
+}
+
+// ReadChars reads the characters from the given reader
+func (term *WindowsTerminal) ReadChars(fd uintptr, r io.Reader, p []byte) (n int, err error) {
+ for term.inputSize == 0 {
+ nr, err := getAvailableInputEvents(fd, term.inputEvents)
+ if nr == 0 && nil != err {
+ return n, err
+ }
+ if nr > 0 {
+ keyCodes := getTranslatedKeyCodes(term.inputEvents[:nr], term.inputEscapeSequence)
+ term.inputSize = copy(term.inputBuffer, keyCodes)
+ }
+ }
+ n = copy(p, term.inputBuffer[:term.inputSize])
+ term.inputSize -= n
+ return n, nil
+}
+
+// HandleInputSequence interprets the input sequence command
+func (term *WindowsTerminal) HandleInputSequence(fd uintptr, command []byte) (n int, err error) {
+ return 0, nil
+}
+
+func marshal(c COORD) uintptr {
+ return uintptr(*((*DWORD)(unsafe.Pointer(&c))))
+}
+
+// IsConsole returns true if the given file descriptor is a terminal.
+// -- The code assumes that GetConsoleMode will return an error for file descriptors that are not a console.
+func IsConsole(fd uintptr) bool {
+ _, e := GetConsoleMode(fd)
+ return e == nil
+}
diff --git a/pkg/term/winconsole/console_windows_test.go b/pkg/term/winconsole/console_windows_test.go
new file mode 100644
index 0000000000..ee9d96834b
--- /dev/null
+++ b/pkg/term/winconsole/console_windows_test.go
@@ -0,0 +1,232 @@
+// +build windows
+
+package winconsole
+
+import (
+ "fmt"
+ "testing"
+)
+
+func helpsTestParseInt16OrDefault(t *testing.T, expectedValue int16, shouldFail bool, input string, defaultValue int16, format string, args ...string) {
+ value, err := parseInt16OrDefault(input, defaultValue)
+ if nil != err && !shouldFail {
+ t.Errorf("Unexpected error returned %v", err)
+ t.Errorf(format, args)
+ }
+ if nil == err && shouldFail {
+ t.Errorf("Should have failed as expected\n\tReturned value = %d", value)
+ t.Errorf(format, args)
+ }
+ if expectedValue != value {
+ t.Errorf("The value returned does not macth expected\n\tExpected:%v\n\t:Actual%v", expectedValue, value)
+ t.Errorf(format, args)
+ }
+}
+
+func TestParseInt16OrDefault(t *testing.T) {
+ // empty string
+ helpsTestParseInt16OrDefault(t, 0, false, "", 0, "Empty string returns default")
+ helpsTestParseInt16OrDefault(t, 2, false, "", 2, "Empty string returns default")
+
+ // normal case
+ helpsTestParseInt16OrDefault(t, 0, false, "0", 0, "0 handled correctly")
+ helpsTestParseInt16OrDefault(t, 111, false, "111", 2, "Normal")
+ helpsTestParseInt16OrDefault(t, 111, false, "+111", 2, "+N")
+ helpsTestParseInt16OrDefault(t, -111, false, "-111", 2, "-N")
+ helpsTestParseInt16OrDefault(t, 0, false, "+0", 11, "+0")
+ helpsTestParseInt16OrDefault(t, 0, false, "-0", 12, "-0")
+
+ // ill formed strings
+ helpsTestParseInt16OrDefault(t, 0, true, "abc", 0, "Invalid string")
+ helpsTestParseInt16OrDefault(t, 42, true, "+= 23", 42, "Invalid string")
+ helpsTestParseInt16OrDefault(t, 42, true, "123.45", 42, "float like")
+
+}
+
+func helpsTestGetNumberOfChars(t *testing.T, expected uint32, fromCoord COORD, toCoord COORD, screenSize COORD, format string, args ...interface{}) {
+ actual := getNumberOfChars(fromCoord, toCoord, screenSize)
+ mesg := fmt.Sprintf(format, args)
+ assertTrue(t, expected == actual, fmt.Sprintf("%s Expected=%d, Actual=%d, Parameters = { fromCoord=%+v, toCoord=%+v, screenSize=%+v", mesg, expected, actual, fromCoord, toCoord, screenSize))
+}
+
+func TestGetNumberOfChars(t *testing.T) {
+ // Note: The columns and lines are 0 based
+ // Also that interval is "inclusive" means will have both start and end chars
+ // This test only tests the number opf characters being written
+
+ // all four corners
+ maxWindow := COORD{X: 80, Y: 50}
+ leftTop := COORD{X: 0, Y: 0}
+ rightTop := COORD{X: 79, Y: 0}
+ leftBottom := COORD{X: 0, Y: 49}
+ rightBottom := COORD{X: 79, Y: 49}
+
+ // same position
+ helpsTestGetNumberOfChars(t, 1, COORD{X: 1, Y: 14}, COORD{X: 1, Y: 14}, COORD{X: 80, Y: 50}, "Same position random line")
+
+ // four corners
+ helpsTestGetNumberOfChars(t, 1, leftTop, leftTop, maxWindow, "Same position- leftTop")
+ helpsTestGetNumberOfChars(t, 1, rightTop, rightTop, maxWindow, "Same position- rightTop")
+ helpsTestGetNumberOfChars(t, 1, leftBottom, leftBottom, maxWindow, "Same position- leftBottom")
+ helpsTestGetNumberOfChars(t, 1, rightBottom, rightBottom, maxWindow, "Same position- rightBottom")
+
+ // from this char to next char on same line
+ helpsTestGetNumberOfChars(t, 2, COORD{X: 0, Y: 0}, COORD{X: 1, Y: 0}, maxWindow, "Next position on same line")
+ helpsTestGetNumberOfChars(t, 2, COORD{X: 1, Y: 14}, COORD{X: 2, Y: 14}, maxWindow, "Next position on same line")
+
+ // from this char to next 10 chars on same line
+ helpsTestGetNumberOfChars(t, 11, COORD{X: 0, Y: 0}, COORD{X: 10, Y: 0}, maxWindow, "Next position on same line")
+ helpsTestGetNumberOfChars(t, 11, COORD{X: 1, Y: 14}, COORD{X: 11, Y: 14}, maxWindow, "Next position on same line")
+
+ helpsTestGetNumberOfChars(t, 5, COORD{X: 3, Y: 11}, COORD{X: 7, Y: 11}, maxWindow, "To and from on same line")
+
+ helpsTestGetNumberOfChars(t, 8, COORD{X: 0, Y: 34}, COORD{X: 7, Y: 34}, maxWindow, "Start of line to middle")
+ helpsTestGetNumberOfChars(t, 4, COORD{X: 76, Y: 34}, COORD{X: 79, Y: 34}, maxWindow, "Middle to end of line")
+
+ // multiple lines - 1
+ helpsTestGetNumberOfChars(t, 81, COORD{X: 0, Y: 0}, COORD{X: 0, Y: 1}, maxWindow, "one line below same X")
+ helpsTestGetNumberOfChars(t, 81, COORD{X: 10, Y: 10}, COORD{X: 10, Y: 11}, maxWindow, "one line below same X")
+
+ // multiple lines - 2
+ helpsTestGetNumberOfChars(t, 161, COORD{X: 0, Y: 0}, COORD{X: 0, Y: 2}, maxWindow, "one line below same X")
+ helpsTestGetNumberOfChars(t, 161, COORD{X: 10, Y: 10}, COORD{X: 10, Y: 12}, maxWindow, "one line below same X")
+
+ // multiple lines - 3
+ helpsTestGetNumberOfChars(t, 241, COORD{X: 0, Y: 0}, COORD{X: 0, Y: 3}, maxWindow, "one line below same X")
+ helpsTestGetNumberOfChars(t, 241, COORD{X: 10, Y: 10}, COORD{X: 10, Y: 13}, maxWindow, "one line below same X")
+
+ // full line
+ helpsTestGetNumberOfChars(t, 80, COORD{X: 0, Y: 0}, COORD{X: 79, Y: 0}, maxWindow, "Full line - first")
+ helpsTestGetNumberOfChars(t, 80, COORD{X: 0, Y: 23}, COORD{X: 79, Y: 23}, maxWindow, "Full line - random")
+ helpsTestGetNumberOfChars(t, 80, COORD{X: 0, Y: 49}, COORD{X: 79, Y: 49}, maxWindow, "Full line - last")
+
+ // full screen
+ helpsTestGetNumberOfChars(t, 80*50, leftTop, rightBottom, maxWindow, "full screen")
+
+ helpsTestGetNumberOfChars(t, 80*50-1, COORD{X: 1, Y: 0}, rightBottom, maxWindow, "dropping first char to, end of screen")
+ helpsTestGetNumberOfChars(t, 80*50-2, COORD{X: 2, Y: 0}, rightBottom, maxWindow, "dropping first two char to, end of screen")
+
+ helpsTestGetNumberOfChars(t, 80*50-1, leftTop, COORD{X: 78, Y: 49}, maxWindow, "from start of screen, till last char-1")
+ helpsTestGetNumberOfChars(t, 80*50-2, leftTop, COORD{X: 77, Y: 49}, maxWindow, "from start of screen, till last char-2")
+
+ helpsTestGetNumberOfChars(t, 80*50-5, COORD{X: 4, Y: 0}, COORD{X: 78, Y: 49}, COORD{X: 80, Y: 50}, "from start of screen+4, till last char-1")
+ helpsTestGetNumberOfChars(t, 80*50-6, COORD{X: 4, Y: 0}, COORD{X: 77, Y: 49}, COORD{X: 80, Y: 50}, "from start of screen+4, till last char-2")
+}
+
+var allForeground = []int16{
+ ANSI_FOREGROUND_BLACK,
+ ANSI_FOREGROUND_RED,
+ ANSI_FOREGROUND_GREEN,
+ ANSI_FOREGROUND_YELLOW,
+ ANSI_FOREGROUND_BLUE,
+ ANSI_FOREGROUND_MAGENTA,
+ ANSI_FOREGROUND_CYAN,
+ ANSI_FOREGROUND_WHITE,
+ ANSI_FOREGROUND_DEFAULT,
+}
+var allBackground = []int16{
+ ANSI_BACKGROUND_BLACK,
+ ANSI_BACKGROUND_RED,
+ ANSI_BACKGROUND_GREEN,
+ ANSI_BACKGROUND_YELLOW,
+ ANSI_BACKGROUND_BLUE,
+ ANSI_BACKGROUND_MAGENTA,
+ ANSI_BACKGROUND_CYAN,
+ ANSI_BACKGROUND_WHITE,
+ ANSI_BACKGROUND_DEFAULT,
+}
+
+func maskForeground(flag WORD) WORD {
+ return flag & FOREGROUND_MASK_UNSET
+}
+
+func onlyForeground(flag WORD) WORD {
+ return flag & FOREGROUND_MASK_SET
+}
+
+func maskBackground(flag WORD) WORD {
+ return flag & BACKGROUND_MASK_UNSET
+}
+
+func onlyBackground(flag WORD) WORD {
+ return flag & BACKGROUND_MASK_SET
+}
+
+func helpsTestGetWindowsTextAttributeForAnsiValue(t *testing.T, oldValue WORD /*, expected WORD*/, ansi int16, onlyMask WORD, restMask WORD) WORD {
+ actual, err := getWindowsTextAttributeForAnsiValue(oldValue, FOREGROUND_MASK_SET, ansi)
+ assertTrue(t, nil == err, "Should be no error")
+ // assert that other bits are not affected
+ if 0 != oldValue {
+ assertTrue(t, (actual&restMask) == (oldValue&restMask), "The operation should not have affected other bits actual=%X oldValue=%X ansi=%d", actual, oldValue, ansi)
+ }
+ return actual
+}
+
+func TestBackgroundForAnsiValue(t *testing.T) {
+ // Check that nothing else changes
+ // background changes
+ for _, state1 := range allBackground {
+ for _, state2 := range allBackground {
+ flag := WORD(0)
+ flag = helpsTestGetWindowsTextAttributeForAnsiValue(t, flag, state1, BACKGROUND_MASK_SET, BACKGROUND_MASK_UNSET)
+ flag = helpsTestGetWindowsTextAttributeForAnsiValue(t, flag, state2, BACKGROUND_MASK_SET, BACKGROUND_MASK_UNSET)
+ }
+ }
+ // cummulative bcakground changes
+ for _, state1 := range allBackground {
+ flag := WORD(0)
+ for _, state2 := range allBackground {
+ flag = helpsTestGetWindowsTextAttributeForAnsiValue(t, flag, state1, BACKGROUND_MASK_SET, BACKGROUND_MASK_UNSET)
+ flag = helpsTestGetWindowsTextAttributeForAnsiValue(t, flag, state2, BACKGROUND_MASK_SET, BACKGROUND_MASK_UNSET)
+ }
+ }
+ // change background after foreground
+ for _, state1 := range allForeground {
+ for _, state2 := range allBackground {
+ flag := WORD(0)
+ flag = helpsTestGetWindowsTextAttributeForAnsiValue(t, flag, state1, FOREGROUND_MASK_SET, FOREGROUND_MASK_UNSET)
+ flag = helpsTestGetWindowsTextAttributeForAnsiValue(t, flag, state2, BACKGROUND_MASK_SET, BACKGROUND_MASK_UNSET)
+ }
+ }
+ // change background after change cumulative
+ for _, state1 := range allForeground {
+ flag := WORD(0)
+ for _, state2 := range allBackground {
+ flag = helpsTestGetWindowsTextAttributeForAnsiValue(t, flag, state1, FOREGROUND_MASK_SET, FOREGROUND_MASK_UNSET)
+ flag = helpsTestGetWindowsTextAttributeForAnsiValue(t, flag, state2, BACKGROUND_MASK_SET, BACKGROUND_MASK_UNSET)
+ }
+ }
+}
+
+func TestForegroundForAnsiValue(t *testing.T) {
+ // Check that nothing else changes
+ for _, state1 := range allForeground {
+ for _, state2 := range allForeground {
+ flag := WORD(0)
+ flag = helpsTestGetWindowsTextAttributeForAnsiValue(t, flag, state1, FOREGROUND_MASK_SET, FOREGROUND_MASK_UNSET)
+ flag = helpsTestGetWindowsTextAttributeForAnsiValue(t, flag, state2, FOREGROUND_MASK_SET, FOREGROUND_MASK_UNSET)
+ }
+ }
+
+ for _, state1 := range allForeground {
+ flag := WORD(0)
+ for _, state2 := range allForeground {
+ flag = helpsTestGetWindowsTextAttributeForAnsiValue(t, flag, state1, FOREGROUND_MASK_SET, FOREGROUND_MASK_UNSET)
+ flag = helpsTestGetWindowsTextAttributeForAnsiValue(t, flag, state2, FOREGROUND_MASK_SET, FOREGROUND_MASK_UNSET)
+ }
+ }
+ for _, state1 := range allBackground {
+ for _, state2 := range allForeground {
+ flag := WORD(0)
+ flag = helpsTestGetWindowsTextAttributeForAnsiValue(t, flag, state1, BACKGROUND_MASK_SET, BACKGROUND_MASK_UNSET)
+ flag = helpsTestGetWindowsTextAttributeForAnsiValue(t, flag, state2, FOREGROUND_MASK_SET, FOREGROUND_MASK_UNSET)
+ }
+ }
+ for _, state1 := range allBackground {
+ flag := WORD(0)
+ for _, state2 := range allForeground {
+ flag = helpsTestGetWindowsTextAttributeForAnsiValue(t, flag, state1, BACKGROUND_MASK_SET, BACKGROUND_MASK_UNSET)
+ flag = helpsTestGetWindowsTextAttributeForAnsiValue(t, flag, state2, FOREGROUND_MASK_SET, FOREGROUND_MASK_UNSET)
+ }
+ }
+}
diff --git a/pkg/term/winconsole/term_emulator.go b/pkg/term/winconsole/term_emulator.go
new file mode 100644
index 0000000000..2d5edc0390
--- /dev/null
+++ b/pkg/term/winconsole/term_emulator.go
@@ -0,0 +1,234 @@
+package winconsole
+
+import (
+ "fmt"
+ "io"
+ "strconv"
+ "strings"
+)
+
+// http://manpages.ubuntu.com/manpages/intrepid/man4/console_codes.4.html
+const (
+ ANSI_ESCAPE_PRIMARY = 0x1B
+ ANSI_ESCAPE_SECONDARY = 0x5B
+ ANSI_COMMAND_FIRST = 0x40
+ ANSI_COMMAND_LAST = 0x7E
+ ANSI_PARAMETER_SEP = ";"
+ ANSI_CMD_G0 = '('
+ ANSI_CMD_G1 = ')'
+ ANSI_CMD_G2 = '*'
+ ANSI_CMD_G3 = '+'
+ ANSI_CMD_DECPNM = '>'
+ ANSI_CMD_DECPAM = '='
+ ANSI_CMD_OSC = ']'
+ ANSI_CMD_STR_TERM = '\\'
+ ANSI_BEL = 0x07
+ KEY_EVENT = 1
+)
+
+// Interface that implements terminal handling
+type terminalEmulator interface {
+ HandleOutputCommand(fd uintptr, command []byte) (n int, err error)
+ HandleInputSequence(fd uintptr, command []byte) (n int, err error)
+ WriteChars(fd uintptr, w io.Writer, p []byte) (n int, err error)
+ ReadChars(fd uintptr, w io.Reader, p []byte) (n int, err error)
+}
+
+type terminalWriter struct {
+ wrappedWriter io.Writer
+ emulator terminalEmulator
+ command []byte
+ inSequence bool
+ fd uintptr
+}
+
+type terminalReader struct {
+ wrappedReader io.ReadCloser
+ emulator terminalEmulator
+ command []byte
+ inSequence bool
+ fd uintptr
+}
+
+// http://manpages.ubuntu.com/manpages/intrepid/man4/console_codes.4.html
+func isAnsiCommandChar(b byte) bool {
+ switch {
+ case ANSI_COMMAND_FIRST <= b && b <= ANSI_COMMAND_LAST && b != ANSI_ESCAPE_SECONDARY:
+ return true
+ case b == ANSI_CMD_G1 || b == ANSI_CMD_OSC || b == ANSI_CMD_DECPAM || b == ANSI_CMD_DECPNM:
+ // non-CSI escape sequence terminator
+ return true
+ case b == ANSI_CMD_STR_TERM || b == ANSI_BEL:
+ // String escape sequence terminator
+ return true
+ }
+ return false
+}
+
+func isCharacterSelectionCmdChar(b byte) bool {
+ return (b == ANSI_CMD_G0 || b == ANSI_CMD_G1 || b == ANSI_CMD_G2 || b == ANSI_CMD_G3)
+}
+
+func isXtermOscSequence(command []byte, current byte) bool {
+ return (len(command) >= 2 && command[0] == ANSI_ESCAPE_PRIMARY && command[1] == ANSI_CMD_OSC && current != ANSI_BEL)
+}
+
+// Write writes len(p) bytes from p to the underlying data stream.
+// http://golang.org/pkg/io/#Writer
+func (tw *terminalWriter) Write(p []byte) (n int, err error) {
+ if len(p) == 0 {
+ return 0, nil
+ }
+ if tw.emulator == nil {
+ return tw.wrappedWriter.Write(p)
+ }
+ // Emulate terminal by extracting commands and executing them
+ totalWritten := 0
+ start := 0 // indicates start of the next chunk
+ end := len(p)
+ for current := 0; current < end; current++ {
+ if tw.inSequence {
+ // inside escape sequence
+ tw.command = append(tw.command, p[current])
+ if isAnsiCommandChar(p[current]) {
+ if !isXtermOscSequence(tw.command, p[current]) {
+ // found the last command character.
+ // Now we have a complete command.
+ nchar, err := tw.emulator.HandleOutputCommand(tw.fd, tw.command)
+ totalWritten += nchar
+ if err != nil {
+ return totalWritten, err
+ }
+
+ // clear the command
+ // don't include current character again
+ tw.command = tw.command[:0]
+ start = current + 1
+ tw.inSequence = false
+ }
+ }
+ } else {
+ if p[current] == ANSI_ESCAPE_PRIMARY {
+ // entering escape sequnce
+ tw.inSequence = true
+ // indicates end of "normal sequence", write whatever you have so far
+ if len(p[start:current]) > 0 {
+ nw, err := tw.emulator.WriteChars(tw.fd, tw.wrappedWriter, p[start:current])
+ totalWritten += nw
+ if err != nil {
+ return totalWritten, err
+ }
+ }
+ // include the current character as part of the next sequence
+ tw.command = append(tw.command, p[current])
+ }
+ }
+ }
+ // note that so far, start of the escape sequence triggers writing out of bytes to console.
+ // For the part _after_ the end of last escape sequence, it is not written out yet. So write it out
+ if !tw.inSequence {
+ // assumption is that we can't be inside sequence and therefore command should be empty
+ if len(p[start:]) > 0 {
+ nw, err := tw.emulator.WriteChars(tw.fd, tw.wrappedWriter, p[start:])
+ totalWritten += nw
+ if err != nil {
+ return totalWritten, err
+ }
+ }
+ }
+ return totalWritten, nil
+
+}
+
+// Read reads up to len(p) bytes into p.
+// http://golang.org/pkg/io/#Reader
+func (tr *terminalReader) Read(p []byte) (n int, err error) {
+ //Implementations of Read are discouraged from returning a zero byte count
+ // with a nil error, except when len(p) == 0.
+ if len(p) == 0 {
+ return 0, nil
+ }
+ if nil == tr.emulator {
+ return tr.readFromWrappedReader(p)
+ }
+ return tr.emulator.ReadChars(tr.fd, tr.wrappedReader, p)
+}
+
+// Close the underlying stream
+func (tr *terminalReader) Close() (err error) {
+ return tr.wrappedReader.Close()
+}
+
+func (tr *terminalReader) readFromWrappedReader(p []byte) (n int, err error) {
+ return tr.wrappedReader.Read(p)
+}
+
+type ansiCommand struct {
+ CommandBytes []byte
+ Command string
+ Parameters []string
+ IsSpecial bool
+}
+
+func parseAnsiCommand(command []byte) *ansiCommand {
+ if isCharacterSelectionCmdChar(command[1]) {
+ // Is Character Set Selection commands
+ return &ansiCommand{
+ CommandBytes: command,
+ Command: string(command),
+ IsSpecial: true,
+ }
+ }
+ // last char is command character
+ lastCharIndex := len(command) - 1
+
+ retValue := &ansiCommand{
+ CommandBytes: command,
+ Command: string(command[lastCharIndex]),
+ IsSpecial: false,
+ }
+ // more than a single escape
+ if lastCharIndex != 0 {
+ start := 1
+ // skip if double char escape sequence
+ if command[0] == ANSI_ESCAPE_PRIMARY && command[1] == ANSI_ESCAPE_SECONDARY {
+ start++
+ }
+ // convert this to GetNextParam method
+ retValue.Parameters = strings.Split(string(command[start:lastCharIndex]), ANSI_PARAMETER_SEP)
+ }
+ return retValue
+}
+
+func (c *ansiCommand) getParam(index int) string {
+ if len(c.Parameters) > index {
+ return c.Parameters[index]
+ }
+ return ""
+}
+
+func (ac *ansiCommand) String() string {
+ return fmt.Sprintf("0x%v \"%v\" (\"%v\")",
+ bytesToHex(ac.CommandBytes),
+ ac.Command,
+ strings.Join(ac.Parameters, "\",\""))
+}
+
+func bytesToHex(b []byte) string {
+ hex := make([]string, len(b))
+ for i, ch := range b {
+ hex[i] = fmt.Sprintf("%X", ch)
+ }
+ return strings.Join(hex, "")
+}
+
+func parseInt16OrDefault(s string, defaultValue int16) (n int16, err error) {
+ if s == "" {
+ return defaultValue, nil
+ }
+ parsedValue, err := strconv.ParseInt(s, 10, 16)
+ if err != nil {
+ return defaultValue, err
+ }
+ return int16(parsedValue), nil
+}
diff --git a/pkg/term/winconsole/term_emulator_test.go b/pkg/term/winconsole/term_emulator_test.go
new file mode 100644
index 0000000000..65de5a7933
--- /dev/null
+++ b/pkg/term/winconsole/term_emulator_test.go
@@ -0,0 +1,388 @@
+package winconsole
+
+import (
+ "bytes"
+ "fmt"
+ "io"
+ "io/ioutil"
+ "testing"
+)
+
+const (
+ WRITE_OPERATION = iota
+ COMMAND_OPERATION = iota
+)
+
+var languages = []string{
+ "БългарÑки",
+ "Català",
+ "Čeština",
+ "Ελληνικά",
+ "Español",
+ "Esperanto",
+ "Euskara",
+ "Français",
+ "Galego",
+ "한국어",
+ "ქáƒáƒ áƒ—ული",
+ "Latviešu",
+ "Lietuvių",
+ "Magyar",
+ "Nederlands",
+ "日本語",
+ "Norsk bokmål",
+ "Norsk nynorsk",
+ "Polski",
+ "Português",
+ "Română",
+ "РуÑÑкий",
+ "SlovenÄina",
+ "SlovenÅ¡Äina",
+ "СрпÑки",
+ "ÑрпÑкохрватÑки",
+ "Suomi",
+ "Svenska",
+ "ไทย",
+ "Tiếng Việt",
+ "Türkçe",
+ "УкраїнÑька",
+ "中文",
+}
+
+// Mock terminal handler object
+type mockTerminal struct {
+ OutputCommandSequence []terminalOperation
+}
+
+// Used for recording the callback data
+type terminalOperation struct {
+ Operation int
+ Data []byte
+ Str string
+}
+
+func (mt *mockTerminal) record(operation int, data []byte) {
+ op := terminalOperation{
+ Operation: operation,
+ Data: make([]byte, len(data)),
+ }
+ copy(op.Data, data)
+ op.Str = string(op.Data)
+ mt.OutputCommandSequence = append(mt.OutputCommandSequence, op)
+}
+
+func (mt *mockTerminal) HandleOutputCommand(fd uintptr, command []byte) (n int, err error) {
+ mt.record(COMMAND_OPERATION, command)
+ return len(command), nil
+}
+
+func (mt *mockTerminal) HandleInputSequence(fd uintptr, command []byte) (n int, err error) {
+ return 0, nil
+}
+
+func (mt *mockTerminal) WriteChars(fd uintptr, w io.Writer, p []byte) (n int, err error) {
+ mt.record(WRITE_OPERATION, p)
+ return len(p), nil
+}
+
+func (mt *mockTerminal) ReadChars(fd uintptr, w io.Reader, p []byte) (n int, err error) {
+ return len(p), nil
+}
+
+func assertTrue(t *testing.T, cond bool, format string, args ...interface{}) {
+ if !cond {
+ t.Errorf(format, args...)
+ }
+}
+
+// reflect.DeepEqual does not provide detailed information as to what excatly failed.
+func assertBytesEqual(t *testing.T, expected, actual []byte, format string, args ...interface{}) {
+ match := true
+ mismatchIndex := 0
+ if len(expected) == len(actual) {
+ for i := 0; i < len(expected); i++ {
+ if expected[i] != actual[i] {
+ match = false
+ mismatchIndex = i
+ break
+ }
+ }
+ } else {
+ match = false
+ t.Errorf("Lengths don't match Expected=%d Actual=%d", len(expected), len(actual))
+ }
+ if !match {
+ t.Errorf("Mismatch at index %d ", mismatchIndex)
+ t.Errorf("\tActual String = %s", string(actual))
+ t.Errorf("\tExpected String = %s", string(expected))
+ t.Errorf("\tActual = %v", actual)
+ t.Errorf("\tExpected = %v", expected)
+ t.Errorf(format, args)
+ }
+}
+
+// Just to make sure :)
+func TestAssertEqualBytes(t *testing.T) {
+ data := []byte{9, 9, 1, 1, 1, 9, 9}
+ assertBytesEqual(t, data, data, "Self")
+ assertBytesEqual(t, data[1:4], data[1:4], "Self")
+ assertBytesEqual(t, []byte{1, 1}, []byte{1, 1}, "Simple match")
+ assertBytesEqual(t, []byte{1, 2, 3}, []byte{1, 2, 3}, "content mismatch")
+ assertBytesEqual(t, []byte{1, 1, 1}, data[2:5], "slice match")
+}
+
+/*
+func TestAssertEqualBytesNegative(t *testing.T) {
+ AssertBytesEqual(t, []byte{1, 1}, []byte{1}, "Length mismatch")
+ AssertBytesEqual(t, []byte{1, 1}, []byte{1}, "Length mismatch")
+ AssertBytesEqual(t, []byte{1, 2, 3}, []byte{1, 1, 1}, "content mismatch")
+}*/
+
+// Checks that the calls recieved
+func assertHandlerOutput(t *testing.T, mock *mockTerminal, plainText string, commands ...string) {
+ text := make([]byte, 0, 3*len(plainText))
+ cmdIndex := 0
+ for opIndex := 0; opIndex < len(mock.OutputCommandSequence); opIndex++ {
+ op := mock.OutputCommandSequence[opIndex]
+ if op.Operation == WRITE_OPERATION {
+ t.Logf("\nThe data is[%d] == %s", opIndex, string(op.Data))
+ text = append(text[:], op.Data...)
+ } else {
+ assertTrue(t, mock.OutputCommandSequence[opIndex].Operation == COMMAND_OPERATION, "Operation should be command : %s", fmt.Sprintf("%+v", mock))
+ assertBytesEqual(t, StringToBytes(commands[cmdIndex]), mock.OutputCommandSequence[opIndex].Data, "Command data should match")
+ cmdIndex++
+ }
+ }
+ assertBytesEqual(t, StringToBytes(plainText), text, "Command data should match %#v", mock)
+}
+
+func StringToBytes(str string) []byte {
+ bytes := make([]byte, len(str))
+ copy(bytes[:], str)
+ return bytes
+}
+
+func TestParseAnsiCommand(t *testing.T) {
+ // Note: if the parameter does not exist then the empty value is returned
+
+ c := parseAnsiCommand(StringToBytes("\x1Bm"))
+ assertTrue(t, c.Command == "m", "Command should be m")
+ assertTrue(t, "" == c.getParam(0), "should return empty string")
+ assertTrue(t, "" == c.getParam(1), "should return empty string")
+
+ // Escape sequence - ESC[
+ c = parseAnsiCommand(StringToBytes("\x1B[m"))
+ assertTrue(t, c.Command == "m", "Command should be m")
+ assertTrue(t, "" == c.getParam(0), "should return empty string")
+ assertTrue(t, "" == c.getParam(1), "should return empty string")
+
+ // Escape sequence With empty parameters- ESC[
+ c = parseAnsiCommand(StringToBytes("\x1B[;m"))
+ assertTrue(t, c.Command == "m", "Command should be m")
+ assertTrue(t, "" == c.getParam(0), "should return empty string")
+ assertTrue(t, "" == c.getParam(1), "should return empty string")
+ assertTrue(t, "" == c.getParam(2), "should return empty string")
+
+ // Escape sequence With empty muliple parameters- ESC[
+ c = parseAnsiCommand(StringToBytes("\x1B[;;m"))
+ assertTrue(t, c.Command == "m", "Command should be m")
+ assertTrue(t, "" == c.getParam(0), "")
+ assertTrue(t, "" == c.getParam(1), "")
+ assertTrue(t, "" == c.getParam(2), "")
+
+ // Escape sequence With muliple parameters- ESC[
+ c = parseAnsiCommand(StringToBytes("\x1B[1;2;3m"))
+ assertTrue(t, c.Command == "m", "Command should be m")
+ assertTrue(t, "1" == c.getParam(0), "")
+ assertTrue(t, "2" == c.getParam(1), "")
+ assertTrue(t, "3" == c.getParam(2), "")
+
+ // Escape sequence With muliple parameters- some missing
+ c = parseAnsiCommand(StringToBytes("\x1B[1;;3;;;6m"))
+ assertTrue(t, c.Command == "m", "Command should be m")
+ assertTrue(t, "1" == c.getParam(0), "")
+ assertTrue(t, "" == c.getParam(1), "")
+ assertTrue(t, "3" == c.getParam(2), "")
+ assertTrue(t, "" == c.getParam(3), "")
+ assertTrue(t, "" == c.getParam(4), "")
+ assertTrue(t, "6" == c.getParam(5), "")
+}
+
+func newBufferedMockTerm() (stdOut io.Writer, stdErr io.Writer, stdIn io.ReadCloser, mock *mockTerminal) {
+ var input bytes.Buffer
+ var output bytes.Buffer
+ var err bytes.Buffer
+
+ mock = &mockTerminal{
+ OutputCommandSequence: make([]terminalOperation, 0, 256),
+ }
+
+ stdOut = &terminalWriter{
+ wrappedWriter: &output,
+ emulator: mock,
+ command: make([]byte, 0, 256),
+ }
+ stdErr = &terminalWriter{
+ wrappedWriter: &err,
+ emulator: mock,
+ command: make([]byte, 0, 256),
+ }
+ stdIn = &terminalReader{
+ wrappedReader: ioutil.NopCloser(&input),
+ emulator: mock,
+ command: make([]byte, 0, 256),
+ }
+
+ return
+}
+
+func TestOutputSimple(t *testing.T) {
+ stdOut, _, _, mock := newBufferedMockTerm()
+
+ stdOut.Write(StringToBytes("Hello world"))
+ stdOut.Write(StringToBytes("\x1BmHello again"))
+
+ assertTrue(t, mock.OutputCommandSequence[0].Operation == WRITE_OPERATION, "Operation should be Write : %#v", mock)
+ assertBytesEqual(t, StringToBytes("Hello world"), mock.OutputCommandSequence[0].Data, "Write data should match")
+
+ assertTrue(t, mock.OutputCommandSequence[1].Operation == COMMAND_OPERATION, "Operation should be command : %+v", mock)
+ assertBytesEqual(t, StringToBytes("\x1Bm"), mock.OutputCommandSequence[1].Data, "Command data should match")
+
+ assertTrue(t, mock.OutputCommandSequence[2].Operation == WRITE_OPERATION, "Operation should be Write : %#v", mock)
+ assertBytesEqual(t, StringToBytes("Hello again"), mock.OutputCommandSequence[2].Data, "Write data should match")
+}
+
+func TestOutputSplitCommand(t *testing.T) {
+ stdOut, _, _, mock := newBufferedMockTerm()
+
+ stdOut.Write(StringToBytes("Hello world\x1B[1;2;3"))
+ stdOut.Write(StringToBytes("mHello again"))
+
+ assertTrue(t, mock.OutputCommandSequence[0].Operation == WRITE_OPERATION, "Operation should be Write : %#v", mock)
+ assertBytesEqual(t, StringToBytes("Hello world"), mock.OutputCommandSequence[0].Data, "Write data should match")
+
+ assertTrue(t, mock.OutputCommandSequence[1].Operation == COMMAND_OPERATION, "Operation should be command : %+v", mock)
+ assertBytesEqual(t, StringToBytes("\x1B[1;2;3m"), mock.OutputCommandSequence[1].Data, "Command data should match")
+
+ assertTrue(t, mock.OutputCommandSequence[2].Operation == WRITE_OPERATION, "Operation should be Write : %#v", mock)
+ assertBytesEqual(t, StringToBytes("Hello again"), mock.OutputCommandSequence[2].Data, "Write data should match")
+}
+
+func TestOutputMultipleCommands(t *testing.T) {
+ stdOut, _, _, mock := newBufferedMockTerm()
+
+ stdOut.Write(StringToBytes("Hello world"))
+ stdOut.Write(StringToBytes("\x1B[1;2;3m"))
+ stdOut.Write(StringToBytes("\x1B[J"))
+ stdOut.Write(StringToBytes("Hello again"))
+
+ assertTrue(t, mock.OutputCommandSequence[0].Operation == WRITE_OPERATION, "Operation should be Write : %#v", mock)
+ assertBytesEqual(t, StringToBytes("Hello world"), mock.OutputCommandSequence[0].Data, "Write data should match")
+
+ assertTrue(t, mock.OutputCommandSequence[1].Operation == COMMAND_OPERATION, "Operation should be command : %+v", mock)
+ assertBytesEqual(t, StringToBytes("\x1B[1;2;3m"), mock.OutputCommandSequence[1].Data, "Command data should match")
+
+ assertTrue(t, mock.OutputCommandSequence[2].Operation == COMMAND_OPERATION, "Operation should be command : %+v", mock)
+ assertBytesEqual(t, StringToBytes("\x1B[J"), mock.OutputCommandSequence[2].Data, "Command data should match")
+
+ assertTrue(t, mock.OutputCommandSequence[3].Operation == WRITE_OPERATION, "Operation should be Write : %#v", mock)
+ assertBytesEqual(t, StringToBytes("Hello again"), mock.OutputCommandSequence[3].Data, "Write data should match")
+}
+
+// Splits the given data in two chunks , makes two writes and checks the split data is parsed correctly
+// checks output write/command is passed to handler correctly
+func helpsTestOutputSplitChunksAtIndex(t *testing.T, i int, data []byte) {
+ t.Logf("\ni=%d", i)
+ stdOut, _, _, mock := newBufferedMockTerm()
+
+ t.Logf("\nWriting chunk[0] == %s", string(data[:i]))
+ t.Logf("\nWriting chunk[1] == %s", string(data[i:]))
+ stdOut.Write(data[:i])
+ stdOut.Write(data[i:])
+
+ assertTrue(t, mock.OutputCommandSequence[0].Operation == WRITE_OPERATION, "Operation should be Write : %#v", mock)
+ assertBytesEqual(t, data[:i], mock.OutputCommandSequence[0].Data, "Write data should match")
+
+ assertTrue(t, mock.OutputCommandSequence[1].Operation == WRITE_OPERATION, "Operation should be Write : %#v", mock)
+ assertBytesEqual(t, data[i:], mock.OutputCommandSequence[1].Data, "Write data should match")
+}
+
+// Splits the given data in three chunks , makes three writes and checks the split data is parsed correctly
+// checks output write/command is passed to handler correctly
+func helpsTestOutputSplitThreeChunksAtIndex(t *testing.T, data []byte, i int, j int) {
+ stdOut, _, _, mock := newBufferedMockTerm()
+
+ t.Logf("\nWriting chunk[0] == %s", string(data[:i]))
+ t.Logf("\nWriting chunk[1] == %s", string(data[i:j]))
+ t.Logf("\nWriting chunk[2] == %s", string(data[j:]))
+ stdOut.Write(data[:i])
+ stdOut.Write(data[i:j])
+ stdOut.Write(data[j:])
+
+ assertTrue(t, mock.OutputCommandSequence[0].Operation == WRITE_OPERATION, "Operation should be Write : %#v", mock)
+ assertBytesEqual(t, data[:i], mock.OutputCommandSequence[0].Data, "Write data should match")
+
+ assertTrue(t, mock.OutputCommandSequence[1].Operation == WRITE_OPERATION, "Operation should be Write : %#v", mock)
+ assertBytesEqual(t, data[i:j], mock.OutputCommandSequence[1].Data, "Write data should match")
+
+ assertTrue(t, mock.OutputCommandSequence[2].Operation == WRITE_OPERATION, "Operation should be Write : %#v", mock)
+ assertBytesEqual(t, data[j:], mock.OutputCommandSequence[2].Data, "Write data should match")
+}
+
+// Splits the output into two parts and tests all such possible pairs
+func helpsTestOutputSplitChunks(t *testing.T, data []byte) {
+ for i := 1; i < len(data)-1; i++ {
+ helpsTestOutputSplitChunksAtIndex(t, i, data)
+ }
+}
+
+// Splits the output in three parts and tests all such possible triples
+func helpsTestOutputSplitThreeChunks(t *testing.T, data []byte) {
+ for i := 1; i < len(data)-2; i++ {
+ for j := i + 1; j < len(data)-1; j++ {
+ helpsTestOutputSplitThreeChunksAtIndex(t, data, i, j)
+ }
+ }
+}
+
+func helpsTestOutputSplitCommandsAtIndex(t *testing.T, data []byte, i int, plainText string, commands ...string) {
+ t.Logf("\ni=%d", i)
+ stdOut, _, _, mock := newBufferedMockTerm()
+
+ stdOut.Write(data[:i])
+ stdOut.Write(data[i:])
+ assertHandlerOutput(t, mock, plainText, commands...)
+}
+
+func helpsTestOutputSplitCommands(t *testing.T, data []byte, plainText string, commands ...string) {
+ for i := 1; i < len(data)-1; i++ {
+ helpsTestOutputSplitCommandsAtIndex(t, data, i, plainText, commands...)
+ }
+}
+
+func injectCommandAt(data string, i int, command string) string {
+ retValue := make([]byte, len(data)+len(command)+4)
+ retValue = append(retValue, data[:i]...)
+ retValue = append(retValue, data[i:]...)
+ return string(retValue)
+}
+
+func TestOutputSplitChunks(t *testing.T) {
+ data := StringToBytes("qwertyuiopasdfghjklzxcvbnm")
+ helpsTestOutputSplitChunks(t, data)
+ helpsTestOutputSplitChunks(t, StringToBytes("BBBBB"))
+ helpsTestOutputSplitThreeChunks(t, StringToBytes("ABCDE"))
+}
+
+func TestOutputSplitChunksIncludingCommands(t *testing.T) {
+ helpsTestOutputSplitCommands(t, StringToBytes("Hello world.\x1B[mHello again."), "Hello world.Hello again.", "\x1B[m")
+ helpsTestOutputSplitCommandsAtIndex(t, StringToBytes("Hello world.\x1B[mHello again."), 2, "Hello world.Hello again.", "\x1B[m")
+}
+
+func TestSplitChunkUnicode(t *testing.T) {
+ for _, l := range languages {
+ data := StringToBytes(l)
+ helpsTestOutputSplitChunks(t, data)
+ helpsTestOutputSplitThreeChunks(t, data)
+ }
+}
diff --git a/pkg/testutils/MAINTAINERS b/pkg/testutils/MAINTAINERS
deleted file mode 100644
index f2e8c52e51..0000000000
--- a/pkg/testutils/MAINTAINERS
+++ /dev/null
@@ -1,2 +0,0 @@
-Solomon Hykes <s@docker.com> (@shykes)
-Cristian Staretu <cristian.staretu@gmail.com> (@unclejack)
diff --git a/utils/timeoutconn.go b/pkg/timeoutconn/timeoutconn.go
index a3231c7ee3..3a554559a4 100644
--- a/utils/timeoutconn.go
+++ b/pkg/timeoutconn/timeoutconn.go
@@ -1,21 +1,21 @@
-package utils
+package timeoutconn
import (
"net"
"time"
)
-func NewTimeoutConn(conn net.Conn, timeout time.Duration) net.Conn {
- return &TimeoutConn{conn, timeout}
+func New(netConn net.Conn, timeout time.Duration) net.Conn {
+ return &conn{netConn, timeout}
}
// A net.Conn that sets a deadline for every Read or Write operation
-type TimeoutConn struct {
+type conn struct {
net.Conn
timeout time.Duration
}
-func (c *TimeoutConn) Read(b []byte) (int, error) {
+func (c *conn) Read(b []byte) (int, error) {
if c.timeout > 0 {
err := c.Conn.SetReadDeadline(time.Now().Add(c.timeout))
if err != nil {
diff --git a/utils/timeoutconn_test.go b/pkg/timeoutconn/timeoutconn_test.go
index d07b96cc06..46d6477cce 100644
--- a/utils/timeoutconn_test.go
+++ b/pkg/timeoutconn/timeoutconn_test.go
@@ -1,4 +1,4 @@
-package utils
+package timeoutconn
import (
"bufio"
@@ -10,7 +10,7 @@ import (
"time"
)
-func TestTimeoutConnRead(t *testing.T) {
+func TestRead(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "hello")
}))
@@ -19,7 +19,7 @@ func TestTimeoutConnRead(t *testing.T) {
if err != nil {
t.Fatalf("failed to create connection to %q: %v", ts.URL, err)
}
- tconn := NewTimeoutConn(conn, 1*time.Second)
+ tconn := New(conn, 1*time.Second)
if _, err = bufio.NewReader(tconn).ReadString('\n'); err == nil {
t.Fatalf("expected timeout error, got none")
diff --git a/pkg/timeutils/MAINTAINERS b/pkg/timeutils/MAINTAINERS
deleted file mode 100644
index 6dde4769d7..0000000000
--- a/pkg/timeutils/MAINTAINERS
+++ /dev/null
@@ -1 +0,0 @@
-Cristian Staretu <cristian.staretu@gmail.com> (@unclejack)
diff --git a/pkg/truncindex/MAINTAINERS b/pkg/truncindex/MAINTAINERS
deleted file mode 100644
index 6dde4769d7..0000000000
--- a/pkg/truncindex/MAINTAINERS
+++ /dev/null
@@ -1 +0,0 @@
-Cristian Staretu <cristian.staretu@gmail.com> (@unclejack)
diff --git a/pkg/truncindex/truncindex.go b/pkg/truncindex/truncindex.go
index eec5597306..73c7e24fb4 100644
--- a/pkg/truncindex/truncindex.go
+++ b/pkg/truncindex/truncindex.go
@@ -10,10 +10,8 @@ import (
)
var (
- // ErrNoID is thrown when attempting to use empty prefixes
- ErrNoID = errors.New("prefix can't be empty")
- // ErrDuplicateID is thrown when a duplicated id was found
- ErrDuplicateID = errors.New("multiple IDs were found")
+ ErrEmptyPrefix = errors.New("Prefix can't be empty")
+ ErrAmbiguousPrefix = errors.New("Multiple IDs found with provided prefix")
)
func init() {
@@ -47,7 +45,7 @@ func (idx *TruncIndex) addID(id string) error {
return fmt.Errorf("illegal character: ' '")
}
if id == "" {
- return ErrNoID
+ return ErrEmptyPrefix
}
if _, exists := idx.ids[id]; exists {
return fmt.Errorf("id already exists: '%s'", id)
@@ -87,26 +85,26 @@ func (idx *TruncIndex) Delete(id string) error {
// Get retrieves an ID from the TruncIndex. If there are multiple IDs
// with the given prefix, an error is thrown.
func (idx *TruncIndex) Get(s string) (string, error) {
- idx.RLock()
- defer idx.RUnlock()
+ if s == "" {
+ return "", ErrEmptyPrefix
+ }
var (
id string
)
- if s == "" {
- return "", ErrNoID
- }
subTreeVisitFunc := func(prefix patricia.Prefix, item patricia.Item) error {
if id != "" {
// we haven't found the ID if there are two or more IDs
id = ""
- return ErrDuplicateID
+ return ErrAmbiguousPrefix
}
id = string(prefix)
return nil
}
+ idx.RLock()
+ defer idx.RUnlock()
if err := idx.trie.VisitSubtree(patricia.Prefix(s), subTreeVisitFunc); err != nil {
- return "", fmt.Errorf("no such id: %s", s)
+ return "", err
}
if id != "" {
return id, nil
diff --git a/pkg/truncindex/truncindex_test.go b/pkg/truncindex/truncindex_test.go
index 32c41c7d76..9286534280 100644
--- a/pkg/truncindex/truncindex_test.go
+++ b/pkg/truncindex/truncindex_test.go
@@ -4,7 +4,7 @@ import (
"math/rand"
"testing"
- "github.com/docker/docker/utils"
+ "github.com/docker/docker/pkg/common"
)
// Test the behavior of TruncIndex, an index for querying IDs from a non-conflicting prefix.
@@ -59,6 +59,11 @@ func TestTruncIndex(t *testing.T) {
assertIndexGet(t, index, id[:4], "", true)
assertIndexGet(t, index, id[:1], "", true)
+ // An ambiguous id prefix should return an error
+ if _, err := index.Get(id[:4]); err == nil || err == nil {
+ t.Fatal("An ambiguous id prefix should return an error")
+ }
+
// 7 characters should NOT conflict
assertIndexGet(t, index, id[:7], id, false)
assertIndexGet(t, index, id2[:7], id2, false)
@@ -106,7 +111,7 @@ func assertIndexGet(t *testing.T, index *TruncIndex, input, expectedResult strin
func BenchmarkTruncIndexAdd100(b *testing.B) {
var testSet []string
for i := 0; i < 100; i++ {
- testSet = append(testSet, utils.GenerateRandomID())
+ testSet = append(testSet, common.GenerateRandomID())
}
b.ResetTimer()
for i := 0; i < b.N; i++ {
@@ -122,7 +127,7 @@ func BenchmarkTruncIndexAdd100(b *testing.B) {
func BenchmarkTruncIndexAdd250(b *testing.B) {
var testSet []string
for i := 0; i < 250; i++ {
- testSet = append(testSet, utils.GenerateRandomID())
+ testSet = append(testSet, common.GenerateRandomID())
}
b.ResetTimer()
for i := 0; i < b.N; i++ {
@@ -138,7 +143,7 @@ func BenchmarkTruncIndexAdd250(b *testing.B) {
func BenchmarkTruncIndexAdd500(b *testing.B) {
var testSet []string
for i := 0; i < 500; i++ {
- testSet = append(testSet, utils.GenerateRandomID())
+ testSet = append(testSet, common.GenerateRandomID())
}
b.ResetTimer()
for i := 0; i < b.N; i++ {
@@ -155,7 +160,7 @@ func BenchmarkTruncIndexGet100(b *testing.B) {
var testSet []string
var testKeys []string
for i := 0; i < 100; i++ {
- testSet = append(testSet, utils.GenerateRandomID())
+ testSet = append(testSet, common.GenerateRandomID())
}
index := NewTruncIndex([]string{})
for _, id := range testSet {
@@ -179,7 +184,7 @@ func BenchmarkTruncIndexGet250(b *testing.B) {
var testSet []string
var testKeys []string
for i := 0; i < 250; i++ {
- testSet = append(testSet, utils.GenerateRandomID())
+ testSet = append(testSet, common.GenerateRandomID())
}
index := NewTruncIndex([]string{})
for _, id := range testSet {
@@ -203,7 +208,7 @@ func BenchmarkTruncIndexGet500(b *testing.B) {
var testSet []string
var testKeys []string
for i := 0; i < 500; i++ {
- testSet = append(testSet, utils.GenerateRandomID())
+ testSet = append(testSet, common.GenerateRandomID())
}
index := NewTruncIndex([]string{})
for _, id := range testSet {
@@ -226,7 +231,7 @@ func BenchmarkTruncIndexGet500(b *testing.B) {
func BenchmarkTruncIndexDelete100(b *testing.B) {
var testSet []string
for i := 0; i < 100; i++ {
- testSet = append(testSet, utils.GenerateRandomID())
+ testSet = append(testSet, common.GenerateRandomID())
}
b.ResetTimer()
for i := 0; i < b.N; i++ {
@@ -249,7 +254,7 @@ func BenchmarkTruncIndexDelete100(b *testing.B) {
func BenchmarkTruncIndexDelete250(b *testing.B) {
var testSet []string
for i := 0; i < 250; i++ {
- testSet = append(testSet, utils.GenerateRandomID())
+ testSet = append(testSet, common.GenerateRandomID())
}
b.ResetTimer()
for i := 0; i < b.N; i++ {
@@ -272,7 +277,7 @@ func BenchmarkTruncIndexDelete250(b *testing.B) {
func BenchmarkTruncIndexDelete500(b *testing.B) {
var testSet []string
for i := 0; i < 500; i++ {
- testSet = append(testSet, utils.GenerateRandomID())
+ testSet = append(testSet, common.GenerateRandomID())
}
b.ResetTimer()
for i := 0; i < b.N; i++ {
@@ -295,7 +300,7 @@ func BenchmarkTruncIndexDelete500(b *testing.B) {
func BenchmarkTruncIndexNew100(b *testing.B) {
var testSet []string
for i := 0; i < 100; i++ {
- testSet = append(testSet, utils.GenerateRandomID())
+ testSet = append(testSet, common.GenerateRandomID())
}
b.ResetTimer()
for i := 0; i < b.N; i++ {
@@ -306,7 +311,7 @@ func BenchmarkTruncIndexNew100(b *testing.B) {
func BenchmarkTruncIndexNew250(b *testing.B) {
var testSet []string
for i := 0; i < 250; i++ {
- testSet = append(testSet, utils.GenerateRandomID())
+ testSet = append(testSet, common.GenerateRandomID())
}
b.ResetTimer()
for i := 0; i < b.N; i++ {
@@ -317,7 +322,7 @@ func BenchmarkTruncIndexNew250(b *testing.B) {
func BenchmarkTruncIndexNew500(b *testing.B) {
var testSet []string
for i := 0; i < 500; i++ {
- testSet = append(testSet, utils.GenerateRandomID())
+ testSet = append(testSet, common.GenerateRandomID())
}
b.ResetTimer()
for i := 0; i < b.N; i++ {
@@ -329,7 +334,7 @@ func BenchmarkTruncIndexAddGet100(b *testing.B) {
var testSet []string
var testKeys []string
for i := 0; i < 500; i++ {
- id := utils.GenerateRandomID()
+ id := common.GenerateRandomID()
testSet = append(testSet, id)
l := rand.Intn(12) + 12
testKeys = append(testKeys, id[:l])
@@ -354,7 +359,7 @@ func BenchmarkTruncIndexAddGet250(b *testing.B) {
var testSet []string
var testKeys []string
for i := 0; i < 500; i++ {
- id := utils.GenerateRandomID()
+ id := common.GenerateRandomID()
testSet = append(testSet, id)
l := rand.Intn(12) + 12
testKeys = append(testKeys, id[:l])
@@ -379,7 +384,7 @@ func BenchmarkTruncIndexAddGet500(b *testing.B) {
var testSet []string
var testKeys []string
for i := 0; i < 500; i++ {
- id := utils.GenerateRandomID()
+ id := common.GenerateRandomID()
testSet = append(testSet, id)
l := rand.Intn(12) + 12
testKeys = append(testKeys, id[:l])
diff --git a/pkg/ulimit/ulimit.go b/pkg/ulimit/ulimit.go
new file mode 100644
index 0000000000..2375315e3e
--- /dev/null
+++ b/pkg/ulimit/ulimit.go
@@ -0,0 +1,106 @@
+package ulimit
+
+import (
+ "fmt"
+ "strconv"
+ "strings"
+)
+
+// Human friendly version of Rlimit
+type Ulimit struct {
+ Name string
+ Hard int64
+ Soft int64
+}
+
+type Rlimit struct {
+ Type int `json:"type,omitempty"`
+ Hard uint64 `json:"hard,omitempty"`
+ Soft uint64 `json:"soft,omitempty"`
+}
+
+const (
+ // magic numbers for making the syscall
+ // some of these are defined in the syscall package, but not all.
+ // Also since Windows client doesn't get access to the syscall package, need to
+ // define these here
+ RLIMIT_AS = 9
+ RLIMIT_CORE = 4
+ RLIMIT_CPU = 0
+ RLIMIT_DATA = 2
+ RLIMIT_FSIZE = 1
+ RLIMIT_LOCKS = 10
+ RLIMIT_MEMLOCK = 8
+ RLIMIT_MSGQUEUE = 12
+ RLIMIT_NICE = 13
+ RLIMIT_NOFILE = 7
+ RLIMIT_NPROC = 6
+ RLIMIT_RSS = 5
+ RLIMIT_RTPRIO = 14
+ RLIMIT_RTTIME = 15
+ RLIMIT_SIGPENDING = 11
+ RLIMIT_STACK = 3
+)
+
+var ulimitNameMapping = map[string]int{
+ //"as": RLIMIT_AS, // Disbaled since this doesn't seem usable with the way Docker inits a container.
+ "core": RLIMIT_CORE,
+ "cpu": RLIMIT_CPU,
+ "data": RLIMIT_DATA,
+ "fsize": RLIMIT_FSIZE,
+ "locks": RLIMIT_LOCKS,
+ "memlock": RLIMIT_MEMLOCK,
+ "msgqueue": RLIMIT_MSGQUEUE,
+ "nice": RLIMIT_NICE,
+ "nofile": RLIMIT_NOFILE,
+ "nproc": RLIMIT_NPROC,
+ "rss": RLIMIT_RSS,
+ "rtprio": RLIMIT_RTPRIO,
+ "rttime": RLIMIT_RTTIME,
+ "sigpending": RLIMIT_SIGPENDING,
+ "stack": RLIMIT_STACK,
+}
+
+func Parse(val string) (*Ulimit, error) {
+ parts := strings.SplitN(val, "=", 2)
+ if len(parts) != 2 {
+ return nil, fmt.Errorf("invalid ulimit argument: %s", val)
+ }
+
+ if _, exists := ulimitNameMapping[parts[0]]; !exists {
+ return nil, fmt.Errorf("invalid ulimit type: %s", parts[0])
+ }
+
+ limitVals := strings.SplitN(parts[1], ":", 2)
+ if len(limitVals) > 2 {
+ return nil, fmt.Errorf("too many limit value arguments - %s, can only have up to two, `soft[:hard]`", parts[1])
+ }
+
+ soft, err := strconv.ParseInt(limitVals[0], 10, 64)
+ if err != nil {
+ return nil, err
+ }
+
+ hard := soft // in case no hard was set
+ if len(limitVals) == 2 {
+ hard, err = strconv.ParseInt(limitVals[1], 10, 64)
+ }
+ if soft > hard {
+ return nil, fmt.Errorf("ulimit soft limit must be less than or equal to hard limit: %d > %d", soft, hard)
+ }
+
+ return &Ulimit{Name: parts[0], Soft: soft, Hard: hard}, nil
+}
+
+func (u *Ulimit) GetRlimit() (*Rlimit, error) {
+ t, exists := ulimitNameMapping[u.Name]
+ if !exists {
+ return nil, fmt.Errorf("invalid ulimit name %s", u.Name)
+ }
+
+ return &Rlimit{Type: t, Soft: uint64(u.Soft), Hard: uint64(u.Hard)}, nil
+}
+
+func (u *Ulimit) String() string {
+ return fmt.Sprintf("%s=%s:%s", u.Name, u.Soft, u.Hard)
+}
diff --git a/pkg/ulimit/ulimit_test.go b/pkg/ulimit/ulimit_test.go
new file mode 100644
index 0000000000..419b5e0407
--- /dev/null
+++ b/pkg/ulimit/ulimit_test.go
@@ -0,0 +1,41 @@
+package ulimit
+
+import "testing"
+
+func TestParseInvalidLimitType(t *testing.T) {
+ if _, err := Parse("notarealtype=1024:1024"); err == nil {
+ t.Fatalf("expected error on invalid ulimit type")
+ }
+}
+
+func TestParseBadFormat(t *testing.T) {
+ if _, err := Parse("nofile:1024:1024"); err == nil {
+ t.Fatal("expected error on bad syntax")
+ }
+
+ if _, err := Parse("nofile"); err == nil {
+ t.Fatal("expected error on bad syntax")
+ }
+
+ if _, err := Parse("nofile="); err == nil {
+ t.Fatal("expected error on bad syntax")
+ }
+ if _, err := Parse("nofile=:"); err == nil {
+ t.Fatal("expected error on bad syntax")
+ }
+ if _, err := Parse("nofile=:1024"); err == nil {
+ t.Fatal("expected error on bad syntax")
+ }
+}
+
+func TestParseHardLessThanSoft(t *testing.T) {
+ if _, err := Parse("nofile:1024:1"); err == nil {
+ t.Fatal("expected error on hard limit less than soft limit")
+ }
+}
+
+func TestParseInvalidValueType(t *testing.T) {
+ if _, err := Parse("nofile:asdf"); err == nil {
+ t.Fatal("expected error on bad value type")
+ }
+}
diff --git a/pkg/units/MAINTAINERS b/pkg/units/MAINTAINERS
deleted file mode 100644
index 96abeae570..0000000000
--- a/pkg/units/MAINTAINERS
+++ /dev/null
@@ -1,2 +0,0 @@
-Victor Vieux <vieux@docker.com> (@vieux)
-Jessie Frazelle <jess@docker.com> (@jfrazelle)
diff --git a/project/ISSUE-TRIAGE.md b/project/ISSUE-TRIAGE.md
new file mode 100644
index 0000000000..528dea9c60
--- /dev/null
+++ b/project/ISSUE-TRIAGE.md
@@ -0,0 +1,104 @@
+Triaging of issue
+------------------
+
+Triage provides an important way to contribute to an open source project. Triage helps ensure issues resolve quickly by:
+
+- Describing the issue's intent and purpose is conveyed precisely. This is necessary because it can be difficult for an issue to explain how an end user experiences an problem and what actions they took.
+
+- Giving a contributor the information they need before they commit to resolving an issue.
+
+- Lowering the issue count by preventing duplicate issues.
+
+- Streamling the development process by preventing duplicate discussions.
+
+If you don't have time to code, consider helping with triage. The community will thank you for saving them time by spending some of yours.
+
+### Step 1: Ensure the issue contains basic information
+
+Before triaging an issue very far, make sure that the issue's author provided the standard issue information. This will help you make an educated recommendation on how this to categorize the issue. Standard information that *must* be included in most issues are things such as:
+
+- the output of `docker version`
+- the output of `docker info`
+- the output of `uname -a`
+- a reproducible case if this is a bug, Dockerfiles FTW
+- host distribution and version ( ubuntu 14.04, RHEL, fedora 21 )
+- page URL if this is a docs issue
+
+Depending on the issue, you might not feel all this information is needed. Use your best judgement. If you cannot triage an issue using what its author provided, explain kindly to the author that they must provide the above information to clarify the problem.
+
+If the author provides the standard information but you are still unable to triage the issue, request additional information. Do this kindly and politely because you are asking for more of the author's time.
+
+If the author does not respond requested information within the timespan of a week, close the issue with a kind note stating that the author can request for the issue to be
+reopened when the necessary information is provided.
+
+### Step 2: Apply the template
+
+When triaging, use the standard template below. You should cut and place the template in the issue's description.
+The template helps other reviewers find key information in an issue. For example, using a template saves a
+potential contributor from wading though 100s of comments to find a proposed solution at the very end. When adding
+the template to the issue's description also add any required labels to the issue for the classification and difficulty.
+
+Here is a sample summary for an [issue](https://github.com/docker/docker/issues/10545).
+
+```
+**Summary**: docker rm can return a non-zero exit code if the container does not
+exist and it is not easy to parse the error message.
+
+**Proposed solution**:
+
+docker rm should have consistent exit codes for different types of errors so
+that the user can easily script and know the reason why the command failed.
+
+```
+
+### Step 3: Classify the Issue
+
+Classifications help both to inform readers about an issue's priority and how to resolve it.
+This is also helpful for identifying new, critical issues. "Kinds of" are
+applied to the issue or pull request using labels. You can apply one or more labels.
+
+
+Kinds of classifications:
+
+| Kind | Description |
+|------------------|---------------------------------------------------------------------------------------------------------------------------------|
+| kind/enhancement | Enhancement are not bugs or new features but can drastically improve usability or performance of a project component. |
+| kind/cleanup | Refactoring code or otherwise clarifying documentation. |
+| kind/content | Content that is not documentation such as help or error messages. |
+| kind/graphics | Work involving graphics skill |
+| kind/regression | Regressions are usually easy fixes as hopefully the action worked previously and git history can be used to propose a solution. |
+| kind/bug | Bugs are bugs. The cause may or may not be known at triage time so debugging should be taken account into the time estimate. |
+| kind/feature | Functionality or other elements that the project does not currently support. Features are new and shinny. |
+| kind/question | Contains a user or contributor question requiring a response. |
+| kind/usecase | A description of a user or contributor situation requiring a response perhaps in code or documentation. |
+| kind/writing | Writing documentation, man pages, articles, blogs, or other significant word-driven task. |
+| kind/test | Tests or test infrastructure needs adding or updating. |
+
+
+Contributors can add labels by using a `+kind/bug` in an issue or pull request comment.
+
+### Step 4: Estimate the experience level required
+
+Experience level is a way for a contributor to find an issue based on their
+skill set. Experience types are applied to the issue or pull request using
+labels.
+
+| Level | Experience level guideline |
+|------------------|--------------------------------------------------------------------------------------------------------------------------|
+| exp/beginner | You have made less than 10 contributions in your life time to any open source project. |
+| exp/novice | You have made more than 10 contributions to an open source project or at least 5 contributions to Docker. |
+| exp/proficient | You have made more than 5 contributions to Docker which amount to at least 200 code lines or 1000 documentation lines. |
+| exp/expert | You have made less than 20 commits to Docker which amount to 500-1000 code lines or 1000-3000 documentation lines. |
+| exp/master | You have made more than 20 commits to Docker and greater than 1000 code lines or 3000 documentation lines. |
+
+As the table states, these labels are meant as guidelines. You might have
+written a whole plugin for Docker in a personal project and never contributed to
+Docker. With that kind of experience, you could take on an <strong
+class="gh-label expert">exp/expert</strong> or <strong class="gh-label
+master">exp/master</strong> level task.
+
+Contributors can add labels by using a `+exp/expert` format in issue comment.
+
+
+And that's it. That should be all the information required for a new or existing contributor to come in an resolve an issue.
+
diff --git a/project/MAINTAINERS b/project/MAINTAINERS
deleted file mode 100644
index 15e4433e8b..0000000000
--- a/project/MAINTAINERS
+++ /dev/null
@@ -1,4 +0,0 @@
-Tianon Gravi <admwiggin@gmail.com> (@tianon)
-Cristian Staretu <cristian.staretu@gmail.com> (@unclejack)
-Tibor Vass <teabee89@gmail.com> (@tiborvass)
-dind: Jerome Petazzoni <jerome@docker.com> (@jpetazzo)
diff --git a/project/PRINCIPLES.md b/project/PRINCIPLES.md
index e59c167598..53f03018ec 100644
--- a/project/PRINCIPLES.md
+++ b/project/PRINCIPLES.md
@@ -6,7 +6,7 @@ In the design and development of Docker we try to follow these principles:
* Don't try to replace every tool. Instead, be an ingredient to improve them.
* Less code is better.
-* Less components is better. Do you really need to add one more class?
+* Fewer components are better. Do you really need to add one more class?
* 50 lines of straightforward, readable code is better than 10 lines of magic that nobody can understand.
* Don't do later what you can do now. "//FIXME: refactor" is not acceptable in new code.
* When hesitating between 2 options, choose the one that is easier to reverse.
diff --git a/project/RELEASE-CHECKLIST.md b/project/RELEASE-CHECKLIST.md
index 317c917e54..d9382b901c 100644
--- a/project/RELEASE-CHECKLIST.md
+++ b/project/RELEASE-CHECKLIST.md
@@ -126,8 +126,12 @@ a count, add a simple `| wc -l`.
### 3. Change the contents of the VERSION file
+Before the big thing, you'll want to make successive release candidates and get
+people to test. The release candidate number `N` should be part of the version:
+
```bash
-echo ${VERSION#v} > VERSION
+export RC_VERSION=${VERSION}-rcN
+echo ${RC_VERSION#v} > VERSION
```
### 4. Test the docs
@@ -162,11 +166,10 @@ That last command will give you the proper link to visit to ensure that you
open the PR against the "release" branch instead of accidentally against
"master" (like so many brave souls before you already have).
-### 6. Get 2 other maintainers to validate the pull request
-
-### 7. Publish binaries
+### 6. Publish release candidate binaries
-To run this you will need access to the release credentials. Get them from the Core maintainers.
+To run this you will need access to the release credentials. Get them from the
+Core maintainers.
Replace "..." with the respective credentials:
@@ -182,17 +185,23 @@ docker run \
hack/release.sh
```
-It will run the test suite, build the binaries and packages,
-and upload to the specified bucket (you should use test.docker.com for
-general testing, and once everything is fine, switch to get.docker.com as
-noted below).
+It will run the test suite, build the binaries and packages, and upload to the
+specified bucket, so this is a good time to verify that you're running against
+**test**.docker.com.
After the binaries and packages are uploaded to test.docker.com, make sure
they get tested in both Ubuntu and Debian for any obvious installation
issues or runtime issues.
-Announcing on IRC in both `#docker` and `#docker-dev` is a great way to get
-help testing! An easy way to get some useful links for sharing:
+If everything looks good, it's time to create a git tag for this candidate:
+
+```bash
+git tag -a $RC_VERSION -m $RC_VERSION bump_$VERSION
+git push origin $RC_VERSION
+```
+
+Announcing on multiple medias is the best way to get some help testing! An easy
+way to get some useful links for sharing:
```bash
echo "Ubuntu/Debian: https://test.docker.com/ubuntu or curl -sSL https://test.docker.com/ | sh"
@@ -202,21 +211,15 @@ echo "Darwin/OSX 32bit client binary: https://test.docker.com/builds/Darwin/i386
echo "Linux 64bit tgz: https://test.docker.com/builds/Linux/x86_64/docker-${VERSION#v}.tgz"
```
-Once they're tested and reasonably believed to be working, run against
-get.docker.com:
+We recommend announcing the release candidate on:
-```bash
-docker run \
- -e AWS_S3_BUCKET=get.docker.com \
- -e AWS_ACCESS_KEY="..." \
- -e AWS_SECRET_KEY="..." \
- -e GPG_PASSPHRASE="..." \
- -i -t --privileged \
- docker \
- hack/release.sh
-```
+- IRC on #docker, #docker-dev, #docker-maintainers
+- In a comment on the pull request to notify subscribed people on GitHub
+- The [docker-dev](https://groups.google.com/forum/#!forum/docker-dev) group
+- The [docker-maintainers](https://groups.google.com/a/dockerproject.org/forum/#!forum/maintainers) group
+- Any social media that can bring some attention to the release candidate
-### 8. Breakathon
+### 7. Iterate on successive release candidates
Spend several days along with the community explicitly investing time and
resources to try and break Docker in every possible way, documenting any
@@ -232,6 +235,74 @@ by the book.
Any issues found may still remain issues for this release, but they should be
documented and give appropriate warnings.
+During this phase, the `bump_$VERSION` branch will keep evolving as you will
+produce new release candidates. The frequency of new candidates is up to the
+release manager: use your best judgement taking into account the severity of
+reported issues, testers availability, and time to scheduled release date.
+
+Each time you'll want to produce a new release candidate, you will start by
+adding commits to the branch, usually by cherry-picking from master:
+
+```bash
+git cherry-pick -x -m0 <commit_id>
+```
+
+You want your "bump commit" (the one that updates the CHANGELOG and VERSION
+files) to remain on top, so you'll have to `git rebase -i` to bring it back up.
+
+Now that your bump commit is back on top, you will need to update the CHANGELOG
+file (if appropriate for this particular release candidate), and update the
+VERSION file to increment the RC number:
+
+```bash
+export RC_VERSION=$VERSION-rcN
+echo $RC_VERSION > VERSION
+```
+
+You can now amend your last commit and update the bump branch:
+
+```bash
+git commit --amend
+git push -f $GITHUBUSER bump_$VERSION
+```
+
+Repeat step 6 to tag the code, publish new binaries, announce availability, and
+get help testing.
+
+### 8. Finalize the bump branch
+
+When you're happy with the quality of a release candidate, you can move on and
+create the real thing.
+
+You will first have to amend the "bump commit" to drop the release candidate
+suffix in the VERSION file:
+
+```bash
+echo $VERSION > VERSION
+git add VERSION
+git commit --amend
+```
+
+You will then repeat step 6 to publish the binaries to test
+
+### 9. Get 2 other maintainers to validate the pull request
+
+### 10. Publish final binaries
+
+Once they're tested and reasonably believed to be working, run against
+get.docker.com:
+
+```bash
+docker run \
+ -e AWS_S3_BUCKET=get.docker.com \
+ -e AWS_ACCESS_KEY="..." \
+ -e AWS_SECRET_KEY="..." \
+ -e GPG_PASSPHRASE="..." \
+ -i -t --privileged \
+ docker \
+ hack/release.sh
+```
+
### 9. Apply tag
It's very important that we don't make the tag until after the official
@@ -279,17 +350,13 @@ distributed CDN system) is flushed. The `make docs-release` command will do this
_if_ the `DISTRIBUTION_ID` is set correctly - this will take at least 15 minutes to run
and you can check its progress with the CDN Cloudfront Chrome addin.
-### 12. Create a new pull request to merge release back into master
+### 12. Create a new pull request to merge your bump commit back into master
```bash
git checkout master
git fetch
git reset --hard origin/master
-git checkout -b merge_release_$VERSION
-git merge origin/release
-echo ${VERSION#v}-dev > VERSION
-git add VERSION
-git commit -m "Change version to $(cat VERSION)"
+git cherry-pick $VERSION
git push $GITHUBUSER merge_release_$VERSION
echo "https://github.com/$GITHUBUSER/docker/compare/docker:master...$GITHUBUSER:merge_release_$VERSION?expand=1"
```
diff --git a/project/TOOLS.md b/project/TOOLS.md
new file mode 100644
index 0000000000..f057ccd2be
--- /dev/null
+++ b/project/TOOLS.md
@@ -0,0 +1,74 @@
+# Tools
+
+This page describes the tools we use and infrastructure that is in place for
+the Docker project.
+
+### CI
+
+The Docker project uses [Jenkins](https://jenkins.dockerproject.com/) as our
+continuous integration server. Each Pull Request to Docker is tested by running the
+equivalent of `make all`. We chose Jenkins because we can host it ourselves and
+we run Docker in Docker to test.
+
+#### Leeroy
+
+Leeroy is a Go application which integrates Jenkins with
+GitHub pull requests. Leeroy uses
+[GitHub hooks](http://developer.github.com/v3/repos/hooks/)
+to listen for pull request notifications and starts jobs on your Jenkins
+server. Using the Jenkins [notification plugin][jnp], Leeroy updates the
+pull request using GitHub's
+[status API](http://developer.github.com/v3/repos/statuses/)
+with pending, success, failure, or error statuses.
+
+The leeroy repository is maintained at
+[github.com/jfrazelle/leeroy](https://github.com/jfrazelle/leeroy).
+
+#### GordonTheTurtle IRC Bot
+
+The GordonTheTurtle IRC Bot lives in the
+[#docker-maintainers](https://botbot.me/freenode/docker-maintainers/) channel
+on Freenode. He is built in Go and is based off the project at
+[github.com/fabioxgn/go-bot](https://github.com/fabioxgn/go-bot).
+
+His main command is `!rebuild`, which rebuilds a given Pull Request for a repository.
+This command works by integrating with Leroy. He has a few other commands too, such
+as `!gif` or `!godoc`, but we are always looking for more fun commands to add.
+
+The gordon-bot repository is maintained at
+[github.com/jfrazelle/gordon-bot](https://github.com/jfrazelle/gordon-bot)
+
+### NSQ
+
+We use [NSQ](https://github.com/bitly/nsq) for various aspects of the project
+infrastucture.
+
+#### Hooks
+
+The hooks project,
+[github.com/crosbymichael/hooks](https://github.com/crosbymichael/hooks),
+is a small Go application that manages web hooks from github, hub.docker.com, or
+other third party services.
+
+It can be used for listening to github webhooks & pushing them to a queue,
+archiving hooks to rethinkdb for processing, and broadcasting hooks to various
+jobs.
+
+#### Docker Master Binaries
+
+One of the things queued from the Hooks are the building of the Master
+Binaries. This happens on every push to the master branch of Docker. The
+repository for this is maintained at
+[github.com/jfrazelle/docker-bb](https://github.com/jfrazelle/docker-bb).
+
+#### Docker Master Docs
+
+The master build of the docs gets queued from the Hooks as well. They are built
+using [github.com/jfrazelle/nsqexec](https://github.com/jfrazelle/nsqexec).
+
+#### Patch Parser Bot
+
+The bot, also named GordonTheTurtle, that labels and comments on Pull Requests
+listens on Hooks as well. He is capable of knowing if a Pull Request needs to
+be signed, or gofmt'd, as well as rebased. The repository for this is maintained at
+[github.com/jfrazelle/gh-patch-parser](https://github.com/jfrazelle/gh-patch-parser).
diff --git a/project/allmaintainers.sh b/project/allmaintainers.sh
deleted file mode 100755
index 1ea5a9f743..0000000000
--- a/project/allmaintainers.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-
-find $1 -name MAINTAINERS -exec cat {} ';' | sed -E -e 's/^[^:]*: *(.*)$/\1/' | grep -E -v -e '^ *$' -e '^ *#.*$' | sort -u
diff --git a/project/getmaintainer.sh b/project/getmaintainer.sh
deleted file mode 100755
index ca532d42ec..0000000000
--- a/project/getmaintainer.sh
+++ /dev/null
@@ -1,62 +0,0 @@
-#!/usr/bin/env bash
-set -e
-
-if [ $# -ne 1 ]; then
- echo >&2 "Usage: $0 PATH"
- echo >&2 "Show the primary and secondary maintainers for a given path"
- exit 1
-fi
-
-set -e
-
-DEST=$1
-DESTFILE=""
-if [ ! -d $DEST ]; then
- DESTFILE=$(basename $DEST)
- DEST=$(dirname $DEST)
-fi
-
-MAINTAINERS=()
-cd $DEST
-while true; do
- if [ -e ./MAINTAINERS ]; then
- {
- while read line; do
- re='^([^:]*): *(.*)$'
- file=$(echo $line | sed -E -n "s/$re/\1/p")
- if [ ! -z "$file" ]; then
- if [ "$file" = "$DESTFILE" ]; then
- echo "Override: $line"
- maintainer=$(echo $line | sed -E -n "s/$re/\2/p")
- MAINTAINERS=("$maintainer" "${MAINTAINERS[@]}")
- fi
- else
- MAINTAINERS+=("$line");
- fi
- done;
- } < MAINTAINERS
- break
- fi
- if [ -d .git ]; then
- break
- fi
- if [ "$(pwd)" = "/" ]; then
- break
- fi
- cd ..
-done
-
-PRIMARY="${MAINTAINERS[0]}"
-PRIMARY_FIRSTNAME=$(echo $PRIMARY | cut -d' ' -f1)
-LGTM_COUNT=${#MAINTAINERS[@]}
-LGTM_COUNT=$((LGTM_COUNT%2 +1))
-
-firstname() {
- echo $1 | cut -d' ' -f1
-}
-
-echo "A pull request in $1 will need $LGTM_COUNT LGTM's to be merged."
-echo "--- $PRIMARY is the PRIMARY MAINTAINER of $1."
-for SECONDARY in "${MAINTAINERS[@]:1}"; do
- echo "--- $SECONDARY"
-done
diff --git a/project/install.sh b/project/install.sh
deleted file mode 100755
index 8678562460..0000000000
--- a/project/install.sh
+++ /dev/null
@@ -1,225 +0,0 @@
-#!/bin/sh
-set -e
-#
-# This script is meant for quick & easy install via:
-# 'curl -sSL https://get.docker.com/ | sh'
-# or:
-# 'wget -qO- https://get.docker.com/ | sh'
-#
-#
-# Docker Maintainers:
-# To update this script on https://get.docker.com,
-# use hack/release.sh during a normal release,
-# or the following one-liner for script hotfixes:
-# s3cmd put --acl-public -P hack/install.sh s3://get.docker.com/index
-#
-
-url='https://get.docker.com/'
-
-command_exists() {
- command -v "$@" > /dev/null 2>&1
-}
-
-case "$(uname -m)" in
- *64)
- ;;
- *)
- echo >&2 'Error: you are not using a 64bit platform.'
- echo >&2 'Docker currently only supports 64bit platforms.'
- exit 1
- ;;
-esac
-
-if command_exists docker || command_exists lxc-docker; then
- echo >&2 'Warning: "docker" or "lxc-docker" command appears to already exist.'
- echo >&2 'Please ensure that you do not already have docker installed.'
- echo >&2 'You may press Ctrl+C now to abort this process and rectify this situation.'
- ( set -x; sleep 20 )
-fi
-
-user="$(id -un 2>/dev/null || true)"
-
-sh_c='sh -c'
-if [ "$user" != 'root' ]; then
- if command_exists sudo; then
- sh_c='sudo -E sh -c'
- elif command_exists su; then
- sh_c='su -c'
- else
- echo >&2 'Error: this installer needs the ability to run commands as root.'
- echo >&2 'We are unable to find either "sudo" or "su" available to make this happen.'
- exit 1
- fi
-fi
-
-curl=''
-if command_exists curl; then
- curl='curl -sSL'
-elif command_exists wget; then
- curl='wget -qO-'
-elif command_exists busybox && busybox --list-modules | grep -q wget; then
- curl='busybox wget -qO-'
-fi
-
-# perform some very rudimentary platform detection
-lsb_dist=''
-if command_exists lsb_release; then
- lsb_dist="$(lsb_release -si)"
-fi
-if [ -z "$lsb_dist" ] && [ -r /etc/lsb-release ]; then
- lsb_dist="$(. /etc/lsb-release && echo "$DISTRIB_ID")"
-fi
-if [ -z "$lsb_dist" ] && [ -r /etc/debian_version ]; then
- lsb_dist='debian'
-fi
-if [ -z "$lsb_dist" ] && [ -r /etc/fedora-release ]; then
- lsb_dist='fedora'
-fi
-if [ -z "$lsb_dist" ] && [ -r /etc/os-release ]; then
- lsb_dist="$(. /etc/os-release && echo "$ID")"
-fi
-
-lsb_dist="$(echo "$lsb_dist" | tr '[:upper:]' '[:lower:]')"
-case "$lsb_dist" in
- amzn|fedora)
- if [ "$lsb_dist" = 'amzn' ]; then
- (
- set -x
- $sh_c 'sleep 3; yum -y -q install docker'
- )
- else
- (
- set -x
- $sh_c 'sleep 3; yum -y -q install docker-io'
- )
- fi
- if command_exists docker && [ -e /var/run/docker.sock ]; then
- (
- set -x
- $sh_c 'docker version'
- ) || true
- fi
- your_user=your-user
- [ "$user" != 'root' ] && your_user="$user"
- echo
- echo 'If you would like to use Docker as a non-root user, you should now consider'
- echo 'adding your user to the "docker" group with something like:'
- echo
- echo ' sudo usermod -aG docker' $your_user
- echo
- echo 'Remember that you will have to log out and back in for this to take effect!'
- echo
- exit 0
- ;;
-
- ubuntu|debian|linuxmint)
- export DEBIAN_FRONTEND=noninteractive
-
- did_apt_get_update=
- apt_get_update() {
- if [ -z "$did_apt_get_update" ]; then
- ( set -x; $sh_c 'sleep 3; apt-get update' )
- did_apt_get_update=1
- fi
- }
-
- # aufs is preferred over devicemapper; try to ensure the driver is available.
- if ! grep -q aufs /proc/filesystems && ! $sh_c 'modprobe aufs'; then
- kern_extras="linux-image-extra-$(uname -r)"
-
- apt_get_update
- ( set -x; $sh_c 'sleep 3; apt-get install -y -q '"$kern_extras" ) || true
-
- if ! grep -q aufs /proc/filesystems && ! $sh_c 'modprobe aufs'; then
- echo >&2 'Warning: tried to install '"$kern_extras"' (for AUFS)'
- echo >&2 ' but we still have no AUFS. Docker may not work. Proceeding anyways!'
- ( set -x; sleep 10 )
- fi
- fi
-
- # install apparmor utils if they're missing and apparmor is enabled in the kernel
- # otherwise Docker will fail to start
- if [ "$(cat /sys/module/apparmor/parameters/enabled 2>/dev/null)" = 'Y' ]; then
- if command -v apparmor_parser &> /dev/null; then
- echo 'apparmor is enabled in the kernel and apparmor utils were already installed'
- else
- echo 'apparmor is enabled in the kernel, but apparmor_parser missing'
- apt_get_update
- ( set -x; $sh_c 'sleep 3; apt-get install -y -q apparmor' )
- fi
- fi
-
- if [ ! -e /usr/lib/apt/methods/https ]; then
- apt_get_update
- ( set -x; $sh_c 'sleep 3; apt-get install -y -q apt-transport-https' )
- fi
- if [ -z "$curl" ]; then
- apt_get_update
- ( set -x; $sh_c 'sleep 3; apt-get install -y -q curl' )
- curl='curl -sSL'
- fi
- (
- set -x
- if [ "https://get.docker.com/" = "$url" ]; then
- $sh_c "apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9"
- elif [ "https://test.docker.com/" = "$url" ]; then
- $sh_c "apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 740B314AE3941731B942C66ADF4FD13717AAD7D6"
- else
- $sh_c "$curl ${url}gpg | apt-key add -"
- fi
- $sh_c "echo deb ${url}ubuntu docker main > /etc/apt/sources.list.d/docker.list"
- $sh_c 'sleep 3; apt-get update; apt-get install -y -q lxc-docker'
- )
- if command_exists docker && [ -e /var/run/docker.sock ]; then
- (
- set -x
- $sh_c 'docker version'
- ) || true
- fi
- your_user=your-user
- [ "$user" != 'root' ] && your_user="$user"
- echo
- echo 'If you would like to use Docker as a non-root user, you should now consider'
- echo 'adding your user to the "docker" group with something like:'
- echo
- echo ' sudo usermod -aG docker' $your_user
- echo
- echo 'Remember that you will have to log out and back in for this to take effect!'
- echo
- exit 0
- ;;
-
- gentoo)
- if [ "$url" = "https://test.docker.com/" ]; then
- echo >&2
- echo >&2 ' You appear to be trying to install the latest nightly build in Gentoo.'
- echo >&2 ' The portage tree should contain the latest stable release of Docker, but'
- echo >&2 ' if you want something more recent, you can always use the live ebuild'
- echo >&2 ' provided in the "docker" overlay available via layman. For more'
- echo >&2 ' instructions, please see the following URL:'
- echo >&2 ' https://github.com/tianon/docker-overlay#using-this-overlay'
- echo >&2 ' After adding the "docker" overlay, you should be able to:'
- echo >&2 ' emerge -av =app-emulation/docker-9999'
- echo >&2
- exit 1
- fi
-
- (
- set -x
- $sh_c 'sleep 3; emerge app-emulation/docker'
- )
- exit 0
- ;;
-esac
-
-cat >&2 <<'EOF'
-
- Either your platform is not easily detectable, is not supported by this
- installer script (yet - PRs welcome! [hack/install.sh]), or does not yet have
- a package for Docker. Please visit the following URL for more detailed
- installation instructions:
-
- https://docs.docker.com/en/latest/installation/
-
-EOF
-exit 1
diff --git a/project/make/.ensure-busybox b/project/make/.ensure-busybox
deleted file mode 100644
index 3861faaf11..0000000000
--- a/project/make/.ensure-busybox
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/bash
-
-if ! docker inspect busybox &> /dev/null; then
- if [ -d /docker-busybox ]; then
- source "$(dirname "$BASH_SOURCE")/.ensure-scratch"
- ( set -x; docker build -t busybox /docker-busybox )
- else
- ( set -x; docker pull busybox )
- fi
-fi
diff --git a/project/make/.integration-daemon-start b/project/make/.integration-daemon-start
deleted file mode 100644
index f00bb6331f..0000000000
--- a/project/make/.integration-daemon-start
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/bin/bash
-
-# see test-integration-cli for example usage of this script
-
-export PATH="$DEST/../binary:$DEST/../dynbinary:$PATH"
-
-if ! command -v docker &> /dev/null; then
- echo >&2 'error: binary or dynbinary must be run before .integration-daemon-start'
- false
-fi
-
-# intentionally open a couple bogus file descriptors to help test that they get scrubbed in containers
-exec 41>&1 42>&2
-
-DOCKER_GRAPHDRIVER=${DOCKER_GRAPHDRIVER:-vfs}
-DOCKER_EXECDRIVER=${DOCKER_EXECDRIVER:-native}
-
-if [ -z "$DOCKER_TEST_HOST" ]; then
- ( set -x; exec \
- docker --daemon --debug \
- --storage-driver "$DOCKER_GRAPHDRIVER" \
- --exec-driver "$DOCKER_EXECDRIVER" \
- --pidfile "$DEST/docker.pid" \
- &> "$DEST/docker.log"
- ) &
-else
- export DOCKER_HOST="$DOCKER_TEST_HOST"
-fi
diff --git a/registry/MAINTAINERS b/registry/MAINTAINERS
deleted file mode 100644
index fdb03ed573..0000000000
--- a/registry/MAINTAINERS
+++ /dev/null
@@ -1,5 +0,0 @@
-Sam Alba <sam@docker.com> (@samalba)
-Joffrey Fuhrer <joffrey@docker.com> (@shin-)
-Ken Cochrane <ken@docker.com> (@kencochrane)
-Vincent Batts <vbatts@redhat.com> (@vbatts)
-Olivier Gambier <olivier@docker.com> (@dmp42)
diff --git a/registry/auth.go b/registry/auth.go
index 3207c87e82..4baf114c6c 100644
--- a/registry/auth.go
+++ b/registry/auth.go
@@ -70,12 +70,7 @@ func (auth *RequestAuthorization) getToken() (string, error) {
return auth.tokenCache, nil
}
- client := &http.Client{
- Transport: &http.Transport{
- DisableKeepAlives: true,
- Proxy: http.ProxyFromEnvironment},
- CheckRedirect: AddRequiredHeadersToRedirectedRequests,
- }
+ client := auth.registryEndpoint.HTTPClient()
factory := HTTPRequestFactory(nil)
for _, challenge := range auth.registryEndpoint.AuthChallenges {
@@ -242,16 +237,10 @@ func Login(authConfig *AuthConfig, registryEndpoint *Endpoint, factory *utils.HT
// loginV1 tries to register/login to the v1 registry server.
func loginV1(authConfig *AuthConfig, registryEndpoint *Endpoint, factory *utils.HTTPRequestFactory) (string, error) {
var (
- status string
- reqBody []byte
- err error
- client = &http.Client{
- Transport: &http.Transport{
- DisableKeepAlives: true,
- Proxy: http.ProxyFromEnvironment,
- },
- CheckRedirect: AddRequiredHeadersToRedirectedRequests,
- }
+ status string
+ reqBody []byte
+ err error
+ client = registryEndpoint.HTTPClient()
reqStatusCode = 0
serverAddress = authConfig.ServerAddress
)
@@ -275,7 +264,7 @@ func loginV1(authConfig *AuthConfig, registryEndpoint *Endpoint, factory *utils.
// using `bytes.NewReader(jsonBody)` here causes the server to respond with a 411 status.
b := strings.NewReader(string(jsonBody))
- req1, err := http.Post(serverAddress+"users/", "application/json; charset=utf-8", b)
+ req1, err := client.Post(serverAddress+"users/", "application/json; charset=utf-8", b)
if err != nil {
return "", fmt.Errorf("Server Error: %s", err)
}
@@ -361,18 +350,10 @@ func loginV1(authConfig *AuthConfig, registryEndpoint *Endpoint, factory *utils.
// is to be determined.
func loginV2(authConfig *AuthConfig, registryEndpoint *Endpoint, factory *utils.HTTPRequestFactory) (string, error) {
log.Debugf("attempting v2 login to registry endpoint %s", registryEndpoint)
-
- client := &http.Client{
- Transport: &http.Transport{
- DisableKeepAlives: true,
- Proxy: http.ProxyFromEnvironment,
- },
- CheckRedirect: AddRequiredHeadersToRedirectedRequests,
- }
-
var (
err error
allErrors []error
+ client = registryEndpoint.HTTPClient()
)
for _, challenge := range registryEndpoint.AuthChallenges {
diff --git a/registry/config.go b/registry/config.go
index 4d13aaea35..a706f17e6e 100644
--- a/registry/config.go
+++ b/registry/config.go
@@ -48,9 +48,9 @@ func IndexServerName() string {
// the current process.
func (options *Options) InstallFlags() {
options.Mirrors = opts.NewListOpts(ValidateMirror)
- flag.Var(&options.Mirrors, []string{"-registry-mirror"}, "Specify a preferred Docker registry mirror")
+ flag.Var(&options.Mirrors, []string{"-registry-mirror"}, "Preferred Docker registry mirror")
options.InsecureRegistries = opts.NewListOpts(ValidateIndexName)
- flag.Var(&options.InsecureRegistries, []string{"-insecure-registry"}, "Enable insecure communication with specified registries (no certificate verification for HTTPS and enable HTTP fallback) (e.g., localhost:5000 or 10.20.0.0/16)")
+ flag.Var(&options.InsecureRegistries, []string{"-insecure-registry"}, "Enable insecure registry communication")
}
type netIPNet net.IPNet
@@ -223,8 +223,8 @@ func validateRemoteName(remoteName string) error {
if !validNamespaceChars.MatchString(namespace) {
return fmt.Errorf("Invalid namespace name (%s). Only [a-z0-9-_] are allowed.", namespace)
}
- if len(namespace) < 4 || len(namespace) > 30 {
- return fmt.Errorf("Invalid namespace name (%s). Cannot be fewer than 4 or more than 30 characters.", namespace)
+ if len(namespace) < 2 || len(namespace) > 255 {
+ return fmt.Errorf("Invalid namespace name (%s). Cannot be fewer than 2 or more than 255 characters.", namespace)
}
if strings.HasPrefix(namespace, "-") || strings.HasSuffix(namespace, "-") {
return fmt.Errorf("Invalid namespace name (%s). Cannot begin or end with a hyphen.", namespace)
diff --git a/registry/endpoint.go b/registry/endpoint.go
index de9c1f867a..59ae4dd542 100644
--- a/registry/endpoint.go
+++ b/registry/endpoint.go
@@ -1,6 +1,7 @@
package registry
import (
+ "crypto/tls"
"encoding/json"
"fmt"
"io/ioutil"
@@ -11,6 +12,7 @@ import (
log "github.com/Sirupsen/logrus"
"github.com/docker/docker/registry/v2"
+ "github.com/docker/docker/utils"
)
// for mocking in unit tests
@@ -133,24 +135,25 @@ func (e *Endpoint) Path(path string) string {
func (e *Endpoint) Ping() (RegistryInfo, error) {
// The ping logic to use is determined by the registry endpoint version.
+ factory := HTTPRequestFactory(nil)
switch e.Version {
case APIVersion1:
- return e.pingV1()
+ return e.pingV1(factory)
case APIVersion2:
- return e.pingV2()
+ return e.pingV2(factory)
}
// APIVersionUnknown
// We should try v2 first...
e.Version = APIVersion2
- regInfo, errV2 := e.pingV2()
+ regInfo, errV2 := e.pingV2(factory)
if errV2 == nil {
return regInfo, nil
}
// ... then fallback to v1.
e.Version = APIVersion1
- regInfo, errV1 := e.pingV1()
+ regInfo, errV1 := e.pingV1(factory)
if errV1 == nil {
return regInfo, nil
}
@@ -159,7 +162,7 @@ func (e *Endpoint) Ping() (RegistryInfo, error) {
return RegistryInfo{}, fmt.Errorf("unable to ping registry endpoint %s\nv2 ping attempt failed with error: %s\n v1 ping attempt failed with error: %s", e, errV2, errV1)
}
-func (e *Endpoint) pingV1() (RegistryInfo, error) {
+func (e *Endpoint) pingV1(factory *utils.HTTPRequestFactory) (RegistryInfo, error) {
log.Debugf("attempting v1 ping for registry endpoint %s", e)
if e.String() == IndexServerAddress() {
@@ -168,7 +171,7 @@ func (e *Endpoint) pingV1() (RegistryInfo, error) {
return RegistryInfo{Standalone: false}, nil
}
- req, err := http.NewRequest("GET", e.Path("_ping"), nil)
+ req, err := factory.NewRequest("GET", e.Path("_ping"), nil)
if err != nil {
return RegistryInfo{Standalone: false}, err
}
@@ -213,10 +216,10 @@ func (e *Endpoint) pingV1() (RegistryInfo, error) {
return info, nil
}
-func (e *Endpoint) pingV2() (RegistryInfo, error) {
+func (e *Endpoint) pingV2(factory *utils.HTTPRequestFactory) (RegistryInfo, error) {
log.Debugf("attempting v2 ping for registry endpoint %s", e)
- req, err := http.NewRequest("GET", e.Path(""), nil)
+ req, err := factory.NewRequest("GET", e.Path(""), nil)
if err != nil {
return RegistryInfo{}, err
}
@@ -260,3 +263,20 @@ HeaderLoop:
return RegistryInfo{}, fmt.Errorf("v2 registry endpoint returned status %d: %q", resp.StatusCode, http.StatusText(resp.StatusCode))
}
+
+func (e *Endpoint) HTTPClient() *http.Client {
+ tlsConfig := tls.Config{
+ MinVersion: tls.VersionTLS10,
+ }
+ if !e.IsSecure {
+ tlsConfig.InsecureSkipVerify = true
+ }
+ return &http.Client{
+ Transport: &http.Transport{
+ DisableKeepAlives: true,
+ Proxy: http.ProxyFromEnvironment,
+ TLSClientConfig: &tlsConfig,
+ },
+ CheckRedirect: AddRequiredHeadersToRedirectedRequests,
+ }
+}
diff --git a/registry/endpoint_test.go b/registry/endpoint_test.go
index 00c27b448c..9567ba2352 100644
--- a/registry/endpoint_test.go
+++ b/registry/endpoint_test.go
@@ -67,7 +67,7 @@ func TestValidateEndpointAmbiguousAPIVersion(t *testing.T) {
}
if testEndpoint.Version != APIVersion1 {
- t.Fatalf("expected endpoint to validate to %s, got %s", APIVersion1, testEndpoint.Version)
+ t.Fatalf("expected endpoint to validate to %d, got %d", APIVersion1, testEndpoint.Version)
}
// Make a test server which should validate as a v2 server.
@@ -87,6 +87,6 @@ func TestValidateEndpointAmbiguousAPIVersion(t *testing.T) {
}
if testEndpoint.Version != APIVersion2 {
- t.Fatalf("expected endpoint to validate to %s, got %s", APIVersion2, testEndpoint.Version)
+ t.Fatalf("expected endpoint to validate to %d, got %d", APIVersion2, testEndpoint.Version)
}
}
diff --git a/registry/httpfactory.go b/registry/httpfactory.go
index 4c78436094..a4fea3822a 100644
--- a/registry/httpfactory.go
+++ b/registry/httpfactory.go
@@ -3,7 +3,7 @@ package registry
import (
"runtime"
- "github.com/docker/docker/dockerversion"
+ "github.com/docker/docker/autogen/dockerversion"
"github.com/docker/docker/pkg/parsers/kernel"
"github.com/docker/docker/utils"
)
diff --git a/registry/registry.go b/registry/registry.go
index 77a78a8203..a8bb83318d 100644
--- a/registry/registry.go
+++ b/registry/registry.go
@@ -14,7 +14,7 @@ import (
"time"
log "github.com/Sirupsen/logrus"
- "github.com/docker/docker/utils"
+ "github.com/docker/docker/pkg/timeoutconn"
)
var (
@@ -71,7 +71,7 @@ func newClient(jar http.CookieJar, roots *x509.CertPool, certs []tls.Certificate
if err != nil {
return nil, err
}
- conn = utils.NewTimeoutConn(conn, 1*time.Minute)
+ conn = timeoutconn.New(conn, 1*time.Minute)
return conn, nil
}
}
diff --git a/registry/registry_test.go b/registry/registry_test.go
index 6bf31505eb..d96630d90e 100644
--- a/registry/registry_test.go
+++ b/registry/registry_test.go
@@ -751,6 +751,9 @@ func TestValidRemoteName(t *testing.T) {
// Allow underscores everywhere (as opposed to hyphens).
"____/____",
+
+ //Username doc and image name docker being tested.
+ "doc/docker",
}
for _, repositoryName := range validRepositoryNames {
if err := validateRemoteName(repositoryName); err != nil {
@@ -776,11 +779,14 @@ func TestValidRemoteName(t *testing.T) {
// Disallow consecutive hyphens.
"dock--er/docker",
- // Namespace too short.
- "doc/docker",
-
// No repository.
"docker/",
+
+ //namespace too short
+ "d/docker",
+
+ //namespace too long
+ "this_is_not_a_valid_namespace_because_its_lenth_is_greater_than_255_this_is_not_a_valid_namespace_because_its_lenth_is_greater_than_255_this_is_not_a_valid_namespace_because_its_lenth_is_greater_than_255_this_is_not_a_valid_namespace_because_its_lenth_is_greater_than_255/docker",
}
for _, repositoryName := range invalidRepositoryNames {
if err := validateRemoteName(repositoryName); err == nil {
diff --git a/registry/session.go b/registry/session.go
index b1980e1ae6..bf04b586d4 100644
--- a/registry/session.go
+++ b/registry/session.go
@@ -54,7 +54,7 @@ func NewSession(authConfig *AuthConfig, factory *utils.HTTPRequestFactory, endpo
return nil, err
}
if info.Standalone {
- log.Debugf("Endpoint %s is eligible for private registry registry. Enabling decorator.", r.indexEndpoint.String())
+ log.Debugf("Endpoint %s is eligible for private registry. Enabling decorator.", r.indexEndpoint.String())
dec := utils.NewHTTPAuthDecorator(authConfig.Username, authConfig.Password)
factory.AddDecorator(dec)
}
@@ -280,8 +280,14 @@ func (r *Session) GetRepositoryData(remote string) (*RepositoryData, error) {
}
// TODO: Right now we're ignoring checksums in the response body.
// In the future, we need to use them to check image validity.
- if res.StatusCode != 200 {
+ if res.StatusCode == 404 {
return nil, utils.NewHTTPRequestError(fmt.Sprintf("HTTP code: %d", res.StatusCode), res)
+ } else if res.StatusCode != 200 {
+ errBody, err := ioutil.ReadAll(res.Body)
+ if err != nil {
+ log.Debugf("Error reading response body: %s", err)
+ }
+ return nil, utils.NewHTTPRequestError(fmt.Sprintf("Error: Status %d trying to pull repository %s: %q", res.StatusCode, remote, errBody), res)
}
var tokens []string
@@ -349,7 +355,7 @@ func (r *Session) PushImageChecksumRegistry(imgData *ImgData, registry string, t
} else if jsonBody["error"] == "Image already exists" {
return ErrAlreadyExists
}
- return fmt.Errorf("HTTP code %d while uploading metadata: %s", res.StatusCode, errBody)
+ return fmt.Errorf("HTTP code %d while uploading metadata: %q", res.StatusCode, errBody)
}
return nil
}
@@ -385,7 +391,7 @@ func (r *Session) PushImageJSONRegistry(imgData *ImgData, jsonRaw []byte, regist
} else if jsonBody["error"] == "Image already exists" {
return ErrAlreadyExists
}
- return utils.NewHTTPRequestError(fmt.Sprintf("HTTP code %d while uploading metadata: %s", res.StatusCode, errBody), res)
+ return utils.NewHTTPRequestError(fmt.Sprintf("HTTP code %d while uploading metadata: %q", res.StatusCode, errBody), res)
}
return nil
}
@@ -427,7 +433,7 @@ func (r *Session) PushImageLayerRegistry(imgID string, layer io.Reader, registry
if err != nil {
return "", "", utils.NewHTTPRequestError(fmt.Sprintf("HTTP code %d while uploading metadata and error when trying to parse response body: %s", res.StatusCode, err), res)
}
- return "", "", utils.NewHTTPRequestError(fmt.Sprintf("Received HTTP code %d while uploading layer: %s", res.StatusCode, errBody), res)
+ return "", "", utils.NewHTTPRequestError(fmt.Sprintf("Received HTTP code %d while uploading layer: %q", res.StatusCode, errBody), res)
}
checksumPayload = "sha256:" + hex.EncodeToString(h.Sum(nil))
@@ -505,14 +511,18 @@ func (r *Session) PushImageJSONIndex(remote string, imgList []*ImgData, validate
}
defer res.Body.Close()
+ if res.StatusCode == 401 {
+ return nil, errLoginRequired
+ }
+
var tokens, endpoints []string
if !validate {
if res.StatusCode != 200 && res.StatusCode != 201 {
errBody, err := ioutil.ReadAll(res.Body)
if err != nil {
- return nil, err
+ log.Debugf("Error reading response body: %s", err)
}
- return nil, utils.NewHTTPRequestError(fmt.Sprintf("Error: Status %d trying to push repository %s: %s", res.StatusCode, remote, errBody), res)
+ return nil, utils.NewHTTPRequestError(fmt.Sprintf("Error: Status %d trying to push repository %s: %q", res.StatusCode, remote, errBody), res)
}
if res.Header.Get("X-Docker-Token") != "" {
tokens = res.Header["X-Docker-Token"]
@@ -534,9 +544,9 @@ func (r *Session) PushImageJSONIndex(remote string, imgList []*ImgData, validate
if res.StatusCode != 204 {
errBody, err := ioutil.ReadAll(res.Body)
if err != nil {
- return nil, err
+ log.Debugf("Error reading response body: %s", err)
}
- return nil, utils.NewHTTPRequestError(fmt.Sprintf("Error: Status %d trying to push checksums %s: %s", res.StatusCode, remote, errBody), res)
+ return nil, utils.NewHTTPRequestError(fmt.Sprintf("Error: Status %d trying to push checksums %s: %q", res.StatusCode, remote, errBody), res)
}
}
diff --git a/registry/session_v2.go b/registry/session_v2.go
index da5371d83b..833abeed6f 100644
--- a/registry/session_v2.go
+++ b/registry/session_v2.go
@@ -1,17 +1,22 @@
package registry
import (
+ "bytes"
"encoding/json"
"fmt"
"io"
"io/ioutil"
+ "net/http"
"strconv"
log "github.com/Sirupsen/logrus"
+ "github.com/docker/distribution/digest"
"github.com/docker/docker/registry/v2"
"github.com/docker/docker/utils"
)
+const DockerDigestHeader = "Docker-Content-Digest"
+
func getV2Builder(e *Endpoint) *v2.URLBuilder {
if e.URLBuilder == nil {
e.URLBuilder = v2.NewURLBuilder(e.URL)
@@ -63,10 +68,10 @@ func (r *Session) GetV2Authorization(ep *Endpoint, imageName string, readOnly bo
// 1.c) if anything else, err
// 2) PUT the created/signed manifest
//
-func (r *Session) GetV2ImageManifest(ep *Endpoint, imageName, tagName string, auth *RequestAuthorization) ([]byte, error) {
+func (r *Session) GetV2ImageManifest(ep *Endpoint, imageName, tagName string, auth *RequestAuthorization) ([]byte, string, error) {
routeURL, err := getV2Builder(ep).BuildManifestURL(imageName, tagName)
if err != nil {
- return nil, err
+ return nil, "", err
}
method := "GET"
@@ -74,30 +79,31 @@ func (r *Session) GetV2ImageManifest(ep *Endpoint, imageName, tagName string, au
req, err := r.reqFactory.NewRequest(method, routeURL, nil)
if err != nil {
- return nil, err
+ return nil, "", err
}
if err := auth.Authorize(req); err != nil {
- return nil, err
+ return nil, "", err
}
res, _, err := r.doRequest(req)
if err != nil {
- return nil, err
+ return nil, "", err
}
defer res.Body.Close()
if res.StatusCode != 200 {
if res.StatusCode == 401 {
- return nil, errLoginRequired
+ return nil, "", errLoginRequired
} else if res.StatusCode == 404 {
- return nil, ErrDoesNotExist
+ return nil, "", ErrDoesNotExist
}
- return nil, utils.NewHTTPRequestError(fmt.Sprintf("Server error: %d trying to fetch for %s:%s", res.StatusCode, imageName, tagName), res)
+ return nil, "", utils.NewHTTPRequestError(fmt.Sprintf("Server error: %d trying to fetch for %s:%s", res.StatusCode, imageName, tagName), res)
}
- buf, err := ioutil.ReadAll(res.Body)
+ manifestBytes, err := ioutil.ReadAll(res.Body)
if err != nil {
- return nil, fmt.Errorf("Error while reading the http response: %s", err)
+ return nil, "", fmt.Errorf("Error while reading the http response: %s", err)
}
- return buf, nil
+
+ return manifestBytes, res.Header.Get(DockerDigestHeader), nil
}
// - Succeeded to head image blob (already exists)
@@ -207,29 +213,14 @@ func (r *Session) GetV2ImageBlobReader(ep *Endpoint, imageName, sumType, sum str
// 'layer' is an uncompressed reader of the blob to be pushed.
// The server will generate it's own checksum calculation.
func (r *Session) PutV2ImageBlob(ep *Endpoint, imageName, sumType, sumStr string, blobRdr io.Reader, auth *RequestAuthorization) error {
- routeURL, err := getV2Builder(ep).BuildBlobUploadURL(imageName)
+ location, err := r.initiateBlobUpload(ep, imageName, auth)
if err != nil {
return err
}
- log.Debugf("[registry] Calling %q %s", "POST", routeURL)
- req, err := r.reqFactory.NewRequest("POST", routeURL, nil)
- if err != nil {
- return err
- }
-
- if err := auth.Authorize(req); err != nil {
- return err
- }
- res, _, err := r.doRequest(req)
- if err != nil {
- return err
- }
- location := res.Header.Get("Location")
-
method := "PUT"
log.Debugf("[registry] Calling %q %s", method, location)
- req, err = r.reqFactory.NewRequest(method, location, ioutil.NopCloser(blobRdr))
+ req, err := r.reqFactory.NewRequest(method, location, ioutil.NopCloser(blobRdr))
if err != nil {
return err
}
@@ -239,7 +230,7 @@ func (r *Session) PutV2ImageBlob(ep *Endpoint, imageName, sumType, sumStr string
if err := auth.Authorize(req); err != nil {
return err
}
- res, _, err = r.doRequest(req)
+ res, _, err := r.doRequest(req)
if err != nil {
return err
}
@@ -260,42 +251,104 @@ func (r *Session) PutV2ImageBlob(ep *Endpoint, imageName, sumType, sumStr string
return nil
}
+// initiateBlobUpload gets the blob upload location for the given image name.
+func (r *Session) initiateBlobUpload(ep *Endpoint, imageName string, auth *RequestAuthorization) (location string, err error) {
+ routeURL, err := getV2Builder(ep).BuildBlobUploadURL(imageName)
+ if err != nil {
+ return "", err
+ }
+
+ log.Debugf("[registry] Calling %q %s", "POST", routeURL)
+ req, err := r.reqFactory.NewRequest("POST", routeURL, nil)
+ if err != nil {
+ return "", err
+ }
+
+ if err := auth.Authorize(req); err != nil {
+ return "", err
+ }
+ res, _, err := r.doRequest(req)
+ if err != nil {
+ return "", err
+ }
+
+ if res.StatusCode != http.StatusAccepted {
+ if res.StatusCode == http.StatusUnauthorized {
+ return "", errLoginRequired
+ }
+ if res.StatusCode == http.StatusNotFound {
+ return "", ErrDoesNotExist
+ }
+
+ errBody, err := ioutil.ReadAll(res.Body)
+ if err != nil {
+ return "", err
+ }
+
+ log.Debugf("Unexpected response from server: %q %#v", errBody, res.Header)
+ return "", utils.NewHTTPRequestError(fmt.Sprintf("Server error: unexpected %d response status trying to initiate upload of %s", res.StatusCode, imageName), res)
+ }
+
+ if location = res.Header.Get("Location"); location == "" {
+ return "", fmt.Errorf("registry did not return a Location header for resumable blob upload for image %s", imageName)
+ }
+
+ return
+}
+
// Finally Push the (signed) manifest of the blobs we've just pushed
-func (r *Session) PutV2ImageManifest(ep *Endpoint, imageName, tagName string, manifestRdr io.Reader, auth *RequestAuthorization) error {
+func (r *Session) PutV2ImageManifest(ep *Endpoint, imageName, tagName string, signedManifest, rawManifest []byte, auth *RequestAuthorization) (digest.Digest, error) {
routeURL, err := getV2Builder(ep).BuildManifestURL(imageName, tagName)
if err != nil {
- return err
+ return "", err
}
method := "PUT"
log.Debugf("[registry] Calling %q %s", method, routeURL)
- req, err := r.reqFactory.NewRequest(method, routeURL, manifestRdr)
+ req, err := r.reqFactory.NewRequest(method, routeURL, bytes.NewReader(signedManifest))
if err != nil {
- return err
+ return "", err
}
if err := auth.Authorize(req); err != nil {
- return err
+ return "", err
}
res, _, err := r.doRequest(req)
if err != nil {
- return err
+ return "", err
}
defer res.Body.Close()
// All 2xx and 3xx responses can be accepted for a put.
if res.StatusCode >= 400 {
if res.StatusCode == 401 {
- return errLoginRequired
+ return "", errLoginRequired
}
errBody, err := ioutil.ReadAll(res.Body)
if err != nil {
- return err
+ return "", err
}
log.Debugf("Unexpected response from server: %q %#v", errBody, res.Header)
- return utils.NewHTTPRequestError(fmt.Sprintf("Server error: %d trying to push %s:%s manifest", res.StatusCode, imageName, tagName), res)
+ return "", utils.NewHTTPRequestError(fmt.Sprintf("Server error: %d trying to push %s:%s manifest", res.StatusCode, imageName, tagName), res)
}
- return nil
+ hdrDigest, err := digest.ParseDigest(res.Header.Get(DockerDigestHeader))
+ if err != nil {
+ return "", fmt.Errorf("invalid manifest digest from registry: %s", err)
+ }
+
+ dgstVerifier, err := digest.NewDigestVerifier(hdrDigest)
+ if err != nil {
+ return "", fmt.Errorf("invalid manifest digest from registry: %s", err)
+ }
+
+ dgstVerifier.Write(rawManifest)
+
+ if !dgstVerifier.Verified() {
+ computedDigest, _ := digest.FromBytes(rawManifest)
+ return "", fmt.Errorf("unable to verify manifest digest: registry has %q, computed %q", hdrDigest, computedDigest)
+ }
+
+ return hdrDigest, nil
}
type remoteTags struct {
diff --git a/registry/v2/regexp.go b/registry/v2/regexp.go
index b7e95b9ff3..07484dcd69 100644
--- a/registry/v2/regexp.go
+++ b/registry/v2/regexp.go
@@ -11,9 +11,12 @@ import "regexp"
// separated by one period, dash or underscore.
var RepositoryNameComponentRegexp = regexp.MustCompile(`[a-z0-9]+(?:[._-][a-z0-9]+)*`)
-// RepositoryNameRegexp builds on RepositoryNameComponentRegexp to allow 2 to
+// RepositoryNameRegexp builds on RepositoryNameComponentRegexp to allow 1 to
// 5 path components, separated by a forward slash.
-var RepositoryNameRegexp = regexp.MustCompile(`(?:` + RepositoryNameComponentRegexp.String() + `/){1,4}` + RepositoryNameComponentRegexp.String())
+var RepositoryNameRegexp = regexp.MustCompile(`(?:` + RepositoryNameComponentRegexp.String() + `/){0,4}` + RepositoryNameComponentRegexp.String())
// TagNameRegexp matches valid tag names. From docker/docker:graph/tags.go.
var TagNameRegexp = regexp.MustCompile(`[\w][\w.-]{0,127}`)
+
+// DigestRegexp matches valid digest types.
+var DigestRegexp = regexp.MustCompile(`[a-zA-Z0-9-_+.]+:[a-zA-Z0-9-_+.=]+`)
diff --git a/registry/v2/routes.go b/registry/v2/routes.go
index 08f36e2f71..de0a38fb81 100644
--- a/registry/v2/routes.go
+++ b/registry/v2/routes.go
@@ -33,11 +33,11 @@ func Router() *mux.Router {
Path("/v2/").
Name(RouteNameBase)
- // GET /v2/<name>/manifest/<tag> Image Manifest Fetch the image manifest identified by name and tag.
- // PUT /v2/<name>/manifest/<tag> Image Manifest Upload the image manifest identified by name and tag.
- // DELETE /v2/<name>/manifest/<tag> Image Manifest Delete the image identified by name and tag.
+ // GET /v2/<name>/manifest/<reference> Image Manifest Fetch the image manifest identified by name and reference where reference can be a tag or digest.
+ // PUT /v2/<name>/manifest/<reference> Image Manifest Upload the image manifest identified by name and reference where reference can be a tag or digest.
+ // DELETE /v2/<name>/manifest/<reference> Image Manifest Delete the image identified by name and reference where reference can be a tag or digest.
router.
- Path("/v2/{name:" + RepositoryNameRegexp.String() + "}/manifests/{tag:" + TagNameRegexp.String() + "}").
+ Path("/v2/{name:" + RepositoryNameRegexp.String() + "}/manifests/{reference:" + TagNameRegexp.String() + "|" + DigestRegexp.String() + "}").
Name(RouteNameManifest)
// GET /v2/<name>/tags/list Tags Fetch the tags under the repository identified by name.
diff --git a/registry/v2/routes_test.go b/registry/v2/routes_test.go
index 9969ebcc44..0191feed00 100644
--- a/registry/v2/routes_test.go
+++ b/registry/v2/routes_test.go
@@ -53,10 +53,18 @@ func TestRouter(t *testing.T) {
},
{
RouteName: RouteNameManifest,
+ RequestURI: "/v2/foo/manifests/bar",
+ Vars: map[string]string{
+ "name": "foo",
+ "reference": "bar",
+ },
+ },
+ {
+ RouteName: RouteNameManifest,
RequestURI: "/v2/foo/bar/manifests/tag",
Vars: map[string]string{
- "name": "foo/bar",
- "tag": "tag",
+ "name": "foo/bar",
+ "reference": "tag",
},
},
{
@@ -120,8 +128,8 @@ func TestRouter(t *testing.T) {
RouteName: RouteNameManifest,
RequestURI: "/v2/foo/bar/manifests/manifests/tags",
Vars: map[string]string{
- "name": "foo/bar/manifests",
- "tag": "tags",
+ "name": "foo/bar/manifests",
+ "reference": "tags",
},
},
{
diff --git a/registry/v2/urls.go b/registry/v2/urls.go
index d1380b47ab..38fa98af01 100644
--- a/registry/v2/urls.go
+++ b/registry/v2/urls.go
@@ -74,11 +74,11 @@ func (ub *URLBuilder) BuildTagsURL(name string) (string, error) {
return tagsURL.String(), nil
}
-// BuildManifestURL constructs a url for the manifest identified by name and tag.
-func (ub *URLBuilder) BuildManifestURL(name, tag string) (string, error) {
+// BuildManifestURL constructs a url for the manifest identified by name and reference.
+func (ub *URLBuilder) BuildManifestURL(name, reference string) (string, error) {
route := ub.cloneRoute(RouteNameManifest)
- manifestURL, err := route.URL("name", name, "tag", tag)
+ manifestURL, err := route.URL("name", name, "reference", reference)
if err != nil {
return "", err
}
diff --git a/runconfig/compare.go b/runconfig/compare.go
index 5c1bf46575..60a21a79c0 100644
--- a/runconfig/compare.go
+++ b/runconfig/compare.go
@@ -19,6 +19,7 @@ func Compare(a, b *Config) bool {
}
if len(a.Cmd) != len(b.Cmd) ||
len(a.Env) != len(b.Env) ||
+ len(a.Labels) != len(b.Labels) ||
len(a.PortSpecs) != len(b.PortSpecs) ||
len(a.ExposedPorts) != len(b.ExposedPorts) ||
len(a.Entrypoint) != len(b.Entrypoint) ||
@@ -36,6 +37,11 @@ func Compare(a, b *Config) bool {
return false
}
}
+ for k, v := range a.Labels {
+ if v != b.Labels[k] {
+ return false
+ }
+ }
for i := 0; i < len(a.PortSpecs); i++ {
if a.PortSpecs[i] != b.PortSpecs[i] {
return false
diff --git a/runconfig/config.go b/runconfig/config.go
index ca5c3240b6..45255e9b01 100644
--- a/runconfig/config.go
+++ b/runconfig/config.go
@@ -12,10 +12,10 @@ type Config struct {
Hostname string
Domainname string
User string
- Memory int64 // Memory limit (in bytes)
- MemorySwap int64 // Total memory usage (memory + swap); set `-1' to disable swap
- CpuShares int64 // CPU shares (relative weight vs. other containers)
- Cpuset string // Cpuset 0-2, 0,1
+ Memory int64 // FIXME: we keep it for backward compatibility, it has been moved to hostConfig.
+ MemorySwap int64 // FIXME: it has been moved to hostConfig.
+ CpuShares int64 // FIXME: it has been moved to hostConfig.
+ Cpuset string // FIXME: it has been moved to hostConfig and renamed to CpusetCpus.
AttachStdin bool
AttachStdout bool
AttachStderr bool
@@ -33,6 +33,7 @@ type Config struct {
NetworkDisabled bool
MacAddress string
OnBuild []string
+ Labels map[string]string
}
func ContainerConfigFromJob(job *engine.Job) *Config {
@@ -66,6 +67,9 @@ func ContainerConfigFromJob(job *engine.Job) *Config {
if Cmd := job.GetenvList("Cmd"); Cmd != nil {
config.Cmd = Cmd
}
+
+ job.GetenvJson("Labels", &config.Labels)
+
if Entrypoint := job.GetenvList("Entrypoint"); Entrypoint != nil {
config.Entrypoint = Entrypoint
}
diff --git a/runconfig/hostconfig.go b/runconfig/hostconfig.go
index 3aff582f92..84d636b5c4 100644
--- a/runconfig/hostconfig.go
+++ b/runconfig/hostconfig.go
@@ -5,6 +5,7 @@ import (
"github.com/docker/docker/engine"
"github.com/docker/docker/nat"
+ "github.com/docker/docker/pkg/ulimit"
"github.com/docker/docker/utils"
)
@@ -98,10 +99,19 @@ type RestartPolicy struct {
MaximumRetryCount int
}
+type LogConfig struct {
+ Type string
+ Config map[string]string
+}
+
type HostConfig struct {
Binds []string
ContainerIDFile string
LxcConf []utils.KeyValuePair
+ Memory int64 // Memory limit (in bytes)
+ MemorySwap int64 // Total memory usage (memory + swap); set `-1` to disable swap
+ CpuShares int64 // CPU shares (relative weight vs. other containers)
+ CpusetCpus string // CpusetCpus 0-2, 0,1
Privileged bool
PortBindings nat.PortMap
Links []string
@@ -119,6 +129,9 @@ type HostConfig struct {
RestartPolicy RestartPolicy
SecurityOpt []string
ReadonlyRootfs bool
+ Ulimits []*ulimit.Ulimit
+ LogConfig LogConfig
+ CgroupParent string // Parent cgroup.
}
// This is used by the create command when you want to set both the
@@ -139,23 +152,53 @@ func ContainerHostConfigFromJob(job *engine.Job) *HostConfig {
if job.EnvExists("HostConfig") {
hostConfig := HostConfig{}
job.GetenvJson("HostConfig", &hostConfig)
+
+ // FIXME: These are for backward compatibility, if people use these
+ // options with `HostConfig`, we should still make them workable.
+ if job.EnvExists("Memory") && hostConfig.Memory == 0 {
+ hostConfig.Memory = job.GetenvInt64("Memory")
+ }
+ if job.EnvExists("MemorySwap") && hostConfig.MemorySwap == 0 {
+ hostConfig.MemorySwap = job.GetenvInt64("MemorySwap")
+ }
+ if job.EnvExists("CpuShares") && hostConfig.CpuShares == 0 {
+ hostConfig.CpuShares = job.GetenvInt64("CpuShares")
+ }
+ if job.EnvExists("Cpuset") && hostConfig.CpusetCpus == "" {
+ hostConfig.CpusetCpus = job.Getenv("Cpuset")
+ }
+
return &hostConfig
}
hostConfig := &HostConfig{
ContainerIDFile: job.Getenv("ContainerIDFile"),
+ Memory: job.GetenvInt64("Memory"),
+ MemorySwap: job.GetenvInt64("MemorySwap"),
+ CpuShares: job.GetenvInt64("CpuShares"),
+ CpusetCpus: job.Getenv("CpusetCpus"),
Privileged: job.GetenvBool("Privileged"),
PublishAllPorts: job.GetenvBool("PublishAllPorts"),
NetworkMode: NetworkMode(job.Getenv("NetworkMode")),
IpcMode: IpcMode(job.Getenv("IpcMode")),
PidMode: PidMode(job.Getenv("PidMode")),
ReadonlyRootfs: job.GetenvBool("ReadonlyRootfs"),
+ CgroupParent: job.Getenv("CgroupParent"),
+ }
+
+ // FIXME: This is for backward compatibility, if people use `Cpuset`
+ // in json, make it workable, we will only pass hostConfig.CpusetCpus
+ // to execDriver.
+ if job.EnvExists("Cpuset") && hostConfig.CpusetCpus == "" {
+ hostConfig.CpusetCpus = job.Getenv("Cpuset")
}
job.GetenvJson("LxcConf", &hostConfig.LxcConf)
job.GetenvJson("PortBindings", &hostConfig.PortBindings)
job.GetenvJson("Devices", &hostConfig.Devices)
job.GetenvJson("RestartPolicy", &hostConfig.RestartPolicy)
+ job.GetenvJson("Ulimits", &hostConfig.Ulimits)
+ job.GetenvJson("LogConfig", &hostConfig.LogConfig)
hostConfig.SecurityOpt = job.GetenvList("SecurityOpt")
if Binds := job.GetenvList("Binds"); Binds != nil {
hostConfig.Binds = Binds
diff --git a/runconfig/merge.go b/runconfig/merge.go
index 9bc4748446..9bbdc6ad25 100644
--- a/runconfig/merge.go
+++ b/runconfig/merge.go
@@ -84,6 +84,16 @@ func Merge(userConf, imageConf *Config) error {
}
}
+ if userConf.Labels == nil {
+ userConf.Labels = map[string]string{}
+ }
+ if imageConf.Labels != nil {
+ for l := range userConf.Labels {
+ imageConf.Labels[l] = userConf.Labels[l]
+ }
+ userConf.Labels = imageConf.Labels
+ }
+
if len(userConf.Entrypoint) == 0 {
if len(userConf.Cmd) == 0 {
userConf.Cmd = imageConf.Cmd
diff --git a/runconfig/parse.go b/runconfig/parse.go
index 20510660fe..ccd8056cf9 100644
--- a/runconfig/parse.go
+++ b/runconfig/parse.go
@@ -10,6 +10,7 @@ import (
"github.com/docker/docker/opts"
flag "github.com/docker/docker/pkg/mflag"
"github.com/docker/docker/pkg/parsers"
+ "github.com/docker/docker/pkg/ulimit"
"github.com/docker/docker/pkg/units"
"github.com/docker/docker/utils"
)
@@ -30,8 +31,12 @@ func Parse(cmd *flag.FlagSet, args []string) (*Config, *HostConfig, *flag.FlagSe
flVolumes = opts.NewListOpts(opts.ValidatePath)
flLinks = opts.NewListOpts(opts.ValidateLink)
flEnv = opts.NewListOpts(opts.ValidateEnv)
+ flLabels = opts.NewListOpts(opts.ValidateEnv)
flDevices = opts.NewListOpts(opts.ValidatePath)
+ ulimits = make(map[string]*ulimit.Ulimit)
+ flUlimits = opts.NewUlimitOpt(ulimits)
+
flPublish = opts.NewListOpts(nil)
flExpose = opts.NewListOpts(nil)
flDns = opts.NewListOpts(opts.ValidateIPAddress)
@@ -43,48 +48,51 @@ func Parse(cmd *flag.FlagSet, args []string) (*Config, *HostConfig, *flag.FlagSe
flCapAdd = opts.NewListOpts(nil)
flCapDrop = opts.NewListOpts(nil)
flSecurityOpt = opts.NewListOpts(nil)
+ flLabelsFile = opts.NewListOpts(nil)
flNetwork = cmd.Bool([]string{"#n", "#-networking"}, true, "Enable networking for this container")
flPrivileged = cmd.Bool([]string{"#privileged", "-privileged"}, false, "Give extended privileges to this container")
- flPidMode = cmd.String([]string{"-pid"}, "", "Default is to create a private PID namespace for the container\n'host': use the host PID namespace inside the container. Note: the host mode gives the container full access to processes on the system and is therefore considered insecure.")
- flPublishAll = cmd.Bool([]string{"P", "-publish-all"}, false, "Publish all exposed ports to random ports on the host interfaces")
+ flPidMode = cmd.String([]string{"-pid"}, "", "PID namespace to use")
+ flPublishAll = cmd.Bool([]string{"P", "-publish-all"}, false, "Publish all exposed ports to random ports")
flStdin = cmd.Bool([]string{"i", "-interactive"}, false, "Keep STDIN open even if not attached")
flTty = cmd.Bool([]string{"t", "-tty"}, false, "Allocate a pseudo-TTY")
flContainerIDFile = cmd.String([]string{"#cidfile", "-cidfile"}, "", "Write the container ID to the file")
flEntrypoint = cmd.String([]string{"#entrypoint", "-entrypoint"}, "", "Overwrite the default ENTRYPOINT of the image")
flHostname = cmd.String([]string{"h", "-hostname"}, "", "Container host name")
- flMemoryString = cmd.String([]string{"m", "-memory"}, "", "Memory limit (format: <number><optional unit>, where unit = b, k, m or g)")
- flMemorySwap = cmd.String([]string{"-memory-swap"}, "", "Total memory usage (memory + swap), set '-1' to disable swap (format: <number><optional unit>, where unit = b, k, m or g)")
- flUser = cmd.String([]string{"u", "-user"}, "", "Username or UID")
+ flMemoryString = cmd.String([]string{"m", "-memory"}, "", "Memory limit")
+ flMemorySwap = cmd.String([]string{"-memory-swap"}, "", "Total memory (memory + swap), '-1' to disable swap")
+ flUser = cmd.String([]string{"u", "-user"}, "", "Username or UID (format: <name|uid>[:<group|gid>])")
flWorkingDir = cmd.String([]string{"w", "-workdir"}, "", "Working directory inside the container")
flCpuShares = cmd.Int64([]string{"c", "-cpu-shares"}, 0, "CPU shares (relative weight)")
- flCpuset = cmd.String([]string{"-cpuset"}, "", "CPUs in which to allow execution (0-3, 0,1)")
- flNetMode = cmd.String([]string{"-net"}, "bridge", "Set the Network mode for the container\n'bridge': creates a new network stack for the container on the docker bridge\n'none': no networking for this container\n'container:<name|id>': reuses another container network stack\n'host': use the host network stack inside the container. Note: the host mode gives the container full access to local system services such as D-bus and is therefore considered insecure.")
+ flCpusetCpus = cmd.String([]string{"#-cpuset", "-cpuset-cpus"}, "", "CPUs in which to allow execution (0-3, 0,1)")
+ flNetMode = cmd.String([]string{"-net"}, "bridge", "Set the Network mode for the container")
flMacAddress = cmd.String([]string{"-mac-address"}, "", "Container MAC address (e.g. 92:d0:c6:0a:29:33)")
- flIpcMode = cmd.String([]string{"-ipc"}, "", "Default is to create a private IPC namespace (POSIX SysV IPC) for the container\n'container:<name|id>': reuses another container shared memory, semaphores and message queues\n'host': use the host shared memory,semaphores and message queues inside the container. Note: the host mode gives the container full access to local shared memory and is therefore considered insecure.")
- flRestartPolicy = cmd.String([]string{"-restart"}, "", "Restart policy to apply when a container exits (no, on-failure[:max-retry], always)")
+ flIpcMode = cmd.String([]string{"-ipc"}, "", "IPC namespace to use")
+ flRestartPolicy = cmd.String([]string{"-restart"}, "no", "Restart policy to apply when a container exits")
flReadonlyRootfs = cmd.Bool([]string{"-read-only"}, false, "Mount the container's root filesystem as read only")
+ flLoggingDriver = cmd.String([]string{"-log-driver"}, "", "Logging driver for container")
+ flCgroupParent = cmd.String([]string{"-cgroup-parent"}, "", "Optional parent cgroup for the container")
)
- cmd.Var(&flAttach, []string{"a", "-attach"}, "Attach to STDIN, STDOUT or STDERR.")
- cmd.Var(&flVolumes, []string{"v", "-volume"}, "Bind mount a volume (e.g., from the host: -v /host:/container, from Docker: -v /container)")
- cmd.Var(&flLinks, []string{"#link", "-link"}, "Add link to another container in the form of <name|id>:alias")
- cmd.Var(&flDevices, []string{"-device"}, "Add a host device to the container (e.g. --device=/dev/sdc:/dev/xvdc:rwm)")
-
+ cmd.Var(&flAttach, []string{"a", "-attach"}, "Attach to STDIN, STDOUT or STDERR")
+ cmd.Var(&flVolumes, []string{"v", "-volume"}, "Bind mount a volume")
+ cmd.Var(&flLinks, []string{"#link", "-link"}, "Add link to another container")
+ cmd.Var(&flDevices, []string{"-device"}, "Add a host device to the container")
+ cmd.Var(&flLabels, []string{"l", "-label"}, "Set meta data on a container")
+ cmd.Var(&flLabelsFile, []string{"-label-file"}, "Read in a line delimited file of labels")
cmd.Var(&flEnv, []string{"e", "-env"}, "Set environment variables")
- cmd.Var(&flEnvFile, []string{"-env-file"}, "Read in a line delimited file of environment variables")
-
- cmd.Var(&flPublish, []string{"p", "-publish"}, fmt.Sprintf("Publish a container's port to the host\nformat: %s\n(use 'docker port' to see the actual mapping)", nat.PortSpecTemplateFormat))
- cmd.Var(&flExpose, []string{"#expose", "-expose"}, "Expose a port or a range of ports (e.g. --expose=3300-3310) from the container without publishing it to your host")
+ cmd.Var(&flEnvFile, []string{"-env-file"}, "Read in a file of environment variables")
+ cmd.Var(&flPublish, []string{"p", "-publish"}, "Publish a container's port(s) to the host")
+ cmd.Var(&flExpose, []string{"#expose", "-expose"}, "Expose a port or a range of ports")
cmd.Var(&flDns, []string{"#dns", "-dns"}, "Set custom DNS servers")
- cmd.Var(&flDnsSearch, []string{"-dns-search"}, "Set custom DNS search domains (Use --dns-search=. if you don't wish to set the search domain)")
+ cmd.Var(&flDnsSearch, []string{"-dns-search"}, "Set custom DNS search domains")
cmd.Var(&flExtraHosts, []string{"-add-host"}, "Add a custom host-to-IP mapping (host:ip)")
cmd.Var(&flVolumesFrom, []string{"#volumes-from", "-volumes-from"}, "Mount volumes from the specified container(s)")
- cmd.Var(&flLxcOpts, []string{"#lxc-conf", "-lxc-conf"}, "(lxc exec-driver only) Add custom lxc options --lxc-conf=\"lxc.cgroup.cpuset.cpus = 0,1\"")
-
+ cmd.Var(&flLxcOpts, []string{"#lxc-conf", "-lxc-conf"}, "Add custom lxc options")
cmd.Var(&flCapAdd, []string{"-cap-add"}, "Add Linux capabilities")
cmd.Var(&flCapDrop, []string{"-cap-drop"}, "Drop Linux capabilities")
cmd.Var(&flSecurityOpt, []string{"-security-opt"}, "Security Options")
+ cmd.Var(flUlimits, []string{"-ulimit"}, "Ulimit options")
cmd.Require(flag.Min, 1)
@@ -97,6 +105,12 @@ func Parse(cmd *flag.FlagSet, args []string) (*Config, *HostConfig, *flag.FlagSe
return nil, nil, cmd, ErrInvalidWorkingDirectory
}
+ // Validate the input mac address
+ if *flMacAddress != "" {
+ if _, err := opts.ValidateMACAddress(*flMacAddress); err != nil {
+ return nil, nil, cmd, fmt.Errorf("%s is not a valid mac address", *flMacAddress)
+ }
+ }
var (
attachStdin = flAttach.Get("stdin")
attachStdout = flAttach.Get("stdout")
@@ -143,11 +157,15 @@ func Parse(cmd *flag.FlagSet, args []string) (*Config, *HostConfig, *flag.FlagSe
var MemorySwap int64
if *flMemorySwap != "" {
- parsedMemorySwap, err := units.RAMInBytes(*flMemorySwap)
- if err != nil {
- return nil, nil, cmd, err
+ if *flMemorySwap == "-1" {
+ MemorySwap = -1
+ } else {
+ parsedMemorySwap, err := units.RAMInBytes(*flMemorySwap)
+ if err != nil {
+ return nil, nil, cmd, err
+ }
+ MemorySwap = parsedMemorySwap
}
- MemorySwap = parsedMemorySwap
}
var binds []string
@@ -205,21 +223,15 @@ func Parse(cmd *flag.FlagSet, args []string) (*Config, *HostConfig, *flag.FlagSe
return nil, nil, cmd, fmt.Errorf("Invalid port format for --expose: %s", e)
}
//support two formats for expose, original format <portnum>/[<proto>] or <startport-endport>/[<proto>]
- if strings.Contains(e, "-") {
- proto, port := nat.SplitProtoPort(e)
- //parse the start and end port and create a sequence of ports to expose
- start, end, err := parsers.ParsePortRange(port)
- if err != nil {
- return nil, nil, cmd, fmt.Errorf("Invalid range format for --expose: %s, error: %s", e, err)
- }
- for i := start; i <= end; i++ {
- p := nat.NewPort(proto, strconv.FormatUint(i, 10))
- if _, exists := ports[p]; !exists {
- ports[p] = struct{}{}
- }
- }
- } else {
- p := nat.NewPort(nat.SplitProtoPort(e))
+ proto, port := nat.SplitProtoPort(e)
+ //parse the start and end port and create a sequence of ports to expose
+ //if expose a port, the start and end port are the same
+ start, end, err := parsers.ParsePortRange(port)
+ if err != nil {
+ return nil, nil, cmd, fmt.Errorf("Invalid range format for --expose: %s, error: %s", e, err)
+ }
+ for i := start; i <= end; i++ {
+ p := nat.NewPort(proto, strconv.FormatUint(i, 10))
if _, exists := ports[p]; !exists {
ports[p] = struct{}{}
}
@@ -237,16 +249,16 @@ func Parse(cmd *flag.FlagSet, args []string) (*Config, *HostConfig, *flag.FlagSe
}
// collect all the environment variables for the container
- envVariables := []string{}
- for _, ef := range flEnvFile.GetAll() {
- parsedVars, err := opts.ParseEnvFile(ef)
- if err != nil {
- return nil, nil, cmd, err
- }
- envVariables = append(envVariables, parsedVars...)
+ envVariables, err := readKVStrings(flEnvFile.GetAll(), flEnv.GetAll())
+ if err != nil {
+ return nil, nil, cmd, err
+ }
+
+ // collect all the labels for the container
+ labels, err := readKVStrings(flLabelsFile.GetAll(), flLabels.GetAll())
+ if err != nil {
+ return nil, nil, cmd, err
}
- // parse the '-e' and '--env' after, to allow override
- envVariables = append(envVariables, flEnv.GetAll()...)
ipcMode := IpcMode(*flIpcMode)
if !ipcMode.Valid() {
@@ -277,10 +289,10 @@ func Parse(cmd *flag.FlagSet, args []string) (*Config, *HostConfig, *flag.FlagSe
Tty: *flTty,
NetworkDisabled: !*flNetwork,
OpenStdin: *flStdin,
- Memory: flMemory,
- MemorySwap: MemorySwap,
- CpuShares: *flCpuShares,
- Cpuset: *flCpuset,
+ Memory: flMemory, // FIXME: for backward compatibility
+ MemorySwap: MemorySwap, // FIXME: for backward compatibility
+ CpuShares: *flCpuShares, // FIXME: for backward compatibility
+ Cpuset: *flCpusetCpus, // FIXME: for backward compatibility
AttachStdin: attachStdin,
AttachStdout: attachStdout,
AttachStderr: attachStderr,
@@ -291,12 +303,17 @@ func Parse(cmd *flag.FlagSet, args []string) (*Config, *HostConfig, *flag.FlagSe
MacAddress: *flMacAddress,
Entrypoint: entrypoint,
WorkingDir: *flWorkingDir,
+ Labels: convertKVStringsToMap(labels),
}
hostConfig := &HostConfig{
Binds: binds,
ContainerIDFile: *flContainerIDFile,
LxcConf: lxcConf,
+ Memory: flMemory,
+ MemorySwap: MemorySwap,
+ CpuShares: *flCpuShares,
+ CpusetCpus: *flCpusetCpus,
Privileged: *flPrivileged,
PortBindings: portBindings,
Links: flLinks.GetAll(),
@@ -314,6 +331,9 @@ func Parse(cmd *flag.FlagSet, args []string) (*Config, *HostConfig, *flag.FlagSe
RestartPolicy: restartPolicy,
SecurityOpt: flSecurityOpt.GetAll(),
ReadonlyRootfs: *flReadonlyRootfs,
+ Ulimits: flUlimits.GetList(),
+ LogConfig: LogConfig{Type: *flLoggingDriver},
+ CgroupParent: *flCgroupParent,
}
// When allocating stdin in attached mode, close stdin at client disconnect
@@ -323,6 +343,37 @@ func Parse(cmd *flag.FlagSet, args []string) (*Config, *HostConfig, *flag.FlagSe
return config, hostConfig, cmd, nil
}
+// reads a file of line terminated key=value pairs and override that with override parameter
+func readKVStrings(files []string, override []string) ([]string, error) {
+ envVariables := []string{}
+ for _, ef := range files {
+ parsedVars, err := opts.ParseEnvFile(ef)
+ if err != nil {
+ return nil, err
+ }
+ envVariables = append(envVariables, parsedVars...)
+ }
+ // parse the '-e' and '--env' after, to allow override
+ envVariables = append(envVariables, override...)
+
+ return envVariables, nil
+}
+
+// converts ["key=value"] to {"key":"value"}
+func convertKVStringsToMap(values []string) map[string]string {
+ result := make(map[string]string, len(values))
+ for _, value := range values {
+ kv := strings.SplitN(value, "=", 2)
+ if len(kv) == 1 {
+ result[kv[0]] = ""
+ } else {
+ result[kv[0]] = kv[1]
+ }
+ }
+
+ return result
+}
+
// parseRestartPolicy returns the parsed policy or an error indicating what is incorrect
func parseRestartPolicy(policy string) (RestartPolicy, error) {
p := RestartPolicy{}
diff --git a/utils/progressreader.go b/utils/progressreader.go
deleted file mode 100644
index 87eae8ba73..0000000000
--- a/utils/progressreader.go
+++ /dev/null
@@ -1,55 +0,0 @@
-package utils
-
-import (
- "io"
- "time"
-)
-
-// Reader with progress bar
-type progressReader struct {
- reader io.ReadCloser // Stream to read from
- output io.Writer // Where to send progress bar to
- progress JSONProgress
- lastUpdate int // How many bytes read at least update
- ID string
- action string
- sf *StreamFormatter
- newLine bool
-}
-
-func (r *progressReader) Read(p []byte) (n int, err error) {
- read, err := r.reader.Read(p)
- r.progress.Current += read
- updateEvery := 1024 * 512 //512kB
- if r.progress.Total > 0 {
- // Update progress for every 1% read if 1% < 512kB
- if increment := int(0.01 * float64(r.progress.Total)); increment < updateEvery {
- updateEvery = increment
- }
- }
- if r.progress.Current-r.lastUpdate > updateEvery || err != nil {
- r.output.Write(r.sf.FormatProgress(r.ID, r.action, &r.progress))
- r.lastUpdate = r.progress.Current
- }
- // Send newline when complete
- if r.newLine && err != nil && read == 0 {
- r.output.Write(r.sf.FormatStatus("", ""))
- }
- return read, err
-}
-func (r *progressReader) Close() error {
- r.progress.Current = r.progress.Total
- r.output.Write(r.sf.FormatProgress(r.ID, r.action, &r.progress))
- return r.reader.Close()
-}
-func ProgressReader(r io.ReadCloser, size int, output io.Writer, sf *StreamFormatter, newline bool, ID, action string) *progressReader {
- return &progressReader{
- reader: r,
- output: NewWriteFlusher(output),
- ID: ID,
- action: action,
- progress: JSONProgress{Total: size, Start: time.Now().UTC().Unix()},
- sf: sf,
- newLine: newline,
- }
-}
diff --git a/utils/random.go b/utils/random.go
deleted file mode 100644
index 907f28eec3..0000000000
--- a/utils/random.go
+++ /dev/null
@@ -1,16 +0,0 @@
-package utils
-
-import (
- "crypto/rand"
- "encoding/hex"
- "io"
-)
-
-func RandomString() string {
- id := make([]byte, 32)
-
- if _, err := io.ReadFull(rand.Reader, id); err != nil {
- panic(err) // This shouldn't happen
- }
- return hex.EncodeToString(id)
-}
diff --git a/utils/streamformatter.go b/utils/streamformatter.go
index d0bc295bb3..e5b15f9835 100644
--- a/utils/streamformatter.go
+++ b/utils/streamformatter.go
@@ -3,6 +3,7 @@ package utils
import (
"encoding/json"
"fmt"
+ "github.com/docker/docker/pkg/progressreader"
"io"
)
@@ -54,7 +55,15 @@ func (sf *StreamFormatter) FormatError(err error) []byte {
}
return []byte("Error: " + err.Error() + streamNewline)
}
-
+func (sf *StreamFormatter) FormatProg(id, action string, p interface{}) []byte {
+ switch progress := p.(type) {
+ case *JSONProgress:
+ return sf.FormatProgress(id, action, progress)
+ case progressreader.PR_JSONProgress:
+ return sf.FormatProgress(id, action, &JSONProgress{Current: progress.GetCurrent(), Total: progress.GetTotal()})
+ }
+ return nil
+}
func (sf *StreamFormatter) FormatProgress(id, action string, progress *JSONProgress) []byte {
if progress == nil {
progress = &JSONProgress{}
diff --git a/utils/utils.go b/utils/utils.go
index 2447d11f11..540ae6f572 100644
--- a/utils/utils.go
+++ b/utils/utils.go
@@ -3,7 +3,6 @@ package utils
import (
"bufio"
"bytes"
- "crypto/rand"
"crypto/sha1"
"crypto/sha256"
"encoding/hex"
@@ -16,13 +15,13 @@ import (
"path/filepath"
"regexp"
"runtime"
- "strconv"
"strings"
"sync"
log "github.com/Sirupsen/logrus"
- "github.com/docker/docker/dockerversion"
+ "github.com/docker/docker/autogen/dockerversion"
"github.com/docker/docker/pkg/archive"
+ "github.com/docker/docker/pkg/common"
"github.com/docker/docker/pkg/fileutils"
"github.com/docker/docker/pkg/ioutils"
)
@@ -164,36 +163,6 @@ func GetTotalUsedFds() int {
return -1
}
-// TruncateID returns a shorthand version of a string identifier for convenience.
-// A collision with other shorthands is very unlikely, but possible.
-// In case of a collision a lookup with TruncIndex.Get() will fail, and the caller
-// will need to use a langer prefix, or the full-length Id.
-func TruncateID(id string) string {
- shortLen := 12
- if len(id) < shortLen {
- shortLen = len(id)
- }
- return id[:shortLen]
-}
-
-// GenerateRandomID returns an unique id
-func GenerateRandomID() string {
- for {
- id := make([]byte, 32)
- if _, err := io.ReadFull(rand.Reader, id); err != nil {
- panic(err) // This shouldn't happen
- }
- value := hex.EncodeToString(id)
- // if we try to parse the truncated for as an int and we don't have
- // an error then the value is all numberic and causes issues when
- // used as a hostname. ref #3869
- if _, err := strconv.ParseInt(TruncateID(value), 10, 64); err == nil {
- continue
- }
- return value
- }
-}
-
func ValidateID(id string) error {
if ok := validHex.MatchString(id); !ok {
err := fmt.Errorf("image ID '%s' is invalid", id)
@@ -343,7 +312,7 @@ var globalTestID string
// new directory.
func TestDirectory(templateDir string) (dir string, err error) {
if globalTestID == "" {
- globalTestID = RandomString()[:4]
+ globalTestID = common.RandomString()[:4]
}
prefix := fmt.Sprintf("docker-test%s-%s-", globalTestID, GetCallerName(2))
if prefix == "" {
@@ -545,3 +514,41 @@ func ReadDockerIgnore(path string) ([]string, error) {
}
return excludes, nil
}
+
+// Wrap a concrete io.Writer and hold a count of the number
+// of bytes written to the writer during a "session".
+// This can be convenient when write return is masked
+// (e.g., json.Encoder.Encode())
+type WriteCounter struct {
+ Count int64
+ Writer io.Writer
+}
+
+func NewWriteCounter(w io.Writer) *WriteCounter {
+ return &WriteCounter{
+ Writer: w,
+ }
+}
+
+func (wc *WriteCounter) Write(p []byte) (count int, err error) {
+ count, err = wc.Writer.Write(p)
+ wc.Count += int64(count)
+ return
+}
+
+// ImageReference combines `repo` and `ref` and returns a string representing
+// the combination. If `ref` is a digest (meaning it's of the form
+// <algorithm>:<digest>, the returned string is <repo>@<ref>. Otherwise,
+// ref is assumed to be a tag, and the returned string is <repo>:<tag>.
+func ImageReference(repo, ref string) string {
+ if DigestReference(ref) {
+ return repo + "@" + ref
+ }
+ return repo + ":" + ref
+}
+
+// DigestReference returns true if ref is a digest reference; i.e. if it
+// is of the form <algorithm>:<digest>.
+func DigestReference(ref string) bool {
+ return strings.Contains(ref, ":")
+}
diff --git a/utils/utils_daemon.go b/utils/utils_daemon.go
index 9989f05e31..3f8f4d569f 100644
--- a/utils/utils_daemon.go
+++ b/utils/utils_daemon.go
@@ -3,45 +3,14 @@
package utils
import (
+ "github.com/docker/docker/pkg/system"
"os"
- "path/filepath"
- "syscall"
)
-// TreeSize walks a directory tree and returns its total size in bytes.
-func TreeSize(dir string) (size int64, err error) {
- data := make(map[uint64]struct{})
- err = filepath.Walk(dir, func(d string, fileInfo os.FileInfo, e error) error {
- // Ignore directory sizes
- if fileInfo == nil {
- return nil
- }
-
- s := fileInfo.Size()
- if fileInfo.IsDir() || s == 0 {
- return nil
- }
-
- // Check inode to handle hard links correctly
- inode := fileInfo.Sys().(*syscall.Stat_t).Ino
- // inode is not a uint64 on all platforms. Cast it to avoid issues.
- if _, exists := data[uint64(inode)]; exists {
- return nil
- }
- // inode is not a uint64 on all platforms. Cast it to avoid issues.
- data[uint64(inode)] = struct{}{}
-
- size += s
-
- return nil
- })
- return
-}
-
// IsFileOwner checks whether the current user is the owner of the given file.
func IsFileOwner(f string) bool {
- if fileInfo, err := os.Stat(f); err == nil && fileInfo != nil {
- if stat, ok := fileInfo.Sys().(*syscall.Stat_t); ok && int(stat.Uid) == os.Getuid() {
+ if fileInfo, err := system.Stat(f); err == nil && fileInfo != nil {
+ if int(fileInfo.Uid()) == os.Getuid() {
return true
}
}
diff --git a/utils/utils_daemon_test.go b/utils/utils_daemon_test.go
new file mode 100644
index 0000000000..e8361489b7
--- /dev/null
+++ b/utils/utils_daemon_test.go
@@ -0,0 +1,26 @@
+package utils
+
+import (
+ "os"
+ "path"
+ "testing"
+)
+
+func TestIsFileOwner(t *testing.T) {
+ var err error
+ var file *os.File
+
+ if file, err = os.Create(path.Join(os.TempDir(), "testIsFileOwner")); err != nil {
+ t.Fatalf("failed to create file: %s", err)
+ }
+ file.Close()
+
+ if ok := IsFileOwner(path.Join(os.TempDir(), "testIsFileOwner")); !ok {
+ t.Fatalf("User should be owner of file")
+ }
+
+ if err = os.Remove(path.Join(os.TempDir(), "testIsFileOwner")); err != nil {
+ t.Fatalf("failed to remove file: %s", err)
+ }
+
+}
diff --git a/utils/utils_test.go b/utils/utils_test.go
index ce304482b8..94303a0e96 100644
--- a/utils/utils_test.go
+++ b/utils/utils_test.go
@@ -1,7 +1,9 @@
package utils
import (
+ "bytes"
"os"
+ "strings"
"testing"
)
@@ -97,3 +99,56 @@ func TestReadSymlinkedDirectoryToFile(t *testing.T) {
t.Errorf("failed to remove symlink: %s", err)
}
}
+
+func TestWriteCounter(t *testing.T) {
+ dummy1 := "This is a dummy string."
+ dummy2 := "This is another dummy string."
+ totalLength := int64(len(dummy1) + len(dummy2))
+
+ reader1 := strings.NewReader(dummy1)
+ reader2 := strings.NewReader(dummy2)
+
+ var buffer bytes.Buffer
+ wc := NewWriteCounter(&buffer)
+
+ reader1.WriteTo(wc)
+ reader2.WriteTo(wc)
+
+ if wc.Count != totalLength {
+ t.Errorf("Wrong count: %d vs. %d", wc.Count, totalLength)
+ }
+
+ if buffer.String() != dummy1+dummy2 {
+ t.Error("Wrong message written")
+ }
+}
+
+func TestImageReference(t *testing.T) {
+ tests := []struct {
+ repo string
+ ref string
+ expected string
+ }{
+ {"repo", "tag", "repo:tag"},
+ {"repo", "sha256:c100b11b25d0cacd52c14e0e7bf525e1a4c0e6aec8827ae007055545909d1a64", "repo@sha256:c100b11b25d0cacd52c14e0e7bf525e1a4c0e6aec8827ae007055545909d1a64"},
+ }
+
+ for i, test := range tests {
+ actual := ImageReference(test.repo, test.ref)
+ if test.expected != actual {
+ t.Errorf("%d: expected %q, got %q", i, test.expected, actual)
+ }
+ }
+}
+
+func TestDigestReference(t *testing.T) {
+ input := "sha256:c100b11b25d0cacd52c14e0e7bf525e1a4c0e6aec8827ae007055545909d1a64"
+ if !DigestReference(input) {
+ t.Errorf("Expected DigestReference=true for input %q", input)
+ }
+
+ input = "latest"
+ if DigestReference(input) {
+ t.Errorf("Unexpected DigestReference=true for input %q", input)
+ }
+}
diff --git a/vendor/MAINTAINERS b/vendor/MAINTAINERS
deleted file mode 120000
index 72e53509b2..0000000000
--- a/vendor/MAINTAINERS
+++ /dev/null
@@ -1 +0,0 @@
-../hack/MAINTAINERS \ No newline at end of file
diff --git a/vendor/src/github.com/Sirupsen/logrus/.travis.yml b/vendor/src/github.com/Sirupsen/logrus/.travis.yml
index d5a559f840..2d8c086617 100644
--- a/vendor/src/github.com/Sirupsen/logrus/.travis.yml
+++ b/vendor/src/github.com/Sirupsen/logrus/.travis.yml
@@ -2,8 +2,7 @@ language: go
go:
- 1.2
- 1.3
+ - 1.4
- tip
install:
- - go get github.com/stretchr/testify
- - go get github.com/stvp/go-udp-testing
- - go get github.com/tobi/airbrake-go
+ - go get -t ./...
diff --git a/vendor/src/github.com/Sirupsen/logrus/README.md b/vendor/src/github.com/Sirupsen/logrus/README.md
index 01769c723f..512f26e5ea 100644
--- a/vendor/src/github.com/Sirupsen/logrus/README.md
+++ b/vendor/src/github.com/Sirupsen/logrus/README.md
@@ -1,10 +1,11 @@
-# Logrus <img src="http://i.imgur.com/hTeVwmJ.png" width="40" height="40" alt=":walrus:" class="emoji" title=":walrus:"/>&nbsp;[![Build Status](https://travis-ci.org/Sirupsen/logrus.svg?branch=master)](https://travis-ci.org/Sirupsen/logrus)
+# Logrus <img src="http://i.imgur.com/hTeVwmJ.png" width="40" height="40" alt=":walrus:" class="emoji" title=":walrus:"/>&nbsp;[![Build Status](https://travis-ci.org/Sirupsen/logrus.svg?branch=master)](https://travis-ci.org/Sirupsen/logrus)&nbsp;[![godoc reference](https://godoc.org/github.com/Sirupsen/logrus?status.png)][godoc]
Logrus is a structured logger for Go (golang), completely API compatible with
the standard library logger. [Godoc][godoc]. **Please note the Logrus API is not
-yet stable (pre 1.0), the core API is unlikely change much but please version
-control your Logrus to make sure you aren't fetching latest `master` on every
-build.**
+yet stable (pre 1.0). Logrus itself is completely stable and has been used in
+many large deployments. The core API is unlikely to change much but please
+version control your Logrus to make sure you aren't fetching latest `master` on
+every build.**
Nicely color-coded in development (when a TTY is attached, otherwise just
plain text):
@@ -33,7 +34,7 @@ ocean","size":10,"time":"2014-03-10 19:57:38.562264131 -0400 EDT"}
With the default `log.Formatter = new(logrus.TextFormatter)` when a TTY is not
attached, the output is compatible with the
-[l2met](http://r.32k.io/l2met-introduction) format:
+[logfmt](http://godoc.org/github.com/kr/logfmt) format:
```text
time="2014-04-20 15:36:23.830442383 -0400 EDT" level="info" msg="A group of walrus emerges from the ocean" animal="walrus" size=10
@@ -81,7 +82,7 @@ func init() {
// Use the Airbrake hook to report errors that have Error severity or above to
// an exception tracker. You can create custom hooks, see the Hooks section.
- log.AddHook(&logrus_airbrake.AirbrakeHook{})
+ log.AddHook(airbrake.NewHook("https://example.com", "xyz", "development"))
// Output to stderr instead of stdout, could also be a file.
log.SetOutput(os.Stderr)
@@ -163,54 +164,26 @@ You can add hooks for logging levels. For example to send errors to an exception
tracking service on `Error`, `Fatal` and `Panic`, info to StatsD or log to
multiple places simultaneously, e.g. syslog.
-```go
-// Not the real implementation of the Airbrake hook. Just a simple sample.
-import (
- log "github.com/Sirupsen/logrus"
-)
-
-func init() {
- log.AddHook(new(AirbrakeHook))
-}
-
-type AirbrakeHook struct{}
-
-// `Fire()` takes the entry that the hook is fired for. `entry.Data[]` contains
-// the fields for the entry. See the Fields section of the README.
-func (hook *AirbrakeHook) Fire(entry *logrus.Entry) error {
- err := airbrake.Notify(entry.Data["error"].(error))
- if err != nil {
- log.WithFields(log.Fields{
- "source": "airbrake",
- "endpoint": airbrake.Endpoint,
- }).Info("Failed to send error to Airbrake")
- }
-
- return nil
-}
-
-// `Levels()` returns a slice of `Levels` the hook is fired for.
-func (hook *AirbrakeHook) Levels() []log.Level {
- return []log.Level{
- log.ErrorLevel,
- log.FatalLevel,
- log.PanicLevel,
- }
-}
-```
-
-Logrus comes with built-in hooks. Add those, or your custom hook, in `init`:
+Logrus comes with [built-in hooks](hooks/). Add those, or your custom hook, in
+`init`:
```go
import (
log "github.com/Sirupsen/logrus"
"github.com/Sirupsen/logrus/hooks/airbrake"
"github.com/Sirupsen/logrus/hooks/syslog"
+ "log/syslog"
)
func init() {
- log.AddHook(new(logrus_airbrake.AirbrakeHook))
- log.AddHook(logrus_syslog.NewSyslogHook("udp", "localhost:514", syslog.LOG_INFO, ""))
+ log.AddHook(airbrake.NewHook("https://example.com", "xyz", "development"))
+
+ hook, err := logrus_syslog.NewSyslogHook("udp", "localhost:514", syslog.LOG_INFO, "")
+ if err != nil {
+ log.Error("Unable to connect to local syslog daemon")
+ } else {
+ log.AddHook(hook)
+ }
}
```
@@ -225,9 +198,21 @@ func init() {
Send errors to remote syslog server.
Uses standard library `log/syslog` behind the scenes.
+* [`github.com/Sirupsen/logrus/hooks/bugsnag`](https://github.com/Sirupsen/logrus/blob/master/hooks/bugsnag/bugsnag.go)
+ Send errors to the Bugsnag exception tracking service.
+
* [`github.com/nubo/hiprus`](https://github.com/nubo/hiprus)
Send errors to a channel in hipchat.
+* [`github.com/sebest/logrusly`](https://github.com/sebest/logrusly)
+ Send logs to Loggly (https://www.loggly.com/)
+
+* [`github.com/johntdyer/slackrus`](https://github.com/johntdyer/slackrus)
+ Hook for Slack chat.
+
+* [`github.com/wercker/journalhook`](https://github.com/wercker/journalhook).
+ Hook for logging to `systemd-journald`.
+
#### Level logging
Logrus has six logging levels: Debug, Info, Warning, Error, Fatal and Panic.
@@ -304,10 +289,15 @@ The built-in logging formatters are:
field to `true`. To force no colored output even if there is a TTY set the
`DisableColors` field to `true`
* `logrus.JSONFormatter`. Logs fields as JSON.
+* `logrus_logstash.LogstashFormatter`. Logs fields as Logstash Events (http://logstash.net).
+
+ ```go
+ logrus.SetFormatter(&logrus_logstash.LogstashFormatter{Type: “application_name"})
+ ```
Third party logging formatters:
-* [`zalgo`](https://github.com/aybabtme/logzalgo): invoking the P͉̫o̳̼̊w̖͈̰͎e̬͔̭͂r͚̼̹̲ ̫͓͉̳͈ō̠͕͖̚fÌÍÌ  ͕̲̞͖͑Z̖̫̤̫ͪa͉̬͈̗lÍ–ÍŽg̳̥oÌ…Ì°Ì¥!̣͔̲̻͊̄ ̙̘̦̹̦.
+* [`zalgo`](https://github.com/aybabtme/logzalgo): invoking the P͉̫o̳̼̊w̖͈̰͎e̬͔̭͂r͚̼̹̲ ̫͓͉̳͈ÅÌ Í•Í–ÌšfÌÍÌ  ͕̲̞͖͑Z̖̫̤̫ͪa͉̬͈̗lÍ–ÍŽg̳̥o̰̥̅!̣͔̲̻͊̄ ̙̘̦̹̦.
You can define your formatter by implementing the `Formatter` interface,
requiring a `Format` method. `Format` takes an `*Entry`. `entry.Data` is a
@@ -332,10 +322,28 @@ func (f *JSONFormatter) Format(entry *Entry) ([]byte, error) {
}
```
+#### Logger as an `io.Writer`
+
+Logrus can be transormed into an `io.Writer`. That writer is the end of an `io.Pipe` and it is your responsibility to close it.
+
+```go
+w := logger.Writer()
+defer w.Close()
+
+srv := http.Server{
+ // create a stdlib log.Logger that writes to
+ // logrus.Logger.
+ ErrorLog: log.New(w, "", 0),
+}
+```
+
+Each line written to that writer will be printed the usual way, using formatters
+and hooks. The level for those entries is `info`.
+
#### Rotation
Log rotation is not provided with Logrus. Log rotation should be done by an
-external program (like `logrotated(8)`) that can compress and delete old log
+external program (like `logrotate(8)`) that can compress and delete old log
entries. It should not be a feature of the application-level logger.
diff --git a/vendor/src/github.com/Sirupsen/logrus/entry.go b/vendor/src/github.com/Sirupsen/logrus/entry.go
index a77c4b0ed1..17fe6f707b 100644
--- a/vendor/src/github.com/Sirupsen/logrus/entry.go
+++ b/vendor/src/github.com/Sirupsen/logrus/entry.go
@@ -100,7 +100,7 @@ func (entry *Entry) log(level Level, msg string) {
// panic() to use in Entry#Panic(), we avoid the allocation by checking
// directly here.
if level <= PanicLevel {
- panic(reader.String())
+ panic(entry)
}
}
@@ -126,6 +126,10 @@ func (entry *Entry) Warn(args ...interface{}) {
}
}
+func (entry *Entry) Warning(args ...interface{}) {
+ entry.Warn(args...)
+}
+
func (entry *Entry) Error(args ...interface{}) {
if entry.Logger.Level >= ErrorLevel {
entry.log(ErrorLevel, fmt.Sprint(args...))
diff --git a/vendor/src/github.com/Sirupsen/logrus/entry_test.go b/vendor/src/github.com/Sirupsen/logrus/entry_test.go
new file mode 100644
index 0000000000..98717df490
--- /dev/null
+++ b/vendor/src/github.com/Sirupsen/logrus/entry_test.go
@@ -0,0 +1,53 @@
+package logrus
+
+import (
+ "bytes"
+ "fmt"
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+)
+
+func TestEntryPanicln(t *testing.T) {
+ errBoom := fmt.Errorf("boom time")
+
+ defer func() {
+ p := recover()
+ assert.NotNil(t, p)
+
+ switch pVal := p.(type) {
+ case *Entry:
+ assert.Equal(t, "kaboom", pVal.Message)
+ assert.Equal(t, errBoom, pVal.Data["err"])
+ default:
+ t.Fatalf("want type *Entry, got %T: %#v", pVal, pVal)
+ }
+ }()
+
+ logger := New()
+ logger.Out = &bytes.Buffer{}
+ entry := NewEntry(logger)
+ entry.WithField("err", errBoom).Panicln("kaboom")
+}
+
+func TestEntryPanicf(t *testing.T) {
+ errBoom := fmt.Errorf("boom again")
+
+ defer func() {
+ p := recover()
+ assert.NotNil(t, p)
+
+ switch pVal := p.(type) {
+ case *Entry:
+ assert.Equal(t, "kaboom true", pVal.Message)
+ assert.Equal(t, errBoom, pVal.Data["err"])
+ default:
+ t.Fatalf("want type *Entry, got %T: %#v", pVal, pVal)
+ }
+ }()
+
+ logger := New()
+ logger.Out = &bytes.Buffer{}
+ entry := NewEntry(logger)
+ entry.WithField("err", errBoom).Panicf("kaboom %v", true)
+}
diff --git a/vendor/src/github.com/Sirupsen/logrus/examples/basic/basic.go b/vendor/src/github.com/Sirupsen/logrus/examples/basic/basic.go
index 35945509c3..a1623ec003 100644
--- a/vendor/src/github.com/Sirupsen/logrus/examples/basic/basic.go
+++ b/vendor/src/github.com/Sirupsen/logrus/examples/basic/basic.go
@@ -9,9 +9,26 @@ var log = logrus.New()
func init() {
log.Formatter = new(logrus.JSONFormatter)
log.Formatter = new(logrus.TextFormatter) // default
+ log.Level = logrus.DebugLevel
}
func main() {
+ defer func() {
+ err := recover()
+ if err != nil {
+ log.WithFields(logrus.Fields{
+ "omg": true,
+ "err": err,
+ "number": 100,
+ }).Fatal("The ice breaks!")
+ }
+ }()
+
+ log.WithFields(logrus.Fields{
+ "animal": "walrus",
+ "number": 8,
+ }).Debug("Started observing beach")
+
log.WithFields(logrus.Fields{
"animal": "walrus",
"size": 10,
@@ -23,7 +40,11 @@ func main() {
}).Warn("The group's number increased tremendously!")
log.WithFields(logrus.Fields{
- "omg": true,
- "number": 100,
- }).Fatal("The ice breaks!")
+ "temperature": -4,
+ }).Debug("Temperature changes")
+
+ log.WithFields(logrus.Fields{
+ "animal": "orca",
+ "size": 9009,
+ }).Panic("It's over 9000!")
}
diff --git a/vendor/src/github.com/Sirupsen/logrus/examples/hook/hook.go b/vendor/src/github.com/Sirupsen/logrus/examples/hook/hook.go
index 42e7a4c982..cb5759a35c 100644
--- a/vendor/src/github.com/Sirupsen/logrus/examples/hook/hook.go
+++ b/vendor/src/github.com/Sirupsen/logrus/examples/hook/hook.go
@@ -3,21 +3,16 @@ package main
import (
"github.com/Sirupsen/logrus"
"github.com/Sirupsen/logrus/hooks/airbrake"
- "github.com/tobi/airbrake-go"
)
var log = logrus.New()
func init() {
log.Formatter = new(logrus.TextFormatter) // default
- log.Hooks.Add(new(logrus_airbrake.AirbrakeHook))
+ log.Hooks.Add(airbrake.NewHook("https://example.com", "xyz", "development"))
}
func main() {
- airbrake.Endpoint = "https://exceptions.whatever.com/notifier_api/v2/notices.xml"
- airbrake.ApiKey = "whatever"
- airbrake.Environment = "production"
-
log.WithFields(logrus.Fields{
"animal": "walrus",
"size": 10,
diff --git a/vendor/src/github.com/Sirupsen/logrus/exported.go b/vendor/src/github.com/Sirupsen/logrus/exported.go
index 0e2d59f19a..a67e1b802d 100644
--- a/vendor/src/github.com/Sirupsen/logrus/exported.go
+++ b/vendor/src/github.com/Sirupsen/logrus/exported.go
@@ -9,6 +9,10 @@ var (
std = New()
)
+func StandardLogger() *Logger {
+ return std
+}
+
// SetOutput sets the standard logger output.
func SetOutput(out io.Writer) {
std.mu.Lock()
@@ -30,6 +34,13 @@ func SetLevel(level Level) {
std.Level = level
}
+// GetLevel returns the standard logger level.
+func GetLevel() Level {
+ std.mu.Lock()
+ defer std.mu.Unlock()
+ return std.Level
+}
+
// AddHook adds a hook to the standard logger hooks.
func AddHook(hook Hook) {
std.mu.Lock()
diff --git a/vendor/src/github.com/Sirupsen/logrus/formatter.go b/vendor/src/github.com/Sirupsen/logrus/formatter.go
index 74c49a0e0e..038ce9fd29 100644
--- a/vendor/src/github.com/Sirupsen/logrus/formatter.go
+++ b/vendor/src/github.com/Sirupsen/logrus/formatter.go
@@ -26,19 +26,19 @@ type Formatter interface {
//
// It's not exported because it's still using Data in an opinionated way. It's to
// avoid code duplication between the two default formatters.
-func prefixFieldClashes(entry *Entry) {
- _, ok := entry.Data["time"]
+func prefixFieldClashes(data Fields) {
+ _, ok := data["time"]
if ok {
- entry.Data["fields.time"] = entry.Data["time"]
+ data["fields.time"] = data["time"]
}
- _, ok = entry.Data["msg"]
+ _, ok = data["msg"]
if ok {
- entry.Data["fields.msg"] = entry.Data["msg"]
+ data["fields.msg"] = data["msg"]
}
- _, ok = entry.Data["level"]
+ _, ok = data["level"]
if ok {
- entry.Data["fields.level"] = entry.Data["level"]
+ data["fields.level"] = data["level"]
}
}
diff --git a/vendor/src/github.com/Sirupsen/logrus/formatters/logstash/logstash.go b/vendor/src/github.com/Sirupsen/logrus/formatters/logstash/logstash.go
new file mode 100644
index 0000000000..34b1ccbca6
--- /dev/null
+++ b/vendor/src/github.com/Sirupsen/logrus/formatters/logstash/logstash.go
@@ -0,0 +1,48 @@
+package logstash
+
+import (
+ "encoding/json"
+ "fmt"
+ "github.com/Sirupsen/logrus"
+ "time"
+)
+
+// Formatter generates json in logstash format.
+// Logstash site: http://logstash.net/
+type LogstashFormatter struct {
+ Type string // if not empty use for logstash type field.
+}
+
+func (f *LogstashFormatter) Format(entry *logrus.Entry) ([]byte, error) {
+ entry.Data["@version"] = 1
+ entry.Data["@timestamp"] = entry.Time.Format(time.RFC3339)
+
+ // set message field
+ v, ok := entry.Data["message"]
+ if ok {
+ entry.Data["fields.message"] = v
+ }
+ entry.Data["message"] = entry.Message
+
+ // set level field
+ v, ok = entry.Data["level"]
+ if ok {
+ entry.Data["fields.level"] = v
+ }
+ entry.Data["level"] = entry.Level.String()
+
+ // set type field
+ if f.Type != "" {
+ v, ok = entry.Data["type"]
+ if ok {
+ entry.Data["fields.type"] = v
+ }
+ entry.Data["type"] = f.Type
+ }
+
+ serialized, err := json.Marshal(entry.Data)
+ if err != nil {
+ return nil, fmt.Errorf("Failed to marshal fields to JSON, %v", err)
+ }
+ return append(serialized, '\n'), nil
+}
diff --git a/vendor/src/github.com/Sirupsen/logrus/formatters/logstash/logstash_test.go b/vendor/src/github.com/Sirupsen/logrus/formatters/logstash/logstash_test.go
new file mode 100644
index 0000000000..d8814a0eae
--- /dev/null
+++ b/vendor/src/github.com/Sirupsen/logrus/formatters/logstash/logstash_test.go
@@ -0,0 +1,52 @@
+package logstash
+
+import (
+ "bytes"
+ "encoding/json"
+ "github.com/Sirupsen/logrus"
+ "github.com/stretchr/testify/assert"
+ "testing"
+)
+
+func TestLogstashFormatter(t *testing.T) {
+ assert := assert.New(t)
+
+ lf := LogstashFormatter{Type: "abc"}
+
+ fields := logrus.Fields{
+ "message": "def",
+ "level": "ijk",
+ "type": "lmn",
+ "one": 1,
+ "pi": 3.14,
+ "bool": true,
+ }
+
+ entry := logrus.WithFields(fields)
+ entry.Message = "msg"
+ entry.Level = logrus.InfoLevel
+
+ b, _ := lf.Format(entry)
+
+ var data map[string]interface{}
+ dec := json.NewDecoder(bytes.NewReader(b))
+ dec.UseNumber()
+ dec.Decode(&data)
+
+ // base fields
+ assert.Equal(json.Number("1"), data["@version"])
+ assert.NotEmpty(data["@timestamp"])
+ assert.Equal("abc", data["type"])
+ assert.Equal("msg", data["message"])
+ assert.Equal("info", data["level"])
+
+ // substituted fields
+ assert.Equal("def", data["fields.message"])
+ assert.Equal("ijk", data["fields.level"])
+ assert.Equal("lmn", data["fields.type"])
+
+ // formats
+ assert.Equal(json.Number("1"), data["one"])
+ assert.Equal(json.Number("3.14"), data["pi"])
+ assert.Equal(true, data["bool"])
+}
diff --git a/vendor/src/github.com/Sirupsen/logrus/hooks/airbrake/airbrake.go b/vendor/src/github.com/Sirupsen/logrus/hooks/airbrake/airbrake.go
index 880d21ecdc..b0502c335a 100644
--- a/vendor/src/github.com/Sirupsen/logrus/hooks/airbrake/airbrake.go
+++ b/vendor/src/github.com/Sirupsen/logrus/hooks/airbrake/airbrake.go
@@ -1,51 +1,51 @@
-package logrus_airbrake
+package airbrake
import (
+ "errors"
+ "fmt"
+
"github.com/Sirupsen/logrus"
"github.com/tobi/airbrake-go"
)
// AirbrakeHook to send exceptions to an exception-tracking service compatible
-// with the Airbrake API. You must set:
-// * airbrake.Endpoint
-// * airbrake.ApiKey
-// * airbrake.Environment (only sends exceptions when set to "production")
-//
-// Before using this hook, to send an error. Entries that trigger an Error,
-// Fatal or Panic should now include an "error" field to send to Airbrake.
-type AirbrakeHook struct{}
-
-func (hook *AirbrakeHook) Fire(entry *logrus.Entry) error {
- if entry.Data["error"] == nil {
- entry.Logger.WithFields(logrus.Fields{
- "source": "airbrake",
- "endpoint": airbrake.Endpoint,
- }).Warn("Exceptions sent to Airbrake must have an 'error' key with the error")
- return nil
+// with the Airbrake API.
+type airbrakeHook struct {
+ APIKey string
+ Endpoint string
+ Environment string
+}
+
+func NewHook(endpoint, apiKey, env string) *airbrakeHook {
+ return &airbrakeHook{
+ APIKey: apiKey,
+ Endpoint: endpoint,
+ Environment: env,
}
+}
+
+func (hook *airbrakeHook) Fire(entry *logrus.Entry) error {
+ airbrake.ApiKey = hook.APIKey
+ airbrake.Endpoint = hook.Endpoint
+ airbrake.Environment = hook.Environment
+ var notifyErr error
err, ok := entry.Data["error"].(error)
- if !ok {
- entry.Logger.WithFields(logrus.Fields{
- "source": "airbrake",
- "endpoint": airbrake.Endpoint,
- }).Warn("Exceptions sent to Airbrake must have an `error` key of type `error`")
- return nil
+ if ok {
+ notifyErr = err
+ } else {
+ notifyErr = errors.New(entry.Message)
}
- airErr := airbrake.Notify(err)
+ airErr := airbrake.Notify(notifyErr)
if airErr != nil {
- entry.Logger.WithFields(logrus.Fields{
- "source": "airbrake",
- "endpoint": airbrake.Endpoint,
- "error": airErr,
- }).Warn("Failed to send error to Airbrake")
+ return fmt.Errorf("Failed to send error to Airbrake: %s", airErr)
}
return nil
}
-func (hook *AirbrakeHook) Levels() []logrus.Level {
+func (hook *airbrakeHook) Levels() []logrus.Level {
return []logrus.Level{
logrus.ErrorLevel,
logrus.FatalLevel,
diff --git a/vendor/src/github.com/Sirupsen/logrus/hooks/airbrake/airbrake_test.go b/vendor/src/github.com/Sirupsen/logrus/hooks/airbrake/airbrake_test.go
new file mode 100644
index 0000000000..058a91e343
--- /dev/null
+++ b/vendor/src/github.com/Sirupsen/logrus/hooks/airbrake/airbrake_test.go
@@ -0,0 +1,133 @@
+package airbrake
+
+import (
+ "encoding/xml"
+ "net/http"
+ "net/http/httptest"
+ "testing"
+ "time"
+
+ "github.com/Sirupsen/logrus"
+)
+
+type notice struct {
+ Error NoticeError `xml:"error"`
+}
+type NoticeError struct {
+ Class string `xml:"class"`
+ Message string `xml:"message"`
+}
+
+type customErr struct {
+ msg string
+}
+
+func (e *customErr) Error() string {
+ return e.msg
+}
+
+const (
+ testAPIKey = "abcxyz"
+ testEnv = "development"
+ expectedClass = "*airbrake.customErr"
+ expectedMsg = "foo"
+ unintendedMsg = "Airbrake will not see this string"
+)
+
+var (
+ noticeError = make(chan NoticeError, 1)
+)
+
+// TestLogEntryMessageReceived checks if invoking Logrus' log.Error
+// method causes an XML payload containing the log entry message is received
+// by a HTTP server emulating an Airbrake-compatible endpoint.
+func TestLogEntryMessageReceived(t *testing.T) {
+ log := logrus.New()
+ ts := startAirbrakeServer(t)
+ defer ts.Close()
+
+ hook := NewHook(ts.URL, testAPIKey, "production")
+ log.Hooks.Add(hook)
+
+ log.Error(expectedMsg)
+
+ select {
+ case received := <-noticeError:
+ if received.Message != expectedMsg {
+ t.Errorf("Unexpected message received: %s", received.Message)
+ }
+ case <-time.After(time.Second):
+ t.Error("Timed out; no notice received by Airbrake API")
+ }
+}
+
+// TestLogEntryMessageReceived confirms that, when passing an error type using
+// logrus.Fields, a HTTP server emulating an Airbrake endpoint receives the
+// error message returned by the Error() method on the error interface
+// rather than the logrus.Entry.Message string.
+func TestLogEntryWithErrorReceived(t *testing.T) {
+ log := logrus.New()
+ ts := startAirbrakeServer(t)
+ defer ts.Close()
+
+ hook := NewHook(ts.URL, testAPIKey, "production")
+ log.Hooks.Add(hook)
+
+ log.WithFields(logrus.Fields{
+ "error": &customErr{expectedMsg},
+ }).Error(unintendedMsg)
+
+ select {
+ case received := <-noticeError:
+ if received.Message != expectedMsg {
+ t.Errorf("Unexpected message received: %s", received.Message)
+ }
+ if received.Class != expectedClass {
+ t.Errorf("Unexpected error class: %s", received.Class)
+ }
+ case <-time.After(time.Second):
+ t.Error("Timed out; no notice received by Airbrake API")
+ }
+}
+
+// TestLogEntryWithNonErrorTypeNotReceived confirms that, when passing a
+// non-error type using logrus.Fields, a HTTP server emulating an Airbrake
+// endpoint receives the logrus.Entry.Message string.
+//
+// Only error types are supported when setting the 'error' field using
+// logrus.WithFields().
+func TestLogEntryWithNonErrorTypeNotReceived(t *testing.T) {
+ log := logrus.New()
+ ts := startAirbrakeServer(t)
+ defer ts.Close()
+
+ hook := NewHook(ts.URL, testAPIKey, "production")
+ log.Hooks.Add(hook)
+
+ log.WithFields(logrus.Fields{
+ "error": expectedMsg,
+ }).Error(unintendedMsg)
+
+ select {
+ case received := <-noticeError:
+ if received.Message != unintendedMsg {
+ t.Errorf("Unexpected message received: %s", received.Message)
+ }
+ case <-time.After(time.Second):
+ t.Error("Timed out; no notice received by Airbrake API")
+ }
+}
+
+func startAirbrakeServer(t *testing.T) *httptest.Server {
+ ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ var notice notice
+ if err := xml.NewDecoder(r.Body).Decode(&notice); err != nil {
+ t.Error(err)
+ }
+ r.Body.Close()
+
+ noticeError <- notice.Error
+ }))
+
+ return ts
+}
diff --git a/vendor/src/github.com/Sirupsen/logrus/hooks/bugsnag/bugsnag.go b/vendor/src/github.com/Sirupsen/logrus/hooks/bugsnag/bugsnag.go
new file mode 100644
index 0000000000..d20a0f54ab
--- /dev/null
+++ b/vendor/src/github.com/Sirupsen/logrus/hooks/bugsnag/bugsnag.go
@@ -0,0 +1,68 @@
+package logrus_bugsnag
+
+import (
+ "errors"
+
+ "github.com/Sirupsen/logrus"
+ "github.com/bugsnag/bugsnag-go"
+)
+
+type bugsnagHook struct{}
+
+// ErrBugsnagUnconfigured is returned if NewBugsnagHook is called before
+// bugsnag.Configure. Bugsnag must be configured before the hook.
+var ErrBugsnagUnconfigured = errors.New("bugsnag must be configured before installing this logrus hook")
+
+// ErrBugsnagSendFailed indicates that the hook failed to submit an error to
+// bugsnag. The error was successfully generated, but `bugsnag.Notify()`
+// failed.
+type ErrBugsnagSendFailed struct {
+ err error
+}
+
+func (e ErrBugsnagSendFailed) Error() string {
+ return "failed to send error to Bugsnag: " + e.err.Error()
+}
+
+// NewBugsnagHook initializes a logrus hook which sends exceptions to an
+// exception-tracking service compatible with the Bugsnag API. Before using
+// this hook, you must call bugsnag.Configure(). The returned object should be
+// registered with a log via `AddHook()`
+//
+// Entries that trigger an Error, Fatal or Panic should now include an "error"
+// field to send to Bugsnag.
+func NewBugsnagHook() (*bugsnagHook, error) {
+ if bugsnag.Config.APIKey == "" {
+ return nil, ErrBugsnagUnconfigured
+ }
+ return &bugsnagHook{}, nil
+}
+
+// Fire forwards an error to Bugsnag. Given a logrus.Entry, it extracts the
+// "error" field (or the Message if the error isn't present) and sends it off.
+func (hook *bugsnagHook) Fire(entry *logrus.Entry) error {
+ var notifyErr error
+ err, ok := entry.Data["error"].(error)
+ if ok {
+ notifyErr = err
+ } else {
+ notifyErr = errors.New(entry.Message)
+ }
+
+ bugsnagErr := bugsnag.Notify(notifyErr)
+ if bugsnagErr != nil {
+ return ErrBugsnagSendFailed{bugsnagErr}
+ }
+
+ return nil
+}
+
+// Levels enumerates the log levels on which the error should be forwarded to
+// bugsnag: everything at or above the "Error" level.
+func (hook *bugsnagHook) Levels() []logrus.Level {
+ return []logrus.Level{
+ logrus.ErrorLevel,
+ logrus.FatalLevel,
+ logrus.PanicLevel,
+ }
+}
diff --git a/vendor/src/github.com/Sirupsen/logrus/hooks/bugsnag/bugsnag_test.go b/vendor/src/github.com/Sirupsen/logrus/hooks/bugsnag/bugsnag_test.go
new file mode 100644
index 0000000000..e9ea298d89
--- /dev/null
+++ b/vendor/src/github.com/Sirupsen/logrus/hooks/bugsnag/bugsnag_test.go
@@ -0,0 +1,64 @@
+package logrus_bugsnag
+
+import (
+ "encoding/json"
+ "errors"
+ "io/ioutil"
+ "net/http"
+ "net/http/httptest"
+ "testing"
+ "time"
+
+ "github.com/Sirupsen/logrus"
+ "github.com/bugsnag/bugsnag-go"
+)
+
+type notice struct {
+ Events []struct {
+ Exceptions []struct {
+ Message string `json:"message"`
+ } `json:"exceptions"`
+ } `json:"events"`
+}
+
+func TestNoticeReceived(t *testing.T) {
+ msg := make(chan string, 1)
+ expectedMsg := "foo"
+
+ ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ var notice notice
+ data, _ := ioutil.ReadAll(r.Body)
+ if err := json.Unmarshal(data, &notice); err != nil {
+ t.Error(err)
+ }
+ _ = r.Body.Close()
+
+ msg <- notice.Events[0].Exceptions[0].Message
+ }))
+ defer ts.Close()
+
+ hook := &bugsnagHook{}
+
+ bugsnag.Configure(bugsnag.Configuration{
+ Endpoint: ts.URL,
+ ReleaseStage: "production",
+ APIKey: "12345678901234567890123456789012",
+ Synchronous: true,
+ })
+
+ log := logrus.New()
+ log.Hooks.Add(hook)
+
+ log.WithFields(logrus.Fields{
+ "error": errors.New(expectedMsg),
+ }).Error("Bugsnag will not see this string")
+
+ select {
+ case received := <-msg:
+ if received != expectedMsg {
+ t.Errorf("Unexpected message received: %s", received)
+ }
+ case <-time.After(time.Second):
+ t.Error("Timed out; no notice received by Bugsnag API")
+ }
+}
diff --git a/vendor/src/github.com/Sirupsen/logrus/hooks/papertrail/papertrail.go b/vendor/src/github.com/Sirupsen/logrus/hooks/papertrail/papertrail.go
index 48e2feaeb5..c0f10c1bda 100644
--- a/vendor/src/github.com/Sirupsen/logrus/hooks/papertrail/papertrail.go
+++ b/vendor/src/github.com/Sirupsen/logrus/hooks/papertrail/papertrail.go
@@ -30,7 +30,8 @@ func NewPapertrailHook(host string, port int, appName string) (*PapertrailHook,
// Fire is called when a log event is fired.
func (hook *PapertrailHook) Fire(entry *logrus.Entry) error {
date := time.Now().Format(format)
- payload := fmt.Sprintf("<22> %s %s: [%s] %s", date, hook.AppName, entry.Data["level"], entry.Message)
+ msg, _ := entry.String()
+ payload := fmt.Sprintf("<22> %s %s: %s", date, hook.AppName, msg)
bytesWritten, err := hook.UDPConn.Write([]byte(payload))
if err != nil {
diff --git a/vendor/src/github.com/Sirupsen/logrus/hooks/sentry/README.md b/vendor/src/github.com/Sirupsen/logrus/hooks/sentry/README.md
new file mode 100644
index 0000000000..19e58bb457
--- /dev/null
+++ b/vendor/src/github.com/Sirupsen/logrus/hooks/sentry/README.md
@@ -0,0 +1,61 @@
+# Sentry Hook for Logrus <img src="http://i.imgur.com/hTeVwmJ.png" width="40" height="40" alt=":walrus:" class="emoji" title=":walrus:" />
+
+[Sentry](https://getsentry.com) provides both self-hosted and hosted
+solutions for exception tracking.
+Both client and server are
+[open source](https://github.com/getsentry/sentry).
+
+## Usage
+
+Every sentry application defined on the server gets a different
+[DSN](https://www.getsentry.com/docs/). In the example below replace
+`YOUR_DSN` with the one created for your application.
+
+```go
+import (
+ "github.com/Sirupsen/logrus"
+ "github.com/Sirupsen/logrus/hooks/sentry"
+)
+
+func main() {
+ log := logrus.New()
+ hook, err := logrus_sentry.NewSentryHook(YOUR_DSN, []logrus.Level{
+ logrus.PanicLevel,
+ logrus.FatalLevel,
+ logrus.ErrorLevel,
+ })
+
+ if err == nil {
+ log.Hooks.Add(hook)
+ }
+}
+```
+
+## Special fields
+
+Some logrus fields have a special meaning in this hook,
+these are server_name and logger.
+When logs are sent to sentry these fields are treated differently.
+- server_name (also known as hostname) is the name of the server which
+is logging the event (hostname.example.com)
+- logger is the part of the application which is logging the event.
+In go this usually means setting it to the name of the package.
+
+## Timeout
+
+`Timeout` is the time the sentry hook will wait for a response
+from the sentry server.
+
+If this time elapses with no response from
+the server an error will be returned.
+
+If `Timeout` is set to 0 the SentryHook will not wait for a reply
+and will assume a correct delivery.
+
+The SentryHook has a default timeout of `100 milliseconds` when created
+with a call to `NewSentryHook`. This can be changed by assigning a value to the `Timeout` field:
+
+```go
+hook, _ := logrus_sentry.NewSentryHook(...)
+hook.Timeout = 20*time.Second
+```
diff --git a/vendor/src/github.com/Sirupsen/logrus/hooks/sentry/sentry.go b/vendor/src/github.com/Sirupsen/logrus/hooks/sentry/sentry.go
new file mode 100644
index 0000000000..379f281c53
--- /dev/null
+++ b/vendor/src/github.com/Sirupsen/logrus/hooks/sentry/sentry.go
@@ -0,0 +1,100 @@
+package logrus_sentry
+
+import (
+ "fmt"
+ "time"
+
+ "github.com/Sirupsen/logrus"
+ "github.com/getsentry/raven-go"
+)
+
+var (
+ severityMap = map[logrus.Level]raven.Severity{
+ logrus.DebugLevel: raven.DEBUG,
+ logrus.InfoLevel: raven.INFO,
+ logrus.WarnLevel: raven.WARNING,
+ logrus.ErrorLevel: raven.ERROR,
+ logrus.FatalLevel: raven.FATAL,
+ logrus.PanicLevel: raven.FATAL,
+ }
+)
+
+func getAndDel(d logrus.Fields, key string) (string, bool) {
+ var (
+ ok bool
+ v interface{}
+ val string
+ )
+ if v, ok = d[key]; !ok {
+ return "", false
+ }
+
+ if val, ok = v.(string); !ok {
+ return "", false
+ }
+ delete(d, key)
+ return val, true
+}
+
+// SentryHook delivers logs to a sentry server.
+type SentryHook struct {
+ // Timeout sets the time to wait for a delivery error from the sentry server.
+ // If this is set to zero the server will not wait for any response and will
+ // consider the message correctly sent
+ Timeout time.Duration
+
+ client *raven.Client
+ levels []logrus.Level
+}
+
+// NewSentryHook creates a hook to be added to an instance of logger
+// and initializes the raven client.
+// This method sets the timeout to 100 milliseconds.
+func NewSentryHook(DSN string, levels []logrus.Level) (*SentryHook, error) {
+ client, err := raven.NewClient(DSN, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &SentryHook{100 * time.Millisecond, client, levels}, nil
+}
+
+// Called when an event should be sent to sentry
+// Special fields that sentry uses to give more information to the server
+// are extracted from entry.Data (if they are found)
+// These fields are: logger and server_name
+func (hook *SentryHook) Fire(entry *logrus.Entry) error {
+ packet := &raven.Packet{
+ Message: entry.Message,
+ Timestamp: raven.Timestamp(entry.Time),
+ Level: severityMap[entry.Level],
+ Platform: "go",
+ }
+
+ d := entry.Data
+
+ if logger, ok := getAndDel(d, "logger"); ok {
+ packet.Logger = logger
+ }
+ if serverName, ok := getAndDel(d, "server_name"); ok {
+ packet.ServerName = serverName
+ }
+ packet.Extra = map[string]interface{}(d)
+
+ _, errCh := hook.client.Capture(packet, nil)
+ timeout := hook.Timeout
+ if timeout != 0 {
+ timeoutCh := time.After(timeout)
+ select {
+ case err := <-errCh:
+ return err
+ case <-timeoutCh:
+ return fmt.Errorf("no response from sentry server in %s", timeout)
+ }
+ }
+ return nil
+}
+
+// Levels returns the available logging levels.
+func (hook *SentryHook) Levels() []logrus.Level {
+ return hook.levels
+}
diff --git a/vendor/src/github.com/Sirupsen/logrus/hooks/sentry/sentry_test.go b/vendor/src/github.com/Sirupsen/logrus/hooks/sentry/sentry_test.go
new file mode 100644
index 0000000000..45f18d1704
--- /dev/null
+++ b/vendor/src/github.com/Sirupsen/logrus/hooks/sentry/sentry_test.go
@@ -0,0 +1,97 @@
+package logrus_sentry
+
+import (
+ "encoding/json"
+ "fmt"
+ "io/ioutil"
+ "net/http"
+ "net/http/httptest"
+ "strings"
+ "testing"
+
+ "github.com/Sirupsen/logrus"
+ "github.com/getsentry/raven-go"
+)
+
+const (
+ message = "error message"
+ server_name = "testserver.internal"
+ logger_name = "test.logger"
+)
+
+func getTestLogger() *logrus.Logger {
+ l := logrus.New()
+ l.Out = ioutil.Discard
+ return l
+}
+
+func WithTestDSN(t *testing.T, tf func(string, <-chan *raven.Packet)) {
+ pch := make(chan *raven.Packet, 1)
+ s := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
+ defer req.Body.Close()
+ d := json.NewDecoder(req.Body)
+ p := &raven.Packet{}
+ err := d.Decode(p)
+ if err != nil {
+ t.Fatal(err.Error())
+ }
+
+ pch <- p
+ }))
+ defer s.Close()
+
+ fragments := strings.SplitN(s.URL, "://", 2)
+ dsn := fmt.Sprintf(
+ "%s://public:secret@%s/sentry/project-id",
+ fragments[0],
+ fragments[1],
+ )
+ tf(dsn, pch)
+}
+
+func TestSpecialFields(t *testing.T) {
+ WithTestDSN(t, func(dsn string, pch <-chan *raven.Packet) {
+ logger := getTestLogger()
+
+ hook, err := NewSentryHook(dsn, []logrus.Level{
+ logrus.ErrorLevel,
+ })
+
+ if err != nil {
+ t.Fatal(err.Error())
+ }
+ logger.Hooks.Add(hook)
+ logger.WithFields(logrus.Fields{
+ "server_name": server_name,
+ "logger": logger_name,
+ }).Error(message)
+
+ packet := <-pch
+ if packet.Logger != logger_name {
+ t.Errorf("logger should have been %s, was %s", logger_name, packet.Logger)
+ }
+
+ if packet.ServerName != server_name {
+ t.Errorf("server_name should have been %s, was %s", server_name, packet.ServerName)
+ }
+ })
+}
+
+func TestSentryHandler(t *testing.T) {
+ WithTestDSN(t, func(dsn string, pch <-chan *raven.Packet) {
+ logger := getTestLogger()
+ hook, err := NewSentryHook(dsn, []logrus.Level{
+ logrus.ErrorLevel,
+ })
+ if err != nil {
+ t.Fatal(err.Error())
+ }
+ logger.Hooks.Add(hook)
+
+ logger.Error(message)
+ packet := <-pch
+ if packet.Message != message {
+ t.Errorf("message should have been %s, was %s", message, packet.Message)
+ }
+ })
+}
diff --git a/vendor/src/github.com/Sirupsen/logrus/hooks/syslog/README.md b/vendor/src/github.com/Sirupsen/logrus/hooks/syslog/README.md
index cd706bc1b1..4dbb8e7290 100644
--- a/vendor/src/github.com/Sirupsen/logrus/hooks/syslog/README.md
+++ b/vendor/src/github.com/Sirupsen/logrus/hooks/syslog/README.md
@@ -6,7 +6,7 @@
import (
"log/syslog"
"github.com/Sirupsen/logrus"
- "github.com/Sirupsen/logrus/hooks/syslog"
+ logrus_syslog "github.com/Sirupsen/logrus/hooks/syslog"
)
func main() {
@@ -17,4 +17,4 @@ func main() {
log.Hooks.Add(hook)
}
}
-``` \ No newline at end of file
+```
diff --git a/vendor/src/github.com/Sirupsen/logrus/hooks/syslog/syslog.go b/vendor/src/github.com/Sirupsen/logrus/hooks/syslog/syslog.go
index 2a18ce6130..b6fa374628 100644
--- a/vendor/src/github.com/Sirupsen/logrus/hooks/syslog/syslog.go
+++ b/vendor/src/github.com/Sirupsen/logrus/hooks/syslog/syslog.go
@@ -29,18 +29,18 @@ func (hook *SyslogHook) Fire(entry *logrus.Entry) error {
return err
}
- switch entry.Data["level"] {
- case "panic":
+ switch entry.Level {
+ case logrus.PanicLevel:
return hook.Writer.Crit(line)
- case "fatal":
+ case logrus.FatalLevel:
return hook.Writer.Crit(line)
- case "error":
+ case logrus.ErrorLevel:
return hook.Writer.Err(line)
- case "warn":
+ case logrus.WarnLevel:
return hook.Writer.Warning(line)
- case "info":
+ case logrus.InfoLevel:
return hook.Writer.Info(line)
- case "debug":
+ case logrus.DebugLevel:
return hook.Writer.Debug(line)
default:
return nil
diff --git a/vendor/src/github.com/Sirupsen/logrus/json_formatter.go b/vendor/src/github.com/Sirupsen/logrus/json_formatter.go
index 9d11b642d4..5c4c44bbe5 100644
--- a/vendor/src/github.com/Sirupsen/logrus/json_formatter.go
+++ b/vendor/src/github.com/Sirupsen/logrus/json_formatter.go
@@ -9,12 +9,23 @@ import (
type JSONFormatter struct{}
func (f *JSONFormatter) Format(entry *Entry) ([]byte, error) {
- prefixFieldClashes(entry)
- entry.Data["time"] = entry.Time.Format(time.RFC3339)
- entry.Data["msg"] = entry.Message
- entry.Data["level"] = entry.Level.String()
+ data := make(Fields, len(entry.Data)+3)
+ for k, v := range entry.Data {
+ switch v := v.(type) {
+ case error:
+ // Otherwise errors are ignored by `encoding/json`
+ // https://github.com/Sirupsen/logrus/issues/137
+ data[k] = v.Error()
+ default:
+ data[k] = v
+ }
+ }
+ prefixFieldClashes(data)
+ data["time"] = entry.Time.Format(time.RFC3339)
+ data["msg"] = entry.Message
+ data["level"] = entry.Level.String()
- serialized, err := json.Marshal(entry.Data)
+ serialized, err := json.Marshal(data)
if err != nil {
return nil, fmt.Errorf("Failed to marshal fields to JSON, %v", err)
}
diff --git a/vendor/src/github.com/Sirupsen/logrus/json_formatter_test.go b/vendor/src/github.com/Sirupsen/logrus/json_formatter_test.go
new file mode 100644
index 0000000000..1d70873254
--- /dev/null
+++ b/vendor/src/github.com/Sirupsen/logrus/json_formatter_test.go
@@ -0,0 +1,120 @@
+package logrus
+
+import (
+ "encoding/json"
+ "errors"
+
+ "testing"
+)
+
+func TestErrorNotLost(t *testing.T) {
+ formatter := &JSONFormatter{}
+
+ b, err := formatter.Format(WithField("error", errors.New("wild walrus")))
+ if err != nil {
+ t.Fatal("Unable to format entry: ", err)
+ }
+
+ entry := make(map[string]interface{})
+ err = json.Unmarshal(b, &entry)
+ if err != nil {
+ t.Fatal("Unable to unmarshal formatted entry: ", err)
+ }
+
+ if entry["error"] != "wild walrus" {
+ t.Fatal("Error field not set")
+ }
+}
+
+func TestErrorNotLostOnFieldNotNamedError(t *testing.T) {
+ formatter := &JSONFormatter{}
+
+ b, err := formatter.Format(WithField("omg", errors.New("wild walrus")))
+ if err != nil {
+ t.Fatal("Unable to format entry: ", err)
+ }
+
+ entry := make(map[string]interface{})
+ err = json.Unmarshal(b, &entry)
+ if err != nil {
+ t.Fatal("Unable to unmarshal formatted entry: ", err)
+ }
+
+ if entry["omg"] != "wild walrus" {
+ t.Fatal("Error field not set")
+ }
+}
+
+func TestFieldClashWithTime(t *testing.T) {
+ formatter := &JSONFormatter{}
+
+ b, err := formatter.Format(WithField("time", "right now!"))
+ if err != nil {
+ t.Fatal("Unable to format entry: ", err)
+ }
+
+ entry := make(map[string]interface{})
+ err = json.Unmarshal(b, &entry)
+ if err != nil {
+ t.Fatal("Unable to unmarshal formatted entry: ", err)
+ }
+
+ if entry["fields.time"] != "right now!" {
+ t.Fatal("fields.time not set to original time field")
+ }
+
+ if entry["time"] != "0001-01-01T00:00:00Z" {
+ t.Fatal("time field not set to current time, was: ", entry["time"])
+ }
+}
+
+func TestFieldClashWithMsg(t *testing.T) {
+ formatter := &JSONFormatter{}
+
+ b, err := formatter.Format(WithField("msg", "something"))
+ if err != nil {
+ t.Fatal("Unable to format entry: ", err)
+ }
+
+ entry := make(map[string]interface{})
+ err = json.Unmarshal(b, &entry)
+ if err != nil {
+ t.Fatal("Unable to unmarshal formatted entry: ", err)
+ }
+
+ if entry["fields.msg"] != "something" {
+ t.Fatal("fields.msg not set to original msg field")
+ }
+}
+
+func TestFieldClashWithLevel(t *testing.T) {
+ formatter := &JSONFormatter{}
+
+ b, err := formatter.Format(WithField("level", "something"))
+ if err != nil {
+ t.Fatal("Unable to format entry: ", err)
+ }
+
+ entry := make(map[string]interface{})
+ err = json.Unmarshal(b, &entry)
+ if err != nil {
+ t.Fatal("Unable to unmarshal formatted entry: ", err)
+ }
+
+ if entry["fields.level"] != "something" {
+ t.Fatal("fields.level not set to original level field")
+ }
+}
+
+func TestJSONEntryEndsWithNewline(t *testing.T) {
+ formatter := &JSONFormatter{}
+
+ b, err := formatter.Format(WithField("level", "something"))
+ if err != nil {
+ t.Fatal("Unable to format entry: ", err)
+ }
+
+ if b[len(b)-1] != '\n' {
+ t.Fatal("Expected JSON log entry to end with a newline")
+ }
+}
diff --git a/vendor/src/github.com/Sirupsen/logrus/logger.go b/vendor/src/github.com/Sirupsen/logrus/logger.go
index 7374fe365d..da928a3750 100644
--- a/vendor/src/github.com/Sirupsen/logrus/logger.go
+++ b/vendor/src/github.com/Sirupsen/logrus/logger.go
@@ -38,7 +38,7 @@ type Logger struct {
// Out: os.Stderr,
// Formatter: new(JSONFormatter),
// Hooks: make(levelHooks),
-// Level: logrus.Debug,
+// Level: logrus.DebugLevel,
// }
//
// It's recommended to make this a global instance called `log`.
@@ -65,11 +65,15 @@ func (logger *Logger) WithFields(fields Fields) *Entry {
}
func (logger *Logger) Debugf(format string, args ...interface{}) {
- NewEntry(logger).Debugf(format, args...)
+ if logger.Level >= DebugLevel {
+ NewEntry(logger).Debugf(format, args...)
+ }
}
func (logger *Logger) Infof(format string, args ...interface{}) {
- NewEntry(logger).Infof(format, args...)
+ if logger.Level >= InfoLevel {
+ NewEntry(logger).Infof(format, args...)
+ }
}
func (logger *Logger) Printf(format string, args ...interface{}) {
@@ -77,31 +81,45 @@ func (logger *Logger) Printf(format string, args ...interface{}) {
}
func (logger *Logger) Warnf(format string, args ...interface{}) {
- NewEntry(logger).Warnf(format, args...)
+ if logger.Level >= WarnLevel {
+ NewEntry(logger).Warnf(format, args...)
+ }
}
func (logger *Logger) Warningf(format string, args ...interface{}) {
- NewEntry(logger).Warnf(format, args...)
+ if logger.Level >= WarnLevel {
+ NewEntry(logger).Warnf(format, args...)
+ }
}
func (logger *Logger) Errorf(format string, args ...interface{}) {
- NewEntry(logger).Errorf(format, args...)
+ if logger.Level >= ErrorLevel {
+ NewEntry(logger).Errorf(format, args...)
+ }
}
func (logger *Logger) Fatalf(format string, args ...interface{}) {
- NewEntry(logger).Fatalf(format, args...)
+ if logger.Level >= FatalLevel {
+ NewEntry(logger).Fatalf(format, args...)
+ }
}
func (logger *Logger) Panicf(format string, args ...interface{}) {
- NewEntry(logger).Panicf(format, args...)
+ if logger.Level >= PanicLevel {
+ NewEntry(logger).Panicf(format, args...)
+ }
}
func (logger *Logger) Debug(args ...interface{}) {
- NewEntry(logger).Debug(args...)
+ if logger.Level >= DebugLevel {
+ NewEntry(logger).Debug(args...)
+ }
}
func (logger *Logger) Info(args ...interface{}) {
- NewEntry(logger).Info(args...)
+ if logger.Level >= InfoLevel {
+ NewEntry(logger).Info(args...)
+ }
}
func (logger *Logger) Print(args ...interface{}) {
@@ -109,31 +127,45 @@ func (logger *Logger) Print(args ...interface{}) {
}
func (logger *Logger) Warn(args ...interface{}) {
- NewEntry(logger).Warn(args...)
+ if logger.Level >= WarnLevel {
+ NewEntry(logger).Warn(args...)
+ }
}
func (logger *Logger) Warning(args ...interface{}) {
- NewEntry(logger).Warn(args...)
+ if logger.Level >= WarnLevel {
+ NewEntry(logger).Warn(args...)
+ }
}
func (logger *Logger) Error(args ...interface{}) {
- NewEntry(logger).Error(args...)
+ if logger.Level >= ErrorLevel {
+ NewEntry(logger).Error(args...)
+ }
}
func (logger *Logger) Fatal(args ...interface{}) {
- NewEntry(logger).Fatal(args...)
+ if logger.Level >= FatalLevel {
+ NewEntry(logger).Fatal(args...)
+ }
}
func (logger *Logger) Panic(args ...interface{}) {
- NewEntry(logger).Panic(args...)
+ if logger.Level >= PanicLevel {
+ NewEntry(logger).Panic(args...)
+ }
}
func (logger *Logger) Debugln(args ...interface{}) {
- NewEntry(logger).Debugln(args...)
+ if logger.Level >= DebugLevel {
+ NewEntry(logger).Debugln(args...)
+ }
}
func (logger *Logger) Infoln(args ...interface{}) {
- NewEntry(logger).Infoln(args...)
+ if logger.Level >= InfoLevel {
+ NewEntry(logger).Infoln(args...)
+ }
}
func (logger *Logger) Println(args ...interface{}) {
@@ -141,21 +173,31 @@ func (logger *Logger) Println(args ...interface{}) {
}
func (logger *Logger) Warnln(args ...interface{}) {
- NewEntry(logger).Warnln(args...)
+ if logger.Level >= WarnLevel {
+ NewEntry(logger).Warnln(args...)
+ }
}
func (logger *Logger) Warningln(args ...interface{}) {
- NewEntry(logger).Warnln(args...)
+ if logger.Level >= WarnLevel {
+ NewEntry(logger).Warnln(args...)
+ }
}
func (logger *Logger) Errorln(args ...interface{}) {
- NewEntry(logger).Errorln(args...)
+ if logger.Level >= ErrorLevel {
+ NewEntry(logger).Errorln(args...)
+ }
}
func (logger *Logger) Fatalln(args ...interface{}) {
- NewEntry(logger).Fatalln(args...)
+ if logger.Level >= FatalLevel {
+ NewEntry(logger).Fatalln(args...)
+ }
}
func (logger *Logger) Panicln(args ...interface{}) {
- NewEntry(logger).Panicln(args...)
+ if logger.Level >= PanicLevel {
+ NewEntry(logger).Panicln(args...)
+ }
}
diff --git a/vendor/src/github.com/Sirupsen/logrus/logrus_test.go b/vendor/src/github.com/Sirupsen/logrus/logrus_test.go
index 15157d172d..d85dba4dcb 100644
--- a/vendor/src/github.com/Sirupsen/logrus/logrus_test.go
+++ b/vendor/src/github.com/Sirupsen/logrus/logrus_test.go
@@ -5,6 +5,7 @@ import (
"encoding/json"
"strconv"
"strings"
+ "sync"
"testing"
"github.com/stretchr/testify/assert"
@@ -44,8 +45,12 @@ func LogAndAssertText(t *testing.T, log func(*Logger), assertions func(fields ma
}
kvArr := strings.Split(kv, "=")
key := strings.TrimSpace(kvArr[0])
- val, err := strconv.Unquote(kvArr[1])
- assert.NoError(t, err)
+ val := kvArr[1]
+ if kvArr[1][0] == '"' {
+ var err error
+ val, err = strconv.Unquote(val)
+ assert.NoError(t, err)
+ }
fields[key] = val
}
assertions(fields)
@@ -204,6 +209,38 @@ func TestDefaultFieldsAreNotPrefixed(t *testing.T) {
})
}
+func TestDoubleLoggingDoesntPrefixPreviousFields(t *testing.T) {
+
+ var buffer bytes.Buffer
+ var fields Fields
+
+ logger := New()
+ logger.Out = &buffer
+ logger.Formatter = new(JSONFormatter)
+
+ llog := logger.WithField("context", "eating raw fish")
+
+ llog.Info("looks delicious")
+
+ err := json.Unmarshal(buffer.Bytes(), &fields)
+ assert.NoError(t, err, "should have decoded first message")
+ assert.Equal(t, len(fields), 4, "should only have msg/time/level/context fields")
+ assert.Equal(t, fields["msg"], "looks delicious")
+ assert.Equal(t, fields["context"], "eating raw fish")
+
+ buffer.Reset()
+
+ llog.Warn("omg it is!")
+
+ err = json.Unmarshal(buffer.Bytes(), &fields)
+ assert.NoError(t, err, "should have decoded second message")
+ assert.Equal(t, len(fields), 4, "should only have msg/time/level/context fields")
+ assert.Equal(t, fields["msg"], "omg it is!")
+ assert.Equal(t, fields["context"], "eating raw fish")
+ assert.Nil(t, fields["fields.msg"], "should not have prefixed previous `msg` entry")
+
+}
+
func TestConvertLevelToString(t *testing.T) {
assert.Equal(t, "debug", DebugLevel.String())
assert.Equal(t, "info", InfoLevel.String())
@@ -245,3 +282,20 @@ func TestParseLevel(t *testing.T) {
l, err = ParseLevel("invalid")
assert.Equal(t, "not a valid logrus Level: \"invalid\"", err.Error())
}
+
+func TestGetSetLevelRace(t *testing.T) {
+ wg := sync.WaitGroup{}
+ for i := 0; i < 100; i++ {
+ wg.Add(1)
+ go func(i int) {
+ defer wg.Done()
+ if i%2 == 0 {
+ SetLevel(InfoLevel)
+ } else {
+ GetLevel()
+ }
+ }(i)
+
+ }
+ wg.Wait()
+}
diff --git a/vendor/src/github.com/Sirupsen/logrus/terminal_notwindows.go b/vendor/src/github.com/Sirupsen/logrus/terminal_notwindows.go
index 276447bd5c..b8bebc13ee 100644
--- a/vendor/src/github.com/Sirupsen/logrus/terminal_notwindows.go
+++ b/vendor/src/github.com/Sirupsen/logrus/terminal_notwindows.go
@@ -3,7 +3,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-// +build linux,!appengine darwin freebsd
+// +build linux darwin freebsd openbsd
package logrus
diff --git a/vendor/src/github.com/Sirupsen/logrus/terminal_openbsd.go b/vendor/src/github.com/Sirupsen/logrus/terminal_openbsd.go
new file mode 100644
index 0000000000..af609a53d6
--- /dev/null
+++ b/vendor/src/github.com/Sirupsen/logrus/terminal_openbsd.go
@@ -0,0 +1,7 @@
+package logrus
+
+import "syscall"
+
+const ioctlReadTermios = syscall.TIOCGETA
+
+type Termios syscall.Termios
diff --git a/vendor/src/github.com/Sirupsen/logrus/text_formatter.go b/vendor/src/github.com/Sirupsen/logrus/text_formatter.go
index fc0a4082a7..0a06a1105f 100644
--- a/vendor/src/github.com/Sirupsen/logrus/text_formatter.go
+++ b/vendor/src/github.com/Sirupsen/logrus/text_formatter.go
@@ -14,6 +14,7 @@ const (
green = 32
yellow = 33
blue = 34
+ gray = 37
)
var (
@@ -32,28 +33,47 @@ func miniTS() int {
type TextFormatter struct {
// Set to true to bypass checking for a TTY before outputting colors.
- ForceColors bool
+ ForceColors bool
+
+ // Force disabling colors.
DisableColors bool
+
+ // Disable timestamp logging. useful when output is redirected to logging
+ // system that already adds timestamps.
+ DisableTimestamp bool
+
+ // Enable logging the full timestamp when a TTY is attached instead of just
+ // the time passed since beginning of execution.
+ FullTimestamp bool
+
+ // The fields are sorted by default for a consistent output. For applications
+ // that log extremely frequently and don't use the JSON formatter this may not
+ // be desired.
+ DisableSorting bool
}
func (f *TextFormatter) Format(entry *Entry) ([]byte, error) {
-
- var keys []string
+ var keys []string = make([]string, 0, len(entry.Data))
for k := range entry.Data {
keys = append(keys, k)
}
- sort.Strings(keys)
+
+ if !f.DisableSorting {
+ sort.Strings(keys)
+ }
b := &bytes.Buffer{}
- prefixFieldClashes(entry)
+ prefixFieldClashes(entry.Data)
isColored := (f.ForceColors || isTerminal) && !f.DisableColors
if isColored {
- printColored(b, entry, keys)
+ f.printColored(b, entry, keys)
} else {
- f.appendKeyValue(b, "time", entry.Time.Format(time.RFC3339))
+ if !f.DisableTimestamp {
+ f.appendKeyValue(b, "time", entry.Time.Format(time.RFC3339))
+ }
f.appendKeyValue(b, "level", entry.Level.String())
f.appendKeyValue(b, "msg", entry.Message)
for _, key := range keys {
@@ -65,9 +85,11 @@ func (f *TextFormatter) Format(entry *Entry) ([]byte, error) {
return b.Bytes(), nil
}
-func printColored(b *bytes.Buffer, entry *Entry, keys []string) {
+func (f *TextFormatter) printColored(b *bytes.Buffer, entry *Entry, keys []string) {
var levelColor int
switch entry.Level {
+ case DebugLevel:
+ levelColor = gray
case WarnLevel:
levelColor = yellow
case ErrorLevel, FatalLevel, PanicLevel:
@@ -78,17 +100,43 @@ func printColored(b *bytes.Buffer, entry *Entry, keys []string) {
levelText := strings.ToUpper(entry.Level.String())[0:4]
- fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m[%04d] %-44s ", levelColor, levelText, miniTS(), entry.Message)
+ if !f.FullTimestamp {
+ fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m[%04d] %-44s ", levelColor, levelText, miniTS(), entry.Message)
+ } else {
+ fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m[%s] %-44s ", levelColor, levelText, entry.Time.Format(time.RFC3339), entry.Message)
+ }
for _, k := range keys {
v := entry.Data[k]
fmt.Fprintf(b, " \x1b[%dm%s\x1b[0m=%v", levelColor, k, v)
}
}
+func needsQuoting(text string) bool {
+ for _, ch := range text {
+ if !((ch >= 'a' && ch <= 'z') ||
+ (ch >= 'A' && ch <= 'Z') ||
+ (ch >= '0' && ch <= '9') ||
+ ch == '-' || ch == '.') {
+ return false
+ }
+ }
+ return true
+}
+
func (f *TextFormatter) appendKeyValue(b *bytes.Buffer, key, value interface{}) {
switch value.(type) {
- case string, error:
- fmt.Fprintf(b, "%v=%q ", key, value)
+ case string:
+ if needsQuoting(value.(string)) {
+ fmt.Fprintf(b, "%v=%s ", key, value)
+ } else {
+ fmt.Fprintf(b, "%v=%q ", key, value)
+ }
+ case error:
+ if needsQuoting(value.(error).Error()) {
+ fmt.Fprintf(b, "%v=%s ", key, value)
+ } else {
+ fmt.Fprintf(b, "%v=%q ", key, value)
+ }
default:
fmt.Fprintf(b, "%v=%v ", key, value)
}
diff --git a/vendor/src/github.com/Sirupsen/logrus/text_formatter_test.go b/vendor/src/github.com/Sirupsen/logrus/text_formatter_test.go
new file mode 100644
index 0000000000..28a9499079
--- /dev/null
+++ b/vendor/src/github.com/Sirupsen/logrus/text_formatter_test.go
@@ -0,0 +1,37 @@
+package logrus
+
+import (
+ "bytes"
+ "errors"
+
+ "testing"
+)
+
+func TestQuoting(t *testing.T) {
+ tf := &TextFormatter{DisableColors: true}
+
+ checkQuoting := func(q bool, value interface{}) {
+ b, _ := tf.Format(WithField("test", value))
+ idx := bytes.Index(b, ([]byte)("test="))
+ cont := bytes.Contains(b[idx+5:], []byte{'"'})
+ if cont != q {
+ if q {
+ t.Errorf("quoting expected for: %#v", value)
+ } else {
+ t.Errorf("quoting not expected for: %#v", value)
+ }
+ }
+ }
+
+ checkQuoting(false, "abcd")
+ checkQuoting(false, "v1.0")
+ checkQuoting(false, "1234567890")
+ checkQuoting(true, "/foobar")
+ checkQuoting(true, "x y")
+ checkQuoting(true, "x,y")
+ checkQuoting(false, errors.New("invalid"))
+ checkQuoting(true, errors.New("invalid argument"))
+}
+
+// TODO add tests for sorting etc., this requires a parser for the text
+// formatter output.
diff --git a/vendor/src/github.com/Sirupsen/logrus/writer.go b/vendor/src/github.com/Sirupsen/logrus/writer.go
new file mode 100644
index 0000000000..1e30b1c753
--- /dev/null
+++ b/vendor/src/github.com/Sirupsen/logrus/writer.go
@@ -0,0 +1,31 @@
+package logrus
+
+import (
+ "bufio"
+ "io"
+ "runtime"
+)
+
+func (logger *Logger) Writer() *io.PipeWriter {
+ reader, writer := io.Pipe()
+
+ go logger.writerScanner(reader)
+ runtime.SetFinalizer(writer, writerFinalizer)
+
+ return writer
+}
+
+func (logger *Logger) writerScanner(reader *io.PipeReader) {
+ scanner := bufio.NewScanner(reader)
+ for scanner.Scan() {
+ logger.Print(scanner.Text())
+ }
+ if err := scanner.Err(); err != nil {
+ logger.Errorf("Error while reading from Writer: %s", err)
+ }
+ reader.Close()
+}
+
+func writerFinalizer(writer *io.PipeWriter) {
+ writer.Close()
+}
diff --git a/vendor/src/github.com/docker/distribution/digest/digest.go b/vendor/src/github.com/docker/distribution/digest/digest.go
new file mode 100644
index 0000000000..d640026cb8
--- /dev/null
+++ b/vendor/src/github.com/docker/distribution/digest/digest.go
@@ -0,0 +1,168 @@
+package digest
+
+import (
+ "bytes"
+ "crypto/sha256"
+ "fmt"
+ "hash"
+ "io"
+ "io/ioutil"
+ "regexp"
+ "strings"
+
+ "github.com/docker/docker/pkg/tarsum"
+)
+
+const (
+ // DigestTarSumV1EmptyTar is the digest for the empty tar file.
+ DigestTarSumV1EmptyTar = "tarsum.v1+sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ // DigestSha256EmptyTar is the canonical sha256 digest of empty data
+ DigestSha256EmptyTar = "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+)
+
+// Digest allows simple protection of hex formatted digest strings, prefixed
+// by their algorithm. Strings of type Digest have some guarantee of being in
+// the correct format and it provides quick access to the components of a
+// digest string.
+//
+// The following is an example of the contents of Digest types:
+//
+// sha256:7173b809ca12ec5dee4506cd86be934c4596dd234ee82c0662eac04a8c2c71dc
+//
+// More important for this code base, this type is compatible with tarsum
+// digests. For example, the following would be a valid Digest:
+//
+// tarsum+sha256:e58fcf7418d4390dec8e8fb69d88c06ec07039d651fedd3aa72af9972e7d046b
+//
+// This allows to abstract the digest behind this type and work only in those
+// terms.
+type Digest string
+
+// NewDigest returns a Digest from alg and a hash.Hash object.
+func NewDigest(alg string, h hash.Hash) Digest {
+ return Digest(fmt.Sprintf("%s:%x", alg, h.Sum(nil)))
+}
+
+// NewDigestFromHex returns a Digest from alg and a the hex encoded digest.
+func NewDigestFromHex(alg, hex string) Digest {
+ return Digest(fmt.Sprintf("%s:%s", alg, hex))
+}
+
+// DigestRegexp matches valid digest types.
+var DigestRegexp = regexp.MustCompile(`[a-zA-Z0-9-_+.]+:[a-fA-F0-9]+`)
+
+// DigestRegexpAnchored matches valid digest types, anchored to the start and end of the match.
+var DigestRegexpAnchored = regexp.MustCompile(`^` + DigestRegexp.String() + `$`)
+
+var (
+ // ErrDigestInvalidFormat returned when digest format invalid.
+ ErrDigestInvalidFormat = fmt.Errorf("invalid checksum digest format")
+
+ // ErrDigestUnsupported returned when the digest algorithm is unsupported.
+ ErrDigestUnsupported = fmt.Errorf("unsupported digest algorithm")
+)
+
+// ParseDigest parses s and returns the validated digest object. An error will
+// be returned if the format is invalid.
+func ParseDigest(s string) (Digest, error) {
+ d := Digest(s)
+
+ return d, d.Validate()
+}
+
+// FromReader returns the most valid digest for the underlying content.
+func FromReader(rd io.Reader) (Digest, error) {
+ h := sha256.New()
+
+ if _, err := io.Copy(h, rd); err != nil {
+ return "", err
+ }
+
+ return NewDigest("sha256", h), nil
+}
+
+// FromTarArchive produces a tarsum digest from reader rd.
+func FromTarArchive(rd io.Reader) (Digest, error) {
+ ts, err := tarsum.NewTarSum(rd, true, tarsum.Version1)
+ if err != nil {
+ return "", err
+ }
+
+ if _, err := io.Copy(ioutil.Discard, ts); err != nil {
+ return "", err
+ }
+
+ d, err := ParseDigest(ts.Sum(nil))
+ if err != nil {
+ return "", err
+ }
+
+ return d, nil
+}
+
+// FromBytes digests the input and returns a Digest.
+func FromBytes(p []byte) (Digest, error) {
+ return FromReader(bytes.NewReader(p))
+}
+
+// Validate checks that the contents of d is a valid digest, returning an
+// error if not.
+func (d Digest) Validate() error {
+ s := string(d)
+ // Common case will be tarsum
+ _, err := ParseTarSum(s)
+ if err == nil {
+ return nil
+ }
+
+ // Continue on for general parser
+
+ if !DigestRegexpAnchored.MatchString(s) {
+ return ErrDigestInvalidFormat
+ }
+
+ i := strings.Index(s, ":")
+ if i < 0 {
+ return ErrDigestInvalidFormat
+ }
+
+ // case: "sha256:" with no hex.
+ if i+1 == len(s) {
+ return ErrDigestInvalidFormat
+ }
+
+ switch s[:i] {
+ case "sha256", "sha384", "sha512":
+ break
+ default:
+ return ErrDigestUnsupported
+ }
+
+ return nil
+}
+
+// Algorithm returns the algorithm portion of the digest. This will panic if
+// the underlying digest is not in a valid format.
+func (d Digest) Algorithm() string {
+ return string(d[:d.sepIndex()])
+}
+
+// Hex returns the hex digest portion of the digest. This will panic if the
+// underlying digest is not in a valid format.
+func (d Digest) Hex() string {
+ return string(d[d.sepIndex()+1:])
+}
+
+func (d Digest) String() string {
+ return string(d)
+}
+
+func (d Digest) sepIndex() int {
+ i := strings.Index(string(d), ":")
+
+ if i < 0 {
+ panic("could not find ':' in digest: " + d)
+ }
+
+ return i
+}
diff --git a/vendor/src/github.com/docker/distribution/digest/digest_test.go b/vendor/src/github.com/docker/distribution/digest/digest_test.go
new file mode 100644
index 0000000000..9e9ae35669
--- /dev/null
+++ b/vendor/src/github.com/docker/distribution/digest/digest_test.go
@@ -0,0 +1,111 @@
+package digest
+
+import (
+ "bytes"
+ "io"
+ "testing"
+)
+
+func TestParseDigest(t *testing.T) {
+ for _, testcase := range []struct {
+ input string
+ err error
+ algorithm string
+ hex string
+ }{
+ {
+ input: "tarsum+sha256:e58fcf7418d4390dec8e8fb69d88c06ec07039d651fedd3aa72af9972e7d046b",
+ algorithm: "tarsum+sha256",
+ hex: "e58fcf7418d4390dec8e8fb69d88c06ec07039d651fedd3aa72af9972e7d046b",
+ },
+ {
+ input: "tarsum.dev+sha256:e58fcf7418d4390dec8e8fb69d88c06ec07039d651fedd3aa72af9972e7d046b",
+ algorithm: "tarsum.dev+sha256",
+ hex: "e58fcf7418d4390dec8e8fb69d88c06ec07039d651fedd3aa72af9972e7d046b",
+ },
+ {
+ input: "tarsum.v1+sha256:220a60ecd4a3c32c282622a625a54db9ba0ff55b5ba9c29c7064a2bc358b6a3e",
+ algorithm: "tarsum.v1+sha256",
+ hex: "220a60ecd4a3c32c282622a625a54db9ba0ff55b5ba9c29c7064a2bc358b6a3e",
+ },
+ {
+ input: "sha256:e58fcf7418d4390dec8e8fb69d88c06ec07039d651fedd3aa72af9972e7d046b",
+ algorithm: "sha256",
+ hex: "e58fcf7418d4390dec8e8fb69d88c06ec07039d651fedd3aa72af9972e7d046b",
+ },
+ {
+ input: "sha384:d3fc7881460b7e22e3d172954463dddd7866d17597e7248453c48b3e9d26d9596bf9c4a9cf8072c9d5bad76e19af801d",
+ algorithm: "sha384",
+ hex: "d3fc7881460b7e22e3d172954463dddd7866d17597e7248453c48b3e9d26d9596bf9c4a9cf8072c9d5bad76e19af801d",
+ },
+ {
+ // empty hex
+ input: "sha256:",
+ err: ErrDigestInvalidFormat,
+ },
+ {
+ // just hex
+ input: "d41d8cd98f00b204e9800998ecf8427e",
+ err: ErrDigestInvalidFormat,
+ },
+ {
+ // not hex
+ input: "sha256:d41d8cd98f00b204e9800m98ecf8427e",
+ err: ErrDigestInvalidFormat,
+ },
+ {
+ input: "foo:d41d8cd98f00b204e9800998ecf8427e",
+ err: ErrDigestUnsupported,
+ },
+ } {
+ digest, err := ParseDigest(testcase.input)
+ if err != testcase.err {
+ t.Fatalf("error differed from expected while parsing %q: %v != %v", testcase.input, err, testcase.err)
+ }
+
+ if testcase.err != nil {
+ continue
+ }
+
+ if digest.Algorithm() != testcase.algorithm {
+ t.Fatalf("incorrect algorithm for parsed digest: %q != %q", digest.Algorithm(), testcase.algorithm)
+ }
+
+ if digest.Hex() != testcase.hex {
+ t.Fatalf("incorrect hex for parsed digest: %q != %q", digest.Hex(), testcase.hex)
+ }
+
+ // Parse string return value and check equality
+ newParsed, err := ParseDigest(digest.String())
+
+ if err != nil {
+ t.Fatalf("unexpected error parsing input %q: %v", testcase.input, err)
+ }
+
+ if newParsed != digest {
+ t.Fatalf("expected equal: %q != %q", newParsed, digest)
+ }
+ }
+}
+
+// A few test cases used to fix behavior we expect in storage backend.
+
+func TestFromTarArchiveZeroLength(t *testing.T) {
+ checkTarsumDigest(t, "zero-length archive", bytes.NewReader([]byte{}), DigestTarSumV1EmptyTar)
+}
+
+func TestFromTarArchiveEmptyTar(t *testing.T) {
+ // String of 1024 zeros is a valid, empty tar file.
+ checkTarsumDigest(t, "1024 zero bytes", bytes.NewReader(bytes.Repeat([]byte("\x00"), 1024)), DigestTarSumV1EmptyTar)
+}
+
+func checkTarsumDigest(t *testing.T, msg string, rd io.Reader, expected Digest) {
+ dgst, err := FromTarArchive(rd)
+ if err != nil {
+ t.Fatalf("unexpected error digesting %s: %v", msg, err)
+ }
+
+ if dgst != expected {
+ t.Fatalf("unexpected digest for %s: %q != %q", msg, dgst, expected)
+ }
+}
diff --git a/vendor/src/github.com/docker/distribution/digest/digester.go b/vendor/src/github.com/docker/distribution/digest/digester.go
new file mode 100644
index 0000000000..9094d662e4
--- /dev/null
+++ b/vendor/src/github.com/docker/distribution/digest/digester.go
@@ -0,0 +1,44 @@
+package digest
+
+import (
+ "crypto/sha256"
+ "hash"
+)
+
+// Digester calculates the digest of written data. It is functionally
+// equivalent to hash.Hash but provides methods for returning the Digest type
+// rather than raw bytes.
+type Digester struct {
+ alg string
+ hash hash.Hash
+}
+
+// NewDigester create a new Digester with the given hashing algorithm and instance
+// of that algo's hasher.
+func NewDigester(alg string, h hash.Hash) Digester {
+ return Digester{
+ alg: alg,
+ hash: h,
+ }
+}
+
+// NewCanonicalDigester is a convenience function to create a new Digester with
+// out default settings.
+func NewCanonicalDigester() Digester {
+ return NewDigester("sha256", sha256.New())
+}
+
+// Write data to the digester. These writes cannot fail.
+func (d *Digester) Write(p []byte) (n int, err error) {
+ return d.hash.Write(p)
+}
+
+// Digest returns the current digest for this digester.
+func (d *Digester) Digest() Digest {
+ return NewDigest(d.alg, d.hash)
+}
+
+// Reset the state of the digester.
+func (d *Digester) Reset() {
+ d.hash.Reset()
+}
diff --git a/vendor/src/github.com/docker/distribution/digest/doc.go b/vendor/src/github.com/docker/distribution/digest/doc.go
new file mode 100644
index 0000000000..278c50e011
--- /dev/null
+++ b/vendor/src/github.com/docker/distribution/digest/doc.go
@@ -0,0 +1,52 @@
+// Package digest provides a generalized type to opaquely represent message
+// digests and their operations within the registry. The Digest type is
+// designed to serve as a flexible identifier in a content-addressable system.
+// More importantly, it provides tools and wrappers to work with tarsums and
+// hash.Hash-based digests with little effort.
+//
+// Basics
+//
+// The format of a digest is simply a string with two parts, dubbed the
+// "algorithm" and the "digest", separated by a colon:
+//
+// <algorithm>:<digest>
+//
+// An example of a sha256 digest representation follows:
+//
+// sha256:7173b809ca12ec5dee4506cd86be934c4596dd234ee82c0662eac04a8c2c71dc
+//
+// In this case, the string "sha256" is the algorithm and the hex bytes are
+// the "digest". A tarsum example will be more illustrative of the use case
+// involved in the registry:
+//
+// tarsum+sha256:e58fcf7418d4390dec8e8fb69d88c06ec07039d651fedd3aa72af9972e7d046b
+//
+// For this, we consider the algorithm to be "tarsum+sha256". Prudent
+// applications will favor the ParseDigest function to verify the format over
+// using simple type casts. However, a normal string can be cast as a digest
+// with a simple type conversion:
+//
+// Digest("tarsum+sha256:e58fcf7418d4390dec8e8fb69d88c06ec07039d651fedd3aa72af9972e7d046b")
+//
+// Because the Digest type is simply a string, once a valid Digest is
+// obtained, comparisons are cheap, quick and simple to express with the
+// standard equality operator.
+//
+// Verification
+//
+// The main benefit of using the Digest type is simple verification against a
+// given digest. The Verifier interface, modeled after the stdlib hash.Hash
+// interface, provides a common write sink for digest verification. After
+// writing is complete, calling the Verifier.Verified method will indicate
+// whether or not the stream of bytes matches the target digest.
+//
+// Missing Features
+//
+// In addition to the above, we intend to add the following features to this
+// package:
+//
+// 1. A Digester type that supports write sink digest calculation.
+//
+// 2. Suspend and resume of ongoing digest calculations to support efficient digest verification in the registry.
+//
+package digest
diff --git a/vendor/src/github.com/docker/distribution/digest/tarsum.go b/vendor/src/github.com/docker/distribution/digest/tarsum.go
new file mode 100644
index 0000000000..acf878b629
--- /dev/null
+++ b/vendor/src/github.com/docker/distribution/digest/tarsum.go
@@ -0,0 +1,70 @@
+package digest
+
+import (
+ "fmt"
+
+ "regexp"
+)
+
+// TarSumRegexp defines a reguler expression to match tarsum identifiers.
+var TarsumRegexp = regexp.MustCompile("tarsum(?:.[a-z0-9]+)?\\+[a-zA-Z0-9]+:[A-Fa-f0-9]+")
+
+// TarsumRegexpCapturing defines a reguler expression to match tarsum identifiers with
+// capture groups corresponding to each component.
+var TarsumRegexpCapturing = regexp.MustCompile("(tarsum)(.([a-z0-9]+))?\\+([a-zA-Z0-9]+):([A-Fa-f0-9]+)")
+
+// TarSumInfo contains information about a parsed tarsum.
+type TarSumInfo struct {
+ // Version contains the version of the tarsum.
+ Version string
+
+ // Algorithm contains the algorithm for the final digest
+ Algorithm string
+
+ // Digest contains the hex-encoded digest.
+ Digest string
+}
+
+// InvalidTarSumError provides informations about a TarSum that cannot be parsed
+// by ParseTarSum.
+type InvalidTarSumError string
+
+func (e InvalidTarSumError) Error() string {
+ return fmt.Sprintf("invalid tarsum: %q", string(e))
+}
+
+// ParseTarSum parses a tarsum string into its components of interest. For
+// example, this method may receive the tarsum in the following format:
+//
+// tarsum.v1+sha256:220a60ecd4a3c32c282622a625a54db9ba0ff55b5ba9c29c7064a2bc358b6a3e
+//
+// The function will return the following:
+//
+// TarSumInfo{
+// Version: "v1",
+// Algorithm: "sha256",
+// Digest: "220a60ecd4a3c32c282622a625a54db9ba0ff55b5ba9c29c7064a2bc358b6a3e",
+// }
+//
+func ParseTarSum(tarSum string) (tsi TarSumInfo, err error) {
+ components := TarsumRegexpCapturing.FindStringSubmatch(tarSum)
+
+ if len(components) != 1+TarsumRegexpCapturing.NumSubexp() {
+ return TarSumInfo{}, InvalidTarSumError(tarSum)
+ }
+
+ return TarSumInfo{
+ Version: components[3],
+ Algorithm: components[4],
+ Digest: components[5],
+ }, nil
+}
+
+// String returns the valid, string representation of the tarsum info.
+func (tsi TarSumInfo) String() string {
+ if tsi.Version == "" {
+ return fmt.Sprintf("tarsum+%s:%s", tsi.Algorithm, tsi.Digest)
+ }
+
+ return fmt.Sprintf("tarsum.%s+%s:%s", tsi.Version, tsi.Algorithm, tsi.Digest)
+}
diff --git a/vendor/src/github.com/docker/distribution/digest/tarsum_test.go b/vendor/src/github.com/docker/distribution/digest/tarsum_test.go
new file mode 100644
index 0000000000..894c25ab31
--- /dev/null
+++ b/vendor/src/github.com/docker/distribution/digest/tarsum_test.go
@@ -0,0 +1,79 @@
+package digest
+
+import (
+ "reflect"
+ "testing"
+)
+
+func TestParseTarSumComponents(t *testing.T) {
+ for _, testcase := range []struct {
+ input string
+ expected TarSumInfo
+ err error
+ }{
+ {
+ input: "tarsum.v1+sha256:220a60ecd4a3c32c282622a625a54db9ba0ff55b5ba9c29c7064a2bc358b6a3e",
+ expected: TarSumInfo{
+ Version: "v1",
+ Algorithm: "sha256",
+ Digest: "220a60ecd4a3c32c282622a625a54db9ba0ff55b5ba9c29c7064a2bc358b6a3e",
+ },
+ },
+ {
+ input: "",
+ err: InvalidTarSumError(""),
+ },
+ {
+ input: "purejunk",
+ err: InvalidTarSumError("purejunk"),
+ },
+ {
+ input: "tarsum.v23+test:12341234123412341effefefe",
+ expected: TarSumInfo{
+ Version: "v23",
+ Algorithm: "test",
+ Digest: "12341234123412341effefefe",
+ },
+ },
+
+ // The following test cases are ported from docker core
+ {
+ // Version 0 tarsum
+ input: "tarsum+sha256:e58fcf7418d4390dec8e8fb69d88c06ec07039d651fedd3aa72af9972e7d046b",
+ expected: TarSumInfo{
+ Algorithm: "sha256",
+ Digest: "e58fcf7418d4390dec8e8fb69d88c06ec07039d651fedd3aa72af9972e7d046b",
+ },
+ },
+ {
+ // Dev version tarsum
+ input: "tarsum.dev+sha256:e58fcf7418d4390dec8e8fb69d88c06ec07039d651fedd3aa72af9972e7d046b",
+ expected: TarSumInfo{
+ Version: "dev",
+ Algorithm: "sha256",
+ Digest: "e58fcf7418d4390dec8e8fb69d88c06ec07039d651fedd3aa72af9972e7d046b",
+ },
+ },
+ } {
+ tsi, err := ParseTarSum(testcase.input)
+ if err != nil {
+ if testcase.err != nil && err == testcase.err {
+ continue // passes
+ }
+
+ t.Fatalf("unexpected error parsing tarsum: %v", err)
+ }
+
+ if testcase.err != nil {
+ t.Fatalf("expected error not encountered on %q: %v", testcase.input, testcase.err)
+ }
+
+ if !reflect.DeepEqual(tsi, testcase.expected) {
+ t.Fatalf("expected tarsum info: %v != %v", tsi, testcase.expected)
+ }
+
+ if testcase.input != tsi.String() {
+ t.Fatalf("input should equal output: %q != %q", tsi.String(), testcase.input)
+ }
+ }
+}
diff --git a/vendor/src/github.com/docker/distribution/digest/verifiers.go b/vendor/src/github.com/docker/distribution/digest/verifiers.go
new file mode 100644
index 0000000000..11d9d7ae53
--- /dev/null
+++ b/vendor/src/github.com/docker/distribution/digest/verifiers.go
@@ -0,0 +1,137 @@
+package digest
+
+import (
+ "crypto/sha256"
+ "crypto/sha512"
+ "hash"
+ "io"
+ "io/ioutil"
+
+ "github.com/docker/docker/pkg/tarsum"
+)
+
+// Verifier presents a general verification interface to be used with message
+// digests and other byte stream verifications. Users instantiate a Verifier
+// from one of the various methods, write the data under test to it then check
+// the result with the Verified method.
+type Verifier interface {
+ io.Writer
+
+ // Verified will return true if the content written to Verifier matches
+ // the digest.
+ Verified() bool
+}
+
+// NewDigestVerifier returns a verifier that compares the written bytes
+// against a passed in digest.
+func NewDigestVerifier(d Digest) (Verifier, error) {
+ if err := d.Validate(); err != nil {
+ return nil, err
+ }
+
+ alg := d.Algorithm()
+ switch alg {
+ case "sha256", "sha384", "sha512":
+ return hashVerifier{
+ hash: newHash(alg),
+ digest: d,
+ }, nil
+ default:
+ // Assume we have a tarsum.
+ version, err := tarsum.GetVersionFromTarsum(string(d))
+ if err != nil {
+ return nil, err
+ }
+
+ pr, pw := io.Pipe()
+
+ // TODO(stevvooe): We may actually want to ban the earlier versions of
+ // tarsum. That decision may not be the place of the verifier.
+
+ ts, err := tarsum.NewTarSum(pr, true, version)
+ if err != nil {
+ return nil, err
+ }
+
+ // TODO(sday): Ick! A goroutine per digest verification? We'll have to
+ // get the tarsum library to export an io.Writer variant.
+ go func() {
+ if _, err := io.Copy(ioutil.Discard, ts); err != nil {
+ pr.CloseWithError(err)
+ } else {
+ pr.Close()
+ }
+ }()
+
+ return &tarsumVerifier{
+ digest: d,
+ ts: ts,
+ pr: pr,
+ pw: pw,
+ }, nil
+ }
+}
+
+// NewLengthVerifier returns a verifier that returns true when the number of
+// read bytes equals the expected parameter.
+func NewLengthVerifier(expected int64) Verifier {
+ return &lengthVerifier{
+ expected: expected,
+ }
+}
+
+type lengthVerifier struct {
+ expected int64 // expected bytes read
+ len int64 // bytes read
+}
+
+func (lv *lengthVerifier) Write(p []byte) (n int, err error) {
+ n = len(p)
+ lv.len += int64(n)
+ return n, err
+}
+
+func (lv *lengthVerifier) Verified() bool {
+ return lv.expected == lv.len
+}
+
+func newHash(name string) hash.Hash {
+ switch name {
+ case "sha256":
+ return sha256.New()
+ case "sha384":
+ return sha512.New384()
+ case "sha512":
+ return sha512.New()
+ default:
+ panic("unsupport algorithm: " + name)
+ }
+}
+
+type hashVerifier struct {
+ digest Digest
+ hash hash.Hash
+}
+
+func (hv hashVerifier) Write(p []byte) (n int, err error) {
+ return hv.hash.Write(p)
+}
+
+func (hv hashVerifier) Verified() bool {
+ return hv.digest == NewDigest(hv.digest.Algorithm(), hv.hash)
+}
+
+type tarsumVerifier struct {
+ digest Digest
+ ts tarsum.TarSum
+ pr *io.PipeReader
+ pw *io.PipeWriter
+}
+
+func (tv *tarsumVerifier) Write(p []byte) (n int, err error) {
+ return tv.pw.Write(p)
+}
+
+func (tv *tarsumVerifier) Verified() bool {
+ return tv.digest == Digest(tv.ts.Sum(nil))
+}
diff --git a/vendor/src/github.com/docker/distribution/digest/verifiers_test.go b/vendor/src/github.com/docker/distribution/digest/verifiers_test.go
new file mode 100644
index 0000000000..408720b5ee
--- /dev/null
+++ b/vendor/src/github.com/docker/distribution/digest/verifiers_test.go
@@ -0,0 +1,162 @@
+package digest
+
+import (
+ "bytes"
+ "crypto/rand"
+ "encoding/base64"
+ "io"
+ "os"
+ "strings"
+ "testing"
+
+ "github.com/docker/distribution/testutil"
+)
+
+func TestDigestVerifier(t *testing.T) {
+ p := make([]byte, 1<<20)
+ rand.Read(p)
+ digest, err := FromBytes(p)
+ if err != nil {
+ t.Fatalf("unexpected error digesting bytes: %#v", err)
+ }
+
+ verifier, err := NewDigestVerifier(digest)
+ if err != nil {
+ t.Fatalf("unexpected error getting digest verifier: %s", err)
+ }
+
+ io.Copy(verifier, bytes.NewReader(p))
+
+ if !verifier.Verified() {
+ t.Fatalf("bytes not verified")
+ }
+
+ tf, tarSum, err := testutil.CreateRandomTarFile()
+ if err != nil {
+ t.Fatalf("error creating tarfile: %v", err)
+ }
+
+ digest, err = FromTarArchive(tf)
+ if err != nil {
+ t.Fatalf("error digesting tarsum: %v", err)
+ }
+
+ if digest.String() != tarSum {
+ t.Fatalf("unexpected digest: %q != %q", digest.String(), tarSum)
+ }
+
+ expectedSize, _ := tf.Seek(0, os.SEEK_END) // Get tar file size
+ tf.Seek(0, os.SEEK_SET) // seek back
+
+ // This is the most relevant example for the registry application. It's
+ // effectively a read through pipeline, where the final sink is the digest
+ // verifier.
+ verifier, err = NewDigestVerifier(digest)
+ if err != nil {
+ t.Fatalf("unexpected error getting digest verifier: %s", err)
+ }
+
+ lengthVerifier := NewLengthVerifier(expectedSize)
+ rd := io.TeeReader(tf, lengthVerifier)
+ io.Copy(verifier, rd)
+
+ if !lengthVerifier.Verified() {
+ t.Fatalf("verifier detected incorrect length")
+ }
+
+ if !verifier.Verified() {
+ t.Fatalf("bytes not verified")
+ }
+}
+
+// TestVerifierUnsupportedDigest ensures that unsupported digest validation is
+// flowing through verifier creation.
+func TestVerifierUnsupportedDigest(t *testing.T) {
+ unsupported := Digest("bean:0123456789abcdef")
+
+ _, err := NewDigestVerifier(unsupported)
+ if err == nil {
+ t.Fatalf("expected error when creating verifier")
+ }
+
+ if err != ErrDigestUnsupported {
+ t.Fatalf("incorrect error for unsupported digest: %v %p %p", err, ErrDigestUnsupported, err)
+ }
+}
+
+// TestJunkNoDeadlock ensures that junk input into a digest verifier properly
+// returns errors from the tarsum library. Specifically, we pass in a file
+// with a "bad header" and should see the error from the io.Copy to verifier.
+// This has been seen with gzipped tarfiles, mishandled by the tarsum package,
+// but also on junk input, such as html.
+func TestJunkNoDeadlock(t *testing.T) {
+ expected := Digest("tarsum.dev+sha256:62e15750aae345f6303469a94892e66365cc5e3abdf8d7cb8b329f8fb912e473")
+ junk := bytes.Repeat([]byte{'a'}, 1024)
+
+ verifier, err := NewDigestVerifier(expected)
+ if err != nil {
+ t.Fatalf("unexpected error creating verifier: %v", err)
+ }
+
+ rd := bytes.NewReader(junk)
+ if _, err := io.Copy(verifier, rd); err == nil {
+ t.Fatalf("unexpected error verifying input data: %v", err)
+ }
+}
+
+// TestBadTarNoDeadlock runs a tar with a "bad" tar header through digest
+// verifier, ensuring that the verifier returns an error properly.
+func TestBadTarNoDeadlock(t *testing.T) {
+ // TODO(stevvooe): This test is exposing a bug in tarsum where if we pass
+ // a gzipped tar file into tarsum, the library returns an error. This
+ // should actually work. When the tarsum package is fixed, this test will
+ // fail and we can remove this test or invert it.
+
+ // This tarfile was causing deadlocks in verifiers due mishandled copy error.
+ // This is a gzipped tar, which we typically don't see but should handle.
+ //
+ // From https://registry-1.docker.io/v2/library/ubuntu/blobs/tarsum.dev+sha256:62e15750aae345f6303469a94892e66365cc5e3abdf8d7cb8b329f8fb912e473
+ const badTar = `
+H4sIAAAJbogA/0otSdZnoDEwMDAxMDc1BdJggE6D2YZGJobGBmbGRsZAdYYGBkZGDAqmtHYYCJQW
+lyQWAZ1CqTnonhsiAAAAAP//AsV/YkEJTdMAGfFvZmA2Gv/0AAAAAAD//4LFf3F+aVFyarFeTmZx
+CbXtAOVnMxMTXPFvbGpmjhb/xobmwPinSyCO8PgHAAAA///EVU9v2z4MvedTEMihl9a5/26/YTkU
+yNKiTTDsKMt0rE0WDYmK628/ym7+bFmH2DksQACbIB/5+J7kObwiQsXc/LdYVGibLObRccw01Qv5
+19EZ7hbbZudVgWtiDFCSh4paYII4xOVxNgeHLXrYow+GXAAqgSuEQhzlTR5ZgtlsVmB+aKe8rswe
+zzsOjwtoPGoTEGplHHhMCJqxSNUPwesbEGbzOXxR34VCHndQmjfhUKhEq/FURI0FqJKFR5q9NE5Z
+qbaoBGoglAB+5TSK0sOh3c3UPkRKE25dEg8dDzzIWmqN2wG3BNY4qRL1VFFAoJJb5SXHU90n34nk
+SUS8S0AeGwqGyXdZel1nn7KLGhPO0kDeluvN48ty9Q2269ft8/PTy2b5GfKuh9/2LBIWo6oz+N8G
+uodmWLETg0mW4lMP4XYYCL4+rlawftpIO40SA+W6Yci9wRZE1MNOjmyGdhBQRy9OHpqOdOGh/wT7
+nZdOkHZ650uIK+WrVZdkgErJfnNEJysLnI5FSAj4xuiCQNpOIoNWmhyLByVHxEpLf3dkr+k9KMsV
+xV0FhiVB21hgD3V5XwSqRdOmsUYr7oNtZXTVzyTHc2/kqokBy2ihRMVRTN+78goP5Ur/aMhz+KOJ
+3h2UsK43kdwDo0Q9jfD7ie2RRur7MdpIrx1Z3X4j/Q1qCswN9r/EGCvXiUy0fI4xeSknnH/92T/+
+fgIAAP//GkWjYBSMXAAIAAD//2zZtzAAEgAA`
+ expected := Digest("tarsum.dev+sha256:62e15750aae345f6303469a94892e66365cc5e3abdf8d7cb8b329f8fb912e473")
+
+ verifier, err := NewDigestVerifier(expected)
+ if err != nil {
+ t.Fatalf("unexpected error creating verifier: %v", err)
+ }
+
+ rd := base64.NewDecoder(base64.StdEncoding, strings.NewReader(badTar))
+
+ if _, err := io.Copy(verifier, rd); err == nil {
+ t.Fatalf("unexpected error verifying input data: %v", err)
+ }
+
+ if verifier.Verified() {
+ // For now, we expect an error, since tarsum library cannot handle
+ // compressed tars (!!!).
+ t.Fatalf("no error received after invalid tar")
+ }
+}
+
+// TODO(stevvooe): Add benchmarks to measure bytes/second throughput for
+// DigestVerifier. We should be tarsum/gzip limited for common cases but we
+// want to verify this.
+//
+// The relevant benchmarks for comparison can be run with the following
+// commands:
+//
+// go test -bench . crypto/sha1
+// go test -bench . github.com/docker/docker/pkg/tarsum
+//
diff --git a/vendor/src/github.com/docker/libcontainer/.drone.yml b/vendor/src/github.com/docker/libcontainer/.drone.yml
deleted file mode 100755
index 80d298f218..0000000000
--- a/vendor/src/github.com/docker/libcontainer/.drone.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-image: dockercore/libcontainer
-script:
-# Setup the DockerInDocker environment.
- - /dind
- - sed -i 's!docker/docker!docker/libcontainer!' /go/src/github.com/docker/docker/hack/make/.validate
- - bash /go/src/github.com/docker/docker/hack/make/validate-dco
- - bash /go/src/github.com/docker/docker/hack/make/validate-gofmt
- - export GOPATH="$GOPATH:/go:$(pwd)/vendor" # Drone mucks with our GOPATH
- - make direct-test
diff --git a/vendor/src/github.com/docker/libcontainer/.gitignore b/vendor/src/github.com/docker/libcontainer/.gitignore
new file mode 100644
index 0000000000..bf6a664db6
--- /dev/null
+++ b/vendor/src/github.com/docker/libcontainer/.gitignore
@@ -0,0 +1,2 @@
+bundles
+nsinit/nsinit
diff --git a/vendor/src/github.com/docker/libcontainer/Dockerfile b/vendor/src/github.com/docker/libcontainer/Dockerfile
index 0771c808ea..fb34c8c95a 100644
--- a/vendor/src/github.com/docker/libcontainer/Dockerfile
+++ b/vendor/src/github.com/docker/libcontainer/Dockerfile
@@ -7,9 +7,9 @@ RUN go get github.com/docker/docker/pkg/term
# setup a playground for us to spawn containers in
RUN mkdir /busybox && \
- curl -sSL 'https://github.com/jpetazzo/docker-busybox/raw/buildroot-2014.02/rootfs.tar' | tar -xC /busybox
+ curl -sSL 'https://github.com/jpetazzo/docker-busybox/raw/buildroot-2014.11/rootfs.tar' | tar -xC /busybox
-RUN curl -sSL https://raw.githubusercontent.com/docker/docker/master/project/dind -o /dind && \
+RUN curl -sSL https://raw.githubusercontent.com/docker/docker/master/hack/dind -o /dind && \
chmod +x /dind
COPY . /go/src/github.com/docker/libcontainer
diff --git a/vendor/src/github.com/docker/libcontainer/MAINTAINERS b/vendor/src/github.com/docker/libcontainer/MAINTAINERS
index 5235131722..cea3500f2b 100644
--- a/vendor/src/github.com/docker/libcontainer/MAINTAINERS
+++ b/vendor/src/github.com/docker/libcontainer/MAINTAINERS
@@ -3,4 +3,5 @@ Rohit Jnagal <jnagal@google.com> (@rjnagal)
Victor Marmol <vmarmol@google.com> (@vmarmol)
Mrunal Patel <mpatel@redhat.com> (@mrunalp)
Alexandr Morozov <lk4d4@docker.com> (@LK4D4)
+Daniel, Dao Quang Minh <dqminh89@gmail.com> (@dqminh)
update-vendor.sh: Tianon Gravi <admwiggin@gmail.com> (@tianon)
diff --git a/vendor/src/github.com/docker/libcontainer/Makefile b/vendor/src/github.com/docker/libcontainer/Makefile
index f94171b0fc..1a2e23e048 100644
--- a/vendor/src/github.com/docker/libcontainer/Makefile
+++ b/vendor/src/github.com/docker/libcontainer/Makefile
@@ -22,3 +22,12 @@ direct-build:
direct-install:
go install -v $(GO_PACKAGES)
+
+local:
+ go test -v
+
+validate:
+ hack/validate.sh
+
+binary: all
+ docker run --rm --privileged -v $(CURDIR)/bundles:/go/bin dockercore/libcontainer make direct-install
diff --git a/vendor/src/github.com/docker/libcontainer/NOTICE b/vendor/src/github.com/docker/libcontainer/NOTICE
index ca1635f896..dc9129878c 100644
--- a/vendor/src/github.com/docker/libcontainer/NOTICE
+++ b/vendor/src/github.com/docker/libcontainer/NOTICE
@@ -1,5 +1,5 @@
libcontainer
-Copyright 2012-2014 Docker, Inc.
+Copyright 2012-2015 Docker, Inc.
This product includes software developed at Docker, Inc. (http://www.docker.com).
diff --git a/vendor/src/github.com/docker/libcontainer/PRINCIPLES.md b/vendor/src/github.com/docker/libcontainer/PRINCIPLES.md
index 42396c0eec..0560642102 100644
--- a/vendor/src/github.com/docker/libcontainer/PRINCIPLES.md
+++ b/vendor/src/github.com/docker/libcontainer/PRINCIPLES.md
@@ -8,7 +8,7 @@ In the design and development of libcontainer we try to follow these principles:
* Less code is better.
* Fewer components are better. Do you really need to add one more class?
* 50 lines of straightforward, readable code is better than 10 lines of magic that nobody can understand.
-* Don't do later what you can do now. "//FIXME: refactor" is not acceptable in new code.
+* Don't do later what you can do now. "//TODO: refactor" is not acceptable in new code.
* When hesitating between two options, choose the one that is easier to reverse.
* "No" is temporary; "Yes" is forever. If you're not sure about a new feature, say no. You can change your mind later.
* Containers must be portable to the greatest possible number of machines. Be suspicious of any change which makes machines less interchangeable.
diff --git a/vendor/src/github.com/docker/libcontainer/README.md b/vendor/src/github.com/docker/libcontainer/README.md
index 37047e68c8..6257f9c78f 100644
--- a/vendor/src/github.com/docker/libcontainer/README.md
+++ b/vendor/src/github.com/docker/libcontainer/README.md
@@ -1,48 +1,172 @@
-## libcontainer - reference implementation for containers [![Build Status](https://ci.dockerproject.com/github.com/docker/libcontainer/status.svg?branch=master)](https://ci.dockerproject.com/github.com/docker/libcontainer)
+## libcontainer - reference implementation for containers [![Build Status](https://jenkins.dockerproject.com/buildStatus/icon?job=Libcontainer Master)](https://jenkins.dockerproject.com/job/Libcontainer%20Master/)
-### Note on API changes:
+Libcontainer provides a native Go implementation for creating containers
+with namespaces, cgroups, capabilities, and filesystem access controls.
+It allows you to manage the lifecycle of the container performing additional operations
+after the container is created.
-Please bear with us while we work on making the libcontainer API stable and something that we can support long term. We are currently discussing the API with the community, therefore, if you currently depend on libcontainer please pin your dependency at a specific tag or commit id. Please join the discussion and help shape the API.
-#### Background
+#### Container
+A container is a self contained execution environment that shares the kernel of the
+host system and which is (optionally) isolated from other containers in the system.
-libcontainer specifies configuration options for what a container is. It provides a native Go implementation for using Linux namespaces with no external dependencies. libcontainer provides many convenience functions for working with namespaces, networking, and management.
+#### Using libcontainer
+To create a container you first have to initialize an instance of a factory
+that will handle the creation and initialization for a container.
-#### Container
-A container is a self contained execution environment that shares the kernel of the host system and which is (optionally) isolated from other containers in the system.
+Because containers are spawned in a two step process you will need to provide
+arguments to a binary that will be executed as the init process for the container.
+To use the current binary that is spawning the containers and acting as the parent
+you can use `os.Args[0]` and we have a command called `init` setup.
+
+```go
+root, err := libcontainer.New("/var/lib/container", libcontainer.InitArgs(os.Args[0], "init"))
+if err != nil {
+ log.Fatal(err)
+}
+```
+
+Once you have an instance of the factory created we can create a configuration
+struct describing how the container is to be created. A sample would look similar to this:
+
+```go
+config := &configs.Config{
+ Rootfs: rootfs,
+ Capabilities: []string{
+ "CHOWN",
+ "DAC_OVERRIDE",
+ "FSETID",
+ "FOWNER",
+ "MKNOD",
+ "NET_RAW",
+ "SETGID",
+ "SETUID",
+ "SETFCAP",
+ "SETPCAP",
+ "NET_BIND_SERVICE",
+ "SYS_CHROOT",
+ "KILL",
+ "AUDIT_WRITE",
+ },
+ Namespaces: configs.Namespaces([]configs.Namespace{
+ {Type: configs.NEWNS},
+ {Type: configs.NEWUTS},
+ {Type: configs.NEWIPC},
+ {Type: configs.NEWPID},
+ {Type: configs.NEWNET},
+ }),
+ Cgroups: &configs.Cgroup{
+ Name: "test-container",
+ Parent: "system",
+ AllowAllDevices: false,
+ AllowedDevices: configs.DefaultAllowedDevices,
+ },
+
+ Devices: configs.DefaultAutoCreatedDevices,
+ Hostname: "testing",
+ Networks: []*configs.Network{
+ {
+ Type: "loopback",
+ Address: "127.0.0.1/0",
+ Gateway: "localhost",
+ },
+ },
+ Rlimits: []configs.Rlimit{
+ {
+ Type: syscall.RLIMIT_NOFILE,
+ Hard: uint64(1024),
+ Soft: uint64(1024),
+ },
+ },
+}
+```
-libcontainer may be used to execute a process in a container. If a user tries to run a new process inside an existing container, the new process is added to the processes executing in the container.
+Once you have the configuration populated you can create a container:
+```go
+container, err := root.Create("container-id", config)
+```
+
+To spawn bash as the initial process inside the container and have the
+processes pid returned in order to wait, signal, or kill the process:
+
+```go
+process := &libcontainer.Process{
+ Args: []string{"/bin/bash"},
+ Env: []string{"PATH=/bin"},
+ User: "daemon",
+ Stdin: os.Stdin,
+ Stdout: os.Stdout,
+ Stderr: os.Stderr,
+}
+
+err := container.Start(process)
+if err != nil {
+ log.Fatal(err)
+}
+
+// wait for the process to finish.
+status, err := process.Wait()
+if err != nil {
+ log.Fatal(err)
+}
+
+// destroy the container.
+container.Destroy()
+```
-#### Root file system
+Additional ways to interact with a running container are:
-A container runs with a directory known as its *root file system*, or *rootfs*, mounted as the file system root. The rootfs is usually a full system tree.
+```go
+// return all the pids for all processes running inside the container.
+processes, err := container.Processes()
+// get detailed cpu, memory, io, and network statistics for the container and
+// it's processes.
+stats, err := container.Stats()
-#### Configuration
-A container is initially configured by supplying configuration data when the container is created.
+// pause all processes inside the container.
+container.Pause()
+
+// resume all paused processes.
+container.Resume()
+```
#### nsinit
-`nsinit` is a cli application which demonstrates the use of libcontainer. It is able to spawn new containers or join existing containers, based on the current directory.
+`nsinit` is a cli application which demonstrates the use of libcontainer.
+It is able to spawn new containers or join existing containers. A root
+filesystem must be provided for use along with a container configuration file.
+
+To build `nsinit`, run `make binary`. It will save the binary into
+`bundles/nsinit`.
-To use `nsinit`, cd into a Linux rootfs and copy a `container.json` file into the directory with your specified configuration. Environment, networking, and different capabilities for the container are specified in this file. The configuration is used for each process executed inside the container.
+To use `nsinit`, cd into a Linux rootfs and copy a `container.json` file into
+the directory with your specified configuration. Environment, networking,
+and different capabilities for the container are specified in this file.
+The configuration is used for each process executed inside the container.
See the `sample_configs` folder for examples of what the container configuration should look like.
To execute `/bin/bash` in the current directory as a container just run the following **as root**:
```bash
-nsinit exec /bin/bash
+nsinit exec --tty /bin/bash
```
-If you wish to spawn another process inside the container while your current bash session is running, run the same command again to get another bash shell (or change the command). If the original process (PID 1) dies, all other processes spawned inside the container will be killed and the namespace will be removed.
+If you wish to spawn another process inside the container while your
+current bash session is running, run the same command again to
+get another bash shell (or change the command). If the original
+process (PID 1) dies, all other processes spawned inside the container
+will be killed and the namespace will be removed.
-You can identify if a process is running in a container by looking to see if `state.json` is in the root of the directory.
+You can identify if a process is running in a container by
+looking to see if `state.json` is in the root of the directory.
-You may also specify an alternate root place where the `container.json` file is read and where the `state.json` file will be saved.
+You may also specify an alternate root place where
+the `container.json` file is read and where the `state.json` file will be saved.
#### Future
See the [roadmap](ROADMAP.md).
diff --git a/vendor/src/github.com/docker/libcontainer/api_temp.go b/vendor/src/github.com/docker/libcontainer/api_temp.go
deleted file mode 100644
index 5c682ee344..0000000000
--- a/vendor/src/github.com/docker/libcontainer/api_temp.go
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
-Temporary API endpoint for libcontainer while the full API is finalized (api.go).
-*/
-package libcontainer
-
-import (
- "github.com/docker/libcontainer/cgroups/fs"
- "github.com/docker/libcontainer/network"
-)
-
-// TODO(vmarmol): Complete Stats() in final libcontainer API and move users to that.
-// DEPRECATED: The below portions are only to be used during the transition to the official API.
-// Returns all available stats for the given container.
-func GetStats(container *Config, state *State) (stats *ContainerStats, err error) {
- stats = &ContainerStats{}
- if stats.CgroupStats, err = fs.GetStats(state.CgroupPaths); err != nil {
- return stats, err
- }
- stats.NetworkStats, err = network.GetStats(&state.NetworkState)
- return stats, err
-}
diff --git a/vendor/src/github.com/docker/libcontainer/apparmor/apparmor.go b/vendor/src/github.com/docker/libcontainer/apparmor/apparmor.go
index fb1574dfc6..3be3294d85 100644
--- a/vendor/src/github.com/docker/libcontainer/apparmor/apparmor.go
+++ b/vendor/src/github.com/docker/libcontainer/apparmor/apparmor.go
@@ -24,7 +24,6 @@ func ApplyProfile(name string) error {
if name == "" {
return nil
}
-
cName := C.CString(name)
defer C.free(unsafe.Pointer(cName))
diff --git a/vendor/src/github.com/docker/libcontainer/apparmor/gen.go b/vendor/src/github.com/docker/libcontainer/apparmor/gen.go
index 825e646d92..4565f6dfec 100644
--- a/vendor/src/github.com/docker/libcontainer/apparmor/gen.go
+++ b/vendor/src/github.com/docker/libcontainer/apparmor/gen.go
@@ -67,12 +67,12 @@ func generateProfile(out io.Writer) error {
data := &data{
Name: "docker-default",
}
- if tuntablesExists() {
+ if tunablesExists() {
data.Imports = append(data.Imports, "#include <tunables/global>")
} else {
data.Imports = append(data.Imports, "@{PROC}=/proc/")
}
- if abstrctionsEsists() {
+ if abstractionsExists() {
data.InnerImports = append(data.InnerImports, "#include <abstractions/base>")
}
if err := compiled.Execute(out, data); err != nil {
@@ -82,13 +82,13 @@ func generateProfile(out io.Writer) error {
}
// check if the tunables/global exist
-func tuntablesExists() bool {
+func tunablesExists() bool {
_, err := os.Stat("/etc/apparmor.d/tunables/global")
return err == nil
}
// check if abstractions/base exist
-func abstrctionsEsists() bool {
+func abstractionsExists() bool {
_, err := os.Stat("/etc/apparmor.d/abstractions/base")
return err == nil
}
diff --git a/vendor/src/github.com/docker/libcontainer/capabilities_linux.go b/vendor/src/github.com/docker/libcontainer/capabilities_linux.go
new file mode 100644
index 0000000000..6b8b465c56
--- /dev/null
+++ b/vendor/src/github.com/docker/libcontainer/capabilities_linux.go
@@ -0,0 +1,91 @@
+// +build linux
+
+package libcontainer
+
+import (
+ "fmt"
+ "os"
+
+ "github.com/syndtr/gocapability/capability"
+)
+
+const allCapabilityTypes = capability.CAPS | capability.BOUNDS
+
+var capabilityList = map[string]capability.Cap{
+ "SETPCAP": capability.CAP_SETPCAP,
+ "SYS_MODULE": capability.CAP_SYS_MODULE,
+ "SYS_RAWIO": capability.CAP_SYS_RAWIO,
+ "SYS_PACCT": capability.CAP_SYS_PACCT,
+ "SYS_ADMIN": capability.CAP_SYS_ADMIN,
+ "SYS_NICE": capability.CAP_SYS_NICE,
+ "SYS_RESOURCE": capability.CAP_SYS_RESOURCE,
+ "SYS_TIME": capability.CAP_SYS_TIME,
+ "SYS_TTY_CONFIG": capability.CAP_SYS_TTY_CONFIG,
+ "MKNOD": capability.CAP_MKNOD,
+ "AUDIT_WRITE": capability.CAP_AUDIT_WRITE,
+ "AUDIT_CONTROL": capability.CAP_AUDIT_CONTROL,
+ "MAC_OVERRIDE": capability.CAP_MAC_OVERRIDE,
+ "MAC_ADMIN": capability.CAP_MAC_ADMIN,
+ "NET_ADMIN": capability.CAP_NET_ADMIN,
+ "SYSLOG": capability.CAP_SYSLOG,
+ "CHOWN": capability.CAP_CHOWN,
+ "NET_RAW": capability.CAP_NET_RAW,
+ "DAC_OVERRIDE": capability.CAP_DAC_OVERRIDE,
+ "FOWNER": capability.CAP_FOWNER,
+ "DAC_READ_SEARCH": capability.CAP_DAC_READ_SEARCH,
+ "FSETID": capability.CAP_FSETID,
+ "KILL": capability.CAP_KILL,
+ "SETGID": capability.CAP_SETGID,
+ "SETUID": capability.CAP_SETUID,
+ "LINUX_IMMUTABLE": capability.CAP_LINUX_IMMUTABLE,
+ "NET_BIND_SERVICE": capability.CAP_NET_BIND_SERVICE,
+ "NET_BROADCAST": capability.CAP_NET_BROADCAST,
+ "IPC_LOCK": capability.CAP_IPC_LOCK,
+ "IPC_OWNER": capability.CAP_IPC_OWNER,
+ "SYS_CHROOT": capability.CAP_SYS_CHROOT,
+ "SYS_PTRACE": capability.CAP_SYS_PTRACE,
+ "SYS_BOOT": capability.CAP_SYS_BOOT,
+ "LEASE": capability.CAP_LEASE,
+ "SETFCAP": capability.CAP_SETFCAP,
+ "WAKE_ALARM": capability.CAP_WAKE_ALARM,
+ "BLOCK_SUSPEND": capability.CAP_BLOCK_SUSPEND,
+ "AUDIT_READ": capability.CAP_AUDIT_READ,
+}
+
+func newCapWhitelist(caps []string) (*whitelist, error) {
+ l := []capability.Cap{}
+ for _, c := range caps {
+ v, ok := capabilityList[c]
+ if !ok {
+ return nil, fmt.Errorf("unknown capability %q", c)
+ }
+ l = append(l, v)
+ }
+ pid, err := capability.NewPid(os.Getpid())
+ if err != nil {
+ return nil, err
+ }
+ return &whitelist{
+ keep: l,
+ pid: pid,
+ }, nil
+}
+
+type whitelist struct {
+ pid capability.Capabilities
+ keep []capability.Cap
+}
+
+// dropBoundingSet drops the capability bounding set to those specified in the whitelist.
+func (w *whitelist) dropBoundingSet() error {
+ w.pid.Clear(capability.BOUNDS)
+ w.pid.Set(capability.BOUNDS, w.keep...)
+ return w.pid.Apply(capability.BOUNDS)
+}
+
+// drop drops all capabilities for the current process except those specified in the whitelist.
+func (w *whitelist) drop() error {
+ w.pid.Clear(allCapabilityTypes)
+ w.pid.Set(allCapabilityTypes, w.keep...)
+ return w.pid.Apply(allCapabilityTypes)
+}
diff --git a/vendor/src/github.com/docker/libcontainer/cgroups/cgroups.go b/vendor/src/github.com/docker/libcontainer/cgroups/cgroups.go
index 106698d18f..df7bfb3c71 100644
--- a/vendor/src/github.com/docker/libcontainer/cgroups/cgroups.go
+++ b/vendor/src/github.com/docker/libcontainer/cgroups/cgroups.go
@@ -3,16 +3,38 @@ package cgroups
import (
"fmt"
- "github.com/docker/libcontainer/devices"
+ "github.com/docker/libcontainer/configs"
)
-type FreezerState string
+type Manager interface {
+ // Apply cgroup configuration to the process with the specified pid
+ Apply(pid int) error
-const (
- Undefined FreezerState = ""
- Frozen FreezerState = "FROZEN"
- Thawed FreezerState = "THAWED"
-)
+ // Returns the PIDs inside the cgroup set
+ GetPids() ([]int, error)
+
+ // Returns statistics for the cgroup set
+ GetStats() (*Stats, error)
+
+ // Toggles the freezer cgroup according with specified state
+ Freeze(state configs.FreezerState) error
+
+ // Destroys the cgroup set
+ Destroy() error
+
+ // NewCgroupManager() and LoadCgroupManager() require following attributes:
+ // Paths map[string]string
+ // Cgroups *cgroups.Cgroup
+ // Paths maps cgroup subsystem to path at which it is mounted.
+ // Cgroups specifies specific cgroup settings for the various subsystems
+
+ // Returns cgroup paths to save in a state file and to be able to
+ // restore the object later.
+ GetPaths() map[string]string
+
+ // Set the cgroup as configured.
+ Set(container *configs.Config) error
+}
type NotFoundError struct {
Subsystem string
@@ -32,25 +54,6 @@ func IsNotFound(err error) bool {
if err == nil {
return false
}
-
_, ok := err.(*NotFoundError)
return ok
}
-
-type Cgroup struct {
- Name string `json:"name,omitempty"`
- Parent string `json:"parent,omitempty"` // name of parent cgroup or slice
-
- AllowAllDevices bool `json:"allow_all_devices,omitempty"` // If this is true allow access to any kind of device within the container. If false, allow access only to devices explicitly listed in the allowed_devices list.
- AllowedDevices []*devices.Device `json:"allowed_devices,omitempty"`
- Memory int64 `json:"memory,omitempty"` // Memory limit (in bytes)
- MemoryReservation int64 `json:"memory_reservation,omitempty"` // Memory reservation or soft_limit (in bytes)
- MemorySwap int64 `json:"memory_swap,omitempty"` // Total memory usage (memory + swap); set `-1' to disable swap
- CpuShares int64 `json:"cpu_shares,omitempty"` // CPU shares (relative weight vs. other containers)
- CpuQuota int64 `json:"cpu_quota,omitempty"` // CPU hardcap limit (in usecs). Allowed cpu time in a given period.
- CpuPeriod int64 `json:"cpu_period,omitempty"` // CPU period to be used for hardcapping (in usecs). 0 to use system default.
- CpusetCpus string `json:"cpuset_cpus,omitempty"` // CPU to use
- CpusetMems string `json:"cpuset_mems,omitempty"` // MEM to use
- Freezer FreezerState `json:"freezer,omitempty"` // set the freeze value for the process
- Slice string `json:"slice,omitempty"` // Parent slice to use for systemd
-}
diff --git a/vendor/src/github.com/docker/libcontainer/cgroups/fs/apply_raw.go b/vendor/src/github.com/docker/libcontainer/cgroups/fs/apply_raw.go
index 58046b0ad7..0a2d76bcd4 100644
--- a/vendor/src/github.com/docker/libcontainer/cgroups/fs/apply_raw.go
+++ b/vendor/src/github.com/docker/libcontainer/cgroups/fs/apply_raw.go
@@ -1,13 +1,14 @@
package fs
import (
- "fmt"
"io/ioutil"
"os"
"path/filepath"
"strconv"
+ "sync"
"github.com/docker/libcontainer/cgroups"
+ "github.com/docker/libcontainer/configs"
)
var (
@@ -24,43 +25,63 @@ var (
CgroupProcesses = "cgroup.procs"
)
+type subsystem interface {
+ // Returns the stats, as 'stats', corresponding to the cgroup under 'path'.
+ GetStats(path string, stats *cgroups.Stats) error
+ // Removes the cgroup represented by 'data'.
+ Remove(*data) error
+ // Creates and joins the cgroup represented by data.
+ Apply(*data) error
+ // Set the cgroup represented by cgroup.
+ Set(path string, cgroup *configs.Cgroup) error
+}
+
+type Manager struct {
+ Cgroups *configs.Cgroup
+ Paths map[string]string
+}
+
// The absolute path to the root of the cgroup hierarchies.
+var cgroupRootLock sync.Mutex
var cgroupRoot string
-// TODO(vmarmol): Report error here, we'll probably need to wait for the new API.
-func init() {
- // we can pick any subsystem to find the root
- cpuRoot, err := cgroups.FindCgroupMountpoint("cpu")
+// Gets the cgroupRoot.
+func getCgroupRoot() (string, error) {
+ cgroupRootLock.Lock()
+ defer cgroupRootLock.Unlock()
+
+ if cgroupRoot != "" {
+ return cgroupRoot, nil
+ }
+
+ root, err := cgroups.FindCgroupMountpointDir()
if err != nil {
- return
+ return "", err
}
- cgroupRoot = filepath.Dir(cpuRoot)
- if _, err := os.Stat(cgroupRoot); err != nil {
- return
+ if _, err := os.Stat(root); err != nil {
+ return "", err
}
-}
-type subsystem interface {
- // Returns the stats, as 'stats', corresponding to the cgroup under 'path'.
- GetStats(path string, stats *cgroups.Stats) error
- // Removes the cgroup represented by 'data'.
- Remove(*data) error
- // Creates and joins the cgroup represented by data.
- Set(*data) error
+ cgroupRoot = root
+ return cgroupRoot, nil
}
type data struct {
root string
cgroup string
- c *cgroups.Cgroup
+ c *configs.Cgroup
pid int
}
-func Apply(c *cgroups.Cgroup, pid int) (map[string]string, error) {
- d, err := getCgroupData(c, pid)
+func (m *Manager) Apply(pid int) error {
+ if m.Cgroups == nil {
+ return nil
+ }
+
+ d, err := getCgroupData(m.Cgroups, pid)
if err != nil {
- return nil, err
+ return err
}
paths := make(map[string]string)
@@ -70,10 +91,10 @@ func Apply(c *cgroups.Cgroup, pid int) (map[string]string, error) {
}
}()
for name, sys := range subsystems {
- if err := sys.Set(d); err != nil {
- return nil, err
+ if err := sys.Apply(d); err != nil {
+ return err
}
- // FIXME: Apply should, ideally, be reentrant or be broken up into a separate
+ // TODO: Apply should, ideally, be reentrant or be broken up into a separate
// create and join phase so that the cgroup hierarchy for a container can be
// created then join consists of writing the process pids to cgroup.procs
p, err := d.path(name)
@@ -81,16 +102,26 @@ func Apply(c *cgroups.Cgroup, pid int) (map[string]string, error) {
if cgroups.IsNotFound(err) {
continue
}
- return nil, err
+ return err
}
paths[name] = p
}
- return paths, nil
+ m.Paths = paths
+
+ return nil
+}
+
+func (m *Manager) Destroy() error {
+ return cgroups.RemovePaths(m.Paths)
+}
+
+func (m *Manager) GetPaths() map[string]string {
+ return m.Paths
}
// Symmetrical public function to update device based cgroups. Also available
// in the systemd implementation.
-func ApplyDevices(c *cgroups.Cgroup, pid int) error {
+func ApplyDevices(c *configs.Cgroup, pid int) error {
d, err := getCgroupData(c, pid)
if err != nil {
return err
@@ -98,12 +129,12 @@ func ApplyDevices(c *cgroups.Cgroup, pid int) error {
devices := subsystems["devices"]
- return devices.Set(d)
+ return devices.Apply(d)
}
-func GetStats(systemPaths map[string]string) (*cgroups.Stats, error) {
+func (m *Manager) GetStats() (*cgroups.Stats, error) {
stats := cgroups.NewStats()
- for name, path := range systemPaths {
+ for name, path := range m.Paths {
sys, ok := subsystems[name]
if !ok || !cgroups.PathExists(path) {
continue
@@ -116,29 +147,48 @@ func GetStats(systemPaths map[string]string) (*cgroups.Stats, error) {
return stats, nil
}
+func (m *Manager) Set(container *configs.Config) error {
+ for name, path := range m.Paths {
+ sys, ok := subsystems[name]
+ if !ok || !cgroups.PathExists(path) {
+ continue
+ }
+ if err := sys.Set(path, container.Cgroups); err != nil {
+ return err
+ }
+ }
+
+ return nil
+}
+
// Freeze toggles the container's freezer cgroup depending on the state
// provided
-func Freeze(c *cgroups.Cgroup, state cgroups.FreezerState) error {
- d, err := getCgroupData(c, 0)
+func (m *Manager) Freeze(state configs.FreezerState) error {
+ d, err := getCgroupData(m.Cgroups, 0)
if err != nil {
return err
}
- prevState := c.Freezer
- c.Freezer = state
+ dir, err := d.path("freezer")
+ if err != nil {
+ return err
+ }
+
+ prevState := m.Cgroups.Freezer
+ m.Cgroups.Freezer = state
freezer := subsystems["freezer"]
- err = freezer.Set(d)
+ err = freezer.Set(dir, m.Cgroups)
if err != nil {
- c.Freezer = prevState
+ m.Cgroups.Freezer = prevState
return err
}
return nil
}
-func GetPids(c *cgroups.Cgroup) ([]int, error) {
- d, err := getCgroupData(c, 0)
+func (m *Manager) GetPids() ([]int, error) {
+ d, err := getCgroupData(m.Cgroups, 0)
if err != nil {
return nil, err
}
@@ -151,9 +201,10 @@ func GetPids(c *cgroups.Cgroup) ([]int, error) {
return cgroups.ReadProcsFile(dir)
}
-func getCgroupData(c *cgroups.Cgroup, pid int) (*data, error) {
- if cgroupRoot == "" {
- return nil, fmt.Errorf("failed to find the cgroup root")
+func getCgroupData(c *configs.Cgroup, pid int) (*data, error) {
+ root, err := getCgroupRoot()
+ if err != nil {
+ return nil, err
}
cgroup := c.Name
@@ -162,38 +213,34 @@ func getCgroupData(c *cgroups.Cgroup, pid int) (*data, error) {
}
return &data{
- root: cgroupRoot,
+ root: root,
cgroup: cgroup,
c: c,
pid: pid,
}, nil
}
-func (raw *data) parent(subsystem string) (string, error) {
+func (raw *data) parent(subsystem, mountpoint string) (string, error) {
initPath, err := cgroups.GetInitCgroupDir(subsystem)
if err != nil {
return "", err
}
- return filepath.Join(raw.root, subsystem, initPath), nil
+ return filepath.Join(mountpoint, initPath), nil
}
func (raw *data) path(subsystem string) (string, error) {
+ mnt, err := cgroups.FindCgroupMountpoint(subsystem)
+ // If we didn't mount the subsystem, there is no point we make the path.
+ if err != nil {
+ return "", err
+ }
+
// If the cgroup name/path is absolute do not look relative to the cgroup of the init process.
if filepath.IsAbs(raw.cgroup) {
- path := filepath.Join(raw.root, subsystem, raw.cgroup)
-
- if _, err := os.Stat(path); err != nil {
- if os.IsNotExist(err) {
- return "", cgroups.NewNotFoundError(subsystem)
- }
-
- return "", err
- }
-
- return path, nil
+ return filepath.Join(raw.root, subsystem, raw.cgroup), nil
}
- parent, err := raw.parent(subsystem)
+ parent, err := raw.parent(subsystem, mnt)
if err != nil {
return "", err
}
diff --git a/vendor/src/github.com/docker/libcontainer/cgroups/fs/blkio.go b/vendor/src/github.com/docker/libcontainer/cgroups/fs/blkio.go
index ce824d56c2..8e132643bb 100644
--- a/vendor/src/github.com/docker/libcontainer/cgroups/fs/blkio.go
+++ b/vendor/src/github.com/docker/libcontainer/cgroups/fs/blkio.go
@@ -9,17 +9,32 @@ import (
"strings"
"github.com/docker/libcontainer/cgroups"
+ "github.com/docker/libcontainer/configs"
)
type BlkioGroup struct {
}
-func (s *BlkioGroup) Set(d *data) error {
- // we just want to join this group even though we don't set anything
- if _, err := d.join("blkio"); err != nil && !cgroups.IsNotFound(err) {
+func (s *BlkioGroup) Apply(d *data) error {
+ dir, err := d.join("blkio")
+ if err != nil && !cgroups.IsNotFound(err) {
return err
}
+ if err := s.Set(dir, d.c); err != nil {
+ return err
+ }
+
+ return nil
+}
+
+func (s *BlkioGroup) Set(path string, cgroup *configs.Cgroup) error {
+ if cgroup.BlkioWeight != 0 {
+ if err := writeFile(path, "blkio.weight", strconv.FormatInt(cgroup.BlkioWeight, 10)); err != nil {
+ return err
+ }
+ }
+
return nil
}
diff --git a/vendor/src/github.com/docker/libcontainer/cgroups/fs/blkio_test.go b/vendor/src/github.com/docker/libcontainer/cgroups/fs/blkio_test.go
index 6cd38cbaba..9ef93fcff2 100644
--- a/vendor/src/github.com/docker/libcontainer/cgroups/fs/blkio_test.go
+++ b/vendor/src/github.com/docker/libcontainer/cgroups/fs/blkio_test.go
@@ -1,6 +1,7 @@
package fs
import (
+ "strconv"
"testing"
"github.com/docker/libcontainer/cgroups"
@@ -72,6 +73,35 @@ func appendBlkioStatEntry(blkioStatEntries *[]cgroups.BlkioStatEntry, major, min
*blkioStatEntries = append(*blkioStatEntries, cgroups.BlkioStatEntry{Major: major, Minor: minor, Value: value, Op: op})
}
+func TestBlkioSetWeight(t *testing.T) {
+ helper := NewCgroupTestUtil("blkio", t)
+ defer helper.cleanup()
+
+ const (
+ weightBefore = 100
+ weightAfter = 200
+ )
+
+ helper.writeFileContents(map[string]string{
+ "blkio.weight": strconv.Itoa(weightBefore),
+ })
+
+ helper.CgroupData.c.BlkioWeight = weightAfter
+ blkio := &BlkioGroup{}
+ if err := blkio.Set(helper.CgroupPath, helper.CgroupData.c); err != nil {
+ t.Fatal(err)
+ }
+
+ value, err := getCgroupParamUint(helper.CgroupPath, "blkio.weight")
+ if err != nil {
+ t.Fatalf("Failed to parse blkio.weight - %s", err)
+ }
+
+ if value != weightAfter {
+ t.Fatal("Got the wrong value, set blkio.weight failed.")
+ }
+}
+
func TestBlkioStats(t *testing.T) {
helper := NewCgroupTestUtil("blkio", t)
defer helper.cleanup()
diff --git a/vendor/src/github.com/docker/libcontainer/cgroups/fs/cpu.go b/vendor/src/github.com/docker/libcontainer/cgroups/fs/cpu.go
index efac9ed16a..1fbf7b1540 100644
--- a/vendor/src/github.com/docker/libcontainer/cgroups/fs/cpu.go
+++ b/vendor/src/github.com/docker/libcontainer/cgroups/fs/cpu.go
@@ -7,33 +7,44 @@ import (
"strconv"
"github.com/docker/libcontainer/cgroups"
+ "github.com/docker/libcontainer/configs"
)
type CpuGroup struct {
}
-func (s *CpuGroup) Set(d *data) error {
+func (s *CpuGroup) Apply(d *data) error {
// We always want to join the cpu group, to allow fair cpu scheduling
// on a container basis
dir, err := d.join("cpu")
if err != nil {
return err
}
- if d.c.CpuShares != 0 {
- if err := writeFile(dir, "cpu.shares", strconv.FormatInt(d.c.CpuShares, 10)); err != nil {
+
+ if err := s.Set(dir, d.c); err != nil {
+ return err
+ }
+
+ return nil
+}
+
+func (s *CpuGroup) Set(path string, cgroup *configs.Cgroup) error {
+ if cgroup.CpuShares != 0 {
+ if err := writeFile(path, "cpu.shares", strconv.FormatInt(cgroup.CpuShares, 10)); err != nil {
return err
}
}
- if d.c.CpuPeriod != 0 {
- if err := writeFile(dir, "cpu.cfs_period_us", strconv.FormatInt(d.c.CpuPeriod, 10)); err != nil {
+ if cgroup.CpuPeriod != 0 {
+ if err := writeFile(path, "cpu.cfs_period_us", strconv.FormatInt(cgroup.CpuPeriod, 10)); err != nil {
return err
}
}
- if d.c.CpuQuota != 0 {
- if err := writeFile(dir, "cpu.cfs_quota_us", strconv.FormatInt(d.c.CpuQuota, 10)); err != nil {
+ if cgroup.CpuQuota != 0 {
+ if err := writeFile(path, "cpu.cfs_quota_us", strconv.FormatInt(cgroup.CpuQuota, 10)); err != nil {
return err
}
}
+
return nil
}
diff --git a/vendor/src/github.com/docker/libcontainer/cgroups/fs/cpu_test.go b/vendor/src/github.com/docker/libcontainer/cgroups/fs/cpu_test.go
index 2470e68956..bcf4ac4e8a 100644
--- a/vendor/src/github.com/docker/libcontainer/cgroups/fs/cpu_test.go
+++ b/vendor/src/github.com/docker/libcontainer/cgroups/fs/cpu_test.go
@@ -2,11 +2,81 @@ package fs
import (
"fmt"
+ "strconv"
"testing"
"github.com/docker/libcontainer/cgroups"
)
+func TestCpuSetShares(t *testing.T) {
+ helper := NewCgroupTestUtil("cpu", t)
+ defer helper.cleanup()
+
+ const (
+ sharesBefore = 1024
+ sharesAfter = 512
+ )
+
+ helper.writeFileContents(map[string]string{
+ "cpu.shares": strconv.Itoa(sharesBefore),
+ })
+
+ helper.CgroupData.c.CpuShares = sharesAfter
+ cpu := &CpuGroup{}
+ if err := cpu.Set(helper.CgroupPath, helper.CgroupData.c); err != nil {
+ t.Fatal(err)
+ }
+
+ value, err := getCgroupParamUint(helper.CgroupPath, "cpu.shares")
+ if err != nil {
+ t.Fatalf("Failed to parse cpu.shares - %s", err)
+ }
+
+ if value != sharesAfter {
+ t.Fatal("Got the wrong value, set cpu.shares failed.")
+ }
+}
+
+func TestCpuSetBandWidth(t *testing.T) {
+ helper := NewCgroupTestUtil("cpu", t)
+ defer helper.cleanup()
+
+ const (
+ quotaBefore = 8000
+ quotaAfter = 5000
+ periodBefore = 10000
+ periodAfter = 7000
+ )
+
+ helper.writeFileContents(map[string]string{
+ "cpu.cfs_quota_us": strconv.Itoa(quotaBefore),
+ "cpu.cfs_period_us": strconv.Itoa(periodBefore),
+ })
+
+ helper.CgroupData.c.CpuQuota = quotaAfter
+ helper.CgroupData.c.CpuPeriod = periodAfter
+ cpu := &CpuGroup{}
+ if err := cpu.Set(helper.CgroupPath, helper.CgroupData.c); err != nil {
+ t.Fatal(err)
+ }
+
+ quota, err := getCgroupParamUint(helper.CgroupPath, "cpu.cfs_quota_us")
+ if err != nil {
+ t.Fatalf("Failed to parse cpu.cfs_quota_us - %s", err)
+ }
+ if quota != quotaAfter {
+ t.Fatal("Got the wrong value, set cpu.cfs_quota_us failed.")
+ }
+
+ period, err := getCgroupParamUint(helper.CgroupPath, "cpu.cfs_period_us")
+ if err != nil {
+ t.Fatalf("Failed to parse cpu.cfs_period_us - %s", err)
+ }
+ if period != periodAfter {
+ t.Fatal("Got the wrong value, set cpu.cfs_period_us failed.")
+ }
+}
+
func TestCpuStats(t *testing.T) {
helper := NewCgroupTestUtil("cpu", t)
defer helper.cleanup()
diff --git a/vendor/src/github.com/docker/libcontainer/cgroups/fs/cpuacct.go b/vendor/src/github.com/docker/libcontainer/cgroups/fs/cpuacct.go
index 14b55ccd4e..decee85094 100644
--- a/vendor/src/github.com/docker/libcontainer/cgroups/fs/cpuacct.go
+++ b/vendor/src/github.com/docker/libcontainer/cgroups/fs/cpuacct.go
@@ -8,6 +8,7 @@ import (
"strings"
"github.com/docker/libcontainer/cgroups"
+ "github.com/docker/libcontainer/configs"
"github.com/docker/libcontainer/system"
)
@@ -21,7 +22,7 @@ var clockTicks = uint64(system.GetClockTicks())
type CpuacctGroup struct {
}
-func (s *CpuacctGroup) Set(d *data) error {
+func (s *CpuacctGroup) Apply(d *data) error {
// we just want to join this group even though we don't set anything
if _, err := d.join("cpuacct"); err != nil && !cgroups.IsNotFound(err) {
return err
@@ -30,6 +31,10 @@ func (s *CpuacctGroup) Set(d *data) error {
return nil
}
+func (s *CpuacctGroup) Set(path string, cgroup *configs.Cgroup) error {
+ return nil
+}
+
func (s *CpuacctGroup) Remove(d *data) error {
return removePath(d.path("cpuacct"))
}
diff --git a/vendor/src/github.com/docker/libcontainer/cgroups/fs/cpuset.go b/vendor/src/github.com/docker/libcontainer/cgroups/fs/cpuset.go
index ff67a53e87..d8465a666b 100644
--- a/vendor/src/github.com/docker/libcontainer/cgroups/fs/cpuset.go
+++ b/vendor/src/github.com/docker/libcontainer/cgroups/fs/cpuset.go
@@ -8,17 +8,35 @@ import (
"strconv"
"github.com/docker/libcontainer/cgroups"
+ "github.com/docker/libcontainer/configs"
)
type CpusetGroup struct {
}
-func (s *CpusetGroup) Set(d *data) error {
+func (s *CpusetGroup) Apply(d *data) error {
dir, err := d.path("cpuset")
if err != nil {
return err
}
- return s.SetDir(dir, d.c.CpusetCpus, d.c.CpusetMems, d.pid)
+
+ return s.ApplyDir(dir, d.c, d.pid)
+}
+
+func (s *CpusetGroup) Set(path string, cgroup *configs.Cgroup) error {
+ if cgroup.CpusetCpus != "" {
+ if err := writeFile(path, "cpuset.cpus", cgroup.CpusetCpus); err != nil {
+ return err
+ }
+ }
+
+ if cgroup.CpusetMems != "" {
+ if err := writeFile(path, "cpuset.mems", cgroup.CpusetMems); err != nil {
+ return err
+ }
+ }
+
+ return nil
}
func (s *CpusetGroup) Remove(d *data) error {
@@ -29,7 +47,7 @@ func (s *CpusetGroup) GetStats(path string, stats *cgroups.Stats) error {
return nil
}
-func (s *CpusetGroup) SetDir(dir, cpus string, mems string, pid int) error {
+func (s *CpusetGroup) ApplyDir(dir string, cgroup *configs.Cgroup, pid int) error {
if err := s.ensureParent(dir); err != nil {
return err
}
@@ -40,17 +58,10 @@ func (s *CpusetGroup) SetDir(dir, cpus string, mems string, pid int) error {
return err
}
- // If we don't use --cpuset-xxx, the default value inherit from parent cgroup
- // is set in s.ensureParent, otherwise, use the value we set
- if cpus != "" {
- if err := writeFile(dir, "cpuset.cpus", cpus); err != nil {
- return err
- }
- }
- if mems != "" {
- if err := writeFile(dir, "cpuset.mems", mems); err != nil {
- return err
- }
+ // the default values inherit from parent cgroup are already set in
+ // s.ensureParent, cover these if we have our own
+ if err := s.Set(dir, cgroup); err != nil {
+ return err
}
return nil
diff --git a/vendor/src/github.com/docker/libcontainer/cgroups/fs/cpuset_test.go b/vendor/src/github.com/docker/libcontainer/cgroups/fs/cpuset_test.go
new file mode 100644
index 0000000000..7449cdca17
--- /dev/null
+++ b/vendor/src/github.com/docker/libcontainer/cgroups/fs/cpuset_test.go
@@ -0,0 +1,63 @@
+package fs
+
+import (
+ "testing"
+)
+
+func TestCpusetSetCpus(t *testing.T) {
+ helper := NewCgroupTestUtil("cpuset", t)
+ defer helper.cleanup()
+
+ const (
+ cpusBefore = "0"
+ cpusAfter = "1-3"
+ )
+
+ helper.writeFileContents(map[string]string{
+ "cpuset.cpus": cpusBefore,
+ })
+
+ helper.CgroupData.c.CpusetCpus = cpusAfter
+ cpuset := &CpusetGroup{}
+ if err := cpuset.Set(helper.CgroupPath, helper.CgroupData.c); err != nil {
+ t.Fatal(err)
+ }
+
+ value, err := getCgroupParamString(helper.CgroupPath, "cpuset.cpus")
+ if err != nil {
+ t.Fatalf("Failed to parse cpuset.cpus - %s", err)
+ }
+
+ if value != cpusAfter {
+ t.Fatal("Got the wrong value, set cpuset.cpus failed.")
+ }
+}
+
+func TestCpusetSetMems(t *testing.T) {
+ helper := NewCgroupTestUtil("cpuset", t)
+ defer helper.cleanup()
+
+ const (
+ memsBefore = "0"
+ memsAfter = "1"
+ )
+
+ helper.writeFileContents(map[string]string{
+ "cpuset.mems": memsBefore,
+ })
+
+ helper.CgroupData.c.CpusetMems = memsAfter
+ cpuset := &CpusetGroup{}
+ if err := cpuset.Set(helper.CgroupPath, helper.CgroupData.c); err != nil {
+ t.Fatal(err)
+ }
+
+ value, err := getCgroupParamString(helper.CgroupPath, "cpuset.mems")
+ if err != nil {
+ t.Fatalf("Failed to parse cpuset.mems - %s", err)
+ }
+
+ if value != memsAfter {
+ t.Fatal("Got the wrong value, set cpuset.mems failed.")
+ }
+}
diff --git a/vendor/src/github.com/docker/libcontainer/cgroups/fs/devices.go b/vendor/src/github.com/docker/libcontainer/cgroups/fs/devices.go
index 98d5d2d7dd..16e00b1c73 100644
--- a/vendor/src/github.com/docker/libcontainer/cgroups/fs/devices.go
+++ b/vendor/src/github.com/docker/libcontainer/cgroups/fs/devices.go
@@ -1,27 +1,39 @@
package fs
-import "github.com/docker/libcontainer/cgroups"
+import (
+ "github.com/docker/libcontainer/cgroups"
+ "github.com/docker/libcontainer/configs"
+)
type DevicesGroup struct {
}
-func (s *DevicesGroup) Set(d *data) error {
+func (s *DevicesGroup) Apply(d *data) error {
dir, err := d.join("devices")
if err != nil {
return err
}
- if !d.c.AllowAllDevices {
- if err := writeFile(dir, "devices.deny", "a"); err != nil {
+ if err := s.Set(dir, d.c); err != nil {
+ return err
+ }
+
+ return nil
+}
+
+func (s *DevicesGroup) Set(path string, cgroup *configs.Cgroup) error {
+ if !cgroup.AllowAllDevices {
+ if err := writeFile(path, "devices.deny", "a"); err != nil {
return err
}
- for _, dev := range d.c.AllowedDevices {
- if err := writeFile(dir, "devices.allow", dev.GetCgroupAllowString()); err != nil {
+ for _, dev := range cgroup.AllowedDevices {
+ if err := writeFile(path, "devices.allow", dev.CgroupString()); err != nil {
return err
}
}
}
+
return nil
}
diff --git a/vendor/src/github.com/docker/libcontainer/cgroups/fs/devices_test.go b/vendor/src/github.com/docker/libcontainer/cgroups/fs/devices_test.go
new file mode 100644
index 0000000000..18bb127462
--- /dev/null
+++ b/vendor/src/github.com/docker/libcontainer/cgroups/fs/devices_test.go
@@ -0,0 +1,46 @@
+package fs
+
+import (
+ "testing"
+
+ "github.com/docker/libcontainer/configs"
+)
+
+var (
+ allowedDevices = []*configs.Device{
+ {
+ Path: "/dev/zero",
+ Type: 'c',
+ Major: 1,
+ Minor: 5,
+ Permissions: "rwm",
+ FileMode: 0666,
+ },
+ }
+ allowedList = "c 1:5 rwm"
+)
+
+func TestDevicesSetAllow(t *testing.T) {
+ helper := NewCgroupTestUtil("devices", t)
+ defer helper.cleanup()
+
+ helper.writeFileContents(map[string]string{
+ "devices.deny": "a",
+ })
+
+ helper.CgroupData.c.AllowAllDevices = false
+ helper.CgroupData.c.AllowedDevices = allowedDevices
+ devices := &DevicesGroup{}
+ if err := devices.Set(helper.CgroupPath, helper.CgroupData.c); err != nil {
+ t.Fatal(err)
+ }
+
+ value, err := getCgroupParamString(helper.CgroupPath, "devices.allow")
+ if err != nil {
+ t.Fatalf("Failed to parse devices.allow - %s", err)
+ }
+
+ if value != allowedList {
+ t.Fatal("Got the wrong value, set devices.allow failed.")
+ }
+}
diff --git a/vendor/src/github.com/docker/libcontainer/cgroups/fs/freezer.go b/vendor/src/github.com/docker/libcontainer/cgroups/fs/freezer.go
index c6b677fa95..1110e5ff1a 100644
--- a/vendor/src/github.com/docker/libcontainer/cgroups/fs/freezer.go
+++ b/vendor/src/github.com/docker/libcontainer/cgroups/fs/freezer.go
@@ -1,41 +1,51 @@
package fs
import (
+ "fmt"
"strings"
"time"
"github.com/docker/libcontainer/cgroups"
+ "github.com/docker/libcontainer/configs"
)
type FreezerGroup struct {
}
-func (s *FreezerGroup) Set(d *data) error {
- switch d.c.Freezer {
- case cgroups.Frozen, cgroups.Thawed:
- dir, err := d.path("freezer")
- if err != nil {
- return err
- }
+func (s *FreezerGroup) Apply(d *data) error {
+ dir, err := d.join("freezer")
+ if err != nil && !cgroups.IsNotFound(err) {
+ return err
+ }
+
+ if err := s.Set(dir, d.c); err != nil {
+ return err
+ }
- if err := writeFile(dir, "freezer.state", string(d.c.Freezer)); err != nil {
+ return nil
+}
+
+func (s *FreezerGroup) Set(path string, cgroup *configs.Cgroup) error {
+ switch cgroup.Freezer {
+ case configs.Frozen, configs.Thawed:
+ if err := writeFile(path, "freezer.state", string(cgroup.Freezer)); err != nil {
return err
}
for {
- state, err := readFile(dir, "freezer.state")
+ state, err := readFile(path, "freezer.state")
if err != nil {
return err
}
- if strings.TrimSpace(state) == string(d.c.Freezer) {
+ if strings.TrimSpace(state) == string(cgroup.Freezer) {
break
}
time.Sleep(1 * time.Millisecond)
}
+ case configs.Undefined:
+ return nil
default:
- if _, err := d.join("freezer"); err != nil && !cgroups.IsNotFound(err) {
- return err
- }
+ return fmt.Errorf("Invalid argument '%s' to freezer.state", string(cgroup.Freezer))
}
return nil
diff --git a/vendor/src/github.com/docker/libcontainer/cgroups/fs/freezer_test.go b/vendor/src/github.com/docker/libcontainer/cgroups/fs/freezer_test.go
new file mode 100644
index 0000000000..9ff1886d26
--- /dev/null
+++ b/vendor/src/github.com/docker/libcontainer/cgroups/fs/freezer_test.go
@@ -0,0 +1,45 @@
+package fs
+
+import (
+ "testing"
+
+ "github.com/docker/libcontainer/configs"
+)
+
+func TestFreezerSetState(t *testing.T) {
+ helper := NewCgroupTestUtil("freezer", t)
+ defer helper.cleanup()
+
+ helper.writeFileContents(map[string]string{
+ "freezer.state": string(configs.Frozen),
+ })
+
+ helper.CgroupData.c.Freezer = configs.Thawed
+ freezer := &FreezerGroup{}
+ if err := freezer.Set(helper.CgroupPath, helper.CgroupData.c); err != nil {
+ t.Fatal(err)
+ }
+
+ value, err := getCgroupParamString(helper.CgroupPath, "freezer.state")
+ if err != nil {
+ t.Fatalf("Failed to parse freezer.state - %s", err)
+ }
+ if value != string(configs.Thawed) {
+ t.Fatal("Got the wrong value, set freezer.state failed.")
+ }
+}
+
+func TestFreezerSetInvalidState(t *testing.T) {
+ helper := NewCgroupTestUtil("freezer", t)
+ defer helper.cleanup()
+
+ const (
+ invalidArg configs.FreezerState = "Invalid"
+ )
+
+ helper.CgroupData.c.Freezer = invalidArg
+ freezer := &FreezerGroup{}
+ if err := freezer.Set(helper.CgroupPath, helper.CgroupData.c); err == nil {
+ t.Fatal("Failed to return invalid argument error")
+ }
+}
diff --git a/vendor/src/github.com/docker/libcontainer/cgroups/fs/memory.go b/vendor/src/github.com/docker/libcontainer/cgroups/fs/memory.go
index 01713fd790..b99f81687a 100644
--- a/vendor/src/github.com/docker/libcontainer/cgroups/fs/memory.go
+++ b/vendor/src/github.com/docker/libcontainer/cgroups/fs/memory.go
@@ -8,12 +8,13 @@ import (
"strconv"
"github.com/docker/libcontainer/cgroups"
+ "github.com/docker/libcontainer/configs"
)
type MemoryGroup struct {
}
-func (s *MemoryGroup) Set(d *data) error {
+func (s *MemoryGroup) Apply(d *data) error {
dir, err := d.join("memory")
// only return an error for memory if it was specified
if err != nil && (d.c.Memory != 0 || d.c.MemoryReservation != 0 || d.c.MemorySwap != 0) {
@@ -25,31 +26,42 @@ func (s *MemoryGroup) Set(d *data) error {
}
}()
- // Only set values if some config was specified.
- if d.c.Memory != 0 || d.c.MemoryReservation != 0 || d.c.MemorySwap != 0 {
- if d.c.Memory != 0 {
- if err := writeFile(dir, "memory.limit_in_bytes", strconv.FormatInt(d.c.Memory, 10)); err != nil {
- return err
- }
+ if err := s.Set(dir, d.c); err != nil {
+ return err
+ }
+
+ return nil
+}
+
+func (s *MemoryGroup) Set(path string, cgroup *configs.Cgroup) error {
+ if cgroup.Memory != 0 {
+ if err := writeFile(path, "memory.limit_in_bytes", strconv.FormatInt(cgroup.Memory, 10)); err != nil {
+ return err
}
- if d.c.MemoryReservation != 0 {
- if err := writeFile(dir, "memory.soft_limit_in_bytes", strconv.FormatInt(d.c.MemoryReservation, 10)); err != nil {
- return err
- }
+ }
+ if cgroup.MemoryReservation != 0 {
+ if err := writeFile(path, "memory.soft_limit_in_bytes", strconv.FormatInt(cgroup.MemoryReservation, 10)); err != nil {
+ return err
}
- // By default, MemorySwap is set to twice the size of RAM.
- // If you want to omit MemorySwap, set it to '-1'.
- if d.c.MemorySwap == 0 {
- if err := writeFile(dir, "memory.memsw.limit_in_bytes", strconv.FormatInt(d.c.Memory*2, 10)); err != nil {
- return err
- }
+ }
+ // By default, MemorySwap is set to twice the size of Memory.
+ if cgroup.MemorySwap == 0 && cgroup.Memory != 0 {
+ if err := writeFile(path, "memory.memsw.limit_in_bytes", strconv.FormatInt(cgroup.Memory*2, 10)); err != nil {
+ return err
+ }
+ }
+ if cgroup.MemorySwap > 0 {
+ if err := writeFile(path, "memory.memsw.limit_in_bytes", strconv.FormatInt(cgroup.MemorySwap, 10)); err != nil {
+ return err
}
- if d.c.MemorySwap > 0 {
- if err := writeFile(dir, "memory.memsw.limit_in_bytes", strconv.FormatInt(d.c.MemorySwap, 10)); err != nil {
- return err
- }
+ }
+
+ if cgroup.OomKillDisable {
+ if err := writeFile(path, "memory.oom_control", "1"); err != nil {
+ return err
}
}
+
return nil
}
diff --git a/vendor/src/github.com/docker/libcontainer/cgroups/fs/memory_test.go b/vendor/src/github.com/docker/libcontainer/cgroups/fs/memory_test.go
index a21cec75c0..1e939c4e88 100644
--- a/vendor/src/github.com/docker/libcontainer/cgroups/fs/memory_test.go
+++ b/vendor/src/github.com/docker/libcontainer/cgroups/fs/memory_test.go
@@ -1,6 +1,7 @@
package fs
import (
+ "strconv"
"testing"
"github.com/docker/libcontainer/cgroups"
@@ -14,6 +15,103 @@ rss 1024`
memoryFailcnt = "100\n"
)
+func TestMemorySetMemory(t *testing.T) {
+ helper := NewCgroupTestUtil("memory", t)
+ defer helper.cleanup()
+
+ const (
+ memoryBefore = 314572800 // 300M
+ memoryAfter = 524288000 // 500M
+ reservationBefore = 209715200 // 200M
+ reservationAfter = 314572800 // 300M
+ )
+
+ helper.writeFileContents(map[string]string{
+ "memory.limit_in_bytes": strconv.Itoa(memoryBefore),
+ "memory.soft_limit_in_bytes": strconv.Itoa(reservationBefore),
+ })
+
+ helper.CgroupData.c.Memory = memoryAfter
+ helper.CgroupData.c.MemoryReservation = reservationAfter
+ memory := &MemoryGroup{}
+ if err := memory.Set(helper.CgroupPath, helper.CgroupData.c); err != nil {
+ t.Fatal(err)
+ }
+
+ value, err := getCgroupParamUint(helper.CgroupPath, "memory.limit_in_bytes")
+ if err != nil {
+ t.Fatalf("Failed to parse memory.limit_in_bytes - %s", err)
+ }
+ if value != memoryAfter {
+ t.Fatal("Got the wrong value, set memory.limit_in_bytes failed.")
+ }
+
+ value, err = getCgroupParamUint(helper.CgroupPath, "memory.soft_limit_in_bytes")
+ if err != nil {
+ t.Fatalf("Failed to parse memory.soft_limit_in_bytes - %s", err)
+ }
+ if value != reservationAfter {
+ t.Fatal("Got the wrong value, set memory.soft_limit_in_bytes failed.")
+ }
+}
+
+func TestMemorySetMemoryswap(t *testing.T) {
+ helper := NewCgroupTestUtil("memory", t)
+ defer helper.cleanup()
+
+ const (
+ memoryswapBefore = 314572800 // 300M
+ memoryswapAfter = 524288000 // 500M
+ )
+
+ helper.writeFileContents(map[string]string{
+ "memory.memsw.limit_in_bytes": strconv.Itoa(memoryswapBefore),
+ })
+
+ helper.CgroupData.c.MemorySwap = memoryswapAfter
+ memory := &MemoryGroup{}
+ if err := memory.Set(helper.CgroupPath, helper.CgroupData.c); err != nil {
+ t.Fatal(err)
+ }
+
+ value, err := getCgroupParamUint(helper.CgroupPath, "memory.memsw.limit_in_bytes")
+ if err != nil {
+ t.Fatalf("Failed to parse memory.memsw.limit_in_bytes - %s", err)
+ }
+ if value != memoryswapAfter {
+ t.Fatal("Got the wrong value, set memory.memsw.limit_in_bytes failed.")
+ }
+}
+
+func TestMemorySetMemoryswapDefault(t *testing.T) {
+ helper := NewCgroupTestUtil("memory", t)
+ defer helper.cleanup()
+
+ const (
+ memoryBefore = 209715200 // 200M
+ memoryAfter = 314572800 // 300M
+ memoryswapAfter = 629145600 // 300M*2
+ )
+
+ helper.writeFileContents(map[string]string{
+ "memory.limit_in_bytes": strconv.Itoa(memoryBefore),
+ })
+
+ helper.CgroupData.c.Memory = memoryAfter
+ memory := &MemoryGroup{}
+ if err := memory.Set(helper.CgroupPath, helper.CgroupData.c); err != nil {
+ t.Fatal(err)
+ }
+
+ value, err := getCgroupParamUint(helper.CgroupPath, "memory.memsw.limit_in_bytes")
+ if err != nil {
+ t.Fatalf("Failed to parse memory.memsw.limit_in_bytes - %s", err)
+ }
+ if value != memoryswapAfter {
+ t.Fatal("Got the wrong value, set memory.memsw.limit_in_bytes failed.")
+ }
+}
+
func TestMemoryStats(t *testing.T) {
helper := NewCgroupTestUtil("memory", t)
defer helper.cleanup()
@@ -132,3 +230,30 @@ func TestMemoryStatsBadMaxUsageFile(t *testing.T) {
t.Fatal("Expected failure")
}
}
+
+func TestMemorySetOomControl(t *testing.T) {
+ helper := NewCgroupTestUtil("memory", t)
+ defer helper.cleanup()
+
+ const (
+ oom_kill_disable = 1 // disable oom killer, default is 0
+ )
+
+ helper.writeFileContents(map[string]string{
+ "memory.oom_control": strconv.Itoa(oom_kill_disable),
+ })
+
+ memory := &MemoryGroup{}
+ if err := memory.Set(helper.CgroupPath, helper.CgroupData.c); err != nil {
+ t.Fatal(err)
+ }
+
+ value, err := getCgroupParamUint(helper.CgroupPath, "memory.oom_control")
+ if err != nil {
+ t.Fatalf("Failed to parse memory.oom_control - %s", err)
+ }
+
+ if value != oom_kill_disable {
+ t.Fatalf("Got the wrong value, set memory.oom_control failed.")
+ }
+}
diff --git a/vendor/src/github.com/docker/libcontainer/cgroups/fs/perf_event.go b/vendor/src/github.com/docker/libcontainer/cgroups/fs/perf_event.go
index 813274d8cb..ca65f734a1 100644
--- a/vendor/src/github.com/docker/libcontainer/cgroups/fs/perf_event.go
+++ b/vendor/src/github.com/docker/libcontainer/cgroups/fs/perf_event.go
@@ -2,12 +2,13 @@ package fs
import (
"github.com/docker/libcontainer/cgroups"
+ "github.com/docker/libcontainer/configs"
)
type PerfEventGroup struct {
}
-func (s *PerfEventGroup) Set(d *data) error {
+func (s *PerfEventGroup) Apply(d *data) error {
// we just want to join this group even though we don't set anything
if _, err := d.join("perf_event"); err != nil && !cgroups.IsNotFound(err) {
return err
@@ -15,6 +16,10 @@ func (s *PerfEventGroup) Set(d *data) error {
return nil
}
+func (s *PerfEventGroup) Set(path string, cgroup *configs.Cgroup) error {
+ return nil
+}
+
func (s *PerfEventGroup) Remove(d *data) error {
return removePath(d.path("perf_event"))
}
diff --git a/vendor/src/github.com/docker/libcontainer/cgroups/fs/util_test.go b/vendor/src/github.com/docker/libcontainer/cgroups/fs/util_test.go
index 548870a8a3..37bf515781 100644
--- a/vendor/src/github.com/docker/libcontainer/cgroups/fs/util_test.go
+++ b/vendor/src/github.com/docker/libcontainer/cgroups/fs/util_test.go
@@ -6,10 +6,12 @@ Creates a mock of the cgroup filesystem for the duration of the test.
package fs
import (
- "fmt"
"io/ioutil"
"os"
+ "path/filepath"
"testing"
+
+ "github.com/docker/libcontainer/configs"
)
type cgroupTestUtil struct {
@@ -26,13 +28,15 @@ type cgroupTestUtil struct {
// Creates a new test util for the specified subsystem
func NewCgroupTestUtil(subsystem string, t *testing.T) *cgroupTestUtil {
- d := &data{}
- tempDir, err := ioutil.TempDir("", fmt.Sprintf("%s_cgroup_test", subsystem))
+ d := &data{
+ c: &configs.Cgroup{},
+ }
+ tempDir, err := ioutil.TempDir("", "cgroup_test")
if err != nil {
t.Fatal(err)
}
d.root = tempDir
- testCgroupPath, err := d.path(subsystem)
+ testCgroupPath := filepath.Join(d.root, subsystem)
if err != nil {
t.Fatal(err)
}
diff --git a/vendor/src/github.com/docker/libcontainer/cgroups/fs/utils.go b/vendor/src/github.com/docker/libcontainer/cgroups/fs/utils.go
index f37a3a485a..c2f75c8e54 100644
--- a/vendor/src/github.com/docker/libcontainer/cgroups/fs/utils.go
+++ b/vendor/src/github.com/docker/libcontainer/cgroups/fs/utils.go
@@ -60,3 +60,13 @@ func getCgroupParamUint(cgroupPath, cgroupFile string) (uint64, error) {
return parseUint(strings.TrimSpace(string(contents)), 10, 64)
}
+
+// Gets a string value from the specified cgroup file
+func getCgroupParamString(cgroupPath, cgroupFile string) (string, error) {
+ contents, err := ioutil.ReadFile(filepath.Join(cgroupPath, cgroupFile))
+ if err != nil {
+ return "", err
+ }
+
+ return strings.TrimSpace(string(contents)), nil
+}
diff --git a/vendor/src/github.com/docker/libcontainer/cgroups/systemd/apply_nosystemd.go b/vendor/src/github.com/docker/libcontainer/cgroups/systemd/apply_nosystemd.go
index 4b9a2f5b74..95ed4ea7eb 100644
--- a/vendor/src/github.com/docker/libcontainer/cgroups/systemd/apply_nosystemd.go
+++ b/vendor/src/github.com/docker/libcontainer/cgroups/systemd/apply_nosystemd.go
@@ -6,24 +6,50 @@ import (
"fmt"
"github.com/docker/libcontainer/cgroups"
+ "github.com/docker/libcontainer/configs"
)
+type Manager struct {
+ Cgroups *configs.Cgroup
+ Paths map[string]string
+}
+
func UseSystemd() bool {
return false
}
-func Apply(c *cgroups.Cgroup, pid int) (map[string]string, error) {
+func (m *Manager) Apply(pid int) error {
+ return fmt.Errorf("Systemd not supported")
+}
+
+func (m *Manager) GetPids() ([]int, error) {
+ return nil, fmt.Errorf("Systemd not supported")
+}
+
+func (m *Manager) Destroy() error {
+ return fmt.Errorf("Systemd not supported")
+}
+
+func (m *Manager) GetPaths() map[string]string {
+ return nil
+}
+
+func (m *Manager) GetStats() (*cgroups.Stats, error) {
return nil, fmt.Errorf("Systemd not supported")
}
-func GetPids(c *cgroups.Cgroup) ([]int, error) {
+func (m *Manager) Set(container *configs.Config) error {
return nil, fmt.Errorf("Systemd not supported")
}
-func ApplyDevices(c *cgroups.Cgroup, pid int) error {
+func (m *Manager) Freeze(state configs.FreezerState) error {
+ return fmt.Errorf("Systemd not supported")
+}
+
+func ApplyDevices(c *configs.Cgroup, pid int) error {
return fmt.Errorf("Systemd not supported")
}
-func Freeze(c *cgroups.Cgroup, state cgroups.FreezerState) error {
+func Freeze(c *configs.Cgroup, state configs.FreezerState) error {
return fmt.Errorf("Systemd not supported")
}
diff --git a/vendor/src/github.com/docker/libcontainer/cgroups/systemd/apply_systemd.go b/vendor/src/github.com/docker/libcontainer/cgroups/systemd/apply_systemd.go
index 41dce3117d..3609bccae6 100644
--- a/vendor/src/github.com/docker/libcontainer/cgroups/systemd/apply_systemd.go
+++ b/vendor/src/github.com/docker/libcontainer/cgroups/systemd/apply_systemd.go
@@ -3,7 +3,6 @@
package systemd
import (
- "bytes"
"fmt"
"io/ioutil"
"os"
@@ -16,21 +15,42 @@ import (
systemd "github.com/coreos/go-systemd/dbus"
"github.com/docker/libcontainer/cgroups"
"github.com/docker/libcontainer/cgroups/fs"
+ "github.com/docker/libcontainer/configs"
"github.com/godbus/dbus"
)
-type systemdCgroup struct {
- cgroup *cgroups.Cgroup
+type Manager struct {
+ Cgroups *configs.Cgroup
+ Paths map[string]string
}
type subsystem interface {
- GetStats(string, *cgroups.Stats) error
+ // Returns the stats, as 'stats', corresponding to the cgroup under 'path'.
+ GetStats(path string, stats *cgroups.Stats) error
+ // Set the cgroup represented by cgroup.
+ Set(path string, cgroup *configs.Cgroup) error
}
+var subsystems = map[string]subsystem{
+ "devices": &fs.DevicesGroup{},
+ "memory": &fs.MemoryGroup{},
+ "cpu": &fs.CpuGroup{},
+ "cpuset": &fs.CpusetGroup{},
+ "cpuacct": &fs.CpuacctGroup{},
+ "blkio": &fs.BlkioGroup{},
+ "perf_event": &fs.PerfEventGroup{},
+ "freezer": &fs.FreezerGroup{},
+}
+
+const (
+ testScopeWait = 4
+)
+
var (
- connLock sync.Mutex
- theConn *systemd.Conn
- hasStartTransientUnit bool
+ connLock sync.Mutex
+ theConn *systemd.Conn
+ hasStartTransientUnit bool
+ hasTransientDefaultDependencies bool
)
func newProp(name string, units interface{}) systemd.Property {
@@ -64,9 +84,46 @@ func UseSystemd() bool {
if dbusError, ok := err.(dbus.Error); ok {
if dbusError.Name == "org.freedesktop.DBus.Error.UnknownMethod" {
hasStartTransientUnit = false
+ return hasStartTransientUnit
}
}
}
+
+ // Ensure the scope name we use doesn't exist. Use the Pid to
+ // avoid collisions between multiple libcontainer users on a
+ // single host.
+ scope := fmt.Sprintf("libcontainer-%d-systemd-test-default-dependencies.scope", os.Getpid())
+ testScopeExists := true
+ for i := 0; i <= testScopeWait; i++ {
+ if _, err := theConn.StopUnit(scope, "replace"); err != nil {
+ if dbusError, ok := err.(dbus.Error); ok {
+ if strings.Contains(dbusError.Name, "org.freedesktop.systemd1.NoSuchUnit") {
+ testScopeExists = false
+ break
+ }
+ }
+ }
+ time.Sleep(time.Millisecond)
+ }
+
+ // Bail out if we can't kill this scope without testing for DefaultDependencies
+ if testScopeExists {
+ return hasStartTransientUnit
+ }
+
+ // Assume StartTransientUnit on a scope allows DefaultDependencies
+ hasTransientDefaultDependencies = true
+ ddf := newProp("DefaultDependencies", false)
+ if _, err := theConn.StartTransientUnit(scope, "replace", ddf); err != nil {
+ if dbusError, ok := err.(dbus.Error); ok {
+ if strings.Contains(dbusError.Name, "org.freedesktop.DBus.Error.PropertyReadOnly") {
+ hasTransientDefaultDependencies = false
+ }
+ }
+ }
+
+ // Not critical because of the stop unit logic above.
+ theConn.StopUnit(scope, "replace")
}
return hasStartTransientUnit
}
@@ -81,16 +138,14 @@ func getIfaceForUnit(unitName string) string {
return "Unit"
}
-func Apply(c *cgroups.Cgroup, pid int) (map[string]string, error) {
+func (m *Manager) Apply(pid int) error {
var (
+ c = m.Cgroups
unitName = getUnitName(c)
slice = "system.slice"
properties []systemd.Property
- res = &systemdCgroup{}
)
- res.cgroup = c
-
if c.Slice != "" {
slice = c.Slice
}
@@ -108,6 +163,11 @@ func Apply(c *cgroups.Cgroup, pid int) (map[string]string, error) {
newProp("CPUAccounting", true),
newProp("BlockIOAccounting", true))
+ if hasTransientDefaultDependencies {
+ properties = append(properties,
+ newProp("DefaultDependencies", false))
+ }
+
if c.Memory != 0 {
properties = append(properties,
newProp("MemoryLimit", uint64(c.Memory)))
@@ -119,20 +179,29 @@ func Apply(c *cgroups.Cgroup, pid int) (map[string]string, error) {
newProp("CPUShares", uint64(c.CpuShares)))
}
+ if c.BlkioWeight != 0 {
+ properties = append(properties,
+ newProp("BlockIOWeight", uint64(c.BlkioWeight)))
+ }
+
if _, err := theConn.StartTransientUnit(unitName, "replace", properties...); err != nil {
- return nil, err
+ return err
}
- if !c.AllowAllDevices {
- if err := joinDevices(c, pid); err != nil {
- return nil, err
- }
+ if err := joinDevices(c, pid); err != nil {
+ return err
+ }
+
+ // TODO: CpuQuota and CpuPeriod not available in systemd
+ // we need to manually join the cpu.cfs_quota_us and cpu.cfs_period_us
+ if err := joinCpu(c, pid); err != nil {
+ return err
}
// -1 disables memorySwap
- if c.MemorySwap >= 0 && (c.Memory != 0 || c.MemorySwap > 0) {
+ if c.MemorySwap >= 0 && c.Memory != 0 {
if err := joinMemory(c, pid); err != nil {
- return nil, err
+ return err
}
}
@@ -140,55 +209,85 @@ func Apply(c *cgroups.Cgroup, pid int) (map[string]string, error) {
// we need to manually join the freezer and cpuset cgroup in systemd
// because it does not currently support it via the dbus api.
if err := joinFreezer(c, pid); err != nil {
- return nil, err
+ return err
}
if err := joinCpuset(c, pid); err != nil {
- return nil, err
+ return err
}
paths := make(map[string]string)
- for _, sysname := range []string{
- "devices",
- "memory",
- "cpu",
- "cpuset",
- "cpuacct",
- "blkio",
- "perf_event",
- "freezer",
- } {
- subsystemPath, err := getSubsystemPath(res.cgroup, sysname)
+ for sysname := range subsystems {
+ subsystemPath, err := getSubsystemPath(m.Cgroups, sysname)
if err != nil {
// Don't fail if a cgroup hierarchy was not found, just skip this subsystem
if cgroups.IsNotFound(err) {
continue
}
- return nil, err
+ return err
}
paths[sysname] = subsystemPath
}
- return paths, nil
+
+ m.Paths = paths
+
+ return nil
+}
+
+func (m *Manager) Destroy() error {
+ return cgroups.RemovePaths(m.Paths)
+}
+
+func (m *Manager) GetPaths() map[string]string {
+ return m.Paths
}
func writeFile(dir, file, data string) error {
return ioutil.WriteFile(filepath.Join(dir, file), []byte(data), 0700)
}
-func joinFreezer(c *cgroups.Cgroup, pid int) error {
- path, err := getSubsystemPath(c, "freezer")
+func join(c *configs.Cgroup, subsystem string, pid int) (string, error) {
+ path, err := getSubsystemPath(c, subsystem)
+ if err != nil {
+ return "", err
+ }
+ if err := os.MkdirAll(path, 0755); err != nil && !os.IsExist(err) {
+ return "", err
+ }
+ if err := writeFile(path, "cgroup.procs", strconv.Itoa(pid)); err != nil {
+ return "", err
+ }
+
+ return path, nil
+}
+
+func joinCpu(c *configs.Cgroup, pid int) error {
+ path, err := getSubsystemPath(c, "cpu")
if err != nil {
return err
}
+ if c.CpuQuota != 0 {
+ if err = ioutil.WriteFile(filepath.Join(path, "cpu.cfs_quota_us"), []byte(strconv.FormatInt(c.CpuQuota, 10)), 0700); err != nil {
+ return err
+ }
+ }
+ if c.CpuPeriod != 0 {
+ if err = ioutil.WriteFile(filepath.Join(path, "cpu.cfs_period_us"), []byte(strconv.FormatInt(c.CpuPeriod, 10)), 0700); err != nil {
+ return err
+ }
+ }
+ return nil
+}
- if err := os.MkdirAll(path, 0755); err != nil && !os.IsExist(err) {
+func joinFreezer(c *configs.Cgroup, pid int) error {
+ if _, err := join(c, "freezer", pid); err != nil {
return err
}
- return ioutil.WriteFile(filepath.Join(path, "cgroup.procs"), []byte(strconv.Itoa(pid)), 0700)
+ return nil
}
-func getSubsystemPath(c *cgroups.Cgroup, subsystem string) (string, error) {
+func getSubsystemPath(c *configs.Cgroup, subsystem string) (string, error) {
mountpoint, err := cgroups.FindCgroupMountpoint(subsystem)
if err != nil {
return "", err
@@ -207,30 +306,27 @@ func getSubsystemPath(c *cgroups.Cgroup, subsystem string) (string, error) {
return filepath.Join(mountpoint, initPath, slice, getUnitName(c)), nil
}
-func Freeze(c *cgroups.Cgroup, state cgroups.FreezerState) error {
- path, err := getSubsystemPath(c, "freezer")
+func (m *Manager) Freeze(state configs.FreezerState) error {
+ path, err := getSubsystemPath(m.Cgroups, "freezer")
if err != nil {
return err
}
- if err := ioutil.WriteFile(filepath.Join(path, "freezer.state"), []byte(state), 0); err != nil {
+ prevState := m.Cgroups.Freezer
+ m.Cgroups.Freezer = state
+
+ freezer := subsystems["freezer"]
+ err = freezer.Set(path, m.Cgroups)
+ if err != nil {
+ m.Cgroups.Freezer = prevState
return err
}
- for {
- state_, err := ioutil.ReadFile(filepath.Join(path, "freezer.state"))
- if err != nil {
- return err
- }
- if string(state) == string(bytes.TrimSpace(state_)) {
- break
- }
- time.Sleep(1 * time.Millisecond)
- }
+
return nil
}
-func GetPids(c *cgroups.Cgroup) ([]int, error) {
- path, err := getSubsystemPath(c, "cpu")
+func (m *Manager) GetPids() ([]int, error) {
+ path, err := getSubsystemPath(m.Cgroups, "cpu")
if err != nil {
return nil, err
}
@@ -238,7 +334,26 @@ func GetPids(c *cgroups.Cgroup) ([]int, error) {
return cgroups.ReadProcsFile(path)
}
-func getUnitName(c *cgroups.Cgroup) string {
+func (m *Manager) GetStats() (*cgroups.Stats, error) {
+ stats := cgroups.NewStats()
+ for name, path := range m.Paths {
+ sys, ok := subsystems[name]
+ if !ok || !cgroups.PathExists(path) {
+ continue
+ }
+ if err := sys.GetStats(path, stats); err != nil {
+ return nil, err
+ }
+ }
+
+ return stats, nil
+}
+
+func (m *Manager) Set(container *configs.Config) error {
+ panic("not implemented")
+}
+
+func getUnitName(c *configs.Cgroup) string {
return fmt.Sprintf("%s-%s.scope", c.Parent, c.Name)
}
@@ -253,40 +368,27 @@ func getUnitName(c *cgroups.Cgroup) string {
// Note: we can't use systemd to set up the initial limits, and then change the cgroup
// because systemd will re-write the device settings if it needs to re-apply the cgroup context.
// This happens at least for v208 when any sibling unit is started.
-func joinDevices(c *cgroups.Cgroup, pid int) error {
- path, err := getSubsystemPath(c, "devices")
+func joinDevices(c *configs.Cgroup, pid int) error {
+ path, err := join(c, "devices", pid)
if err != nil {
return err
}
- if err := os.MkdirAll(path, 0755); err != nil && !os.IsExist(err) {
- return err
- }
-
- if err := ioutil.WriteFile(filepath.Join(path, "cgroup.procs"), []byte(strconv.Itoa(pid)), 0700); err != nil {
- return err
- }
-
- if err := writeFile(path, "devices.deny", "a"); err != nil {
+ devices := subsystems["devices"]
+ if err := devices.Set(path, c); err != nil {
return err
}
- for _, dev := range c.AllowedDevices {
- if err := writeFile(path, "devices.allow", dev.GetCgroupAllowString()); err != nil {
- return err
- }
- }
-
return nil
}
// Symmetrical public function to update device based cgroups. Also available
// in the fs implementation.
-func ApplyDevices(c *cgroups.Cgroup, pid int) error {
+func ApplyDevices(c *configs.Cgroup, pid int) error {
return joinDevices(c, pid)
}
-func joinMemory(c *cgroups.Cgroup, pid int) error {
+func joinMemory(c *configs.Cgroup, pid int) error {
memorySwap := c.MemorySwap
if memorySwap == 0 {
@@ -305,7 +407,7 @@ func joinMemory(c *cgroups.Cgroup, pid int) error {
// systemd does not atm set up the cpuset controller, so we must manually
// join it. Additionally that is a very finicky controller where each
// level must have a full setup as the default for a new directory is "no cpus"
-func joinCpuset(c *cgroups.Cgroup, pid int) error {
+func joinCpuset(c *configs.Cgroup, pid int) error {
path, err := getSubsystemPath(c, "cpuset")
if err != nil {
return err
@@ -313,5 +415,5 @@ func joinCpuset(c *cgroups.Cgroup, pid int) error {
s := &fs.CpusetGroup{}
- return s.SetDir(path, c.CpusetCpus, c.CpusetMems, pid)
+ return s.ApplyDir(path, c, pid)
}
diff --git a/vendor/src/github.com/docker/libcontainer/cgroups/utils.go b/vendor/src/github.com/docker/libcontainer/cgroups/utils.go
index a360904cce..c6c400c7d3 100644
--- a/vendor/src/github.com/docker/libcontainer/cgroups/utils.go
+++ b/vendor/src/github.com/docker/libcontainer/cgroups/utils.go
@@ -34,6 +34,21 @@ func FindCgroupMountpoint(subsystem string) (string, error) {
return "", NewNotFoundError(subsystem)
}
+func FindCgroupMountpointDir() (string, error) {
+ mounts, err := mount.GetMounts()
+ if err != nil {
+ return "", err
+ }
+
+ for _, mount := range mounts {
+ if mount.Fstype == "cgroup" {
+ return filepath.Dir(mount.Mountpoint), nil
+ }
+ }
+
+ return "", NewNotFoundError("cgroup")
+}
+
type Mount struct {
Mountpoint string
Subsystems []string
diff --git a/vendor/src/github.com/docker/libcontainer/config.go b/vendor/src/github.com/docker/libcontainer/config.go
deleted file mode 100644
index 643601adac..0000000000
--- a/vendor/src/github.com/docker/libcontainer/config.go
+++ /dev/null
@@ -1,154 +0,0 @@
-package libcontainer
-
-import (
- "github.com/docker/libcontainer/cgroups"
- "github.com/docker/libcontainer/mount"
- "github.com/docker/libcontainer/network"
-)
-
-type MountConfig mount.MountConfig
-
-type Network network.Network
-
-type NamespaceType string
-
-const (
- NEWNET NamespaceType = "NEWNET"
- NEWPID NamespaceType = "NEWPID"
- NEWNS NamespaceType = "NEWNS"
- NEWUTS NamespaceType = "NEWUTS"
- NEWIPC NamespaceType = "NEWIPC"
- NEWUSER NamespaceType = "NEWUSER"
-)
-
-// Namespace defines configuration for each namespace. It specifies an
-// alternate path that is able to be joined via setns.
-type Namespace struct {
- Type NamespaceType `json:"type"`
- Path string `json:"path,omitempty"`
-}
-
-type Namespaces []Namespace
-
-func (n *Namespaces) Remove(t NamespaceType) bool {
- i := n.index(t)
- if i == -1 {
- return false
- }
- *n = append((*n)[:i], (*n)[i+1:]...)
- return true
-}
-
-func (n *Namespaces) Add(t NamespaceType, path string) {
- i := n.index(t)
- if i == -1 {
- *n = append(*n, Namespace{Type: t, Path: path})
- return
- }
- (*n)[i].Path = path
-}
-
-func (n *Namespaces) index(t NamespaceType) int {
- for i, ns := range *n {
- if ns.Type == t {
- return i
- }
- }
- return -1
-}
-
-func (n *Namespaces) Contains(t NamespaceType) bool {
- return n.index(t) != -1
-}
-
-// Config defines configuration options for executing a process inside a contained environment.
-type Config struct {
- // Mount specific options.
- MountConfig *MountConfig `json:"mount_config,omitempty"`
-
- // Pathname to container's root filesystem
- RootFs string `json:"root_fs,omitempty"`
-
- // Hostname optionally sets the container's hostname if provided
- Hostname string `json:"hostname,omitempty"`
-
- // User will set the uid and gid of the executing process running inside the container
- User string `json:"user,omitempty"`
-
- // WorkingDir will change the processes current working directory inside the container's rootfs
- WorkingDir string `json:"working_dir,omitempty"`
-
- // Env will populate the processes environment with the provided values
- // Any values from the parent processes will be cleared before the values
- // provided in Env are provided to the process
- Env []string `json:"environment,omitempty"`
-
- // Tty when true will allocate a pty slave on the host for access by the container's process
- // and ensure that it is mounted inside the container's rootfs
- Tty bool `json:"tty,omitempty"`
-
- // Namespaces specifies the container's namespaces that it should setup when cloning the init process
- // If a namespace is not provided that namespace is shared from the container's parent process
- Namespaces Namespaces `json:"namespaces,omitempty"`
-
- // Capabilities specify the capabilities to keep when executing the process inside the container
- // All capbilities not specified will be dropped from the processes capability mask
- Capabilities []string `json:"capabilities,omitempty"`
-
- // Networks specifies the container's network setup to be created
- Networks []*Network `json:"networks,omitempty"`
-
- // Routes can be specified to create entries in the route table as the container is started
- Routes []*Route `json:"routes,omitempty"`
-
- // Cgroups specifies specific cgroup settings for the various subsystems that the container is
- // placed into to limit the resources the container has available
- Cgroups *cgroups.Cgroup `json:"cgroups,omitempty"`
-
- // AppArmorProfile specifies the profile to apply to the process running in the container and is
- // change at the time the process is execed
- AppArmorProfile string `json:"apparmor_profile,omitempty"`
-
- // ProcessLabel specifies the label to apply to the process running in the container. It is
- // commonly used by selinux
- ProcessLabel string `json:"process_label,omitempty"`
-
- // RestrictSys will remount /proc/sys, /sys, and mask over sysrq-trigger as well as /proc/irq and
- // /proc/bus
- RestrictSys bool `json:"restrict_sys,omitempty"`
-
- // Rlimits specifies the resource limits, such as max open files, to set in the container
- // If Rlimits are not set, the container will inherit rlimits from the parent process
- Rlimits []Rlimit `json:"rlimits,omitempty"`
-
- // AdditionalGroups specifies the gids that should be added to supplementary groups
- // in addition to those that the user belongs to.
- AdditionalGroups []int `json:"additional_groups,omitempty"`
-}
-
-// Routes can be specified to create entries in the route table as the container is started
-//
-// All of destination, source, and gateway should be either IPv4 or IPv6.
-// One of the three options must be present, and ommitted entries will use their
-// IP family default for the route table. For IPv4 for example, setting the
-// gateway to 1.2.3.4 and the interface to eth0 will set up a standard
-// destination of 0.0.0.0(or *) when viewed in the route table.
-type Route struct {
- // Sets the destination and mask, should be a CIDR. Accepts IPv4 and IPv6
- Destination string `json:"destination,omitempty"`
-
- // Sets the source and mask, should be a CIDR. Accepts IPv4 and IPv6
- Source string `json:"source,omitempty"`
-
- // Sets the gateway. Accepts IPv4 and IPv6
- Gateway string `json:"gateway,omitempty"`
-
- // The device to set this route up for, for example: eth0
- InterfaceName string `json:"interface_name,omitempty"`
-}
-
-type Rlimit struct {
- Type int `json:"type,omitempty"`
- Hard uint64 `json:"hard,omitempty"`
- Soft uint64 `json:"soft,omitempty"`
-}
diff --git a/vendor/src/github.com/docker/libcontainer/configs/cgroup.go b/vendor/src/github.com/docker/libcontainer/configs/cgroup.go
new file mode 100644
index 0000000000..8bf174c195
--- /dev/null
+++ b/vendor/src/github.com/docker/libcontainer/configs/cgroup.go
@@ -0,0 +1,57 @@
+package configs
+
+type FreezerState string
+
+const (
+ Undefined FreezerState = ""
+ Frozen FreezerState = "FROZEN"
+ Thawed FreezerState = "THAWED"
+)
+
+type Cgroup struct {
+ Name string `json:"name"`
+
+ // name of parent cgroup or slice
+ Parent string `json:"parent"`
+
+ // If this is true allow access to any kind of device within the container. If false, allow access only to devices explicitly listed in the allowed_devices list.
+ AllowAllDevices bool `json:"allow_all_devices"`
+
+ AllowedDevices []*Device `json:"allowed_devices"`
+
+ // Memory limit (in bytes)
+ Memory int64 `json:"memory"`
+
+ // Memory reservation or soft_limit (in bytes)
+ MemoryReservation int64 `json:"memory_reservation"`
+
+ // Total memory usage (memory + swap); set `-1' to disable swap
+ MemorySwap int64 `json:"memory_swap"`
+
+ // CPU shares (relative weight vs. other containers)
+ CpuShares int64 `json:"cpu_shares"`
+
+ // CPU hardcap limit (in usecs). Allowed cpu time in a given period.
+ CpuQuota int64 `json:"cpu_quota"`
+
+ // CPU period to be used for hardcapping (in usecs). 0 to use system default.
+ CpuPeriod int64 `json:"cpu_period"`
+
+ // CPU to use
+ CpusetCpus string `json:"cpuset_cpus"`
+
+ // MEM to use
+ CpusetMems string `json:"cpuset_mems"`
+
+ // Specifies per cgroup weight, range is from 10 to 1000.
+ BlkioWeight int64 `json:"blkio_weight"`
+
+ // set the freeze value for the process
+ Freezer FreezerState `json:"freezer"`
+
+ // Parent slice to use for systemd TODO: remove in favor or parent
+ Slice string `json:"slice"`
+
+ // Whether to disable OOM Killer
+ OomKillDisable bool `json:"oom_kill_disable"`
+}
diff --git a/vendor/src/github.com/docker/libcontainer/configs/config.go b/vendor/src/github.com/docker/libcontainer/configs/config.go
new file mode 100644
index 0000000000..b07f252b5e
--- /dev/null
+++ b/vendor/src/github.com/docker/libcontainer/configs/config.go
@@ -0,0 +1,145 @@
+package configs
+
+import "fmt"
+
+type Rlimit struct {
+ Type int `json:"type"`
+ Hard uint64 `json:"hard"`
+ Soft uint64 `json:"soft"`
+}
+
+// IDMap represents UID/GID Mappings for User Namespaces.
+type IDMap struct {
+ ContainerID int `json:"container_id"`
+ HostID int `json:"host_id"`
+ Size int `json:"size"`
+}
+
+// Config defines configuration options for executing a process inside a contained environment.
+type Config struct {
+ // NoPivotRoot will use MS_MOVE and a chroot to jail the process into the container's rootfs
+ // This is a common option when the container is running in ramdisk
+ NoPivotRoot bool `json:"no_pivot_root"`
+
+ // ParentDeathSignal specifies the signal that is sent to the container's process in the case
+ // that the parent process dies.
+ ParentDeathSignal int `json:"parent_death_signal"`
+
+ // PivotDir allows a custom directory inside the container's root filesystem to be used as pivot, when NoPivotRoot is not set.
+ // When a custom PivotDir not set, a temporary dir inside the root filesystem will be used. The pivot dir needs to be writeable.
+ // This is required when using read only root filesystems. In these cases, a read/writeable path can be (bind) mounted somewhere inside the root filesystem to act as pivot.
+ PivotDir string `json:"pivot_dir"`
+
+ // Path to a directory containing the container's root filesystem.
+ Rootfs string `json:"rootfs"`
+
+ // Readonlyfs will remount the container's rootfs as readonly where only externally mounted
+ // bind mounts are writtable.
+ Readonlyfs bool `json:"readonlyfs"`
+
+ // Mounts specify additional source and destination paths that will be mounted inside the container's
+ // rootfs and mount namespace if specified
+ Mounts []*Mount `json:"mounts"`
+
+ // The device nodes that should be automatically created within the container upon container start. Note, make sure that the node is marked as allowed in the cgroup as well!
+ Devices []*Device `json:"devices"`
+
+ MountLabel string `json:"mount_label"`
+
+ // Hostname optionally sets the container's hostname if provided
+ Hostname string `json:"hostname"`
+
+ // Namespaces specifies the container's namespaces that it should setup when cloning the init process
+ // If a namespace is not provided that namespace is shared from the container's parent process
+ Namespaces Namespaces `json:"namespaces"`
+
+ // Capabilities specify the capabilities to keep when executing the process inside the container
+ // All capbilities not specified will be dropped from the processes capability mask
+ Capabilities []string `json:"capabilities"`
+
+ // Networks specifies the container's network setup to be created
+ Networks []*Network `json:"networks"`
+
+ // Routes can be specified to create entries in the route table as the container is started
+ Routes []*Route `json:"routes"`
+
+ // Cgroups specifies specific cgroup settings for the various subsystems that the container is
+ // placed into to limit the resources the container has available
+ Cgroups *Cgroup `json:"cgroups"`
+
+ // AppArmorProfile specifies the profile to apply to the process running in the container and is
+ // change at the time the process is execed
+ AppArmorProfile string `json:"apparmor_profile"`
+
+ // ProcessLabel specifies the label to apply to the process running in the container. It is
+ // commonly used by selinux
+ ProcessLabel string `json:"process_label"`
+
+ // Rlimits specifies the resource limits, such as max open files, to set in the container
+ // If Rlimits are not set, the container will inherit rlimits from the parent process
+ Rlimits []Rlimit `json:"rlimits"`
+
+ // AdditionalGroups specifies the gids that should be added to supplementary groups
+ // in addition to those that the user belongs to.
+ AdditionalGroups []int `json:"additional_groups"`
+
+ // UidMappings is an array of User ID mappings for User Namespaces
+ UidMappings []IDMap `json:"uid_mappings"`
+
+ // GidMappings is an array of Group ID mappings for User Namespaces
+ GidMappings []IDMap `json:"gid_mappings"`
+
+ // MaskPaths specifies paths within the container's rootfs to mask over with a bind
+ // mount pointing to /dev/null as to prevent reads of the file.
+ MaskPaths []string `json:"mask_paths"`
+
+ // ReadonlyPaths specifies paths within the container's rootfs to remount as read-only
+ // so that these files prevent any writes.
+ ReadonlyPaths []string `json:"readonly_paths"`
+}
+
+// Gets the root uid for the process on host which could be non-zero
+// when user namespaces are enabled.
+func (c Config) HostUID() (int, error) {
+ if c.Namespaces.Contains(NEWUSER) {
+ if c.UidMappings == nil {
+ return -1, fmt.Errorf("User namespaces enabled, but no user mappings found.")
+ }
+ id, found := c.hostIDFromMapping(0, c.UidMappings)
+ if !found {
+ return -1, fmt.Errorf("User namespaces enabled, but no root user mapping found.")
+ }
+ return id, nil
+ }
+ // Return default root uid 0
+ return 0, nil
+}
+
+// Gets the root uid for the process on host which could be non-zero
+// when user namespaces are enabled.
+func (c Config) HostGID() (int, error) {
+ if c.Namespaces.Contains(NEWUSER) {
+ if c.GidMappings == nil {
+ return -1, fmt.Errorf("User namespaces enabled, but no gid mappings found.")
+ }
+ id, found := c.hostIDFromMapping(0, c.GidMappings)
+ if !found {
+ return -1, fmt.Errorf("User namespaces enabled, but no root user mapping found.")
+ }
+ return id, nil
+ }
+ // Return default root uid 0
+ return 0, nil
+}
+
+// Utility function that gets a host ID for a container ID from user namespace map
+// if that ID is present in the map.
+func (c Config) hostIDFromMapping(containerID int, uMap []IDMap) (int, bool) {
+ for _, m := range uMap {
+ if (containerID >= m.ContainerID) && (containerID <= (m.ContainerID + m.Size - 1)) {
+ hostID := m.HostID + (containerID - m.ContainerID)
+ return hostID, true
+ }
+ }
+ return -1, false
+}
diff --git a/vendor/src/github.com/docker/libcontainer/config_test.go b/vendor/src/github.com/docker/libcontainer/configs/config_test.go
index f2287fc741..765d5e50db 100644
--- a/vendor/src/github.com/docker/libcontainer/config_test.go
+++ b/vendor/src/github.com/docker/libcontainer/configs/config_test.go
@@ -1,12 +1,11 @@
-package libcontainer
+package configs
import (
"encoding/json"
+ "fmt"
"os"
"path/filepath"
"testing"
-
- "github.com/docker/libcontainer/devices"
)
// Checks whether the expected capability is specified in the capabilities.
@@ -19,13 +18,13 @@ func contains(expected string, values []string) bool {
return false
}
-func containsDevice(expected *devices.Device, values []*devices.Device) bool {
+func containsDevice(expected *Device, values []*Device) bool {
for _, d := range values {
if d.Path == expected.Path &&
- d.CgroupPermissions == expected.CgroupPermissions &&
+ d.Permissions == expected.Permissions &&
d.FileMode == expected.FileMode &&
- d.MajorNumber == expected.MajorNumber &&
- d.MinorNumber == expected.MinorNumber &&
+ d.Major == expected.Major &&
+ d.Minor == expected.Minor &&
d.Type == expected.Type {
return true
}
@@ -34,7 +33,7 @@ func containsDevice(expected *devices.Device, values []*devices.Device) bool {
}
func loadConfig(name string) (*Config, error) {
- f, err := os.Open(filepath.Join("sample_configs", name))
+ f, err := os.Open(filepath.Join("../sample_configs", name))
if err != nil {
return nil, err
}
@@ -45,6 +44,34 @@ func loadConfig(name string) (*Config, error) {
return nil, err
}
+ // Check that a config doesn't contain extra fields
+ var configMap, abstractMap map[string]interface{}
+
+ if _, err := f.Seek(0, 0); err != nil {
+ return nil, err
+ }
+
+ if err := json.NewDecoder(f).Decode(&abstractMap); err != nil {
+ return nil, err
+ }
+
+ configData, err := json.Marshal(&container)
+ if err != nil {
+ return nil, err
+ }
+
+ if err := json.Unmarshal(configData, &configMap); err != nil {
+ return nil, err
+ }
+
+ for k := range configMap {
+ delete(abstractMap, k)
+ }
+
+ if len(abstractMap) != 0 {
+ return nil, fmt.Errorf("unknown fields: %s", abstractMap)
+ }
+
return container, nil
}
@@ -59,11 +86,6 @@ func TestConfigJsonFormat(t *testing.T) {
t.Fail()
}
- if !container.Tty {
- t.Log("tty should be set to true")
- t.Fail()
- }
-
if !container.Namespaces.Contains(NEWNET) {
t.Log("namespaces should contain NEWNET")
t.Fail()
@@ -101,11 +123,6 @@ func TestConfigJsonFormat(t *testing.T) {
t.Fail()
}
- if n.VethPrefix != "veth" {
- t.Logf("veth prefix should be veth but received %q", n.VethPrefix)
- t.Fail()
- }
-
if n.Gateway != "172.17.42.1" {
t.Logf("veth gateway should be 172.17.42.1 but received %q", n.Gateway)
t.Fail()
@@ -119,18 +136,12 @@ func TestConfigJsonFormat(t *testing.T) {
break
}
}
-
- for _, d := range devices.DefaultSimpleDevices {
- if !containsDevice(d, container.MountConfig.DeviceNodes) {
+ for _, d := range DefaultSimpleDevices {
+ if !containsDevice(d, container.Devices) {
t.Logf("expected device configuration for %s", d.Path)
t.Fail()
}
}
-
- if !container.RestrictSys {
- t.Log("expected restrict sys to be true")
- t.Fail()
- }
}
func TestApparmorProfile(t *testing.T) {
@@ -154,8 +165,8 @@ func TestSelinuxLabels(t *testing.T) {
if container.ProcessLabel != label {
t.Fatalf("expected process label %q but received %q", label, container.ProcessLabel)
}
- if container.MountConfig.MountLabel != label {
- t.Fatalf("expected mount label %q but received %q", label, container.MountConfig.MountLabel)
+ if container.MountLabel != label {
+ t.Fatalf("expected mount label %q but received %q", label, container.MountLabel)
}
}
@@ -170,3 +181,69 @@ func TestRemoveNamespace(t *testing.T) {
t.Fatalf("namespaces should have 0 items but reports %d", len(ns))
}
}
+
+func TestHostUIDNoUSERNS(t *testing.T) {
+ config := &Config{
+ Namespaces: Namespaces{},
+ }
+ uid, err := config.HostUID()
+ if err != nil {
+ t.Fatal(err)
+ }
+ if uid != 0 {
+ t.Fatalf("expected uid 0 with no USERNS but received %d", uid)
+ }
+}
+
+func TestHostUIDWithUSERNS(t *testing.T) {
+ config := &Config{
+ Namespaces: Namespaces{{Type: NEWUSER}},
+ UidMappings: []IDMap{
+ {
+ ContainerID: 0,
+ HostID: 1000,
+ Size: 1,
+ },
+ },
+ }
+ uid, err := config.HostUID()
+ if err != nil {
+ t.Fatal(err)
+ }
+ if uid != 1000 {
+ t.Fatalf("expected uid 1000 with no USERNS but received %d", uid)
+ }
+}
+
+func TestHostGIDNoUSERNS(t *testing.T) {
+ config := &Config{
+ Namespaces: Namespaces{},
+ }
+ uid, err := config.HostGID()
+ if err != nil {
+ t.Fatal(err)
+ }
+ if uid != 0 {
+ t.Fatalf("expected gid 0 with no USERNS but received %d", uid)
+ }
+}
+
+func TestHostGIDWithUSERNS(t *testing.T) {
+ config := &Config{
+ Namespaces: Namespaces{{Type: NEWUSER}},
+ GidMappings: []IDMap{
+ {
+ ContainerID: 0,
+ HostID: 1000,
+ Size: 1,
+ },
+ },
+ }
+ uid, err := config.HostGID()
+ if err != nil {
+ t.Fatal(err)
+ }
+ if uid != 1000 {
+ t.Fatalf("expected gid 1000 with no USERNS but received %d", uid)
+ }
+}
diff --git a/vendor/src/github.com/docker/libcontainer/configs/device.go b/vendor/src/github.com/docker/libcontainer/configs/device.go
new file mode 100644
index 0000000000..abff26696e
--- /dev/null
+++ b/vendor/src/github.com/docker/libcontainer/configs/device.go
@@ -0,0 +1,52 @@
+package configs
+
+import (
+ "fmt"
+ "os"
+)
+
+const (
+ Wildcard = -1
+)
+
+type Device struct {
+ // Device type, block, char, etc.
+ Type rune `json:"type"`
+
+ // Path to the device.
+ Path string `json:"path"`
+
+ // Major is the device's major number.
+ Major int64 `json:"major"`
+
+ // Minor is the device's minor number.
+ Minor int64 `json:"minor"`
+
+ // Cgroup permissions format, rwm.
+ Permissions string `json:"permissions"`
+
+ // FileMode permission bits for the device.
+ FileMode os.FileMode `json:"file_mode"`
+
+ // Uid of the device.
+ Uid uint32 `json:"uid"`
+
+ // Gid of the device.
+ Gid uint32 `json:"gid"`
+}
+
+func (d *Device) CgroupString() string {
+ return fmt.Sprintf("%c %s:%s %s", d.Type, deviceNumberString(d.Major), deviceNumberString(d.Minor), d.Permissions)
+}
+
+func (d *Device) Mkdev() int {
+ return int((d.Major << 8) | (d.Minor & 0xff) | ((d.Minor & 0xfff00) << 12))
+}
+
+// deviceNumberString converts the device number to a string return result.
+func deviceNumberString(number int64) string {
+ if number == Wildcard {
+ return "*"
+ }
+ return fmt.Sprint(number)
+}
diff --git a/vendor/src/github.com/docker/libcontainer/configs/device_defaults.go b/vendor/src/github.com/docker/libcontainer/configs/device_defaults.go
new file mode 100644
index 0000000000..70fa4af049
--- /dev/null
+++ b/vendor/src/github.com/docker/libcontainer/configs/device_defaults.go
@@ -0,0 +1,137 @@
+package configs
+
+var (
+ // These are devices that are to be both allowed and created.
+ DefaultSimpleDevices = []*Device{
+ // /dev/null and zero
+ {
+ Path: "/dev/null",
+ Type: 'c',
+ Major: 1,
+ Minor: 3,
+ Permissions: "rwm",
+ FileMode: 0666,
+ },
+ {
+ Path: "/dev/zero",
+ Type: 'c',
+ Major: 1,
+ Minor: 5,
+ Permissions: "rwm",
+ FileMode: 0666,
+ },
+
+ {
+ Path: "/dev/full",
+ Type: 'c',
+ Major: 1,
+ Minor: 7,
+ Permissions: "rwm",
+ FileMode: 0666,
+ },
+
+ // consoles and ttys
+ {
+ Path: "/dev/tty",
+ Type: 'c',
+ Major: 5,
+ Minor: 0,
+ Permissions: "rwm",
+ FileMode: 0666,
+ },
+
+ // /dev/urandom,/dev/random
+ {
+ Path: "/dev/urandom",
+ Type: 'c',
+ Major: 1,
+ Minor: 9,
+ Permissions: "rwm",
+ FileMode: 0666,
+ },
+ {
+ Path: "/dev/random",
+ Type: 'c',
+ Major: 1,
+ Minor: 8,
+ Permissions: "rwm",
+ FileMode: 0666,
+ },
+ }
+ DefaultAllowedDevices = append([]*Device{
+ // allow mknod for any device
+ {
+ Type: 'c',
+ Major: Wildcard,
+ Minor: Wildcard,
+ Permissions: "m",
+ },
+ {
+ Type: 'b',
+ Major: Wildcard,
+ Minor: Wildcard,
+ Permissions: "m",
+ },
+
+ {
+ Path: "/dev/console",
+ Type: 'c',
+ Major: 5,
+ Minor: 1,
+ Permissions: "rwm",
+ },
+ {
+ Path: "/dev/tty0",
+ Type: 'c',
+ Major: 4,
+ Minor: 0,
+ Permissions: "rwm",
+ },
+ {
+ Path: "/dev/tty1",
+ Type: 'c',
+ Major: 4,
+ Minor: 1,
+ Permissions: "rwm",
+ },
+ // /dev/pts/ - pts namespaces are "coming soon"
+ {
+ Path: "",
+ Type: 'c',
+ Major: 136,
+ Minor: Wildcard,
+ Permissions: "rwm",
+ },
+ {
+ Path: "",
+ Type: 'c',
+ Major: 5,
+ Minor: 2,
+ Permissions: "rwm",
+ },
+
+ // tuntap
+ {
+ Path: "",
+ Type: 'c',
+ Major: 10,
+ Minor: 200,
+ Permissions: "rwm",
+ },
+ }, DefaultSimpleDevices...)
+ DefaultAutoCreatedDevices = append([]*Device{
+ {
+ // /dev/fuse is created but not allowed.
+ // This is to allow java to work. Because java
+ // Insists on there being a /dev/fuse
+ // https://github.com/docker/docker/issues/514
+ // https://github.com/docker/docker/issues/2393
+ //
+ Path: "/dev/fuse",
+ Type: 'c',
+ Major: 10,
+ Minor: 229,
+ Permissions: "rwm",
+ },
+ }, DefaultSimpleDevices...)
+)
diff --git a/vendor/src/github.com/docker/libcontainer/configs/mount.go b/vendor/src/github.com/docker/libcontainer/configs/mount.go
new file mode 100644
index 0000000000..7b3dea3312
--- /dev/null
+++ b/vendor/src/github.com/docker/libcontainer/configs/mount.go
@@ -0,0 +1,21 @@
+package configs
+
+type Mount struct {
+ // Source path for the mount.
+ Source string `json:"source"`
+
+ // Destination path for the mount inside the container.
+ Destination string `json:"destination"`
+
+ // Device the mount is for.
+ Device string `json:"device"`
+
+ // Mount flags.
+ Flags int `json:"flags"`
+
+ // Mount data applied to the mount.
+ Data string `json:"data"`
+
+ // Relabel source if set, "z" indicates shared, "Z" indicates unshared.
+ Relabel string `json:"relabel"`
+}
diff --git a/vendor/src/github.com/docker/libcontainer/configs/namespaces.go b/vendor/src/github.com/docker/libcontainer/configs/namespaces.go
new file mode 100644
index 0000000000..ac6a7fa2cd
--- /dev/null
+++ b/vendor/src/github.com/docker/libcontainer/configs/namespaces.go
@@ -0,0 +1,120 @@
+package configs
+
+import (
+ "fmt"
+ "syscall"
+)
+
+type NamespaceType string
+
+const (
+ NEWNET NamespaceType = "NEWNET"
+ NEWPID NamespaceType = "NEWPID"
+ NEWNS NamespaceType = "NEWNS"
+ NEWUTS NamespaceType = "NEWUTS"
+ NEWIPC NamespaceType = "NEWIPC"
+ NEWUSER NamespaceType = "NEWUSER"
+)
+
+func NamespaceTypes() []NamespaceType {
+ return []NamespaceType{
+ NEWNET,
+ NEWPID,
+ NEWNS,
+ NEWUTS,
+ NEWIPC,
+ NEWUSER,
+ }
+}
+
+// Namespace defines configuration for each namespace. It specifies an
+// alternate path that is able to be joined via setns.
+type Namespace struct {
+ Type NamespaceType `json:"type"`
+ Path string `json:"path"`
+}
+
+func (n *Namespace) Syscall() int {
+ return namespaceInfo[n.Type]
+}
+
+func (n *Namespace) GetPath(pid int) string {
+ if n.Path != "" {
+ return n.Path
+ }
+ return fmt.Sprintf("/proc/%d/ns/%s", pid, n.file())
+}
+
+func (n *Namespace) file() string {
+ file := ""
+ switch n.Type {
+ case NEWNET:
+ file = "net"
+ case NEWNS:
+ file = "mnt"
+ case NEWPID:
+ file = "pid"
+ case NEWIPC:
+ file = "ipc"
+ case NEWUSER:
+ file = "user"
+ case NEWUTS:
+ file = "uts"
+ }
+ return file
+}
+
+type Namespaces []Namespace
+
+func (n *Namespaces) Remove(t NamespaceType) bool {
+ i := n.index(t)
+ if i == -1 {
+ return false
+ }
+ *n = append((*n)[:i], (*n)[i+1:]...)
+ return true
+}
+
+func (n *Namespaces) Add(t NamespaceType, path string) {
+ i := n.index(t)
+ if i == -1 {
+ *n = append(*n, Namespace{Type: t, Path: path})
+ return
+ }
+ (*n)[i].Path = path
+}
+
+func (n *Namespaces) index(t NamespaceType) int {
+ for i, ns := range *n {
+ if ns.Type == t {
+ return i
+ }
+ }
+ return -1
+}
+
+func (n *Namespaces) Contains(t NamespaceType) bool {
+ return n.index(t) != -1
+}
+
+var namespaceInfo = map[NamespaceType]int{
+ NEWNET: syscall.CLONE_NEWNET,
+ NEWNS: syscall.CLONE_NEWNS,
+ NEWUSER: syscall.CLONE_NEWUSER,
+ NEWIPC: syscall.CLONE_NEWIPC,
+ NEWUTS: syscall.CLONE_NEWUTS,
+ NEWPID: syscall.CLONE_NEWPID,
+}
+
+// CloneFlags parses the container's Namespaces options to set the correct
+// flags on clone, unshare. This functions returns flags only for new namespaces.
+func (n *Namespaces) CloneFlags() uintptr {
+ var flag int
+ for _, v := range *n {
+ if v.Path != "" {
+ continue
+ }
+ flag |= namespaceInfo[v.Type]
+ }
+ return uintptr(flag)
+}
diff --git a/vendor/src/github.com/docker/libcontainer/configs/network.go b/vendor/src/github.com/docker/libcontainer/configs/network.go
new file mode 100644
index 0000000000..9d5ed7a65f
--- /dev/null
+++ b/vendor/src/github.com/docker/libcontainer/configs/network.go
@@ -0,0 +1,72 @@
+package configs
+
+// Network defines configuration for a container's networking stack
+//
+// The network configuration can be omited from a container causing the
+// container to be setup with the host's networking stack
+type Network struct {
+ // Type sets the networks type, commonly veth and loopback
+ Type string `json:"type"`
+
+ // Name of the network interface
+ Name string `json:"name"`
+
+ // The bridge to use.
+ Bridge string `json:"bridge"`
+
+ // MacAddress contains the MAC address to set on the network interface
+ MacAddress string `json:"mac_address"`
+
+ // Address contains the IPv4 and mask to set on the network interface
+ Address string `json:"address"`
+
+ // Gateway sets the gateway address that is used as the default for the interface
+ Gateway string `json:"gateway"`
+
+ // IPv6Address contains the IPv6 and mask to set on the network interface
+ IPv6Address string `json:"ipv6_address"`
+
+ // IPv6Gateway sets the ipv6 gateway address that is used as the default for the interface
+ IPv6Gateway string `json:"ipv6_gateway"`
+
+ // Mtu sets the mtu value for the interface and will be mirrored on both the host and
+ // container's interfaces if a pair is created, specifically in the case of type veth
+ // Note: This does not apply to loopback interfaces.
+ Mtu int `json:"mtu"`
+
+ // TxQueueLen sets the tx_queuelen value for the interface and will be mirrored on both the host and
+ // container's interfaces if a pair is created, specifically in the case of type veth
+ // Note: This does not apply to loopback interfaces.
+ TxQueueLen int `json:"txqueuelen"`
+
+ // HostInterfaceName is a unique name of a veth pair that resides on in the host interface of the
+ // container.
+ HostInterfaceName string `json:"host_interface_name"`
+
+ // HairpinMode specifies if hairpin NAT should be enabled on the virtual interface
+ // bridge port in the case of type veth
+ // Note: This is unsupported on some systems.
+ // Note: This does not apply to loopback interfaces.
+ HairpinMode bool `json:"hairpin_mode"`
+}
+
+// Routes can be specified to create entries in the route table as the container is started
+//
+// All of destination, source, and gateway should be either IPv4 or IPv6.
+// One of the three options must be present, and ommitted entries will use their
+// IP family default for the route table. For IPv4 for example, setting the
+// gateway to 1.2.3.4 and the interface to eth0 will set up a standard
+// destination of 0.0.0.0(or *) when viewed in the route table.
+type Route struct {
+ // Sets the destination and mask, should be a CIDR. Accepts IPv4 and IPv6
+ Destination string `json:"destination"`
+
+ // Sets the source and mask, should be a CIDR. Accepts IPv4 and IPv6
+ Source string `json:"source"`
+
+ // Sets the gateway. Accepts IPv4 and IPv6
+ Gateway string `json:"gateway"`
+
+ // The device to set this route up for, for example: eth0
+ InterfaceName string `json:"interface_name"`
+}
diff --git a/vendor/src/github.com/docker/libcontainer/configs/validate/config.go b/vendor/src/github.com/docker/libcontainer/configs/validate/config.go
new file mode 100644
index 0000000000..98926dd26e
--- /dev/null
+++ b/vendor/src/github.com/docker/libcontainer/configs/validate/config.go
@@ -0,0 +1,93 @@
+package validate
+
+import (
+ "fmt"
+ "os"
+ "path/filepath"
+
+ "github.com/docker/libcontainer/configs"
+)
+
+type Validator interface {
+ Validate(*configs.Config) error
+}
+
+func New() Validator {
+ return &ConfigValidator{}
+}
+
+type ConfigValidator struct {
+}
+
+func (v *ConfigValidator) Validate(config *configs.Config) error {
+ if err := v.rootfs(config); err != nil {
+ return err
+ }
+ if err := v.network(config); err != nil {
+ return err
+ }
+ if err := v.hostname(config); err != nil {
+ return err
+ }
+ if err := v.security(config); err != nil {
+ return err
+ }
+ if err := v.usernamespace(config); err != nil {
+ return err
+ }
+ return nil
+}
+
+// rootfs validates the the rootfs is an absolute path and is not a symlink
+// to the container's root filesystem.
+func (v *ConfigValidator) rootfs(config *configs.Config) error {
+ cleaned, err := filepath.Abs(config.Rootfs)
+ if err != nil {
+ return err
+ }
+ if cleaned, err = filepath.EvalSymlinks(cleaned); err != nil {
+ return err
+ }
+ if config.Rootfs != cleaned {
+ return fmt.Errorf("%s is not an absolute path or is a symlink", config.Rootfs)
+ }
+ return nil
+}
+
+func (v *ConfigValidator) network(config *configs.Config) error {
+ if !config.Namespaces.Contains(configs.NEWNET) {
+ if len(config.Networks) > 0 || len(config.Routes) > 0 {
+ return fmt.Errorf("unable to apply network settings without a private NET namespace")
+ }
+ }
+ return nil
+}
+
+func (v *ConfigValidator) hostname(config *configs.Config) error {
+ if config.Hostname != "" && !config.Namespaces.Contains(configs.NEWUTS) {
+ return fmt.Errorf("unable to set hostname without a private UTS namespace")
+ }
+ return nil
+}
+
+func (v *ConfigValidator) security(config *configs.Config) error {
+ // restrict sys without mount namespace
+ if (len(config.MaskPaths) > 0 || len(config.ReadonlyPaths) > 0) &&
+ !config.Namespaces.Contains(configs.NEWNS) {
+ return fmt.Errorf("unable to restrict sys entries without a private MNT namespace")
+ }
+ return nil
+}
+
+func (v *ConfigValidator) usernamespace(config *configs.Config) error {
+ if config.Namespaces.Contains(configs.NEWUSER) {
+ if _, err := os.Stat("/proc/self/ns/user"); os.IsNotExist(err) {
+ return fmt.Errorf("USER namespaces aren't enabled in the kernel")
+ }
+ } else {
+ if config.UidMappings != nil || config.GidMappings != nil {
+ return fmt.Errorf("User namespace mappings specified, but USER namespace isn't enabled in the config")
+ }
+ }
+ return nil
+}
diff --git a/vendor/src/github.com/docker/libcontainer/console.go b/vendor/src/github.com/docker/libcontainer/console.go
new file mode 100644
index 0000000000..042a2a2e48
--- /dev/null
+++ b/vendor/src/github.com/docker/libcontainer/console.go
@@ -0,0 +1,15 @@
+package libcontainer
+
+import "io"
+
+// Console represents a pseudo TTY.
+type Console interface {
+ io.ReadWriter
+ io.Closer
+
+ // Path returns the filesystem path to the slave side of the pty.
+ Path() string
+
+ // Fd returns the fd for the master of the pty.
+ Fd() uintptr
+}
diff --git a/vendor/src/github.com/docker/libcontainer/console/console.go b/vendor/src/github.com/docker/libcontainer/console/console.go
deleted file mode 100644
index 438e670420..0000000000
--- a/vendor/src/github.com/docker/libcontainer/console/console.go
+++ /dev/null
@@ -1,128 +0,0 @@
-// +build linux
-
-package console
-
-import (
- "fmt"
- "os"
- "path/filepath"
- "syscall"
- "unsafe"
-
- "github.com/docker/libcontainer/label"
-)
-
-// Setup initializes the proper /dev/console inside the rootfs path
-func Setup(rootfs, consolePath, mountLabel string) error {
- oldMask := syscall.Umask(0000)
- defer syscall.Umask(oldMask)
-
- if err := os.Chmod(consolePath, 0600); err != nil {
- return err
- }
-
- if err := os.Chown(consolePath, 0, 0); err != nil {
- return err
- }
-
- if err := label.SetFileLabel(consolePath, mountLabel); err != nil {
- return fmt.Errorf("set file label %s %s", consolePath, err)
- }
-
- dest := filepath.Join(rootfs, "dev/console")
-
- f, err := os.Create(dest)
- if err != nil && !os.IsExist(err) {
- return fmt.Errorf("create %s %s", dest, err)
- }
-
- if f != nil {
- f.Close()
- }
-
- if err := syscall.Mount(consolePath, dest, "bind", syscall.MS_BIND, ""); err != nil {
- return fmt.Errorf("bind %s to %s %s", consolePath, dest, err)
- }
-
- return nil
-}
-
-func OpenAndDup(consolePath string) error {
- slave, err := OpenTerminal(consolePath, syscall.O_RDWR)
- if err != nil {
- return fmt.Errorf("open terminal %s", err)
- }
-
- if err := syscall.Dup2(int(slave.Fd()), 0); err != nil {
- return err
- }
-
- if err := syscall.Dup2(int(slave.Fd()), 1); err != nil {
- return err
- }
-
- return syscall.Dup2(int(slave.Fd()), 2)
-}
-
-// Unlockpt unlocks the slave pseudoterminal device corresponding to the master pseudoterminal referred to by f.
-// Unlockpt should be called before opening the slave side of a pseudoterminal.
-func Unlockpt(f *os.File) error {
- var u int32
-
- return Ioctl(f.Fd(), syscall.TIOCSPTLCK, uintptr(unsafe.Pointer(&u)))
-}
-
-// Ptsname retrieves the name of the first available pts for the given master.
-func Ptsname(f *os.File) (string, error) {
- var n int32
-
- if err := Ioctl(f.Fd(), syscall.TIOCGPTN, uintptr(unsafe.Pointer(&n))); err != nil {
- return "", err
- }
-
- return fmt.Sprintf("/dev/pts/%d", n), nil
-}
-
-// CreateMasterAndConsole will open /dev/ptmx on the host and retreive the
-// pts name for use as the pty slave inside the container
-func CreateMasterAndConsole() (*os.File, string, error) {
- master, err := os.OpenFile("/dev/ptmx", syscall.O_RDWR|syscall.O_NOCTTY|syscall.O_CLOEXEC, 0)
- if err != nil {
- return nil, "", err
- }
-
- console, err := Ptsname(master)
- if err != nil {
- return nil, "", err
- }
-
- if err := Unlockpt(master); err != nil {
- return nil, "", err
- }
-
- return master, console, nil
-}
-
-// OpenPtmx opens /dev/ptmx, i.e. the PTY master.
-func OpenPtmx() (*os.File, error) {
- // O_NOCTTY and O_CLOEXEC are not present in os package so we use the syscall's one for all.
- return os.OpenFile("/dev/ptmx", syscall.O_RDONLY|syscall.O_NOCTTY|syscall.O_CLOEXEC, 0)
-}
-
-// OpenTerminal is a clone of os.OpenFile without the O_CLOEXEC
-// used to open the pty slave inside the container namespace
-func OpenTerminal(name string, flag int) (*os.File, error) {
- r, e := syscall.Open(name, flag, 0)
- if e != nil {
- return nil, &os.PathError{Op: "open", Path: name, Err: e}
- }
- return os.NewFile(uintptr(r), name), nil
-}
-
-func Ioctl(fd uintptr, flag, data uintptr) error {
- if _, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, flag, data); err != 0 {
- return err
- }
-
- return nil
-}
diff --git a/vendor/src/github.com/docker/libcontainer/console_linux.go b/vendor/src/github.com/docker/libcontainer/console_linux.go
new file mode 100644
index 0000000000..afdc2976c4
--- /dev/null
+++ b/vendor/src/github.com/docker/libcontainer/console_linux.go
@@ -0,0 +1,147 @@
+// +build linux
+
+package libcontainer
+
+import (
+ "fmt"
+ "os"
+ "path/filepath"
+ "syscall"
+ "unsafe"
+
+ "github.com/docker/libcontainer/label"
+)
+
+// newConsole returns an initalized console that can be used within a container by copying bytes
+// from the master side to the slave that is attached as the tty for the container's init process.
+func newConsole(uid, gid int) (Console, error) {
+ master, err := os.OpenFile("/dev/ptmx", syscall.O_RDWR|syscall.O_NOCTTY|syscall.O_CLOEXEC, 0)
+ if err != nil {
+ return nil, err
+ }
+ console, err := ptsname(master)
+ if err != nil {
+ return nil, err
+ }
+ if err := unlockpt(master); err != nil {
+ return nil, err
+ }
+ if err := os.Chmod(console, 0600); err != nil {
+ return nil, err
+ }
+ if err := os.Chown(console, uid, gid); err != nil {
+ return nil, err
+ }
+ return &linuxConsole{
+ slavePath: console,
+ master: master,
+ }, nil
+}
+
+// newConsoleFromPath is an internal fucntion returning an initialzied console for use inside
+// a container's MNT namespace.
+func newConsoleFromPath(slavePath string) *linuxConsole {
+ return &linuxConsole{
+ slavePath: slavePath,
+ }
+}
+
+// linuxConsole is a linux psuedo TTY for use within a container.
+type linuxConsole struct {
+ master *os.File
+ slavePath string
+}
+
+func (c *linuxConsole) Fd() uintptr {
+ return c.master.Fd()
+}
+
+func (c *linuxConsole) Path() string {
+ return c.slavePath
+}
+
+func (c *linuxConsole) Read(b []byte) (int, error) {
+ return c.master.Read(b)
+}
+
+func (c *linuxConsole) Write(b []byte) (int, error) {
+ return c.master.Write(b)
+}
+
+func (c *linuxConsole) Close() error {
+ if m := c.master; m != nil {
+ return m.Close()
+ }
+ return nil
+}
+
+// mount initializes the console inside the rootfs mounting with the specified mount label
+// and applying the correct ownership of the console.
+func (c *linuxConsole) mount(rootfs, mountLabel string, uid, gid int) error {
+ oldMask := syscall.Umask(0000)
+ defer syscall.Umask(oldMask)
+ if err := label.SetFileLabel(c.slavePath, mountLabel); err != nil {
+ return err
+ }
+ dest := filepath.Join(rootfs, "/dev/console")
+ f, err := os.Create(dest)
+ if err != nil && !os.IsExist(err) {
+ return err
+ }
+ if f != nil {
+ f.Close()
+ }
+ return syscall.Mount(c.slavePath, dest, "bind", syscall.MS_BIND, "")
+}
+
+// dupStdio opens the slavePath for the console and dup2s the fds to the current
+// processes stdio, fd 0,1,2.
+func (c *linuxConsole) dupStdio() error {
+ slave, err := c.open(syscall.O_RDWR)
+ if err != nil {
+ return err
+ }
+ fd := int(slave.Fd())
+ for _, i := range []int{0, 1, 2} {
+ if err := syscall.Dup2(fd, i); err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+// open is a clone of os.OpenFile without the O_CLOEXEC used to open the pty slave.
+func (c *linuxConsole) open(flag int) (*os.File, error) {
+ r, e := syscall.Open(c.slavePath, flag, 0)
+ if e != nil {
+ return nil, &os.PathError{
+ Op: "open",
+ Path: c.slavePath,
+ Err: e,
+ }
+ }
+ return os.NewFile(uintptr(r), c.slavePath), nil
+}
+
+func ioctl(fd uintptr, flag, data uintptr) error {
+ if _, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, flag, data); err != 0 {
+ return err
+ }
+ return nil
+}
+
+// unlockpt unlocks the slave pseudoterminal device corresponding to the master pseudoterminal referred to by f.
+// unlockpt should be called before opening the slave side of a pty.
+func unlockpt(f *os.File) error {
+ var u int32
+ return ioctl(f.Fd(), syscall.TIOCSPTLCK, uintptr(unsafe.Pointer(&u)))
+}
+
+// ptsname retrieves the name of the first available pts for the given master.
+func ptsname(f *os.File) (string, error) {
+ var n int32
+ if err := ioctl(f.Fd(), syscall.TIOCGPTN, uintptr(unsafe.Pointer(&n))); err != nil {
+ return "", err
+ }
+ return fmt.Sprintf("/dev/pts/%d", n), nil
+}
diff --git a/vendor/src/github.com/docker/libcontainer/container.go b/vendor/src/github.com/docker/libcontainer/container.go
index 307e8cbcbb..35bdfd781f 100644
--- a/vendor/src/github.com/docker/libcontainer/container.go
+++ b/vendor/src/github.com/docker/libcontainer/container.go
@@ -1,8 +1,53 @@
-/*
-NOTE: The API is in flux and mainly not implemented. Proceed with caution until further notice.
-*/
+// Libcontainer provides a native Go implementation for creating containers
+// with namespaces, cgroups, capabilities, and filesystem access controls.
+// It allows you to manage the lifecycle of the container performing additional operations
+// after the container is created.
package libcontainer
+import (
+ "github.com/docker/libcontainer/configs"
+)
+
+// The status of a container.
+type Status int
+
+const (
+ // The container exists and is running.
+ Running Status = iota + 1
+
+ // The container exists, it is in the process of being paused.
+ Pausing
+
+ // The container exists, but all its processes are paused.
+ Paused
+
+ // The container does not exist.
+ Destroyed
+)
+
+// State represents a running container's state
+type State struct {
+ // ID is the container ID.
+ ID string `json:"id"`
+
+ // InitProcessPid is the init process id in the parent namespace.
+ InitProcessPid int `json:"init_process_pid"`
+
+ // InitProcessStartTime is the init process start time.
+ InitProcessStartTime string `json:"init_process_start"`
+
+ // Path to all the cgroups setup for a container. Key is cgroup subsystem name
+ // with the value as the path.
+ CgroupPaths map[string]string `json:"cgroup_paths"`
+
+ // NamespacePaths are filepaths to the container's namespaces. Key is the namespace type
+ // with the value as the path.
+ NamespacePaths map[configs.NamespaceType]string `json:"namespace_paths"`
+
+ // Config is the container's configuration.
+ Config configs.Config `json:"config"`
+}
+
// A libcontainer container object.
//
// Each container is thread-safe within the same process. Since a container can
@@ -12,67 +57,88 @@ type Container interface {
// Returns the ID of the container
ID() string
- // Returns the current run state of the container.
+ // Returns the current status of the container.
//
- // Errors:
+ // errors:
// ContainerDestroyed - Container no longer exists,
- // SystemError - System error.
- RunState() (*RunState, Error)
-
- // Returns the current config of the container.
- Config() *Config
+ // Systemerror - System error.
+ Status() (Status, error)
- // Start a process inside the container. Returns the PID of the new process (in the caller process's namespace) and a channel that will return the exit status of the process whenever it dies.
+ // State returns the current container's state information.
//
- // Errors:
- // ContainerDestroyed - Container no longer exists,
- // ConfigInvalid - config is invalid,
- // ContainerPaused - Container is paused,
- // SystemError - System error.
- Start(config *ProcessConfig) (pid int, exitChan chan int, err Error)
+ // errors:
+ // Systemerror - System erroor.
+ State() (*State, error)
- // Destroys the container after killing all running processes.
- //
- // Any event registrations are removed before the container is destroyed.
- // No error is returned if the container is already destroyed.
- //
- // Errors:
- // SystemError - System error.
- Destroy() Error
+ // Returns the current config of the container.
+ Config() configs.Config
// Returns the PIDs inside this container. The PIDs are in the namespace of the calling process.
//
- // Errors:
+ // errors:
// ContainerDestroyed - Container no longer exists,
- // SystemError - System error.
+ // Systemerror - System error.
//
// Some of the returned PIDs may no longer refer to processes in the Container, unless
// the Container state is PAUSED in which case every PID in the slice is valid.
- Processes() ([]int, Error)
+ Processes() ([]int, error)
// Returns statistics for the container.
//
- // Errors:
+ // errors:
+ // ContainerDestroyed - Container no longer exists,
+ // Systemerror - System error.
+ Stats() (*Stats, error)
+
+ // Set cgroup resources of container as configured
+ //
+ // We can use this to change resources when containers are running.
+ //
+ // errors:
+ // Systemerror - System error.
+ Set(config configs.Config) error
+
+ // Start a process inside the container. Returns error if process fails to
+ // start. You can track process lifecycle with passed Process structure.
+ //
+ // errors:
// ContainerDestroyed - Container no longer exists,
- // SystemError - System error.
- Stats() (*ContainerStats, Error)
+ // ConfigInvalid - config is invalid,
+ // ContainerPaused - Container is paused,
+ // Systemerror - System error.
+ Start(process *Process) (err error)
+
+ // Destroys the container after killing all running processes.
+ //
+ // Any event registrations are removed before the container is destroyed.
+ // No error is returned if the container is already destroyed.
+ //
+ // errors:
+ // Systemerror - System error.
+ Destroy() error
// If the Container state is RUNNING or PAUSING, sets the Container state to PAUSING and pauses
// the execution of any user processes. Asynchronously, when the container finished being paused the
// state is changed to PAUSED.
// If the Container state is PAUSED, do nothing.
//
- // Errors:
+ // errors:
// ContainerDestroyed - Container no longer exists,
- // SystemError - System error.
- Pause() Error
+ // Systemerror - System error.
+ Pause() error
// If the Container state is PAUSED, resumes the execution of any user processes in the
// Container before setting the Container state to RUNNING.
// If the Container state is RUNNING, do nothing.
//
- // Errors:
+ // errors:
// ContainerDestroyed - Container no longer exists,
- // SystemError - System error.
- Resume() Error
+ // Systemerror - System error.
+ Resume() error
+
+ // NotifyOOM returns a read-only channel signaling when the container receives an OOM notification.
+ //
+ // errors:
+ // Systemerror - System error.
+ NotifyOOM() (<-chan struct{}, error)
}
diff --git a/vendor/src/github.com/docker/libcontainer/container_linux.go b/vendor/src/github.com/docker/libcontainer/container_linux.go
new file mode 100644
index 0000000000..d52610f073
--- /dev/null
+++ b/vendor/src/github.com/docker/libcontainer/container_linux.go
@@ -0,0 +1,316 @@
+// +build linux
+
+package libcontainer
+
+import (
+ "encoding/json"
+ "fmt"
+ "os"
+ "os/exec"
+ "path/filepath"
+ "sync"
+ "syscall"
+
+ log "github.com/Sirupsen/logrus"
+ "github.com/docker/libcontainer/cgroups"
+ "github.com/docker/libcontainer/configs"
+)
+
+type linuxContainer struct {
+ id string
+ root string
+ config *configs.Config
+ cgroupManager cgroups.Manager
+ initPath string
+ initArgs []string
+ initProcess parentProcess
+ m sync.Mutex
+}
+
+// ID returns the container's unique ID
+func (c *linuxContainer) ID() string {
+ return c.id
+}
+
+// Config returns the container's configuration
+func (c *linuxContainer) Config() configs.Config {
+ return *c.config
+}
+
+func (c *linuxContainer) Status() (Status, error) {
+ c.m.Lock()
+ defer c.m.Unlock()
+ return c.currentStatus()
+}
+
+func (c *linuxContainer) State() (*State, error) {
+ c.m.Lock()
+ defer c.m.Unlock()
+ return c.currentState()
+}
+
+func (c *linuxContainer) Processes() ([]int, error) {
+ pids, err := c.cgroupManager.GetPids()
+ if err != nil {
+ return nil, newSystemError(err)
+ }
+ return pids, nil
+}
+
+func (c *linuxContainer) Stats() (*Stats, error) {
+ var (
+ err error
+ stats = &Stats{}
+ )
+ if stats.CgroupStats, err = c.cgroupManager.GetStats(); err != nil {
+ return stats, newSystemError(err)
+ }
+ for _, iface := range c.config.Networks {
+ switch iface.Type {
+ case "veth":
+ istats, err := getNetworkInterfaceStats(iface.HostInterfaceName)
+ if err != nil {
+ return stats, newSystemError(err)
+ }
+ stats.Interfaces = append(stats.Interfaces, istats)
+ }
+ }
+ return stats, nil
+}
+
+func (c *linuxContainer) Set(config configs.Config) error {
+ c.m.Lock()
+ defer c.m.Unlock()
+ c.config = &config
+ return c.cgroupManager.Set(c.config)
+}
+
+func (c *linuxContainer) Start(process *Process) error {
+ c.m.Lock()
+ defer c.m.Unlock()
+ status, err := c.currentStatus()
+ if err != nil {
+ return err
+ }
+ doInit := status == Destroyed
+ parent, err := c.newParentProcess(process, doInit)
+ if err != nil {
+ return newSystemError(err)
+ }
+ if err := parent.start(); err != nil {
+ // terminate the process to ensure that it properly is reaped.
+ if err := parent.terminate(); err != nil {
+ log.Warn(err)
+ }
+ return newSystemError(err)
+ }
+ process.ops = parent
+ if doInit {
+
+ c.updateState(parent)
+ }
+ return nil
+}
+
+func (c *linuxContainer) newParentProcess(p *Process, doInit bool) (parentProcess, error) {
+ parentPipe, childPipe, err := newPipe()
+ if err != nil {
+ return nil, newSystemError(err)
+ }
+ cmd, err := c.commandTemplate(p, childPipe)
+ if err != nil {
+ return nil, newSystemError(err)
+ }
+ if !doInit {
+ return c.newSetnsProcess(p, cmd, parentPipe, childPipe), nil
+ }
+ return c.newInitProcess(p, cmd, parentPipe, childPipe)
+}
+
+func (c *linuxContainer) commandTemplate(p *Process, childPipe *os.File) (*exec.Cmd, error) {
+ cmd := &exec.Cmd{
+ Path: c.initPath,
+ Args: c.initArgs,
+ }
+ cmd.Stdin = p.Stdin
+ cmd.Stdout = p.Stdout
+ cmd.Stderr = p.Stderr
+ cmd.Dir = c.config.Rootfs
+ if cmd.SysProcAttr == nil {
+ cmd.SysProcAttr = &syscall.SysProcAttr{}
+ }
+ cmd.ExtraFiles = []*os.File{childPipe}
+ // NOTE: when running a container with no PID namespace and the parent process spawning the container is
+ // PID1 the pdeathsig is being delivered to the container's init process by the kernel for some reason
+ // even with the parent still running.
+ if c.config.ParentDeathSignal > 0 {
+ cmd.SysProcAttr.Pdeathsig = syscall.Signal(c.config.ParentDeathSignal)
+ }
+ return cmd, nil
+}
+
+func (c *linuxContainer) newInitProcess(p *Process, cmd *exec.Cmd, parentPipe, childPipe *os.File) (*initProcess, error) {
+ t := "_LIBCONTAINER_INITTYPE=standard"
+ cloneFlags := c.config.Namespaces.CloneFlags()
+ if cloneFlags&syscall.CLONE_NEWUSER != 0 {
+ if err := c.addUidGidMappings(cmd.SysProcAttr); err != nil {
+ // user mappings are not supported
+ return nil, err
+ }
+ // Default to root user when user namespaces are enabled.
+ if cmd.SysProcAttr.Credential == nil {
+ cmd.SysProcAttr.Credential = &syscall.Credential{}
+ }
+ }
+ cmd.Env = append(cmd.Env, t)
+ cmd.SysProcAttr.Cloneflags = cloneFlags
+ return &initProcess{
+ cmd: cmd,
+ childPipe: childPipe,
+ parentPipe: parentPipe,
+ manager: c.cgroupManager,
+ config: c.newInitConfig(p),
+ }, nil
+}
+
+func (c *linuxContainer) newSetnsProcess(p *Process, cmd *exec.Cmd, parentPipe, childPipe *os.File) *setnsProcess {
+ cmd.Env = append(cmd.Env,
+ fmt.Sprintf("_LIBCONTAINER_INITPID=%d", c.initProcess.pid()),
+ "_LIBCONTAINER_INITTYPE=setns",
+ )
+
+ if p.consolePath != "" {
+ cmd.Env = append(cmd.Env, "_LIBCONTAINER_CONSOLE_PATH="+p.consolePath)
+ }
+
+ // TODO: set on container for process management
+ return &setnsProcess{
+ cmd: cmd,
+ cgroupPaths: c.cgroupManager.GetPaths(),
+ childPipe: childPipe,
+ parentPipe: parentPipe,
+ config: c.newInitConfig(p),
+ }
+}
+
+func (c *linuxContainer) newInitConfig(process *Process) *initConfig {
+ return &initConfig{
+ Config: c.config,
+ Args: process.Args,
+ Env: process.Env,
+ User: process.User,
+ Cwd: process.Cwd,
+ Console: process.consolePath,
+ Capabilities: process.Capabilities,
+ }
+}
+
+func newPipe() (parent *os.File, child *os.File, err error) {
+ fds, err := syscall.Socketpair(syscall.AF_LOCAL, syscall.SOCK_STREAM|syscall.SOCK_CLOEXEC, 0)
+ if err != nil {
+ return nil, nil, err
+ }
+ return os.NewFile(uintptr(fds[1]), "parent"), os.NewFile(uintptr(fds[0]), "child"), nil
+}
+
+func (c *linuxContainer) Destroy() error {
+ c.m.Lock()
+ defer c.m.Unlock()
+ status, err := c.currentStatus()
+ if err != nil {
+ return err
+ }
+ if status != Destroyed {
+ return newGenericError(fmt.Errorf("container is not destroyed"), ContainerNotStopped)
+ }
+ if !c.config.Namespaces.Contains(configs.NEWPID) {
+ if err := killCgroupProcesses(c.cgroupManager); err != nil {
+ log.Warn(err)
+ }
+ }
+ err = c.cgroupManager.Destroy()
+ if rerr := os.RemoveAll(c.root); err == nil {
+ err = rerr
+ }
+ c.initProcess = nil
+ return err
+}
+
+func (c *linuxContainer) Pause() error {
+ c.m.Lock()
+ defer c.m.Unlock()
+ return c.cgroupManager.Freeze(configs.Frozen)
+}
+
+func (c *linuxContainer) Resume() error {
+ c.m.Lock()
+ defer c.m.Unlock()
+ return c.cgroupManager.Freeze(configs.Thawed)
+}
+
+func (c *linuxContainer) NotifyOOM() (<-chan struct{}, error) {
+ return notifyOnOOM(c.cgroupManager.GetPaths())
+}
+
+func (c *linuxContainer) updateState(process parentProcess) error {
+ c.initProcess = process
+ state, err := c.currentState()
+ if err != nil {
+ return err
+ }
+ f, err := os.Create(filepath.Join(c.root, stateFilename))
+ if err != nil {
+ return err
+ }
+ defer f.Close()
+ return json.NewEncoder(f).Encode(state)
+}
+
+func (c *linuxContainer) currentStatus() (Status, error) {
+ if c.initProcess == nil {
+ return Destroyed, nil
+ }
+ // return Running if the init process is alive
+ if err := syscall.Kill(c.initProcess.pid(), 0); err != nil {
+ if err == syscall.ESRCH {
+ return Destroyed, nil
+ }
+ return 0, newSystemError(err)
+ }
+ if c.config.Cgroups != nil && c.config.Cgroups.Freezer == configs.Frozen {
+ return Paused, nil
+ }
+ return Running, nil
+}
+
+func (c *linuxContainer) currentState() (*State, error) {
+ status, err := c.currentStatus()
+ if err != nil {
+ return nil, err
+ }
+ if status == Destroyed {
+ return nil, newGenericError(fmt.Errorf("container destroyed"), ContainerNotExists)
+ }
+ startTime, err := c.initProcess.startTime()
+ if err != nil {
+ return nil, newSystemError(err)
+ }
+ state := &State{
+ ID: c.ID(),
+ Config: *c.config,
+ InitProcessPid: c.initProcess.pid(),
+ InitProcessStartTime: startTime,
+ CgroupPaths: c.cgroupManager.GetPaths(),
+ NamespacePaths: make(map[configs.NamespaceType]string),
+ }
+ for _, ns := range c.config.Namespaces {
+ state.NamespacePaths[ns.Type] = ns.GetPath(c.initProcess.pid())
+ }
+ for _, nsType := range configs.NamespaceTypes() {
+ if _, ok := state.NamespacePaths[nsType]; !ok {
+ ns := configs.Namespace{Type: nsType}
+ state.NamespacePaths[ns.Type] = ns.GetPath(c.initProcess.pid())
+ }
+ }
+ return state, nil
+}
diff --git a/vendor/src/github.com/docker/libcontainer/container_linux_test.go b/vendor/src/github.com/docker/libcontainer/container_linux_test.go
new file mode 100644
index 0000000000..b05733e585
--- /dev/null
+++ b/vendor/src/github.com/docker/libcontainer/container_linux_test.go
@@ -0,0 +1,201 @@
+// +build linux
+
+package libcontainer
+
+import (
+ "fmt"
+ "os"
+ "testing"
+
+ "github.com/docker/libcontainer/cgroups"
+ "github.com/docker/libcontainer/configs"
+)
+
+type mockCgroupManager struct {
+ pids []int
+ stats *cgroups.Stats
+ paths map[string]string
+}
+
+func (m *mockCgroupManager) GetPids() ([]int, error) {
+ return m.pids, nil
+}
+
+func (m *mockCgroupManager) GetStats() (*cgroups.Stats, error) {
+ return m.stats, nil
+}
+
+func (m *mockCgroupManager) Apply(pid int) error {
+ return nil
+}
+
+func (m *mockCgroupManager) Set(container *configs.Config) error {
+ return nil
+}
+
+func (m *mockCgroupManager) Destroy() error {
+ return nil
+}
+
+func (m *mockCgroupManager) GetPaths() map[string]string {
+ return m.paths
+}
+
+func (m *mockCgroupManager) Freeze(state configs.FreezerState) error {
+ return nil
+}
+
+type mockProcess struct {
+ _pid int
+ started string
+}
+
+func (m *mockProcess) terminate() error {
+ return nil
+}
+
+func (m *mockProcess) pid() int {
+ return m._pid
+}
+
+func (m *mockProcess) startTime() (string, error) {
+ return m.started, nil
+}
+
+func (m *mockProcess) start() error {
+ return nil
+}
+
+func (m *mockProcess) wait() (*os.ProcessState, error) {
+ return nil, nil
+}
+
+func (m *mockProcess) signal(_ os.Signal) error {
+ return nil
+}
+
+func TestGetContainerPids(t *testing.T) {
+ container := &linuxContainer{
+ id: "myid",
+ config: &configs.Config{},
+ cgroupManager: &mockCgroupManager{pids: []int{1, 2, 3}},
+ }
+ pids, err := container.Processes()
+ if err != nil {
+ t.Fatal(err)
+ }
+ for i, expected := range []int{1, 2, 3} {
+ if pids[i] != expected {
+ t.Fatalf("expected pid %d but received %d", expected, pids[i])
+ }
+ }
+}
+
+func TestGetContainerStats(t *testing.T) {
+ container := &linuxContainer{
+ id: "myid",
+ config: &configs.Config{},
+ cgroupManager: &mockCgroupManager{
+ pids: []int{1, 2, 3},
+ stats: &cgroups.Stats{
+ MemoryStats: cgroups.MemoryStats{
+ Usage: 1024,
+ },
+ },
+ },
+ }
+ stats, err := container.Stats()
+ if err != nil {
+ t.Fatal(err)
+ }
+ if stats.CgroupStats == nil {
+ t.Fatal("cgroup stats are nil")
+ }
+ if stats.CgroupStats.MemoryStats.Usage != 1024 {
+ t.Fatalf("expected memory usage 1024 but recevied %d", stats.CgroupStats.MemoryStats.Usage)
+ }
+}
+
+func TestGetContainerState(t *testing.T) {
+ var (
+ pid = os.Getpid()
+ expectedMemoryPath = "/sys/fs/cgroup/memory/myid"
+ expectedNetworkPath = "/networks/fd"
+ )
+ container := &linuxContainer{
+ id: "myid",
+ config: &configs.Config{
+ Namespaces: []configs.Namespace{
+ {Type: configs.NEWPID},
+ {Type: configs.NEWNS},
+ {Type: configs.NEWNET, Path: expectedNetworkPath},
+ {Type: configs.NEWUTS},
+ // emulate host for IPC
+ //{Type: configs.NEWIPC},
+ },
+ },
+ initProcess: &mockProcess{
+ _pid: pid,
+ started: "010",
+ },
+ cgroupManager: &mockCgroupManager{
+ pids: []int{1, 2, 3},
+ stats: &cgroups.Stats{
+ MemoryStats: cgroups.MemoryStats{
+ Usage: 1024,
+ },
+ },
+ paths: map[string]string{
+ "memory": expectedMemoryPath,
+ },
+ },
+ }
+ state, err := container.State()
+ if err != nil {
+ t.Fatal(err)
+ }
+ if state.InitProcessPid != pid {
+ t.Fatalf("expected pid %d but received %d", pid, state.InitProcessPid)
+ }
+ if state.InitProcessStartTime != "010" {
+ t.Fatalf("expected process start time 010 but received %s", state.InitProcessStartTime)
+ }
+ paths := state.CgroupPaths
+ if paths == nil {
+ t.Fatal("cgroup paths should not be nil")
+ }
+ if memPath := paths["memory"]; memPath != expectedMemoryPath {
+ t.Fatalf("expected memory path %q but received %q", expectedMemoryPath, memPath)
+ }
+ for _, ns := range container.config.Namespaces {
+ path := state.NamespacePaths[ns.Type]
+ if path == "" {
+ t.Fatalf("expected non nil namespace path for %s", ns.Type)
+ }
+ if ns.Type == configs.NEWNET {
+ if path != expectedNetworkPath {
+ t.Fatalf("expected path %q but received %q", expectedNetworkPath, path)
+ }
+ } else {
+ file := ""
+ switch ns.Type {
+ case configs.NEWNET:
+ file = "net"
+ case configs.NEWNS:
+ file = "mnt"
+ case configs.NEWPID:
+ file = "pid"
+ case configs.NEWIPC:
+ file = "ipc"
+ case configs.NEWUSER:
+ file = "user"
+ case configs.NEWUTS:
+ file = "uts"
+ }
+ expected := fmt.Sprintf("/proc/%d/ns/%s", pid, file)
+ if expected != path {
+ t.Fatalf("expected path %q but received %q", expected, path)
+ }
+ }
+ }
+}
diff --git a/vendor/src/github.com/docker/libcontainer/container_nouserns_linux.go b/vendor/src/github.com/docker/libcontainer/container_nouserns_linux.go
new file mode 100644
index 0000000000..3b75d593cc
--- /dev/null
+++ b/vendor/src/github.com/docker/libcontainer/container_nouserns_linux.go
@@ -0,0 +1,13 @@
+// +build !go1.4
+
+package libcontainer
+
+import (
+ "fmt"
+ "syscall"
+)
+
+// not available before go 1.4
+func (c *linuxContainer) addUidGidMappings(sys *syscall.SysProcAttr) error {
+ return fmt.Errorf("User namespace is not supported in golang < 1.4")
+}
diff --git a/vendor/src/github.com/docker/libcontainer/container_userns_linux.go b/vendor/src/github.com/docker/libcontainer/container_userns_linux.go
new file mode 100644
index 0000000000..5f4cf3c9fe
--- /dev/null
+++ b/vendor/src/github.com/docker/libcontainer/container_userns_linux.go
@@ -0,0 +1,26 @@
+// +build go1.4
+
+package libcontainer
+
+import "syscall"
+
+// Converts IDMap to SysProcIDMap array and adds it to SysProcAttr.
+func (c *linuxContainer) addUidGidMappings(sys *syscall.SysProcAttr) error {
+ if c.config.UidMappings != nil {
+ sys.UidMappings = make([]syscall.SysProcIDMap, len(c.config.UidMappings))
+ for i, um := range c.config.UidMappings {
+ sys.UidMappings[i].ContainerID = um.ContainerID
+ sys.UidMappings[i].HostID = um.HostID
+ sys.UidMappings[i].Size = um.Size
+ }
+ }
+ if c.config.GidMappings != nil {
+ sys.GidMappings = make([]syscall.SysProcIDMap, len(c.config.GidMappings))
+ for i, gm := range c.config.GidMappings {
+ sys.GidMappings[i].ContainerID = gm.ContainerID
+ sys.GidMappings[i].HostID = gm.HostID
+ sys.GidMappings[i].Size = gm.Size
+ }
+ }
+ return nil
+}
diff --git a/vendor/src/github.com/docker/libcontainer/devices/defaults.go b/vendor/src/github.com/docker/libcontainer/devices/defaults.go
deleted file mode 100644
index e0ad0b08f8..0000000000
--- a/vendor/src/github.com/docker/libcontainer/devices/defaults.go
+++ /dev/null
@@ -1,159 +0,0 @@
-package devices
-
-var (
- // These are devices that are to be both allowed and created.
-
- DefaultSimpleDevices = []*Device{
- // /dev/null and zero
- {
- Path: "/dev/null",
- Type: 'c',
- MajorNumber: 1,
- MinorNumber: 3,
- CgroupPermissions: "rwm",
- FileMode: 0666,
- },
- {
- Path: "/dev/zero",
- Type: 'c',
- MajorNumber: 1,
- MinorNumber: 5,
- CgroupPermissions: "rwm",
- FileMode: 0666,
- },
-
- {
- Path: "/dev/full",
- Type: 'c',
- MajorNumber: 1,
- MinorNumber: 7,
- CgroupPermissions: "rwm",
- FileMode: 0666,
- },
-
- // consoles and ttys
- {
- Path: "/dev/tty",
- Type: 'c',
- MajorNumber: 5,
- MinorNumber: 0,
- CgroupPermissions: "rwm",
- FileMode: 0666,
- },
-
- // /dev/urandom,/dev/random
- {
- Path: "/dev/urandom",
- Type: 'c',
- MajorNumber: 1,
- MinorNumber: 9,
- CgroupPermissions: "rwm",
- FileMode: 0666,
- },
- {
- Path: "/dev/random",
- Type: 'c',
- MajorNumber: 1,
- MinorNumber: 8,
- CgroupPermissions: "rwm",
- FileMode: 0666,
- },
- }
-
- DefaultAllowedDevices = append([]*Device{
- // allow mknod for any device
- {
- Type: 'c',
- MajorNumber: Wildcard,
- MinorNumber: Wildcard,
- CgroupPermissions: "m",
- },
- {
- Type: 'b',
- MajorNumber: Wildcard,
- MinorNumber: Wildcard,
- CgroupPermissions: "m",
- },
-
- {
- Path: "/dev/console",
- Type: 'c',
- MajorNumber: 5,
- MinorNumber: 1,
- CgroupPermissions: "rwm",
- },
- {
- Path: "/dev/tty0",
- Type: 'c',
- MajorNumber: 4,
- MinorNumber: 0,
- CgroupPermissions: "rwm",
- },
- {
- Path: "/dev/tty1",
- Type: 'c',
- MajorNumber: 4,
- MinorNumber: 1,
- CgroupPermissions: "rwm",
- },
- // /dev/pts/ - pts namespaces are "coming soon"
- {
- Path: "",
- Type: 'c',
- MajorNumber: 136,
- MinorNumber: Wildcard,
- CgroupPermissions: "rwm",
- },
- {
- Path: "",
- Type: 'c',
- MajorNumber: 5,
- MinorNumber: 2,
- CgroupPermissions: "rwm",
- },
-
- // tuntap
- {
- Path: "",
- Type: 'c',
- MajorNumber: 10,
- MinorNumber: 200,
- CgroupPermissions: "rwm",
- },
-
- /*// fuse
- {
- Path: "",
- Type: 'c',
- MajorNumber: 10,
- MinorNumber: 229,
- CgroupPermissions: "rwm",
- },
-
- // rtc
- {
- Path: "",
- Type: 'c',
- MajorNumber: 254,
- MinorNumber: 0,
- CgroupPermissions: "rwm",
- },
- */
- }, DefaultSimpleDevices...)
-
- DefaultAutoCreatedDevices = append([]*Device{
- {
- // /dev/fuse is created but not allowed.
- // This is to allow java to work. Because java
- // Insists on there being a /dev/fuse
- // https://github.com/docker/docker/issues/514
- // https://github.com/docker/docker/issues/2393
- //
- Path: "/dev/fuse",
- Type: 'c',
- MajorNumber: 10,
- MinorNumber: 229,
- CgroupPermissions: "rwm",
- },
- }, DefaultSimpleDevices...)
-)
diff --git a/vendor/src/github.com/docker/libcontainer/devices/devices.go b/vendor/src/github.com/docker/libcontainer/devices/devices.go
index 8e86d95292..537f71aff1 100644
--- a/vendor/src/github.com/docker/libcontainer/devices/devices.go
+++ b/vendor/src/github.com/docker/libcontainer/devices/devices.go
@@ -7,14 +7,12 @@ import (
"os"
"path/filepath"
"syscall"
-)
-const (
- Wildcard = -1
+ "github.com/docker/libcontainer/configs"
)
var (
- ErrNotADeviceNode = errors.New("not a device node")
+ ErrNotADevice = errors.New("not a device node")
)
// Testing dependencies
@@ -23,45 +21,20 @@ var (
ioutilReadDir = ioutil.ReadDir
)
-type Device struct {
- Type rune `json:"type,omitempty"`
- Path string `json:"path,omitempty"` // It is fine if this is an empty string in the case that you are using Wildcards
- MajorNumber int64 `json:"major_number,omitempty"` // Use the wildcard constant for wildcards.
- MinorNumber int64 `json:"minor_number,omitempty"` // Use the wildcard constant for wildcards.
- CgroupPermissions string `json:"cgroup_permissions,omitempty"` // Typically just "rwm"
- FileMode os.FileMode `json:"file_mode,omitempty"` // The permission bits of the file's mode
- Uid uint32 `json:"uid,omitempty"`
- Gid uint32 `json:"gid,omitempty"`
-}
-
-func GetDeviceNumberString(deviceNumber int64) string {
- if deviceNumber == Wildcard {
- return "*"
- } else {
- return fmt.Sprintf("%d", deviceNumber)
- }
-}
-
-func (device *Device) GetCgroupAllowString() string {
- return fmt.Sprintf("%c %s:%s %s", device.Type, GetDeviceNumberString(device.MajorNumber), GetDeviceNumberString(device.MinorNumber), device.CgroupPermissions)
-}
-
// Given the path to a device and it's cgroup_permissions(which cannot be easilly queried) look up the information about a linux device and return that information as a Device struct.
-func GetDevice(path, cgroupPermissions string) (*Device, error) {
+func DeviceFromPath(path, permissions string) (*configs.Device, error) {
fileInfo, err := osLstat(path)
if err != nil {
return nil, err
}
-
var (
devType rune
mode = fileInfo.Mode()
fileModePermissionBits = os.FileMode.Perm(mode)
)
-
switch {
case mode&os.ModeDevice == 0:
- return nil, ErrNotADeviceNode
+ return nil, ErrNotADevice
case mode&os.ModeCharDevice != 0:
fileModePermissionBits |= syscall.S_IFCHR
devType = 'c'
@@ -69,36 +42,33 @@ func GetDevice(path, cgroupPermissions string) (*Device, error) {
fileModePermissionBits |= syscall.S_IFBLK
devType = 'b'
}
-
stat_t, ok := fileInfo.Sys().(*syscall.Stat_t)
if !ok {
return nil, fmt.Errorf("cannot determine the device number for device %s", path)
}
devNumber := int(stat_t.Rdev)
-
- return &Device{
- Type: devType,
- Path: path,
- MajorNumber: Major(devNumber),
- MinorNumber: Minor(devNumber),
- CgroupPermissions: cgroupPermissions,
- FileMode: fileModePermissionBits,
- Uid: stat_t.Uid,
- Gid: stat_t.Gid,
+ return &configs.Device{
+ Type: devType,
+ Path: path,
+ Major: Major(devNumber),
+ Minor: Minor(devNumber),
+ Permissions: permissions,
+ FileMode: fileModePermissionBits,
+ Uid: stat_t.Uid,
+ Gid: stat_t.Gid,
}, nil
}
-func GetHostDeviceNodes() ([]*Device, error) {
- return getDeviceNodes("/dev")
+func HostDevices() ([]*configs.Device, error) {
+ return getDevices("/dev")
}
-func getDeviceNodes(path string) ([]*Device, error) {
+func getDevices(path string) ([]*configs.Device, error) {
files, err := ioutilReadDir(path)
if err != nil {
return nil, err
}
-
- out := []*Device{}
+ out := []*configs.Device{}
for _, f := range files {
switch {
case f.IsDir():
@@ -106,7 +76,7 @@ func getDeviceNodes(path string) ([]*Device, error) {
case "pts", "shm", "fd", "mqueue":
continue
default:
- sub, err := getDeviceNodes(filepath.Join(path, f.Name()))
+ sub, err := getDevices(filepath.Join(path, f.Name()))
if err != nil {
return nil, err
}
@@ -117,16 +87,14 @@ func getDeviceNodes(path string) ([]*Device, error) {
case f.Name() == "console":
continue
}
-
- device, err := GetDevice(filepath.Join(path, f.Name()), "rwm")
+ device, err := DeviceFromPath(filepath.Join(path, f.Name()), "rwm")
if err != nil {
- if err == ErrNotADeviceNode {
+ if err == ErrNotADevice {
continue
}
return nil, err
}
out = append(out, device)
}
-
return out, nil
}
diff --git a/vendor/src/github.com/docker/libcontainer/devices/devices_test.go b/vendor/src/github.com/docker/libcontainer/devices/devices_test.go
index fec4002237..9e52fc4e25 100644
--- a/vendor/src/github.com/docker/libcontainer/devices/devices_test.go
+++ b/vendor/src/github.com/docker/libcontainer/devices/devices_test.go
@@ -6,7 +6,7 @@ import (
"testing"
)
-func TestGetDeviceLstatFailure(t *testing.T) {
+func TestDeviceFromPathLstatFailure(t *testing.T) {
testError := errors.New("test error")
// Override os.Lstat to inject error.
@@ -14,13 +14,13 @@ func TestGetDeviceLstatFailure(t *testing.T) {
return nil, testError
}
- _, err := GetDevice("", "")
+ _, err := DeviceFromPath("", "")
if err != testError {
t.Fatalf("Unexpected error %v, expected %v", err, testError)
}
}
-func TestGetHostDeviceNodesIoutilReadDirFailure(t *testing.T) {
+func TestHostDevicesIoutilReadDirFailure(t *testing.T) {
testError := errors.New("test error")
// Override ioutil.ReadDir to inject error.
@@ -28,13 +28,13 @@ func TestGetHostDeviceNodesIoutilReadDirFailure(t *testing.T) {
return nil, testError
}
- _, err := GetHostDeviceNodes()
+ _, err := HostDevices()
if err != testError {
t.Fatalf("Unexpected error %v, expected %v", err, testError)
}
}
-func TestGetHostDeviceNodesIoutilReadDirDeepFailure(t *testing.T) {
+func TestHostDevicesIoutilReadDirDeepFailure(t *testing.T) {
testError := errors.New("test error")
called := false
@@ -54,7 +54,7 @@ func TestGetHostDeviceNodesIoutilReadDirDeepFailure(t *testing.T) {
return []os.FileInfo{fi}, nil
}
- _, err := GetHostDeviceNodes()
+ _, err := HostDevices()
if err != testError {
t.Fatalf("Unexpected error %v, expected %v", err, testError)
}
diff --git a/vendor/src/github.com/docker/libcontainer/devices/number.go b/vendor/src/github.com/docker/libcontainer/devices/number.go
index 3aae380bb1..9e8feb83b0 100644
--- a/vendor/src/github.com/docker/libcontainer/devices/number.go
+++ b/vendor/src/github.com/docker/libcontainer/devices/number.go
@@ -20,7 +20,3 @@ func Major(devNumber int) int64 {
func Minor(devNumber int) int64 {
return int64((devNumber & 0xff) | ((devNumber >> 12) & 0xfff00))
}
-
-func Mkdev(majorNumber int64, minorNumber int64) int {
- return int((majorNumber << 8) | (minorNumber & 0xff) | ((minorNumber & 0xfff00) << 12))
-}
diff --git a/vendor/src/github.com/docker/libcontainer/docs/man/nsinit.1.md b/vendor/src/github.com/docker/libcontainer/docs/man/nsinit.1.md
new file mode 100644
index 0000000000..898dba2306
--- /dev/null
+++ b/vendor/src/github.com/docker/libcontainer/docs/man/nsinit.1.md
@@ -0,0 +1,38 @@
+% nsinit User Manual
+% docker/libcontainer
+% JAN 2015
+
+NAME:
+ nsinit - A low-level utility for managing containers.
+ It is used to spawn new containers or join existing containers.
+
+USAGE:
+ nsinit [global options] command [command options] [arguments...]
+
+VERSION:
+ 0.1
+
+COMMANDS:
+ config display the container configuration
+ exec execute a new command inside a container
+ init runs the init process inside the namespace
+ oom display oom notifications for a container
+ pause pause the container's processes
+ stats display statistics for the container
+ unpause unpause the container's processes
+ help, h shows a list of commands or help for one command
+
+EXAMPLES:
+
+Get the <container_id> of an already running docker container.
+`sudo docker ps` will return the list of all the running containers.
+
+take the <container_id> (e.g. 4addb0b2d307) and go to its config directory
+`/var/lib/docker/execdriver/native/4addb0b2d307` and here you can run the nsinit
+command line utility.
+
+e.g. `nsinit exec /bin/bash` will start a shell on the already running container.
+
+# HISTORY
+Jan 2015, Originally compiled by Shishir Mahajan (shishir dot mahajan at redhat dot com)
+based on nsinit source material and internal work.
diff --git a/vendor/src/github.com/docker/libcontainer/error.go b/vendor/src/github.com/docker/libcontainer/error.go
index 5ff56d80ba..6c266620e7 100644
--- a/vendor/src/github.com/docker/libcontainer/error.go
+++ b/vendor/src/github.com/docker/libcontainer/error.go
@@ -1,5 +1,7 @@
package libcontainer
+import "io"
+
// API error code type.
type ErrorCode int
@@ -8,29 +10,52 @@ const (
// Factory errors
IdInUse ErrorCode = iota
InvalidIdFormat
- // TODO: add Load errors
// Container errors
- ContainerDestroyed
+ ContainerNotExists
ContainerPaused
+ ContainerNotStopped
+ ContainerNotRunning
+
+ // Process errors
+ ProcessNotExecuted
// Common errors
ConfigInvalid
SystemError
)
+func (c ErrorCode) String() string {
+ switch c {
+ case IdInUse:
+ return "Id already in use"
+ case InvalidIdFormat:
+ return "Invalid format"
+ case ContainerPaused:
+ return "Container paused"
+ case ConfigInvalid:
+ return "Invalid configuration"
+ case SystemError:
+ return "System error"
+ case ContainerNotExists:
+ return "Container does not exist"
+ case ContainerNotStopped:
+ return "Container is not stopped"
+ case ContainerNotRunning:
+ return "Container is not running"
+ default:
+ return "Unknown error"
+ }
+}
+
// API Error type.
type Error interface {
error
- // Returns the stack trace, if any, which identifies the
- // point at which the error occurred.
- Stack() []byte
-
// Returns a verbose string including the error message
// and a representation of the stack trace suitable for
// printing.
- Detail() string
+ Detail(w io.Writer) error
// Returns the error code for this error.
Code() ErrorCode
diff --git a/vendor/src/github.com/docker/libcontainer/error_test.go b/vendor/src/github.com/docker/libcontainer/error_test.go
new file mode 100644
index 0000000000..4bf4c9f5d4
--- /dev/null
+++ b/vendor/src/github.com/docker/libcontainer/error_test.go
@@ -0,0 +1,20 @@
+package libcontainer
+
+import "testing"
+
+func TestErrorCode(t *testing.T) {
+ codes := map[ErrorCode]string{
+ IdInUse: "Id already in use",
+ InvalidIdFormat: "Invalid format",
+ ContainerPaused: "Container paused",
+ ConfigInvalid: "Invalid configuration",
+ SystemError: "System error",
+ ContainerNotExists: "Container does not exist",
+ }
+
+ for code, expected := range codes {
+ if actual := code.String(); actual != expected {
+ t.Fatalf("expected string %q but received %q", expected, actual)
+ }
+ }
+}
diff --git a/vendor/src/github.com/docker/libcontainer/factory.go b/vendor/src/github.com/docker/libcontainer/factory.go
index e37773b2bd..0c9fa63a32 100644
--- a/vendor/src/github.com/docker/libcontainer/factory.go
+++ b/vendor/src/github.com/docker/libcontainer/factory.go
@@ -1,7 +1,10 @@
package libcontainer
-type Factory interface {
+import (
+ "github.com/docker/libcontainer/configs"
+)
+type Factory interface {
// Creates a new container with the given id and starts the initial process inside it.
// id must be a string containing only letters, digits and underscores and must contain
// between 1 and 1024 characters, inclusive.
@@ -11,22 +14,34 @@ type Factory interface {
//
// Returns the new container with a running process.
//
- // Errors:
+ // errors:
// IdInUse - id is already in use by a container
// InvalidIdFormat - id has incorrect format
// ConfigInvalid - config is invalid
- // SystemError - System error
+ // Systemerror - System error
//
// On error, any partially created container parts are cleaned up (the operation is atomic).
- Create(id string, config *Config) (Container, Error)
+ Create(id string, config *configs.Config) (Container, error)
- // Load takes an ID for an existing container and reconstructs the container
- // from the state.
+ // Load takes an ID for an existing container and returns the container information
+ // from the state. This presents a read only view of the container.
//
- // Errors:
+ // errors:
// Path does not exist
// Container is stopped
// System error
- // TODO: fix description
- Load(id string) (Container, Error)
+ Load(id string) (Container, error)
+
+ // StartInitialization is an internal API to libcontainer used during the rexec of the
+ // container. pipefd is the fd to the child end of the pipe used to syncronize the
+ // parent and child process providing state and configuration to the child process and
+ // returning any errors during the init of the container
+ //
+ // Errors:
+ // pipe connection error
+ // system error
+ StartInitialization(pipefd uintptr) error
+
+ // Type returns info string about factory type (e.g. lxc, libcontainer...)
+ Type() string
}
diff --git a/vendor/src/github.com/docker/libcontainer/factory_linux.go b/vendor/src/github.com/docker/libcontainer/factory_linux.go
new file mode 100644
index 0000000000..a2d3bec780
--- /dev/null
+++ b/vendor/src/github.com/docker/libcontainer/factory_linux.go
@@ -0,0 +1,282 @@
+// +build linux
+
+package libcontainer
+
+import (
+ "encoding/json"
+ "fmt"
+ "io/ioutil"
+ "os"
+ "os/exec"
+ "path/filepath"
+ "regexp"
+ "syscall"
+
+ "github.com/docker/docker/pkg/mount"
+ "github.com/docker/libcontainer/cgroups"
+ "github.com/docker/libcontainer/cgroups/fs"
+ "github.com/docker/libcontainer/cgroups/systemd"
+ "github.com/docker/libcontainer/configs"
+ "github.com/docker/libcontainer/configs/validate"
+)
+
+const (
+ stateFilename = "state.json"
+)
+
+var (
+ idRegex = regexp.MustCompile(`^[\w_]+$`)
+ maxIdLen = 1024
+)
+
+// InitArgs returns an options func to configure a LinuxFactory with the
+// provided init arguments.
+func InitArgs(args ...string) func(*LinuxFactory) error {
+ return func(l *LinuxFactory) error {
+ name := args[0]
+ if filepath.Base(name) == name {
+ if lp, err := exec.LookPath(name); err == nil {
+ name = lp
+ }
+ }
+ l.InitPath = name
+ l.InitArgs = append([]string{name}, args[1:]...)
+ return nil
+ }
+}
+
+// InitPath returns an options func to configure a LinuxFactory with the
+// provided absolute path to the init binary and arguements.
+func InitPath(path string, args ...string) func(*LinuxFactory) error {
+ return func(l *LinuxFactory) error {
+ l.InitPath = path
+ l.InitArgs = args
+ return nil
+ }
+}
+
+// SystemdCgroups is an options func to configure a LinuxFactory to return
+// containers that use systemd to create and manage cgroups.
+func SystemdCgroups(l *LinuxFactory) error {
+ l.NewCgroupsManager = func(config *configs.Cgroup, paths map[string]string) cgroups.Manager {
+ return &systemd.Manager{
+ Cgroups: config,
+ Paths: paths,
+ }
+ }
+ return nil
+}
+
+// Cgroupfs is an options func to configure a LinuxFactory to return
+// containers that use the native cgroups filesystem implementation to
+// create and manage cgroups.
+func Cgroupfs(l *LinuxFactory) error {
+ l.NewCgroupsManager = func(config *configs.Cgroup, paths map[string]string) cgroups.Manager {
+ return &fs.Manager{
+ Cgroups: config,
+ Paths: paths,
+ }
+ }
+ return nil
+}
+
+// TmpfsRoot is an option func to mount LinuxFactory.Root to tmpfs.
+func TmpfsRoot(l *LinuxFactory) error {
+ mounted, err := mount.Mounted(l.Root)
+ if err != nil {
+ return err
+ }
+ if !mounted {
+ if err := syscall.Mount("tmpfs", l.Root, "tmpfs", 0, ""); err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+// New returns a linux based container factory based in the root directory and
+// configures the factory with the provided option funcs.
+func New(root string, options ...func(*LinuxFactory) error) (Factory, error) {
+ if root != "" {
+ if err := os.MkdirAll(root, 0700); err != nil {
+ return nil, newGenericError(err, SystemError)
+ }
+ }
+ l := &LinuxFactory{
+ Root: root,
+ Validator: validate.New(),
+ }
+ InitArgs(os.Args[0], "init")(l)
+ Cgroupfs(l)
+ for _, opt := range options {
+ if err := opt(l); err != nil {
+ return nil, err
+ }
+ }
+ return l, nil
+}
+
+// LinuxFactory implements the default factory interface for linux based systems.
+type LinuxFactory struct {
+ // Root directory for the factory to store state.
+ Root string
+
+ // InitPath is the absolute path to the init binary.
+ InitPath string
+
+ // InitArgs are arguments for calling the init responsibilities for spawning
+ // a container.
+ InitArgs []string
+
+ // Validator provides validation to container configurations.
+ Validator validate.Validator
+
+ // NewCgroupsManager returns an initialized cgroups manager for a single container.
+ NewCgroupsManager func(config *configs.Cgroup, paths map[string]string) cgroups.Manager
+}
+
+func (l *LinuxFactory) Create(id string, config *configs.Config) (Container, error) {
+ if l.Root == "" {
+ return nil, newGenericError(fmt.Errorf("invalid root"), ConfigInvalid)
+ }
+ if err := l.validateID(id); err != nil {
+ return nil, err
+ }
+ if err := l.Validator.Validate(config); err != nil {
+ return nil, newGenericError(err, ConfigInvalid)
+ }
+ containerRoot := filepath.Join(l.Root, id)
+ if _, err := os.Stat(containerRoot); err == nil {
+ return nil, newGenericError(fmt.Errorf("Container with id exists: %v", id), IdInUse)
+ } else if !os.IsNotExist(err) {
+ return nil, newGenericError(err, SystemError)
+ }
+ if err := os.MkdirAll(containerRoot, 0700); err != nil {
+ return nil, newGenericError(err, SystemError)
+ }
+ return &linuxContainer{
+ id: id,
+ root: containerRoot,
+ config: config,
+ initPath: l.InitPath,
+ initArgs: l.InitArgs,
+ cgroupManager: l.NewCgroupsManager(config.Cgroups, nil),
+ }, nil
+}
+
+func (l *LinuxFactory) Load(id string) (Container, error) {
+ if l.Root == "" {
+ return nil, newGenericError(fmt.Errorf("invalid root"), ConfigInvalid)
+ }
+ containerRoot := filepath.Join(l.Root, id)
+ state, err := l.loadState(containerRoot)
+ if err != nil {
+ return nil, err
+ }
+ r := &restoredProcess{
+ processPid: state.InitProcessPid,
+ processStartTime: state.InitProcessStartTime,
+ }
+ return &linuxContainer{
+ initProcess: r,
+ id: id,
+ config: &state.Config,
+ initPath: l.InitPath,
+ initArgs: l.InitArgs,
+ cgroupManager: l.NewCgroupsManager(state.Config.Cgroups, state.CgroupPaths),
+ root: containerRoot,
+ }, nil
+}
+
+func (l *LinuxFactory) Type() string {
+ return "libcontainer"
+}
+
+// StartInitialization loads a container by opening the pipe fd from the parent to read the configuration and state
+// This is a low level implementation detail of the reexec and should not be consumed externally
+func (l *LinuxFactory) StartInitialization(pipefd uintptr) (err error) {
+ var (
+ pipe = os.NewFile(uintptr(pipefd), "pipe")
+ it = initType(os.Getenv("_LIBCONTAINER_INITTYPE"))
+ )
+ // clear the current process's environment to clean any libcontainer
+ // specific env vars.
+ os.Clearenv()
+ defer func() {
+ // if we have an error during the initialization of the container's init then send it back to the
+ // parent process in the form of an initError.
+ if err != nil {
+ // ensure that any data sent from the parent is consumed so it doesn't
+ // receive ECONNRESET when the child writes to the pipe.
+ ioutil.ReadAll(pipe)
+ if err := json.NewEncoder(pipe).Encode(newSystemError(err)); err != nil {
+ panic(err)
+ }
+ }
+ // ensure that this pipe is always closed
+ pipe.Close()
+ }()
+ i, err := newContainerInit(it, pipe)
+ if err != nil {
+ return err
+ }
+ return i.Init()
+}
+
+func (l *LinuxFactory) loadState(root string) (*State, error) {
+ f, err := os.Open(filepath.Join(root, stateFilename))
+ if err != nil {
+ if os.IsNotExist(err) {
+ return nil, newGenericError(err, ContainerNotExists)
+ }
+ return nil, newGenericError(err, SystemError)
+ }
+ defer f.Close()
+ var state *State
+ if err := json.NewDecoder(f).Decode(&state); err != nil {
+ return nil, newGenericError(err, SystemError)
+ }
+ return state, nil
+}
+
+func (l *LinuxFactory) validateID(id string) error {
+ if !idRegex.MatchString(id) {
+ return newGenericError(fmt.Errorf("Invalid id format: %v", id), InvalidIdFormat)
+ }
+ if len(id) > maxIdLen {
+ return newGenericError(fmt.Errorf("Invalid id format: %v", id), InvalidIdFormat)
+ }
+ return nil
+}
+
+// restoredProcess represents a process where the calling process may or may not be
+// the parent process. This process is created when a factory loads a container from
+// a persisted state.
+type restoredProcess struct {
+ processPid int
+ processStartTime string
+}
+
+func (p *restoredProcess) start() error {
+ return newGenericError(fmt.Errorf("restored process cannot be started"), SystemError)
+}
+
+func (p *restoredProcess) pid() int {
+ return p.processPid
+}
+
+func (p *restoredProcess) terminate() error {
+ return newGenericError(fmt.Errorf("restored process cannot be terminated"), SystemError)
+}
+
+func (p *restoredProcess) wait() (*os.ProcessState, error) {
+ return nil, newGenericError(fmt.Errorf("restored process cannot be waited on"), SystemError)
+}
+
+func (p *restoredProcess) startTime() (string, error) {
+ return p.processStartTime, nil
+}
+
+func (p *restoredProcess) signal(s os.Signal) error {
+ return newGenericError(fmt.Errorf("restored process cannot be signaled"), SystemError)
+}
diff --git a/vendor/src/github.com/docker/libcontainer/factory_linux_test.go b/vendor/src/github.com/docker/libcontainer/factory_linux_test.go
new file mode 100644
index 0000000000..00e3973943
--- /dev/null
+++ b/vendor/src/github.com/docker/libcontainer/factory_linux_test.go
@@ -0,0 +1,179 @@
+// +build linux
+
+package libcontainer
+
+import (
+ "encoding/json"
+ "io/ioutil"
+ "os"
+ "path/filepath"
+ "testing"
+
+ "github.com/docker/docker/pkg/mount"
+ "github.com/docker/libcontainer/configs"
+)
+
+func newTestRoot() (string, error) {
+ dir, err := ioutil.TempDir("", "libcontainer")
+ if err != nil {
+ return "", err
+ }
+ return dir, nil
+}
+
+func TestFactoryNew(t *testing.T) {
+ root, rerr := newTestRoot()
+ if rerr != nil {
+ t.Fatal(rerr)
+ }
+ defer os.RemoveAll(root)
+ factory, err := New(root, Cgroupfs)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if factory == nil {
+ t.Fatal("factory should not be nil")
+ }
+ lfactory, ok := factory.(*LinuxFactory)
+ if !ok {
+ t.Fatal("expected linux factory returned on linux based systems")
+ }
+ if lfactory.Root != root {
+ t.Fatalf("expected factory root to be %q but received %q", root, lfactory.Root)
+ }
+
+ if factory.Type() != "libcontainer" {
+ t.Fatalf("unexpected factory type: %q, expected %q", factory.Type(), "libcontainer")
+ }
+}
+
+func TestFactoryNewTmpfs(t *testing.T) {
+ root, rerr := newTestRoot()
+ if rerr != nil {
+ t.Fatal(rerr)
+ }
+ defer os.RemoveAll(root)
+ factory, err := New(root, Cgroupfs, TmpfsRoot)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if factory == nil {
+ t.Fatal("factory should not be nil")
+ }
+ lfactory, ok := factory.(*LinuxFactory)
+ if !ok {
+ t.Fatal("expected linux factory returned on linux based systems")
+ }
+ if lfactory.Root != root {
+ t.Fatalf("expected factory root to be %q but received %q", root, lfactory.Root)
+ }
+
+ if factory.Type() != "libcontainer" {
+ t.Fatalf("unexpected factory type: %q, expected %q", factory.Type(), "libcontainer")
+ }
+ mounted, err := mount.Mounted(lfactory.Root)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if !mounted {
+ t.Fatalf("Factory Root is not mounted")
+ }
+ mounts, err := mount.GetMounts()
+ if err != nil {
+ t.Fatal(err)
+ }
+ var found bool
+ for _, m := range mounts {
+ if m.Mountpoint == lfactory.Root {
+ if m.Fstype != "tmpfs" {
+ t.Fatalf("Fstype of root: %s, expected %s", m.Fstype, "tmpfs")
+ }
+ if m.Source != "tmpfs" {
+ t.Fatalf("Source of root: %s, expected %s", m.Source, "tmpfs")
+ }
+ found = true
+ }
+ }
+ if !found {
+ t.Fatalf("Factory Root is not listed in mounts list")
+ }
+}
+
+func TestFactoryLoadNotExists(t *testing.T) {
+ root, rerr := newTestRoot()
+ if rerr != nil {
+ t.Fatal(rerr)
+ }
+ defer os.RemoveAll(root)
+ factory, err := New(root, Cgroupfs)
+ if err != nil {
+ t.Fatal(err)
+ }
+ _, err = factory.Load("nocontainer")
+ if err == nil {
+ t.Fatal("expected nil error loading non-existing container")
+ }
+ lerr, ok := err.(Error)
+ if !ok {
+ t.Fatal("expected libcontainer error type")
+ }
+ if lerr.Code() != ContainerNotExists {
+ t.Fatalf("expected error code %s but received %s", ContainerNotExists, lerr.Code())
+ }
+}
+
+func TestFactoryLoadContainer(t *testing.T) {
+ root, err := newTestRoot()
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer os.RemoveAll(root)
+ // setup default container config and state for mocking
+ var (
+ id = "1"
+ expectedConfig = &configs.Config{
+ Rootfs: "/mycontainer/root",
+ }
+ expectedState = &State{
+ InitProcessPid: 1024,
+ Config: *expectedConfig,
+ }
+ )
+ if err := os.Mkdir(filepath.Join(root, id), 0700); err != nil {
+ t.Fatal(err)
+ }
+ if err := marshal(filepath.Join(root, id, stateFilename), expectedState); err != nil {
+ t.Fatal(err)
+ }
+ factory, err := New(root, Cgroupfs)
+ if err != nil {
+ t.Fatal(err)
+ }
+ container, err := factory.Load(id)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if container.ID() != id {
+ t.Fatalf("expected container id %q but received %q", id, container.ID())
+ }
+ config := container.Config()
+ if config.Rootfs != expectedConfig.Rootfs {
+ t.Fatalf("expected rootfs %q but received %q", expectedConfig.Rootfs, config.Rootfs)
+ }
+ lcontainer, ok := container.(*linuxContainer)
+ if !ok {
+ t.Fatal("expected linux container on linux based systems")
+ }
+ if lcontainer.initProcess.pid() != expectedState.InitProcessPid {
+ t.Fatalf("expected init pid %d but received %d", expectedState.InitProcessPid, lcontainer.initProcess.pid())
+ }
+}
+
+func marshal(path string, v interface{}) error {
+ f, err := os.Create(path)
+ if err != nil {
+ return err
+ }
+ defer f.Close()
+ return json.NewEncoder(f).Encode(v)
+}
diff --git a/vendor/src/github.com/docker/libcontainer/generic_error.go b/vendor/src/github.com/docker/libcontainer/generic_error.go
new file mode 100644
index 0000000000..ff4d7248da
--- /dev/null
+++ b/vendor/src/github.com/docker/libcontainer/generic_error.go
@@ -0,0 +1,74 @@
+package libcontainer
+
+import (
+ "fmt"
+ "io"
+ "text/template"
+ "time"
+
+ "github.com/docker/libcontainer/stacktrace"
+)
+
+var errorTemplate = template.Must(template.New("error").Parse(`Timestamp: {{.Timestamp}}
+Code: {{.ECode}}
+{{if .Message }}
+Message: {{.Message}}
+{{end}}
+Frames:{{range $i, $frame := .Stack.Frames}}
+---
+{{$i}}: {{$frame.Function}}
+Package: {{$frame.Package}}
+File: {{$frame.File}}@{{$frame.Line}}{{end}}
+`))
+
+func newGenericError(err error, c ErrorCode) Error {
+ if le, ok := err.(Error); ok {
+ return le
+ }
+ gerr := &genericError{
+ Timestamp: time.Now(),
+ Err: err,
+ ECode: c,
+ Stack: stacktrace.Capture(1),
+ }
+ if err != nil {
+ gerr.Message = err.Error()
+ }
+ return gerr
+}
+
+func newSystemError(err error) Error {
+ if le, ok := err.(Error); ok {
+ return le
+ }
+ gerr := &genericError{
+ Timestamp: time.Now(),
+ Err: err,
+ ECode: SystemError,
+ Stack: stacktrace.Capture(1),
+ }
+ if err != nil {
+ gerr.Message = err.Error()
+ }
+ return gerr
+}
+
+type genericError struct {
+ Timestamp time.Time
+ ECode ErrorCode
+ Err error `json:"-"`
+ Message string
+ Stack stacktrace.Stacktrace
+}
+
+func (e *genericError) Error() string {
+ return fmt.Sprintf("[%d] %s: %s", e.ECode, e.ECode, e.Message)
+}
+
+func (e *genericError) Code() ErrorCode {
+ return e.ECode
+}
+
+func (e *genericError) Detail(w io.Writer) error {
+ return errorTemplate.Execute(w, e)
+}
diff --git a/vendor/src/github.com/docker/libcontainer/generic_error_test.go b/vendor/src/github.com/docker/libcontainer/generic_error_test.go
new file mode 100644
index 0000000000..292d2a36bd
--- /dev/null
+++ b/vendor/src/github.com/docker/libcontainer/generic_error_test.go
@@ -0,0 +1,14 @@
+package libcontainer
+
+import (
+ "fmt"
+ "io/ioutil"
+ "testing"
+)
+
+func TestErrorDetail(t *testing.T) {
+ err := newGenericError(fmt.Errorf("test error"), SystemError)
+ if derr := err.Detail(ioutil.Discard); derr != nil {
+ t.Fatal(derr)
+ }
+}
diff --git a/vendor/src/github.com/docker/libcontainer/hack/validate.sh b/vendor/src/github.com/docker/libcontainer/hack/validate.sh
new file mode 100755
index 0000000000..70635377b9
--- /dev/null
+++ b/vendor/src/github.com/docker/libcontainer/hack/validate.sh
@@ -0,0 +1,15 @@
+#!/usr/bin/env bash
+set -e
+
+# This script runs all validations
+
+validate() {
+ sed -i 's!docker/docker!docker/libcontainer!' /go/src/github.com/docker/docker/hack/make/.validate
+ bash /go/src/github.com/docker/docker/hack/make/validate-dco
+ bash /go/src/github.com/docker/docker/hack/make/validate-gofmt
+ go get golang.org/x/tools/cmd/vet
+ go vet github.com/docker/libcontainer/...
+}
+
+# run validations
+validate
diff --git a/vendor/src/github.com/docker/libcontainer/init_linux.go b/vendor/src/github.com/docker/libcontainer/init_linux.go
new file mode 100644
index 0000000000..1786b1ed7a
--- /dev/null
+++ b/vendor/src/github.com/docker/libcontainer/init_linux.go
@@ -0,0 +1,260 @@
+// +build linux
+
+package libcontainer
+
+import (
+ "encoding/json"
+ "fmt"
+ "os"
+ "strings"
+ "syscall"
+
+ log "github.com/Sirupsen/logrus"
+ "github.com/docker/libcontainer/cgroups"
+ "github.com/docker/libcontainer/configs"
+ "github.com/docker/libcontainer/netlink"
+ "github.com/docker/libcontainer/system"
+ "github.com/docker/libcontainer/user"
+ "github.com/docker/libcontainer/utils"
+)
+
+type initType string
+
+const (
+ initSetns initType = "setns"
+ initStandard initType = "standard"
+)
+
+type pid struct {
+ Pid int `json:"pid"`
+}
+
+// network is an internal struct used to setup container networks.
+type network struct {
+ configs.Network
+
+ // TempVethPeerName is a unique tempory veth peer name that was placed into
+ // the container's namespace.
+ TempVethPeerName string `json:"temp_veth_peer_name"`
+}
+
+// initConfig is used for transferring parameters from Exec() to Init()
+type initConfig struct {
+ Args []string `json:"args"`
+ Env []string `json:"env"`
+ Cwd string `json:"cwd"`
+ Capabilities []string `json:"capabilities"`
+ User string `json:"user"`
+ Config *configs.Config `json:"config"`
+ Console string `json:"console"`
+ Networks []*network `json:"network"`
+}
+
+type initer interface {
+ Init() error
+}
+
+func newContainerInit(t initType, pipe *os.File) (initer, error) {
+ var config *initConfig
+ if err := json.NewDecoder(pipe).Decode(&config); err != nil {
+ return nil, err
+ }
+ if err := populateProcessEnvironment(config.Env); err != nil {
+ return nil, err
+ }
+ switch t {
+ case initSetns:
+ return &linuxSetnsInit{
+ config: config,
+ }, nil
+ case initStandard:
+ return &linuxStandardInit{
+ parentPid: syscall.Getppid(),
+ config: config,
+ }, nil
+ }
+ return nil, fmt.Errorf("unknown init type %q", t)
+}
+
+// populateProcessEnvironment loads the provided environment variables into the
+// current processes's environment.
+func populateProcessEnvironment(env []string) error {
+ for _, pair := range env {
+ p := strings.SplitN(pair, "=", 2)
+ if len(p) < 2 {
+ return fmt.Errorf("invalid environment '%v'", pair)
+ }
+ if err := os.Setenv(p[0], p[1]); err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+// finalizeNamespace drops the caps, sets the correct user
+// and working dir, and closes any leaked file descriptors
+// before executing the command inside the namespace
+func finalizeNamespace(config *initConfig) error {
+ // Ensure that all non-standard fds we may have accidentally
+ // inherited are marked close-on-exec so they stay out of the
+ // container
+ if err := utils.CloseExecFrom(3); err != nil {
+ return err
+ }
+
+ capabilities := config.Config.Capabilities
+ if config.Capabilities != nil {
+ capabilities = config.Capabilities
+ }
+ w, err := newCapWhitelist(capabilities)
+ if err != nil {
+ return err
+ }
+ // drop capabilities in bounding set before changing user
+ if err := w.dropBoundingSet(); err != nil {
+ return err
+ }
+ // preserve existing capabilities while we change users
+ if err := system.SetKeepCaps(); err != nil {
+ return err
+ }
+ if err := setupUser(config); err != nil {
+ return err
+ }
+ if err := system.ClearKeepCaps(); err != nil {
+ return err
+ }
+ // drop all other capabilities
+ if err := w.drop(); err != nil {
+ return err
+ }
+ if config.Cwd != "" {
+ if err := syscall.Chdir(config.Cwd); err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+// joinExistingNamespaces gets all the namespace paths specified for the container and
+// does a setns on the namespace fd so that the current process joins the namespace.
+func joinExistingNamespaces(namespaces []configs.Namespace) error {
+ for _, ns := range namespaces {
+ if ns.Path != "" {
+ f, err := os.OpenFile(ns.Path, os.O_RDONLY, 0)
+ if err != nil {
+ return err
+ }
+ err = system.Setns(f.Fd(), uintptr(ns.Syscall()))
+ f.Close()
+ if err != nil {
+ return err
+ }
+ }
+ }
+ return nil
+}
+
+// setupUser changes the groups, gid, and uid for the user inside the container
+func setupUser(config *initConfig) error {
+ // Set up defaults.
+ defaultExecUser := user.ExecUser{
+ Uid: syscall.Getuid(),
+ Gid: syscall.Getgid(),
+ Home: "/",
+ }
+ passwdPath, err := user.GetPasswdPath()
+ if err != nil {
+ return err
+ }
+ groupPath, err := user.GetGroupPath()
+ if err != nil {
+ return err
+ }
+ execUser, err := user.GetExecUserPath(config.User, &defaultExecUser, passwdPath, groupPath)
+ if err != nil {
+ return err
+ }
+ suppGroups := append(execUser.Sgids, config.Config.AdditionalGroups...)
+ if err := syscall.Setgroups(suppGroups); err != nil {
+ return err
+ }
+ if err := system.Setgid(execUser.Gid); err != nil {
+ return err
+ }
+ if err := system.Setuid(execUser.Uid); err != nil {
+ return err
+ }
+ // if we didn't get HOME already, set it based on the user's HOME
+ if envHome := os.Getenv("HOME"); envHome == "" {
+ if err := os.Setenv("HOME", execUser.Home); err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+// setupNetwork sets up and initializes any network interface inside the container.
+func setupNetwork(config *initConfig) error {
+ for _, config := range config.Networks {
+ strategy, err := getStrategy(config.Type)
+ if err != nil {
+ return err
+ }
+ if err := strategy.initialize(config); err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+func setupRoute(config *configs.Config) error {
+ for _, config := range config.Routes {
+ if err := netlink.AddRoute(config.Destination, config.Source, config.Gateway, config.InterfaceName); err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+func setupRlimits(config *configs.Config) error {
+ for _, rlimit := range config.Rlimits {
+ l := &syscall.Rlimit{Max: rlimit.Hard, Cur: rlimit.Soft}
+ if err := syscall.Setrlimit(rlimit.Type, l); err != nil {
+ return fmt.Errorf("error setting rlimit type %v: %v", rlimit.Type, err)
+ }
+ }
+ return nil
+}
+
+// killCgroupProcesses freezes then iterates over all the processes inside the
+// manager's cgroups sending a SIGKILL to each process then waiting for them to
+// exit.
+func killCgroupProcesses(m cgroups.Manager) error {
+ var procs []*os.Process
+ if err := m.Freeze(configs.Frozen); err != nil {
+ log.Warn(err)
+ }
+ pids, err := m.GetPids()
+ if err != nil {
+ m.Freeze(configs.Thawed)
+ return err
+ }
+ for _, pid := range pids {
+ if p, err := os.FindProcess(pid); err == nil {
+ procs = append(procs, p)
+ if err := p.Kill(); err != nil {
+ log.Warn(err)
+ }
+ }
+ }
+ if err := m.Freeze(configs.Thawed); err != nil {
+ log.Warn(err)
+ }
+ for _, p := range procs {
+ if _, err := p.Wait(); err != nil {
+ log.Warn(err)
+ }
+ }
+ return nil
+}
diff --git a/vendor/src/github.com/docker/libcontainer/integration/exec_test.go b/vendor/src/github.com/docker/libcontainer/integration/exec_test.go
index fb1d1d7a10..12457ba1a2 100644
--- a/vendor/src/github.com/docker/libcontainer/integration/exec_test.go
+++ b/vendor/src/github.com/docker/libcontainer/integration/exec_test.go
@@ -1,34 +1,52 @@
package integration
import (
+ "bytes"
+ "io/ioutil"
"os"
+ "strconv"
"strings"
"testing"
"github.com/docker/libcontainer"
+ "github.com/docker/libcontainer/cgroups/systemd"
+ "github.com/docker/libcontainer/configs"
)
func TestExecPS(t *testing.T) {
+ testExecPS(t, false)
+}
+
+func TestUsernsExecPS(t *testing.T) {
+ if _, err := os.Stat("/proc/self/ns/user"); os.IsNotExist(err) {
+ t.Skip("userns is unsupported")
+ }
+ testExecPS(t, true)
+}
+
+func testExecPS(t *testing.T, userns bool) {
if testing.Short() {
return
}
-
- rootfs, err := newRootFs()
+ rootfs, err := newRootfs()
if err != nil {
t.Fatal(err)
}
defer remove(rootfs)
-
config := newTemplateConfig(rootfs)
+ if userns {
+ config.UidMappings = []configs.IDMap{{0, 0, 1000}}
+ config.GidMappings = []configs.IDMap{{0, 0, 1000}}
+ config.Namespaces = append(config.Namespaces, configs.Namespace{Type: configs.NEWUSER})
+ }
+
buffers, exitCode, err := runContainer(config, "", "ps")
if err != nil {
- t.Fatal(err)
+ t.Fatalf("%s: %s", buffers, err)
}
-
if exitCode != 0 {
t.Fatalf("exit code not 0. code %d stderr %q", exitCode, buffers.Stderr)
}
-
lines := strings.Split(buffers.Stdout.String(), "\n")
if len(lines) < 2 {
t.Fatalf("more than one process running for output %q", buffers.Stdout.String())
@@ -45,7 +63,7 @@ func TestIPCPrivate(t *testing.T) {
return
}
- rootfs, err := newRootFs()
+ rootfs, err := newRootfs()
if err != nil {
t.Fatal(err)
}
@@ -76,7 +94,7 @@ func TestIPCHost(t *testing.T) {
return
}
- rootfs, err := newRootFs()
+ rootfs, err := newRootfs()
if err != nil {
t.Fatal(err)
}
@@ -88,7 +106,7 @@ func TestIPCHost(t *testing.T) {
}
config := newTemplateConfig(rootfs)
- config.Namespaces.Remove(libcontainer.NEWIPC)
+ config.Namespaces.Remove(configs.NEWIPC)
buffers, exitCode, err := runContainer(config, "", "readlink", "/proc/self/ns/ipc")
if err != nil {
t.Fatal(err)
@@ -108,7 +126,7 @@ func TestIPCJoinPath(t *testing.T) {
return
}
- rootfs, err := newRootFs()
+ rootfs, err := newRootfs()
if err != nil {
t.Fatal(err)
}
@@ -120,7 +138,7 @@ func TestIPCJoinPath(t *testing.T) {
}
config := newTemplateConfig(rootfs)
- config.Namespaces.Add(libcontainer.NEWIPC, "/proc/1/ns/ipc")
+ config.Namespaces.Add(configs.NEWIPC, "/proc/1/ns/ipc")
buffers, exitCode, err := runContainer(config, "", "readlink", "/proc/self/ns/ipc")
if err != nil {
@@ -141,14 +159,14 @@ func TestIPCBadPath(t *testing.T) {
return
}
- rootfs, err := newRootFs()
+ rootfs, err := newRootfs()
if err != nil {
t.Fatal(err)
}
defer remove(rootfs)
config := newTemplateConfig(rootfs)
- config.Namespaces.Add(libcontainer.NEWIPC, "/proc/1/ns/ipcc")
+ config.Namespaces.Add(configs.NEWIPC, "/proc/1/ns/ipcc")
_, _, err = runContainer(config, "", "true")
if err == nil {
@@ -161,7 +179,7 @@ func TestRlimit(t *testing.T) {
return
}
- rootfs, err := newRootFs()
+ rootfs, err := newRootfs()
if err != nil {
t.Fatal(err)
}
@@ -172,38 +190,461 @@ func TestRlimit(t *testing.T) {
if err != nil {
t.Fatal(err)
}
- if limit := strings.TrimSpace(out.Stdout.String()); limit != "1024" {
- t.Fatalf("expected rlimit to be 1024, got %s", limit)
+ if limit := strings.TrimSpace(out.Stdout.String()); limit != "1025" {
+ t.Fatalf("expected rlimit to be 1025, got %s", limit)
+ }
+}
+
+func newTestRoot() (string, error) {
+ dir, err := ioutil.TempDir("", "libcontainer")
+ if err != nil {
+ return "", err
+ }
+ if err := os.MkdirAll(dir, 0700); err != nil {
+ return "", err
+ }
+ return dir, nil
+}
+
+func waitProcess(p *libcontainer.Process, t *testing.T) {
+ status, err := p.Wait()
+ if err != nil {
+ t.Fatal(err)
+ }
+ if !status.Success() {
+ t.Fatal(status)
}
}
-func TestPIDNSPrivate(t *testing.T) {
+func TestEnter(t *testing.T) {
if testing.Short() {
return
}
+ root, err := newTestRoot()
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer os.RemoveAll(root)
- rootfs, err := newRootFs()
+ rootfs, err := newRootfs()
if err != nil {
t.Fatal(err)
}
defer remove(rootfs)
- l, err := os.Readlink("/proc/1/ns/pid")
+ config := newTemplateConfig(rootfs)
+
+ factory, err := libcontainer.New(root, libcontainer.Cgroupfs)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ container, err := factory.Create("test", config)
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer container.Destroy()
+
+ // Execute a first process in the container
+ stdinR, stdinW, err := os.Pipe()
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ var stdout, stdout2 bytes.Buffer
+
+ pconfig := libcontainer.Process{
+ Args: []string{"sh", "-c", "cat && readlink /proc/self/ns/pid"},
+ Env: standardEnvironment,
+ Stdin: stdinR,
+ Stdout: &stdout,
+ }
+ err = container.Start(&pconfig)
+ stdinR.Close()
+ defer stdinW.Close()
+ if err != nil {
+ t.Fatal(err)
+ }
+ pid, err := pconfig.Pid()
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // Execute another process in the container
+ stdinR2, stdinW2, err := os.Pipe()
+ if err != nil {
+ t.Fatal(err)
+ }
+ pconfig2 := libcontainer.Process{
+ Env: standardEnvironment,
+ }
+ pconfig2.Args = []string{"sh", "-c", "cat && readlink /proc/self/ns/pid"}
+ pconfig2.Stdin = stdinR2
+ pconfig2.Stdout = &stdout2
+
+ err = container.Start(&pconfig2)
+ stdinR2.Close()
+ defer stdinW2.Close()
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ pid2, err := pconfig2.Pid()
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ processes, err := container.Processes()
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ n := 0
+ for i := range processes {
+ if processes[i] == pid || processes[i] == pid2 {
+ n++
+ }
+ }
+ if n != 2 {
+ t.Fatal("unexpected number of processes", processes, pid, pid2)
+ }
+
+ // Wait processes
+ stdinW2.Close()
+ waitProcess(&pconfig2, t)
+
+ stdinW.Close()
+ waitProcess(&pconfig, t)
+
+ // Check that both processes live in the same pidns
+ pidns := string(stdout.Bytes())
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ pidns2 := string(stdout2.Bytes())
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ if pidns != pidns2 {
+ t.Fatal("The second process isn't in the required pid namespace", pidns, pidns2)
+ }
+}
+
+func TestProcessEnv(t *testing.T) {
+ if testing.Short() {
+ return
+ }
+ root, err := newTestRoot()
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer os.RemoveAll(root)
+
+ rootfs, err := newRootfs()
if err != nil {
t.Fatal(err)
}
+ defer remove(rootfs)
config := newTemplateConfig(rootfs)
- buffers, exitCode, err := runContainer(config, "", "readlink", "/proc/self/ns/pid")
+
+ factory, err := libcontainer.New(root, libcontainer.Cgroupfs)
if err != nil {
t.Fatal(err)
}
- if exitCode != 0 {
- t.Fatalf("exit code not 0. code %d stderr %q", exitCode, buffers.Stderr)
+ container, err := factory.Create("test", config)
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer container.Destroy()
+
+ var stdout bytes.Buffer
+ pconfig := libcontainer.Process{
+ Args: []string{"sh", "-c", "env"},
+ Env: []string{
+ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
+ "HOSTNAME=integration",
+ "TERM=xterm",
+ "FOO=BAR",
+ },
+ Stdin: nil,
+ Stdout: &stdout,
+ }
+ err = container.Start(&pconfig)
+ if err != nil {
+ t.Fatal(err)
}
- if actual := strings.Trim(buffers.Stdout.String(), "\n"); actual == l {
- t.Fatalf("pid link should be private to the container but equals host %q %q", actual, l)
+ // Wait for process
+ waitProcess(&pconfig, t)
+
+ outputEnv := string(stdout.Bytes())
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // Check that the environment has the key/value pair we added
+ if !strings.Contains(outputEnv, "FOO=BAR") {
+ t.Fatal("Environment doesn't have the expected FOO=BAR key/value pair: ", outputEnv)
+ }
+
+ // Make sure that HOME is set
+ if !strings.Contains(outputEnv, "HOME=/root") {
+ t.Fatal("Environment doesn't have HOME set: ", outputEnv)
+ }
+}
+
+func TestProcessCaps(t *testing.T) {
+ if testing.Short() {
+ return
+ }
+ root, err := newTestRoot()
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer os.RemoveAll(root)
+
+ rootfs, err := newRootfs()
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer remove(rootfs)
+
+ config := newTemplateConfig(rootfs)
+
+ factory, err := libcontainer.New(root, libcontainer.Cgroupfs)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ container, err := factory.Create("test", config)
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer container.Destroy()
+
+ processCaps := append(config.Capabilities, "NET_ADMIN")
+
+ var stdout bytes.Buffer
+ pconfig := libcontainer.Process{
+ Args: []string{"sh", "-c", "cat /proc/self/status"},
+ Env: standardEnvironment,
+ Capabilities: processCaps,
+ Stdin: nil,
+ Stdout: &stdout,
+ }
+ err = container.Start(&pconfig)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // Wait for process
+ waitProcess(&pconfig, t)
+
+ outputStatus := string(stdout.Bytes())
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ lines := strings.Split(outputStatus, "\n")
+
+ effectiveCapsLine := ""
+ for _, l := range lines {
+ line := strings.TrimSpace(l)
+ if strings.Contains(line, "CapEff:") {
+ effectiveCapsLine = line
+ break
+ }
+ }
+
+ if effectiveCapsLine == "" {
+ t.Fatal("Couldn't find effective caps: ", outputStatus)
+ }
+
+ parts := strings.Split(effectiveCapsLine, ":")
+ effectiveCapsStr := strings.TrimSpace(parts[1])
+
+ effectiveCaps, err := strconv.ParseUint(effectiveCapsStr, 16, 64)
+ if err != nil {
+ t.Fatal("Could not parse effective caps", err)
+ }
+
+ var netAdminMask uint64
+ var netAdminBit uint
+ netAdminBit = 12 // from capability.h
+ netAdminMask = 1 << netAdminBit
+ if effectiveCaps&netAdminMask != netAdminMask {
+ t.Fatal("CAP_NET_ADMIN is not set as expected")
+ }
+}
+
+func TestFreeze(t *testing.T) {
+ testFreeze(t, false)
+}
+
+func TestSystemdFreeze(t *testing.T) {
+ if !systemd.UseSystemd() {
+ t.Skip("Systemd is unsupported")
+ }
+ testFreeze(t, true)
+}
+
+func testFreeze(t *testing.T, systemd bool) {
+ if testing.Short() {
+ return
+ }
+ root, err := newTestRoot()
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer os.RemoveAll(root)
+
+ rootfs, err := newRootfs()
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer remove(rootfs)
+
+ config := newTemplateConfig(rootfs)
+ if systemd {
+ config.Cgroups.Slice = "system.slice"
+ }
+
+ factory, err := libcontainer.New(root, libcontainer.Cgroupfs)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ container, err := factory.Create("test", config)
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer container.Destroy()
+
+ stdinR, stdinW, err := os.Pipe()
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ pconfig := libcontainer.Process{
+ Args: []string{"cat"},
+ Env: standardEnvironment,
+ Stdin: stdinR,
+ }
+ err = container.Start(&pconfig)
+ stdinR.Close()
+ defer stdinW.Close()
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ pid, err := pconfig.Pid()
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ process, err := os.FindProcess(pid)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ if err := container.Pause(); err != nil {
+ t.Fatal(err)
+ }
+ state, err := container.Status()
+ if err != nil {
+ t.Fatal(err)
+ }
+ if err := container.Resume(); err != nil {
+ t.Fatal(err)
+ }
+ if state != libcontainer.Paused {
+ t.Fatal("Unexpected state: ", state)
+ }
+
+ stdinW.Close()
+ s, err := process.Wait()
+ if err != nil {
+ t.Fatal(err)
+ }
+ if !s.Success() {
+ t.Fatal(s.String())
+ }
+}
+
+func TestContainerState(t *testing.T) {
+ if testing.Short() {
+ return
+ }
+ root, err := newTestRoot()
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer os.RemoveAll(root)
+
+ rootfs, err := newRootfs()
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer remove(rootfs)
+
+ l, err := os.Readlink("/proc/1/ns/ipc")
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ config := newTemplateConfig(rootfs)
+ config.Namespaces = configs.Namespaces([]configs.Namespace{
+ {Type: configs.NEWNS},
+ {Type: configs.NEWUTS},
+ // host for IPC
+ //{Type: configs.NEWIPC},
+ {Type: configs.NEWPID},
+ {Type: configs.NEWNET},
+ })
+
+ factory, err := libcontainer.New(root, libcontainer.Cgroupfs)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ container, err := factory.Create("test", config)
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer container.Destroy()
+
+ stdinR, stdinW, err := os.Pipe()
+ if err != nil {
+ t.Fatal(err)
+ }
+ p := &libcontainer.Process{
+ Args: []string{"cat"},
+ Env: standardEnvironment,
+ Stdin: stdinR,
+ }
+ err = container.Start(p)
+ if err != nil {
+ t.Fatal(err)
+ }
+ stdinR.Close()
+ defer p.Signal(os.Kill)
+
+ st, err := container.State()
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ l1, err := os.Readlink(st.NamespacePaths[configs.NEWIPC])
+ if err != nil {
+ t.Fatal(err)
+ }
+ if l1 != l {
+ t.Fatal("Container using non-host ipc namespace")
}
+ stdinW.Close()
+ p.Wait()
}
diff --git a/vendor/src/github.com/docker/libcontainer/integration/execin_test.go b/vendor/src/github.com/docker/libcontainer/integration/execin_test.go
index 86d9c5c260..252e6e415e 100644
--- a/vendor/src/github.com/docker/libcontainer/integration/execin_test.go
+++ b/vendor/src/github.com/docker/libcontainer/integration/execin_test.go
@@ -1,62 +1,70 @@
package integration
import (
+ "bytes"
+ "io"
"os"
- "os/exec"
"strings"
- "sync"
"testing"
+ "time"
"github.com/docker/libcontainer"
- "github.com/docker/libcontainer/namespaces"
)
func TestExecIn(t *testing.T) {
if testing.Short() {
return
}
-
- rootfs, err := newRootFs()
+ rootfs, err := newRootfs()
if err != nil {
t.Fatal(err)
}
defer remove(rootfs)
-
config := newTemplateConfig(rootfs)
- if err := writeConfig(config); err != nil {
- t.Fatalf("failed to write config %s", err)
+ container, err := newContainer(config)
+ if err != nil {
+ t.Fatal(err)
}
+ defer container.Destroy()
- containerCmd, statePath, containerErr := startLongRunningContainer(config)
- defer func() {
- // kill the container
- if containerCmd.Process != nil {
- containerCmd.Process.Kill()
- }
- if err := <-containerErr; err != nil {
- t.Fatal(err)
- }
- }()
-
- // start the exec process
- state, err := libcontainer.GetState(statePath)
+ // Execute a first process in the container
+ stdinR, stdinW, err := os.Pipe()
if err != nil {
- t.Fatalf("failed to get state %s", err)
+ t.Fatal(err)
}
- buffers := newStdBuffers()
- execErr := make(chan error, 1)
- go func() {
- _, err := namespaces.ExecIn(config, state, []string{"ps"},
- os.Args[0], "exec", buffers.Stdin, buffers.Stdout, buffers.Stderr,
- "", nil)
- execErr <- err
- }()
- if err := <-execErr; err != nil {
- t.Fatalf("exec finished with error %s", err)
+ process := &libcontainer.Process{
+ Args: []string{"cat"},
+ Env: standardEnvironment,
+ Stdin: stdinR,
+ }
+ err = container.Start(process)
+ stdinR.Close()
+ defer stdinW.Close()
+ if err != nil {
+ t.Fatal(err)
}
+ buffers := newStdBuffers()
+ ps := &libcontainer.Process{
+ Args: []string{"ps"},
+ Env: standardEnvironment,
+ Stdin: buffers.Stdin,
+ Stdout: buffers.Stdout,
+ Stderr: buffers.Stderr,
+ }
+ err = container.Start(ps)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if _, err := ps.Wait(); err != nil {
+ t.Fatal(err)
+ }
+ stdinW.Close()
+ if _, err := process.Wait(); err != nil {
+ t.Log(err)
+ }
out := buffers.Stdout.String()
- if !strings.Contains(out, "sleep 10") || !strings.Contains(out, "ps") {
+ if !strings.Contains(out, "cat") || !strings.Contains(out, "ps") {
t.Fatalf("unexpected running process, output %q", out)
}
}
@@ -65,76 +73,244 @@ func TestExecInRlimit(t *testing.T) {
if testing.Short() {
return
}
-
- rootfs, err := newRootFs()
+ rootfs, err := newRootfs()
if err != nil {
t.Fatal(err)
}
defer remove(rootfs)
+ config := newTemplateConfig(rootfs)
+ container, err := newContainer(config)
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer container.Destroy()
+ stdinR, stdinW, err := os.Pipe()
+ if err != nil {
+ t.Fatal(err)
+ }
+ process := &libcontainer.Process{
+ Args: []string{"cat"},
+ Env: standardEnvironment,
+ Stdin: stdinR,
+ }
+ err = container.Start(process)
+ stdinR.Close()
+ defer stdinW.Close()
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ buffers := newStdBuffers()
+ ps := &libcontainer.Process{
+ Args: []string{"/bin/sh", "-c", "ulimit -n"},
+ Env: standardEnvironment,
+ Stdin: buffers.Stdin,
+ Stdout: buffers.Stdout,
+ Stderr: buffers.Stderr,
+ }
+ err = container.Start(ps)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if _, err := ps.Wait(); err != nil {
+ t.Fatal(err)
+ }
+ stdinW.Close()
+ if _, err := process.Wait(); err != nil {
+ t.Log(err)
+ }
+ out := buffers.Stdout.String()
+ if limit := strings.TrimSpace(out); limit != "1025" {
+ t.Fatalf("expected rlimit to be 1025, got %s", limit)
+ }
+}
+
+func TestExecInError(t *testing.T) {
+ if testing.Short() {
+ return
+ }
+ rootfs, err := newRootfs()
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer remove(rootfs)
config := newTemplateConfig(rootfs)
- if err := writeConfig(config); err != nil {
- t.Fatalf("failed to write config %s", err)
+ container, err := newContainer(config)
+ if err != nil {
+ t.Fatal(err)
}
+ defer container.Destroy()
- containerCmd, statePath, containerErr := startLongRunningContainer(config)
+ // Execute a first process in the container
+ stdinR, stdinW, err := os.Pipe()
+ if err != nil {
+ t.Fatal(err)
+ }
+ process := &libcontainer.Process{
+ Args: []string{"cat"},
+ Env: standardEnvironment,
+ Stdin: stdinR,
+ }
+ err = container.Start(process)
+ stdinR.Close()
defer func() {
- // kill the container
- if containerCmd.Process != nil {
- containerCmd.Process.Kill()
- }
- if err := <-containerErr; err != nil {
- t.Fatal(err)
+ stdinW.Close()
+ if _, err := process.Wait(); err != nil {
+ t.Log(err)
}
}()
-
- // start the exec process
- state, err := libcontainer.GetState(statePath)
if err != nil {
- t.Fatalf("failed to get state %s", err)
- }
- buffers := newStdBuffers()
- execErr := make(chan error, 1)
- go func() {
- _, err := namespaces.ExecIn(config, state, []string{"/bin/sh", "-c", "ulimit -n"},
- os.Args[0], "exec", buffers.Stdin, buffers.Stdout, buffers.Stderr,
- "", nil)
- execErr <- err
- }()
- if err := <-execErr; err != nil {
- t.Fatalf("exec finished with error %s", err)
+ t.Fatal(err)
}
- out := buffers.Stdout.String()
- if limit := strings.TrimSpace(out); limit != "1024" {
- t.Fatalf("expected rlimit to be 1024, got %s", limit)
+ unexistent := &libcontainer.Process{
+ Args: []string{"unexistent"},
+ Env: standardEnvironment,
+ }
+ err = container.Start(unexistent)
+ if err == nil {
+ t.Fatal("Should be an error")
+ }
+ if !strings.Contains(err.Error(), "executable file not found") {
+ t.Fatalf("Should be error about not found executable, got %s", err)
}
}
-// start a long-running container so we have time to inspect execin processes
-func startLongRunningContainer(config *libcontainer.Config) (*exec.Cmd, string, chan error) {
- containerErr := make(chan error, 1)
- containerCmd := &exec.Cmd{}
- var statePath string
+func TestExecInTTY(t *testing.T) {
+ if testing.Short() {
+ return
+ }
+ rootfs, err := newRootfs()
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer remove(rootfs)
+ config := newTemplateConfig(rootfs)
+ container, err := newContainer(config)
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer container.Destroy()
- createCmd := func(container *libcontainer.Config, console, dataPath, init string,
- pipe *os.File, args []string) *exec.Cmd {
- containerCmd = namespaces.DefaultCreateCommand(container, console, dataPath, init, pipe, args)
- statePath = dataPath
- return containerCmd
+ // Execute a first process in the container
+ stdinR, stdinW, err := os.Pipe()
+ if err != nil {
+ t.Fatal(err)
+ }
+ process := &libcontainer.Process{
+ Args: []string{"cat"},
+ Env: standardEnvironment,
+ Stdin: stdinR,
+ }
+ err = container.Start(process)
+ stdinR.Close()
+ defer stdinW.Close()
+ if err != nil {
+ t.Fatal(err)
}
- var containerStart sync.WaitGroup
- containerStart.Add(1)
+ var stdout bytes.Buffer
+ ps := &libcontainer.Process{
+ Args: []string{"ps"},
+ Env: standardEnvironment,
+ }
+ console, err := ps.NewConsole(0)
+ copy := make(chan struct{})
go func() {
- buffers := newStdBuffers()
- _, err := namespaces.Exec(config,
- buffers.Stdin, buffers.Stdout, buffers.Stderr,
- "", config.RootFs, []string{"sleep", "10"},
- createCmd, containerStart.Done)
- containerErr <- err
+ io.Copy(&stdout, console)
+ close(copy)
}()
- containerStart.Wait()
+ if err != nil {
+ t.Fatal(err)
+ }
+ err = container.Start(ps)
+ if err != nil {
+ t.Fatal(err)
+ }
+ select {
+ case <-time.After(5 * time.Second):
+ t.Fatal("Waiting for copy timed out")
+ case <-copy:
+ }
+ if _, err := ps.Wait(); err != nil {
+ t.Fatal(err)
+ }
+ stdinW.Close()
+ if _, err := process.Wait(); err != nil {
+ t.Log(err)
+ }
+ out := stdout.String()
+ if !strings.Contains(out, "cat") || !strings.Contains(string(out), "ps") {
+ t.Fatalf("unexpected running process, output %q", out)
+ }
+}
- return containerCmd, statePath, containerErr
+func TestExecInEnvironment(t *testing.T) {
+ if testing.Short() {
+ return
+ }
+ rootfs, err := newRootfs()
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer remove(rootfs)
+ config := newTemplateConfig(rootfs)
+ container, err := newContainer(config)
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer container.Destroy()
+
+ // Execute a first process in the container
+ stdinR, stdinW, err := os.Pipe()
+ if err != nil {
+ t.Fatal(err)
+ }
+ process := &libcontainer.Process{
+ Args: []string{"cat"},
+ Env: standardEnvironment,
+ Stdin: stdinR,
+ }
+ err = container.Start(process)
+ stdinR.Close()
+ defer stdinW.Close()
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ buffers := newStdBuffers()
+ process2 := &libcontainer.Process{
+ Args: []string{"env"},
+ Env: []string{
+ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
+ "DEBUG=true",
+ "DEBUG=false",
+ "ENV=test",
+ },
+ Stdin: buffers.Stdin,
+ Stdout: buffers.Stdout,
+ Stderr: buffers.Stderr,
+ }
+ err = container.Start(process2)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if _, err := process2.Wait(); err != nil {
+ out := buffers.Stdout.String()
+ t.Fatal(err, out)
+ }
+ stdinW.Close()
+ if _, err := process.Wait(); err != nil {
+ t.Log(err)
+ }
+ out := buffers.Stdout.String()
+ // check execin's process environment
+ if !strings.Contains(out, "DEBUG=false") ||
+ !strings.Contains(out, "ENV=test") ||
+ !strings.Contains(out, "HOME=/root") ||
+ !strings.Contains(out, "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin") ||
+ strings.Contains(out, "DEBUG=true") {
+ t.Fatalf("unexpected running process, output %q", out)
+ }
}
diff --git a/vendor/src/github.com/docker/libcontainer/integration/init_test.go b/vendor/src/github.com/docker/libcontainer/integration/init_test.go
index 3106a5fb1e..f11834de34 100644
--- a/vendor/src/github.com/docker/libcontainer/integration/init_test.go
+++ b/vendor/src/github.com/docker/libcontainer/integration/init_test.go
@@ -1,76 +1,27 @@
package integration
import (
- "encoding/json"
"log"
"os"
"runtime"
"github.com/docker/libcontainer"
- "github.com/docker/libcontainer/namespaces"
- _ "github.com/docker/libcontainer/namespaces/nsenter"
+ _ "github.com/docker/libcontainer/nsenter"
)
// init runs the libcontainer initialization code because of the busybox style needs
// to work around the go runtime and the issues with forking
func init() {
- if len(os.Args) < 2 {
+ if len(os.Args) < 2 || os.Args[1] != "init" {
return
}
- // handle init
- if len(os.Args) >= 2 && os.Args[1] == "init" {
- runtime.LockOSThread()
-
- container, err := loadConfig()
- if err != nil {
- log.Fatal(err)
- }
-
- rootfs, err := os.Getwd()
- if err != nil {
- log.Fatal(err)
- }
-
- if err := namespaces.Init(container, rootfs, "", os.NewFile(3, "pipe"), os.Args[3:]); err != nil {
- log.Fatalf("unable to initialize for container: %s", err)
- }
- os.Exit(1)
+ runtime.GOMAXPROCS(1)
+ runtime.LockOSThread()
+ factory, err := libcontainer.New("")
+ if err != nil {
+ log.Fatalf("unable to initialize for container: %s", err)
}
-
- // handle execin
- if len(os.Args) >= 2 && os.Args[0] == "nsenter-exec" {
- runtime.LockOSThread()
-
- // User args are passed after '--' in the command line.
- userArgs := findUserArgs()
-
- config, err := loadConfigFromFd()
- if err != nil {
- log.Fatalf("docker-exec: unable to receive config from sync pipe: %s", err)
- }
-
- if err := namespaces.FinalizeSetns(config, userArgs); err != nil {
- log.Fatalf("docker-exec: failed to exec: %s", err)
- }
- os.Exit(1)
- }
-}
-
-func findUserArgs() []string {
- for i, a := range os.Args {
- if a == "--" {
- return os.Args[i+1:]
- }
- }
- return []string{}
-}
-
-// loadConfigFromFd loads a container's config from the sync pipe that is provided by
-// fd 3 when running a process
-func loadConfigFromFd() (*libcontainer.Config, error) {
- var config *libcontainer.Config
- if err := json.NewDecoder(os.NewFile(3, "child")).Decode(&config); err != nil {
- return nil, err
+ if err := factory.StartInitialization(3); err != nil {
+ log.Fatal(err)
}
- return config, nil
}
diff --git a/vendor/src/github.com/docker/libcontainer/integration/template_test.go b/vendor/src/github.com/docker/libcontainer/integration/template_test.go
index 98846eb199..cb991b4170 100644
--- a/vendor/src/github.com/docker/libcontainer/integration/template_test.go
+++ b/vendor/src/github.com/docker/libcontainer/integration/template_test.go
@@ -3,19 +3,25 @@ package integration
import (
"syscall"
- "github.com/docker/libcontainer"
- "github.com/docker/libcontainer/cgroups"
- "github.com/docker/libcontainer/devices"
+ "github.com/docker/libcontainer/configs"
)
+var standardEnvironment = []string{
+ "HOME=/root",
+ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
+ "HOSTNAME=integration",
+ "TERM=xterm",
+}
+
+const defaultMountFlags = syscall.MS_NOEXEC | syscall.MS_NOSUID | syscall.MS_NODEV
+
// newTemplateConfig returns a base template for running a container
//
// it uses a network strategy of just setting a loopback interface
// and the default setup for devices
-func newTemplateConfig(rootfs string) *libcontainer.Config {
- return &libcontainer.Config{
- RootFs: rootfs,
- Tty: false,
+func newTemplateConfig(rootfs string) *configs.Config {
+ return &configs.Config{
+ Rootfs: rootfs,
Capabilities: []string{
"CHOWN",
"DAC_OVERRIDE",
@@ -32,41 +38,80 @@ func newTemplateConfig(rootfs string) *libcontainer.Config {
"KILL",
"AUDIT_WRITE",
},
- Namespaces: libcontainer.Namespaces([]libcontainer.Namespace{
- {Type: libcontainer.NEWNS},
- {Type: libcontainer.NEWUTS},
- {Type: libcontainer.NEWIPC},
- {Type: libcontainer.NEWPID},
- {Type: libcontainer.NEWNET},
+ Namespaces: configs.Namespaces([]configs.Namespace{
+ {Type: configs.NEWNS},
+ {Type: configs.NEWUTS},
+ {Type: configs.NEWIPC},
+ {Type: configs.NEWPID},
+ {Type: configs.NEWNET},
}),
- Cgroups: &cgroups.Cgroup{
+ Cgroups: &configs.Cgroup{
+ Name: "test",
Parent: "integration",
AllowAllDevices: false,
- AllowedDevices: devices.DefaultAllowedDevices,
+ AllowedDevices: configs.DefaultAllowedDevices,
},
-
- MountConfig: &libcontainer.MountConfig{
- DeviceNodes: devices.DefaultAutoCreatedDevices,
+ MaskPaths: []string{
+ "/proc/kcore",
+ },
+ ReadonlyPaths: []string{
+ "/proc/sys", "/proc/sysrq-trigger", "/proc/irq", "/proc/bus",
},
+ Devices: configs.DefaultAutoCreatedDevices,
Hostname: "integration",
- Env: []string{
- "HOME=/root",
- "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
- "HOSTNAME=integration",
- "TERM=xterm",
+ Mounts: []*configs.Mount{
+ {
+ Source: "proc",
+ Destination: "/proc",
+ Device: "proc",
+ Flags: defaultMountFlags,
+ },
+ {
+ Source: "tmpfs",
+ Destination: "/dev",
+ Device: "tmpfs",
+ Flags: syscall.MS_NOSUID | syscall.MS_STRICTATIME,
+ Data: "mode=755",
+ },
+ {
+ Source: "devpts",
+ Destination: "/dev/pts",
+ Device: "devpts",
+ Flags: syscall.MS_NOSUID | syscall.MS_NOEXEC,
+ Data: "newinstance,ptmxmode=0666,mode=0620,gid=5",
+ },
+ {
+ Device: "tmpfs",
+ Source: "shm",
+ Destination: "/dev/shm",
+ Data: "mode=1777,size=65536k",
+ Flags: defaultMountFlags,
+ },
+ {
+ Source: "mqueue",
+ Destination: "/dev/mqueue",
+ Device: "mqueue",
+ Flags: defaultMountFlags,
+ },
+ {
+ Source: "sysfs",
+ Destination: "/sys",
+ Device: "sysfs",
+ Flags: defaultMountFlags | syscall.MS_RDONLY,
+ },
},
- Networks: []*libcontainer.Network{
+ Networks: []*configs.Network{
{
Type: "loopback",
Address: "127.0.0.1/0",
Gateway: "localhost",
},
},
- Rlimits: []libcontainer.Rlimit{
+ Rlimits: []configs.Rlimit{
{
Type: syscall.RLIMIT_NOFILE,
- Hard: uint64(1024),
- Soft: uint64(1024),
+ Hard: uint64(1025),
+ Soft: uint64(1025),
},
},
}
diff --git a/vendor/src/github.com/docker/libcontainer/integration/utils_test.go b/vendor/src/github.com/docker/libcontainer/integration/utils_test.go
index 6393fb9982..cf4596864e 100644
--- a/vendor/src/github.com/docker/libcontainer/integration/utils_test.go
+++ b/vendor/src/github.com/docker/libcontainer/integration/utils_test.go
@@ -2,15 +2,15 @@ package integration
import (
"bytes"
- "encoding/json"
"fmt"
"io/ioutil"
"os"
"os/exec"
- "path/filepath"
+ "strings"
+ "syscall"
"github.com/docker/libcontainer"
- "github.com/docker/libcontainer/namespaces"
+ "github.com/docker/libcontainer/configs"
)
func newStdBuffers() *stdBuffers {
@@ -27,31 +27,19 @@ type stdBuffers struct {
Stderr *bytes.Buffer
}
-func writeConfig(config *libcontainer.Config) error {
- f, err := os.OpenFile(filepath.Join(config.RootFs, "container.json"), os.O_CREATE|os.O_RDWR|os.O_TRUNC, 0700)
- if err != nil {
- return err
+func (b *stdBuffers) String() string {
+ s := []string{}
+ if b.Stderr != nil {
+ s = append(s, b.Stderr.String())
}
- defer f.Close()
- return json.NewEncoder(f).Encode(config)
-}
-
-func loadConfig() (*libcontainer.Config, error) {
- f, err := os.Open(filepath.Join(os.Getenv("data_path"), "container.json"))
- if err != nil {
- return nil, err
- }
- defer f.Close()
-
- var container *libcontainer.Config
- if err := json.NewDecoder(f).Decode(&container); err != nil {
- return nil, err
+ if b.Stdout != nil {
+ s = append(s, b.Stdout.String())
}
- return container, nil
+ return strings.Join(s, "|")
}
-// newRootFs creates a new tmp directory and copies the busybox root filesystem
-func newRootFs() (string, error) {
+// newRootfs creates a new tmp directory and copies the busybox root filesystem
+func newRootfs() (string, error) {
dir, err := ioutil.TempDir("", "")
if err != nil {
return "", err
@@ -79,17 +67,56 @@ func copyBusybox(dest string) error {
return nil
}
+func newContainer(config *configs.Config) (libcontainer.Container, error) {
+ cgm := libcontainer.Cgroupfs
+ if config.Cgroups != nil && config.Cgroups.Slice == "system.slice" {
+ cgm = libcontainer.SystemdCgroups
+ }
+
+ factory, err := libcontainer.New(".",
+ libcontainer.InitArgs(os.Args[0], "init", "--"),
+ cgm,
+ )
+ if err != nil {
+ return nil, err
+ }
+ return factory.Create("testCT", config)
+}
+
// runContainer runs the container with the specific config and arguments
//
// buffers are returned containing the STDOUT and STDERR output for the run
// along with the exit code and any go error
-func runContainer(config *libcontainer.Config, console string, args ...string) (buffers *stdBuffers, exitCode int, err error) {
- if err := writeConfig(config); err != nil {
+func runContainer(config *configs.Config, console string, args ...string) (buffers *stdBuffers, exitCode int, err error) {
+ container, err := newContainer(config)
+ if err != nil {
return nil, -1, err
}
-
+ defer container.Destroy()
buffers = newStdBuffers()
- exitCode, err = namespaces.Exec(config, buffers.Stdin, buffers.Stdout, buffers.Stderr,
- console, config.RootFs, args, namespaces.DefaultCreateCommand, nil)
+ process := &libcontainer.Process{
+ Args: args,
+ Env: standardEnvironment,
+ Stdin: buffers.Stdin,
+ Stdout: buffers.Stdout,
+ Stderr: buffers.Stderr,
+ }
+
+ err = container.Start(process)
+ if err != nil {
+ return nil, -1, err
+ }
+ ps, err := process.Wait()
+ if err != nil {
+ return nil, -1, err
+ }
+ status := ps.Sys().(syscall.WaitStatus)
+ if status.Exited() {
+ exitCode = status.ExitStatus()
+ } else if status.Signaled() {
+ exitCode = -int(status.Signal())
+ } else {
+ return nil, -1, err
+ }
return
}
diff --git a/vendor/src/github.com/docker/libcontainer/mount/init.go b/vendor/src/github.com/docker/libcontainer/mount/init.go
deleted file mode 100644
index a2c3d52026..0000000000
--- a/vendor/src/github.com/docker/libcontainer/mount/init.go
+++ /dev/null
@@ -1,209 +0,0 @@
-// +build linux
-
-package mount
-
-import (
- "fmt"
- "os"
- "path/filepath"
- "syscall"
-
- "github.com/docker/libcontainer/label"
- "github.com/docker/libcontainer/mount/nodes"
-)
-
-// default mount point flags
-const defaultMountFlags = syscall.MS_NOEXEC | syscall.MS_NOSUID | syscall.MS_NODEV
-
-type mount struct {
- source string
- path string
- device string
- flags int
- data string
-}
-
-// InitializeMountNamespace sets up the devices, mount points, and filesystems for use inside a
-// new mount namespace.
-func InitializeMountNamespace(rootfs, console string, sysReadonly bool, mountConfig *MountConfig) error {
- var (
- err error
- flag = syscall.MS_PRIVATE
- )
-
- if mountConfig.NoPivotRoot {
- flag = syscall.MS_SLAVE
- }
-
- if err := syscall.Mount("", "/", "", uintptr(flag|syscall.MS_REC), ""); err != nil {
- return fmt.Errorf("mounting / with flags %X %s", (flag | syscall.MS_REC), err)
- }
-
- if err := syscall.Mount(rootfs, rootfs, "bind", syscall.MS_BIND|syscall.MS_REC, ""); err != nil {
- return fmt.Errorf("mouting %s as bind %s", rootfs, err)
- }
-
- if err := mountSystem(rootfs, sysReadonly, mountConfig); err != nil {
- return fmt.Errorf("mount system %s", err)
- }
-
- // apply any user specified mounts within the new mount namespace
- for _, m := range mountConfig.Mounts {
- if err := m.Mount(rootfs, mountConfig.MountLabel); err != nil {
- return err
- }
- }
-
- if err := nodes.CreateDeviceNodes(rootfs, mountConfig.DeviceNodes); err != nil {
- return fmt.Errorf("create device nodes %s", err)
- }
-
- if err := SetupPtmx(rootfs, console, mountConfig.MountLabel); err != nil {
- return err
- }
-
- // stdin, stdout and stderr could be pointing to /dev/null from parent namespace.
- // Re-open them inside this namespace.
- if err := reOpenDevNull(rootfs); err != nil {
- return fmt.Errorf("Failed to reopen /dev/null %s", err)
- }
-
- if err := setupDevSymlinks(rootfs); err != nil {
- return fmt.Errorf("dev symlinks %s", err)
- }
-
- if err := syscall.Chdir(rootfs); err != nil {
- return fmt.Errorf("chdir into %s %s", rootfs, err)
- }
-
- if mountConfig.NoPivotRoot {
- err = MsMoveRoot(rootfs)
- } else {
- err = PivotRoot(rootfs)
- }
-
- if err != nil {
- return err
- }
-
- if mountConfig.ReadonlyFs {
- if err := SetReadonly(); err != nil {
- return fmt.Errorf("set readonly %s", err)
- }
- }
-
- syscall.Umask(0022)
-
- return nil
-}
-
-// mountSystem sets up linux specific system mounts like mqueue, sys, proc, shm, and devpts
-// inside the mount namespace
-func mountSystem(rootfs string, sysReadonly bool, mountConfig *MountConfig) error {
- for _, m := range newSystemMounts(rootfs, mountConfig.MountLabel, sysReadonly) {
- if err := os.MkdirAll(m.path, 0755); err != nil && !os.IsExist(err) {
- return fmt.Errorf("mkdirall %s %s", m.path, err)
- }
- if err := syscall.Mount(m.source, m.path, m.device, uintptr(m.flags), m.data); err != nil {
- return fmt.Errorf("mounting %s into %s %s", m.source, m.path, err)
- }
- }
- return nil
-}
-
-func createIfNotExists(path string, isDir bool) error {
- if _, err := os.Stat(path); err != nil {
- if os.IsNotExist(err) {
- if isDir {
- if err := os.MkdirAll(path, 0755); err != nil {
- return err
- }
- } else {
- if err := os.MkdirAll(filepath.Dir(path), 0755); err != nil {
- return err
- }
- f, err := os.OpenFile(path, os.O_CREATE, 0755)
- if err != nil {
- return err
- }
- f.Close()
- }
- }
- }
- return nil
-}
-
-func setupDevSymlinks(rootfs string) error {
- var links = [][2]string{
- {"/proc/self/fd", "/dev/fd"},
- {"/proc/self/fd/0", "/dev/stdin"},
- {"/proc/self/fd/1", "/dev/stdout"},
- {"/proc/self/fd/2", "/dev/stderr"},
- }
-
- // kcore support can be toggled with CONFIG_PROC_KCORE; only create a symlink
- // in /dev if it exists in /proc.
- if _, err := os.Stat("/proc/kcore"); err == nil {
- links = append(links, [2]string{"/proc/kcore", "/dev/kcore"})
- }
-
- for _, link := range links {
- var (
- src = link[0]
- dst = filepath.Join(rootfs, link[1])
- )
-
- if err := os.Symlink(src, dst); err != nil && !os.IsExist(err) {
- return fmt.Errorf("symlink %s %s %s", src, dst, err)
- }
- }
-
- return nil
-}
-
-// TODO: this is crappy right now and should be cleaned up with a better way of handling system and
-// standard bind mounts allowing them to be more dynamic
-func newSystemMounts(rootfs, mountLabel string, sysReadonly bool) []mount {
- systemMounts := []mount{
- {source: "proc", path: filepath.Join(rootfs, "proc"), device: "proc", flags: defaultMountFlags},
- {source: "tmpfs", path: filepath.Join(rootfs, "dev"), device: "tmpfs", flags: syscall.MS_NOSUID | syscall.MS_STRICTATIME, data: label.FormatMountLabel("mode=755", mountLabel)},
- {source: "shm", path: filepath.Join(rootfs, "dev", "shm"), device: "tmpfs", flags: defaultMountFlags, data: label.FormatMountLabel("mode=1777,size=65536k", mountLabel)},
- {source: "mqueue", path: filepath.Join(rootfs, "dev", "mqueue"), device: "mqueue", flags: defaultMountFlags},
- {source: "devpts", path: filepath.Join(rootfs, "dev", "pts"), device: "devpts", flags: syscall.MS_NOSUID | syscall.MS_NOEXEC, data: label.FormatMountLabel("newinstance,ptmxmode=0666,mode=620,gid=5", mountLabel)},
- }
-
- sysMountFlags := defaultMountFlags
- if sysReadonly {
- sysMountFlags |= syscall.MS_RDONLY
- }
-
- systemMounts = append(systemMounts, mount{source: "sysfs", path: filepath.Join(rootfs, "sys"), device: "sysfs", flags: sysMountFlags})
-
- return systemMounts
-}
-
-// Is stdin, stdout or stderr were to be pointing to '/dev/null',
-// this method will make them point to '/dev/null' from within this namespace.
-func reOpenDevNull(rootfs string) error {
- var stat, devNullStat syscall.Stat_t
- file, err := os.Open(filepath.Join(rootfs, "/dev/null"))
- if err != nil {
- return fmt.Errorf("Failed to open /dev/null - %s", err)
- }
- defer file.Close()
- if err = syscall.Fstat(int(file.Fd()), &devNullStat); err != nil {
- return fmt.Errorf("Failed to stat /dev/null - %s", err)
- }
- for fd := 0; fd < 3; fd++ {
- if err = syscall.Fstat(fd, &stat); err != nil {
- return fmt.Errorf("Failed to stat fd %d - %s", fd, err)
- }
- if stat.Rdev == devNullStat.Rdev {
- // Close and re-open the fd.
- if err = syscall.Dup2(int(file.Fd()), fd); err != nil {
- return fmt.Errorf("Failed to dup fd %d to fd %d - %s", file.Fd(), fd, err)
- }
- }
- }
- return nil
-}
diff --git a/vendor/src/github.com/docker/libcontainer/mount/mount.go b/vendor/src/github.com/docker/libcontainer/mount/mount.go
deleted file mode 100644
index c1b424214f..0000000000
--- a/vendor/src/github.com/docker/libcontainer/mount/mount.go
+++ /dev/null
@@ -1,109 +0,0 @@
-package mount
-
-import (
- "fmt"
- "os"
- "path/filepath"
- "syscall"
-
- "github.com/docker/docker/pkg/symlink"
- "github.com/docker/libcontainer/label"
-)
-
-type Mount struct {
- Type string `json:"type,omitempty"`
- Source string `json:"source,omitempty"` // Source path, in the host namespace
- Destination string `json:"destination,omitempty"` // Destination path, in the container
- Writable bool `json:"writable,omitempty"`
- Relabel string `json:"relabel,omitempty"` // Relabel source if set, "z" indicates shared, "Z" indicates unshared
- Private bool `json:"private,omitempty"`
- Slave bool `json:"slave,omitempty"`
-}
-
-func (m *Mount) Mount(rootfs, mountLabel string) error {
- switch m.Type {
- case "bind":
- return m.bindMount(rootfs, mountLabel)
- case "tmpfs":
- return m.tmpfsMount(rootfs, mountLabel)
- default:
- return fmt.Errorf("unsupported mount type %s for %s", m.Type, m.Destination)
- }
-}
-
-func (m *Mount) bindMount(rootfs, mountLabel string) error {
- var (
- flags = syscall.MS_BIND | syscall.MS_REC
- dest = filepath.Join(rootfs, m.Destination)
- )
-
- if !m.Writable {
- flags = flags | syscall.MS_RDONLY
- }
-
- if m.Slave {
- flags = flags | syscall.MS_SLAVE
- }
-
- stat, err := os.Stat(m.Source)
- if err != nil {
- return err
- }
-
- // FIXME: (crosbymichael) This does not belong here and should be done a layer above
- dest, err = symlink.FollowSymlinkInScope(dest, rootfs)
- if err != nil {
- return err
- }
-
- if err := createIfNotExists(dest, stat.IsDir()); err != nil {
- return fmt.Errorf("creating new bind mount target %s", err)
- }
-
- if err := syscall.Mount(m.Source, dest, "bind", uintptr(flags), ""); err != nil {
- return fmt.Errorf("mounting %s into %s %s", m.Source, dest, err)
- }
-
- if !m.Writable {
- if err := syscall.Mount(m.Source, dest, "bind", uintptr(flags|syscall.MS_REMOUNT), ""); err != nil {
- return fmt.Errorf("remounting %s into %s %s", m.Source, dest, err)
- }
- }
-
- if m.Relabel != "" {
- if err := label.Relabel(m.Source, mountLabel, m.Relabel); err != nil {
- return fmt.Errorf("relabeling %s to %s %s", m.Source, mountLabel, err)
- }
- }
-
- if m.Private {
- if err := syscall.Mount("", dest, "none", uintptr(syscall.MS_PRIVATE), ""); err != nil {
- return fmt.Errorf("mounting %s private %s", dest, err)
- }
- }
-
- return nil
-}
-
-func (m *Mount) tmpfsMount(rootfs, mountLabel string) error {
- var (
- err error
- l = label.FormatMountLabel("", mountLabel)
- dest = filepath.Join(rootfs, m.Destination)
- )
-
- // FIXME: (crosbymichael) This does not belong here and should be done a layer above
- if dest, err = symlink.FollowSymlinkInScope(dest, rootfs); err != nil {
- return err
- }
-
- if err := createIfNotExists(dest, true); err != nil {
- return fmt.Errorf("creating new tmpfs mount target %s", err)
- }
-
- if err := syscall.Mount("tmpfs", dest, "tmpfs", uintptr(defaultMountFlags), l); err != nil {
- return fmt.Errorf("%s mounting %s in tmpfs", err, dest)
- }
-
- return nil
-}
diff --git a/vendor/src/github.com/docker/libcontainer/mount/mount_config.go b/vendor/src/github.com/docker/libcontainer/mount/mount_config.go
deleted file mode 100644
index eef9b8ce4d..0000000000
--- a/vendor/src/github.com/docker/libcontainer/mount/mount_config.go
+++ /dev/null
@@ -1,28 +0,0 @@
-package mount
-
-import (
- "errors"
-
- "github.com/docker/libcontainer/devices"
-)
-
-var ErrUnsupported = errors.New("Unsupported method")
-
-type MountConfig struct {
- // NoPivotRoot will use MS_MOVE and a chroot to jail the process into the container's rootfs
- // This is a common option when the container is running in ramdisk
- NoPivotRoot bool `json:"no_pivot_root,omitempty"`
-
- // ReadonlyFs will remount the container's rootfs as readonly where only externally mounted
- // bind mounts are writtable
- ReadonlyFs bool `json:"readonly_fs,omitempty"`
-
- // Mounts specify additional source and destination paths that will be mounted inside the container's
- // rootfs and mount namespace if specified
- Mounts []*Mount `json:"mounts,omitempty"`
-
- // The device nodes that should be automatically created within the container upon container start. Note, make sure that the node is marked as allowed in the cgroup as well!
- DeviceNodes []*devices.Device `json:"device_nodes,omitempty"`
-
- MountLabel string `json:"mount_label,omitempty"`
-}
diff --git a/vendor/src/github.com/docker/libcontainer/mount/msmoveroot.go b/vendor/src/github.com/docker/libcontainer/mount/msmoveroot.go
deleted file mode 100644
index 94afd3a99c..0000000000
--- a/vendor/src/github.com/docker/libcontainer/mount/msmoveroot.go
+++ /dev/null
@@ -1,20 +0,0 @@
-// +build linux
-
-package mount
-
-import (
- "fmt"
- "syscall"
-)
-
-func MsMoveRoot(rootfs string) error {
- if err := syscall.Mount(rootfs, "/", "", syscall.MS_MOVE, ""); err != nil {
- return fmt.Errorf("mount move %s into / %s", rootfs, err)
- }
-
- if err := syscall.Chroot("."); err != nil {
- return fmt.Errorf("chroot . %s", err)
- }
-
- return syscall.Chdir("/")
-}
diff --git a/vendor/src/github.com/docker/libcontainer/mount/nodes/nodes.go b/vendor/src/github.com/docker/libcontainer/mount/nodes/nodes.go
deleted file mode 100644
index 322c0c0ee2..0000000000
--- a/vendor/src/github.com/docker/libcontainer/mount/nodes/nodes.go
+++ /dev/null
@@ -1,57 +0,0 @@
-// +build linux
-
-package nodes
-
-import (
- "fmt"
- "os"
- "path/filepath"
- "syscall"
-
- "github.com/docker/libcontainer/devices"
-)
-
-// Create the device nodes in the container.
-func CreateDeviceNodes(rootfs string, nodesToCreate []*devices.Device) error {
- oldMask := syscall.Umask(0000)
- defer syscall.Umask(oldMask)
-
- for _, node := range nodesToCreate {
- if err := CreateDeviceNode(rootfs, node); err != nil {
- return err
- }
- }
- return nil
-}
-
-// Creates the device node in the rootfs of the container.
-func CreateDeviceNode(rootfs string, node *devices.Device) error {
- var (
- dest = filepath.Join(rootfs, node.Path)
- parent = filepath.Dir(dest)
- )
-
- if err := os.MkdirAll(parent, 0755); err != nil {
- return err
- }
-
- fileMode := node.FileMode
- switch node.Type {
- case 'c':
- fileMode |= syscall.S_IFCHR
- case 'b':
- fileMode |= syscall.S_IFBLK
- default:
- return fmt.Errorf("%c is not a valid device type for device %s", node.Type, node.Path)
- }
-
- if err := syscall.Mknod(dest, uint32(fileMode), devices.Mkdev(node.MajorNumber, node.MinorNumber)); err != nil && !os.IsExist(err) {
- return fmt.Errorf("mknod %s %s", node.Path, err)
- }
-
- if err := syscall.Chown(dest, int(node.Uid), int(node.Gid)); err != nil {
- return fmt.Errorf("chown %s to %d:%d", node.Path, node.Uid, node.Gid)
- }
-
- return nil
-}
diff --git a/vendor/src/github.com/docker/libcontainer/mount/nodes/nodes_unsupported.go b/vendor/src/github.com/docker/libcontainer/mount/nodes/nodes_unsupported.go
deleted file mode 100644
index 83660715d4..0000000000
--- a/vendor/src/github.com/docker/libcontainer/mount/nodes/nodes_unsupported.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// +build !linux
-
-package nodes
-
-import (
- "errors"
-
- "github.com/docker/libcontainer/devices"
-)
-
-func CreateDeviceNodes(rootfs string, nodesToCreate []*devices.Device) error {
- return errors.New("Unsupported method")
-}
diff --git a/vendor/src/github.com/docker/libcontainer/mount/pivotroot.go b/vendor/src/github.com/docker/libcontainer/mount/pivotroot.go
deleted file mode 100644
index a88ed4a84c..0000000000
--- a/vendor/src/github.com/docker/libcontainer/mount/pivotroot.go
+++ /dev/null
@@ -1,34 +0,0 @@
-// +build linux
-
-package mount
-
-import (
- "fmt"
- "io/ioutil"
- "os"
- "path/filepath"
- "syscall"
-)
-
-func PivotRoot(rootfs string) error {
- pivotDir, err := ioutil.TempDir(rootfs, ".pivot_root")
- if err != nil {
- return fmt.Errorf("can't create pivot_root dir %s, error %v", pivotDir, err)
- }
-
- if err := syscall.PivotRoot(rootfs, pivotDir); err != nil {
- return fmt.Errorf("pivot_root %s", err)
- }
-
- if err := syscall.Chdir("/"); err != nil {
- return fmt.Errorf("chdir / %s", err)
- }
-
- // path to pivot dir now changed, update
- pivotDir = filepath.Join("/", filepath.Base(pivotDir))
- if err := syscall.Unmount(pivotDir, syscall.MNT_DETACH); err != nil {
- return fmt.Errorf("unmount pivot_root dir %s", err)
- }
-
- return os.Remove(pivotDir)
-}
diff --git a/vendor/src/github.com/docker/libcontainer/mount/ptmx.go b/vendor/src/github.com/docker/libcontainer/mount/ptmx.go
deleted file mode 100644
index c316481adf..0000000000
--- a/vendor/src/github.com/docker/libcontainer/mount/ptmx.go
+++ /dev/null
@@ -1,30 +0,0 @@
-// +build linux
-
-package mount
-
-import (
- "fmt"
- "os"
- "path/filepath"
-
- "github.com/docker/libcontainer/console"
-)
-
-func SetupPtmx(rootfs, consolePath, mountLabel string) error {
- ptmx := filepath.Join(rootfs, "dev/ptmx")
- if err := os.Remove(ptmx); err != nil && !os.IsNotExist(err) {
- return err
- }
-
- if err := os.Symlink("pts/ptmx", ptmx); err != nil {
- return fmt.Errorf("symlink dev ptmx %s", err)
- }
-
- if consolePath != "" {
- if err := console.Setup(rootfs, consolePath, mountLabel); err != nil {
- return err
- }
- }
-
- return nil
-}
diff --git a/vendor/src/github.com/docker/libcontainer/mount/readonly.go b/vendor/src/github.com/docker/libcontainer/mount/readonly.go
deleted file mode 100644
index 9b4a6f704c..0000000000
--- a/vendor/src/github.com/docker/libcontainer/mount/readonly.go
+++ /dev/null
@@ -1,11 +0,0 @@
-// +build linux
-
-package mount
-
-import (
- "syscall"
-)
-
-func SetReadonly() error {
- return syscall.Mount("/", "/", "bind", syscall.MS_BIND|syscall.MS_REMOUNT|syscall.MS_RDONLY|syscall.MS_REC, "")
-}
diff --git a/vendor/src/github.com/docker/libcontainer/mount/remount.go b/vendor/src/github.com/docker/libcontainer/mount/remount.go
deleted file mode 100644
index 99a01209d1..0000000000
--- a/vendor/src/github.com/docker/libcontainer/mount/remount.go
+++ /dev/null
@@ -1,31 +0,0 @@
-// +build linux
-
-package mount
-
-import "syscall"
-
-func RemountProc() error {
- if err := syscall.Unmount("/proc", syscall.MNT_DETACH); err != nil {
- return err
- }
-
- if err := syscall.Mount("proc", "/proc", "proc", uintptr(defaultMountFlags), ""); err != nil {
- return err
- }
-
- return nil
-}
-
-func RemountSys() error {
- if err := syscall.Unmount("/sys", syscall.MNT_DETACH); err != nil {
- if err != syscall.EINVAL {
- return err
- }
- } else {
- if err := syscall.Mount("sysfs", "/sys", "sysfs", uintptr(defaultMountFlags), ""); err != nil {
- return err
- }
- }
-
- return nil
-}
diff --git a/vendor/src/github.com/docker/libcontainer/namespaces/create.go b/vendor/src/github.com/docker/libcontainer/namespaces/create.go
deleted file mode 100644
index b6418b6e9f..0000000000
--- a/vendor/src/github.com/docker/libcontainer/namespaces/create.go
+++ /dev/null
@@ -1,10 +0,0 @@
-package namespaces
-
-import (
- "os"
- "os/exec"
-
- "github.com/docker/libcontainer"
-)
-
-type CreateCommand func(container *libcontainer.Config, console, dataPath, init string, childPipe *os.File, args []string) *exec.Cmd
diff --git a/vendor/src/github.com/docker/libcontainer/namespaces/exec.go b/vendor/src/github.com/docker/libcontainer/namespaces/exec.go
deleted file mode 100644
index bfaa755afc..0000000000
--- a/vendor/src/github.com/docker/libcontainer/namespaces/exec.go
+++ /dev/null
@@ -1,219 +0,0 @@
-// +build linux
-
-package namespaces
-
-import (
- "encoding/json"
- "io"
- "os"
- "os/exec"
- "syscall"
-
- "github.com/docker/libcontainer"
- "github.com/docker/libcontainer/cgroups"
- "github.com/docker/libcontainer/cgroups/fs"
- "github.com/docker/libcontainer/cgroups/systemd"
- "github.com/docker/libcontainer/network"
- "github.com/docker/libcontainer/system"
-)
-
-const (
- EXIT_SIGNAL_OFFSET = 128
-)
-
-// TODO(vishh): This is part of the libcontainer API and it does much more than just namespaces related work.
-// Move this to libcontainer package.
-// Exec performs setup outside of a namespace so that a container can be
-// executed. Exec is a high level function for working with container namespaces.
-func Exec(container *libcontainer.Config, stdin io.Reader, stdout, stderr io.Writer, console, dataPath string, args []string, createCommand CreateCommand, startCallback func()) (int, error) {
- var err error
-
- // create a pipe so that we can syncronize with the namespaced process and
- // pass the state and configuration to the child process
- parent, child, err := newInitPipe()
- if err != nil {
- return -1, err
- }
- defer parent.Close()
-
- command := createCommand(container, console, dataPath, os.Args[0], child, args)
- // Note: these are only used in non-tty mode
- // if there is a tty for the container it will be opened within the namespace and the
- // fds will be duped to stdin, stdiout, and stderr
- command.Stdin = stdin
- command.Stdout = stdout
- command.Stderr = stderr
-
- if err := command.Start(); err != nil {
- child.Close()
- return -1, err
- }
- child.Close()
-
- terminate := func(terr error) (int, error) {
- // TODO: log the errors for kill and wait
- command.Process.Kill()
- command.Wait()
- return -1, terr
- }
-
- started, err := system.GetProcessStartTime(command.Process.Pid)
- if err != nil {
- return terminate(err)
- }
-
- // Do this before syncing with child so that no children
- // can escape the cgroup
- cgroupPaths, err := SetupCgroups(container, command.Process.Pid)
- if err != nil {
- return terminate(err)
- }
- defer cgroups.RemovePaths(cgroupPaths)
-
- var networkState network.NetworkState
- if err := InitializeNetworking(container, command.Process.Pid, &networkState); err != nil {
- return terminate(err)
- }
- // send the state to the container's init process then shutdown writes for the parent
- if err := json.NewEncoder(parent).Encode(networkState); err != nil {
- return terminate(err)
- }
- // shutdown writes for the parent side of the pipe
- if err := syscall.Shutdown(int(parent.Fd()), syscall.SHUT_WR); err != nil {
- return terminate(err)
- }
-
- state := &libcontainer.State{
- InitPid: command.Process.Pid,
- InitStartTime: started,
- NetworkState: networkState,
- CgroupPaths: cgroupPaths,
- }
-
- if err := libcontainer.SaveState(dataPath, state); err != nil {
- return terminate(err)
- }
- defer libcontainer.DeleteState(dataPath)
-
- // wait for the child process to fully complete and receive an error message
- // if one was encoutered
- var ierr *initError
- if err := json.NewDecoder(parent).Decode(&ierr); err != nil && err != io.EOF {
- return terminate(err)
- }
- if ierr != nil {
- return terminate(ierr)
- }
-
- if startCallback != nil {
- startCallback()
- }
-
- if err := command.Wait(); err != nil {
- if _, ok := err.(*exec.ExitError); !ok {
- return -1, err
- }
- }
- if !container.Namespaces.Contains(libcontainer.NEWPID) {
- killAllPids(container)
- }
-
- waitStatus := command.ProcessState.Sys().(syscall.WaitStatus)
- if waitStatus.Signaled() {
- return EXIT_SIGNAL_OFFSET + int(waitStatus.Signal()), nil
- }
- return waitStatus.ExitStatus(), nil
-}
-
-// killAllPids itterates over all of the container's processes
-// sending a SIGKILL to each process.
-func killAllPids(container *libcontainer.Config) error {
- var (
- procs []*os.Process
- freeze = fs.Freeze
- getPids = fs.GetPids
- )
- if systemd.UseSystemd() {
- freeze = systemd.Freeze
- getPids = systemd.GetPids
- }
- freeze(container.Cgroups, cgroups.Frozen)
- pids, err := getPids(container.Cgroups)
- if err != nil {
- return err
- }
- for _, pid := range pids {
- // TODO: log err without aborting if we are unable to find
- // a single PID
- if p, err := os.FindProcess(pid); err == nil {
- procs = append(procs, p)
- p.Kill()
- }
- }
- freeze(container.Cgroups, cgroups.Thawed)
- for _, p := range procs {
- p.Wait()
- }
- return err
-}
-
-// DefaultCreateCommand will return an exec.Cmd with the Cloneflags set to the proper namespaces
-// defined on the container's configuration and use the current binary as the init with the
-// args provided
-//
-// console: the /dev/console to setup inside the container
-// init: the program executed inside the namespaces
-// root: the path to the container json file and information
-// pipe: sync pipe to synchronize the parent and child processes
-// args: the arguments to pass to the container to run as the user's program
-func DefaultCreateCommand(container *libcontainer.Config, console, dataPath, init string, pipe *os.File, args []string) *exec.Cmd {
- // get our binary name from arg0 so we can always reexec ourself
- env := []string{
- "console=" + console,
- "pipe=3",
- "data_path=" + dataPath,
- }
-
- command := exec.Command(init, append([]string{"init", "--"}, args...)...)
- // make sure the process is executed inside the context of the rootfs
- command.Dir = container.RootFs
- command.Env = append(os.Environ(), env...)
-
- if command.SysProcAttr == nil {
- command.SysProcAttr = &syscall.SysProcAttr{}
- }
- command.SysProcAttr.Cloneflags = uintptr(GetNamespaceFlags(container.Namespaces))
-
- command.SysProcAttr.Pdeathsig = syscall.SIGKILL
- command.ExtraFiles = []*os.File{pipe}
-
- return command
-}
-
-// SetupCgroups applies the cgroup restrictions to the process running in the container based
-// on the container's configuration
-func SetupCgroups(container *libcontainer.Config, nspid int) (map[string]string, error) {
- if container.Cgroups != nil {
- c := container.Cgroups
- if systemd.UseSystemd() {
- return systemd.Apply(c, nspid)
- }
- return fs.Apply(c, nspid)
- }
- return map[string]string{}, nil
-}
-
-// InitializeNetworking creates the container's network stack outside of the namespace and moves
-// interfaces into the container's net namespaces if necessary
-func InitializeNetworking(container *libcontainer.Config, nspid int, networkState *network.NetworkState) error {
- for _, config := range container.Networks {
- strategy, err := network.GetStrategy(config.Type)
- if err != nil {
- return err
- }
- if err := strategy.Create((*network.Network)(config), nspid, networkState); err != nil {
- return err
- }
- }
- return nil
-}
diff --git a/vendor/src/github.com/docker/libcontainer/namespaces/execin.go b/vendor/src/github.com/docker/libcontainer/namespaces/execin.go
deleted file mode 100644
index ddff5c3a9f..0000000000
--- a/vendor/src/github.com/docker/libcontainer/namespaces/execin.go
+++ /dev/null
@@ -1,132 +0,0 @@
-// +build linux
-
-package namespaces
-
-import (
- "encoding/json"
- "fmt"
- "io"
- "os"
- "os/exec"
- "path/filepath"
- "strconv"
- "syscall"
-
- "github.com/docker/libcontainer"
- "github.com/docker/libcontainer/apparmor"
- "github.com/docker/libcontainer/cgroups"
- "github.com/docker/libcontainer/label"
- "github.com/docker/libcontainer/system"
-)
-
-// ExecIn reexec's the initPath with the argv 0 rewrite to "nsenter" so that it is able to run the
-// setns code in a single threaded environment joining the existing containers' namespaces.
-func ExecIn(container *libcontainer.Config, state *libcontainer.State, userArgs []string, initPath, action string,
- stdin io.Reader, stdout, stderr io.Writer, console string, startCallback func(*exec.Cmd)) (int, error) {
-
- args := []string{fmt.Sprintf("nsenter-%s", action), "--nspid", strconv.Itoa(state.InitPid)}
-
- if console != "" {
- args = append(args, "--console", console)
- }
-
- cmd := &exec.Cmd{
- Path: initPath,
- Args: append(args, append([]string{"--"}, userArgs...)...),
- }
-
- if filepath.Base(initPath) == initPath {
- if lp, err := exec.LookPath(initPath); err == nil {
- cmd.Path = lp
- }
- }
-
- parent, child, err := newInitPipe()
- if err != nil {
- return -1, err
- }
- defer parent.Close()
-
- // Note: these are only used in non-tty mode
- // if there is a tty for the container it will be opened within the namespace and the
- // fds will be duped to stdin, stdiout, and stderr
- cmd.Stdin = stdin
- cmd.Stdout = stdout
- cmd.Stderr = stderr
- cmd.ExtraFiles = []*os.File{child}
-
- if err := cmd.Start(); err != nil {
- child.Close()
- return -1, err
- }
- child.Close()
-
- terminate := func(terr error) (int, error) {
- // TODO: log the errors for kill and wait
- cmd.Process.Kill()
- cmd.Wait()
- return -1, terr
- }
-
- // Enter cgroups.
- if err := EnterCgroups(state, cmd.Process.Pid); err != nil {
- return terminate(err)
- }
-
- // finish cgroups' setup, unblock the child process.
- if _, err := parent.WriteString("1"); err != nil {
- return terminate(err)
- }
-
- if err := json.NewEncoder(parent).Encode(container); err != nil {
- return terminate(err)
- }
-
- if startCallback != nil {
- startCallback(cmd)
- }
-
- if err := cmd.Wait(); err != nil {
- if _, ok := err.(*exec.ExitError); !ok {
- return -1, err
- }
- }
- return cmd.ProcessState.Sys().(syscall.WaitStatus).ExitStatus(), nil
-}
-
-// Finalize expects that the setns calls have been setup and that is has joined an
-// existing namespace
-func FinalizeSetns(container *libcontainer.Config, args []string) error {
- // clear the current processes env and replace it with the environment defined on the container
- if err := LoadContainerEnvironment(container); err != nil {
- return err
- }
-
- if err := setupRlimits(container); err != nil {
- return fmt.Errorf("setup rlimits %s", err)
- }
-
- if err := FinalizeNamespace(container); err != nil {
- return err
- }
-
- if err := apparmor.ApplyProfile(container.AppArmorProfile); err != nil {
- return fmt.Errorf("set apparmor profile %s: %s", container.AppArmorProfile, err)
- }
-
- if container.ProcessLabel != "" {
- if err := label.SetProcessLabel(container.ProcessLabel); err != nil {
- return err
- }
- }
-
- if err := system.Execv(args[0], args[0:], os.Environ()); err != nil {
- return err
- }
-
- panic("unreachable")
-}
-
-func EnterCgroups(state *libcontainer.State, pid int) error {
- return cgroups.EnterPid(state.CgroupPaths, pid)
-}
diff --git a/vendor/src/github.com/docker/libcontainer/namespaces/init.go b/vendor/src/github.com/docker/libcontainer/namespaces/init.go
deleted file mode 100644
index 0a4ff19620..0000000000
--- a/vendor/src/github.com/docker/libcontainer/namespaces/init.go
+++ /dev/null
@@ -1,331 +0,0 @@
-// +build linux
-
-package namespaces
-
-import (
- "encoding/json"
- "fmt"
- "io/ioutil"
- "os"
- "strings"
- "syscall"
-
- "github.com/docker/libcontainer"
- "github.com/docker/libcontainer/apparmor"
- "github.com/docker/libcontainer/console"
- "github.com/docker/libcontainer/label"
- "github.com/docker/libcontainer/mount"
- "github.com/docker/libcontainer/netlink"
- "github.com/docker/libcontainer/network"
- "github.com/docker/libcontainer/security/capabilities"
- "github.com/docker/libcontainer/security/restrict"
- "github.com/docker/libcontainer/system"
- "github.com/docker/libcontainer/user"
- "github.com/docker/libcontainer/utils"
-)
-
-// TODO(vishh): This is part of the libcontainer API and it does much more than just namespaces related work.
-// Move this to libcontainer package.
-// Init is the init process that first runs inside a new namespace to setup mounts, users, networking,
-// and other options required for the new container.
-// The caller of Init function has to ensure that the go runtime is locked to an OS thread
-// (using runtime.LockOSThread) else system calls like setns called within Init may not work as intended.
-func Init(container *libcontainer.Config, uncleanRootfs, consolePath string, pipe *os.File, args []string) (err error) {
- defer func() {
- // if we have an error during the initialization of the container's init then send it back to the
- // parent process in the form of an initError.
- if err != nil {
- // ensure that any data sent from the parent is consumed so it doesn't
- // receive ECONNRESET when the child writes to the pipe.
- ioutil.ReadAll(pipe)
- if err := json.NewEncoder(pipe).Encode(initError{
- Message: err.Error(),
- }); err != nil {
- panic(err)
- }
- }
- // ensure that this pipe is always closed
- pipe.Close()
- }()
-
- rootfs, err := utils.ResolveRootfs(uncleanRootfs)
- if err != nil {
- return err
- }
-
- // clear the current processes env and replace it with the environment
- // defined on the container
- if err := LoadContainerEnvironment(container); err != nil {
- return err
- }
-
- // We always read this as it is a way to sync with the parent as well
- var networkState *network.NetworkState
- if err := json.NewDecoder(pipe).Decode(&networkState); err != nil {
- return err
- }
- // join any namespaces via a path to the namespace fd if provided
- if err := joinExistingNamespaces(container.Namespaces); err != nil {
- return err
- }
- if consolePath != "" {
- if err := console.OpenAndDup(consolePath); err != nil {
- return err
- }
- }
- if _, err := syscall.Setsid(); err != nil {
- return fmt.Errorf("setsid %s", err)
- }
- if consolePath != "" {
- if err := system.Setctty(); err != nil {
- return fmt.Errorf("setctty %s", err)
- }
- }
-
- if err := setupNetwork(container, networkState); err != nil {
- return fmt.Errorf("setup networking %s", err)
- }
- if err := setupRoute(container); err != nil {
- return fmt.Errorf("setup route %s", err)
- }
-
- if err := setupRlimits(container); err != nil {
- return fmt.Errorf("setup rlimits %s", err)
- }
-
- label.Init()
-
- if err := mount.InitializeMountNamespace(rootfs,
- consolePath,
- container.RestrictSys,
- (*mount.MountConfig)(container.MountConfig)); err != nil {
- return fmt.Errorf("setup mount namespace %s", err)
- }
-
- if container.Hostname != "" {
- if err := syscall.Sethostname([]byte(container.Hostname)); err != nil {
- return fmt.Errorf("unable to sethostname %q: %s", container.Hostname, err)
- }
- }
-
- if err := apparmor.ApplyProfile(container.AppArmorProfile); err != nil {
- return fmt.Errorf("set apparmor profile %s: %s", container.AppArmorProfile, err)
- }
-
- if err := label.SetProcessLabel(container.ProcessLabel); err != nil {
- return fmt.Errorf("set process label %s", err)
- }
-
- // TODO: (crosbymichael) make this configurable at the Config level
- if container.RestrictSys {
- if err := restrict.Restrict("proc/sys", "proc/sysrq-trigger", "proc/irq", "proc/bus"); err != nil {
- return err
- }
- }
-
- pdeathSignal, err := system.GetParentDeathSignal()
- if err != nil {
- return fmt.Errorf("get parent death signal %s", err)
- }
-
- if err := FinalizeNamespace(container); err != nil {
- return fmt.Errorf("finalize namespace %s", err)
- }
-
- // FinalizeNamespace can change user/group which clears the parent death
- // signal, so we restore it here.
- if err := RestoreParentDeathSignal(pdeathSignal); err != nil {
- return fmt.Errorf("restore parent death signal %s", err)
- }
-
- return system.Execv(args[0], args[0:], os.Environ())
-}
-
-// RestoreParentDeathSignal sets the parent death signal to old.
-func RestoreParentDeathSignal(old int) error {
- if old == 0 {
- return nil
- }
-
- current, err := system.GetParentDeathSignal()
- if err != nil {
- return fmt.Errorf("get parent death signal %s", err)
- }
-
- if old == current {
- return nil
- }
-
- if err := system.ParentDeathSignal(uintptr(old)); err != nil {
- return fmt.Errorf("set parent death signal %s", err)
- }
-
- // Signal self if parent is already dead. Does nothing if running in a new
- // PID namespace, as Getppid will always return 0.
- if syscall.Getppid() == 1 {
- return syscall.Kill(syscall.Getpid(), syscall.SIGKILL)
- }
-
- return nil
-}
-
-// SetupUser changes the groups, gid, and uid for the user inside the container
-func SetupUser(container *libcontainer.Config) error {
- // Set up defaults.
- defaultExecUser := user.ExecUser{
- Uid: syscall.Getuid(),
- Gid: syscall.Getgid(),
- Home: "/",
- }
-
- passwdPath, err := user.GetPasswdPath()
- if err != nil {
- return err
- }
-
- groupPath, err := user.GetGroupPath()
- if err != nil {
- return err
- }
-
- execUser, err := user.GetExecUserPath(container.User, &defaultExecUser, passwdPath, groupPath)
- if err != nil {
- return fmt.Errorf("get supplementary groups %s", err)
- }
-
- suppGroups := append(execUser.Sgids, container.AdditionalGroups...)
-
- if err := syscall.Setgroups(suppGroups); err != nil {
- return fmt.Errorf("setgroups %s", err)
- }
-
- if err := system.Setgid(execUser.Gid); err != nil {
- return fmt.Errorf("setgid %s", err)
- }
-
- if err := system.Setuid(execUser.Uid); err != nil {
- return fmt.Errorf("setuid %s", err)
- }
-
- // if we didn't get HOME already, set it based on the user's HOME
- if envHome := os.Getenv("HOME"); envHome == "" {
- if err := os.Setenv("HOME", execUser.Home); err != nil {
- return fmt.Errorf("set HOME %s", err)
- }
- }
-
- return nil
-}
-
-// setupVethNetwork uses the Network config if it is not nil to initialize
-// the new veth interface inside the container for use by changing the name to eth0
-// setting the MTU and IP address along with the default gateway
-func setupNetwork(container *libcontainer.Config, networkState *network.NetworkState) error {
- for _, config := range container.Networks {
- strategy, err := network.GetStrategy(config.Type)
- if err != nil {
- return err
- }
-
- err1 := strategy.Initialize((*network.Network)(config), networkState)
- if err1 != nil {
- return err1
- }
- }
- return nil
-}
-
-func setupRoute(container *libcontainer.Config) error {
- for _, config := range container.Routes {
- if err := netlink.AddRoute(config.Destination, config.Source, config.Gateway, config.InterfaceName); err != nil {
- return err
- }
- }
- return nil
-}
-
-func setupRlimits(container *libcontainer.Config) error {
- for _, rlimit := range container.Rlimits {
- l := &syscall.Rlimit{Max: rlimit.Hard, Cur: rlimit.Soft}
- if err := syscall.Setrlimit(rlimit.Type, l); err != nil {
- return fmt.Errorf("error setting rlimit type %v: %v", rlimit.Type, err)
- }
- }
- return nil
-}
-
-// FinalizeNamespace drops the caps, sets the correct user
-// and working dir, and closes any leaky file descriptors
-// before execing the command inside the namespace
-func FinalizeNamespace(container *libcontainer.Config) error {
- // Ensure that all non-standard fds we may have accidentally
- // inherited are marked close-on-exec so they stay out of the
- // container
- if err := utils.CloseExecFrom(3); err != nil {
- return fmt.Errorf("close open file descriptors %s", err)
- }
-
- // drop capabilities in bounding set before changing user
- if err := capabilities.DropBoundingSet(container.Capabilities); err != nil {
- return fmt.Errorf("drop bounding set %s", err)
- }
-
- // preserve existing capabilities while we change users
- if err := system.SetKeepCaps(); err != nil {
- return fmt.Errorf("set keep caps %s", err)
- }
-
- if err := SetupUser(container); err != nil {
- return fmt.Errorf("setup user %s", err)
- }
-
- if err := system.ClearKeepCaps(); err != nil {
- return fmt.Errorf("clear keep caps %s", err)
- }
-
- // drop all other capabilities
- if err := capabilities.DropCapabilities(container.Capabilities); err != nil {
- return fmt.Errorf("drop capabilities %s", err)
- }
-
- if container.WorkingDir != "" {
- if err := syscall.Chdir(container.WorkingDir); err != nil {
- return fmt.Errorf("chdir to %s %s", container.WorkingDir, err)
- }
- }
-
- return nil
-}
-
-func LoadContainerEnvironment(container *libcontainer.Config) error {
- os.Clearenv()
- for _, pair := range container.Env {
- p := strings.SplitN(pair, "=", 2)
- if len(p) < 2 {
- return fmt.Errorf("invalid environment '%v'", pair)
- }
- if err := os.Setenv(p[0], p[1]); err != nil {
- return err
- }
- }
- return nil
-}
-
-// joinExistingNamespaces gets all the namespace paths specified for the container and
-// does a setns on the namespace fd so that the current process joins the namespace.
-func joinExistingNamespaces(namespaces []libcontainer.Namespace) error {
- for _, ns := range namespaces {
- if ns.Path != "" {
- f, err := os.OpenFile(ns.Path, os.O_RDONLY, 0)
- if err != nil {
- return err
- }
- err = system.Setns(f.Fd(), uintptr(namespaceInfo[ns.Type]))
- f.Close()
- if err != nil {
- return err
- }
- }
- }
- return nil
-}
diff --git a/vendor/src/github.com/docker/libcontainer/namespaces/nsenter/nsenter.c b/vendor/src/github.com/docker/libcontainer/namespaces/nsenter/nsenter.c
deleted file mode 100644
index 4ab21774fb..0000000000
--- a/vendor/src/github.com/docker/libcontainer/namespaces/nsenter/nsenter.c
+++ /dev/null
@@ -1,245 +0,0 @@
-// +build cgo
-//
-// formated with indent -linux nsenter.c
-
-#include <errno.h>
-#include <fcntl.h>
-#include <linux/limits.h>
-#include <linux/sched.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/prctl.h>
-#include <sys/types.h>
-#include <unistd.h>
-#include <getopt.h>
-
-#define pr_perror(fmt, ...) fprintf(stderr, "nsenter: " fmt ": %m\n", ##__VA_ARGS__)
-
-static const kBufSize = 256;
-static const char *kNsEnter = "nsenter";
-
-void get_args(int *argc, char ***argv)
-{
- // Read argv
- int fd = open("/proc/self/cmdline", O_RDONLY);
- if (fd < 0) {
- pr_perror("Unable to open /proc/self/cmdline");
- exit(1);
- }
- // Read the whole commandline.
- ssize_t contents_size = 0;
- ssize_t contents_offset = 0;
- char *contents = NULL;
- ssize_t bytes_read = 0;
- do {
- contents_size += kBufSize;
- contents = (char *)realloc(contents, contents_size);
- bytes_read =
- read(fd, contents + contents_offset,
- contents_size - contents_offset);
- if (bytes_read < 0) {
- pr_perror("Unable to read from /proc/self/cmdline");
- exit(1);
- }
- contents_offset += bytes_read;
- }
- while (bytes_read > 0);
- close(fd);
-
- // Parse the commandline into an argv. /proc/self/cmdline has \0 delimited args.
- ssize_t i;
- *argc = 0;
- for (i = 0; i < contents_offset; i++) {
- if (contents[i] == '\0') {
- (*argc)++;
- }
- }
- *argv = (char **)malloc(sizeof(char *) * ((*argc) + 1));
- int idx;
- for (idx = 0; idx < (*argc); idx++) {
- (*argv)[idx] = contents;
- contents += strlen(contents) + 1;
- }
- (*argv)[*argc] = NULL;
-}
-
-// Use raw setns syscall for versions of glibc that don't include it (namely glibc-2.12)
-#if __GLIBC__ == 2 && __GLIBC_MINOR__ < 14
-#define _GNU_SOURCE
-#include <sched.h>
-#include "syscall.h"
-#ifdef SYS_setns
-int setns(int fd, int nstype)
-{
- return syscall(SYS_setns, fd, nstype);
-}
-#endif
-#endif
-
-void print_usage()
-{
- fprintf(stderr,
- "nsenter --nspid <pid> --console <console> -- cmd1 arg1 arg2...\n");
-}
-
-void nsenter()
-{
- int argc, c;
- char **argv;
- get_args(&argc, &argv);
-
- // check argv 0 to ensure that we are supposed to setns
- // we use strncmp to test for a value of "nsenter" but also allows alternate implmentations
- // after the setns code path to continue to use the argv 0 to determine actions to be run
- // resulting in the ability to specify "nsenter-mknod", "nsenter-exec", etc...
- if (strncmp(argv[0], kNsEnter, strlen(kNsEnter)) != 0) {
- return;
- }
-#ifdef PR_SET_CHILD_SUBREAPER
- if (prctl(PR_SET_CHILD_SUBREAPER, 1, 0, 0, 0) == -1) {
- pr_perror("Failed to set child subreaper");
- exit(1);
- }
-#endif
-
- static const struct option longopts[] = {
- {"nspid", required_argument, NULL, 'n'},
- {"console", required_argument, NULL, 't'},
- {NULL, 0, NULL, 0}
- };
-
- pid_t init_pid = -1;
- char *init_pid_str = NULL;
- char *console = NULL;
- while ((c = getopt_long_only(argc, argv, "n:c:", longopts, NULL)) != -1) {
- switch (c) {
- case 'n':
- init_pid_str = optarg;
- break;
- case 't':
- console = optarg;
- break;
- }
- }
-
- if (init_pid_str == NULL) {
- print_usage();
- exit(1);
- }
-
- init_pid = strtol(init_pid_str, NULL, 10);
- if ((init_pid == 0 && errno == EINVAL) || errno == ERANGE) {
- pr_perror("Failed to parse PID from \"%s\" with output \"%d\"",
- init_pid_str, init_pid);
- print_usage();
- exit(1);
- }
-
- argc -= 3;
- argv += 3;
-
- if (setsid() == -1) {
- pr_perror("setsid failed");
- exit(1);
- }
- // before we setns we need to dup the console
- int consolefd = -1;
- if (console != NULL) {
- consolefd = open(console, O_RDWR);
- if (consolefd < 0) {
- pr_perror("Failed to open console %s", console);
- exit(1);
- }
- }
- // blocking until the parent placed the process inside correct cgroups.
- unsigned char s;
- if (read(3, &s, 1) != 1 || s != '1') {
- pr_perror("failed to receive synchronization data from parent");
- exit(1);
- }
- // Setns on all supported namespaces.
- char ns_dir[PATH_MAX];
- memset(ns_dir, 0, PATH_MAX);
- snprintf(ns_dir, PATH_MAX - 1, "/proc/%d/ns/", init_pid);
-
- int ns_dir_fd;
- ns_dir_fd = open(ns_dir, O_RDONLY | O_DIRECTORY);
- if (ns_dir_fd < 0) {
- pr_perror("Unable to open %s", ns_dir);
- exit(1);
- }
-
- char *namespaces[] = { "ipc", "uts", "net", "pid", "mnt" };
- const int num = sizeof(namespaces) / sizeof(char *);
- int i;
- for (i = 0; i < num; i++) {
- // A zombie process has links on namespaces, but they can't be opened
- struct stat st;
- if (fstatat(ns_dir_fd, namespaces[i], &st, AT_SYMLINK_NOFOLLOW)
- == -1) {
- if (errno == ENOENT)
- continue;
- pr_perror("Failed to stat ns file %s for ns %s",
- ns_dir, namespaces[i]);
- exit(1);
- }
-
- int fd = openat(ns_dir_fd, namespaces[i], O_RDONLY);
- if (fd == -1) {
- pr_perror("Failed to open ns file %s for ns %s",
- ns_dir, namespaces[i]);
- exit(1);
- }
- // Set the namespace.
- if (setns(fd, 0) == -1) {
- pr_perror("Failed to setns for %s", namespaces[i]);
- exit(1);
- }
- close(fd);
- }
- close(ns_dir_fd);
-
- // We must fork to actually enter the PID namespace.
- int child = fork();
- if (child == -1) {
- pr_perror("Unable to fork a process");
- exit(1);
- }
- if (child == 0) {
- if (consolefd != -1) {
- if (dup2(consolefd, STDIN_FILENO) != 0) {
- pr_perror("Failed to dup 0");
- exit(1);
- }
- if (dup2(consolefd, STDOUT_FILENO) != STDOUT_FILENO) {
- pr_perror("Failed to dup 1");
- exit(1);
- }
- if (dup2(consolefd, STDERR_FILENO) != STDERR_FILENO) {
- pr_perror("Failed to dup 2\n");
- exit(1);
- }
- }
- // Finish executing, let the Go runtime take over.
- return;
- } else {
- // Parent, wait for the child.
- int status = 0;
- if (waitpid(child, &status, 0) == -1) {
- pr_perror("nsenter: Failed to waitpid with error");
- exit(1);
- }
- // Forward the child's exit code or re-send its death signal.
- if (WIFEXITED(status)) {
- exit(WEXITSTATUS(status));
- } else if (WIFSIGNALED(status)) {
- kill(getpid(), WTERMSIG(status));
- }
-
- exit(1);
- }
-
- return;
-}
diff --git a/vendor/src/github.com/docker/libcontainer/namespaces/nsenter/nsenter.go b/vendor/src/github.com/docker/libcontainer/namespaces/nsenter/nsenter.go
deleted file mode 100644
index 7d21e8e59f..0000000000
--- a/vendor/src/github.com/docker/libcontainer/namespaces/nsenter/nsenter.go
+++ /dev/null
@@ -1,10 +0,0 @@
-// +build linux
-
-package nsenter
-
-/*
-__attribute__((constructor)) init() {
- nsenter();
-}
-*/
-import "C"
diff --git a/vendor/src/github.com/docker/libcontainer/namespaces/utils.go b/vendor/src/github.com/docker/libcontainer/namespaces/utils.go
deleted file mode 100644
index de71a379f8..0000000000
--- a/vendor/src/github.com/docker/libcontainer/namespaces/utils.go
+++ /dev/null
@@ -1,45 +0,0 @@
-// +build linux
-
-package namespaces
-
-import (
- "os"
- "syscall"
-
- "github.com/docker/libcontainer"
-)
-
-type initError struct {
- Message string `json:"message,omitempty"`
-}
-
-func (i initError) Error() string {
- return i.Message
-}
-
-var namespaceInfo = map[libcontainer.NamespaceType]int{
- libcontainer.NEWNET: syscall.CLONE_NEWNET,
- libcontainer.NEWNS: syscall.CLONE_NEWNS,
- libcontainer.NEWUSER: syscall.CLONE_NEWUSER,
- libcontainer.NEWIPC: syscall.CLONE_NEWIPC,
- libcontainer.NEWUTS: syscall.CLONE_NEWUTS,
- libcontainer.NEWPID: syscall.CLONE_NEWPID,
-}
-
-// New returns a newly initialized Pipe for communication between processes
-func newInitPipe() (parent *os.File, child *os.File, err error) {
- fds, err := syscall.Socketpair(syscall.AF_LOCAL, syscall.SOCK_STREAM|syscall.SOCK_CLOEXEC, 0)
- if err != nil {
- return nil, nil, err
- }
- return os.NewFile(uintptr(fds[1]), "parent"), os.NewFile(uintptr(fds[0]), "child"), nil
-}
-
-// GetNamespaceFlags parses the container's Namespaces options to set the correct
-// flags on clone, unshare, and setns
-func GetNamespaceFlags(namespaces libcontainer.Namespaces) (flag int) {
- for _, v := range namespaces {
- flag |= namespaceInfo[v.Type]
- }
- return flag
-}
diff --git a/vendor/src/github.com/docker/libcontainer/netlink/netlink_linux.go b/vendor/src/github.com/docker/libcontainer/netlink/netlink_linux.go
index 3cc3cc94f7..c438ec300f 100644
--- a/vendor/src/github.com/docker/libcontainer/netlink/netlink_linux.go
+++ b/vendor/src/github.com/docker/libcontainer/netlink/netlink_linux.go
@@ -7,7 +7,6 @@ import (
"math/rand"
"net"
"os"
- "path/filepath"
"sync/atomic"
"syscall"
"unsafe"
@@ -23,6 +22,7 @@ const (
IFLA_VLAN_ID = 1
IFLA_NET_NS_FD = 28
IFLA_ADDRESS = 1
+ IFLA_BRPORT_MODE = 4
SIOC_BRADDBR = 0x89a0
SIOC_BRDELBR = 0x89a1
SIOC_BRADDIF = 0x89a2
@@ -659,7 +659,7 @@ func networkSetNsAction(iface *net.Interface, rtattr *RtAttr) error {
}
// Move a particular network interface to a particular network namespace
-// specified by PID. This is idential to running: ip link set dev $name netns $pid
+// specified by PID. This is identical to running: ip link set dev $name netns $pid
func NetworkSetNsPid(iface *net.Interface, nspid int) error {
data := uint32Attr(syscall.IFLA_NET_NS_PID, uint32(nspid))
return networkSetNsAction(iface, data)
@@ -673,7 +673,7 @@ func NetworkSetNsFd(iface *net.Interface, fd int) error {
return networkSetNsAction(iface, data)
}
-// Rname a particular interface to a different name
+// Rename a particular interface to a different name
// !!! Note that you can't rename an active interface. You need to bring it down before renaming it.
// This is identical to running: ip link set dev ${oldName} name ${newName}
func NetworkChangeName(iface *net.Interface, newName string) error {
@@ -1253,25 +1253,33 @@ func SetMacAddress(name, addr string) error {
}
func SetHairpinMode(iface *net.Interface, enabled bool) error {
- sysPath := filepath.Join("/sys/class/net", iface.Name, "brport/hairpin_mode")
-
- sysFile, err := os.OpenFile(sysPath, os.O_WRONLY, 0)
+ s, err := getNetlinkSocket()
if err != nil {
return err
}
- defer sysFile.Close()
+ defer s.Close()
+ req := newNetlinkRequest(syscall.RTM_SETLINK, syscall.NLM_F_ACK)
- var writeVal []byte
+ msg := newIfInfomsg(syscall.AF_BRIDGE)
+ msg.Type = syscall.RTM_SETLINK
+ msg.Flags = syscall.NLM_F_REQUEST
+ msg.Index = int32(iface.Index)
+ msg.Change = DEFAULT_CHANGE
+ req.AddData(msg)
+
+ mode := []byte{0}
if enabled {
- writeVal = []byte("1")
- } else {
- writeVal = []byte("0")
+ mode[0] = byte(1)
}
- if _, err := sysFile.Write(writeVal); err != nil {
+
+ br := newRtAttr(syscall.IFLA_PROTINFO|syscall.NLA_F_NESTED, nil)
+ newRtAttrChild(br, IFLA_BRPORT_MODE, mode)
+ req.AddData(br)
+ if err := s.Send(req); err != nil {
return err
}
- return nil
+ return s.HandleAck(req.Seq)
}
func ChangeName(iface *net.Interface, newName string) error {
diff --git a/vendor/src/github.com/docker/libcontainer/network/loopback.go b/vendor/src/github.com/docker/libcontainer/network/loopback.go
deleted file mode 100644
index 1667b4d82a..0000000000
--- a/vendor/src/github.com/docker/libcontainer/network/loopback.go
+++ /dev/null
@@ -1,23 +0,0 @@
-// +build linux
-
-package network
-
-import (
- "fmt"
-)
-
-// Loopback is a network strategy that provides a basic loopback device
-type Loopback struct {
-}
-
-func (l *Loopback) Create(n *Network, nspid int, networkState *NetworkState) error {
- return nil
-}
-
-func (l *Loopback) Initialize(config *Network, networkState *NetworkState) error {
- // Do not set the MTU on the loopback interface - use the default.
- if err := InterfaceUp("lo"); err != nil {
- return fmt.Errorf("lo up %s", err)
- }
- return nil
-}
diff --git a/vendor/src/github.com/docker/libcontainer/network/network.go b/vendor/src/github.com/docker/libcontainer/network/network.go
deleted file mode 100644
index 40b25b135b..0000000000
--- a/vendor/src/github.com/docker/libcontainer/network/network.go
+++ /dev/null
@@ -1,117 +0,0 @@
-// +build linux
-
-package network
-
-import (
- "net"
-
- "github.com/docker/libcontainer/netlink"
-)
-
-func InterfaceUp(name string) error {
- iface, err := net.InterfaceByName(name)
- if err != nil {
- return err
- }
- return netlink.NetworkLinkUp(iface)
-}
-
-func InterfaceDown(name string) error {
- iface, err := net.InterfaceByName(name)
- if err != nil {
- return err
- }
- return netlink.NetworkLinkDown(iface)
-}
-
-func ChangeInterfaceName(old, newName string) error {
- iface, err := net.InterfaceByName(old)
- if err != nil {
- return err
- }
- return netlink.NetworkChangeName(iface, newName)
-}
-
-func CreateVethPair(name1, name2 string, txQueueLen int) error {
- return netlink.NetworkCreateVethPair(name1, name2, txQueueLen)
-}
-
-func SetInterfaceInNamespacePid(name string, nsPid int) error {
- iface, err := net.InterfaceByName(name)
- if err != nil {
- return err
- }
- return netlink.NetworkSetNsPid(iface, nsPid)
-}
-
-func SetInterfaceInNamespaceFd(name string, fd uintptr) error {
- iface, err := net.InterfaceByName(name)
- if err != nil {
- return err
- }
- return netlink.NetworkSetNsFd(iface, int(fd))
-}
-
-func SetInterfaceMaster(name, master string) error {
- iface, err := net.InterfaceByName(name)
- if err != nil {
- return err
- }
- masterIface, err := net.InterfaceByName(master)
- if err != nil {
- return err
- }
- return netlink.AddToBridge(iface, masterIface)
-}
-
-func SetDefaultGateway(ip, ifaceName string) error {
- return netlink.AddDefaultGw(ip, ifaceName)
-}
-
-func SetInterfaceMac(name string, macaddr string) error {
- iface, err := net.InterfaceByName(name)
- if err != nil {
- return err
- }
- return netlink.NetworkSetMacAddress(iface, macaddr)
-}
-
-func SetInterfaceIp(name string, rawIp string) error {
- iface, err := net.InterfaceByName(name)
- if err != nil {
- return err
- }
- ip, ipNet, err := net.ParseCIDR(rawIp)
- if err != nil {
- return err
- }
- return netlink.NetworkLinkAddIp(iface, ip, ipNet)
-}
-
-func DeleteInterfaceIp(name string, rawIp string) error {
- iface, err := net.InterfaceByName(name)
- if err != nil {
- return err
- }
- ip, ipNet, err := net.ParseCIDR(rawIp)
- if err != nil {
- return err
- }
- return netlink.NetworkLinkDelIp(iface, ip, ipNet)
-}
-
-func SetMtu(name string, mtu int) error {
- iface, err := net.InterfaceByName(name)
- if err != nil {
- return err
- }
- return netlink.NetworkSetMTU(iface, mtu)
-}
-
-func SetHairpinMode(name string, enabled bool) error {
- iface, err := net.InterfaceByName(name)
- if err != nil {
- return err
- }
- return netlink.SetHairpinMode(iface, enabled)
-}
diff --git a/vendor/src/github.com/docker/libcontainer/network/stats.go b/vendor/src/github.com/docker/libcontainer/network/stats.go
deleted file mode 100644
index e2156c74da..0000000000
--- a/vendor/src/github.com/docker/libcontainer/network/stats.go
+++ /dev/null
@@ -1,74 +0,0 @@
-package network
-
-import (
- "io/ioutil"
- "path/filepath"
- "strconv"
- "strings"
-)
-
-type NetworkStats struct {
- RxBytes uint64 `json:"rx_bytes"`
- RxPackets uint64 `json:"rx_packets"`
- RxErrors uint64 `json:"rx_errors"`
- RxDropped uint64 `json:"rx_dropped"`
- TxBytes uint64 `json:"tx_bytes"`
- TxPackets uint64 `json:"tx_packets"`
- TxErrors uint64 `json:"tx_errors"`
- TxDropped uint64 `json:"tx_dropped"`
-}
-
-// Returns the network statistics for the network interfaces represented by the NetworkRuntimeInfo.
-func GetStats(networkState *NetworkState) (*NetworkStats, error) {
- // This can happen if the network runtime information is missing - possible if the container was created by an old version of libcontainer.
- if networkState.VethHost == "" {
- return &NetworkStats{}, nil
- }
-
- out := &NetworkStats{}
-
- type netStatsPair struct {
- // Where to write the output.
- Out *uint64
-
- // The network stats file to read.
- File string
- }
-
- // Ingress for host veth is from the container. Hence tx_bytes stat on the host veth is actually number of bytes received by the container.
- netStats := []netStatsPair{
- {Out: &out.RxBytes, File: "tx_bytes"},
- {Out: &out.RxPackets, File: "tx_packets"},
- {Out: &out.RxErrors, File: "tx_errors"},
- {Out: &out.RxDropped, File: "tx_dropped"},
-
- {Out: &out.TxBytes, File: "rx_bytes"},
- {Out: &out.TxPackets, File: "rx_packets"},
- {Out: &out.TxErrors, File: "rx_errors"},
- {Out: &out.TxDropped, File: "rx_dropped"},
- }
- for _, netStat := range netStats {
- data, err := readSysfsNetworkStats(networkState.VethHost, netStat.File)
- if err != nil {
- return nil, err
- }
- *(netStat.Out) = data
- }
-
- return out, nil
-}
-
-// Reads the specified statistics available under /sys/class/net/<EthInterface>/statistics
-func readSysfsNetworkStats(ethInterface, statsFile string) (uint64, error) {
- fullPath := filepath.Join("/sys/class/net", ethInterface, "statistics", statsFile)
- data, err := ioutil.ReadFile(fullPath)
- if err != nil {
- return 0, err
- }
- value, err := strconv.ParseUint(strings.TrimSpace(string(data)), 10, 64)
- if err != nil {
- return 0, err
- }
-
- return value, err
-}
diff --git a/vendor/src/github.com/docker/libcontainer/network/strategy.go b/vendor/src/github.com/docker/libcontainer/network/strategy.go
deleted file mode 100644
index 019fe62f41..0000000000
--- a/vendor/src/github.com/docker/libcontainer/network/strategy.go
+++ /dev/null
@@ -1,34 +0,0 @@
-// +build linux
-
-package network
-
-import (
- "errors"
-)
-
-var (
- ErrNotValidStrategyType = errors.New("not a valid network strategy type")
-)
-
-var strategies = map[string]NetworkStrategy{
- "veth": &Veth{},
- "loopback": &Loopback{},
-}
-
-// NetworkStrategy represents a specific network configuration for
-// a container's networking stack
-type NetworkStrategy interface {
- Create(*Network, int, *NetworkState) error
- Initialize(*Network, *NetworkState) error
-}
-
-// GetStrategy returns the specific network strategy for the
-// provided type. If no strategy is registered for the type an
-// ErrNotValidStrategyType is returned.
-func GetStrategy(tpe string) (NetworkStrategy, error) {
- s, exists := strategies[tpe]
- if !exists {
- return nil, ErrNotValidStrategyType
- }
- return s, nil
-}
diff --git a/vendor/src/github.com/docker/libcontainer/network/types.go b/vendor/src/github.com/docker/libcontainer/network/types.go
deleted file mode 100644
index dcf00420f3..0000000000
--- a/vendor/src/github.com/docker/libcontainer/network/types.go
+++ /dev/null
@@ -1,50 +0,0 @@
-package network
-
-// Network defines configuration for a container's networking stack
-//
-// The network configuration can be omited from a container causing the
-// container to be setup with the host's networking stack
-type Network struct {
- // Type sets the networks type, commonly veth and loopback
- Type string `json:"type,omitempty"`
-
- // The bridge to use.
- Bridge string `json:"bridge,omitempty"`
-
- // Prefix for the veth interfaces.
- VethPrefix string `json:"veth_prefix,omitempty"`
-
- // MacAddress contains the MAC address to set on the network interface
- MacAddress string `json:"mac_address,omitempty"`
-
- // Address contains the IPv4 and mask to set on the network interface
- Address string `json:"address,omitempty"`
-
- // IPv6Address contains the IPv6 and mask to set on the network interface
- IPv6Address string `json:"ipv6_address,omitempty"`
-
- // Gateway sets the gateway address that is used as the default for the interface
- Gateway string `json:"gateway,omitempty"`
-
- // IPv6Gateway sets the ipv6 gateway address that is used as the default for the interface
- IPv6Gateway string `json:"ipv6_gateway,omitempty"`
-
- // Mtu sets the mtu value for the interface and will be mirrored on both the host and
- // container's interfaces if a pair is created, specifically in the case of type veth
- // Note: This does not apply to loopback interfaces.
- Mtu int `json:"mtu,omitempty"`
-
- // TxQueueLen sets the tx_queuelen value for the interface and will be mirrored on both the host and
- // container's interfaces if a pair is created, specifically in the case of type veth
- // Note: This does not apply to loopback interfaces.
- TxQueueLen int `json:"txqueuelen,omitempty"`
-}
-
-// Struct describing the network specific runtime state that will be maintained by libcontainer for all running containers
-// Do not depend on it outside of libcontainer.
-type NetworkState struct {
- // The name of the veth interface on the Host.
- VethHost string `json:"veth_host,omitempty"`
- // The name of the veth interface created inside the container for the child.
- VethChild string `json:"veth_child,omitempty"`
-}
diff --git a/vendor/src/github.com/docker/libcontainer/network/veth.go b/vendor/src/github.com/docker/libcontainer/network/veth.go
deleted file mode 100644
index 3d7dc8729e..0000000000
--- a/vendor/src/github.com/docker/libcontainer/network/veth.go
+++ /dev/null
@@ -1,122 +0,0 @@
-// +build linux
-
-package network
-
-import (
- "fmt"
-
- "github.com/docker/libcontainer/netlink"
- "github.com/docker/libcontainer/utils"
-)
-
-// Veth is a network strategy that uses a bridge and creates
-// a veth pair, one that stays outside on the host and the other
-// is placed inside the container's namespace
-type Veth struct {
-}
-
-const defaultDevice = "eth0"
-
-func (v *Veth) Create(n *Network, nspid int, networkState *NetworkState) error {
- var (
- bridge = n.Bridge
- prefix = n.VethPrefix
- txQueueLen = n.TxQueueLen
- )
- if bridge == "" {
- return fmt.Errorf("bridge is not specified")
- }
- if prefix == "" {
- return fmt.Errorf("veth prefix is not specified")
- }
- name1, name2, err := createVethPair(prefix, txQueueLen)
- if err != nil {
- return err
- }
- if err := SetInterfaceMaster(name1, bridge); err != nil {
- return err
- }
- if err := SetMtu(name1, n.Mtu); err != nil {
- return err
- }
- if err := InterfaceUp(name1); err != nil {
- return err
- }
- if err := SetInterfaceInNamespacePid(name2, nspid); err != nil {
- return err
- }
- networkState.VethHost = name1
- networkState.VethChild = name2
-
- return nil
-}
-
-func (v *Veth) Initialize(config *Network, networkState *NetworkState) error {
- var vethChild = networkState.VethChild
- if vethChild == "" {
- return fmt.Errorf("vethChild is not specified")
- }
- if err := InterfaceDown(vethChild); err != nil {
- return fmt.Errorf("interface down %s %s", vethChild, err)
- }
- if err := ChangeInterfaceName(vethChild, defaultDevice); err != nil {
- return fmt.Errorf("change %s to %s %s", vethChild, defaultDevice, err)
- }
- if config.MacAddress != "" {
- if err := SetInterfaceMac(defaultDevice, config.MacAddress); err != nil {
- return fmt.Errorf("set %s mac %s", defaultDevice, err)
- }
- }
- if err := SetInterfaceIp(defaultDevice, config.Address); err != nil {
- return fmt.Errorf("set %s ip %s", defaultDevice, err)
- }
- if config.IPv6Address != "" {
- if err := SetInterfaceIp(defaultDevice, config.IPv6Address); err != nil {
- return fmt.Errorf("set %s ipv6 %s", defaultDevice, err)
- }
- }
-
- if err := SetMtu(defaultDevice, config.Mtu); err != nil {
- return fmt.Errorf("set %s mtu to %d %s", defaultDevice, config.Mtu, err)
- }
- if err := InterfaceUp(defaultDevice); err != nil {
- return fmt.Errorf("%s up %s", defaultDevice, err)
- }
- if config.Gateway != "" {
- if err := SetDefaultGateway(config.Gateway, defaultDevice); err != nil {
- return fmt.Errorf("set gateway to %s on device %s failed with %s", config.Gateway, defaultDevice, err)
- }
- }
- if config.IPv6Gateway != "" {
- if err := SetDefaultGateway(config.IPv6Gateway, defaultDevice); err != nil {
- return fmt.Errorf("set gateway for ipv6 to %s on device %s failed with %s", config.IPv6Gateway, defaultDevice, err)
- }
- }
- return nil
-}
-
-// createVethPair will automatically generage two random names for
-// the veth pair and ensure that they have been created
-func createVethPair(prefix string, txQueueLen int) (name1 string, name2 string, err error) {
- for i := 0; i < 10; i++ {
- if name1, err = utils.GenerateRandomName(prefix, 7); err != nil {
- return
- }
-
- if name2, err = utils.GenerateRandomName(prefix, 7); err != nil {
- return
- }
-
- if err = CreateVethPair(name1, name2, txQueueLen); err != nil {
- if err == netlink.ErrInterfaceExists {
- continue
- }
-
- return
- }
-
- break
- }
-
- return
-}
diff --git a/vendor/src/github.com/docker/libcontainer/network/veth_test.go b/vendor/src/github.com/docker/libcontainer/network/veth_test.go
deleted file mode 100644
index b92b284eb0..0000000000
--- a/vendor/src/github.com/docker/libcontainer/network/veth_test.go
+++ /dev/null
@@ -1,53 +0,0 @@
-// +build linux
-
-package network
-
-import (
- "testing"
-
- "github.com/docker/libcontainer/netlink"
-)
-
-func TestGenerateVethNames(t *testing.T) {
- if testing.Short() {
- return
- }
-
- prefix := "veth"
-
- name1, name2, err := createVethPair(prefix, 0)
- if err != nil {
- t.Fatal(err)
- }
-
- if name1 == "" {
- t.Fatal("name1 should not be empty")
- }
-
- if name2 == "" {
- t.Fatal("name2 should not be empty")
- }
-}
-
-func TestCreateDuplicateVethPair(t *testing.T) {
- if testing.Short() {
- return
- }
-
- prefix := "veth"
-
- name1, name2, err := createVethPair(prefix, 0)
- if err != nil {
- t.Fatal(err)
- }
-
- // retry to create the name interfaces and make sure that we get the correct error
- err = CreateVethPair(name1, name2, 0)
- if err == nil {
- t.Fatal("expected error to not be nil with duplicate interface")
- }
-
- if err != netlink.ErrInterfaceExists {
- t.Fatalf("expected error to be ErrInterfaceExists but received %q", err)
- }
-}
diff --git a/vendor/src/github.com/docker/libcontainer/network_linux.go b/vendor/src/github.com/docker/libcontainer/network_linux.go
new file mode 100644
index 0000000000..46c606a2bb
--- /dev/null
+++ b/vendor/src/github.com/docker/libcontainer/network_linux.go
@@ -0,0 +1,213 @@
+// +build linux
+
+package libcontainer
+
+import (
+ "fmt"
+ "io/ioutil"
+ "net"
+ "path/filepath"
+ "strconv"
+ "strings"
+
+ "github.com/docker/libcontainer/netlink"
+ "github.com/docker/libcontainer/utils"
+)
+
+var strategies = map[string]networkStrategy{
+ "veth": &veth{},
+ "loopback": &loopback{},
+}
+
+// networkStrategy represents a specific network configuration for
+// a container's networking stack
+type networkStrategy interface {
+ create(*network, int) error
+ initialize(*network) error
+}
+
+// getStrategy returns the specific network strategy for the
+// provided type.
+func getStrategy(tpe string) (networkStrategy, error) {
+ s, exists := strategies[tpe]
+ if !exists {
+ return nil, fmt.Errorf("unknown strategy type %q", tpe)
+ }
+ return s, nil
+}
+
+// Returns the network statistics for the network interfaces represented by the NetworkRuntimeInfo.
+func getNetworkInterfaceStats(interfaceName string) (*NetworkInterface, error) {
+ out := &NetworkInterface{Name: interfaceName}
+ // This can happen if the network runtime information is missing - possible if the
+ // container was created by an old version of libcontainer.
+ if interfaceName == "" {
+ return out, nil
+ }
+ type netStatsPair struct {
+ // Where to write the output.
+ Out *uint64
+ // The network stats file to read.
+ File string
+ }
+ // Ingress for host veth is from the container. Hence tx_bytes stat on the host veth is actually number of bytes received by the container.
+ netStats := []netStatsPair{
+ {Out: &out.RxBytes, File: "tx_bytes"},
+ {Out: &out.RxPackets, File: "tx_packets"},
+ {Out: &out.RxErrors, File: "tx_errors"},
+ {Out: &out.RxDropped, File: "tx_dropped"},
+
+ {Out: &out.TxBytes, File: "rx_bytes"},
+ {Out: &out.TxPackets, File: "rx_packets"},
+ {Out: &out.TxErrors, File: "rx_errors"},
+ {Out: &out.TxDropped, File: "rx_dropped"},
+ }
+ for _, netStat := range netStats {
+ data, err := readSysfsNetworkStats(interfaceName, netStat.File)
+ if err != nil {
+ return nil, err
+ }
+ *(netStat.Out) = data
+ }
+ return out, nil
+}
+
+// Reads the specified statistics available under /sys/class/net/<EthInterface>/statistics
+func readSysfsNetworkStats(ethInterface, statsFile string) (uint64, error) {
+ data, err := ioutil.ReadFile(filepath.Join("/sys/class/net", ethInterface, "statistics", statsFile))
+ if err != nil {
+ return 0, err
+ }
+ return strconv.ParseUint(strings.TrimSpace(string(data)), 10, 64)
+}
+
+// loopback is a network strategy that provides a basic loopback device
+type loopback struct {
+}
+
+func (l *loopback) create(n *network, nspid int) error {
+ return nil
+}
+
+func (l *loopback) initialize(config *network) error {
+ iface, err := net.InterfaceByName("lo")
+ if err != nil {
+ return err
+ }
+ return netlink.NetworkLinkUp(iface)
+}
+
+// veth is a network strategy that uses a bridge and creates
+// a veth pair, one that is attached to the bridge on the host and the other
+// is placed inside the container's namespace
+type veth struct {
+}
+
+func (v *veth) create(n *network, nspid int) (err error) {
+ tmpName, err := v.generateTempPeerName()
+ if err != nil {
+ return err
+ }
+ n.TempVethPeerName = tmpName
+ defer func() {
+ if err != nil {
+ netlink.NetworkLinkDel(n.HostInterfaceName)
+ netlink.NetworkLinkDel(n.TempVethPeerName)
+ }
+ }()
+ if n.Bridge == "" {
+ return fmt.Errorf("bridge is not specified")
+ }
+ bridge, err := net.InterfaceByName(n.Bridge)
+ if err != nil {
+ return err
+ }
+ if err := netlink.NetworkCreateVethPair(n.HostInterfaceName, n.TempVethPeerName, n.TxQueueLen); err != nil {
+ return err
+ }
+ host, err := net.InterfaceByName(n.HostInterfaceName)
+ if err != nil {
+ return err
+ }
+ if err := netlink.AddToBridge(host, bridge); err != nil {
+ return err
+ }
+ if err := netlink.NetworkSetMTU(host, n.Mtu); err != nil {
+ return err
+ }
+ if n.HairpinMode {
+ if err := netlink.SetHairpinMode(host, true); err != nil {
+ return err
+ }
+ }
+ if err := netlink.NetworkLinkUp(host); err != nil {
+ return err
+ }
+ child, err := net.InterfaceByName(n.TempVethPeerName)
+ if err != nil {
+ return err
+ }
+ return netlink.NetworkSetNsPid(child, nspid)
+}
+
+func (v *veth) generateTempPeerName() (string, error) {
+ return utils.GenerateRandomName("veth", 7)
+}
+
+func (v *veth) initialize(config *network) error {
+ peer := config.TempVethPeerName
+ if peer == "" {
+ return fmt.Errorf("peer is not specified")
+ }
+ child, err := net.InterfaceByName(peer)
+ if err != nil {
+ return err
+ }
+ if err := netlink.NetworkLinkDown(child); err != nil {
+ return err
+ }
+ if err := netlink.NetworkChangeName(child, config.Name); err != nil {
+ return err
+ }
+ // get the interface again after we changed the name as the index also changes.
+ if child, err = net.InterfaceByName(config.Name); err != nil {
+ return err
+ }
+ if config.MacAddress != "" {
+ if err := netlink.NetworkSetMacAddress(child, config.MacAddress); err != nil {
+ return err
+ }
+ }
+ ip, ipNet, err := net.ParseCIDR(config.Address)
+ if err != nil {
+ return err
+ }
+ if err := netlink.NetworkLinkAddIp(child, ip, ipNet); err != nil {
+ return err
+ }
+ if config.IPv6Address != "" {
+ if ip, ipNet, err = net.ParseCIDR(config.IPv6Address); err != nil {
+ return err
+ }
+ if err := netlink.NetworkLinkAddIp(child, ip, ipNet); err != nil {
+ return err
+ }
+ }
+ if err := netlink.NetworkSetMTU(child, config.Mtu); err != nil {
+ return err
+ }
+ if err := netlink.NetworkLinkUp(child); err != nil {
+ return err
+ }
+ if config.Gateway != "" {
+ if err := netlink.AddDefaultGw(config.Gateway, config.Name); err != nil {
+ return err
+ }
+ }
+ if config.IPv6Gateway != "" {
+ if err := netlink.AddDefaultGw(config.IPv6Gateway, config.Name); err != nil {
+ return err
+ }
+ }
+ return nil
+}
diff --git a/vendor/src/github.com/docker/libcontainer/notify_linux.go b/vendor/src/github.com/docker/libcontainer/notify_linux.go
index a4923273a3..cf81e24d44 100644
--- a/vendor/src/github.com/docker/libcontainer/notify_linux.go
+++ b/vendor/src/github.com/docker/libcontainer/notify_linux.go
@@ -12,11 +12,11 @@ import (
const oomCgroupName = "memory"
-// NotifyOnOOM returns channel on which you can expect event about OOM,
+// notifyOnOOM returns channel on which you can expect event about OOM,
// if process died without OOM this channel will be closed.
// s is current *libcontainer.State for container.
-func NotifyOnOOM(s *State) (<-chan struct{}, error) {
- dir := s.CgroupPaths[oomCgroupName]
+func notifyOnOOM(paths map[string]string) (<-chan struct{}, error) {
+ dir := paths[oomCgroupName]
if dir == "" {
return nil, fmt.Errorf("There is no path for %q in state", oomCgroupName)
}
@@ -26,6 +26,7 @@ func NotifyOnOOM(s *State) (<-chan struct{}, error) {
}
fd, _, syserr := syscall.RawSyscall(syscall.SYS_EVENTFD2, 0, syscall.FD_CLOEXEC, 0)
if syserr != 0 {
+ oomControl.Close()
return nil, syserr
}
diff --git a/vendor/src/github.com/docker/libcontainer/notify_linux_test.go b/vendor/src/github.com/docker/libcontainer/notify_linux_test.go
index 5d1d54576b..09bdf64432 100644
--- a/vendor/src/github.com/docker/libcontainer/notify_linux_test.go
+++ b/vendor/src/github.com/docker/libcontainer/notify_linux_test.go
@@ -27,12 +27,10 @@ func TestNotifyOnOOM(t *testing.T) {
t.Fatal(err)
}
var eventFd, oomControlFd int
- st := &State{
- CgroupPaths: map[string]string{
- "memory": memoryPath,
- },
+ paths := map[string]string{
+ "memory": memoryPath,
}
- ooms, err := NotifyOnOOM(st)
+ ooms, err := notifyOnOOM(paths)
if err != nil {
t.Fatal("expected no error, got:", err)
}
diff --git a/vendor/src/github.com/docker/libcontainer/namespaces/nsenter/README.md b/vendor/src/github.com/docker/libcontainer/nsenter/README.md
index ac94cba059..ac94cba059 100644
--- a/vendor/src/github.com/docker/libcontainer/namespaces/nsenter/README.md
+++ b/vendor/src/github.com/docker/libcontainer/nsenter/README.md
diff --git a/vendor/src/github.com/docker/libcontainer/nsenter/nsenter.go b/vendor/src/github.com/docker/libcontainer/nsenter/nsenter.go
new file mode 100644
index 0000000000..07f4d63e43
--- /dev/null
+++ b/vendor/src/github.com/docker/libcontainer/nsenter/nsenter.go
@@ -0,0 +1,12 @@
+// +build linux,!gccgo
+
+package nsenter
+
+/*
+#cgo CFLAGS: -Wall
+extern void nsexec();
+void __attribute__((constructor)) init(void) {
+ nsexec();
+}
+*/
+import "C"
diff --git a/vendor/src/github.com/docker/libcontainer/nsenter/nsenter_gccgo.go b/vendor/src/github.com/docker/libcontainer/nsenter/nsenter_gccgo.go
new file mode 100644
index 0000000000..63c7a3ec22
--- /dev/null
+++ b/vendor/src/github.com/docker/libcontainer/nsenter/nsenter_gccgo.go
@@ -0,0 +1,25 @@
+// +build linux,gccgo
+
+package nsenter
+
+/*
+#cgo CFLAGS: -Wall
+extern void nsexec();
+void __attribute__((constructor)) init(void) {
+ nsexec();
+}
+*/
+import "C"
+
+// AlwaysFalse is here to stay false
+// (and be exported so the compiler doesn't optimize out its reference)
+var AlwaysFalse bool
+
+func init() {
+ if AlwaysFalse {
+ // by referencing this C init() in a noop test, it will ensure the compiler
+ // links in the C function.
+ // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65134
+ C.init()
+ }
+}
diff --git a/vendor/src/github.com/docker/libcontainer/namespaces/nsenter/nsenter_test.go b/vendor/src/github.com/docker/libcontainer/nsenter/nsenter_test.go
index 14870c457e..34e1f52118 100644
--- a/vendor/src/github.com/docker/libcontainer/namespaces/nsenter/nsenter_test.go
+++ b/vendor/src/github.com/docker/libcontainer/nsenter/nsenter_test.go
@@ -1,17 +1,20 @@
package nsenter
import (
+ "encoding/json"
"fmt"
"os"
"os/exec"
- "os/signal"
"strings"
- "syscall"
"testing"
)
+type pid struct {
+ Pid int `json:"Pid"`
+}
+
func TestNsenterAlivePid(t *testing.T) {
- args := []string{"nsenter-exec", "--nspid", fmt.Sprintf("%d", os.Getpid())}
+ args := []string{"nsenter-exec"}
r, w, err := os.Pipe()
if err != nil {
t.Fatalf("failed to create pipe %v", err)
@@ -20,30 +23,39 @@ func TestNsenterAlivePid(t *testing.T) {
cmd := &exec.Cmd{
Path: os.Args[0],
Args: args,
- ExtraFiles: []*os.File{r},
+ ExtraFiles: []*os.File{w},
+ Env: []string{fmt.Sprintf("_LIBCONTAINER_INITPID=%d", os.Getpid())},
}
if err := cmd.Start(); err != nil {
t.Fatalf("nsenter failed to start %v", err)
}
- r.Close()
+ w.Close()
- // unblock the child process
- if _, err := w.WriteString("1"); err != nil {
- t.Fatalf("parent failed to write synchronization data %v", err)
+ decoder := json.NewDecoder(r)
+ var pid *pid
+
+ if err := decoder.Decode(&pid); err != nil {
+ t.Fatalf("%v", err)
}
if err := cmd.Wait(); err != nil {
t.Fatalf("nsenter exits with a non-zero exit status")
}
+ p, err := os.FindProcess(pid.Pid)
+ if err != nil {
+ t.Fatalf("%v", err)
+ }
+ p.Wait()
}
func TestNsenterInvalidPid(t *testing.T) {
- args := []string{"nsenter-exec", "--nspid", "-1"}
+ args := []string{"nsenter-exec"}
cmd := &exec.Cmd{
Path: os.Args[0],
Args: args,
+ Env: []string{"_LIBCONTAINER_INITPID=-1"},
}
err := cmd.Run()
@@ -53,21 +65,16 @@ func TestNsenterInvalidPid(t *testing.T) {
}
func TestNsenterDeadPid(t *testing.T) {
-
- c := make(chan os.Signal)
- signal.Notify(c, syscall.SIGCHLD)
dead_cmd := exec.Command("true")
- if err := dead_cmd.Start(); err != nil {
+ if err := dead_cmd.Run(); err != nil {
t.Fatal(err)
}
- defer dead_cmd.Wait()
- <-c // dead_cmd is zombie
-
- args := []string{"nsenter-exec", "--nspid", fmt.Sprintf("%d", dead_cmd.Process.Pid)}
+ args := []string{"nsenter-exec"}
cmd := &exec.Cmd{
Path: os.Args[0],
Args: args,
+ Env: []string{fmt.Sprintf("_LIBCONTAINER_INITPID=%d", dead_cmd.Process.Pid)},
}
err := cmd.Run()
diff --git a/vendor/src/github.com/docker/libcontainer/namespaces/nsenter/nsenter_unsupported.go b/vendor/src/github.com/docker/libcontainer/nsenter/nsenter_unsupported.go
index 2459c6367e..2459c6367e 100644
--- a/vendor/src/github.com/docker/libcontainer/namespaces/nsenter/nsenter_unsupported.go
+++ b/vendor/src/github.com/docker/libcontainer/nsenter/nsenter_unsupported.go
diff --git a/vendor/src/github.com/docker/libcontainer/nsenter/nsexec.c b/vendor/src/github.com/docker/libcontainer/nsenter/nsexec.c
new file mode 100644
index 0000000000..e7658f3856
--- /dev/null
+++ b/vendor/src/github.com/docker/libcontainer/nsenter/nsexec.c
@@ -0,0 +1,168 @@
+#define _GNU_SOURCE
+#include <stdlib.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <errno.h>
+#include <string.h>
+
+#include <linux/limits.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/ioctl.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <setjmp.h>
+#include <sched.h>
+#include <signal.h>
+
+/* All arguments should be above stack, because it grows down */
+struct clone_arg {
+ /*
+ * Reserve some space for clone() to locate arguments
+ * and retcode in this place
+ */
+ char stack[4096] __attribute__ ((aligned(8)));
+ char stack_ptr[0];
+ jmp_buf *env;
+};
+
+#define pr_perror(fmt, ...) fprintf(stderr, "nsenter: " fmt ": %m\n", ##__VA_ARGS__)
+
+static int child_func(void *_arg)
+{
+ struct clone_arg *arg = (struct clone_arg *)_arg;
+ longjmp(*arg->env, 1);
+}
+
+// Use raw setns syscall for versions of glibc that don't include it (namely glibc-2.12)
+#if __GLIBC__ == 2 && __GLIBC_MINOR__ < 14
+#define _GNU_SOURCE
+#include "syscall.h"
+#ifdef SYS_setns
+int setns(int fd, int nstype)
+{
+ return syscall(SYS_setns, fd, nstype);
+}
+#endif
+#endif
+
+static int clone_parent(jmp_buf * env) __attribute__ ((noinline));
+static int clone_parent(jmp_buf * env)
+{
+ struct clone_arg ca;
+ int child;
+
+ ca.env = env;
+ child = clone(child_func, ca.stack_ptr, CLONE_PARENT | SIGCHLD, &ca);
+
+ return child;
+}
+
+void nsexec()
+{
+ char *namespaces[] = { "ipc", "uts", "net", "pid", "mnt" };
+ const int num = sizeof(namespaces) / sizeof(char *);
+ jmp_buf env;
+ char buf[PATH_MAX], *val;
+ int i, tfd, child, len, consolefd = -1;
+ pid_t pid;
+ char *console;
+
+ val = getenv("_LIBCONTAINER_INITPID");
+ if (val == NULL)
+ return;
+
+ pid = atoi(val);
+ snprintf(buf, sizeof(buf), "%d", pid);
+ if (strcmp(val, buf)) {
+ pr_perror("Unable to parse _LIBCONTAINER_INITPID");
+ exit(1);
+ }
+
+ console = getenv("_LIBCONTAINER_CONSOLE_PATH");
+ if (console != NULL) {
+ consolefd = open(console, O_RDWR);
+ if (consolefd < 0) {
+ pr_perror("Failed to open console %s", console);
+ exit(1);
+ }
+ }
+
+ /* Check that the specified process exists */
+ snprintf(buf, PATH_MAX - 1, "/proc/%d/ns", pid);
+ tfd = open(buf, O_DIRECTORY | O_RDONLY);
+ if (tfd == -1) {
+ pr_perror("Failed to open \"%s\"", buf);
+ exit(1);
+ }
+
+ for (i = 0; i < num; i++) {
+ struct stat st;
+ int fd;
+
+ /* Symlinks on all namespaces exist for dead processes, but they can't be opened */
+ if (fstatat(tfd, namespaces[i], &st, AT_SYMLINK_NOFOLLOW) == -1) {
+ // Ignore nonexistent namespaces.
+ if (errno == ENOENT)
+ continue;
+ }
+
+ fd = openat(tfd, namespaces[i], O_RDONLY);
+ if (fd == -1) {
+ pr_perror("Failed to open ns file %s for ns %s", buf,
+ namespaces[i]);
+ exit(1);
+ }
+ // Set the namespace.
+ if (setns(fd, 0) == -1) {
+ pr_perror("Failed to setns for %s", namespaces[i]);
+ exit(1);
+ }
+ close(fd);
+ }
+
+ if (setjmp(env) == 1) {
+ if (setsid() == -1) {
+ pr_perror("setsid failed");
+ exit(1);
+ }
+ if (consolefd != -1) {
+ if (ioctl(consolefd, TIOCSCTTY, 0) == -1) {
+ pr_perror("ioctl TIOCSCTTY failed");
+ exit(1);
+ }
+ if (dup2(consolefd, STDIN_FILENO) != STDIN_FILENO) {
+ pr_perror("Failed to dup 0");
+ exit(1);
+ }
+ if (dup2(consolefd, STDOUT_FILENO) != STDOUT_FILENO) {
+ pr_perror("Failed to dup 1");
+ exit(1);
+ }
+ if (dup2(consolefd, STDERR_FILENO) != STDERR_FILENO) {
+ pr_perror("Failed to dup 2");
+ exit(1);
+ }
+ }
+ // Finish executing, let the Go runtime take over.
+ return;
+ }
+
+ child = clone_parent(&env);
+ if (child < 0) {
+ pr_perror("Unable to fork");
+ exit(1);
+ }
+
+ len = snprintf(buf, sizeof(buf), "{ \"pid\" : %d }\n", child);
+
+ if (write(3, buf, len) != len) {
+ pr_perror("Unable to send a child pid");
+ kill(child, SIGKILL);
+ exit(1);
+ }
+
+ exit(0);
+}
diff --git a/vendor/src/github.com/docker/libcontainer/nsinit/Makefile b/vendor/src/github.com/docker/libcontainer/nsinit/Makefile
new file mode 100644
index 0000000000..57adf154d8
--- /dev/null
+++ b/vendor/src/github.com/docker/libcontainer/nsinit/Makefile
@@ -0,0 +1,2 @@
+all:
+ go build -o nsinit .
diff --git a/vendor/src/github.com/docker/libcontainer/nsinit/README.md b/vendor/src/github.com/docker/libcontainer/nsinit/README.md
new file mode 100644
index 0000000000..f2e66a866d
--- /dev/null
+++ b/vendor/src/github.com/docker/libcontainer/nsinit/README.md
@@ -0,0 +1,67 @@
+## nsinit
+
+`nsinit` is a cli application which demonstrates the use of libcontainer.
+It is able to spawn new containers or join existing containers.
+
+### How to build?
+
+First add the `libcontainer/vendor` into your GOPATH. It's because libcontainer
+vendors all its dependencies, so it can be built predictably.
+
+```
+export GOPATH=$GOPATH:/your/path/to/libcontainer/vendor
+```
+
+Then get into the nsinit folder and get the imported file. Use `make` command
+to make the nsinit binary.
+
+```
+cd libcontainer/nsinit
+go get
+make
+```
+
+We have finished compiling the nsinit package, but a root filesystem must be
+provided for use along with a container configuration file.
+
+Choose a proper place to run your container. For example we use `/busybox`.
+
+```
+mkdir /busybox
+curl -sSL 'https://github.com/jpetazzo/docker-busybox/raw/buildroot-2014.11/rootfs.tar' | tar -xC /busybox
+```
+
+Then you may need to write a configuration file named `container.json` in the
+`/busybox` folder. Environment, networking, and different capabilities for
+the container are specified in this file. The configuration is used for each
+process executed inside the container.
+
+See the `sample_configs` folder for examples of what the container configuration
+should look like.
+
+```
+cp libcontainer/sample_configs/minimal.json /busybox/container.json
+cd /busybox
+```
+
+You can customize `container.json` per your needs. After that, nsinit is
+ready to work.
+
+To execute `/bin/bash` in the current directory as a container just run the
+following **as root**:
+
+```bash
+nsinit exec --tty --config container.json /bin/bash
+```
+
+If you wish to spawn another process inside the container while your current
+bash session is running, run the same command again to get another bash shell
+(or change the command). If the original process (PID 1) dies, all other
+processes spawned inside the container will be killed and the namespace will
+be removed.
+
+You can identify if a process is running in a container by looking to see if
+`state.json` is in the root of the directory.
+
+You may also specify an alternate root directory from where the `container.json`
+file is read and where the `state.json` file will be saved.
diff --git a/vendor/src/github.com/docker/libcontainer/nsinit/config.go b/vendor/src/github.com/docker/libcontainer/nsinit/config.go
index 74c7b3c09f..e50bb3c11d 100644
--- a/vendor/src/github.com/docker/libcontainer/nsinit/config.go
+++ b/vendor/src/github.com/docker/libcontainer/nsinit/config.go
@@ -1,29 +1,286 @@
package main
import (
+ "bytes"
"encoding/json"
- "fmt"
- "log"
+ "io"
+ "math"
+ "os"
+ "path/filepath"
+ "strings"
+ "syscall"
+ "github.com/Sirupsen/logrus"
"github.com/codegangsta/cli"
+ "github.com/docker/libcontainer/configs"
+ "github.com/docker/libcontainer/utils"
)
+const defaultMountFlags = syscall.MS_NOEXEC | syscall.MS_NOSUID | syscall.MS_NODEV
+
+var createFlags = []cli.Flag{
+ cli.IntFlag{Name: "parent-death-signal", Usage: "set the signal that will be delivered to the process in case the parent dies"},
+ cli.BoolFlag{Name: "read-only", Usage: "set the container's rootfs as read-only"},
+ cli.StringSliceFlag{Name: "bind", Value: &cli.StringSlice{}, Usage: "add bind mounts to the container"},
+ cli.StringSliceFlag{Name: "tmpfs", Value: &cli.StringSlice{}, Usage: "add tmpfs mounts to the container"},
+ cli.IntFlag{Name: "cpushares", Usage: "set the cpushares for the container"},
+ cli.IntFlag{Name: "memory-limit", Usage: "set the memory limit for the container"},
+ cli.IntFlag{Name: "memory-swap", Usage: "set the memory swap limit for the container"},
+ cli.StringFlag{Name: "cpuset-cpus", Usage: "set the cpuset cpus"},
+ cli.StringFlag{Name: "cpuset-mems", Usage: "set the cpuset mems"},
+ cli.StringFlag{Name: "apparmor-profile", Usage: "set the apparmor profile"},
+ cli.StringFlag{Name: "process-label", Usage: "set the process label"},
+ cli.StringFlag{Name: "mount-label", Usage: "set the mount label"},
+ cli.StringFlag{Name: "rootfs", Usage: "set the rootfs"},
+ cli.IntFlag{Name: "userns-root-uid", Usage: "set the user namespace root uid"},
+ cli.StringFlag{Name: "hostname", Value: "nsinit", Usage: "hostname value for the container"},
+ cli.StringFlag{Name: "net", Value: "", Usage: "network namespace"},
+ cli.StringFlag{Name: "ipc", Value: "", Usage: "ipc namespace"},
+ cli.StringFlag{Name: "pid", Value: "", Usage: "pid namespace"},
+ cli.StringFlag{Name: "uts", Value: "", Usage: "uts namespace"},
+ cli.StringFlag{Name: "mnt", Value: "", Usage: "mount namespace"},
+ cli.StringFlag{Name: "veth-bridge", Usage: "veth bridge"},
+ cli.StringFlag{Name: "veth-address", Usage: "veth ip address"},
+ cli.StringFlag{Name: "veth-gateway", Usage: "veth gateway address"},
+ cli.IntFlag{Name: "veth-mtu", Usage: "veth mtu"},
+}
+
var configCommand = cli.Command{
- Name: "config",
- Usage: "display the container configuration",
- Action: configAction,
+ Name: "config",
+ Usage: "generate a standard configuration file for a container",
+ Flags: append([]cli.Flag{
+ cli.StringFlag{Name: "file,f", Value: "stdout", Usage: "write the configuration to the specified file"},
+ }, createFlags...),
+ Action: func(context *cli.Context) {
+ template := getTemplate()
+ modify(template, context)
+ data, err := json.MarshalIndent(template, "", "\t")
+ if err != nil {
+ fatal(err)
+ }
+ var f *os.File
+ filePath := context.String("file")
+ switch filePath {
+ case "stdout", "":
+ f = os.Stdout
+ default:
+ if f, err = os.Create(filePath); err != nil {
+ fatal(err)
+ }
+ defer f.Close()
+ }
+ if _, err := io.Copy(f, bytes.NewBuffer(data)); err != nil {
+ fatal(err)
+ }
+ },
}
-func configAction(context *cli.Context) {
- container, err := loadConfig()
- if err != nil {
- log.Fatal(err)
+func modify(config *configs.Config, context *cli.Context) {
+ config.ParentDeathSignal = context.Int("parent-death-signal")
+ config.Readonlyfs = context.Bool("read-only")
+ config.Cgroups.CpusetCpus = context.String("cpuset-cpus")
+ config.Cgroups.CpusetMems = context.String("cpuset-mems")
+ config.Cgroups.CpuShares = int64(context.Int("cpushares"))
+ config.Cgroups.Memory = int64(context.Int("memory-limit"))
+ config.Cgroups.MemorySwap = int64(context.Int("memory-swap"))
+ config.AppArmorProfile = context.String("apparmor-profile")
+ config.ProcessLabel = context.String("process-label")
+ config.MountLabel = context.String("mount-label")
+
+ rootfs := context.String("rootfs")
+ if rootfs != "" {
+ config.Rootfs = rootfs
}
- data, err := json.MarshalIndent(container, "", "\t")
+ userns_uid := context.Int("userns-root-uid")
+ if userns_uid != 0 {
+ config.Namespaces.Add(configs.NEWUSER, "")
+ config.UidMappings = []configs.IDMap{
+ {ContainerID: 0, HostID: userns_uid, Size: 1},
+ {ContainerID: 1, HostID: 1, Size: userns_uid - 1},
+ {ContainerID: userns_uid + 1, HostID: userns_uid + 1, Size: math.MaxInt32 - userns_uid},
+ }
+ config.GidMappings = []configs.IDMap{
+ {ContainerID: 0, HostID: userns_uid, Size: 1},
+ {ContainerID: 1, HostID: 1, Size: userns_uid - 1},
+ {ContainerID: userns_uid + 1, HostID: userns_uid + 1, Size: math.MaxInt32 - userns_uid},
+ }
+ for _, node := range config.Devices {
+ node.Uid = uint32(userns_uid)
+ node.Gid = uint32(userns_uid)
+ }
+ }
+ for _, rawBind := range context.StringSlice("bind") {
+ mount := &configs.Mount{
+ Device: "bind",
+ Flags: syscall.MS_BIND | syscall.MS_REC,
+ }
+ parts := strings.SplitN(rawBind, ":", 3)
+ switch len(parts) {
+ default:
+ logrus.Fatalf("invalid bind mount %s", rawBind)
+ case 2:
+ mount.Source, mount.Destination = parts[0], parts[1]
+ case 3:
+ mount.Source, mount.Destination = parts[0], parts[1]
+ switch parts[2] {
+ case "ro":
+ mount.Flags |= syscall.MS_RDONLY
+ case "rw":
+ default:
+ logrus.Fatalf("invalid bind mount mode %s", parts[2])
+ }
+ }
+ config.Mounts = append(config.Mounts, mount)
+ }
+ for _, tmpfs := range context.StringSlice("tmpfs") {
+ config.Mounts = append(config.Mounts, &configs.Mount{
+ Device: "tmpfs",
+ Destination: tmpfs,
+ Flags: syscall.MS_NOEXEC | syscall.MS_NOSUID | syscall.MS_NODEV,
+ })
+ }
+ for flag, value := range map[string]configs.NamespaceType{
+ "net": configs.NEWNET,
+ "mnt": configs.NEWNS,
+ "pid": configs.NEWPID,
+ "ipc": configs.NEWIPC,
+ "uts": configs.NEWUTS,
+ } {
+ switch v := context.String(flag); v {
+ case "host":
+ config.Namespaces.Remove(value)
+ case "", "private":
+ if !config.Namespaces.Contains(value) {
+ config.Namespaces.Add(value, "")
+ }
+ if flag == "net" {
+ config.Networks = []*configs.Network{
+ {
+ Type: "loopback",
+ Address: "127.0.0.1/0",
+ Gateway: "localhost",
+ },
+ }
+ }
+ if flag == "uts" {
+ config.Hostname = context.String("hostname")
+ }
+ default:
+ config.Namespaces.Remove(value)
+ config.Namespaces.Add(value, v)
+ }
+ }
+ if bridge := context.String("veth-bridge"); bridge != "" {
+ hostName, err := utils.GenerateRandomName("veth", 7)
+ if err != nil {
+ logrus.Fatal(err)
+ }
+ network := &configs.Network{
+ Type: "veth",
+ Name: "eth0",
+ Bridge: bridge,
+ Address: context.String("veth-address"),
+ Gateway: context.String("veth-gateway"),
+ Mtu: context.Int("veth-mtu"),
+ HostInterfaceName: hostName,
+ }
+ config.Networks = append(config.Networks, network)
+ }
+}
+
+func getTemplate() *configs.Config {
+ cwd, err := os.Getwd()
if err != nil {
- log.Fatal(err)
+ panic(err)
+ }
+ return &configs.Config{
+ Rootfs: cwd,
+ ParentDeathSignal: int(syscall.SIGKILL),
+ Capabilities: []string{
+ "CHOWN",
+ "DAC_OVERRIDE",
+ "FSETID",
+ "FOWNER",
+ "MKNOD",
+ "NET_RAW",
+ "SETGID",
+ "SETUID",
+ "SETFCAP",
+ "SETPCAP",
+ "NET_BIND_SERVICE",
+ "SYS_CHROOT",
+ "KILL",
+ "AUDIT_WRITE",
+ },
+ Namespaces: configs.Namespaces([]configs.Namespace{
+ {Type: configs.NEWNS},
+ {Type: configs.NEWUTS},
+ {Type: configs.NEWIPC},
+ {Type: configs.NEWPID},
+ {Type: configs.NEWNET},
+ }),
+ Cgroups: &configs.Cgroup{
+ Name: filepath.Base(cwd),
+ Parent: "nsinit",
+ AllowAllDevices: false,
+ AllowedDevices: configs.DefaultAllowedDevices,
+ },
+ Devices: configs.DefaultAutoCreatedDevices,
+ MaskPaths: []string{
+ "/proc/kcore",
+ },
+ ReadonlyPaths: []string{
+ "/proc/sys", "/proc/sysrq-trigger", "/proc/irq", "/proc/bus",
+ },
+ Mounts: []*configs.Mount{
+ {
+ Source: "proc",
+ Destination: "/proc",
+ Device: "proc",
+ Flags: defaultMountFlags,
+ },
+ {
+ Source: "tmpfs",
+ Destination: "/dev",
+ Device: "tmpfs",
+ Flags: syscall.MS_NOSUID | syscall.MS_STRICTATIME,
+ Data: "mode=755",
+ },
+ {
+ Source: "devpts",
+ Destination: "/dev/pts",
+ Device: "devpts",
+ Flags: syscall.MS_NOSUID | syscall.MS_NOEXEC,
+ Data: "newinstance,ptmxmode=0666,mode=0620,gid=5",
+ },
+ {
+ Device: "tmpfs",
+ Source: "shm",
+ Destination: "/dev/shm",
+ Data: "mode=1777,size=65536k",
+ Flags: defaultMountFlags,
+ },
+ {
+ Source: "mqueue",
+ Destination: "/dev/mqueue",
+ Device: "mqueue",
+ Flags: defaultMountFlags,
+ },
+ {
+ Source: "sysfs",
+ Destination: "/sys",
+ Device: "sysfs",
+ Flags: defaultMountFlags | syscall.MS_RDONLY,
+ },
+ },
+ Rlimits: []configs.Rlimit{
+ {
+ Type: syscall.RLIMIT_NOFILE,
+ Hard: 1024,
+ Soft: 1024,
+ },
+ },
}
- fmt.Printf("%s", data)
}
diff --git a/vendor/src/github.com/docker/libcontainer/nsinit/exec.go b/vendor/src/github.com/docker/libcontainer/nsinit/exec.go
index 6fc553b8f9..9d302aa31e 100644
--- a/vendor/src/github.com/docker/libcontainer/nsinit/exec.go
+++ b/vendor/src/github.com/docker/libcontainer/nsinit/exec.go
@@ -1,208 +1,116 @@
package main
import (
- "fmt"
- "io"
- "log"
"os"
"os/exec"
"os/signal"
"syscall"
- "text/tabwriter"
"github.com/codegangsta/cli"
- "github.com/docker/docker/pkg/term"
"github.com/docker/libcontainer"
- consolepkg "github.com/docker/libcontainer/console"
- "github.com/docker/libcontainer/namespaces"
+ "github.com/docker/libcontainer/utils"
)
+var standardEnvironment = &cli.StringSlice{
+ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
+ "HOSTNAME=nsinit",
+ "TERM=xterm",
+}
+
var execCommand = cli.Command{
Name: "exec",
Usage: "execute a new command inside a container",
Action: execAction,
- Flags: []cli.Flag{
- cli.BoolFlag{Name: "list", Usage: "list all registered exec functions"},
- cli.StringFlag{Name: "func", Value: "exec", Usage: "function name to exec inside a container"},
- },
+ Flags: append([]cli.Flag{
+ cli.BoolFlag{Name: "tty,t", Usage: "allocate a TTY to the container"},
+ cli.StringFlag{Name: "id", Value: "nsinit", Usage: "specify the ID for a container"},
+ cli.StringFlag{Name: "config", Value: "", Usage: "path to the configuration file"},
+ cli.StringFlag{Name: "user,u", Value: "root", Usage: "set the user, uid, and/or gid for the process"},
+ cli.StringFlag{Name: "cwd", Value: "", Usage: "set the current working dir"},
+ cli.StringSliceFlag{Name: "env", Value: standardEnvironment, Usage: "set environment variables for the process"},
+ }, createFlags...),
}
func execAction(context *cli.Context) {
- if context.Bool("list") {
- w := tabwriter.NewWriter(os.Stdout, 10, 1, 3, ' ', 0)
- fmt.Fprint(w, "NAME\tUSAGE\n")
-
- for k, f := range argvs {
- fmt.Fprintf(w, "%s\t%s\n", k, f.Usage)
- }
-
- w.Flush()
-
- return
+ factory, err := loadFactory(context)
+ if err != nil {
+ fatal(err)
}
-
- var exitCode int
-
- container, err := loadConfig()
+ config, err := loadConfig(context)
if err != nil {
- log.Fatal(err)
+ fatal(err)
}
-
- state, err := libcontainer.GetState(dataPath)
- if err != nil && !os.IsNotExist(err) {
- log.Fatalf("unable to read state.json: %s", err)
+ created := false
+ container, err := factory.Load(context.String("id"))
+ if err != nil {
+ created = true
+ if container, err = factory.Create(context.String("id"), config); err != nil {
+ fatal(err)
+ }
}
-
- if state != nil {
- exitCode, err = startInExistingContainer(container, state, context.String("func"), context)
- } else {
- exitCode, err = startContainer(container, dataPath, []string(context.Args()))
+ process := &libcontainer.Process{
+ Args: context.Args(),
+ Env: context.StringSlice("env"),
+ User: context.String("user"),
+ Cwd: context.String("cwd"),
+ Stdin: os.Stdin,
+ Stdout: os.Stdout,
+ Stderr: os.Stderr,
}
-
+ rootuid, err := config.HostUID()
if err != nil {
- log.Fatalf("failed to exec: %s", err)
+ fatal(err)
}
-
- os.Exit(exitCode)
-}
-
-// the process for execing a new process inside an existing container is that we have to exec ourself
-// with the nsenter argument so that the C code can setns an the namespaces that we require. Then that
-// code path will drop us into the path that we can do the final setup of the namespace and exec the users
-// application.
-func startInExistingContainer(config *libcontainer.Config, state *libcontainer.State, action string, context *cli.Context) (int, error) {
- var (
- master *os.File
- console string
- err error
-
- sigc = make(chan os.Signal, 10)
-
- stdin = os.Stdin
- stdout = os.Stdout
- stderr = os.Stderr
- )
- signal.Notify(sigc)
-
- if config.Tty {
- stdin = nil
- stdout = nil
- stderr = nil
-
- master, console, err = consolepkg.CreateMasterAndConsole()
- if err != nil {
- return -1, err
- }
-
- go io.Copy(master, os.Stdin)
- go io.Copy(os.Stdout, master)
-
- state, err := term.SetRawTerminal(os.Stdin.Fd())
- if err != nil {
- return -1, err
- }
-
- defer term.RestoreTerminal(os.Stdin.Fd(), state)
+ tty, err := newTty(context, process, rootuid)
+ if err != nil {
+ fatal(err)
}
-
- startCallback := func(cmd *exec.Cmd) {
- go func() {
- resizeTty(master)
-
- for sig := range sigc {
- switch sig {
- case syscall.SIGWINCH:
- resizeTty(master)
- default:
- cmd.Process.Signal(sig)
- }
- }
- }()
+ if err := tty.attach(process); err != nil {
+ fatal(err)
}
-
- return namespaces.ExecIn(config, state, context.Args(), os.Args[0], action, stdin, stdout, stderr, console, startCallback)
-}
-
-// startContainer starts the container. Returns the exit status or -1 and an
-// error.
-//
-// Signals sent to the current process will be forwarded to container.
-func startContainer(container *libcontainer.Config, dataPath string, args []string) (int, error) {
- var (
- cmd *exec.Cmd
- sigc = make(chan os.Signal, 10)
- )
-
- signal.Notify(sigc)
-
- createCommand := func(container *libcontainer.Config, console, dataPath, init string, pipe *os.File, args []string) *exec.Cmd {
- cmd = namespaces.DefaultCreateCommand(container, console, dataPath, init, pipe, args)
- if logPath != "" {
- cmd.Env = append(cmd.Env, fmt.Sprintf("log=%s", logPath))
+ go handleSignals(process, tty)
+ err = container.Start(process)
+ if err != nil {
+ tty.Close()
+ if created {
+ container.Destroy()
}
- return cmd
+ fatal(err)
}
- var (
- master *os.File
- console string
- err error
-
- stdin = os.Stdin
- stdout = os.Stdout
- stderr = os.Stderr
- )
-
- if container.Tty {
- stdin = nil
- stdout = nil
- stderr = nil
-
- master, console, err = consolepkg.CreateMasterAndConsole()
- if err != nil {
- return -1, err
- }
-
- go io.Copy(master, os.Stdin)
- go io.Copy(os.Stdout, master)
-
- state, err := term.SetRawTerminal(os.Stdin.Fd())
- if err != nil {
- return -1, err
+ status, err := process.Wait()
+ if err != nil {
+ exitError, ok := err.(*exec.ExitError)
+ if ok {
+ status = exitError.ProcessState
+ } else {
+ tty.Close()
+ if created {
+ container.Destroy()
+ }
+ fatal(err)
}
-
- defer term.RestoreTerminal(os.Stdin.Fd(), state)
}
-
- startCallback := func() {
- go func() {
- resizeTty(master)
-
- for sig := range sigc {
- switch sig {
- case syscall.SIGWINCH:
- resizeTty(master)
- default:
- cmd.Process.Signal(sig)
- }
- }
- }()
+ if created {
+ if err := container.Destroy(); err != nil {
+ tty.Close()
+ fatal(err)
+ }
}
-
- return namespaces.Exec(container, stdin, stdout, stderr, console, dataPath, args, createCommand, startCallback)
+ tty.Close()
+ os.Exit(utils.ExitStatus(status.Sys().(syscall.WaitStatus)))
}
-func resizeTty(master *os.File) {
- if master == nil {
- return
- }
-
- ws, err := term.GetWinsize(os.Stdin.Fd())
- if err != nil {
- return
- }
-
- if err := term.SetWinsize(master.Fd(), ws); err != nil {
- return
+func handleSignals(container *libcontainer.Process, tty *tty) {
+ sigc := make(chan os.Signal, 10)
+ signal.Notify(sigc)
+ tty.resize()
+ for sig := range sigc {
+ switch sig {
+ case syscall.SIGWINCH:
+ tty.resize()
+ default:
+ container.Signal(sig)
+ }
}
}
diff --git a/vendor/src/github.com/docker/libcontainer/nsinit/init.go b/vendor/src/github.com/docker/libcontainer/nsinit/init.go
index 6df9b1d894..7b2cf1935d 100644
--- a/vendor/src/github.com/docker/libcontainer/nsinit/init.go
+++ b/vendor/src/github.com/docker/libcontainer/nsinit/init.go
@@ -1,47 +1,28 @@
package main
import (
- "log"
- "os"
"runtime"
- "strconv"
+ log "github.com/Sirupsen/logrus"
"github.com/codegangsta/cli"
- "github.com/docker/libcontainer/namespaces"
+ "github.com/docker/libcontainer"
+ _ "github.com/docker/libcontainer/nsenter"
)
-var (
- dataPath = os.Getenv("data_path")
- console = os.Getenv("console")
- rawPipeFd = os.Getenv("pipe")
-
- initCommand = cli.Command{
- Name: "init",
- Usage: "runs the init process inside the namespace",
- Action: initAction,
- }
-)
-
-func initAction(context *cli.Context) {
- runtime.LockOSThread()
-
- container, err := loadConfig()
- if err != nil {
- log.Fatal(err)
- }
-
- rootfs, err := os.Getwd()
- if err != nil {
- log.Fatal(err)
- }
-
- pipeFd, err := strconv.Atoi(rawPipeFd)
- if err != nil {
- log.Fatal(err)
- }
-
- pipe := os.NewFile(uintptr(pipeFd), "pipe")
- if err := namespaces.Init(container, rootfs, console, pipe, []string(context.Args())); err != nil {
- log.Fatalf("unable to initialize for container: %s", err)
- }
+var initCommand = cli.Command{
+ Name: "init",
+ Usage: "runs the init process inside the namespace",
+ Action: func(context *cli.Context) {
+ log.SetLevel(log.DebugLevel)
+ runtime.GOMAXPROCS(1)
+ runtime.LockOSThread()
+ factory, err := libcontainer.New("")
+ if err != nil {
+ fatal(err)
+ }
+ if err := factory.StartInitialization(3); err != nil {
+ fatal(err)
+ }
+ panic("This line should never been executed")
+ },
}
diff --git a/vendor/src/github.com/docker/libcontainer/nsinit/main.go b/vendor/src/github.com/docker/libcontainer/nsinit/main.go
index 53625ca82c..eec064c2c4 100644
--- a/vendor/src/github.com/docker/libcontainer/nsinit/main.go
+++ b/vendor/src/github.com/docker/libcontainer/nsinit/main.go
@@ -1,57 +1,22 @@
package main
import (
- "log"
"os"
- "strings"
+ log "github.com/Sirupsen/logrus"
"github.com/codegangsta/cli"
)
-var (
- logPath = os.Getenv("log")
- argvs = make(map[string]*rFunc)
-)
-
-func init() {
- argvs["exec"] = &rFunc{
- Usage: "execute a process inside an existing container",
- Action: nsenterExec,
- }
-
- argvs["mknod"] = &rFunc{
- Usage: "mknod a device inside an existing container",
- Action: nsenterMknod,
- }
-
- argvs["ip"] = &rFunc{
- Usage: "display the container's network interfaces",
- Action: nsenterIp,
- }
-}
-
func main() {
- // we need to check our argv 0 for any registred functions to run instead of the
- // normal cli code path
- f, exists := argvs[strings.TrimPrefix(os.Args[0], "nsenter-")]
- if exists {
- runFunc(f)
-
- return
- }
-
app := cli.NewApp()
-
app.Name = "nsinit"
- app.Version = "0.1"
+ app.Version = "2"
app.Author = "libcontainer maintainers"
app.Flags = []cli.Flag{
- cli.StringFlag{Name: "nspid"},
- cli.StringFlag{Name: "console"},
+ cli.StringFlag{Name: "root", Value: "/var/run/nsinit", Usage: "root directory for containers"},
+ cli.StringFlag{Name: "log-file", Value: "", Usage: "set the log file to output logs to"},
+ cli.BoolFlag{Name: "debug", Usage: "enable debug output in the logs"},
}
-
- app.Before = preload
-
app.Commands = []cli.Command{
configCommand,
execCommand,
@@ -60,8 +25,21 @@ func main() {
pauseCommand,
statsCommand,
unpauseCommand,
+ stateCommand,
+ }
+ app.Before = func(context *cli.Context) error {
+ if context.GlobalBool("debug") {
+ log.SetLevel(log.DebugLevel)
+ }
+ if path := context.GlobalString("log-file"); path != "" {
+ f, err := os.Create(path)
+ if err != nil {
+ return err
+ }
+ log.SetOutput(f)
+ }
+ return nil
}
-
if err := app.Run(os.Args); err != nil {
log.Fatal(err)
}
diff --git a/vendor/src/github.com/docker/libcontainer/nsinit/nsenter.go b/vendor/src/github.com/docker/libcontainer/nsinit/nsenter.go
deleted file mode 100644
index 8dc149f4fb..0000000000
--- a/vendor/src/github.com/docker/libcontainer/nsinit/nsenter.go
+++ /dev/null
@@ -1,84 +0,0 @@
-package main
-
-import (
- "fmt"
- "log"
- "net"
- "os"
- "strconv"
- "strings"
- "text/tabwriter"
-
- "github.com/docker/libcontainer"
- "github.com/docker/libcontainer/devices"
- "github.com/docker/libcontainer/mount/nodes"
- "github.com/docker/libcontainer/namespaces"
- _ "github.com/docker/libcontainer/namespaces/nsenter"
-)
-
-// nsenterExec exec's a process inside an existing container
-func nsenterExec(config *libcontainer.Config, args []string) {
- if err := namespaces.FinalizeSetns(config, args); err != nil {
- log.Fatalf("failed to nsenter: %s", err)
- }
-}
-
-// nsenterMknod runs mknod inside an existing container
-//
-// mknod <path> <type> <major> <minor>
-func nsenterMknod(config *libcontainer.Config, args []string) {
- if len(args) != 4 {
- log.Fatalf("expected mknod to have 4 arguments not %d", len(args))
- }
-
- t := rune(args[1][0])
-
- major, err := strconv.Atoi(args[2])
- if err != nil {
- log.Fatal(err)
- }
-
- minor, err := strconv.Atoi(args[3])
- if err != nil {
- log.Fatal(err)
- }
-
- n := &devices.Device{
- Path: args[0],
- Type: t,
- MajorNumber: int64(major),
- MinorNumber: int64(minor),
- }
-
- if err := nodes.CreateDeviceNode("/", n); err != nil {
- log.Fatal(err)
- }
-}
-
-// nsenterIp displays the network interfaces inside a container's net namespace
-func nsenterIp(config *libcontainer.Config, args []string) {
- interfaces, err := net.Interfaces()
- if err != nil {
- log.Fatal(err)
- }
-
- w := tabwriter.NewWriter(os.Stdout, 10, 1, 3, ' ', 0)
- fmt.Fprint(w, "NAME\tMTU\tMAC\tFLAG\tADDRS\n")
-
- for _, iface := range interfaces {
- addrs, err := iface.Addrs()
- if err != nil {
- log.Fatal(err)
- }
-
- o := []string{}
-
- for _, a := range addrs {
- o = append(o, a.String())
- }
-
- fmt.Fprintf(w, "%s\t%d\t%s\t%s\t%s\n", iface.Name, iface.MTU, iface.HardwareAddr, iface.Flags, strings.Join(o, ","))
- }
-
- w.Flush()
-}
diff --git a/vendor/src/github.com/docker/libcontainer/nsinit/oom.go b/vendor/src/github.com/docker/libcontainer/nsinit/oom.go
index 106abeb268..a59b753336 100644
--- a/vendor/src/github.com/docker/libcontainer/nsinit/oom.go
+++ b/vendor/src/github.com/docker/libcontainer/nsinit/oom.go
@@ -4,25 +4,27 @@ import (
"log"
"github.com/codegangsta/cli"
- "github.com/docker/libcontainer"
)
var oomCommand = cli.Command{
- Name: "oom",
- Usage: "display oom notifications for a container",
- Action: oomAction,
-}
-
-func oomAction(context *cli.Context) {
- state, err := libcontainer.GetState(dataPath)
- if err != nil {
- log.Fatal(err)
- }
- n, err := libcontainer.NotifyOnOOM(state)
- if err != nil {
- log.Fatal(err)
- }
- for _ = range n {
- log.Printf("OOM notification received")
- }
+ Name: "oom",
+ Usage: "display oom notifications for a container",
+ Flags: []cli.Flag{
+ cli.StringFlag{Name: "id", Value: "nsinit", Usage: "specify the ID for a container"},
+ },
+ Action: func(context *cli.Context) {
+ container, err := getContainer(context)
+ if err != nil {
+ log.Fatal(err)
+ }
+ n, err := container.NotifyOOM()
+ if err != nil {
+ log.Fatal(err)
+ }
+ for x := range n {
+ // hack for calm down go1.4 gofmt
+ _ = x
+ log.Printf("OOM notification received")
+ }
+ },
}
diff --git a/vendor/src/github.com/docker/libcontainer/nsinit/pause.go b/vendor/src/github.com/docker/libcontainer/nsinit/pause.go
index ada24250c1..89af0b6f73 100644
--- a/vendor/src/github.com/docker/libcontainer/nsinit/pause.go
+++ b/vendor/src/github.com/docker/libcontainer/nsinit/pause.go
@@ -4,46 +4,38 @@ import (
"log"
"github.com/codegangsta/cli"
- "github.com/docker/libcontainer/cgroups"
- "github.com/docker/libcontainer/cgroups/fs"
- "github.com/docker/libcontainer/cgroups/systemd"
)
var pauseCommand = cli.Command{
- Name: "pause",
- Usage: "pause the container's processes",
- Action: pauseAction,
+ Name: "pause",
+ Usage: "pause the container's processes",
+ Flags: []cli.Flag{
+ cli.StringFlag{Name: "id", Value: "nsinit", Usage: "specify the ID for a container"},
+ },
+ Action: func(context *cli.Context) {
+ container, err := getContainer(context)
+ if err != nil {
+ log.Fatal(err)
+ }
+ if err = container.Pause(); err != nil {
+ log.Fatal(err)
+ }
+ },
}
var unpauseCommand = cli.Command{
- Name: "unpause",
- Usage: "unpause the container's processes",
- Action: unpauseAction,
-}
-
-func pauseAction(context *cli.Context) {
- if err := toggle(cgroups.Frozen); err != nil {
- log.Fatal(err)
- }
-}
-
-func unpauseAction(context *cli.Context) {
- if err := toggle(cgroups.Thawed); err != nil {
- log.Fatal(err)
- }
-}
-
-func toggle(state cgroups.FreezerState) error {
- container, err := loadConfig()
- if err != nil {
- return err
- }
-
- if systemd.UseSystemd() {
- err = systemd.Freeze(container.Cgroups, state)
- } else {
- err = fs.Freeze(container.Cgroups, state)
- }
-
- return err
+ Name: "unpause",
+ Usage: "unpause the container's processes",
+ Flags: []cli.Flag{
+ cli.StringFlag{Name: "id", Value: "nsinit", Usage: "specify the ID for a container"},
+ },
+ Action: func(context *cli.Context) {
+ container, err := getContainer(context)
+ if err != nil {
+ log.Fatal(err)
+ }
+ if err = container.Resume(); err != nil {
+ log.Fatal(err)
+ }
+ },
}
diff --git a/vendor/src/github.com/docker/libcontainer/nsinit/state.go b/vendor/src/github.com/docker/libcontainer/nsinit/state.go
new file mode 100644
index 0000000000..46981bb799
--- /dev/null
+++ b/vendor/src/github.com/docker/libcontainer/nsinit/state.go
@@ -0,0 +1,31 @@
+package main
+
+import (
+ "encoding/json"
+ "fmt"
+
+ "github.com/codegangsta/cli"
+)
+
+var stateCommand = cli.Command{
+ Name: "state",
+ Usage: "get the container's current state",
+ Flags: []cli.Flag{
+ cli.StringFlag{Name: "id", Value: "nsinit", Usage: "specify the ID for a container"},
+ },
+ Action: func(context *cli.Context) {
+ container, err := getContainer(context)
+ if err != nil {
+ fatal(err)
+ }
+ state, err := container.State()
+ if err != nil {
+ fatal(err)
+ }
+ data, err := json.MarshalIndent(state, "", "\t")
+ if err != nil {
+ fatal(err)
+ }
+ fmt.Printf("%s", data)
+ },
+}
diff --git a/vendor/src/github.com/docker/libcontainer/nsinit/stats.go b/vendor/src/github.com/docker/libcontainer/nsinit/stats.go
index 612b4a4bae..49087fa236 100644
--- a/vendor/src/github.com/docker/libcontainer/nsinit/stats.go
+++ b/vendor/src/github.com/docker/libcontainer/nsinit/stats.go
@@ -3,37 +3,29 @@ package main
import (
"encoding/json"
"fmt"
- "log"
"github.com/codegangsta/cli"
- "github.com/docker/libcontainer"
)
var statsCommand = cli.Command{
- Name: "stats",
- Usage: "display statistics for the container",
- Action: statsAction,
-}
-
-func statsAction(context *cli.Context) {
- container, err := loadConfig()
- if err != nil {
- log.Fatal(err)
- }
-
- state, err := libcontainer.GetState(dataPath)
- if err != nil {
- log.Fatal(err)
- }
-
- stats, err := libcontainer.GetStats(container, state)
- if err != nil {
- log.Fatal(err)
- }
- data, err := json.MarshalIndent(stats, "", "\t")
- if err != nil {
- log.Fatal(err)
- }
-
- fmt.Printf("%s", data)
+ Name: "stats",
+ Usage: "display statistics for the container",
+ Flags: []cli.Flag{
+ cli.StringFlag{Name: "id", Value: "nsinit", Usage: "specify the ID for a container"},
+ },
+ Action: func(context *cli.Context) {
+ container, err := getContainer(context)
+ if err != nil {
+ fatal(err)
+ }
+ stats, err := container.Stats()
+ if err != nil {
+ fatal(err)
+ }
+ data, err := json.MarshalIndent(stats, "", "\t")
+ if err != nil {
+ fatal(err)
+ }
+ fmt.Printf("%s", data)
+ },
}
diff --git a/vendor/src/github.com/docker/libcontainer/nsinit/tty.go b/vendor/src/github.com/docker/libcontainer/nsinit/tty.go
new file mode 100644
index 0000000000..668939745a
--- /dev/null
+++ b/vendor/src/github.com/docker/libcontainer/nsinit/tty.go
@@ -0,0 +1,65 @@
+package main
+
+import (
+ "io"
+ "os"
+
+ "github.com/codegangsta/cli"
+ "github.com/docker/docker/pkg/term"
+ "github.com/docker/libcontainer"
+)
+
+func newTty(context *cli.Context, p *libcontainer.Process, rootuid int) (*tty, error) {
+ if context.Bool("tty") {
+ console, err := p.NewConsole(rootuid)
+ if err != nil {
+ return nil, err
+ }
+ return &tty{
+ console: console,
+ }, nil
+ }
+ return &tty{}, nil
+}
+
+type tty struct {
+ console libcontainer.Console
+ state *term.State
+}
+
+func (t *tty) Close() error {
+ if t.console != nil {
+ t.console.Close()
+ }
+ if t.state != nil {
+ term.RestoreTerminal(os.Stdin.Fd(), t.state)
+ }
+ return nil
+}
+
+func (t *tty) attach(process *libcontainer.Process) error {
+ if t.console != nil {
+ go io.Copy(t.console, os.Stdin)
+ go io.Copy(os.Stdout, t.console)
+ state, err := term.SetRawTerminal(os.Stdin.Fd())
+ if err != nil {
+ return err
+ }
+ t.state = state
+ process.Stderr = nil
+ process.Stdout = nil
+ process.Stdin = nil
+ }
+ return nil
+}
+
+func (t *tty) resize() error {
+ if t.console == nil {
+ return nil
+ }
+ ws, err := term.GetWinsize(os.Stdin.Fd())
+ if err != nil {
+ return err
+ }
+ return term.SetWinsize(t.console.Fd(), ws)
+}
diff --git a/vendor/src/github.com/docker/libcontainer/nsinit/utils.go b/vendor/src/github.com/docker/libcontainer/nsinit/utils.go
index 6a8aafbf17..4deca76640 100644
--- a/vendor/src/github.com/docker/libcontainer/nsinit/utils.go
+++ b/vendor/src/github.com/docker/libcontainer/nsinit/utils.go
@@ -2,89 +2,58 @@ package main
import (
"encoding/json"
- "log"
+ "fmt"
"os"
- "path/filepath"
"github.com/codegangsta/cli"
"github.com/docker/libcontainer"
+ "github.com/docker/libcontainer/configs"
)
-// rFunc is a function registration for calling after an execin
-type rFunc struct {
- Usage string
- Action func(*libcontainer.Config, []string)
-}
-
-func loadConfig() (*libcontainer.Config, error) {
- f, err := os.Open(filepath.Join(dataPath, "container.json"))
- if err != nil {
- return nil, err
- }
- defer f.Close()
-
- var container *libcontainer.Config
- if err := json.NewDecoder(f).Decode(&container); err != nil {
- return nil, err
+func loadConfig(context *cli.Context) (*configs.Config, error) {
+ if path := context.String("config"); path != "" {
+ f, err := os.Open(path)
+ if err != nil {
+ return nil, err
+ }
+ defer f.Close()
+ var config *configs.Config
+ if err := json.NewDecoder(f).Decode(&config); err != nil {
+ return nil, err
+ }
+ return config, nil
}
-
- return container, nil
+ config := getTemplate()
+ modify(config, context)
+ return config, nil
}
-func openLog(name string) error {
- f, err := os.OpenFile(name, os.O_CREATE|os.O_RDWR|os.O_APPEND, 0755)
- if err != nil {
- return err
- }
-
- log.SetOutput(f)
-
- return nil
+func loadFactory(context *cli.Context) (libcontainer.Factory, error) {
+ return libcontainer.New(context.GlobalString("root"), libcontainer.Cgroupfs)
}
-func findUserArgs() []string {
- i := 0
- for _, a := range os.Args {
- i++
-
- if a == "--" {
- break
- }
+func getContainer(context *cli.Context) (libcontainer.Container, error) {
+ factory, err := loadFactory(context)
+ if err != nil {
+ return nil, err
}
-
- return os.Args[i:]
-}
-
-// loadConfigFromFd loads a container's config from the sync pipe that is provided by
-// fd 3 when running a process
-func loadConfigFromFd() (*libcontainer.Config, error) {
- pipe := os.NewFile(3, "pipe")
- defer pipe.Close()
-
- var config *libcontainer.Config
- if err := json.NewDecoder(pipe).Decode(&config); err != nil {
+ container, err := factory.Load(context.String("id"))
+ if err != nil {
return nil, err
}
- return config, nil
+ return container, nil
}
-func preload(context *cli.Context) error {
- if logPath != "" {
- if err := openLog(logPath); err != nil {
- return err
- }
+func fatal(err error) {
+ if lerr, ok := err.(libcontainer.Error); ok {
+ lerr.Detail(os.Stderr)
+ os.Exit(1)
}
-
- return nil
+ fmt.Fprintln(os.Stderr, err)
+ os.Exit(1)
}
-func runFunc(f *rFunc) {
- userArgs := findUserArgs()
-
- config, err := loadConfigFromFd()
- if err != nil {
- log.Fatalf("unable to receive config from sync pipe: %s", err)
- }
-
- f.Action(config, userArgs)
+func fatalf(t string, v ...interface{}) {
+ fmt.Fprintf(os.Stderr, t, v...)
+ os.Exit(1)
}
diff --git a/vendor/src/github.com/docker/libcontainer/process.go b/vendor/src/github.com/docker/libcontainer/process.go
index 489666a587..82fcff8c4c 100644
--- a/vendor/src/github.com/docker/libcontainer/process.go
+++ b/vendor/src/github.com/docker/libcontainer/process.go
@@ -1,27 +1,86 @@
package libcontainer
-import "io"
+import (
+ "fmt"
+ "io"
+ "math"
+ "os"
+)
-// Configuration for a process to be run inside a container.
-type ProcessConfig struct {
+type processOperations interface {
+ wait() (*os.ProcessState, error)
+ signal(sig os.Signal) error
+ pid() int
+}
+
+// Process specifies the configuration and IO for a process inside
+// a container.
+type Process struct {
// The command to be run followed by any arguments.
Args []string
- // Map of environment variables to their values.
+ // Env specifies the environment variables for the process.
Env []string
+ // User will set the uid and gid of the executing process running inside the container
+ // local to the contaienr's user and group configuration.
+ User string
+
+ // Cwd will change the processes current working directory inside the container's rootfs.
+ Cwd string
+
// Stdin is a pointer to a reader which provides the standard input stream.
+ Stdin io.Reader
+
// Stdout is a pointer to a writer which receives the standard output stream.
+ Stdout io.Writer
+
// Stderr is a pointer to a writer which receives the standard error stream.
- //
- // If a reader or writer is nil, the input stream is assumed to be empty and the output is
- // discarded.
- //
- // The readers and writers, if supplied, are closed when the process terminates. Their Close
- // methods should be idempotent.
- //
- // Stdout and Stderr may refer to the same writer in which case the output is interspersed.
- Stdin io.ReadCloser
- Stdout io.WriteCloser
- Stderr io.WriteCloser
+ Stderr io.Writer
+
+ // consolePath is the path to the console allocated to the container.
+ consolePath string
+
+ // Capabilities specify the capabilities to keep when executing the process inside the container
+ // All capbilities not specified will be dropped from the processes capability mask
+ Capabilities []string
+
+ ops processOperations
+}
+
+// Wait waits for the process to exit.
+// Wait releases any resources associated with the Process
+func (p Process) Wait() (*os.ProcessState, error) {
+ if p.ops == nil {
+ return nil, newGenericError(fmt.Errorf("invalid process"), ProcessNotExecuted)
+ }
+ return p.ops.wait()
+}
+
+// Pid returns the process ID
+func (p Process) Pid() (int, error) {
+ // math.MinInt32 is returned here, because it's invalid value
+ // for the kill() system call.
+ if p.ops == nil {
+ return math.MinInt32, newGenericError(fmt.Errorf("invalid process"), ProcessNotExecuted)
+ }
+ return p.ops.pid(), nil
+}
+
+// Signal sends a signal to the Process.
+func (p Process) Signal(sig os.Signal) error {
+ if p.ops == nil {
+ return newGenericError(fmt.Errorf("invalid process"), ProcessNotExecuted)
+ }
+ return p.ops.signal(sig)
+}
+
+// NewConsole creates new console for process and returns it
+func (p *Process) NewConsole(rootuid int) (Console, error) {
+ console, err := newConsole(rootuid, rootuid)
+ if err != nil {
+ return nil, err
+ }
+ p.consolePath = console.Path()
+ return console, nil
}
diff --git a/vendor/src/github.com/docker/libcontainer/process_linux.go b/vendor/src/github.com/docker/libcontainer/process_linux.go
new file mode 100644
index 0000000000..1c74b65490
--- /dev/null
+++ b/vendor/src/github.com/docker/libcontainer/process_linux.go
@@ -0,0 +1,249 @@
+// +build linux
+
+package libcontainer
+
+import (
+ "encoding/json"
+ "errors"
+ "io"
+ "os"
+ "os/exec"
+ "syscall"
+
+ "github.com/docker/libcontainer/cgroups"
+ "github.com/docker/libcontainer/system"
+)
+
+type parentProcess interface {
+ // pid returns the pid for the running process.
+ pid() int
+
+ // start starts the process execution.
+ start() error
+
+ // send a SIGKILL to the process and wait for the exit.
+ terminate() error
+
+ // wait waits on the process returning the process state.
+ wait() (*os.ProcessState, error)
+
+ // startTime return's the process start time.
+ startTime() (string, error)
+
+ signal(os.Signal) error
+}
+
+type setnsProcess struct {
+ cmd *exec.Cmd
+ parentPipe *os.File
+ childPipe *os.File
+ cgroupPaths map[string]string
+ config *initConfig
+}
+
+func (p *setnsProcess) startTime() (string, error) {
+ return system.GetProcessStartTime(p.pid())
+}
+
+func (p *setnsProcess) signal(sig os.Signal) error {
+ s, ok := sig.(syscall.Signal)
+ if !ok {
+ return errors.New("os: unsupported signal type")
+ }
+ return syscall.Kill(p.cmd.Process.Pid, s)
+}
+
+func (p *setnsProcess) start() (err error) {
+ defer p.parentPipe.Close()
+ if err = p.execSetns(); err != nil {
+ return newSystemError(err)
+ }
+ if len(p.cgroupPaths) > 0 {
+ if err := cgroups.EnterPid(p.cgroupPaths, p.cmd.Process.Pid); err != nil {
+ return newSystemError(err)
+ }
+ }
+ if err := json.NewEncoder(p.parentPipe).Encode(p.config); err != nil {
+ return newSystemError(err)
+ }
+ if err := syscall.Shutdown(int(p.parentPipe.Fd()), syscall.SHUT_WR); err != nil {
+ return newSystemError(err)
+ }
+ // wait for the child process to fully complete and receive an error message
+ // if one was encoutered
+ var ierr *genericError
+ if err := json.NewDecoder(p.parentPipe).Decode(&ierr); err != nil && err != io.EOF {
+ return newSystemError(err)
+ }
+ if ierr != nil {
+ return newSystemError(ierr)
+ }
+
+ return nil
+}
+
+// execSetns runs the process that executes C code to perform the setns calls
+// because setns support requires the C process to fork off a child and perform the setns
+// before the go runtime boots, we wait on the process to die and receive the child's pid
+// over the provided pipe.
+func (p *setnsProcess) execSetns() error {
+ err := p.cmd.Start()
+ p.childPipe.Close()
+ if err != nil {
+ return newSystemError(err)
+ }
+ status, err := p.cmd.Process.Wait()
+ if err != nil {
+ p.cmd.Wait()
+ return newSystemError(err)
+ }
+ if !status.Success() {
+ p.cmd.Wait()
+ return newSystemError(&exec.ExitError{ProcessState: status})
+ }
+ var pid *pid
+ if err := json.NewDecoder(p.parentPipe).Decode(&pid); err != nil {
+ p.cmd.Wait()
+ return newSystemError(err)
+ }
+
+ process, err := os.FindProcess(pid.Pid)
+ if err != nil {
+ return err
+ }
+
+ p.cmd.Process = process
+ return nil
+}
+
+// terminate sends a SIGKILL to the forked process for the setns routine then waits to
+// avoid the process becomming a zombie.
+func (p *setnsProcess) terminate() error {
+ err := p.cmd.Process.Kill()
+ if _, werr := p.wait(); err == nil {
+ err = werr
+ }
+ return err
+}
+
+func (p *setnsProcess) wait() (*os.ProcessState, error) {
+ err := p.cmd.Wait()
+ if err != nil {
+ return p.cmd.ProcessState, err
+ }
+
+ return p.cmd.ProcessState, nil
+}
+
+func (p *setnsProcess) pid() int {
+ return p.cmd.Process.Pid
+}
+
+type initProcess struct {
+ cmd *exec.Cmd
+ parentPipe *os.File
+ childPipe *os.File
+ config *initConfig
+ manager cgroups.Manager
+}
+
+func (p *initProcess) pid() int {
+ return p.cmd.Process.Pid
+}
+
+func (p *initProcess) start() error {
+ defer p.parentPipe.Close()
+ err := p.cmd.Start()
+ p.childPipe.Close()
+ if err != nil {
+ return newSystemError(err)
+ }
+ // Do this before syncing with child so that no children
+ // can escape the cgroup
+ if err := p.manager.Apply(p.pid()); err != nil {
+ return newSystemError(err)
+ }
+ defer func() {
+ if err != nil {
+ // TODO: should not be the responsibility to call here
+ p.manager.Destroy()
+ }
+ }()
+ if err := p.createNetworkInterfaces(); err != nil {
+ return newSystemError(err)
+ }
+ if err := p.sendConfig(); err != nil {
+ return newSystemError(err)
+ }
+ // wait for the child process to fully complete and receive an error message
+ // if one was encoutered
+ var ierr *genericError
+ if err := json.NewDecoder(p.parentPipe).Decode(&ierr); err != nil && err != io.EOF {
+ return newSystemError(err)
+ }
+ if ierr != nil {
+ return newSystemError(ierr)
+ }
+ return nil
+}
+
+func (p *initProcess) wait() (*os.ProcessState, error) {
+ err := p.cmd.Wait()
+ if err != nil {
+ return p.cmd.ProcessState, err
+ }
+ // we should kill all processes in cgroup when init is died if we use host PID namespace
+ if p.cmd.SysProcAttr.Cloneflags&syscall.CLONE_NEWPID == 0 {
+ killCgroupProcesses(p.manager)
+ }
+ return p.cmd.ProcessState, nil
+}
+
+func (p *initProcess) terminate() error {
+ if p.cmd.Process == nil {
+ return nil
+ }
+ err := p.cmd.Process.Kill()
+ if _, werr := p.wait(); err == nil {
+ err = werr
+ }
+ return err
+}
+
+func (p *initProcess) startTime() (string, error) {
+ return system.GetProcessStartTime(p.pid())
+}
+
+func (p *initProcess) sendConfig() error {
+ // send the state to the container's init process then shutdown writes for the parent
+ if err := json.NewEncoder(p.parentPipe).Encode(p.config); err != nil {
+ return err
+ }
+ // shutdown writes for the parent side of the pipe
+ return syscall.Shutdown(int(p.parentPipe.Fd()), syscall.SHUT_WR)
+}
+
+func (p *initProcess) createNetworkInterfaces() error {
+ for _, config := range p.config.Config.Networks {
+ strategy, err := getStrategy(config.Type)
+ if err != nil {
+ return err
+ }
+ n := &network{
+ Network: *config,
+ }
+ if err := strategy.create(n, p.pid()); err != nil {
+ return err
+ }
+ p.config.Networks = append(p.config.Networks, n)
+ }
+ return nil
+}
+
+func (p *initProcess) signal(sig os.Signal) error {
+ s, ok := sig.(syscall.Signal)
+ if !ok {
+ return errors.New("os: unsupported signal type")
+ }
+ return syscall.Kill(p.cmd.Process.Pid, s)
+}
diff --git a/vendor/src/github.com/docker/libcontainer/rootfs_linux.go b/vendor/src/github.com/docker/libcontainer/rootfs_linux.go
new file mode 100644
index 0000000000..ab1a9a5fcb
--- /dev/null
+++ b/vendor/src/github.com/docker/libcontainer/rootfs_linux.go
@@ -0,0 +1,357 @@
+// +build linux
+
+package libcontainer
+
+import (
+ "fmt"
+ "io/ioutil"
+ "os"
+ "path/filepath"
+ "strings"
+ "syscall"
+ "time"
+
+ "github.com/docker/libcontainer/configs"
+ "github.com/docker/libcontainer/label"
+)
+
+const defaultMountFlags = syscall.MS_NOEXEC | syscall.MS_NOSUID | syscall.MS_NODEV
+
+// setupRootfs sets up the devices, mount points, and filesystems for use inside a
+// new mount namespace.
+func setupRootfs(config *configs.Config, console *linuxConsole) (err error) {
+ if err := prepareRoot(config); err != nil {
+ return newSystemError(err)
+ }
+ for _, m := range config.Mounts {
+ if err := mountToRootfs(m, config.Rootfs, config.MountLabel); err != nil {
+ return newSystemError(err)
+ }
+ }
+ if err := createDevices(config); err != nil {
+ return newSystemError(err)
+ }
+ if err := setupPtmx(config, console); err != nil {
+ return newSystemError(err)
+ }
+ // stdin, stdout and stderr could be pointing to /dev/null from parent namespace.
+ // re-open them inside this namespace.
+ if err := reOpenDevNull(config.Rootfs); err != nil {
+ return newSystemError(err)
+ }
+ if err := setupDevSymlinks(config.Rootfs); err != nil {
+ return newSystemError(err)
+ }
+ if err := syscall.Chdir(config.Rootfs); err != nil {
+ return newSystemError(err)
+ }
+ if config.NoPivotRoot {
+ err = msMoveRoot(config.Rootfs)
+ } else {
+ err = pivotRoot(config.Rootfs, config.PivotDir)
+ }
+ if err != nil {
+ return newSystemError(err)
+ }
+ if config.Readonlyfs {
+ if err := setReadonly(); err != nil {
+ return newSystemError(err)
+ }
+ }
+ syscall.Umask(0022)
+ return nil
+}
+
+func mountToRootfs(m *configs.Mount, rootfs, mountLabel string) error {
+ var (
+ dest = m.Destination
+ data = label.FormatMountLabel(m.Data, mountLabel)
+ )
+ if !strings.HasPrefix(dest, rootfs) {
+ dest = filepath.Join(rootfs, dest)
+ }
+
+ switch m.Device {
+ case "proc", "mqueue", "sysfs":
+ if err := os.MkdirAll(dest, 0755); err != nil && !os.IsExist(err) {
+ return err
+ }
+ return syscall.Mount(m.Source, dest, m.Device, uintptr(m.Flags), "")
+ case "tmpfs":
+ stat, err := os.Stat(dest)
+ if err != nil {
+ if err := os.MkdirAll(dest, 0755); err != nil && !os.IsExist(err) {
+ return err
+ }
+ }
+ if err := syscall.Mount(m.Source, dest, m.Device, uintptr(m.Flags), data); err != nil {
+ return err
+ }
+ if stat != nil {
+ if err = os.Chmod(dest, stat.Mode()); err != nil {
+ return err
+ }
+ }
+ return nil
+ case "devpts":
+ if err := os.MkdirAll(dest, 0755); err != nil && !os.IsExist(err) {
+ return err
+ }
+ return syscall.Mount(m.Source, dest, m.Device, uintptr(m.Flags), data)
+ case "bind":
+ stat, err := os.Stat(m.Source)
+ if err != nil {
+ // error out if the source of a bind mount does not exist as we will be
+ // unable to bind anything to it.
+ return err
+ }
+ if err := createIfNotExists(dest, stat.IsDir()); err != nil {
+ return err
+ }
+ if err := syscall.Mount(m.Source, dest, m.Device, uintptr(m.Flags), data); err != nil {
+ return err
+ }
+ if m.Flags&syscall.MS_RDONLY != 0 {
+ if err := syscall.Mount(m.Source, dest, m.Device, uintptr(m.Flags|syscall.MS_REMOUNT), ""); err != nil {
+ return err
+ }
+ }
+ if m.Relabel != "" {
+ if err := label.Relabel(m.Source, mountLabel, m.Relabel); err != nil {
+ return err
+ }
+ }
+ if m.Flags&syscall.MS_PRIVATE != 0 {
+ if err := syscall.Mount("", dest, "none", uintptr(syscall.MS_PRIVATE), ""); err != nil {
+ return err
+ }
+ }
+ default:
+ return fmt.Errorf("unknown mount device %q to %q", m.Device, m.Destination)
+ }
+ return nil
+}
+
+func setupDevSymlinks(rootfs string) error {
+ var links = [][2]string{
+ {"/proc/self/fd", "/dev/fd"},
+ {"/proc/self/fd/0", "/dev/stdin"},
+ {"/proc/self/fd/1", "/dev/stdout"},
+ {"/proc/self/fd/2", "/dev/stderr"},
+ }
+ // kcore support can be toggled with CONFIG_PROC_KCORE; only create a symlink
+ // in /dev if it exists in /proc.
+ if _, err := os.Stat("/proc/kcore"); err == nil {
+ links = append(links, [2]string{"/proc/kcore", "/dev/kcore"})
+ }
+ for _, link := range links {
+ var (
+ src = link[0]
+ dst = filepath.Join(rootfs, link[1])
+ )
+ if err := os.Symlink(src, dst); err != nil && !os.IsExist(err) {
+ return fmt.Errorf("symlink %s %s %s", src, dst, err)
+ }
+ }
+ return nil
+}
+
+// If stdin, stdout or stderr are pointing to '/dev/null' in the global mount namespace,
+// this method will make them point to '/dev/null' in this namespace.
+func reOpenDevNull(rootfs string) error {
+ var stat, devNullStat syscall.Stat_t
+ file, err := os.Open(filepath.Join(rootfs, "/dev/null"))
+ if err != nil {
+ return fmt.Errorf("Failed to open /dev/null - %s", err)
+ }
+ defer file.Close()
+ if err := syscall.Fstat(int(file.Fd()), &devNullStat); err != nil {
+ return err
+ }
+ for fd := 0; fd < 3; fd++ {
+ if err := syscall.Fstat(fd, &stat); err != nil {
+ return err
+ }
+ if stat.Rdev == devNullStat.Rdev {
+ // Close and re-open the fd.
+ if err := syscall.Dup2(int(file.Fd()), fd); err != nil {
+ return err
+ }
+ }
+ }
+ return nil
+}
+
+// Create the device nodes in the container.
+func createDevices(config *configs.Config) error {
+ oldMask := syscall.Umask(0000)
+ for _, node := range config.Devices {
+ // containers running in a user namespace are not allowed to mknod
+ // devices so we can just bind mount it from the host.
+ if err := createDeviceNode(config.Rootfs, node, config.Namespaces.Contains(configs.NEWUSER)); err != nil {
+ syscall.Umask(oldMask)
+ return err
+ }
+ }
+ syscall.Umask(oldMask)
+ return nil
+}
+
+// Creates the device node in the rootfs of the container.
+func createDeviceNode(rootfs string, node *configs.Device, bind bool) error {
+ dest := filepath.Join(rootfs, node.Path)
+ if err := os.MkdirAll(filepath.Dir(dest), 0755); err != nil {
+ return err
+ }
+
+ if bind {
+ f, err := os.Create(dest)
+ if err != nil && !os.IsExist(err) {
+ return err
+ }
+ if f != nil {
+ f.Close()
+ }
+ return syscall.Mount(node.Path, dest, "bind", syscall.MS_BIND, "")
+ }
+ if err := mknodDevice(dest, node); err != nil {
+ if os.IsExist(err) {
+ return nil
+ }
+ return err
+ }
+ return nil
+}
+
+func mknodDevice(dest string, node *configs.Device) error {
+ fileMode := node.FileMode
+ switch node.Type {
+ case 'c':
+ fileMode |= syscall.S_IFCHR
+ case 'b':
+ fileMode |= syscall.S_IFBLK
+ default:
+ return fmt.Errorf("%c is not a valid device type for device %s", node.Type, node.Path)
+ }
+ if err := syscall.Mknod(dest, uint32(fileMode), node.Mkdev()); err != nil {
+ return err
+ }
+ return syscall.Chown(dest, int(node.Uid), int(node.Gid))
+}
+
+func prepareRoot(config *configs.Config) error {
+ flag := syscall.MS_PRIVATE | syscall.MS_REC
+ if config.NoPivotRoot {
+ flag = syscall.MS_SLAVE | syscall.MS_REC
+ }
+ if err := syscall.Mount("", "/", "", uintptr(flag), ""); err != nil {
+ return err
+ }
+ return syscall.Mount(config.Rootfs, config.Rootfs, "bind", syscall.MS_BIND|syscall.MS_REC, "")
+}
+
+func setReadonly() error {
+ return syscall.Mount("/", "/", "bind", syscall.MS_BIND|syscall.MS_REMOUNT|syscall.MS_RDONLY|syscall.MS_REC, "")
+}
+
+func setupPtmx(config *configs.Config, console *linuxConsole) error {
+ ptmx := filepath.Join(config.Rootfs, "dev/ptmx")
+ if err := os.Remove(ptmx); err != nil && !os.IsNotExist(err) {
+ return err
+ }
+ if err := os.Symlink("pts/ptmx", ptmx); err != nil {
+ return fmt.Errorf("symlink dev ptmx %s", err)
+ }
+ if console != nil {
+ return console.mount(config.Rootfs, config.MountLabel, 0, 0)
+ }
+ return nil
+}
+
+func pivotRoot(rootfs, pivotBaseDir string) error {
+ if pivotBaseDir == "" {
+ pivotBaseDir = "/"
+ }
+ tmpDir := filepath.Join(rootfs, pivotBaseDir)
+ if err := os.MkdirAll(tmpDir, 0755); err != nil {
+ return fmt.Errorf("can't create tmp dir %s, error %v", tmpDir, err)
+ }
+ pivotDir, err := ioutil.TempDir(tmpDir, ".pivot_root")
+ if err != nil {
+ return fmt.Errorf("can't create pivot_root dir %s, error %v", pivotDir, err)
+ }
+ if err := syscall.PivotRoot(rootfs, pivotDir); err != nil {
+ return fmt.Errorf("pivot_root %s", err)
+ }
+ if err := syscall.Chdir("/"); err != nil {
+ return fmt.Errorf("chdir / %s", err)
+ }
+ // path to pivot dir now changed, update
+ pivotDir = filepath.Join(pivotBaseDir, filepath.Base(pivotDir))
+ if err := syscall.Unmount(pivotDir, syscall.MNT_DETACH); err != nil {
+ return fmt.Errorf("unmount pivot_root dir %s", err)
+ }
+ return os.Remove(pivotDir)
+}
+
+func msMoveRoot(rootfs string) error {
+ if err := syscall.Mount(rootfs, "/", "", syscall.MS_MOVE, ""); err != nil {
+ return err
+ }
+ if err := syscall.Chroot("."); err != nil {
+ return err
+ }
+ return syscall.Chdir("/")
+}
+
+// createIfNotExists creates a file or a directory only if it does not already exist.
+func createIfNotExists(path string, isDir bool) error {
+ if _, err := os.Stat(path); err != nil {
+ if os.IsNotExist(err) {
+ if isDir {
+ return os.MkdirAll(path, 0755)
+ }
+ if err := os.MkdirAll(filepath.Dir(path), 0755); err != nil {
+ return err
+ }
+ f, err := os.OpenFile(path, os.O_CREATE, 0755)
+ if err != nil {
+ return err
+ }
+ f.Close()
+ }
+ }
+ return nil
+}
+
+// remountReadonly will bind over the top of an existing path and ensure that it is read-only.
+func remountReadonly(path string) error {
+ for i := 0; i < 5; i++ {
+ if err := syscall.Mount("", path, "", syscall.MS_REMOUNT|syscall.MS_RDONLY, ""); err != nil && !os.IsNotExist(err) {
+ switch err {
+ case syscall.EINVAL:
+ // Probably not a mountpoint, use bind-mount
+ if err := syscall.Mount(path, path, "", syscall.MS_BIND, ""); err != nil {
+ return err
+ }
+ return syscall.Mount(path, path, "", syscall.MS_BIND|syscall.MS_REMOUNT|syscall.MS_RDONLY|syscall.MS_REC|defaultMountFlags, "")
+ case syscall.EBUSY:
+ time.Sleep(100 * time.Millisecond)
+ continue
+ default:
+ return err
+ }
+ }
+ return nil
+ }
+ return fmt.Errorf("unable to mount %s as readonly max retries reached", path)
+}
+
+// maskFile bind mounts /dev/null over the top of the specified path inside a container
+// to avoid security issues from processes reading information from non-namespace aware mounts ( proc/kcore ).
+func maskFile(path string) error {
+ if err := syscall.Mount("/dev/null", path, "", syscall.MS_BIND, ""); err != nil && !os.IsNotExist(err) {
+ return err
+ }
+ return nil
+}
diff --git a/vendor/src/github.com/docker/libcontainer/sample_configs/apparmor.json b/vendor/src/github.com/docker/libcontainer/sample_configs/apparmor.json
index 96f73cb794..843c2c61ea 100644
--- a/vendor/src/github.com/docker/libcontainer/sample_configs/apparmor.json
+++ b/vendor/src/github.com/docker/libcontainer/sample_configs/apparmor.json
@@ -1,196 +1,340 @@
{
- "capabilities": [
- "CHOWN",
- "DAC_OVERRIDE",
- "FOWNER",
- "MKNOD",
- "NET_RAW",
- "SETGID",
- "SETUID",
- "SETFCAP",
- "SETPCAP",
- "NET_BIND_SERVICE",
- "SYS_CHROOT",
- "KILL"
- ],
- "cgroups": {
- "allowed_devices": [
- {
- "cgroup_permissions": "m",
- "major_number": -1,
- "minor_number": -1,
- "type": 99
- },
- {
- "cgroup_permissions": "m",
- "major_number": -1,
- "minor_number": -1,
- "type": 98
- },
- {
- "cgroup_permissions": "rwm",
- "major_number": 5,
- "minor_number": 1,
- "path": "/dev/console",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "major_number": 4,
- "path": "/dev/tty0",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "major_number": 4,
- "minor_number": 1,
- "path": "/dev/tty1",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "major_number": 136,
- "minor_number": -1,
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "major_number": 5,
- "minor_number": 2,
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "major_number": 10,
- "minor_number": 200,
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 3,
- "path": "/dev/null",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 5,
- "path": "/dev/zero",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 7,
- "path": "/dev/full",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 5,
- "path": "/dev/tty",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 9,
- "path": "/dev/urandom",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 8,
- "path": "/dev/random",
- "type": 99
- }
- ],
- "name": "docker-koye",
- "parent": "docker"
- },
- "restrict_sys": true,
- "apparmor_profile": "docker-default",
- "mount_config": {
- "device_nodes": [
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 3,
- "path": "/dev/null",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 5,
- "path": "/dev/zero",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 7,
- "path": "/dev/full",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 5,
- "path": "/dev/tty",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 9,
- "path": "/dev/urandom",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 8,
- "path": "/dev/random",
- "type": 99
- }
- ]
- },
- "environment": [
- "HOME=/",
- "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
- "HOSTNAME=koye",
- "TERM=xterm"
- ],
- "hostname": "koye",
- "namespaces": [
- {"type":"NEWIPC"},
- {"type": "NEWNET"},
- {"type": "NEWNS"},
- {"type": "NEWPID"},
- {"type": "NEWUTS"}
- ],
- "networks": [
- {
- "address": "127.0.0.1/0",
- "gateway": "localhost",
- "mtu": 1500,
- "type": "loopback"
- }
- ],
- "tty": true,
- "user": "daemon"
+ "no_pivot_root": false,
+ "parent_death_signal": 0,
+ "pivot_dir": "",
+ "rootfs": "/rootfs/jessie",
+ "readonlyfs": false,
+ "mounts": [
+ {
+ "source": "shm",
+ "destination": "/dev/shm",
+ "device": "tmpfs",
+ "flags": 14,
+ "data": "mode=1777,size=65536k",
+ "relabel": ""
+ },
+ {
+ "source": "mqueue",
+ "destination": "/dev/mqueue",
+ "device": "mqueue",
+ "flags": 14,
+ "data": "",
+ "relabel": ""
+ },
+ {
+ "source": "sysfs",
+ "destination": "/sys",
+ "device": "sysfs",
+ "flags": 15,
+ "data": "",
+ "relabel": ""
+ }
+ ],
+ "devices": [
+ {
+ "type": 99,
+ "path": "/dev/fuse",
+ "major": 10,
+ "minor": 229,
+ "permissions": "rwm",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/null",
+ "major": 1,
+ "minor": 3,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/zero",
+ "major": 1,
+ "minor": 5,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/full",
+ "major": 1,
+ "minor": 7,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/tty",
+ "major": 5,
+ "minor": 0,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/urandom",
+ "major": 1,
+ "minor": 9,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/random",
+ "major": 1,
+ "minor": 8,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ }
+ ],
+ "mount_label": "",
+ "hostname": "nsinit",
+ "namespaces": [
+ {
+ "type": "NEWNS",
+ "path": ""
+ },
+ {
+ "type": "NEWUTS",
+ "path": ""
+ },
+ {
+ "type": "NEWIPC",
+ "path": ""
+ },
+ {
+ "type": "NEWPID",
+ "path": ""
+ },
+ {
+ "type": "NEWNET",
+ "path": ""
+ }
+ ],
+ "capabilities": [
+ "CHOWN",
+ "DAC_OVERRIDE",
+ "FSETID",
+ "FOWNER",
+ "MKNOD",
+ "NET_RAW",
+ "SETGID",
+ "SETUID",
+ "SETFCAP",
+ "SETPCAP",
+ "NET_BIND_SERVICE",
+ "SYS_CHROOT",
+ "KILL",
+ "AUDIT_WRITE"
+ ],
+ "networks": [
+ {
+ "type": "loopback",
+ "name": "",
+ "bridge": "",
+ "mac_address": "",
+ "address": "127.0.0.1/0",
+ "gateway": "localhost",
+ "ipv6_address": "",
+ "ipv6_gateway": "",
+ "mtu": 0,
+ "txqueuelen": 0,
+ "host_interface_name": ""
+ }
+ ],
+ "routes": null,
+ "cgroups": {
+ "name": "libcontainer",
+ "parent": "nsinit",
+ "allow_all_devices": false,
+ "allowed_devices": [
+ {
+ "type": 99,
+ "path": "",
+ "major": -1,
+ "minor": -1,
+ "permissions": "m",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 98,
+ "path": "",
+ "major": -1,
+ "minor": -1,
+ "permissions": "m",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/console",
+ "major": 5,
+ "minor": 1,
+ "permissions": "rwm",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/tty0",
+ "major": 4,
+ "minor": 0,
+ "permissions": "rwm",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/tty1",
+ "major": 4,
+ "minor": 1,
+ "permissions": "rwm",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "",
+ "major": 136,
+ "minor": -1,
+ "permissions": "rwm",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "",
+ "major": 5,
+ "minor": 2,
+ "permissions": "rwm",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "",
+ "major": 10,
+ "minor": 200,
+ "permissions": "rwm",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/null",
+ "major": 1,
+ "minor": 3,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/zero",
+ "major": 1,
+ "minor": 5,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/full",
+ "major": 1,
+ "minor": 7,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/tty",
+ "major": 5,
+ "minor": 0,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/urandom",
+ "major": 1,
+ "minor": 9,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/random",
+ "major": 1,
+ "minor": 8,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ }
+ ],
+ "memory": 0,
+ "memory_reservation": 0,
+ "memory_swap": 0,
+ "cpu_shares": 0,
+ "cpu_quota": 0,
+ "cpu_period": 0,
+ "cpuset_cpus": "",
+ "cpuset_mems": "",
+ "blkio_weight": 0,
+ "freezer": "",
+ "slice": ""
+ },
+ "apparmor_profile": "docker-default",
+ "process_label": "",
+ "rlimits": [
+ {
+ "type": 7,
+ "hard": 1024,
+ "soft": 1024
+ }
+ ],
+ "additional_groups": null,
+ "uid_mappings": null,
+ "gid_mappings": null,
+ "mask_paths": [
+ "/proc/kcore"
+ ],
+ "readonly_paths": [
+ "/proc/sys",
+ "/proc/sysrq-trigger",
+ "/proc/irq",
+ "/proc/bus"
+ ]
}
diff --git a/vendor/src/github.com/docker/libcontainer/sample_configs/attach_to_bridge.json b/vendor/src/github.com/docker/libcontainer/sample_configs/attach_to_bridge.json
index e5c03a7ef4..11335b25fe 100644
--- a/vendor/src/github.com/docker/libcontainer/sample_configs/attach_to_bridge.json
+++ b/vendor/src/github.com/docker/libcontainer/sample_configs/attach_to_bridge.json
@@ -1,202 +1,353 @@
{
- "capabilities": [
- "CHOWN",
- "DAC_OVERRIDE",
- "FOWNER",
- "MKNOD",
- "NET_RAW",
- "SETGID",
- "SETUID",
- "SETFCAP",
- "SETPCAP",
- "NET_BIND_SERVICE",
- "SYS_CHROOT",
- "KILL"
- ],
- "cgroups": {
- "allowed_devices": [
- {
- "cgroup_permissions": "m",
- "major_number": -1,
- "minor_number": -1,
- "type": 99
- },
- {
- "cgroup_permissions": "m",
- "major_number": -1,
- "minor_number": -1,
- "type": 98
- },
- {
- "cgroup_permissions": "rwm",
- "major_number": 5,
- "minor_number": 1,
- "path": "/dev/console",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "major_number": 4,
- "path": "/dev/tty0",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "major_number": 4,
- "minor_number": 1,
- "path": "/dev/tty1",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "major_number": 136,
- "minor_number": -1,
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "major_number": 5,
- "minor_number": 2,
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "major_number": 10,
- "minor_number": 200,
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 3,
- "path": "/dev/null",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 5,
- "path": "/dev/zero",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 7,
- "path": "/dev/full",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 5,
- "path": "/dev/tty",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 9,
- "path": "/dev/urandom",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 8,
- "path": "/dev/random",
- "type": 99
- }
- ],
- "name": "docker-koye",
- "parent": "docker"
- },
- "restrict_sys": true,
- "mount_config": {
- "device_nodes": [
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 3,
- "path": "/dev/null",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 5,
- "path": "/dev/zero",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 7,
- "path": "/dev/full",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 5,
- "path": "/dev/tty",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 9,
- "path": "/dev/urandom",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 8,
- "path": "/dev/random",
- "type": 99
- }
- ]
- },
- "environment": [
- "HOME=/",
- "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
- "HOSTNAME=koye",
- "TERM=xterm"
- ],
- "hostname": "koye",
- "namespaces": [
- {"type": "NEWIPC"},
- {"type": "NEWNET"},
- {"type": "NEWNS"},
- {"type": "NEWPID"},
- {"type": "NEWUTS"}
- ],
- "networks": [
+ "no_pivot_root": false,
+ "parent_death_signal": 0,
+ "pivot_dir": "",
+ "rootfs": "/rootfs/jessie",
+ "readonlyfs": false,
+ "mounts": [
+ {
+ "source": "shm",
+ "destination": "/dev/shm",
+ "device": "tmpfs",
+ "flags": 14,
+ "data": "mode=1777,size=65536k",
+ "relabel": ""
+ },
+ {
+ "source": "mqueue",
+ "destination": "/dev/mqueue",
+ "device": "mqueue",
+ "flags": 14,
+ "data": "",
+ "relabel": ""
+ },
+ {
+ "source": "sysfs",
+ "destination": "/sys",
+ "device": "sysfs",
+ "flags": 15,
+ "data": "",
+ "relabel": ""
+ }
+ ],
+ "devices": [
+ {
+ "type": 99,
+ "path": "/dev/fuse",
+ "major": 10,
+ "minor": 229,
+ "permissions": "rwm",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/null",
+ "major": 1,
+ "minor": 3,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/zero",
+ "major": 1,
+ "minor": 5,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/full",
+ "major": 1,
+ "minor": 7,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/tty",
+ "major": 5,
+ "minor": 0,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/urandom",
+ "major": 1,
+ "minor": 9,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/random",
+ "major": 1,
+ "minor": 8,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ }
+ ],
+ "mount_label": "",
+ "hostname": "koye",
+ "namespaces": [
+ {
+ "type": "NEWNS",
+ "path": ""
+ },
+ {
+ "type": "NEWUTS",
+ "path": ""
+ },
+ {
+ "type": "NEWIPC",
+ "path": ""
+ },
+ {
+ "type": "NEWPID",
+ "path": ""
+ },
+ {
+ "type": "NEWNET",
+ "path": ""
+ }
+ ],
+ "capabilities": [
+ "CHOWN",
+ "DAC_OVERRIDE",
+ "FSETID",
+ "FOWNER",
+ "MKNOD",
+ "NET_RAW",
+ "SETGID",
+ "SETUID",
+ "SETFCAP",
+ "SETPCAP",
+ "NET_BIND_SERVICE",
+ "SYS_CHROOT",
+ "KILL",
+ "AUDIT_WRITE"
+ ],
+ "networks": [
+ {
+ "type": "loopback",
+ "name": "",
+ "bridge": "",
+ "mac_address": "",
+ "address": "127.0.0.1/0",
+ "gateway": "localhost",
+ "ipv6_address": "",
+ "ipv6_gateway": "",
+ "mtu": 0,
+ "txqueuelen": 0,
+ "host_interface_name": ""
+ },
{
- "address": "127.0.0.1/0",
- "gateway": "localhost",
- "mtu": 1500,
- "type": "loopback"
- },
- {
- "address": "172.17.0.101/16",
- "bridge": "docker0",
- "veth_prefix": "veth",
- "gateway": "172.17.42.1",
- "mtu": 1500,
- "type": "veth"
- }
- ],
- "tty": true
+ "type": "veth",
+ "name": "eth0",
+ "bridge": "docker0",
+ "mac_address": "",
+ "address": "172.17.0.101/16",
+ "gateway": "172.17.42.1",
+ "ipv6_address": "",
+ "ipv6_gateway": "",
+ "mtu": 1500,
+ "txqueuelen": 0,
+ "host_interface_name": "vethnsinit"
+ }
+ ],
+ "routes": null,
+ "cgroups": {
+ "name": "libcontainer",
+ "parent": "nsinit",
+ "allow_all_devices": false,
+ "allowed_devices": [
+ {
+ "type": 99,
+ "path": "",
+ "major": -1,
+ "minor": -1,
+ "permissions": "m",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 98,
+ "path": "",
+ "major": -1,
+ "minor": -1,
+ "permissions": "m",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/console",
+ "major": 5,
+ "minor": 1,
+ "permissions": "rwm",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/tty0",
+ "major": 4,
+ "minor": 0,
+ "permissions": "rwm",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/tty1",
+ "major": 4,
+ "minor": 1,
+ "permissions": "rwm",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "",
+ "major": 136,
+ "minor": -1,
+ "permissions": "rwm",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "",
+ "major": 5,
+ "minor": 2,
+ "permissions": "rwm",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "",
+ "major": 10,
+ "minor": 200,
+ "permissions": "rwm",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/null",
+ "major": 1,
+ "minor": 3,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/zero",
+ "major": 1,
+ "minor": 5,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/full",
+ "major": 1,
+ "minor": 7,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/tty",
+ "major": 5,
+ "minor": 0,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/urandom",
+ "major": 1,
+ "minor": 9,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/random",
+ "major": 1,
+ "minor": 8,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ }
+ ],
+ "memory": 0,
+ "memory_reservation": 0,
+ "memory_swap": 0,
+ "cpu_shares": 0,
+ "cpu_quota": 0,
+ "cpu_period": 0,
+ "cpuset_cpus": "",
+ "cpuset_mems": "",
+ "blkio_weight": 0,
+ "freezer": "",
+ "slice": ""
+ },
+ "apparmor_profile": "",
+ "process_label": "",
+ "rlimits": [
+ {
+ "type": 7,
+ "hard": 1024,
+ "soft": 1024
+ }
+ ],
+ "additional_groups": null,
+ "uid_mappings": null,
+ "gid_mappings": null,
+ "mask_paths": [
+ "/proc/kcore"
+ ],
+ "readonly_paths": [
+ "/proc/sys",
+ "/proc/sysrq-trigger",
+ "/proc/irq",
+ "/proc/bus"
+ ]
}
diff --git a/vendor/src/github.com/docker/libcontainer/sample_configs/host-pid.json b/vendor/src/github.com/docker/libcontainer/sample_configs/host-pid.json
index f47af930e6..bf46150443 100644
--- a/vendor/src/github.com/docker/libcontainer/sample_configs/host-pid.json
+++ b/vendor/src/github.com/docker/libcontainer/sample_configs/host-pid.json
@@ -1,200 +1,336 @@
{
- "capabilities": [
- "CHOWN",
- "DAC_OVERRIDE",
- "FOWNER",
- "MKNOD",
- "NET_RAW",
- "SETGID",
- "SETUID",
- "SETFCAP",
- "SETPCAP",
- "NET_BIND_SERVICE",
- "SYS_CHROOT",
- "KILL"
- ],
- "cgroups": {
- "allowed_devices": [
- {
- "cgroup_permissions": "m",
- "major_number": -1,
- "minor_number": -1,
- "type": 99
- },
- {
- "cgroup_permissions": "m",
- "major_number": -1,
- "minor_number": -1,
- "type": 98
- },
- {
- "cgroup_permissions": "rwm",
- "major_number": 5,
- "minor_number": 1,
- "path": "/dev/console",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "major_number": 4,
- "path": "/dev/tty0",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "major_number": 4,
- "minor_number": 1,
- "path": "/dev/tty1",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "major_number": 136,
- "minor_number": -1,
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "major_number": 5,
- "minor_number": 2,
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "major_number": 10,
- "minor_number": 200,
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 3,
- "path": "/dev/null",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 5,
- "path": "/dev/zero",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 7,
- "path": "/dev/full",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 5,
- "path": "/dev/tty",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 9,
- "path": "/dev/urandom",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 8,
- "path": "/dev/random",
- "type": 99
- }
- ],
- "name": "docker-koye",
- "parent": "docker"
- },
- "restrict_sys": true,
- "mount_config": {
- "device_nodes": [
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 3,
- "path": "/dev/null",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 5,
- "path": "/dev/zero",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 7,
- "path": "/dev/full",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 5,
- "path": "/dev/tty",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 9,
- "path": "/dev/urandom",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 8,
- "path": "/dev/random",
- "type": 99
- }
- ],
- "mounts": [
- {
- "type": "tmpfs",
- "destination": "/tmp"
- }
- ]
- },
- "environment": [
- "HOME=/",
- "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
- "HOSTNAME=koye",
- "TERM=xterm"
- ],
- "hostname": "koye",
- "namespaces": [
- {"type": "NEWIPC"},
- {"type": "NEWNET"},
- {"type": "NEWNS"},
- {"type": "NEWUTS"}
- ],
- "networks": [
+ "no_pivot_root": false,
+ "parent_death_signal": 0,
+ "pivot_dir": "",
+ "rootfs": "/rootfs/jessie",
+ "readonlyfs": false,
+ "mounts": [
+ {
+ "source": "shm",
+ "destination": "/dev/shm",
+ "device": "tmpfs",
+ "flags": 14,
+ "data": "mode=1777,size=65536k",
+ "relabel": ""
+ },
+ {
+ "source": "mqueue",
+ "destination": "/dev/mqueue",
+ "device": "mqueue",
+ "flags": 14,
+ "data": "",
+ "relabel": ""
+ },
+ {
+ "source": "sysfs",
+ "destination": "/sys",
+ "device": "sysfs",
+ "flags": 15,
+ "data": "",
+ "relabel": ""
+ }
+ ],
+ "devices": [
+ {
+ "type": 99,
+ "path": "/dev/fuse",
+ "major": 10,
+ "minor": 229,
+ "permissions": "rwm",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/null",
+ "major": 1,
+ "minor": 3,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/zero",
+ "major": 1,
+ "minor": 5,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/full",
+ "major": 1,
+ "minor": 7,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/tty",
+ "major": 5,
+ "minor": 0,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/urandom",
+ "major": 1,
+ "minor": 9,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/random",
+ "major": 1,
+ "minor": 8,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ }
+ ],
+ "mount_label": "",
+ "hostname": "nsinit",
+ "namespaces": [
+ {
+ "type": "NEWNS",
+ "path": ""
+ },
+ {
+ "type": "NEWUTS",
+ "path": ""
+ },
+ {
+ "type": "NEWIPC",
+ "path": ""
+ },
{
- "address": "127.0.0.1/0",
- "gateway": "localhost",
- "mtu": 1500,
- "type": "loopback"
- }
- ],
- "tty": true,
- "user": "daemon"
+ "type": "NEWNET",
+ "path": ""
+ }
+ ],
+ "capabilities": [
+ "CHOWN",
+ "DAC_OVERRIDE",
+ "FSETID",
+ "FOWNER",
+ "MKNOD",
+ "NET_RAW",
+ "SETGID",
+ "SETUID",
+ "SETFCAP",
+ "SETPCAP",
+ "NET_BIND_SERVICE",
+ "SYS_CHROOT",
+ "KILL",
+ "AUDIT_WRITE"
+ ],
+ "networks": [
+ {
+ "type": "loopback",
+ "name": "",
+ "bridge": "",
+ "mac_address": "",
+ "address": "127.0.0.1/0",
+ "gateway": "localhost",
+ "ipv6_address": "",
+ "ipv6_gateway": "",
+ "mtu": 0,
+ "txqueuelen": 0,
+ "host_interface_name": ""
+ }
+ ],
+ "routes": null,
+ "cgroups": {
+ "name": "libcontainer",
+ "parent": "nsinit",
+ "allow_all_devices": false,
+ "allowed_devices": [
+ {
+ "type": 99,
+ "path": "",
+ "major": -1,
+ "minor": -1,
+ "permissions": "m",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 98,
+ "path": "",
+ "major": -1,
+ "minor": -1,
+ "permissions": "m",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/console",
+ "major": 5,
+ "minor": 1,
+ "permissions": "rwm",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/tty0",
+ "major": 4,
+ "minor": 0,
+ "permissions": "rwm",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/tty1",
+ "major": 4,
+ "minor": 1,
+ "permissions": "rwm",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "",
+ "major": 136,
+ "minor": -1,
+ "permissions": "rwm",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "",
+ "major": 5,
+ "minor": 2,
+ "permissions": "rwm",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "",
+ "major": 10,
+ "minor": 200,
+ "permissions": "rwm",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/null",
+ "major": 1,
+ "minor": 3,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/zero",
+ "major": 1,
+ "minor": 5,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/full",
+ "major": 1,
+ "minor": 7,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/tty",
+ "major": 5,
+ "minor": 0,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/urandom",
+ "major": 1,
+ "minor": 9,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/random",
+ "major": 1,
+ "minor": 8,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ }
+ ],
+ "memory": 0,
+ "memory_reservation": 0,
+ "memory_swap": 0,
+ "cpu_shares": 0,
+ "cpu_quota": 0,
+ "cpu_period": 0,
+ "cpuset_cpus": "",
+ "cpuset_mems": "",
+ "blkio_weight": 0,
+ "freezer": "",
+ "slice": ""
+ },
+ "apparmor_profile": "",
+ "process_label": "",
+ "rlimits": [
+ {
+ "type": 7,
+ "hard": 1024,
+ "soft": 1024
+ }
+ ],
+ "additional_groups": null,
+ "uid_mappings": null,
+ "gid_mappings": null,
+ "mask_paths": [
+ "/proc/kcore"
+ ],
+ "readonly_paths": [
+ "/proc/sys",
+ "/proc/sysrq-trigger",
+ "/proc/irq",
+ "/proc/bus"
+ ]
}
diff --git a/vendor/src/github.com/docker/libcontainer/sample_configs/minimal.json b/vendor/src/github.com/docker/libcontainer/sample_configs/minimal.json
index 01de467468..c2f7410956 100644
--- a/vendor/src/github.com/docker/libcontainer/sample_configs/minimal.json
+++ b/vendor/src/github.com/docker/libcontainer/sample_configs/minimal.json
@@ -1,201 +1,340 @@
{
- "capabilities": [
- "CHOWN",
- "DAC_OVERRIDE",
- "FOWNER",
- "MKNOD",
- "NET_RAW",
- "SETGID",
- "SETUID",
- "SETFCAP",
- "SETPCAP",
- "NET_BIND_SERVICE",
- "SYS_CHROOT",
- "KILL"
- ],
- "cgroups": {
- "allowed_devices": [
- {
- "cgroup_permissions": "m",
- "major_number": -1,
- "minor_number": -1,
- "type": 99
- },
- {
- "cgroup_permissions": "m",
- "major_number": -1,
- "minor_number": -1,
- "type": 98
- },
- {
- "cgroup_permissions": "rwm",
- "major_number": 5,
- "minor_number": 1,
- "path": "/dev/console",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "major_number": 4,
- "path": "/dev/tty0",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "major_number": 4,
- "minor_number": 1,
- "path": "/dev/tty1",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "major_number": 136,
- "minor_number": -1,
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "major_number": 5,
- "minor_number": 2,
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "major_number": 10,
- "minor_number": 200,
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 3,
- "path": "/dev/null",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 5,
- "path": "/dev/zero",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 7,
- "path": "/dev/full",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 5,
- "path": "/dev/tty",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 9,
- "path": "/dev/urandom",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 8,
- "path": "/dev/random",
- "type": 99
- }
- ],
- "name": "docker-koye",
- "parent": "docker"
- },
- "restrict_sys": true,
- "mount_config": {
- "device_nodes": [
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 3,
- "path": "/dev/null",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 5,
- "path": "/dev/zero",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 7,
- "path": "/dev/full",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 5,
- "path": "/dev/tty",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 9,
- "path": "/dev/urandom",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 8,
- "path": "/dev/random",
- "type": 99
- }
- ],
- "mounts": [
- {
- "type": "tmpfs",
- "destination": "/tmp"
- }
- ]
- },
- "environment": [
- "HOME=/",
- "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
- "HOSTNAME=koye",
- "TERM=xterm"
- ],
- "hostname": "koye",
- "namespaces": [
- {"type": "NEWIPC"},
- {"type": "NEWNET"},
- {"type": "NEWNS"},
- {"type": "NEWPID"},
- {"type": "NEWUTS"}
- ],
- "networks": [
- {
- "address": "127.0.0.1/0",
- "gateway": "localhost",
- "mtu": 1500,
- "type": "loopback"
- }
- ],
- "tty": true,
- "user": "daemon"
+ "no_pivot_root": false,
+ "parent_death_signal": 0,
+ "pivot_dir": "",
+ "rootfs": "/home/michael/development/gocode/src/github.com/docker/libcontainer",
+ "readonlyfs": false,
+ "mounts": [
+ {
+ "source": "shm",
+ "destination": "/dev/shm",
+ "device": "tmpfs",
+ "flags": 14,
+ "data": "mode=1777,size=65536k",
+ "relabel": ""
+ },
+ {
+ "source": "mqueue",
+ "destination": "/dev/mqueue",
+ "device": "mqueue",
+ "flags": 14,
+ "data": "",
+ "relabel": ""
+ },
+ {
+ "source": "sysfs",
+ "destination": "/sys",
+ "device": "sysfs",
+ "flags": 15,
+ "data": "",
+ "relabel": ""
+ }
+ ],
+ "devices": [
+ {
+ "type": 99,
+ "path": "/dev/fuse",
+ "major": 10,
+ "minor": 229,
+ "permissions": "rwm",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/null",
+ "major": 1,
+ "minor": 3,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/zero",
+ "major": 1,
+ "minor": 5,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/full",
+ "major": 1,
+ "minor": 7,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/tty",
+ "major": 5,
+ "minor": 0,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/urandom",
+ "major": 1,
+ "minor": 9,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/random",
+ "major": 1,
+ "minor": 8,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ }
+ ],
+ "mount_label": "",
+ "hostname": "nsinit",
+ "namespaces": [
+ {
+ "type": "NEWNS",
+ "path": ""
+ },
+ {
+ "type": "NEWUTS",
+ "path": ""
+ },
+ {
+ "type": "NEWIPC",
+ "path": ""
+ },
+ {
+ "type": "NEWPID",
+ "path": ""
+ },
+ {
+ "type": "NEWNET",
+ "path": ""
+ }
+ ],
+ "capabilities": [
+ "CHOWN",
+ "DAC_OVERRIDE",
+ "FSETID",
+ "FOWNER",
+ "MKNOD",
+ "NET_RAW",
+ "SETGID",
+ "SETUID",
+ "SETFCAP",
+ "SETPCAP",
+ "NET_BIND_SERVICE",
+ "SYS_CHROOT",
+ "KILL",
+ "AUDIT_WRITE"
+ ],
+ "networks": [
+ {
+ "type": "loopback",
+ "name": "",
+ "bridge": "",
+ "mac_address": "",
+ "address": "127.0.0.1/0",
+ "gateway": "localhost",
+ "ipv6_address": "",
+ "ipv6_gateway": "",
+ "mtu": 0,
+ "txqueuelen": 0,
+ "host_interface_name": ""
+ }
+ ],
+ "routes": null,
+ "cgroups": {
+ "name": "libcontainer",
+ "parent": "nsinit",
+ "allow_all_devices": false,
+ "allowed_devices": [
+ {
+ "type": 99,
+ "path": "",
+ "major": -1,
+ "minor": -1,
+ "permissions": "m",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 98,
+ "path": "",
+ "major": -1,
+ "minor": -1,
+ "permissions": "m",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/console",
+ "major": 5,
+ "minor": 1,
+ "permissions": "rwm",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/tty0",
+ "major": 4,
+ "minor": 0,
+ "permissions": "rwm",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/tty1",
+ "major": 4,
+ "minor": 1,
+ "permissions": "rwm",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "",
+ "major": 136,
+ "minor": -1,
+ "permissions": "rwm",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "",
+ "major": 5,
+ "minor": 2,
+ "permissions": "rwm",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "",
+ "major": 10,
+ "minor": 200,
+ "permissions": "rwm",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/null",
+ "major": 1,
+ "minor": 3,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/zero",
+ "major": 1,
+ "minor": 5,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/full",
+ "major": 1,
+ "minor": 7,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/tty",
+ "major": 5,
+ "minor": 0,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/urandom",
+ "major": 1,
+ "minor": 9,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/random",
+ "major": 1,
+ "minor": 8,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ }
+ ],
+ "memory": 0,
+ "memory_reservation": 0,
+ "memory_swap": 0,
+ "cpu_shares": 0,
+ "cpu_quota": 0,
+ "cpu_period": 0,
+ "cpuset_cpus": "",
+ "cpuset_mems": "",
+ "blkio_weight": 0,
+ "freezer": "",
+ "slice": ""
+ },
+ "apparmor_profile": "",
+ "process_label": "",
+ "rlimits": [
+ {
+ "type": 7,
+ "hard": 1024,
+ "soft": 1024
+ }
+ ],
+ "additional_groups": null,
+ "uid_mappings": null,
+ "gid_mappings": null,
+ "mask_paths": [
+ "/proc/kcore"
+ ],
+ "readonly_paths": [
+ "/proc/sys",
+ "/proc/sysrq-trigger",
+ "/proc/irq",
+ "/proc/bus"
+ ]
}
diff --git a/vendor/src/github.com/docker/libcontainer/sample_configs/route_source_address_selection.json b/vendor/src/github.com/docker/libcontainer/sample_configs/route_source_address_selection.json
deleted file mode 100644
index 9c62045a4b..0000000000
--- a/vendor/src/github.com/docker/libcontainer/sample_configs/route_source_address_selection.json
+++ /dev/null
@@ -1,209 +0,0 @@
-{
- "capabilities": [
- "CHOWN",
- "DAC_OVERRIDE",
- "FOWNER",
- "MKNOD",
- "NET_RAW",
- "SETGID",
- "SETUID",
- "SETFCAP",
- "SETPCAP",
- "NET_BIND_SERVICE",
- "SYS_CHROOT",
- "KILL"
- ],
- "cgroups": {
- "allowed_devices": [
- {
- "cgroup_permissions": "m",
- "major_number": -1,
- "minor_number": -1,
- "type": 99
- },
- {
- "cgroup_permissions": "m",
- "major_number": -1,
- "minor_number": -1,
- "type": 98
- },
- {
- "cgroup_permissions": "rwm",
- "major_number": 5,
- "minor_number": 1,
- "path": "/dev/console",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "major_number": 4,
- "path": "/dev/tty0",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "major_number": 4,
- "minor_number": 1,
- "path": "/dev/tty1",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "major_number": 136,
- "minor_number": -1,
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "major_number": 5,
- "minor_number": 2,
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "major_number": 10,
- "minor_number": 200,
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 3,
- "path": "/dev/null",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 5,
- "path": "/dev/zero",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 7,
- "path": "/dev/full",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 5,
- "path": "/dev/tty",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 9,
- "path": "/dev/urandom",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 8,
- "path": "/dev/random",
- "type": 99
- }
- ],
- "name": "docker-koye",
- "parent": "docker"
- },
- "restrict_sys": true,
- "mount_config": {
- "device_nodes": [
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 3,
- "path": "/dev/null",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 5,
- "path": "/dev/zero",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 7,
- "path": "/dev/full",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 5,
- "path": "/dev/tty",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 9,
- "path": "/dev/urandom",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 8,
- "path": "/dev/random",
- "type": 99
- }
- ]
- },
- "environment": [
- "HOME=/",
- "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
- "HOSTNAME=koye",
- "TERM=xterm"
- ],
- "hostname": "koye",
- "namespaces": [
- {"type": "NEWIPC"},
- {"type": "NEWNET"},
- {"type": "NEWNS"},
- {"type": "NEWPID"},
- {"type": "NEWUTS"}
- ],
- "networks": [
- {
- "address": "127.0.0.1/0",
- "gateway": "localhost",
- "mtu": 1500,
- "type": "loopback"
- },
- {
- "address": "172.17.0.101/16",
- "bridge": "docker0",
- "veth_prefix": "veth",
- "mtu": 1500,
- "type": "veth"
- }
- ],
- "routes": [
- {
- "destination": "0.0.0.0/0",
- "source": "172.17.0.101",
- "gateway": "172.17.42.1",
- "interface_name": "eth0"
- }
- ],
- "tty": true
-}
diff --git a/vendor/src/github.com/docker/libcontainer/sample_configs/selinux.json b/vendor/src/github.com/docker/libcontainer/sample_configs/selinux.json
index 15556488a2..dddfdf1440 100644
--- a/vendor/src/github.com/docker/libcontainer/sample_configs/selinux.json
+++ b/vendor/src/github.com/docker/libcontainer/sample_configs/selinux.json
@@ -1,197 +1,340 @@
{
- "capabilities": [
- "CHOWN",
- "DAC_OVERRIDE",
- "FOWNER",
- "MKNOD",
- "NET_RAW",
- "SETGID",
- "SETUID",
- "SETFCAP",
- "SETPCAP",
- "NET_BIND_SERVICE",
- "SYS_CHROOT",
- "KILL"
- ],
- "cgroups": {
- "allowed_devices": [
- {
- "cgroup_permissions": "m",
- "major_number": -1,
- "minor_number": -1,
- "type": 99
- },
- {
- "cgroup_permissions": "m",
- "major_number": -1,
- "minor_number": -1,
- "type": 98
- },
- {
- "cgroup_permissions": "rwm",
- "major_number": 5,
- "minor_number": 1,
- "path": "/dev/console",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "major_number": 4,
- "path": "/dev/tty0",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "major_number": 4,
- "minor_number": 1,
- "path": "/dev/tty1",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "major_number": 136,
- "minor_number": -1,
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "major_number": 5,
- "minor_number": 2,
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "major_number": 10,
- "minor_number": 200,
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 3,
- "path": "/dev/null",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 5,
- "path": "/dev/zero",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 7,
- "path": "/dev/full",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 5,
- "path": "/dev/tty",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 9,
- "path": "/dev/urandom",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 8,
- "path": "/dev/random",
- "type": 99
- }
- ],
- "name": "docker-koye",
- "parent": "docker"
- },
- "restrict_sys": true,
- "process_label": "system_u:system_r:svirt_lxc_net_t:s0:c164,c475",
- "mount_config": {
- "mount_label": "system_u:system_r:svirt_lxc_net_t:s0:c164,c475",
- "device_nodes": [
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 3,
- "path": "/dev/null",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 5,
- "path": "/dev/zero",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 7,
- "path": "/dev/full",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 5,
- "path": "/dev/tty",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 9,
- "path": "/dev/urandom",
- "type": 99
- },
- {
- "cgroup_permissions": "rwm",
- "file_mode": 438,
- "major_number": 1,
- "minor_number": 8,
- "path": "/dev/random",
- "type": 99
- }
- ]
- },
- "environment": [
- "HOME=/",
- "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
- "HOSTNAME=koye",
- "TERM=xterm"
- ],
- "hostname": "koye",
- "namespaces": [
- {"type": "NEWIPC"},
- {"type": "NEWNET"},
- {"type": "NEWNS"},
- {"type": "NEWPID"},
- {"type": "NEWUTS"}
- ],
- "networks": [
- {
- "address": "127.0.0.1/0",
- "gateway": "localhost",
- "mtu": 1500,
- "type": "loopback"
- }
- ],
- "tty": true,
- "user": "daemon"
+ "no_pivot_root": false,
+ "parent_death_signal": 0,
+ "pivot_dir": "",
+ "rootfs": "/rootfs/jessie",
+ "readonlyfs": false,
+ "mounts": [
+ {
+ "source": "shm",
+ "destination": "/dev/shm",
+ "device": "tmpfs",
+ "flags": 14,
+ "data": "mode=1777,size=65536k",
+ "relabel": ""
+ },
+ {
+ "source": "mqueue",
+ "destination": "/dev/mqueue",
+ "device": "mqueue",
+ "flags": 14,
+ "data": "",
+ "relabel": ""
+ },
+ {
+ "source": "sysfs",
+ "destination": "/sys",
+ "device": "sysfs",
+ "flags": 15,
+ "data": "",
+ "relabel": ""
+ }
+ ],
+ "devices": [
+ {
+ "type": 99,
+ "path": "/dev/fuse",
+ "major": 10,
+ "minor": 229,
+ "permissions": "rwm",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/null",
+ "major": 1,
+ "minor": 3,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/zero",
+ "major": 1,
+ "minor": 5,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/full",
+ "major": 1,
+ "minor": 7,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/tty",
+ "major": 5,
+ "minor": 0,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/urandom",
+ "major": 1,
+ "minor": 9,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/random",
+ "major": 1,
+ "minor": 8,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ }
+ ],
+ "mount_label": "system_u:system_r:svirt_lxc_net_t:s0:c164,c475",
+ "hostname": "nsinit",
+ "namespaces": [
+ {
+ "type": "NEWNS",
+ "path": ""
+ },
+ {
+ "type": "NEWUTS",
+ "path": ""
+ },
+ {
+ "type": "NEWIPC",
+ "path": ""
+ },
+ {
+ "type": "NEWPID",
+ "path": ""
+ },
+ {
+ "type": "NEWNET",
+ "path": ""
+ }
+ ],
+ "capabilities": [
+ "CHOWN",
+ "DAC_OVERRIDE",
+ "FSETID",
+ "FOWNER",
+ "MKNOD",
+ "NET_RAW",
+ "SETGID",
+ "SETUID",
+ "SETFCAP",
+ "SETPCAP",
+ "NET_BIND_SERVICE",
+ "SYS_CHROOT",
+ "KILL",
+ "AUDIT_WRITE"
+ ],
+ "networks": [
+ {
+ "type": "loopback",
+ "name": "",
+ "bridge": "",
+ "mac_address": "",
+ "address": "127.0.0.1/0",
+ "gateway": "localhost",
+ "ipv6_address": "",
+ "ipv6_gateway": "",
+ "mtu": 0,
+ "txqueuelen": 0,
+ "host_interface_name": ""
+ }
+ ],
+ "routes": null,
+ "cgroups": {
+ "name": "libcontainer",
+ "parent": "nsinit",
+ "allow_all_devices": false,
+ "allowed_devices": [
+ {
+ "type": 99,
+ "path": "",
+ "major": -1,
+ "minor": -1,
+ "permissions": "m",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 98,
+ "path": "",
+ "major": -1,
+ "minor": -1,
+ "permissions": "m",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/console",
+ "major": 5,
+ "minor": 1,
+ "permissions": "rwm",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/tty0",
+ "major": 4,
+ "minor": 0,
+ "permissions": "rwm",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/tty1",
+ "major": 4,
+ "minor": 1,
+ "permissions": "rwm",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "",
+ "major": 136,
+ "minor": -1,
+ "permissions": "rwm",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "",
+ "major": 5,
+ "minor": 2,
+ "permissions": "rwm",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "",
+ "major": 10,
+ "minor": 200,
+ "permissions": "rwm",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/null",
+ "major": 1,
+ "minor": 3,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/zero",
+ "major": 1,
+ "minor": 5,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/full",
+ "major": 1,
+ "minor": 7,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/tty",
+ "major": 5,
+ "minor": 0,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/urandom",
+ "major": 1,
+ "minor": 9,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/random",
+ "major": 1,
+ "minor": 8,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ }
+ ],
+ "memory": 0,
+ "memory_reservation": 0,
+ "memory_swap": 0,
+ "cpu_shares": 0,
+ "cpu_quota": 0,
+ "cpu_period": 0,
+ "cpuset_cpus": "",
+ "cpuset_mems": "",
+ "blkio_weight": 0,
+ "freezer": "",
+ "slice": ""
+ },
+ "apparmor_profile": "",
+ "process_label": "system_u:system_r:svirt_lxc_net_t:s0:c164,c475",
+ "rlimits": [
+ {
+ "type": 7,
+ "hard": 1024,
+ "soft": 1024
+ }
+ ],
+ "additional_groups": null,
+ "uid_mappings": null,
+ "gid_mappings": null,
+ "mask_paths": [
+ "/proc/kcore"
+ ],
+ "readonly_paths": [
+ "/proc/sys",
+ "/proc/sysrq-trigger",
+ "/proc/irq",
+ "/proc/bus"
+ ]
}
diff --git a/vendor/src/github.com/docker/libcontainer/sample_configs/userns.json b/vendor/src/github.com/docker/libcontainer/sample_configs/userns.json
new file mode 100644
index 0000000000..2b1fb90b4a
--- /dev/null
+++ b/vendor/src/github.com/docker/libcontainer/sample_configs/userns.json
@@ -0,0 +1,376 @@
+{
+ "no_pivot_root": false,
+ "parent_death_signal": 0,
+ "pivot_dir": "",
+ "rootfs": "/rootfs/jessie",
+ "readonlyfs": false,
+ "mounts": [
+ {
+ "source": "shm",
+ "destination": "/dev/shm",
+ "device": "tmpfs",
+ "flags": 14,
+ "data": "mode=1777,size=65536k",
+ "relabel": ""
+ },
+ {
+ "source": "mqueue",
+ "destination": "/dev/mqueue",
+ "device": "mqueue",
+ "flags": 14,
+ "data": "",
+ "relabel": ""
+ },
+ {
+ "source": "sysfs",
+ "destination": "/sys",
+ "device": "sysfs",
+ "flags": 15,
+ "data": "",
+ "relabel": ""
+ }
+ ],
+ "devices": [
+ {
+ "type": 99,
+ "path": "/dev/fuse",
+ "major": 10,
+ "minor": 229,
+ "permissions": "rwm",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/null",
+ "major": 1,
+ "minor": 3,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/zero",
+ "major": 1,
+ "minor": 5,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/full",
+ "major": 1,
+ "minor": 7,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/tty",
+ "major": 5,
+ "minor": 0,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/urandom",
+ "major": 1,
+ "minor": 9,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/random",
+ "major": 1,
+ "minor": 8,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ }
+ ],
+ "mount_label": "",
+ "hostname": "nsinit",
+ "namespaces": [
+ {
+ "type": "NEWNS",
+ "path": ""
+ },
+ {
+ "type": "NEWUTS",
+ "path": ""
+ },
+ {
+ "type": "NEWIPC",
+ "path": ""
+ },
+ {
+ "type": "NEWPID",
+ "path": ""
+ },
+ {
+ "type": "NEWNET",
+ "path": ""
+ },
+ {
+ "type": "NEWUSER",
+ "path": ""
+ }
+ ],
+ "capabilities": [
+ "CHOWN",
+ "DAC_OVERRIDE",
+ "FSETID",
+ "FOWNER",
+ "MKNOD",
+ "NET_RAW",
+ "SETGID",
+ "SETUID",
+ "SETFCAP",
+ "SETPCAP",
+ "NET_BIND_SERVICE",
+ "SYS_CHROOT",
+ "KILL",
+ "AUDIT_WRITE"
+ ],
+ "networks": [
+ {
+ "type": "loopback",
+ "name": "",
+ "bridge": "",
+ "mac_address": "",
+ "address": "127.0.0.1/0",
+ "gateway": "localhost",
+ "ipv6_address": "",
+ "ipv6_gateway": "",
+ "mtu": 0,
+ "txqueuelen": 0,
+ "host_interface_name": ""
+ }
+ ],
+ "routes": null,
+ "cgroups": {
+ "name": "libcontainer",
+ "parent": "nsinit",
+ "allow_all_devices": false,
+ "allowed_devices": [
+ {
+ "type": 99,
+ "path": "",
+ "major": -1,
+ "minor": -1,
+ "permissions": "m",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 98,
+ "path": "",
+ "major": -1,
+ "minor": -1,
+ "permissions": "m",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/console",
+ "major": 5,
+ "minor": 1,
+ "permissions": "rwm",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/tty0",
+ "major": 4,
+ "minor": 0,
+ "permissions": "rwm",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/tty1",
+ "major": 4,
+ "minor": 1,
+ "permissions": "rwm",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "",
+ "major": 136,
+ "minor": -1,
+ "permissions": "rwm",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "",
+ "major": 5,
+ "minor": 2,
+ "permissions": "rwm",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "",
+ "major": 10,
+ "minor": 200,
+ "permissions": "rwm",
+ "file_mode": 0,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/null",
+ "major": 1,
+ "minor": 3,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/zero",
+ "major": 1,
+ "minor": 5,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/full",
+ "major": 1,
+ "minor": 7,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/tty",
+ "major": 5,
+ "minor": 0,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/urandom",
+ "major": 1,
+ "minor": 9,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ },
+ {
+ "type": 99,
+ "path": "/dev/random",
+ "major": 1,
+ "minor": 8,
+ "permissions": "rwm",
+ "file_mode": 438,
+ "uid": 0,
+ "gid": 0
+ }
+ ],
+ "memory": 0,
+ "memory_reservation": 0,
+ "memory_swap": 0,
+ "cpu_shares": 0,
+ "cpu_quota": 0,
+ "cpu_period": 0,
+ "cpuset_cpus": "",
+ "cpuset_mems": "",
+ "blkio_weight": 0,
+ "freezer": "",
+ "slice": ""
+ },
+ "apparmor_profile": "",
+ "process_label": "",
+ "rlimits": [
+ {
+ "type": 7,
+ "hard": 1024,
+ "soft": 1024
+ }
+ ],
+ "additional_groups": null,
+ "uid_mappings": [
+ {
+ "container_id": 0,
+ "host_id": 1000,
+ "size": 1
+ },
+ {
+ "container_id": 1,
+ "host_id": 1,
+ "size": 999
+ },
+ {
+ "container_id": 1001,
+ "host_id": 1001,
+ "size": 2147482647
+ }
+ ],
+ "gid_mappings": [
+ {
+ "container_id": 0,
+ "host_id": 1000,
+ "size": 1
+ },
+ {
+ "container_id": 1,
+ "host_id": 1,
+ "size": 999
+ },
+ {
+ "container_id": 1001,
+ "host_id": 1001,
+ "size": 2147482647
+ }
+ ],
+ "mask_paths": [
+ "/proc/kcore"
+ ],
+ "readonly_paths": [
+ "/proc/sys",
+ "/proc/sysrq-trigger",
+ "/proc/irq",
+ "/proc/bus"
+ ]
+}
diff --git a/vendor/src/github.com/docker/libcontainer/security/capabilities/capabilities.go b/vendor/src/github.com/docker/libcontainer/security/capabilities/capabilities.go
deleted file mode 100644
index 7aef5fa67f..0000000000
--- a/vendor/src/github.com/docker/libcontainer/security/capabilities/capabilities.go
+++ /dev/null
@@ -1,56 +0,0 @@
-package capabilities
-
-import (
- "os"
-
- "github.com/syndtr/gocapability/capability"
-)
-
-const allCapabilityTypes = capability.CAPS | capability.BOUNDS
-
-// DropBoundingSet drops the capability bounding set to those specified in the
-// container configuration.
-func DropBoundingSet(capabilities []string) error {
- c, err := capability.NewPid(os.Getpid())
- if err != nil {
- return err
- }
-
- keep := getEnabledCapabilities(capabilities)
- c.Clear(capability.BOUNDS)
- c.Set(capability.BOUNDS, keep...)
-
- if err := c.Apply(capability.BOUNDS); err != nil {
- return err
- }
-
- return nil
-}
-
-// DropCapabilities drops all capabilities for the current process except those specified in the container configuration.
-func DropCapabilities(capList []string) error {
- c, err := capability.NewPid(os.Getpid())
- if err != nil {
- return err
- }
-
- keep := getEnabledCapabilities(capList)
- c.Clear(allCapabilityTypes)
- c.Set(allCapabilityTypes, keep...)
-
- if err := c.Apply(allCapabilityTypes); err != nil {
- return err
- }
- return nil
-}
-
-// getEnabledCapabilities returns the capabilities that should not be dropped by the container.
-func getEnabledCapabilities(capList []string) []capability.Cap {
- keep := []capability.Cap{}
- for _, capability := range capList {
- if c := GetCapability(capability); c != nil {
- keep = append(keep, c.Value)
- }
- }
- return keep
-}
diff --git a/vendor/src/github.com/docker/libcontainer/security/capabilities/types.go b/vendor/src/github.com/docker/libcontainer/security/capabilities/types.go
deleted file mode 100644
index a960b804c6..0000000000
--- a/vendor/src/github.com/docker/libcontainer/security/capabilities/types.go
+++ /dev/null
@@ -1,88 +0,0 @@
-package capabilities
-
-import "github.com/syndtr/gocapability/capability"
-
-type (
- CapabilityMapping struct {
- Key string `json:"key,omitempty"`
- Value capability.Cap `json:"value,omitempty"`
- }
- Capabilities []*CapabilityMapping
-)
-
-func (c *CapabilityMapping) String() string {
- return c.Key
-}
-
-func GetCapability(key string) *CapabilityMapping {
- for _, capp := range capabilityList {
- if capp.Key == key {
- cpy := *capp
- return &cpy
- }
- }
- return nil
-}
-
-func GetAllCapabilities() []string {
- output := make([]string, len(capabilityList))
- for i, capability := range capabilityList {
- output[i] = capability.String()
- }
- return output
-}
-
-// Contains returns true if the specified Capability is
-// in the slice
-func (c Capabilities) contains(capp string) bool {
- return c.get(capp) != nil
-}
-
-func (c Capabilities) get(capp string) *CapabilityMapping {
- for _, cap := range c {
- if cap.Key == capp {
- return cap
- }
- }
- return nil
-}
-
-var capabilityList = Capabilities{
- {Key: "SETPCAP", Value: capability.CAP_SETPCAP},
- {Key: "SYS_MODULE", Value: capability.CAP_SYS_MODULE},
- {Key: "SYS_RAWIO", Value: capability.CAP_SYS_RAWIO},
- {Key: "SYS_PACCT", Value: capability.CAP_SYS_PACCT},
- {Key: "SYS_ADMIN", Value: capability.CAP_SYS_ADMIN},
- {Key: "SYS_NICE", Value: capability.CAP_SYS_NICE},
- {Key: "SYS_RESOURCE", Value: capability.CAP_SYS_RESOURCE},
- {Key: "SYS_TIME", Value: capability.CAP_SYS_TIME},
- {Key: "SYS_TTY_CONFIG", Value: capability.CAP_SYS_TTY_CONFIG},
- {Key: "MKNOD", Value: capability.CAP_MKNOD},
- {Key: "AUDIT_WRITE", Value: capability.CAP_AUDIT_WRITE},
- {Key: "AUDIT_CONTROL", Value: capability.CAP_AUDIT_CONTROL},
- {Key: "MAC_OVERRIDE", Value: capability.CAP_MAC_OVERRIDE},
- {Key: "MAC_ADMIN", Value: capability.CAP_MAC_ADMIN},
- {Key: "NET_ADMIN", Value: capability.CAP_NET_ADMIN},
- {Key: "SYSLOG", Value: capability.CAP_SYSLOG},
- {Key: "CHOWN", Value: capability.CAP_CHOWN},
- {Key: "NET_RAW", Value: capability.CAP_NET_RAW},
- {Key: "DAC_OVERRIDE", Value: capability.CAP_DAC_OVERRIDE},
- {Key: "FOWNER", Value: capability.CAP_FOWNER},
- {Key: "DAC_READ_SEARCH", Value: capability.CAP_DAC_READ_SEARCH},
- {Key: "FSETID", Value: capability.CAP_FSETID},
- {Key: "KILL", Value: capability.CAP_KILL},
- {Key: "SETGID", Value: capability.CAP_SETGID},
- {Key: "SETUID", Value: capability.CAP_SETUID},
- {Key: "LINUX_IMMUTABLE", Value: capability.CAP_LINUX_IMMUTABLE},
- {Key: "NET_BIND_SERVICE", Value: capability.CAP_NET_BIND_SERVICE},
- {Key: "NET_BROADCAST", Value: capability.CAP_NET_BROADCAST},
- {Key: "IPC_LOCK", Value: capability.CAP_IPC_LOCK},
- {Key: "IPC_OWNER", Value: capability.CAP_IPC_OWNER},
- {Key: "SYS_CHROOT", Value: capability.CAP_SYS_CHROOT},
- {Key: "SYS_PTRACE", Value: capability.CAP_SYS_PTRACE},
- {Key: "SYS_BOOT", Value: capability.CAP_SYS_BOOT},
- {Key: "LEASE", Value: capability.CAP_LEASE},
- {Key: "SETFCAP", Value: capability.CAP_SETFCAP},
- {Key: "WAKE_ALARM", Value: capability.CAP_WAKE_ALARM},
- {Key: "BLOCK_SUSPEND", Value: capability.CAP_BLOCK_SUSPEND},
-}
diff --git a/vendor/src/github.com/docker/libcontainer/security/capabilities/types_test.go b/vendor/src/github.com/docker/libcontainer/security/capabilities/types_test.go
deleted file mode 100644
index 06e8a2b01c..0000000000
--- a/vendor/src/github.com/docker/libcontainer/security/capabilities/types_test.go
+++ /dev/null
@@ -1,19 +0,0 @@
-package capabilities
-
-import (
- "testing"
-)
-
-func TestCapabilitiesContains(t *testing.T) {
- caps := Capabilities{
- GetCapability("MKNOD"),
- GetCapability("SETPCAP"),
- }
-
- if caps.contains("SYS_ADMIN") {
- t.Fatal("capabilities should not contain SYS_ADMIN")
- }
- if !caps.contains("MKNOD") {
- t.Fatal("capabilities should contain MKNOD but does not")
- }
-}
diff --git a/vendor/src/github.com/docker/libcontainer/security/restrict/restrict.go b/vendor/src/github.com/docker/libcontainer/security/restrict/restrict.go
deleted file mode 100644
index dd765b1f1b..0000000000
--- a/vendor/src/github.com/docker/libcontainer/security/restrict/restrict.go
+++ /dev/null
@@ -1,53 +0,0 @@
-// +build linux
-
-package restrict
-
-import (
- "fmt"
- "os"
- "syscall"
- "time"
-)
-
-const defaultMountFlags = syscall.MS_NOEXEC | syscall.MS_NOSUID | syscall.MS_NODEV
-
-func mountReadonly(path string) error {
- for i := 0; i < 5; i++ {
- if err := syscall.Mount("", path, "", syscall.MS_REMOUNT|syscall.MS_RDONLY, ""); err != nil && !os.IsNotExist(err) {
- switch err {
- case syscall.EINVAL:
- // Probably not a mountpoint, use bind-mount
- if err := syscall.Mount(path, path, "", syscall.MS_BIND, ""); err != nil {
- return err
- }
-
- return syscall.Mount(path, path, "", syscall.MS_BIND|syscall.MS_REMOUNT|syscall.MS_RDONLY|syscall.MS_REC|defaultMountFlags, "")
- case syscall.EBUSY:
- time.Sleep(100 * time.Millisecond)
- continue
- default:
- return err
- }
- }
-
- return nil
- }
-
- return fmt.Errorf("unable to mount %s as readonly max retries reached", path)
-}
-
-// This has to be called while the container still has CAP_SYS_ADMIN (to be able to perform mounts).
-// However, afterwards, CAP_SYS_ADMIN should be dropped (otherwise the user will be able to revert those changes).
-func Restrict(mounts ...string) error {
- for _, dest := range mounts {
- if err := mountReadonly(dest); err != nil {
- return fmt.Errorf("unable to remount %s readonly: %s", dest, err)
- }
- }
-
- if err := syscall.Mount("/dev/null", "/proc/kcore", "", syscall.MS_BIND, ""); err != nil && !os.IsNotExist(err) {
- return fmt.Errorf("unable to bind-mount /dev/null over /proc/kcore: %s", err)
- }
-
- return nil
-}
diff --git a/vendor/src/github.com/docker/libcontainer/security/restrict/unsupported.go b/vendor/src/github.com/docker/libcontainer/security/restrict/unsupported.go
deleted file mode 100644
index 464e8d498d..0000000000
--- a/vendor/src/github.com/docker/libcontainer/security/restrict/unsupported.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// +build !linux
-
-package restrict
-
-import "fmt"
-
-func Restrict() error {
- return fmt.Errorf("not supported")
-}
diff --git a/vendor/src/github.com/docker/libcontainer/selinux/selinux.go b/vendor/src/github.com/docker/libcontainer/selinux/selinux.go
index e5bd820980..28bc405afc 100644
--- a/vendor/src/github.com/docker/libcontainer/selinux/selinux.go
+++ b/vendor/src/github.com/docker/libcontainer/selinux/selinux.go
@@ -37,8 +37,8 @@ var (
spaceRegex = regexp.MustCompile(`^([^=]+) (.*)$`)
mcsList = make(map[string]bool)
selinuxfs = "unknown"
- selinuxEnabled = false
- selinuxEnabledChecked = false
+ selinuxEnabled = false // Stores whether selinux is currently enabled
+ selinuxEnabledChecked = false // Stores whether selinux enablement has been checked or established yet
)
type SELinuxContext map[string]string
@@ -48,6 +48,11 @@ func SetDisabled() {
selinuxEnabled, selinuxEnabledChecked = false, true
}
+// getSelinuxMountPoint returns the path to the mountpoint of an selinuxfs
+// filesystem or an empty string if no mountpoint is found. Selinuxfs is
+// a proc-like pseudo-filesystem that exposes the selinux policy API to
+// processes. The existence of an selinuxfs mount is used to determine
+// whether selinux is currently enabled or not.
func getSelinuxMountPoint() string {
if selinuxfs != "unknown" {
return selinuxfs
@@ -74,6 +79,7 @@ func getSelinuxMountPoint() string {
return selinuxfs
}
+// SelinuxEnabled returns whether selinux is currently enabled.
func SelinuxEnabled() bool {
if selinuxEnabledChecked {
return selinuxEnabled
@@ -145,13 +151,19 @@ func readCon(name string) (string, error) {
return val, err
}
+// Setfilecon sets the SELinux label for this path or returns an error.
func Setfilecon(path string, scon string) error {
return system.Lsetxattr(path, xattrNameSelinux, []byte(scon), 0)
}
-// Return the SELinux label for this path
+// Getfilecon returns the SELinux label for this path or returns an error.
func Getfilecon(path string) (string, error) {
con, err := system.Lgetxattr(path, xattrNameSelinux)
+
+ // Trim the NUL byte at the end of the byte buffer, if present.
+ if con[len(con)-1] == '\x00' {
+ con = con[:len(con)-1]
+ }
return string(con), err
}
@@ -163,11 +175,12 @@ func Getfscreatecon() (string, error) {
return readCon(fmt.Sprintf("/proc/self/task/%d/attr/fscreate", syscall.Gettid()))
}
-// Return the SELinux label of the current process thread.
+// Getcon returns the SELinux label of the current process thread, or an error.
func Getcon() (string, error) {
return readCon(fmt.Sprintf("/proc/self/task/%d/attr/current", syscall.Gettid()))
}
+// Getpidcon returns the SELinux label of the given pid, or an error.
func Getpidcon(pid int) (string, error) {
return readCon(fmt.Sprintf("/proc/%d/attr/current", pid))
}
diff --git a/vendor/src/github.com/docker/libcontainer/setns_init_linux.go b/vendor/src/github.com/docker/libcontainer/setns_init_linux.go
new file mode 100644
index 0000000000..f77219d27a
--- /dev/null
+++ b/vendor/src/github.com/docker/libcontainer/setns_init_linux.go
@@ -0,0 +1,35 @@
+// +build linux
+
+package libcontainer
+
+import (
+ "os"
+
+ "github.com/docker/libcontainer/apparmor"
+ "github.com/docker/libcontainer/label"
+ "github.com/docker/libcontainer/system"
+)
+
+// linuxSetnsInit performs the container's initialization for running a new process
+// inside an existing container.
+type linuxSetnsInit struct {
+ config *initConfig
+}
+
+func (l *linuxSetnsInit) Init() error {
+ if err := setupRlimits(l.config.Config); err != nil {
+ return err
+ }
+ if err := finalizeNamespace(l.config); err != nil {
+ return err
+ }
+ if err := apparmor.ApplyProfile(l.config.Config.AppArmorProfile); err != nil {
+ return err
+ }
+ if l.config.Config.ProcessLabel != "" {
+ if err := label.SetProcessLabel(l.config.Config.ProcessLabel); err != nil {
+ return err
+ }
+ }
+ return system.Execv(l.config.Args[0], l.config.Args[0:], os.Environ())
+}
diff --git a/vendor/src/github.com/docker/libcontainer/stacktrace/capture.go b/vendor/src/github.com/docker/libcontainer/stacktrace/capture.go
new file mode 100644
index 0000000000..15b3482ccc
--- /dev/null
+++ b/vendor/src/github.com/docker/libcontainer/stacktrace/capture.go
@@ -0,0 +1,23 @@
+package stacktrace
+
+import "runtime"
+
+// Caputure captures a stacktrace for the current calling go program
+//
+// skip is the number of frames to skip
+func Capture(userSkip int) Stacktrace {
+ var (
+ skip = userSkip + 1 // add one for our own function
+ frames []Frame
+ )
+ for i := skip; ; i++ {
+ pc, file, line, ok := runtime.Caller(i)
+ if !ok {
+ break
+ }
+ frames = append(frames, NewFrame(pc, file, line))
+ }
+ return Stacktrace{
+ Frames: frames,
+ }
+}
diff --git a/vendor/src/github.com/docker/libcontainer/stacktrace/capture_test.go b/vendor/src/github.com/docker/libcontainer/stacktrace/capture_test.go
new file mode 100644
index 0000000000..3f435d51a6
--- /dev/null
+++ b/vendor/src/github.com/docker/libcontainer/stacktrace/capture_test.go
@@ -0,0 +1,27 @@
+package stacktrace
+
+import "testing"
+
+func captureFunc() Stacktrace {
+ return Capture(0)
+}
+
+func TestCaptureTestFunc(t *testing.T) {
+ stack := captureFunc()
+
+ if len(stack.Frames) == 0 {
+ t.Fatal("expected stack frames to be returned")
+ }
+
+ // the first frame is the caller
+ frame := stack.Frames[0]
+ if expected := "captureFunc"; frame.Function != expected {
+ t.Fatalf("expteced function %q but recevied %q", expected, frame.Function)
+ }
+ if expected := "github.com/docker/libcontainer/stacktrace"; frame.Package != expected {
+ t.Fatalf("expected package %q but received %q", expected, frame.Package)
+ }
+ if expected := "capture_test.go"; frame.File != expected {
+ t.Fatalf("expected file %q but received %q", expected, frame.File)
+ }
+}
diff --git a/vendor/src/github.com/docker/libcontainer/stacktrace/frame.go b/vendor/src/github.com/docker/libcontainer/stacktrace/frame.go
new file mode 100644
index 0000000000..5edea1b751
--- /dev/null
+++ b/vendor/src/github.com/docker/libcontainer/stacktrace/frame.go
@@ -0,0 +1,35 @@
+package stacktrace
+
+import (
+ "path/filepath"
+ "runtime"
+ "strings"
+)
+
+// NewFrame returns a new stack frame for the provided information
+func NewFrame(pc uintptr, file string, line int) Frame {
+ fn := runtime.FuncForPC(pc)
+ pack, name := parseFunctionName(fn.Name())
+ return Frame{
+ Line: line,
+ File: filepath.Base(file),
+ Package: pack,
+ Function: name,
+ }
+}
+
+func parseFunctionName(name string) (string, string) {
+ i := strings.LastIndex(name, ".")
+ if i == -1 {
+ return "", name
+ }
+ return name[:i], name[i+1:]
+}
+
+// Frame contains all the information for a stack frame within a go program
+type Frame struct {
+ File string
+ Function string
+ Package string
+ Line int
+}
diff --git a/vendor/src/github.com/docker/libcontainer/stacktrace/frame_test.go b/vendor/src/github.com/docker/libcontainer/stacktrace/frame_test.go
new file mode 100644
index 0000000000..ae95ec4847
--- /dev/null
+++ b/vendor/src/github.com/docker/libcontainer/stacktrace/frame_test.go
@@ -0,0 +1,20 @@
+package stacktrace
+
+import "testing"
+
+func TestParsePackageName(t *testing.T) {
+ var (
+ name = "github.com/docker/libcontainer/stacktrace.captureFunc"
+ expectedPackage = "github.com/docker/libcontainer/stacktrace"
+ expectedFunction = "captureFunc"
+ )
+
+ pack, funcName := parseFunctionName(name)
+ if pack != expectedPackage {
+ t.Fatalf("expected package %q but received %q", expectedPackage, pack)
+ }
+
+ if funcName != expectedFunction {
+ t.Fatalf("expected function %q but received %q", expectedFunction, funcName)
+ }
+}
diff --git a/vendor/src/github.com/docker/libcontainer/stacktrace/stacktrace.go b/vendor/src/github.com/docker/libcontainer/stacktrace/stacktrace.go
new file mode 100644
index 0000000000..5e8b58d2d2
--- /dev/null
+++ b/vendor/src/github.com/docker/libcontainer/stacktrace/stacktrace.go
@@ -0,0 +1,5 @@
+package stacktrace
+
+type Stacktrace struct {
+ Frames []Frame
+}
diff --git a/vendor/src/github.com/docker/libcontainer/standard_init_linux.go b/vendor/src/github.com/docker/libcontainer/standard_init_linux.go
new file mode 100644
index 0000000000..282832b568
--- /dev/null
+++ b/vendor/src/github.com/docker/libcontainer/standard_init_linux.go
@@ -0,0 +1,96 @@
+// +build linux
+
+package libcontainer
+
+import (
+ "os"
+ "syscall"
+
+ "github.com/docker/libcontainer/apparmor"
+ "github.com/docker/libcontainer/configs"
+ "github.com/docker/libcontainer/label"
+ "github.com/docker/libcontainer/system"
+)
+
+type linuxStandardInit struct {
+ parentPid int
+ config *initConfig
+}
+
+func (l *linuxStandardInit) Init() error {
+ // join any namespaces via a path to the namespace fd if provided
+ if err := joinExistingNamespaces(l.config.Config.Namespaces); err != nil {
+ return err
+ }
+ var console *linuxConsole
+ if l.config.Console != "" {
+ console = newConsoleFromPath(l.config.Console)
+ if err := console.dupStdio(); err != nil {
+ return err
+ }
+ }
+ if _, err := syscall.Setsid(); err != nil {
+ return err
+ }
+ if console != nil {
+ if err := system.Setctty(); err != nil {
+ return err
+ }
+ }
+ if err := setupNetwork(l.config); err != nil {
+ return err
+ }
+ if err := setupRoute(l.config.Config); err != nil {
+ return err
+ }
+ if err := setupRlimits(l.config.Config); err != nil {
+ return err
+ }
+ label.Init()
+ // InitializeMountNamespace() can be executed only for a new mount namespace
+ if l.config.Config.Namespaces.Contains(configs.NEWNS) {
+ if err := setupRootfs(l.config.Config, console); err != nil {
+ return err
+ }
+ }
+ if hostname := l.config.Config.Hostname; hostname != "" {
+ if err := syscall.Sethostname([]byte(hostname)); err != nil {
+ return err
+ }
+ }
+ if err := apparmor.ApplyProfile(l.config.Config.AppArmorProfile); err != nil {
+ return err
+ }
+ if err := label.SetProcessLabel(l.config.Config.ProcessLabel); err != nil {
+ return err
+ }
+ for _, path := range l.config.Config.ReadonlyPaths {
+ if err := remountReadonly(path); err != nil {
+ return err
+ }
+ }
+ for _, path := range l.config.Config.MaskPaths {
+ if err := maskFile(path); err != nil {
+ return err
+ }
+ }
+ pdeath, err := system.GetParentDeathSignal()
+ if err != nil {
+ return err
+ }
+ if err := finalizeNamespace(l.config); err != nil {
+ return err
+ }
+ // finalizeNamespace can change user/group which clears the parent death
+ // signal, so we restore it here.
+ if err := pdeath.Restore(); err != nil {
+ return err
+ }
+ // compare the parent from the inital start of the init process and make sure that it did not change.
+ // if the parent changes that means it died and we were reparened to something else so we should
+ // just kill ourself and not cause problems for someone else.
+ if syscall.Getppid() != l.parentPid {
+ return syscall.Kill(syscall.Getpid(), syscall.SIGKILL)
+ }
+ return system.Execv(l.config.Args[0], l.config.Args[0:], os.Environ())
+}
diff --git a/vendor/src/github.com/docker/libcontainer/state.go b/vendor/src/github.com/docker/libcontainer/state.go
deleted file mode 100644
index 208b4c6276..0000000000
--- a/vendor/src/github.com/docker/libcontainer/state.go
+++ /dev/null
@@ -1,77 +0,0 @@
-package libcontainer
-
-import (
- "encoding/json"
- "os"
- "path/filepath"
-
- "github.com/docker/libcontainer/network"
-)
-
-// State represents a running container's state
-type State struct {
- // InitPid is the init process id in the parent namespace
- InitPid int `json:"init_pid,omitempty"`
-
- // InitStartTime is the init process start time
- InitStartTime string `json:"init_start_time,omitempty"`
-
- // Network runtime state.
- NetworkState network.NetworkState `json:"network_state,omitempty"`
-
- // Path to all the cgroups setup for a container. Key is cgroup subsystem name.
- CgroupPaths map[string]string `json:"cgroup_paths,omitempty"`
-}
-
-// The running state of the container.
-type RunState int
-
-const (
- // The name of the runtime state file
- stateFile = "state.json"
-
- // The container exists and is running.
- Running RunState = iota
-
- // The container exists, it is in the process of being paused.
- Pausing
-
- // The container exists, but all its processes are paused.
- Paused
-
- // The container does not exist.
- Destroyed
-)
-
-// SaveState writes the container's runtime state to a state.json file
-// in the specified path
-func SaveState(basePath string, state *State) error {
- f, err := os.Create(filepath.Join(basePath, stateFile))
- if err != nil {
- return err
- }
- defer f.Close()
-
- return json.NewEncoder(f).Encode(state)
-}
-
-// GetState reads the state.json file for a running container
-func GetState(basePath string) (*State, error) {
- f, err := os.Open(filepath.Join(basePath, stateFile))
- if err != nil {
- return nil, err
- }
- defer f.Close()
-
- var state *State
- if err := json.NewDecoder(f).Decode(&state); err != nil {
- return nil, err
- }
-
- return state, nil
-}
-
-// DeleteState deletes the state.json file
-func DeleteState(basePath string) error {
- return os.Remove(filepath.Join(basePath, stateFile))
-}
diff --git a/vendor/src/github.com/docker/libcontainer/stats.go b/vendor/src/github.com/docker/libcontainer/stats.go
new file mode 100644
index 0000000000..ba72a6fde9
--- /dev/null
+++ b/vendor/src/github.com/docker/libcontainer/stats.go
@@ -0,0 +1,22 @@
+package libcontainer
+
+import "github.com/docker/libcontainer/cgroups"
+
+type Stats struct {
+ Interfaces []*NetworkInterface
+ CgroupStats *cgroups.Stats
+}
+
+type NetworkInterface struct {
+ // Name is the name of the network interface.
+ Name string
+
+ RxBytes uint64
+ RxPackets uint64
+ RxErrors uint64
+ RxDropped uint64
+ TxBytes uint64
+ TxPackets uint64
+ TxErrors uint64
+ TxDropped uint64
+}
diff --git a/vendor/src/github.com/docker/libcontainer/system/linux.go b/vendor/src/github.com/docker/libcontainer/system/linux.go
index c07ef1532d..2cc3ef803a 100644
--- a/vendor/src/github.com/docker/libcontainer/system/linux.go
+++ b/vendor/src/github.com/docker/libcontainer/system/linux.go
@@ -8,6 +8,26 @@ import (
"unsafe"
)
+type ParentDeathSignal int
+
+func (p ParentDeathSignal) Restore() error {
+ if p == 0 {
+ return nil
+ }
+ current, err := GetParentDeathSignal()
+ if err != nil {
+ return err
+ }
+ if p == current {
+ return nil
+ }
+ return p.Set()
+}
+
+func (p ParentDeathSignal) Set() error {
+ return SetParentDeathSignal(uintptr(p))
+}
+
func Execv(cmd string, args []string, env []string) error {
name, err := exec.LookPath(cmd)
if err != nil {
@@ -17,23 +37,20 @@ func Execv(cmd string, args []string, env []string) error {
return syscall.Exec(name, args, env)
}
-func ParentDeathSignal(sig uintptr) error {
+func SetParentDeathSignal(sig uintptr) error {
if _, _, err := syscall.RawSyscall(syscall.SYS_PRCTL, syscall.PR_SET_PDEATHSIG, sig, 0); err != 0 {
return err
}
return nil
}
-func GetParentDeathSignal() (int, error) {
+func GetParentDeathSignal() (ParentDeathSignal, error) {
var sig int
-
_, _, err := syscall.RawSyscall(syscall.SYS_PRCTL, syscall.PR_GET_PDEATHSIG, uintptr(unsafe.Pointer(&sig)), 0)
-
if err != 0 {
return -1, err
}
-
- return sig, nil
+ return ParentDeathSignal(sig), nil
}
func SetKeepCaps() error {
diff --git a/vendor/src/github.com/docker/libcontainer/types.go b/vendor/src/github.com/docker/libcontainer/types.go
deleted file mode 100644
index c341137ec8..0000000000
--- a/vendor/src/github.com/docker/libcontainer/types.go
+++ /dev/null
@@ -1,11 +0,0 @@
-package libcontainer
-
-import (
- "github.com/docker/libcontainer/cgroups"
- "github.com/docker/libcontainer/network"
-)
-
-type ContainerStats struct {
- NetworkStats *network.NetworkStats `json:"network_stats,omitempty"`
- CgroupStats *cgroups.Stats `json:"cgroup_stats,omitempty"`
-}
diff --git a/vendor/src/github.com/docker/libcontainer/update-vendor.sh b/vendor/src/github.com/docker/libcontainer/update-vendor.sh
index df66a0a8d5..b68f5d4610 100755
--- a/vendor/src/github.com/docker/libcontainer/update-vendor.sh
+++ b/vendor/src/github.com/docker/libcontainer/update-vendor.sh
@@ -42,7 +42,8 @@ clone() {
# the following lines are in sorted order, FYI
clone git github.com/codegangsta/cli 1.1.0
clone git github.com/coreos/go-systemd v2
-clone git github.com/godbus/dbus v1
-clone git github.com/syndtr/gocapability 3c85049eae
+clone git github.com/godbus/dbus v2
+clone git github.com/Sirupsen/logrus v0.6.6
+clone git github.com/syndtr/gocapability 8e4cdcb
# intentionally not vendoring Docker itself... that'd be a circle :)
diff --git a/vendor/src/github.com/docker/libcontainer/utils/utils.go b/vendor/src/github.com/docker/libcontainer/utils/utils.go
index 76184ce00b..094bce5300 100644
--- a/vendor/src/github.com/docker/libcontainer/utils/utils.go
+++ b/vendor/src/github.com/docker/libcontainer/utils/utils.go
@@ -10,6 +10,10 @@ import (
"syscall"
)
+const (
+ exitSignalOffset = 128
+)
+
// GenerateRandomName returns a new name joined with a prefix. This size
// specified is used to truncate the randomly generated value
func GenerateRandomName(prefix string, size int) (string, error) {
@@ -53,3 +57,12 @@ func CloseExecFrom(minFd int) error {
}
return nil
}
+
+// ExitStatus returns the correct exit status for a process based on if it
+// was signaled or existed cleanly.
+func ExitStatus(status syscall.WaitStatus) int {
+ if status.Signaled() {
+ return exitSignalOffset + int(status.Signal())
+ }
+ return status.ExitStatus()
+}
diff --git a/vendor/src/github.com/godbus/dbus/CONTRIBUTING.md b/vendor/src/github.com/godbus/dbus/CONTRIBUTING.md
new file mode 100644
index 0000000000..c88f9b2bdd
--- /dev/null
+++ b/vendor/src/github.com/godbus/dbus/CONTRIBUTING.md
@@ -0,0 +1,50 @@
+# How to Contribute
+
+## Getting Started
+
+- Fork the repository on GitHub
+- Read the [README](README.markdown) for build and test instructions
+- Play with the project, submit bugs, submit patches!
+
+## Contribution Flow
+
+This is a rough outline of what a contributor's workflow looks like:
+
+- Create a topic branch from where you want to base your work (usually master).
+- Make commits of logical units.
+- Make sure your commit messages are in the proper format (see below).
+- Push your changes to a topic branch in your fork of the repository.
+- Make sure the tests pass, and add any new tests as appropriate.
+- Submit a pull request to the original repository.
+
+Thanks for your contributions!
+
+### Format of the Commit Message
+
+We follow a rough convention for commit messages that is designed to answer two
+questions: what changed and why. The subject line should feature the what and
+the body of the commit should describe the why.
+
+```
+scripts: add the test-cluster command
+
+this uses tmux to setup a test cluster that you can easily kill and
+start for debugging.
+
+Fixes #38
+```
+
+The format can be described more formally as follows:
+
+```
+<subsystem>: <what changed>
+<BLANK LINE>
+<why this change was made>
+<BLANK LINE>
+<footer>
+```
+
+The first line is the subject and should be no longer than 70 characters, the
+second line is always blank, and other lines should be wrapped at 80 characters.
+This allows the message to be easier to read on GitHub as well as in various
+git tools.
diff --git a/vendor/src/github.com/godbus/dbus/MAINTAINERS b/vendor/src/github.com/godbus/dbus/MAINTAINERS
new file mode 100644
index 0000000000..e8968ece7f
--- /dev/null
+++ b/vendor/src/github.com/godbus/dbus/MAINTAINERS
@@ -0,0 +1,2 @@
+Brandon Philips <brandon@ifup.org> (@philips)
+Brian Waldon <brian@waldon.cc> (@bcwaldon)
diff --git a/vendor/src/github.com/godbus/dbus/conn.go b/vendor/src/github.com/godbus/dbus/conn.go
index 75dd22652a..18027a096a 100644
--- a/vendor/src/github.com/godbus/dbus/conn.go
+++ b/vendor/src/github.com/godbus/dbus/conn.go
@@ -175,6 +175,13 @@ func (conn *Conn) BusObject() *Object {
// not be called on shared connections.
func (conn *Conn) Close() error {
conn.outLck.Lock()
+ if conn.closed {
+ // inWorker calls Close on read error, the read error may
+ // be caused by another caller calling Close to shutdown the
+ // dbus connection, a double-close scenario we prevent here.
+ conn.outLck.Unlock()
+ return nil
+ }
close(conn.out)
conn.closed = true
conn.outLck.Unlock()
@@ -317,11 +324,7 @@ func (conn *Conn) inWorker() {
}
conn.signalsLck.Lock()
for _, ch := range conn.signals {
- // don't block trying to send a signal
- select {
- case ch <- signal:
- default:
- }
+ ch <- signal
}
conn.signalsLck.Unlock()
case TypeMethodCall:
@@ -508,6 +511,10 @@ type Error struct {
Body []interface{}
}
+func NewError(name string, body []interface{}) *Error {
+ return &Error{name, body}
+}
+
func (e Error) Error() string {
if len(e.Body) >= 1 {
s, ok := e.Body[0].(string)
@@ -546,13 +553,14 @@ type transport interface {
SendMessage(*Message) error
}
+var (
+ transports map[string]func(string) (transport, error) = make(map[string]func(string) (transport, error))
+)
+
func getTransport(address string) (transport, error) {
var err error
var t transport
- m := map[string]func(string) (transport, error){
- "unix": newUnixTransport,
- }
addresses := strings.Split(address, ";")
for _, v := range addresses {
i := strings.IndexRune(v, ':')
@@ -560,7 +568,7 @@ func getTransport(address string) (transport, error) {
err = errors.New("dbus: invalid bus address (no transport)")
continue
}
- f := m[v[:i]]
+ f := transports[v[:i]]
if f == nil {
err = errors.New("dbus: invalid bus address (invalid or unsupported transport)")
}
diff --git a/vendor/src/github.com/godbus/dbus/introspect/introspect.go b/vendor/src/github.com/godbus/dbus/introspect/introspect.go
index dafcdb8b7a..b06c3f1cf2 100644
--- a/vendor/src/github.com/godbus/dbus/introspect/introspect.go
+++ b/vendor/src/github.com/godbus/dbus/introspect/introspect.go
@@ -17,6 +17,12 @@ var IntrospectData = Interface{
},
}
+// XML document type declaration of the introspection format version 1.0
+const IntrospectDeclarationString = `
+ <!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
+ "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
+`
+
// The introspection data for the org.freedesktop.DBus.Introspectable interface,
// as a string.
const IntrospectDataString = `
diff --git a/vendor/src/github.com/godbus/dbus/introspect/introspectable.go b/vendor/src/github.com/godbus/dbus/introspect/introspectable.go
index a2a965a343..38982e7757 100644
--- a/vendor/src/github.com/godbus/dbus/introspect/introspectable.go
+++ b/vendor/src/github.com/godbus/dbus/introspect/introspectable.go
@@ -4,6 +4,7 @@ import (
"encoding/xml"
"github.com/godbus/dbus"
"reflect"
+ "strings"
)
// Introspectable implements org.freedesktop.Introspectable.
@@ -31,7 +32,7 @@ func NewIntrospectable(n *Node) Introspectable {
if err != nil {
panic(err)
}
- return Introspectable(b)
+ return Introspectable(strings.TrimSpace(IntrospectDeclarationString) + string(b))
}
// Introspect implements org.freedesktop.Introspectable.Introspect.
@@ -50,7 +51,7 @@ func Methods(v interface{}) []Method {
}
mt := t.Method(i).Type
if mt.NumOut() == 0 ||
- mt.Out(mt.NumOut()-1) != reflect.TypeOf(&dbus.Error{"", nil}) {
+ mt.Out(mt.NumOut()-1) != reflect.TypeOf(&dbus.Error{}) {
continue
}
diff --git a/vendor/src/github.com/godbus/dbus/prop/prop.go b/vendor/src/github.com/godbus/dbus/prop/prop.go
index ed5bdf2243..834a1fa893 100644
--- a/vendor/src/github.com/godbus/dbus/prop/prop.go
+++ b/vendor/src/github.com/godbus/dbus/prop/prop.go
@@ -22,19 +22,19 @@ const (
// ErrIfaceNotFound is the error returned to peers who try to access properties
// on interfaces that aren't found.
-var ErrIfaceNotFound = &dbus.Error{"org.freedesktop.DBus.Properties.Error.InterfaceNotFound", nil}
+var ErrIfaceNotFound = dbus.NewError("org.freedesktop.DBus.Properties.Error.InterfaceNotFound", nil)
// ErrPropNotFound is the error returned to peers trying to access properties
// that aren't found.
-var ErrPropNotFound = &dbus.Error{"org.freedesktop.DBus.Properties.Error.PropertyNotFound", nil}
+var ErrPropNotFound = dbus.NewError("org.freedesktop.DBus.Properties.Error.PropertyNotFound", nil)
// ErrReadOnly is the error returned to peers trying to set a read-only
// property.
-var ErrReadOnly = &dbus.Error{"org.freedesktop.DBus.Properties.Error.ReadOnly", nil}
+var ErrReadOnly = dbus.NewError("org.freedesktop.DBus.Properties.Error.ReadOnly", nil)
// ErrInvalidArg is returned to peers if the type of the property that is being
// changed and the argument don't match.
-var ErrInvalidArg = &dbus.Error{"org.freedesktop.DBus.Properties.Error.InvalidArg", nil}
+var ErrInvalidArg = dbus.NewError("org.freedesktop.DBus.Properties.Error.InvalidArg", nil)
// The introspection data for the org.freedesktop.DBus.Properties interface.
var IntrospectData = introspect.Interface{
diff --git a/vendor/src/github.com/godbus/dbus/transport_unix.go b/vendor/src/github.com/godbus/dbus/transport_unix.go
index d16229be40..3fafeabb15 100644
--- a/vendor/src/github.com/godbus/dbus/transport_unix.go
+++ b/vendor/src/github.com/godbus/dbus/transport_unix.go
@@ -1,3 +1,5 @@
+//+build !windows
+
package dbus
import (
@@ -58,6 +60,10 @@ func newUnixTransport(keys string) (transport, error) {
}
}
+func init() {
+ transports["unix"] = newUnixTransport
+}
+
func (t *unixTransport) EnableUnixFDs() {
t.hasUnixFDs = true
}
diff --git a/vendor/src/github.com/godbus/dbus/transport_unixcred_dragonfly.go b/vendor/src/github.com/godbus/dbus/transport_unixcred_dragonfly.go
new file mode 100644
index 0000000000..a8cd39395f
--- /dev/null
+++ b/vendor/src/github.com/godbus/dbus/transport_unixcred_dragonfly.go
@@ -0,0 +1,95 @@
+// The UnixCredentials system call is currently only implemented on Linux
+// http://golang.org/src/pkg/syscall/sockcmsg_linux.go
+// https://golang.org/s/go1.4-syscall
+// http://code.google.com/p/go/source/browse/unix/sockcmsg_linux.go?repo=sys
+
+// Local implementation of the UnixCredentials system call for DragonFly BSD
+
+package dbus
+
+/*
+#include <sys/ucred.h>
+*/
+import "C"
+
+import (
+ "io"
+ "os"
+ "syscall"
+ "unsafe"
+)
+
+// http://golang.org/src/pkg/syscall/ztypes_linux_amd64.go
+// http://golang.org/src/pkg/syscall/ztypes_dragonfly_amd64.go
+type Ucred struct {
+ Pid int32
+ Uid uint32
+ Gid uint32
+}
+
+// http://golang.org/src/pkg/syscall/types_linux.go
+// http://golang.org/src/pkg/syscall/types_dragonfly.go
+// https://github.com/DragonFlyBSD/DragonFlyBSD/blob/master/sys/sys/ucred.h
+const (
+ SizeofUcred = C.sizeof_struct_ucred
+)
+
+// http://golang.org/src/pkg/syscall/sockcmsg_unix.go
+func cmsgAlignOf(salen int) int {
+ // From http://golang.org/src/pkg/syscall/sockcmsg_unix.go
+ //salign := sizeofPtr
+ // NOTE: It seems like 64-bit Darwin and DragonFly BSD kernels
+ // still require 32-bit aligned access to network subsystem.
+ //if darwin64Bit || dragonfly64Bit {
+ // salign = 4
+ //}
+ salign := 4
+ return (salen + salign - 1) & ^(salign - 1)
+}
+
+// http://golang.org/src/pkg/syscall/sockcmsg_unix.go
+func cmsgData(h *syscall.Cmsghdr) unsafe.Pointer {
+ return unsafe.Pointer(uintptr(unsafe.Pointer(h)) + uintptr(cmsgAlignOf(syscall.SizeofCmsghdr)))
+}
+
+// http://golang.org/src/pkg/syscall/sockcmsg_linux.go
+// UnixCredentials encodes credentials into a socket control message
+// for sending to another process. This can be used for
+// authentication.
+func UnixCredentials(ucred *Ucred) []byte {
+ b := make([]byte, syscall.CmsgSpace(SizeofUcred))
+ h := (*syscall.Cmsghdr)(unsafe.Pointer(&b[0]))
+ h.Level = syscall.SOL_SOCKET
+ h.Type = syscall.SCM_CREDS
+ h.SetLen(syscall.CmsgLen(SizeofUcred))
+ *((*Ucred)(cmsgData(h))) = *ucred
+ return b
+}
+
+// http://golang.org/src/pkg/syscall/sockcmsg_linux.go
+// ParseUnixCredentials decodes a socket control message that contains
+// credentials in a Ucred structure. To receive such a message, the
+// SO_PASSCRED option must be enabled on the socket.
+func ParseUnixCredentials(m *syscall.SocketControlMessage) (*Ucred, error) {
+ if m.Header.Level != syscall.SOL_SOCKET {
+ return nil, syscall.EINVAL
+ }
+ if m.Header.Type != syscall.SCM_CREDS {
+ return nil, syscall.EINVAL
+ }
+ ucred := *(*Ucred)(unsafe.Pointer(&m.Data[0]))
+ return &ucred, nil
+}
+
+func (t *unixTransport) SendNullByte() error {
+ ucred := &Ucred{Pid: int32(os.Getpid()), Uid: uint32(os.Getuid()), Gid: uint32(os.Getgid())}
+ b := UnixCredentials(ucred)
+ _, oobn, err := t.UnixConn.WriteMsgUnix([]byte{0}, b, nil)
+ if err != nil {
+ return err
+ }
+ if oobn != len(b) {
+ return io.ErrShortWrite
+ }
+ return nil
+}
diff --git a/vendor/src/github.com/godbus/dbus/transport_unixcred.go b/vendor/src/github.com/godbus/dbus/transport_unixcred_linux.go
index 42a0e769ef..d9dfdf6982 100644
--- a/vendor/src/github.com/godbus/dbus/transport_unixcred.go
+++ b/vendor/src/github.com/godbus/dbus/transport_unixcred_linux.go
@@ -1,4 +1,7 @@
-// +build !darwin
+// The UnixCredentials system call is currently only implemented on Linux
+// http://golang.org/src/pkg/syscall/sockcmsg_linux.go
+// https://golang.org/s/go1.4-syscall
+// http://code.google.com/p/go/source/browse/unix/sockcmsg_linux.go?repo=sys
package dbus
diff --git a/vendor/src/github.com/godbus/dbus/variant.go b/vendor/src/github.com/godbus/dbus/variant.go
index b1b53ceb47..b7b13ae90d 100644
--- a/vendor/src/github.com/godbus/dbus/variant.go
+++ b/vendor/src/github.com/godbus/dbus/variant.go
@@ -4,6 +4,7 @@ import (
"bytes"
"fmt"
"reflect"
+ "sort"
"strconv"
)
@@ -89,18 +90,27 @@ func (v Variant) format() (string, bool) {
return "{}", false
}
unamb := true
- buf := bytes.NewBuffer([]byte("{"))
+ var buf bytes.Buffer
+ kvs := make([]string, rv.Len())
for i, k := range rv.MapKeys() {
s, b := MakeVariant(k.Interface()).format()
unamb = unamb && b
+ buf.Reset()
buf.WriteString(s)
buf.WriteString(": ")
s, b = MakeVariant(rv.MapIndex(k).Interface()).format()
unamb = unamb && b
buf.WriteString(s)
- if i != rv.Len()-1 {
+ kvs[i] = buf.String()
+ }
+ buf.Reset()
+ buf.WriteByte('{')
+ sort.Strings(kvs)
+ for i, kv := range kvs {
+ if i > 0 {
buf.WriteString(", ")
}
+ buf.WriteString(kv)
}
buf.WriteByte('}')
return buf.String(), unamb
diff --git a/vendor/src/github.com/syndtr/gocapability/capability/capability.go b/vendor/src/github.com/syndtr/gocapability/capability/capability.go
index 9df3b4151b..c13f4e52a9 100644
--- a/vendor/src/github.com/syndtr/gocapability/capability/capability.go
+++ b/vendor/src/github.com/syndtr/gocapability/capability/capability.go
@@ -60,7 +60,8 @@ type Capabilities interface {
Apply(kind CapType) error
}
-// NewPid create new initialized Capabilities object for given pid.
+// NewPid create new initialized Capabilities object for given pid when it
+// is nonzero, or for the current pid if pid is 0
func NewPid(pid int) (Capabilities, error) {
return newPid(pid)
}
diff --git a/vendor/src/github.com/syndtr/gocapability/capability/capability_linux.go b/vendor/src/github.com/syndtr/gocapability/capability/capability_linux.go
index c5f335f7fb..3dfcd398dc 100644
--- a/vendor/src/github.com/syndtr/gocapability/capability/capability_linux.go
+++ b/vendor/src/github.com/syndtr/gocapability/capability/capability_linux.go
@@ -24,12 +24,46 @@ const (
linuxCapVer3 = 0x20080522
)
-var capVers uint32
+var (
+ capVers uint32
+ capLastCap Cap
+)
func init() {
var hdr capHeader
capget(&hdr, nil)
capVers = hdr.version
+
+ if initLastCap() == nil {
+ CAP_LAST_CAP = capLastCap
+ if capLastCap > 31 {
+ capUpperMask = (uint32(1) << (uint(capLastCap) - 31)) - 1
+ } else {
+ capUpperMask = 0
+ }
+ }
+}
+
+func initLastCap() error {
+ if capLastCap != 0 {
+ return nil
+ }
+
+ f, err := os.Open("/proc/sys/kernel/cap_last_cap")
+ if err != nil {
+ return err
+ }
+ defer f.Close()
+
+ var b []byte = make([]byte, 11)
+ _, err = f.Read(b)
+ if err != nil {
+ return err
+ }
+
+ fmt.Sscanf(string(b), "%d", &capLastCap)
+
+ return nil
}
func mkStringCap(c Capabilities, which CapType) (ret string) {
@@ -351,7 +385,15 @@ func (c *capsV3) Load() (err error) {
return
}
- f, err := os.Open(fmt.Sprintf("/proc/%d/status", c.hdr.pid))
+ var status_path string
+
+ if c.hdr.pid == 0 {
+ status_path = fmt.Sprintf("/proc/self/status")
+ } else {
+ status_path = fmt.Sprintf("/proc/%d/status", c.hdr.pid)
+ }
+
+ f, err := os.Open(status_path)
if err != nil {
return
}
diff --git a/vendor/src/github.com/syndtr/gocapability/capability/enum.go b/vendor/src/github.com/syndtr/gocapability/capability/enum.go
index e2900a4e93..bff756a5ce 100644
--- a/vendor/src/github.com/syndtr/gocapability/capability/enum.go
+++ b/vendor/src/github.com/syndtr/gocapability/capability/enum.go
@@ -112,32 +112,33 @@ func (c Cap) String() string {
return "wake_alarm"
case CAP_BLOCK_SUSPEND:
return "block_suspend"
+ case CAP_AUDIT_READ:
+ return "audit_read"
}
return "unknown"
}
+// POSIX-draft defined capabilities.
const (
- // POSIX-draft defined capabilities.
-
// In a system with the [_POSIX_CHOWN_RESTRICTED] option defined, this
// overrides the restriction of changing file ownership and group
// ownership.
- CAP_CHOWN Cap = 0
+ CAP_CHOWN = Cap(0)
// Override all DAC access, including ACL execute access if
// [_POSIX_ACL] is defined. Excluding DAC access covered by
// CAP_LINUX_IMMUTABLE.
- CAP_DAC_OVERRIDE Cap = 1
+ CAP_DAC_OVERRIDE = Cap(1)
// Overrides all DAC restrictions regarding read and search on files
// and directories, including ACL restrictions if [_POSIX_ACL] is
// defined. Excluding DAC access covered by CAP_LINUX_IMMUTABLE.
- CAP_DAC_READ_SEARCH Cap = 2
+ CAP_DAC_READ_SEARCH = Cap(2)
// Overrides all restrictions about allowed operations on files, where
// file owner ID must be equal to the user ID, except where CAP_FSETID
// is applicable. It doesn't override MAC and DAC restrictions.
- CAP_FOWNER Cap = 3
+ CAP_FOWNER = Cap(3)
// Overrides the following restrictions that the effective user ID
// shall match the file owner ID when setting the S_ISUID and S_ISGID
@@ -145,21 +146,21 @@ const (
// supplementary group IDs) shall match the file owner ID when setting
// the S_ISGID bit on that file; that the S_ISUID and S_ISGID bits are
// cleared on successful return from chown(2) (not implemented).
- CAP_FSETID Cap = 4
+ CAP_FSETID = Cap(4)
// Overrides the restriction that the real or effective user ID of a
// process sending a signal must match the real or effective user ID
// of the process receiving the signal.
- CAP_KILL Cap = 5
+ CAP_KILL = Cap(5)
// Allows setgid(2) manipulation
// Allows setgroups(2)
// Allows forged gids on socket credentials passing.
- CAP_SETGID Cap = 6
+ CAP_SETGID = Cap(6)
// Allows set*uid(2) manipulation (including fsuid).
// Allows forged pids on socket credentials passing.
- CAP_SETUID Cap = 7
+ CAP_SETUID = Cap(7)
// Linux-specific capabilities
@@ -171,17 +172,17 @@ const (
// to the current process' inheritable set
// Allow taking bits out of capability bounding set
// Allow modification of the securebits for a process
- CAP_SETPCAP Cap = 8
+ CAP_SETPCAP = Cap(8)
// Allow modification of S_IMMUTABLE and S_APPEND file attributes
- CAP_LINUX_IMMUTABLE Cap = 9
+ CAP_LINUX_IMMUTABLE = Cap(9)
// Allows binding to TCP/UDP sockets below 1024
// Allows binding to ATM VCIs below 32
- CAP_NET_BIND_SERVICE Cap = 10
+ CAP_NET_BIND_SERVICE = Cap(10)
// Allow broadcasting, listen to multicast
- CAP_NET_BROADCAST Cap = 11
+ CAP_NET_BROADCAST = Cap(11)
// Allow interface configuration
// Allow administration of IP firewall, masquerading and accounting
@@ -196,36 +197,36 @@ const (
// Allow multicasting
// Allow read/write of device-specific registers
// Allow activation of ATM control sockets
- CAP_NET_ADMIN Cap = 12
+ CAP_NET_ADMIN = Cap(12)
// Allow use of RAW sockets
// Allow use of PACKET sockets
// Allow binding to any address for transparent proxying (also via NET_ADMIN)
- CAP_NET_RAW Cap = 13
+ CAP_NET_RAW = Cap(13)
// Allow locking of shared memory segments
// Allow mlock and mlockall (which doesn't really have anything to do
// with IPC)
- CAP_IPC_LOCK Cap = 14
+ CAP_IPC_LOCK = Cap(14)
// Override IPC ownership checks
- CAP_IPC_OWNER Cap = 15
+ CAP_IPC_OWNER = Cap(15)
// Insert and remove kernel modules - modify kernel without limit
- CAP_SYS_MODULE Cap = 16
+ CAP_SYS_MODULE = Cap(16)
// Allow ioperm/iopl access
// Allow sending USB messages to any device via /proc/bus/usb
- CAP_SYS_RAWIO Cap = 17
+ CAP_SYS_RAWIO = Cap(17)
// Allow use of chroot()
- CAP_SYS_CHROOT Cap = 18
+ CAP_SYS_CHROOT = Cap(18)
// Allow ptrace() of any process
- CAP_SYS_PTRACE Cap = 19
+ CAP_SYS_PTRACE = Cap(19)
// Allow configuration of process accounting
- CAP_SYS_PACCT Cap = 20
+ CAP_SYS_PACCT = Cap(20)
// Allow configuration of the secure attention key
// Allow administration of the random device
@@ -263,10 +264,10 @@ const (
// arbitrary SCSI commands
// Allow setting encryption key on loopback filesystem
// Allow setting zone reclaim policy
- CAP_SYS_ADMIN Cap = 21
+ CAP_SYS_ADMIN = Cap(21)
// Allow use of reboot()
- CAP_SYS_BOOT Cap = 22
+ CAP_SYS_BOOT = Cap(22)
// Allow raising priority and setting priority on other (different
// UID) processes
@@ -274,7 +275,7 @@ const (
// processes and setting the scheduling algorithm used by another
// process.
// Allow setting cpu affinity on other processes
- CAP_SYS_NICE Cap = 23
+ CAP_SYS_NICE = Cap(23)
// Override resource limits. Set resource limits.
// Override quota limits.
@@ -287,33 +288,33 @@ const (
// Allow more than 64hz interrupts from the real-time clock
// Override max number of consoles on console allocation
// Override max number of keymaps
- CAP_SYS_RESOURCE Cap = 24
+ CAP_SYS_RESOURCE = Cap(24)
// Allow manipulation of system clock
// Allow irix_stime on mips
// Allow setting the real-time clock
- CAP_SYS_TIME Cap = 25
+ CAP_SYS_TIME = Cap(25)
// Allow configuration of tty devices
// Allow vhangup() of tty
- CAP_SYS_TTY_CONFIG Cap = 26
+ CAP_SYS_TTY_CONFIG = Cap(26)
// Allow the privileged aspects of mknod()
- CAP_MKNOD Cap = 27
+ CAP_MKNOD = Cap(27)
// Allow taking of leases on files
- CAP_LEASE Cap = 28
+ CAP_LEASE = Cap(28)
- CAP_AUDIT_WRITE Cap = 29
- CAP_AUDIT_CONTROL Cap = 30
- CAP_SETFCAP Cap = 31
+ CAP_AUDIT_WRITE = Cap(29)
+ CAP_AUDIT_CONTROL = Cap(30)
+ CAP_SETFCAP = Cap(31)
// Override MAC access.
// The base kernel enforces no MAC policy.
// An LSM may enforce a MAC policy, and if it does and it chooses
// to implement capability based overrides of that policy, this is
// the capability it should use to do so.
- CAP_MAC_OVERRIDE Cap = 32
+ CAP_MAC_OVERRIDE = Cap(32)
// Allow MAC configuration or state changes.
// The base kernel requires no MAC configuration.
@@ -321,18 +322,24 @@ const (
// to implement capability based checks on modifications to that
// policy or the data required to maintain it, this is the
// capability it should use to do so.
- CAP_MAC_ADMIN Cap = 33
+ CAP_MAC_ADMIN = Cap(33)
// Allow configuring the kernel's syslog (printk behaviour)
- CAP_SYSLOG Cap = 34
+ CAP_SYSLOG = Cap(34)
// Allow triggering something that will wake the system
- CAP_WAKE_ALARM Cap = 35
+ CAP_WAKE_ALARM = Cap(35)
// Allow preventing system suspends
- CAP_BLOCK_SUSPEND Cap = 36
+ CAP_BLOCK_SUSPEND = Cap(36)
- CAP_LAST_CAP = CAP_BLOCK_SUSPEND
+ // Allow reading audit messages from the kernel
+ CAP_AUDIT_READ = Cap(37)
)
-const capUpperMask = (uint32(1) << (uint(CAP_LAST_CAP) - 31)) - 1
+var (
+ // Highest valid capability of the running kernel.
+ CAP_LAST_CAP = Cap(63)
+
+ capUpperMask = ^uint32(0)
+)
diff --git a/volumes/MAINTAINERS b/volumes/MAINTAINERS
deleted file mode 100644
index 469ffe0c0e..0000000000
--- a/volumes/MAINTAINERS
+++ /dev/null
@@ -1 +0,0 @@
-Brian Goff <cpuguy83@gmail.com> (@cpuguy83)
diff --git a/volumes/repository.go b/volumes/repository.go
index e125677680..dbd7a5f555 100644
--- a/volumes/repository.go
+++ b/volumes/repository.go
@@ -9,7 +9,7 @@ import (
log "github.com/Sirupsen/logrus"
"github.com/docker/docker/daemon/graphdriver"
- "github.com/docker/docker/utils"
+ "github.com/docker/docker/pkg/common"
)
type Repository struct {
@@ -43,7 +43,7 @@ func (r *Repository) newVolume(path string, writable bool) (*Volume, error) {
var (
isBindMount bool
err error
- id = utils.GenerateRandomID()
+ id = common.GenerateRandomID()
)
if path != "" {
isBindMount = true
@@ -125,12 +125,6 @@ func (r *Repository) get(path string) *Volume {
return r.volumes[filepath.Clean(path)]
}
-func (r *Repository) Add(volume *Volume) error {
- r.lock.Lock()
- defer r.lock.Unlock()
- return r.add(volume)
-}
-
func (r *Repository) add(volume *Volume) error {
if vol := r.get(volume.Path); vol != nil {
return fmt.Errorf("Volume exists: %s", volume.ID)
@@ -139,16 +133,6 @@ func (r *Repository) add(volume *Volume) error {
return nil
}
-func (r *Repository) Remove(volume *Volume) {
- r.lock.Lock()
- r.remove(volume)
- r.lock.Unlock()
-}
-
-func (r *Repository) remove(volume *Volume) {
- delete(r.volumes, volume.Path)
-}
-
func (r *Repository) Delete(path string) error {
r.lock.Lock()
defer r.lock.Unlock()
@@ -178,7 +162,7 @@ func (r *Repository) Delete(path string) error {
}
}
- r.remove(volume)
+ delete(r.volumes, volume.Path)
return nil
}
diff --git a/volumes/repository_test.go b/volumes/repository_test.go
new file mode 100644
index 0000000000..801c225f75
--- /dev/null
+++ b/volumes/repository_test.go
@@ -0,0 +1,164 @@
+package volumes
+
+import (
+ "io/ioutil"
+ "os"
+ "path/filepath"
+ "testing"
+
+ "github.com/docker/docker/daemon/graphdriver"
+ _ "github.com/docker/docker/daemon/graphdriver/vfs"
+)
+
+func TestRepositoryFindOrCreate(t *testing.T) {
+ root, err := ioutil.TempDir(os.TempDir(), "volumes")
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer os.RemoveAll(root)
+ repo, err := newRepo(root)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // no path
+ v, err := repo.FindOrCreateVolume("", true)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // FIXME: volumes are heavily dependent on the vfs driver, but this should not be so!
+ expected := filepath.Join(root, "repo-graph", "vfs", "dir", v.ID)
+ if v.Path != expected {
+ t.Fatalf("expected new path to be created in %s, got %s", expected, v.Path)
+ }
+
+ // with a non-existant path
+ dir := filepath.Join(root, "doesntexist")
+ v, err = repo.FindOrCreateVolume(dir, true)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ if v.Path != dir {
+ t.Fatalf("expected new path to be created in %s, got %s", dir, v.Path)
+ }
+
+ if _, err := os.Stat(v.Path); err != nil {
+ t.Fatal(err)
+ }
+
+ // with a pre-existing path
+ // can just use the same path from above since it now exists
+ v, err = repo.FindOrCreateVolume(dir, true)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if v.Path != dir {
+ t.Fatalf("expected new path to be created in %s, got %s", dir, v.Path)
+ }
+
+}
+
+func TestRepositoryGet(t *testing.T) {
+ root, err := ioutil.TempDir(os.TempDir(), "volumes")
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer os.RemoveAll(root)
+ repo, err := newRepo(root)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ v, err := repo.FindOrCreateVolume("", true)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ v2 := repo.Get(v.Path)
+ if v2 == nil {
+ t.Fatalf("expected to find volume but didn't")
+ }
+ if v2 != v {
+ t.Fatalf("expected get to return same volume")
+ }
+}
+
+func TestRepositoryDelete(t *testing.T) {
+ root, err := ioutil.TempDir(os.TempDir(), "volumes")
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer os.RemoveAll(root)
+ repo, err := newRepo(root)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // with a normal volume
+ v, err := repo.FindOrCreateVolume("", true)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ if err := repo.Delete(v.Path); err != nil {
+ t.Fatal(err)
+ }
+
+ if v := repo.Get(v.Path); v != nil {
+ t.Fatalf("expected volume to not exist")
+ }
+
+ if _, err := os.Stat(v.Path); err == nil {
+ t.Fatalf("expected volume files to be removed")
+ }
+
+ // with a bind mount
+ dir := filepath.Join(root, "test")
+ v, err = repo.FindOrCreateVolume(dir, true)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ if err := repo.Delete(v.Path); err != nil {
+ t.Fatal(err)
+ }
+
+ if v := repo.Get(v.Path); v != nil {
+ t.Fatalf("expected volume to not exist")
+ }
+
+ if _, err := os.Stat(v.Path); err != nil && os.IsNotExist(err) {
+ t.Fatalf("expected bind volume data to persist after destroying volume")
+ }
+
+ // with container refs
+ dir = filepath.Join(root, "test")
+ v, err = repo.FindOrCreateVolume(dir, true)
+ if err != nil {
+ t.Fatal(err)
+ }
+ v.AddContainer("1234")
+
+ if err := repo.Delete(v.Path); err == nil {
+ t.Fatalf("expected volume delete to fail due to container refs")
+ }
+
+ v.RemoveContainer("1234")
+ if err := repo.Delete(v.Path); err != nil {
+ t.Fatal(err)
+ }
+
+}
+
+func newRepo(root string) (*Repository, error) {
+ configPath := filepath.Join(root, "repo-config")
+ graphDir := filepath.Join(root, "repo-graph")
+
+ driver, err := graphdriver.GetDriver("vfs", graphDir, []string{})
+ if err != nil {
+ return nil, err
+ }
+ return NewRepository(configPath, driver)
+}
diff --git a/volumes/volume_test.go b/volumes/volume_test.go
new file mode 100644
index 0000000000..5f3fdcfe6b
--- /dev/null
+++ b/volumes/volume_test.go
@@ -0,0 +1,19 @@
+package volumes
+
+import "testing"
+
+func TestContainers(t *testing.T) {
+ v := &Volume{containers: make(map[string]struct{})}
+ id := "1234"
+
+ v.AddContainer(id)
+
+ if v.Containers()[0] != id {
+ t.Fatalf("adding a container ref failed")
+ }
+
+ v.RemoveContainer(id)
+ if len(v.Containers()) != 0 {
+ t.Fatalf("removing container failed")
+ }
+}